/*********************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECKA9010001TPMA
*   ソースファイル名：JECKA9010001TPMA.java
*   作成者          ：富士通
*   日付            ：2011年07月02日
*＜機能概要＞
*   AxM会員情報更新依頼顧客独自処理部品クラス.
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/07/02  富士通      新規作成
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

import static eo.ejb.common.JCKLcsRenkeiUtil.*;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.ejb.cbs.cbsmsg.ECKA9010001CBSMsg;


/**
 * <p>
 * AxM会員情報更新依頼顧客独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JECKA9010001TPMA implements TemplateMainHandler
{
	public static String PGID = "JECKA9010001TPMA";

	/**
	 * コンストラクタ.
	 */
	public JECKA9010001TPMA()
	{
		super();
	}

	/**
	 * AxM連携顧客独自処理部品です。
	 * @param inCBSMsg CAANメッセージ
	 * @param inContext コンテキスト
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECKA9010001TPMA#invoke start");

		// 処理結果の初期化
		int result = 0;

		// パラメータチェックがOKの時のみ連携を実行
		if (JCK0151TPMA.checkParam(inCBSMsg))
		{
			// 処理コード
			String trnCd = inCBSMsg.getString(ECKA9010001CBSMsg.TRN_CD);

			// パラメータをString配列に変換
			String[] params = makeParamAxmApi(inCBSMsg);

			// AdminAPI
			if ("A01".equals(trnCd))
			{
				// AdminAPIへの更新依頼
				result = requestAdminApi(inCBSMsg, params);

				// 成功 かつ パスワード更新APIの実行が必要な場合
				if (result == 2)
				{
					// パスワード更新APIへの更新依頼
					result = requestPwdApi(inCBSMsg, params);
				}
			}

			// レプリカ更新API
			if ("N01".equals(trnCd))
			{
				result = requestRepliceApi(inCBSMsg, params);
			}
		}

		// エラーフラグのセット
		String errFlg = (result <= 0) ? "1" : "0";
		inCBSMsg.set(ECKA9010001CBSMsg.RES_ERR_FLG, errFlg);

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECKA9010001TPMA#invoke end");
	}

	/**
	 * AxMのAdminAPIに対してリクエストを送信する。
	 * @param param メッセージキャリア
	 * @return AxMから返された結果コード
	 */
	private int requestAdminApi(CAANMsg inCBSMsg, String[] params)
	{
		int result = 0;

		// パラメータ取得
		String tranTrgtSysid = inCBSMsg.getString(ECKA9010001CBSMsg.TRAN_TRGT_SYSID);
		String sjishoNo = inCBSMsg.getString(ECKA9010001CBSMsg.SJISHO_NO);
		String sjishoNaiyoSeq = inCBSMsg.getString(ECKA9010001CBSMsg.SJISHO_NAIYO_SEQ);

		try
		{
			// AdminAPIへの処理依頼
			result = requestAxmAdminApi(sjishoNo, sjishoNaiyoSeq, tranTrgtSysid, params);
		}
		catch (Exception e)
		{
			printErrorLog(e, params, "AxM/AdminAPI連携でエラー発生", sjishoNo, sjishoNaiyoSeq);
		}
		
		return result;
	}

	/**
	 * AxMのレプリカ更新APIに対してリクエストを送信する。
	 * @param inCBSMsg メッセージキャリア
	 * @return AxMから返された結果コード
	 */
	private int requestRepliceApi(CAANMsg inCBSMsg, String[] params)
	{
		int result = 0;

		// パラメータ取得
		String sysid = inCBSMsg.getString(ECKA9010001CBSMsg.TRAN_TRGT_SYSID);
		String sjishoNo = inCBSMsg.getString(ECKA9010001CBSMsg.SJISHO_NO);
		String sjishoNaiyoSeq = inCBSMsg.getString(ECKA9010001CBSMsg.SJISHO_NAIYO_SEQ);
		String trgtTableId = inCBSMsg.getString(ECKA9010001CBSMsg.TRGT_TABLE_ID);

		try
		{
			// レプリカ更新APIにリクエスト送信
			result = requestAxmReplicaApi(sysid, sjishoNo, sjishoNaiyoSeq, trgtTableId, params);
		}
		catch (Exception e)
		{
			printErrorLog(e, params, "AxM/レプリカ更新API連携でエラー発生", sjishoNo, sjishoNaiyoSeq);
		}
		
		return result;
	}

	/**
	 * AxMのパスワード更新APIに対してリクエストを送信する。
	 * @param inCBSMsg メッセージキャリア
	 * @return AxMから返された結果コード
	 */
	private int requestPwdApi(CAANMsg inCBSMsg, String[] params)
	{
		int result = 0;

		// パラメータ取得
		String tranTrgtSysid = inCBSMsg.getString(ECKA9010001CBSMsg.TRAN_TRGT_SYSID);
		String sjishoNo = inCBSMsg.getString(ECKA9010001CBSMsg.SJISHO_NO);
		String sjishoNaiyoSeq = inCBSMsg.getString(ECKA9010001CBSMsg.SJISHO_NAIYO_SEQ);

		try
		{
			// AxMパスワード更新APIにリクエスト送信
			result = requestAxmPwdApi(PGID, tranTrgtSysid, params);
		}
		catch (Exception e)
		{
			printErrorLog(e, params, "AxM/パスワード更新API連携でエラー発生", sjishoNo, sjishoNaiyoSeq);
		}
		
		return result;
	}

	/**
	 * AxM連携用ユーティリティに渡すパラメータ(1〜50)のデータ型をCAANMsg→String配列に変換します。
	 * [補足]
	 * 　・パラメータ51個目にも処理区分(パラメータ1番目)と同じものをセットする。
	 * 　　※AxM側のデータ状態によっては、要求した処理区分と異なる処理が行われる事がある為、
	 * 　　　連携ユーティリティにより、パラメータ51番目に実際に実行された処理区分がセットされる。
	 * @param inCBSMsg
	 * @return パラメータ(String配列)
	 */
	private String[] makeParamAxmApi(CAANMsg inCBSMsg){
		
		String[] params = new String[]{
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_1),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_2),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_3),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_4),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_5),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_6),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_7),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_8),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_9),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_10),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_11),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_12),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_13),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_14),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_15),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_16),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_17),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_18),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_19),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_20),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_21),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_22),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_23),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_24),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_25),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_26),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_27),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_28),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_29),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_30),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_31),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_32),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_33),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_34),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_35),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_36),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_37),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_38),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_39),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_40),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_41),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_42),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_43),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_44),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_45),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_46),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_47),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_48),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_49),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_50),
			inCBSMsg.getString(ECKA9010001CBSMsg.PARAMETER_1)
		};

		return params;
	}

	/**
	 * エラーログ出力
	 * @param e 発生した例外
	 * @param params 指示書パラメータ(1〜50)
	 * @param errTitle エラータイトル
	 * @param sjishoNo 指示書番号
	 * @param sjishoNaiyoSeq 指示書内容枝番
	 */
	private void printErrorLog(Exception e, String[] params, String errTitle, String sjishoNo, String sjishoNaiyoSeq)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(e.getMessage()+ "\n");
		StackTraceElement[] steAll = e.getStackTrace();
		for (StackTraceElement ste : steAll) {
			sb.append("	at " + ste.getClassName() + "." + ste.getMethodName() + "(" + ste.getFileName() + ":" + ste.getLineNumber()+")"+ "\n");
		}
		JSYejbLog.println(JSYejbLog.ERROR, this.getClass(), errTitle + "(指示書番号:" + sjishoNo + "、指示書内容枝番:" + sjishoNaiyoSeq + ")" + "\n" + sb.toString());
	}
}
