/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/
//
//
//	AD同期処理 設定データ保持クラス
//			変更履歴
//				2004.01.08	新規作成	            二條智文
//
package jp.co.ntt.lms.xmo.Ad;

import java.util.StringTokenizer;

/**
 * AD同期処理 設定データ保持クラスです。<BR>
 * 未設定項目はNULLとします。<BR>
 * 直列化のためにjava.io.Serializableインタフェースを実装します。
 * @author T.Nijou
 * @version 2.0.1.0 2004/01/08
 */
public class ADCorpSetupData implements java.io.Serializable, Cloneable {

	// 設定ファイルのキー定義
	static final String ROOTDN			= "root_dn_";			// 検索ルート
	static final String ADHOST			= "ad_host_";			// ADホスト名
	static final String ADPORT			= "ad_port_";			// ADポート番号
	static final String ADUSER			= "ad_user_";			// AD接続ユーザ
	static final String ADPASS			= "ad_pass_";			// AD接続パスワード
	static final String ADFILTER		= "ad_filter_";			// 検索フィルタ
	static final String OBJKEY			= "obj_key_";			// オブジェクト判別キー
	static final String DN				= "dn_";				// DN属性
	static final String REFKEY			= "ref_key_";			// 所属参照属性
	static final String USEROBJKEY		= "user_obj_key_";		// ユーザオブジェクト判別キー
	static final String BINARY_ATTRIBUTE= "binary_attribute_";	// バイナリ属性指定キー
	static final String P_PASSWORD		= "p_password_";		// P パスワード
	static final String P_LOGINID		= "p_login_id_";		// P ログインID
	static final String P_FOREIGNID		= "p_foreign_id_";		// P 外部ID
	static final String P_NAME			= "p_name_";			// P 名前
	static final String P_SEX			= "p_sex_";				// P 性別
	static final String P_READINGNAME	= "p_reading_name_";	// P 読みかた
	static final String P_BIRTHDAY		= "p_birthday_";		// P 誕生日
	static final String P_CONTACTTEL	= "p_contact_tel_";		// P 電話番号
	static final String P_CONTACTADDRESS= "p_contact_address_";	// P 住所
	static final String P_CONTACTEMAIL	= "p_contact_email1_";	// P メールアドレス１
	static final String P_CONTACTEMAIL2	= "p_contact_email2_";	// P メールアドレス２
	static final String P_CUSTUMMSGDIR	= "p_custum_msg_dir_";	// P コメント
	static final String G_FOREIGNID		= "g_foreign_id_";		// G 外部ID
	static final String G_NAME			= "g_name_";			// G 名前
	static final String G_CUSTUMMSGDIR	= "g_custum_msg_dir_";	// G コメント


	static final String[] KEY_LIST = {
											ROOTDN,
											ADHOST,
											ADPORT,
											ADUSER,
											ADPASS,
											ADFILTER,
											OBJKEY,
											DN,
											REFKEY,
											USEROBJKEY,
											BINARY_ATTRIBUTE,
											P_PASSWORD,
											P_LOGINID,
											P_FOREIGNID,
											P_NAME,
											P_SEX,
											P_READINGNAME,
											P_BIRTHDAY,
											P_CONTACTTEL,
											P_CONTACTADDRESS,
											P_CONTACTEMAIL,
											P_CONTACTEMAIL2,
											P_CUSTUMMSGDIR,
											G_FOREIGNID,
											G_NAME,
											G_CUSTUMMSGDIR
										};



	/** ドメイン設定番号 */
	private int mintDomainNo = 0;

	/** 検索ルート */
	private String mstrRootDN = null;
	/** ADホスト名 */
	private String mstrADHost = null;
	/** ADポート番号 */
	private String mstrADPort = null;
	/** AD接続ユーザ */
	private String mstrADUser = null;
	/** AD接続パスワード */
	private String mstrADPass = null;
	/** 検索フィルタ */
	private String mstrADFilter = null;
	/** オブジェクト判別キー */
	private String mstrObjKey = null;
	/** DN属性 */
	private String mstrDN = null;
	/** 所属参照属性 */
	private String mstrRefKey = null;
	/** ユーザオブジェクト判別キー */
	private String mstrUserObjKey = null;
	/** バイナリ属性指定 */
	private String mstrBinaryAttribute = null;
	/** P パスワード */
	private String mstrPPassword = null;
	/** P ログインID */
	private String mstrPLoginID = null;
	/** P 外部ID */
	private String mstrPForeignID = null;
	/** P 名前 */
	private String mstrPName = null;
	/** P 性別 */
	private String mstrPSex = null;
	/** P 読みかた */
	private String mstrPReadingName = null;
	/** P 誕生日 */
	private String mstrPBirthday = null;
	/** P 電話番号 */
	private String mstrPContactTel = null;
	/** P 住所 */
	private String mstrPContactAddress = null;
	/** P メールアドレス１ */
	private String mstrPContactEmail = null;
	/** P メールアドレス２ */
	private String mstrPContactEmail2 = null;
	/** P コメント */
	private String mstrPCustumMsgDir = null;
	/** G 外部ID */
	private String mstrGForeignID = null;
	/** G 名前 */
	private String mstrGName = null;
	/** G コメント */
	private String mstrGCustumMsgDir = null;

