/*
このファイルの中身は、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同期XMO クライアントクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo.Ad;

import java.rmi.RemoteException;
import java.util.*;
import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 * AD同期XMO クライアントクラスです。<BR>
 * このクラスはAD同期XMO サーバクラスとの接続および、
 * 一括登録に必要なパラメータの設定、検索後の
 * 検索結果の取得メソッドを提供します。<BR>
 * @author T.Nijou
 * @version 0.0.0.1 2004/01/08
 */
public class ADCorpClient extends XMOBasicClient
	implements ADCorpParam
{

	/** 接続先サーバクラス名です */
	private static final String CLASS_NAME = "jp.co.ntt.lms.xmo.Ad.ADCorp";

	/** 同期処理メソッド名です */
	private static final String METHOD_CORP  = "corp";
	/** 設定情報取得メソッド名です。 */
	private static final String METHOD_GETSETUPENV  = "getSetupEnv";
	/** AD認証メソッド名 */
	private static final String METHOD_CERTIFY = "certify";

	/** 設定ファイル不整合フラグ true: 整合 false: 不整合 */
	private boolean isValid = true;

	/**
	 * コンストラクタです。<BR>
	 * 親クラスのコンストラクタを呼び出し、接続先サーバクラス名を
	 * 設定します。
	 */
	public ADCorpClient() throws Exception {
		super( CLASS_NAME );
	}


	/**
	 * 設定データ取得処理
	 * @return boolean 正常時はtrue　エラー時はfalse
	 * @exception ADCorpException
	 */
	public ADCorpEnv getSetupEnv()
		throws ADCorpException
	{
		ADCorpEnv objSetUpEnv = null;
		try {
			Vector vecResultTemp = (Vector)execute( METHOD_GETSETUPENV, htParams );
			objSetUpEnv = (ADCorpEnv)vecResultTemp.get(1);

			mobjMessage = (MessageData)vecResultTemp.get(0);

			if( mobjMessage != null ) {
				if( mobjMessage.getMessageID().equals( ADCorpMessage.SETUP_INVALID_ERR ) ) {
					// 不整合エラーの場合は正常とするが、整合フラグをfalseにする。
					isValid = false;
				}
				else {
					// その他はエラーとする。
					throw new ADCorpException( mobjMessage );
				}
			}
		}
		catch( ADCorpException ae ) {
			throw ae;
		}
		catch( Exception e ) {
			throw new ADCorpException( ADCorpMessage.SYSTEM_ERR );
		}
		return objSetUpEnv;
	}

	/**
	 * 設定ファイルが整合かどうか返します。
	 * @return boolean true: 整合 false: 不整合
	 */
	public boolean isValid() {
		return isValid;
	}

	/**
	 * AD同期処理
	 * @param intDomainNo ドメインNO
	 * @exception ADCorpException RMI接続に失敗した場合
	 */
	public void corp(int intDomainNo)
		throws ADCorpException
	{
		try {
			// パラメータの設定
			htParams.put( DOMAIN_NO, new Integer(intDomainNo) );
			Vector vecResultTemp = (Vector)execute( METHOD_CORP, htParams );
			mobjMessage = (MessageData)vecResultTemp.get(0);
		}
		catch( Exception e ) {
			throw new ADCorpException( ADCorpMessage.SYSTEM_ERR );
		}

		if( isErr( mobjMessage ) || isWarning( mobjMessage ) ) {
			throw new ADCorpException(mobjMessage);
		}
	}

	/**
	 * Active Directoryによる認証処理を実行します。
	 *
	 * @param strLogonUser ログオンユーザー名
	 * @param strDomainName ログインドメイン名
	 * @return ログオンID 認証に失敗した場合は nullを返す。
	 */
	public String certify(String strLogonUser, String strDoaminName)
		throws ADCorpException
	{
		String strLogonID = null;
		try {
			// パラメータの設定
			// ログインユーザ名
			htParams.put( LOGON_USER, strLogonUser );
			// ログインドメイン名
			htParams.put( DOMAIN_NAME, strDoaminName );
			Vector vecResultTemp = (Vector)execute( METHOD_CERTIFY, htParams );
			mobjMessage = (MessageData)vecResultTemp.get(0);

			strLogonID = (String)vecResultTemp.get(1);
		}
		catch( Exception e ) {
			throw new ADCorpException( ADCorpMessage.SYSTEM_ERR );
		}

		if( isErr( mobjMessage ) || isWarning( mobjMessage ) )
		{
			// 例外が発生した場合はスローする
			throw new ADCorpException( mobjMessage );
		}

		return strLogonID;
	}

}

