/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbBaseDomain
*	ソースファイル名：JSYejbBaseDomain.java
*	作成者			：富士通
*	日付			：2011年07月29日
*＜機能概要＞
*	ドメインクラスのスーパークラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.domain;

import java.util.ArrayList;

/**
 * ドメインクラスのスーパークラス<br>
 * <注意事項>このクラスにキャストして、メソットを使用するため、
 *           外部から使用されるすべてのメソッドをここに実装する.
 *
 */
public class JSYejbBaseDomain {

	/**
	 * 定数
	 * 
	 */
	protected static final String CONST_NULL = "null";			//null
	protected static final String CONST_EMP = "";				//空文字
	protected static final String CONST_INDI_KBN = "1";			//必須チェック区分

	/**
	 * 桁制約区分リファレンス
	 * 
	 */
	protected static final String KETA_KBN_SUBORDINATE = "1";		//1：ドメイン従属
	protected static final String KETA_KBN_FIXED = "2";			//2：固定
	protected static final String KETA_KBN_VARIABLE = "3";		//3：可変
	protected static final String KETA_KBN_LONG = "4";			//4：数値
	protected static final String KETA_KBN_DOUBLE = "5";		//5：精度
	protected static final String KETA_KBN_BINARY = "6";		//6：バイナリ
	protected static final String KETA_KBN_YUKO = "7";		//7：有効桁数
	
	/**
	 * 桁数型リファレンス
	 * 
	 */
	protected static final String KETA_TYPE_NONE = "0";			//0：桁指定無し
	protected static final String KETA_TYPE_FIXED = "1";		//1：固定長
	protected static final String KETA_TYPE_VARIABLE = "2";		//2：可変長
	protected static final String KETA_TYPE_LONG = "3";			//3：数値
	protected static final String KETA_TYPE_DOUBLE = "4";		//4：精度
	protected static final String KETA_TYPE_BINARY = "5";		//5：バイナリ
	protected static final String KETA_TYPE_YUKO = "6";		//6：有効桁数
	
	/**
	 * 桁数チェック属性リファレンス
	 * 
	 */
	protected static final String KETA_CHECK_KETA0 = "ketasuu0";		//ketasuu0：桁チェック無し
	protected static final String KETA_CHECK_KETA1 = "ketasuu1";		//ketasuu1：桁固定チェック
	protected static final String KETA_CHECK_KETA2 = "ketasuu2";		//ketasuu2：桁範囲チェック
	protected static final String KETA_CHECK_KETA3 = "ketasuu3";		//ketasuu3：有効桁数チェック
	protected static final String KETA_CHECK_LONG = "long_chk";		//long_chk：Longチェック
	protected static final String KETA_CHECK_DOUBLE = "double_chk";	//double_chk：Doubleチェック
	protected static final String KETA_CHECK_SIZE = "size_chk";		//size_chk：サイズチェック
	
	/**
	 * リファレンス制約区分リファレンス
	 * 
	 */
	protected static final String REF_KBN_SUBORDINATE = "9";		//9：ドメイン従属
	protected static final String REF_KBN_NONE = "0";		//0：なし
	protected static final String REF_KBN_INPUT = "1";		//1：列挙型
	protected static final String REF_KBN_MAE = "3";		//3：前方一致型
	protected static final String REF_KBN_ATO = "4";		//4：後方一致型
	protected static final String REF_KBN_CONST1 = "2";		//2：マスタ存在型
	protected static final String REF_KBN_CONST2 = "5";		//5：マスタ未存在型
	
	/**
	 * リファレンスチェック属性リファレンス
	 * 
	 */
	protected static final String REF_CHK0 = "ref_chk0";		//ref_chk0：リファレンスチェック無し
	protected static final String REF_CHK1 = "ref_chk1";		//ref_chk1：リファレンスチェック（値列挙型）
	protected static final String REF_CHK2 = "ref_chk2";		//ref_chk2：リファレンスチェック（前方一致型）
	protected static final String REF_CHK3 = "ref_chk3";		//ref_chk3：リファレンスチェック（後方一致型）
	protected static final String MST_CHK1 = "mst_chk1";		//mst_chk1：リファレンスチェック（マスタ存在型）
	protected static final String MST_CHK2 = "mst_chk2";		//mst_chk2：リファレンスチェック（マスタ未存在型）
	
	/**
	 * チェック属性.
	 * 例) "hankaku1" ...etc
	 */
	protected String dataCheckDefine = "";
	
	/**
	 * 桁数型.
	 * 例) 0：桁指定無し 1：固定 2：可変 3：数値 4：精度 5：バイナリ 6：有効桁数
	 */
	protected String ketaTypeDefine = "";
	
