/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム構築
*	モジュール名	：JCRejbQueryConditionTKCK
*	ソースファイル名：JCRejbQueryConditionTKCK.java
*	作成者			：FJ
*	日付			：2011年10月04日
*＜機能概要＞
*	対応記録登録の単関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.common.itemrelation;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbs.cbsmsg.ECR0011B050CBSMsg;

/**
 * スキーマID、クエリ項目名、フィールド名、フィールドタイプ、クエリ値、クエリ条件コード、
 * OR条件有無の単関連制約を実施します。
 * <BR>
 * @author 富士通
 *
 */
public class JCRejbQueryConditionTKCK
{
	
	/**
	 * スキーマID 1項目あたりの桁数
	 */
	private final static int LENGTH_SCHMA_ID = 6;
	/**
	 * クエリ項目名 1項目あたりの桁数
	 */
	private final static int LENGTH_QUERY_KMK = 50;
	/**
	 * フィールド名 1項目あたりの桁数
	 */
	private final static int LENGTH_FIELD_NM = 26;
	/**
	 * フィールドタイプコード 1項目あたりの桁数
	 */
	private final static int LENGTH_FIELD_TYPE_CD = 1;
	/**
	 * クエリ条件コード 1項目あたりの桁数
	 */
	private final static int LENGTH_QUERY_JOKEN_CD = 2;
	/**
	 * クエリ値 1項目あたりの桁数
	 */
	private final static int LENGTH_QUERY_VALUE = 40;
	/**
	 * OR条件有無 1項目あたりの桁数
	 */
	private final static int LENGTH_OR_JOKEN_UM = 1;
	/**
	 * クエリ項目番号 1項目あたりの桁数
	 */
	private final static int LENGTH_QUERY_KMK_NO = 10;
	/**
	 * (1)単項目制約を実施する項目の取得 桁数
	 * 項目桁数一覧（1項目あたりの桁数）
	 */
	private final static int LENGTH_BY_ITEM[] = 
	{
		//スキーマID
		LENGTH_SCHMA_ID,
		//クエリ項目名
		LENGTH_QUERY_KMK,
		//フィールド名
		LENGTH_FIELD_NM,
		//フィールドタイプコード
		LENGTH_FIELD_TYPE_CD,
		//クエリ条件コード
		LENGTH_QUERY_JOKEN_CD,
		//クエリ値
		LENGTH_QUERY_VALUE,
		//OR条件有無
		LENGTH_OR_JOKEN_UM,
		//クエリ項目番号
		LENGTH_QUERY_KMK_NO
	};
	
	/**
	 * (1)単項目制約を実施する項目の取得 CAANMsg Key名
	 * 項目名 一覧
	 */
	private final static String KEY_KMK_LIST[] = 
	{
		//スキーマID
		ECR0011B050CBSMsg.KEY_SCHMA_ID,
		//クエリ項目名
		ECR0011B050CBSMsg.KEY_QUERY_KMK_NM,
		//フィールド名
		ECR0011B050CBSMsg.KEY_FIELD_NM,
		//フィールドタイプコード
		ECR0011B050CBSMsg.KEY_FIELD_TYPE_CD,
		//クエリ条件コード
		ECR0011B050CBSMsg.KEY_QUERY_JOKEN_CD,
		//クエリ値
		ECR0011B050CBSMsg.KEY_QUERY_VALUE,
		//OR条件有無
		ECR0011B050CBSMsg.KEY_OR_JOKEN_UM,
		//クエリ項目番号
		ECR0011B050CBSMsg.KEY_QUERY_KMK_NO
	};
	
	/**
	 * スキーマID、クエリ項目名、フィールド名、フィールドタイプ、クエリ値、クエリ条件コード、
	 * OR条件有無の単関連制約を実施する。
	 * それぞれの項目を固定長で区切った時、その個数がすべて同じ場合、TRUEを返す。
	 * <BR>
	 * @param msg CAANMsg
	 * @param context ディスパッチコンテキスト
	 * @return boolean
	 * @throws IllegalArgumentException
	 */
	public static boolean isQueryConditionTKCK( CAANMsg msg , AgentDispatchContext context ) throws IllegalArgumentException
	{
		//比較基準となる項目数
		int itemCountBase = 0;
		for(int iCnt = 0 ; iCnt < LENGTH_BY_ITEM.length ; iCnt++ )
		{
			//--------------------------------------------------------------------------
			//(1)単項目制約を実施する項目の取得
			//--------------------------------------------------------------------------
			//桁数取得
			int itemLength = msg.getString(KEY_KMK_LIST[iCnt]).length();
			//1項目あたりの桁数で割った場合、余りが発生するとエラー
			if( itemLength % LENGTH_BY_ITEM[iCnt] != 0 )
			{
				throw new IllegalArgumentException("項目桁数が不正です。項目名[" + KEY_KMK_LIST[iCnt] + "] 項目桁数[" + LENGTH_BY_ITEM[iCnt] + "]");
			}
			//項目数の取得
			int itemCount = itemLength / LENGTH_BY_ITEM[iCnt];
			//--------------------------------------------------------------------------
			//(2)各項目の要素数チェック
			//--------------------------------------------------------------------------
			if( iCnt == 0 )
			{
				//比較基準となる項目数を取得
				itemCountBase = itemCount;
			}
			else
			{
				//項目数の比較
				if( itemCountBase != itemCount)
				{
					//項目数が異なるので FALSEを返す
					return false;
				}
			}
		}
		
		return true;
	}
}
