/*********************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム構築
*	モジュール名	：JFUejbAccessKeyParts
*	ソースファイル名：JFUejbAccessKeyParts.java
*	作成者			：富士通
*	日付			：2011年04月22日
*＜機能概要＞
*	シーケンス採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/04/22	富士通		新規作成
*
**********************************************************************/

package eo.ejb.common.edit;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.common.JCCModelCommon;

/**
 * <p>
 * シーケンス採番部品クラスです。
 * </p>
 * @author 富士通
 */
public class JFUejbAccessKeyParts {

	/**
	 * コンストラクタです。
	 */
	private JFUejbAccessKeyParts()
	{
	}

	/**
	 * アクセス認証キーの生成を行います。
	 * 
	 * @param seqTeigiName シーケンス定義名
	 * @param funcCode 機能コード
	 * @return アクセス認証キー
	 * @exception Exceptionがスローされます。
	 */
	public static String getAccessKey(CAANMsg inCBSMsg, AgentDispatchContext inContext, Object seqTeigiName, Object funcCode) {

		// チェックのみの場合には、採番処理は行わない。
		if ("2".equals(funcCode)) {
			return null;
		}
		
		String strSEQ = "";
		
		strSEQ = JCCModelCommon.getNextSeq(String.valueOf(seqTeigiName));
		
		// 8桁までゼロパディングを行う。
		strSEQ = lPadZero(strSEQ);
		
		// システム日付取得
		String strSysDateTime = JCCModelCommon.getSysDateTime();
		
		// MessageDigestを生成
		MessageDigest md;
		// SHAインスタンス生成
		try
		{
			md = MessageDigest.getInstance("SHA-1");
		}
		catch (NoSuchAlgorithmException ne)
		{
			return null;
		}
		
		md.update(strSysDateTime.getBytes());
		byte[] bt = md.digest();
		
		// SHA1ハッシュデータ格納用
		StringBuffer sbHash = new StringBuffer();
		// Byte配列をStringへ変換
		for(int i = 0; i < bt.length ; i++)
		{
			String strHex = String.format("%02x", bt[i]);
			sbHash.append(strHex);
		}
		
		/** 認証キー生成処理 */
		// 認証キー格納用
		StringBuffer sbWebKey = new StringBuffer();
		sbWebKey.append(strSEQ.substring(4, 5));				// strSEQの5桁目
		sbWebKey.append(strSEQ.substring(5, 6));				// strSEQの6桁目
		sbWebKey.append(sbHash.toString().substring(3, 4));		// sbHashの4桁目
		sbWebKey.append(sbHash.toString().substring(1, 2));		// sbHashの2桁目
		sbWebKey.append(sbHash.toString().substring(0, 1));		// sbHashの1桁目
		sbWebKey.append(sbHash.toString().substring(2, 3));		// sbHashの3桁目
		sbWebKey.append(strSEQ.substring(2, 3));				// strSEQの3桁目
		sbWebKey.append(strSEQ.substring(6, 7));				// strSEQの7桁目
		sbWebKey.append(sbHash.toString().substring(35, 36));	// sbHashの36桁目
		sbWebKey.append(sbHash.toString().substring(36, 37));	// sbHashの37桁目
		sbWebKey.append(sbHash.toString().substring(37, 38));	// sbHashの38桁目
		sbWebKey.append(sbHash.toString().substring(38, 39));	// sbHashの39桁目
		sbWebKey.append(sbHash.toString().substring(39, 40));	// sbHashの40桁目
		sbWebKey.append(strSEQ.substring(1, 2));				// strSEQの2桁目
		sbWebKey.append(strSEQ.substring(3, 4));				// strSEQの4桁目
		sbWebKey.append(strSEQ.substring(0, 1));				// strSEQの1桁目
		
		return sbWebKey.toString();

	}
	
	/**
	 * 指定した文字列に対して、7桁でゼロパディングを行う。
	 * 
	 * <br>
	 * @param seq パディング対象文字列
	 * @return ゼロパディングした文字列
	 */
	private static String lPadZero(String seq)
	{
		// nullが指定された場合
		if (seq == null)
		{
			// nullを返却
			return null;
		}
		
		// シーケンスを格納する変数
		int iSeq = 0;
		
		try
		{
			
			// シーケンスを数値に変換
			iSeq = Integer.parseInt(seq);
		} 
		catch (NumberFormatException nfe)
		{
			// 変換できなかった場合、nullを返却
			return null;
		}
		
		// 8桁でゼロパディングする。
		DecimalFormat df = new DecimalFormat("00000000");
		
		// ゼロパディング結果を返却
		return df.format(iSeq);
	}
}
