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

import javax.naming.directory.SearchResult;
import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;

import jp.co.ntt.lms.xmo.util.*;
import jp.co.ntt.lms.xmo.Groups.GroupsTable;

/**
 * AD同期処理 Groupマッピングクラス<BR>
 * @author T.Nijou
 * @version 2.0.1.0 2004/01/08
 */
public class ADCorpGroup extends ADCorpNode {

	// フィールド
	/** グループ名 */
	private String mstrGroupName;
	/** 外部ID */
	private String mstrForeignID;
	/** コメント */
	private String mstrCustumMsgDir;

	// このエントリの連番
	private int mintIndex = 0;

	// 設定項目
	private ADCorpSetupData mobjSetup;

	// エントリ
	private SearchResult mobjResult;

	// デフォルト値定義
	private static final String AD_DEFAULT = "AD";

	// メンバー一覧
	private Vector mvecMember = null;

	/**
	 * コンストラクタです。<BR>
	 * @param SearchResult エントリ
	 * @param objSetup 設定データ
	 * @param intIndex 連番
	 * @exception ADCorpException
	 */
	public ADCorpGroup( SearchResult objResult, ADCorpSetupData objSetup, int intIndex )
		throws ADCorpException
	{
		if( objResult == null || objSetup == null ) {
			// パラメータ不正時は内部エラー
			throw new ADCorpException( ADCorpMessage.INNER_ERR );
		}

		mobjResult = objResult;
		mobjSetup = objSetup;
		mintIndex = intIndex;

		// フィールドマッピング処理
		fieldMapping();

	}

	/**
	 * 同期XMLを取得します。
	 * @return String 同期XML
	 */
	public String getXML() {
		StringBuffer sbXML = new StringBuffer();

		if( mobjParent == null ) {
			// 親ノードがnullのものはルートノード
			sbXML.append( "<?xml version=\"1.0\" encoding=\"Windows-31J\"?>\n" );
			sbXML.append( "<lump type=\"2\">\n" );
		}

		// 必須項目
		// foreign_id、group_nameの属性が設定されていない場合は
		// 更新フラグを設定する。
		sbXML.append( "<group>\n" );
		sbXML.append( "<foreign_id" + makeUpFlag( mobjSetup.getGForeignID()) + ">" + mstrForeignID + "</foreign_id>\n" );	// 外部ID
		sbXML.append( "<group_name" + makeUpFlag( mobjSetup.getGName()) + ">" + mstrGroupName + "</group_name>\n" );	// グループ名
		sbXML.append( "<ad_dn>" + mstrDN + "</ad_dn>\n" );					// dn
		sbXML.append( "<oid>" + mstrOid + "</oid>\n" );						// オブジェクトID

		// 任意項目
		// コメント
		if( mstrCustumMsgDir != null ) {
			sbXML.append( "<comment>" + mstrCustumMsgDir + "</comment>\n" );
		}

		// 子ノードのXML取得
		for( int i = 0; i < mvecChildNode.size(); i++ ) {
			sbXML.append( ((ADCorpNode)mvecChildNode.get(i)).getXML() );
		}

		sbXML.append( "</group>\n" );

		if( mobjParent == null ) {
			// 親ノードがnullのものはルートノード
			sbXML.append( "</lump>\n" );
		}
		return new String(sbXML);
	}