	/**
	 * 桁数チェック属性.
	 * 例) "ketasuu0" ...etc
	 */
	protected String ketaCheckDefine = "";
	
	/**
	 * 有効桁数定義文字列（固定長）.
	 * 例) 50
	 */
	protected int fixedPlaceDefine = -1;
	
	/**
	 * 有効桁数定義文字列(上限/下限).
	 * 例) 上限 1 下限 100
	 */
	protected int lowerPlaceDefine = -1;
	protected int upperPlaceDefine = -1;
	
	/**
	 * 数値・精度桁数定義文字列(整数部/小数部).
	 * 例) 整数部10 小数部2
	 */
	protected int seisuPlaceDefine = -1;
	protected int shosuPlaceDefine = -1;
	
	/**
	 * バイナリ長定義文字列(上限/下限).
	 * 例) 上限 62byte 下限 1024byte
	 */
	protected int lowerByteDefine = -1;
	protected int upperByteDefine = -1;
	
	/**
	 * 有効桁数定義文字列(列挙型).
	 * 例) "3,5,7"（カンマ区切り）
	 */
	protected String enumPlaceDefine = "";
	
	/**
	 * リファレンス属性.
	 * 例) "ref_chk0","ref_chk1","ref_chk2"･･･etc
	 */
	protected String referenceDefine = "ref_chk0";
	
	/**
	 * リファレンス定義.
	 * 例) "1,2,3"（カンマ区切り）,"SP00001"（パラメタ値）
	 */
	protected String referenceValue = "";
	
	/**
	 * 項目.
	 * 例) "kokyaku_id"
	 */
	protected String komoku_name = "";

	/**
	 * 項目エラー.
	 * 例) "kokyaku_id_err"
	 */
	protected String komoku_err = "";
	
	/**
	 * 必須チェックエラーフラグ.
	 * 例) "1"
	 */
	protected String indi_err = "E1";

	/**
	 * ドメインチェックエラーフラグ.
	 * 例) "2"
	 */
	protected String dmn_err = "E2";
	
	/**
	 * 桁数チェックエラーフラグ.
	 * 例) "3"
	 */
	protected String keta_err = "E3";

	/**
	 * リファレンスチェックエラーフラグ.
	 * 例) "3"
	 */
	protected String ref_err = "E4";

	/**
	 * 必須チェック.
	 * 例) "null"
	 */
	protected String indispensableDefine = "";
	
	/**
	 * コンストラクタ.
	 * 
	 */
	public JSYejbBaseDomain() {
	}
	