	/** 不整合かどうか */
	private boolean isValid = true;

	/** 不整合時の情報 */
	private String mstrInvalidInfo;

	/**
	 * コンストラクタです。
	 * ドメイン設定番号を設定します。
	 */
	public ADCorpSetupData( int intDomainNo ) {
		mintDomainNo = intDomainNo;
	}

	/**
	 * このドメイン設定を不正とします。
	 */
	public void setInvalid() {
		isValid = false;
	}

	/**
	 * このドメイン設定の整合性を取得します。
	 * @return boolean true: 整合 false: 不整合
	 */
	public boolean isValid() {
		if( isValid ) {
			check();
		}

		return isValid;
	}

	/**
	 * このドメイン設定に不整合があった場合にその情報を返します。
	 * 不整合がない場合はnullを返します。
	 * @return String 不整合情報
	 */
	public String getInvalidInfo() {
		return mstrInvalidInfo;
	}

	/**
	 * ドメイン設定番号を取得します。
	 * @return int ドメイン設定番号
	 */
	public int getDomainNo() {
		return mintDomainNo;
	}


	/**
	 * 検索ルート の設定をします。
	 * @param strRootDN
	 */
	public void setRootDN( String strRootDN ) {
		mstrRootDN = strRootDN;
	}

	/**
	 * 検索ルート の取得をします。
	 * @return String
	 */
	public String getRootDN() {
		return mstrRootDN;
	}

	/**
	 * ADホスト名 の設定をします。
	 * @param strADHost
	 */
	public void setADHost( String strADHost ) {
		mstrADHost = strADHost;
	}

	/**
	 * ADホスト名 の取得をします。
	 * @return String
	 */
	public String getADHost() {
		return mstrADHost;
	}

	/**
	 * ADポート番号 の設定をします。
	 * @param strADPort
	 */
	public void setADPort( String strADPort ) {
		mstrADPort = strADPort;
	}

	/**
	 * ADポート番号 の取得をします。
	 * @return String
	 */
	public String getADPort() {
		return mstrADPort;
	}

	/**
	 * AD接続ユーザ の設定をします。
	 * @param strADUser
	 */
	public void setADUser( String strADUser ) {
		mstrADUser = strADUser;
	}

	/**
	 * AD接続ユーザ の取得をします。
	 * @return String
	 */
	public String getADUser() {
		return mstrADUser;
	}

	/**
	 * AD接続パスワード の設定をします。
	 * @param strADPass
	 */
	public void setADPass( String strADPass ) {
		mstrADPass = strADPass;
	}

	/**
	 * AD接続パスワード の取得をします。
	 * @return String
	 */
	public String getADPass() {
		return mstrADPass;
	}

	/**
	 * 検索フィルタ の設定をします。
	 * @param strADFilter
	 */
	public void setADFilter( String strADFilter ) {
		mstrADFilter = strADFilter;
	}

	/**
	 * 検索フィルタ の取得をします。
	 * @return String
	 */
	public String getADFilter() {
		return mstrADFilter;
	}

	/**
	 * オブジェクト判別キー の設定をします。
	 * @param strObjKey
	 */
	public void setObjKey( String strObjKey ) {
		mstrObjKey = strObjKey;
	}

	/**
	 * オブジェクト判別キー の取得をします。
	 * @return String
	 */
	public String getObjKey() {
		return mstrObjKey;
	}

	/**
	 * DN属性 の設定をします。
	 * @param strDN
	 */
	public void setDN( String strDN ) {
		mstrDN = strDN;
	}

	/**
	 * DN属性 の取得をします。
	 * @return String
	 */
	public String getDN() {
		return mstrDN;
	}

	/**
	 * 所属参照属性 の設定をします。
	 * @param strRefKey
	 */
	public void setRefKey( String strRefKey ) {
		mstrRefKey = strRefKey;
	}

