/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKMacfeeUrlIns
*	ソースファイル名	：JBSbatKKMacfeeUrlIns.java
*	作成者				：富士通　
*	作成日				：2017年05月15日
*＜機能概要＞
*　マカフィーURL情報登録です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v32.00.00	2017/05/15  FJ)大崎		新規作成(【ANK-3149-00-00】新セキュリティパック導入)
*   
*********************************************************************/
package eo.business.service;


import java.security.SecureRandom;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatKKIFM730;
import eo.business.util.file.JBSbatKKIFM733;
import eo.business.util.file.JBSbatKKIFM734;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKMacfeeUrlIns extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(オプションサービス契約<ISP>)*/
	private static final String D_TBL_NAME_KK_T_OPSVKEI_ISP = "KK_T_OPSVKEI_ISP";

	/** テーブルアクセスクラス*/
	private JBSbatSQLAccess db_KK_T_OPSVKEI_ISP = null;

	/** SQL定義キー(KK_UPDATE_003) */
	private static final String KK_T_OPSVKEI_ISP_KK_UPDATE_003 = "KK_UPDATE_003";

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** シーケンス定義名(マカフィー会員ID) */
	private static final String SEQ_MCAFEE_MEMBER_ID = "SEQ_MCAFEE_MEMBER_ID";

	/** 接頭語(マカフィー会員ID) */
	private static final String PREFIX_MCAFEE_MEMBER_ID = "";

	/** シーケンス補正桁数(マカフィー会員ID) */
	private static final int SEQ_MCAFEE_MEMBER_ID_LENGTH = 12;
	
	/** シーケンス定義名(マカフィー用認証パスワード) */
	private static final String SEQ_MCAFEE_NINSHO_PWD = "SEQ_MCAFEE_NINSHO_PWD";

	/** 接頭語(マカフィー用認証パスワード) */
	private static final String PREFIX_MCAFEE_NINSHO_PWD = "";

	/** シーケンス補正桁数(マカフィー用認証パスワード) */
	private static final int SEQ_MCAFEE_NINSHO_PWD_LENGTH = 10;

	/** 乱数(フェムトセル用認証ID) */
	public static final int RANDOM_LENGTH_FMTCEL_NINSHO_ID = 10;	

	/** 変換配列 */
	private static final HashMap<String, String> CHANGE_DATA = new HashMap<String, String>();

	static
	{
		// 変換配列設定
		CHANGE_DATA.put("0", "KMNPQRSTUV");
		CHANGE_DATA.put("1", "PQRSTUVWXY");
		CHANGE_DATA.put("2", "TUVWXYZABC");
		CHANGE_DATA.put("3", "IJKMNPQRST");
		CHANGE_DATA.put("4", "CDEFGHIJKM");
		CHANGE_DATA.put("5", "MNPQRSTUVW");
		CHANGE_DATA.put("6", "ABCDEFGHIJ");
		CHANGE_DATA.put("7", "STUVWXYZAB");
		CHANGE_DATA.put("8", "HIJKMNPQRS");
		CHANGE_DATA.put("9", "NPQRSTUVWX");
	}

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		// DBアクセスクラスを生成します
		db_KK_T_OPSVKEI_ISP = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OPSVKEI_ISP);

		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap1 入力電文１
	 * @param inMap2 入力電文２
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap1, JBSbatServiceInterfaceMap inMap2, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		JBSbatServiceInterfaceMap file_outmap = new JBSbatServiceInterfaceMap();
		
		//入力電文２を読み込まない
		this.setTranProcFlg(false);
		if(inMap2 != null){
			String mcafeeMemberId = inMap1.getString(JBSbatKKIFM730.MCAFEE_MEMBER_ID);
			String mcafeeNinshoMlad = inMap1.getString(JBSbatKKIFM730.MCAFEE_NINSHO_MLAD);
			String mcafeeNinshoPwd = inMap1.getString(JBSbatKKIFM730.MCAFEE_NINSHO_PWD);
			String mcafeeSehnDlUrl = inMap1.getString(JBSbatKKIFM730.MCAFEE_SEHN_DL_URL);
			String mcafeeBuyId = inMap1.getString(JBSbatKKIFM730.MCAFEE_BUY_ID);

			if ("910".equals(inMap2.getString(JBSbatKKIFM733.OP_SVC_KEI_STAT))){
				//マカフィー会員IDを採番する
				mcafeeMemberId = JCCBatCommon.getFormatedNextSeq(
						super.commonItem, SEQ_MCAFEE_MEMBER_ID, PREFIX_MCAFEE_MEMBER_ID, SEQ_MCAFEE_MEMBER_ID_LENGTH);
				//マカフィー用認証メールアドレス
				mcafeeNinshoMlad = mcafeeMemberId.concat("@").concat("dummy.k-opti.com");
				// シーケンス取得
				Long seq = Long.parseLong(JCCBatCommon.getFormatedNextSeq(
						super.commonItem, SEQ_MCAFEE_NINSHO_PWD, PREFIX_MCAFEE_NINSHO_PWD, SEQ_MCAFEE_NINSHO_PWD_LENGTH));
				//マカフィー用認証パスワード
				mcafeeNinshoPwd = getCreateMcfNinPwd(RANDOM_LENGTH_FMTCEL_NINSHO_ID, seq);
				mcafeeSehnDlUrl = "";
				mcafeeBuyId = "";
			} 

			// オプションサービス契約<ISP>の更新
			this.executeKK_T_OPSVKEI_ISP(inMap2, mcafeeMemberId, mcafeeNinshoMlad, mcafeeNinshoPwd, mcafeeSehnDlUrl, mcafeeBuyId);

			super.commit();	

			if ("910".equals(inMap2.getString(JBSbatKKIFM733.OP_SVC_KEI_STAT))){
				//マカフィーURL情報登録対象ファイルのみ読み込む
				this.setMastProcFlg(false);
				this.setTranProcFlg(true);

				//ファイル出力しない
				file_outmap.setOutFlg(false);
				outputInItem.addOutMapList(file_outmap);
				return outputInItem;
			}

			file_outmap.setString(JBSbatKKIFM734.SVC_KEI_NO, inMap2.getString(JBSbatKKIFM733.SVC_KEI_NO));
			file_outmap.setString(JBSbatKKIFM734.GENE_ADD_DTM, inMap2.getString(JBSbatKKIFM733.GENE_ADD_DTM));
			file_outmap.setString(JBSbatKKIFM734.OP_SVC_KEI_NO, inMap2.getString(JBSbatKKIFM733.OP_SVC_KEI_NO));
			file_outmap.setString(JBSbatKKIFM734.OP_SVC_KEI_STAT, inMap2.getString(JBSbatKKIFM733.OP_SVC_KEI_STAT));
			//次のデータを読み込む
			this.setTranProcFlg(true);
		}

		file_outmap.setString(JBSbatKKIFM734.MCAFEE_MEMBER_ID, inMap1.getString(JBSbatKKIFM730.MCAFEE_MEMBER_ID));
		file_outmap.setString(JBSbatKKIFM734.MCAFEE_NINSHO_MLAD, inMap1.getString(JBSbatKKIFM730.MCAFEE_NINSHO_MLAD));
		file_outmap.setString(JBSbatKKIFM734.MCAFEE_NINSHO_PWD, inMap1.getString(JBSbatKKIFM730.MCAFEE_NINSHO_PWD));
		file_outmap.setString(JBSbatKKIFM734.TAJGS_KEI_IDT_NO, inMap1.getString(JBSbatKKIFM730.TAJGS_KEI_IDT_NO));
		file_outmap.setString(JBSbatKKIFM734.MCAFEE_SEHN_DL_URL, inMap1.getString(JBSbatKKIFM730.MCAFEE_SEHN_DL_URL));
		file_outmap.setString(JBSbatKKIFM734.MCAFEE_BUY_ID, inMap1.getString(JBSbatKKIFM730.MCAFEE_BUY_ID));
		
		file_outmap.setOutFlg(true);
		outputInItem.addOutMapList(file_outmap);

		//次のデータを読み込む
		this.setMastProcFlg(true);
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_OPSVKEI_ISP.close();

		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg 設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg 設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg 設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * SQLKEY(KK_UPDATE_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	マカフィー会員ID
	 *		 	マカフィー用認証メールアドレス
	 *		 	マカフィー用認証パスワード
	 *		 	マカフィー製品ダウンロードURL
	 *		 	マカフィー購入ID
	 *		 	更新年月日時分秒
	 *		 	更新オペレータアカウント
	 *		 	更新運用年月日
	 *		 	オプションサービス契約番号
	 * </pre>
	 * <p>
	 * @param inMap2 入力電文２
	 * @param mcafeeMemberId マカフィー会員ID
	 * @param mcafeeNinshoMlad マカフィー用認証メールアドレス
	 * @param mcafeeNinshoPwd マカフィー用認証パスワード
	 * @param mcafeeSehnDlUrl マカフィー製品ダウンロードURL
	 * @param mcafeeBuyId マカフィー購入ID
	 * @throws Exception  業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_OPSVKEI_ISP(JBSbatServiceInterfaceMap inMap2, String mcafeeMemberId, String mcafeeNinshoMlad, String mcafeeNinshoPwd, String mcafeeSehnDlUrl, String mcafeeBuyId) throws Exception
	{
		// パラメタを設定する
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
		dbList.setValue(mcafeeMemberId);
		dbList.setValue(mcafeeNinshoMlad);
		dbList.setValue(mcafeeNinshoPwd);
		dbList.setValue(mcafeeSehnDlUrl);
		dbList.setValue(mcafeeBuyId);
		dbList.setValue(JCCBatCommon.getSysDateTimeStamp());
		dbList.setValue("IKOU");
		dbList.setValue(super.opeDate);
		dbList.setValue(super.jobid);
		dbList.setValue(inMap2.getString(JBSbatKKIFM733.OP_SVC_KEI_NO));

		// DBアクセスを実行します
		db_KK_T_OPSVKEI_ISP.executeBySqlDefine(dbList, KK_T_OPSVKEI_ISP_KK_UPDATE_003);
	}

	/**
	 * マカフィー認証用パスワードを採番します
	 * <br>
	 * @param arg0 生成する文字数
	 * @param arg1 シード値
	 * @return String 変換後の文字列
	 */
	private String getCreateMcfNinPwd(int arg0, long arg1) 
	{

		SecureRandom random = new SecureRandom();

		StringBuffer ret = new StringBuffer();

		random.setSeed(arg1);

		// ランダムな文字列を生成する
		for (int i = 0; i < arg0; i++) 
		{
			ret.append((char)(48 + random.nextInt(10)));
		}
		
		String randomValue = ret.toString();
		
		// 変換処理
		StringBuffer pwd = new StringBuffer();
		
		// (1)乱数の9桁目,10桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabet(randomValue.substring(8, 9), randomValue.substring(9, 10)));
		// (2)乱数の1桁目,10桁目の加算値の下1桁目を設定する
		pwd.append(toAlphabet(randomValue.substring(0, 1), randomValue.substring(9, 10)));
		// (3)乱数の3桁目,4桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabet(randomValue.substring(2, 3), randomValue.substring(3, 4)));
		// (4)乱数の9桁目を設定する
		pwd.append(randomValue.substring(8, 9));
		// (5)乱数の8桁目を設定する
		pwd.append(randomValue.substring(7, 8));
		// (6)乱数の5桁目,6桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabet(randomValue.substring(4, 5), randomValue.substring(5, 6)));
		// (7)乱数の2桁目,4桁目の加算値の下1桁目を設定する
		pwd.append(toAlphabet(randomValue.substring(1, 2), randomValue.substring(3, 4)));
		// (8)乱数の7桁目,8桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabet(randomValue.substring(6, 7), randomValue.substring(7, 8)));
		// (9)乱数の5桁目を設定する
		pwd.append(randomValue.substring(4, 5));
		// (10)乱数の1桁目,2桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabet(randomValue.substring(0, 1), randomValue.substring(1, 2)));

		return pwd.toString();
	}

	/**
	 * <p>
	 * 英字変換処理。<br>
	 * </p>
	 * @param str1 変換元データの１桁目
	 * @param str2 変換元データの２桁目
	 * @param mode 変換モード
	 * @return 変換した英字
	 */
	private String toAlphabet(String str1, String str2)
	{
		// 変換元データの１桁目から、英字変換対象行を取得
		String chgStr = CHANGE_DATA.get(str1);
		// 変換元データの２桁目から、変換した英字を取得
		chgStr = chgStr.substring(Integer.valueOf(str2), Integer.valueOf(str2) + 1);

		// 英字を小文字に変換して返却
		return chgStr.toLowerCase();
	}

}