	/**
	 * 単項目制約属性のセット.
	 * 業務ドメインの持つ制約情報と、引数で渡されてくる制約情報（ドメイン従属または個別指定制約）をマージした状態のドメイン定義を作る
	 * @param define 単項目制約に関わる定義情報配列
	 *                {項目,項目エラー,必須ErrFlg,ドメインErrFlg,桁ErrFlg,リファErrFlg,必須CHK区分,ドメインID,桁CHK区分,桁From,桁to,リファ型,リファレンス値}
	 * 
	 */
	private void setTmckDefine(String[] define){
		
		//項目情報
		komoku_name = define[0];
		komoku_err = define[1];
		//エラーフラグ
		indi_err = define[2];
		dmn_err = define[3];
		keta_err = define[4];
		ref_err = define[5];
		//必須チェック区分
		if(CONST_INDI_KBN.equals(define[6])){
			indispensableDefine = CONST_NULL;
		}else{
			indispensableDefine = CONST_EMP;
		}
		
		//桁数チェック定義
		if(KETA_KBN_SUBORDINATE.equals(define[8])){
			//ドメインに従う
		} else if(KETA_KBN_FIXED.equals(define[8])){
			//固定長
			ketaCheckDefine = KETA_CHECK_KETA1;
			ketaTypeDefine = KETA_TYPE_FIXED;
			fixedPlaceDefine = Integer.parseInt(define[9]);
			lowerPlaceDefine = -1;
			upperPlaceDefine = -1;
			seisuPlaceDefine = -1;
			shosuPlaceDefine = -1;
			lowerByteDefine = -1;
			upperByteDefine = -1;
			enumPlaceDefine = "";
		} else if(KETA_KBN_VARIABLE.equals(define[8])){
			//可変長
			ketaCheckDefine = KETA_CHECK_KETA2;
			ketaTypeDefine = KETA_TYPE_VARIABLE;
			fixedPlaceDefine = -1;
			lowerPlaceDefine = Integer.parseInt(define[9]);
			upperPlaceDefine = Integer.parseInt(define[10]);
			seisuPlaceDefine = -1;
			shosuPlaceDefine = -1;
			lowerByteDefine = -1;
			upperByteDefine = -1;
			enumPlaceDefine = "";
		} else if(KETA_KBN_LONG.equals(define[8])){
			//数値
			ketaCheckDefine = KETA_CHECK_LONG;
			ketaTypeDefine = KETA_TYPE_LONG;
			fixedPlaceDefine = -1;
			lowerPlaceDefine = -1;
			upperPlaceDefine = -1;
			seisuPlaceDefine = Integer.parseInt(define[9]);
			shosuPlaceDefine = -1;
			lowerByteDefine = -1;
			upperByteDefine = -1;
			enumPlaceDefine = "";
		} else if(KETA_KBN_DOUBLE.equals(define[8])){
			//精度
			ketaCheckDefine = KETA_CHECK_DOUBLE;
			ketaTypeDefine = KETA_TYPE_DOUBLE;
			fixedPlaceDefine = -1;
			lowerPlaceDefine = -1;
			upperPlaceDefine = -1;
			seisuPlaceDefine = Integer.parseInt(define[9]);
			shosuPlaceDefine = Integer.parseInt(define[10]);
			lowerByteDefine = -1;
			upperByteDefine = -1;
			enumPlaceDefine = "";
		} else if(KETA_KBN_BINARY.equals(define[8])){
			//バイナリ
			ketaCheckDefine = KETA_CHECK_SIZE;
			ketaTypeDefine = KETA_TYPE_BINARY;
			fixedPlaceDefine = -1;
			lowerPlaceDefine = -1;
			upperPlaceDefine = -1;
			seisuPlaceDefine = -1;
			shosuPlaceDefine = -1;
			lowerByteDefine = Integer.parseInt(define[9]);
			upperByteDefine = Integer.parseInt(define[10]);
			enumPlaceDefine = "";
		} else if(KETA_KBN_YUKO.equals(define[8])){
			//有効桁数
			ketaCheckDefine = KETA_CHECK_KETA3;
			ketaTypeDefine = KETA_TYPE_YUKO;
			fixedPlaceDefine = -1;
			lowerPlaceDefine = -1;
			upperPlaceDefine = -1;
			seisuPlaceDefine = -1;
			shosuPlaceDefine = -1;
			lowerByteDefine = -1;
			upperByteDefine = -1;
			enumPlaceDefine = define[9].toString();
		}
		
		//リファレンスチェック定義
		if(REF_KBN_SUBORDINATE.equals(define[11])){
			//ドメインに従う
		} else if(REF_KBN_NONE.equals(define[11])){
			//無し
			referenceDefine = REF_CHK0;
			referenceValue = "";
		} else if(REF_KBN_INPUT.equals(define[11])){
			//列挙型
			referenceDefine = REF_CHK1;
			referenceValue = define[12];
		} else if(REF_KBN_MAE.equals(define[11])){
			//前方一致型
			referenceDefine = REF_CHK2;
			referenceValue = define[12];
		} else if(REF_KBN_ATO.equals(define[11])){
			//後方一致型
			referenceDefine = REF_CHK3;
			referenceValue = define[12];
		} else if(REF_KBN_CONST1.equals(define[11])){
			//マスタ存在型
			referenceDefine = MST_CHK1;
			referenceValue = define[12];
		} else if(REF_KBN_CONST2.equals(define[11])){
			//マスタ未存在型
			referenceDefine = MST_CHK2;
			referenceValue = define[12];
		}
		
	}
	