	/**
	 * 所属参照属性 の取得をします。
	 * @return String
	 */
	public String getRefKey() {
		return mstrRefKey;
	}

	/**
	 * ユーザオブジェクト判別キー の設定をします。
	 * @param strUserObjKey
	 */
	public void setUserObjKey( String strUserObjKey ) {
		mstrUserObjKey = strUserObjKey;
	}

	/**
	 * ユーザオブジェクト判別キー の取得をします。
	 * @return String
	 */
	public String getUserObjKey() {
		return mstrUserObjKey;
	}

	/**
	 * バイナリ属性指定 の設定をします。
	 * @param mstrBinaryAttribute; バイナリ属性指定
	 */
	public void setBinaryAttribute(String strBinaryAttribute) {
		mstrBinaryAttribute = strBinaryAttribute;
	}

	/**
	 * バイナリ属性指定 の取得をします。
	 * @return String バイナリ属性指定
	 */
	public String getBinaryAttribute() {
		return mstrBinaryAttribute;
	}

	/**
	 * P パスワード の設定をします。
	 * @param strPPassword
	 */
	public void setPPassword( String strPPassword ) {
		mstrPPassword = strPPassword;
	}

	/**
	 * P パスワード の取得をします。
	 * @return String
	 */
	public String getPPassword() {
		return mstrPPassword;
	}

	/**
	 * P ログインID の設定をします。
	 * @param strPLoginID
	 */
	public void setPLoginID( String strPLoginID ) {
		mstrPLoginID = strPLoginID;
	}

	/**
	 * P ログインID の取得をします。
	 * @return String
	 */
	public String getPLoginID() {
		return mstrPLoginID;
	}

	/**
	 * P 外部ID の設定をします。
	 * @param strPForeignID
	 */
	public void setPForeignID( String strPForeignID ) {
		mstrPForeignID = strPForeignID;
	}

	/**
	 * P 外部ID の取得をします。
	 * @return String
	 */
	public String getPForeignID() {
		return mstrPForeignID;
	}

	/**
	 * P 名前 の設定をします。
	 * @param strPName
	 */
	public void setPName( String strPName ) {
		mstrPName = strPName;
	}

	/**
	 * P 名前 の取得をします。
	 * @return String
	 */
	public String getPName() {
		return mstrPName;
	}

	/**
	 * P 性別 の設定をします。
	 * @param strPSex
	 */
	public void setPSex( String strPSex ) {
		mstrPSex = strPSex;
	}

	/**
	 * P 性別 の取得をします。
	 * @return String
	 */
	public String getPSex() {
		return mstrPSex;
	}

	/**
	 * P 読みかた の設定をします。
	 * @param strPReadingName
	 */
	public void setPReadingName( String strPReadingName ) {
		mstrPReadingName = strPReadingName;
	}

	/**
	 * P 読みかた の取得をします。
	 * @return String
	 */
	public String getPReadingName() {
		return mstrPReadingName;
	}

	/**
	 * P 誕生日 の設定をします。
	 * @param strPBirthday
	 */
	public void setPBirthday( String strPBirthday ) {
		mstrPBirthday = strPBirthday;
	}

	/**
	 * P 誕生日 の取得をします。
	 * @return String
	 */
	public String getPBirthday() {
		return mstrPBirthday;
	}

	/**
	 * P 電話番号 の設定をします。
	 * @param strPContactTel
	 */
	public void setPContactTel( String strPContactTel ) {
		mstrPContactTel = strPContactTel;
	}

	/**
	 * P 電話番号 の取得をします。
	 * @return String
	 */
	public String getPContactTel() {
		return mstrPContactTel;
	}

	/**
	 * P 住所 の設定をします。
	 * @param strPContactAddress
	 */
	public void setPContactAddress( String strPContactAddress ) {
		mstrPContactAddress = strPContactAddress;
	}

	/**
	 * P 住所 の取得をします。
	 * @return String
	 */
	public String getPContactAddress() {
		return mstrPContactAddress;
	}

	/**
	 * P メールアドレス１ の設定をします。
	 * @param strPContactEmail
	 */
	public void setPContactEmail( String strPContactEmail ) {
		mstrPContactEmail = strPContactEmail;
	}

	/**
	 * P メールアドレス１ の取得をします。
	 * @return String
	 */
	public String getPContactEmail() {
		return mstrPContactEmail;
	}

	/**
	 * P メールアドレス２ の設定をします。
	 * @param strPContactEmail2
	 */
	public void setPContactEmail2( String strPContactEmail2 ) {
		mstrPContactEmail2 = strPContactEmail2;
	}

