/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JEKK0491B007TPMA
*	ソースファイル名	：JEKK0491B007TPMA.java
*	作成者				：富士通
*	作成日				：2012年11月14日
*＜機能概要＞
*  請求契約予約一覧照会（申込明細番号）における、申込明細番号の単項目チェックを行います。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00   2012/11/14  FJ          新規作成
*
*********************************************************************/
package eo.ejb.cbs.mainproc;

import java.util.ArrayList;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.ComPatternsCheck;
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.EKK0491B007CBSMsg;
import eo.ejb.domain.JSYejbBaseDomain;

/**
 * 請求契約予約一覧照会（申込明細番号）における、申込明細番号の単項目チェックを行います。
 * @author FJ
 */
public class JEKK0491B007TPMA implements TemplateMainHandler
{
	
	/**  申込明細番号のセパレータ "," */
	private static final String SEPARATOR = ",";
	 
	/**  チェック対象項目の配列（申込明細番号の単項目チェックを行います。）*/
	private static final String[][] TMCKARGS =
	{
		// {項目,項目エラー,必須ErrFlg,ドメインErrFlg,桁ErrFlg,リファErrFlg,必須CHK区分,ドメインID,桁CHK区分,桁From,桁to,リファ型,リファレンス値}
		{
			EKK0491B007CBSMsg.KEY_MSKM_DTL_NO, EKK0491B007CBSMsg.KEY_MSKM_DTL_NO_ERR, "E1", "E2", "E3", "E4", "1", "C0000026", "1", "", "", "9", ""
		}
	};
	
	/**
	 * 申込明細番号の単項目チェックを行います。
	 * 
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws InstantiationException, IllegalAccessException, ClassNotFoundException
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK0491B007TPMA.invoke");

		// チェック用配列作成
		final String[][] strArMsg = createTMCKArgs(TMCKARGS);

		// 申込明細番号単項目チェック
		final String kmskm_dtl_no = inCBSMsg.getString(EKK0491B007CBSMsg.KEY_MSKM_DTL_NO);
		if(kmskm_dtl_no == null)
		{
			// 申込明細番号がnullの場合、チェックを実施して必須エラーを発生させる。高速モードのみで通るルート
			ComPatternsCheck.check(inContext, inCBSMsg, strArMsg, EKK0491B007CBSMsg.STATUS);
		}
		else
		{
			// 「,」で区切られた申込明細番号を配列に格納しておき、それぞれ単項目チェックを行う
			String[] kmskm_dtl_no_split = kmskm_dtl_no.split(SEPARATOR);
			if(kmskm_dtl_no_split.length == 0)
			{
				//Split結果のlengthが0（,のみが指定された）場合には、必須エラーを発生させる
				inCBSMsg.setNull(EKK0491B007CBSMsg.KEY_MSKM_DTL_NO);
				ComPatternsCheck.check(inContext, inCBSMsg, strArMsg, EKK0491B007CBSMsg.STATUS);
			}
			else
			{
				for(int iCnt = 0; iCnt < kmskm_dtl_no_split.length; iCnt++)
				{
					if("".equals(kmskm_dtl_no_split[iCnt]))
					{
						inCBSMsg.setNull(EKK0491B007CBSMsg.KEY_MSKM_DTL_NO);
					}
					else
					{
						inCBSMsg.set(EKK0491B007CBSMsg.KEY_MSKM_DTL_NO, kmskm_dtl_no_split[iCnt]);
					}
					boolean bRtn = ComPatternsCheck.check(inContext, inCBSMsg, strArMsg, EKK0491B007CBSMsg.STATUS);
					if(!bRtn)
					{
						// 1つでも単項目チェックがNGの場合、申込明細番号のチェックを終了する
						break;
					}
				}
			}
			
			// 申込明細番号を元に戻す。
			inCBSMsg.set(EKK0491B007CBSMsg.KEY_MSKM_DTL_NO, kmskm_dtl_no);
		}
		
		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK0491B007TPMA.invoke");
	}
	
	/**
	 * 単項目制約定義とドメイン定義から、単項目チェック定義を生成
	 * @param args 単項目制約定義情報
	 * @return	単項目制約情報（単項目チェック部品へ引き渡すチェック用パラメタ配列）
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	@SuppressWarnings("unchecked")
	private String[][] createTMCKArgs(String[][] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException
	{
		
		ArrayList tmckList = new ArrayList();
		
		for(int i = 0; i < args.length; i++)
		{
			ArrayList tmckRec = new ArrayList();
			String[] komokuDef = args[i];
			String domainID = komokuDef[7];
			String domainCls = "eo.ejb.domain.JSYejb" + domainID + "Domain";
			JSYejbBaseDomain domain =
				(JSYejbBaseDomain)Class.forName(domainCls).newInstance();
			tmckRec = domain.getTmckDefine(komokuDef);
			for(int iCnt = 0; iCnt < tmckRec.size(); iCnt++)
			{
				tmckList.add(tmckRec.get(iCnt));
			}
		}
	
		return (String[][])tmckList.toArray(new String[tmckList.size()][0]);
	
	}
}