	/**
	 * 単項目制約属性の取得.
	 * @param define 	単項目制約情報配列<br>
	 * 					{項目,項目エラー,必須ErrFlg,ドメインErrFlg,桁ErrFlg,リファErrFlg,必須CHK区分,ドメインID,桁CHK区分,桁From,桁to,リファ型,リファレンス値}
	 * @return	単項目制約情報<br>
	 * 			単項目チェック部品へ引き渡す形式で制約情報を格納したArrayList
	 * 
	 * 
	 */
	public ArrayList getTmckDefine(String[] define){
		
		//業務ドメインの持つ制約情報と、引数で渡されてくる制約情報（ドメイン従属または個別指定制約）をマージした状態のドメイン定義を作る
		setTmckDefine(define);
		
		ArrayList tmckArray = new ArrayList();
		
		//必須チェック定義
		String[] tmck_indi_rec = null;
		if ( CONST_NULL.equals(indispensableDefine) ){
			tmck_indi_rec = new String[4];
			tmck_indi_rec[0] = komoku_name;
			tmck_indi_rec[1] = komoku_err;
			tmck_indi_rec[2] = indi_err;
			tmck_indi_rec[3] = indispensableDefine.toString();
			tmckArray.add(tmck_indi_rec);
		}
		//データタイプチェック定義
		String[] tmck_dmn_rec = new String[4];
		if (    ( "no_check".equals(dataCheckDefine) && KETA_TYPE_LONG.equals(ketaTypeDefine) ) ||
				( "no_check".equals(dataCheckDefine) && KETA_TYPE_DOUBLE.equals(ketaTypeDefine) ) ||
				( "no_check".equals(dataCheckDefine) && KETA_TYPE_BINARY.equals(ketaTypeDefine) ) 
			) {
		}else{
			tmck_dmn_rec[0] = komoku_name;
			tmck_dmn_rec[1] = komoku_err;
			tmck_dmn_rec[2] = dmn_err;
			tmck_dmn_rec[3] = dataCheckDefine;
			tmckArray.add(tmck_dmn_rec);
		}
		
		//桁数チェック定義
		String[] tmck_keta_rec = null;
		if(KETA_TYPE_FIXED.equals(ketaTypeDefine)){
			tmck_keta_rec = new String[5];
			tmck_keta_rec[0] = komoku_name;
			tmck_keta_rec[1] = komoku_err;
			tmck_keta_rec[2] = keta_err;
			tmck_keta_rec[3] = ketaCheckDefine;
			tmck_keta_rec[4] = String.valueOf(fixedPlaceDefine);
		}else if(KETA_TYPE_VARIABLE.equals(ketaTypeDefine)){
			tmck_keta_rec = new String[6];
			tmck_keta_rec[0] = komoku_name;
			tmck_keta_rec[1] = komoku_err;
			tmck_keta_rec[2] = keta_err;
			tmck_keta_rec[3] = ketaCheckDefine;
			tmck_keta_rec[4] = String.valueOf(lowerPlaceDefine);
			tmck_keta_rec[5] = String.valueOf(upperPlaceDefine);
		}else if(KETA_TYPE_LONG.equals(ketaTypeDefine)){
			tmck_keta_rec = new String[5];
			tmck_keta_rec[0] = komoku_name;
			tmck_keta_rec[1] = komoku_err;
			tmck_keta_rec[2] = keta_err;
			tmck_keta_rec[3] = ketaCheckDefine;
			tmck_keta_rec[4] = String.valueOf(seisuPlaceDefine);
		}else if(KETA_TYPE_DOUBLE.equals(ketaTypeDefine)){
			tmck_keta_rec = new String[6];
			tmck_keta_rec[0] = komoku_name;
			tmck_keta_rec[1] = komoku_err;
			tmck_keta_rec[2] = keta_err;
			tmck_keta_rec[3] = ketaCheckDefine;
			tmck_keta_rec[4] = String.valueOf(seisuPlaceDefine);
			tmck_keta_rec[5] = String.valueOf(shosuPlaceDefine);
		}else if(KETA_TYPE_BINARY.equals(ketaTypeDefine)){
			tmck_keta_rec = new String[6];
			tmck_keta_rec[0] = komoku_name;
			tmck_keta_rec[1] = komoku_err;
			tmck_keta_rec[2] = keta_err;
			tmck_keta_rec[3] = ketaCheckDefine;
			tmck_keta_rec[4] = String.valueOf(lowerByteDefine);
			tmck_keta_rec[5] = String.valueOf(upperByteDefine);
		}else if(KETA_TYPE_YUKO.equals(ketaTypeDefine)){
			tmck_keta_rec = new String[5];
			tmck_keta_rec[0] = komoku_name;
			tmck_keta_rec[1] = komoku_err;
			tmck_keta_rec[2] = keta_err;
			tmck_keta_rec[3] = ketaCheckDefine;
			tmck_keta_rec[4] = enumPlaceDefine;
		}else if(KETA_TYPE_NONE.equals(ketaTypeDefine)){
			tmck_keta_rec = new String[4];
			tmck_keta_rec[0] = komoku_name;
			tmck_keta_rec[1] = komoku_err;
			tmck_keta_rec[2] = keta_err;
			tmck_keta_rec[3] = ketaCheckDefine;
		}
		tmckArray.add(tmck_keta_rec);
		
		//リファレンスチェック定義
		String[] tmck_ref_rec = null;
		if(REF_CHK0.equals(referenceDefine)){
		}else{
			tmck_ref_rec = new String[5];
			tmck_ref_rec[0] = komoku_name;
			tmck_ref_rec[1] = komoku_err;
			tmck_ref_rec[2] = ref_err;
			tmck_ref_rec[3] = referenceDefine;
			tmck_ref_rec[4] = referenceValue;
			tmckArray.add(tmck_ref_rec);
		}
		
		return tmckArray;

	}

}