	/**
	 * P メールアドレス２ の取得をします。
	 * @return String
	 */
	public String getPContactEmail2() {
		return mstrPContactEmail2;
	}

	/**
	 * P コメント の設定をします。
	 * @param strPCustumMsgDir
	 */
	public void setPCustumMsgDir( String strPCustumMsgDir ) {
		mstrPCustumMsgDir = strPCustumMsgDir;
	}

	/**
	 * P コメント の取得をします。
	 * @return String
	 */
	public String getPCustumMsgDir() {
		return mstrPCustumMsgDir;
	}

	/**
	 * G 外部ID の設定をします。
	 * @param strGForeignID
	 */
	public void setGForeignID( String strGForeignID ) {
		mstrGForeignID = strGForeignID;
	}

	/**
	 * G 外部ID の取得をします。
	 * @return String
	 */
	public String getGForeignID() {
		return mstrGForeignID;
	}

	/**
	 * G 名前 の設定をします。
	 * @param strGName
	 */
	public void setGName( String strGName ) {
		mstrGName = strGName;
	}

	/**
	 * G 名前 の取得をします。
	 * @return String
	 */
	public String getGName() {
		return mstrGName;
	}

	/**
	 * G コメント の設定をします。
	 * @param strGCustumMsgDir
	 */
	public void setGCustumMsgDir( String strGCustumMsgDir ) {
		mstrGCustumMsgDir = strGCustumMsgDir;
	}

	/**
	 * G コメント の取得をします。
	 * @return String
	 */
	public String getGCustumMsgDir() {
		return mstrGCustumMsgDir;
	}

	/**
	 * ドメイン名の取得を行います。<BR>
	 * ドメイン名はroot_DNから作成します。<BR>
	 * <PRE>
	 *   例:
	 *           dc=lms,dc=ntt,dc=co,dc=jp
	 *          →  lms.ntt.co.jp
	 * </PRE>
	 * @return String ドメイン名
	 */
	public String getDomainName() {

		if( mstrRootDN == null ) {
			return null;
		}

		String strTemp = null;
		StringBuffer sbDN = new StringBuffer();

		StringTokenizer token = new StringTokenizer( mstrRootDN, "," );
		while( token.hasMoreTokens() ) {
			strTemp = token.nextToken();
			if( strTemp.indexOf( '=' ) > 0 ) {
				sbDN.append( strTemp.substring( strTemp.indexOf( '=' ) + 1, strTemp.length() ) );
			}
			else {
				sbDN.append( strTemp );
			}

			sbDN.append( '.' );
		}

		return ( sbDN.length() == 0 ? "" : sbDN.substring( 0, sbDN.length() - 1 ) );
	}

	/**
	 * コピー関数
	 * コピー失敗時はnullを返す。
	 * @return ADCorpSetupData
	 */
	public ADCorpSetupData copy() {
		ADCorpSetupData objRes = null;
		try {
			objRes = (ADCorpSetupData)this.clone();
		}
		catch( CloneNotSupportedException ne ) {
		}

		return objRes;
	}
//---------------------- 内部関数 ----------------------------------------------
	/**
	 * この設定データの整合性をチェックします。
	 *  true: 整合 false: 不整合
	 */
	private void check() {

		if( mstrRootDN == null || mstrRootDN.equals("") ) {
			// 検索ルートが未設定
			isValid = false;
			mstrInvalidInfo = ROOTDN + padding(mintDomainNo ) + " が未設定です。";
		}
		else if( mstrADHost == null || mstrADHost.equals("") ) {
			// ADホスト名が未設定
			isValid = false;
			mstrInvalidInfo = ADHOST + padding(mintDomainNo ) + " が未設定です。";
		}

		else if( mstrADPort == null || mstrADPort.equals("") ) {
			// ADポート番号が未設定
			isValid = false;
			mstrInvalidInfo = ADPORT + padding(mintDomainNo ) + " が未設定です。";
		}
		else if( mstrADPort != null && !mstrADPort.equals("") ) {
			// ADポートが正の整数以外
			try {
				int port = Integer.parseInt(mstrADPort);
				if(port < 0) {
					isValid = false;
				}
			}
			catch( NumberFormatException ne ) {
				isValid = false;
			}

			if( !isValid )
				mstrInvalidInfo = ADPORT + padding(mintDomainNo ) + " が数値ではありません。";
		}

		else if( mstrADUser == null || mstrADUser.equals("") ) {
			// AD接続ユーザが未設定
			isValid = false;
			mstrInvalidInfo = ADUSER + padding(mintDomainNo ) + " が未設定です。";
		}

		else if( mstrADPass == null || mstrADPass.equals("") ) {
			// AD接続パスワードが未設定
			isValid = false;
			mstrInvalidInfo = ADPASS + padding(mintDomainNo ) + " が未設定です。";
		}

		else if( mstrADFilter == null || mstrADFilter.equals("") ) {
			// 検索フィルタが未設定
			isValid = false;
			mstrInvalidInfo = ADFILTER + padding(mintDomainNo ) + " が未設定です。";
		}

		else if( mstrObjKey == null || mstrObjKey.equals("") ) {
			// オブジェクト判別キーが未設定
			isValid = false;
			mstrInvalidInfo = OBJKEY + padding(mintDomainNo ) + " が未設定です。";
		}

		else if( mstrDN == null || mstrDN.equals("") ) {
			// DN属性が未設定
			isValid = false;
			mstrInvalidInfo = DN + padding(mintDomainNo ) + " が未設定です。";
		}

		else if( mstrUserObjKey == null || mstrUserObjKey.equals("") ) {
			// ユーザオブジェクト判別キーが未設定
			isValid = false;
			mstrInvalidInfo = USEROBJKEY + padding(mintDomainNo ) + " が未設定です。";
		}
	}