	/**
	 * メンバーを設定します。<BR>
	 * メンバーがグループの場合は何も行いません。
	 * @param Hashtable key: DN value: エントリオブジェクト
	 */
	void setMember( Hashtable htbMember ) {
		if( mvecMember != null ) {
			for( int i = 0; i < mvecMember.size(); i++ ) {
				String strMemDN = (String)mvecMember.get(i);
				ADCorpNode objMem = (ADCorpNode)htbMember.get(strMemDN);
				if(objMem != null && objMem instanceof ADCorpPeople) {
					addChild( objMem );
				}
			}
		}
	}

//---------------------------内部関数 ------------------------------------------
	/**
	 * フィールドマッピング処理
	 * @exception ADCorpException
	 */
	private void fieldMapping()
		throws ADCorpException
	{

		try{
			Attributes attrs = mobjResult.getAttributes();
			if (attrs == null) {
				// 検索エラー
				throw new ADCorpSearchException();
			}

			Attribute attr = null;

			// グループ名の取得
			if( mobjSetup.getGName() != null &&
				!mobjSetup.getGName().equals("") ) {
				attr = attrs.get( mobjSetup.getGName() );
				if( attr != null ) {
					mstrGroupName = getValue(attr);
				}
			}

			// 外部IDの取得
			if( mobjSetup.getGForeignID() != null &&
				!mobjSetup.getGForeignID().equals("") ) {
				attr = attrs.get( mobjSetup.getGForeignID() );
				if( attr != null ) {
					mstrForeignID = getValue(attr);
				}
			}

			// コメントの取得
			if( mobjSetup.getGCustumMsgDir() != null &&
				!mobjSetup.getGCustumMsgDir().equals("") ) {
				attr = attrs.get( mobjSetup.getGCustumMsgDir() );
				if( attr != null ) {
					mstrCustumMsgDir = getValue(attr);
				}
			}

			// DNの取得
			if( mobjSetup.getDN() != null &&
				!mobjSetup.getDN().equals("") ) {
				attr = attrs.get( mobjSetup.getDN() );
				if( attr != null ) {
					mstrDN = getValue(attr);
				}
			}

			// Oid の取得
			if( mobjSetup.getObjKey() != null &&
				!mobjSetup.getObjKey().equals("") ) {
				attr = attrs.get( mobjSetup.getObjKey() );
				if( attr != null ) {
					mstrOid = getValue(attr);
				}
			}

			// 所属参照エントリの場合
			if( mobjSetup.getRefKey() != null &&
				!mobjSetup.getRefKey().equals("") ) {
				attr = attrs.get( mobjSetup.getRefKey() );
				if( attr != null ) {
					mvecMember = new Vector();
					for (Enumeration vals = attr.getAll();vals.hasMoreElements();) {
						mvecMember.add( vals.nextElement() );
					}
				}
			}
		}
		catch(NamingException ne) {
			// 検索エラー
			ADCorpSearchException ase = new ADCorpSearchException();
			// @LOG >err >1 検索エラー
			DebugLog.write( this.getClass(), ase.getMessage(), DebugLog.HIGHT );
			DebugLog.write( this.getClass(), ne, DebugLog.HIGHT );
			throw ase;
		}

		// 必須項目チェック
		// DN必須チェック
		if( mstrDN == null || mstrDN.equals("") ) {
			// @LOG >err >1 AD同期処理:DNに設定する属性が存在しません。
			DebugLog.write( this.getClass(), "AD同期処理:DNに設定する属性が存在しません。", DebugLog.HIGHT );
			throw new ADCorpException( ADCorpMessage.AD_NOATTRIBUTE_ERR );
		}
		// Oid必須チェック
		if( mstrOid == null || mstrOid.equals("") ) {
			// @LOG >err >1 AD同期処理:オブジェクトIDに設定する属性が存在しません。
			DebugLog.write( this.getClass(), "AD同期処理:オブジェクトIDに設定する属性が存在しません。", DebugLog.HIGHT );
			throw new ADCorpException( ADCorpMessage.AD_NOATTRIBUTE_ERR );
		}

		// デフォルト値チェック
		if( mstrGroupName == null || mstrGroupName.equals( "" ) ) {
			mstrGroupName = AD_DEFAULT + mobjSetup.getDomainNo() + "_" + mintIndex;
		}

		if( mstrForeignID == null || mstrForeignID.equals( "" ) ) {
			mstrForeignID = AD_DEFAULT + mobjSetup.getDomainNo() + "_" + mintIndex;
		}

	}

	/**
	 * 桁あふれ対応
	 * 各フィールドに対して桁あふれ対応を行います。
	 */
	private void roundB() {

		// グループ名
		mstrGroupName = XMOString.roundB(mstrGroupName, GroupsTable.GROUPNAME_LENB);
		// 外部ID
		mstrForeignID = XMOString.roundB(mstrForeignID, GroupsTable.FOREIGNID_LENB);
		// コメント
		mstrCustumMsgDir = XMOString.roundB(mstrCustumMsgDir, GroupsTable.CUSTOM_LENB);
		// ADDN
		mstrDN = XMOString.roundB(mstrDN, GroupsTable.ADDN_LENB);
		// OID
		mstrOid = XMOString.roundB(mstrDN, GroupsTable.OID_LENB);
	}

	/**
	 * 更新フラグを返します。
	 * @param strSetData 設定データ
	 * @return 更新フラグ 設定データがnullか空文字なら upflag="off"
	 *                    それ以外なら空文字を返す。
	 */
	private String makeUpFlag(String strSetData) {

		return (strSetData == null || strSetData.equals("") ? " up_flag=\"off\"" : "");

	}


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

}
