/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JEZM0041B011TPMA
*	ソースファイル名	：JEZM0041B011TPMA.java
*	作成者				：富士通
*	作成日				：2011年08月07日
*＜機能概要＞
*  権限グループコードを分解して単項目制約を行う独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00		2011/08/07  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.EZM0041B011CBSMsg;
import eo.ejb.domain.JSYejbBaseDomain;

/**
 * 権限グループコードを分解して単項目制約を行う独自処理部品です。
 * @author FJ
 */
public class JEZM0041B011TPMA implements TemplateMainHandler
{
	
	/**  チェック対象項目の配列（権限グループコード用）*/
	private static final String[][] TMCKARGS = {
		
		// {項目,項目エラー,必須ErrFlg,ドメインErrFlg,桁ErrFlg,リファErrFlg,必須CHK区分,ドメインID,桁CHK区分,桁From,桁to,リファ型,リファレンス値}
		{
			EZM0041B011CBSMsg.KEY_AUTHORITY_CD, 
			EZM0041B011CBSMsg.KEY_AUTHORITY_CD_ERR, 
			"E1", 
			"E2", 
			"E3", 
			"E4", 
			"1", 
			"M0000004", 
			"2", 
			"10", 
			"", 
			"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
	{
		
		
		// チェック用配列作成
		String[][] strArMsg = createTMCKArgs(TMCKARGS);

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "Call");
		
		// 権限グループコード単項目チェック
		String kGrpCode = (String)inCBSMsg.getObject(EZM0041B011CBSMsg.KEY_AUTHORITY_CD);
		if(kGrpCode == null)
		{
			ComPatternsCheck.check(inContext, inCBSMsg, strArMsg, EZM0041B011CBSMsg.STATUS);
		}
		else
		{
			
			// 「：」で区切られた権限コードを配列に格納しておき、それぞれ単項目チェックを行う
			String[] kGrpCodes = kGrpCode.split(":");
			if(kGrpCodes.length == 0)
			{
				
				// 区切り文字のみ指定された場合
				inCBSMsg.setNull(EZM0041B011CBSMsg.KEY_AUTHORITY_CD);
				ComPatternsCheck.check(inContext, inCBSMsg, strArMsg, EZM0041B011CBSMsg.STATUS);
			}
			else
			{
				for(int iCnt = 0; iCnt < kGrpCodes.length; iCnt++)
				{
					if("".equals(kGrpCodes[iCnt]))
					{
						inCBSMsg.setNull(EZM0041B011CBSMsg.KEY_AUTHORITY_CD);
					}
					else
					{
						inCBSMsg.set(EZM0041B011CBSMsg.KEY_AUTHORITY_CD, kGrpCodes[iCnt]);
					}
					boolean bRtn = ComPatternsCheck.check(inContext, inCBSMsg, strArMsg, EZM0041B011CBSMsg.STATUS);
					if(!bRtn)
					{
						
						// 1つでも単項目チェックがNGの場合、権限グループコードのチェックをやめる
						break;
					}
				}
			}
			
			// 権限グループコードを元に戻す。
			inCBSMsg.set(EZM0041B011CBSMsg.KEY_AUTHORITY_CD, kGrpCode);
		}
	}
	
	/**
	 * 単項目制約定義とドメイン定義から、単項目チェック定義を生成
	 * @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]);
	
	}
}