	/**
	 * 1桁の数値を０パディングして2桁の文字列にします。
	 */
	private String padding(int intNum ) {
		if( intNum < 1 || intNum > 9 ) {
			return new Integer(intNum).toString();
		}

		return "0" + intNum;
	}

//---------------------- 内部関数 ----------------------------------------------

	// debug
	public String toString() {

		StringBuffer sb = new StringBuffer();

		sb.append( "root_dn_" + mintDomainNo + " :: " + mstrRootDN + "\n" );
		sb.append( "ad_host_" + mintDomainNo + " :: " + mstrADHost + "\n" );
		sb.append( "ad_port_" + mintDomainNo + " :: " + mstrADPort + "\n" );
		sb.append( "ad_user_" + mintDomainNo + " :: " + mstrADUser + "\n" );
		sb.append( "ad_pass_" + mintDomainNo + " :: " + mstrADPass + "\n" );
		sb.append( "ad_filter_" + mintDomainNo + " :: " + mstrADFilter + "\n" );
		sb.append( "obj_key_" + mintDomainNo + " :: " + mstrObjKey + "\n" );
		sb.append( "dn_" + mintDomainNo + " :: " + mstrDN + "\n" );
		sb.append( "ref_key_" + mintDomainNo + " :: " + mstrRefKey + "\n" );
		sb.append( "user_obj_key_" + mintDomainNo + " :: " + mstrUserObjKey + "\n" );
		sb.append( "binary_attribute_ " + mintDomainNo + " :: " + mstrBinaryAttribute + "\n" );
		sb.append( "p_ password_" + mintDomainNo + " :: " + mstrPPassword + "\n" );
		sb.append( "p_login_id_" + mintDomainNo + " :: " + mstrPLoginID + "\n" );
		sb.append( "p_foreign_id_" + mintDomainNo + " :: " + mstrPForeignID + "\n" );
		sb.append( "p_name_" + mintDomainNo + " :: " + mstrPName + "\n" );
		sb.append( "p_sex_" + mintDomainNo + " :: " + mstrPSex + "\n" );
		sb.append( "p_reading_name_" + mintDomainNo + " :: " + mstrPReadingName + "\n" );
		sb.append( "p_birthday_" + mintDomainNo + " :: " + mstrPBirthday + "\n" );
		sb.append( "p_contact_tel_" + mintDomainNo + " :: " + mstrPContactTel + "\n" );
		sb.append( "p_contact_address_" + mintDomainNo + " :: " + mstrPContactAddress + "\n" );
		sb.append( "p_contact_email1_" + mintDomainNo + " :: " + mstrPContactEmail + "\n" );
		sb.append( "p_contact_email2_" + mintDomainNo + " :: " + mstrPContactEmail2 + "\n" );
		sb.append( "p_custum_msg_dir_" + mintDomainNo + " :: " + mstrPCustumMsgDir + "\n" );
		sb.append( "g_foreign_id_" + mintDomainNo + " :: " + mstrGForeignID + "\n" );
		sb.append( "g_name_" + mintDomainNo + " :: " + mstrGName + "\n" );
		sb.append( "g_custum_msg_dir_" + mintDomainNo + " :: " + mstrGCustumMsgDir + "\n" );

		return new String(sb);
	}
}
