/*
このファイルの中身は、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) ______________________________________.
*/

//
//	LumpGroupクラス
//			変更履歴
//				2004.01.08	新規作成    五木田 泰史
//
package jp.co.ntt.lms.xmo.LumpInsert;

import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Groups.GroupsTable;
import jp.co.ntt.lms.xmo.Groups.GroupsMessage;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.DataAccess;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.util.XMOString;

import java.util.Vector;

/**
 * LumpGroupクラスです。<BR>
 * このクラスはXMLファイルから取得した<BR>
 * パーソナルデータをメンバに設定します。<BR>
 * 親クラスに親子関係を所有している<BR>
 * LumpGroupAndPeopleクラスを継承します。
 *
 * @author Y.Gokita
 * @version 0.0.0.1 2004/01/08
 */
public class LumpGroup extends LumpGroupAndPeople
	implements LumpInsertMessage
{

	/** グループIDを保持します */
	private String mstrGroupID   = null;

	/** グループ名を保持します */
	private String mstrGroupName = null;

	/** グループタイプを保持します */
	private String mstrGroupType = null;

	/** 隠しフラグを保持します */
	private String mstrDeleteFlag = null;

	/** 外部IDを保持します */
	private String mstrForeignID = null;

	/** コメントを保持します */
	private String mstrCustomMsgDir    = null;

	/** オブジェクトIDを保持します */
	private String mstrOid             = null;

	/** DNを保持します */
	private String mstrADDN            = null;

	/** グループ名更新フラグ */
	boolean mblGroupNameUpFlag = true;
	/** 外部ID更新フラグ */
	boolean mblForeignIDUpFlag = true;

	/** グループクライアントを保持します。 */
	private GroupsClient mobjGc = null;

	/** 外部ID重複番号を保持します */
	private int mintForeignIDCount = 1;

	/**
	 * グループIDを設定します
	 * @param String グループID
	 */
	public void setGroupID(String strGroupID)
	{
		mstrGroupID = strGroupID;
	}

	/**
	 * グループIDを取得します
	 * @return String グループID
	 */
	public String getGroupID()
	{
		return mstrGroupID;
	}

	/**
	 * グループ名を設定します
	 * @param String グループ名
	 */
	public void setGroupName(String strGroupName) {
		mstrGroupName = strGroupName;
	}

	/**
	 * グループ名を取得します
	 * @return String グループ名
	 */
	public String getGroupName()
	{
		return mstrGroupName;
	}

	/**
	 * グループタイプを設定します
	 * @param String グループタイプ
	 */
	public void setGroupType(String strGroupType)
	{
		mstrGroupType = strGroupType;
	}

	/**
	 * グループタイプを取得します
	 * @return String グループタイプ
	 */
	public String getGroupType()
	{
		return mstrGroupType;
	}

	/**
	 * 隠しフラグを設定します
	 * @param String 隠しフラグ
	 */
	public void setDeleteFlag(String strDeleteFlag)
	{
		mstrDeleteFlag = strDeleteFlag;
	}

	/**
	 * 隠しフラグを取得します
	 * @return String 隠しフラグ
	 */
	public String getDeleteFlag()
	{
		return mstrDeleteFlag;
	}

	/**
	 * 外部キーを設定します
	 * @param String 外部キー
	 */
	public void setForeignID(String strForeignID)
	{
		mstrForeignID = strForeignID;
	}

	/**
	 * 外部キーを取得します
	 * @return String 外部キー
	 */
	public String getForeignID()
	{
		return mstrForeignID;
	}

	/**
	 * コメントを設定します
	 * @param String コメント
	 */
	public void setCustomMsgDir(String strCustomMsgDir)
	{
		mstrCustomMsgDir = strCustomMsgDir;
	}

	/**
	 * コメントを取得します
	 * @return String コメント
	 */
	public String getCustomMsgDir()
	{
		return mstrCustomMsgDir;
	}

	/**
	 * オブジェクトIDを設定します。
	 * @param astrOid オブジェクトID
	 */
	public void setOid( String astrOid ) {
		mstrOid = astrOid;
	}

	/**
	 * オブジェクトIDを取得します。
	 * oid が未設定の場合は外部IDと同値とします。
	 * @return String オブジェクトID
	 */
	public String getOid() {
		if( mstrOid == null ) {
			return mstrForeignID;
		}
		else {
			return mstrOid;
		}
	}

	/**
	 * DNを設定します。
	 * @param astrADDN DN
	 */
	public void setADDN( String astrADDN ) {
		mstrADDN = astrADDN;
	}

	/**
	 * DNを取得します。
	 * @return String DN
	 */
	public String getADDN( String astrADDN ) {
		return mstrADDN;
	}

	/**
	 * 身のGroupIDと子のIDリストを取得してVectorに格納して返します。<BR>
	 * リストは正常に登録されたIDのみを返します。
	 * @return Vector IDリスト
	 */
	public Vector getMemberIDList() {
		Vector vecIDList = new Vector();

		for( int i = 0; i < mvecChildList.size(); i++ ) {
			LumpGroupAndPeople objChild = (LumpGroupAndPeople)mvecChildList.get(i);

			if( !objChild.boolFailFlag ) {
				if( objChild instanceof LumpGroup ) {
					LumpGroup objChildGroup = (LumpGroup)objChild;

					if( !objChildGroup.boolFailFlag ) {
						vecIDList.add(mstrGroupID + objChildGroup.getGroupID());

						// 子グループの再帰呼び出し
						vecIDList.addAll( objChildGroup.getMemberIDList() );
					}
				}
				else {
					LumpPeople objChildPeople = (LumpPeople)objChild;

					if( !objChildPeople.boolFailFlag ) {
						vecIDList.add( mstrGroupID + objChildPeople.getUserID() );
					}
				}
			}
		}

		return vecIDList;
	}


	/**
	 * LumpGroupを追加します
	 * インタフェースはLumpGroupAndPeopleにあります
	 * @param DataAccess データアクセスクラス
	 * @param Vector 一括登録ユーザリスト（Peopleとのインターフェイス共通化のため）
	 * @param String 開始グループ
	 * @param String メール送信フラグ
	 * @return void
	 */
	public void insert(DataAccess objDa, Vector vctUserList,
						String strStartGroup)
		throws XMOException
	{
		// @LOG  >info >5 一括登録：グループの登録を開始します。
		DebugLog.write( this.getClass(), "一括登録：グループの登録を開始します。" + mstrGroupName, DebugLog.MID );

		try
		{
			// 親グループ取得
			LumpGroup objParent = (LumpGroup)getParent();
			if(objParent == null)
			{
				//登録失敗ログ出力
				// @LOG  >err >1
				String strLog = "一括登録結果:" + mstrGroupID + mstrGroupName + "ＤＢ登録失敗";
				DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
				boolFailFlag = true;
				return;
			}

			String strParentID = objParent.getGroupID();

			// キー項目であるオブジェクトID、外部IDの設定確認
			if(!LumpUtil.checkExistKey(mstrOid,mstrForeignID))
			{
				// @LOG  >err >1
				DebugLog.write(this.getClass(),
				"入力内容が不正のため登録しません GroupName : " +
				mstrGroupName, DebugLog.HIGHT);
				boolFailFlag = true;
				return;
			}

			// オブジェクトID未設定時は外部IDと同値とする。
			if( mstrOid == null || mstrOid.equals("") ) {
				mstrOid = mstrForeignID;
			}

			// DB登録用クライアント生成
			mobjGc   = new GroupsClient();
			mobjGc.setEncode("Windows-31J");						// エンコード設定
			// オブジェクトIDとグループ種別で存在チェック
			mobjGc.setWhereGroupType(mstrGroupType);
			mobjGc.setWhereOid(mstrOid);
			// トランザクションの共有
			mobjGc.setConnectionIndex( objDa.getConnectionIndex() );

			if(!mobjGc.select())
			{
				//検索失敗ログ出力
				// @LOG  >err >1
				String strLog = "一括登録結果:" + mstrGroupID + mstrGroupName + "ＤＢ登録失敗";
				DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
				boolFailFlag = true;
				return;
			}
			if(mobjGc.next())
			{
				// 自身のIDを設定
				mstrGroupID = mobjGc.getGroupID();

				// 設定内容をクリアする。
				mobjGc.clear();

				// 更新用のパラメータチェックを実施する
				if(!checkUpdParameter())
				{
					// @LOG >err >1
					DebugLog.write(
					this.getClass(),
					"入力内容が不正のため登録しません UserName : " +
					mstrGroupName, DebugLog.HIGHT);
					boolFailFlag = true;
					return;
				}

				// DB登録設定
				// 外部IDの設定（更新フラグがonのときのみ更新をする)
				if( mblForeignIDUpFlag ) {
					mobjGc.setForeignID(mstrForeignID);
				}
				// グループ名の設定(更新フラグがonのときのみ更新する)
				if( mblGroupNameUpFlag ) {
					mobjGc.setGroupName(mstrGroupName);
				}
				// AD_DN設定(設定されているときのみ更新)
				if( mstrADDN != null ) {
					mobjGc.setAdDn( mstrADDN );
				}
				// コメント設定(設定されているときのみ更新)
				if( mstrCustomMsgDir != null ) {
					mobjGc.setCustomMsgDir(mstrCustomMsgDir);
				}

				mobjGc.setWhereGroupID( mstrGroupID );					// 更新条件にグループIDを指定

				// トランザクションの共有
				mobjGc.setConnectionIndex( objDa.getConnectionIndex() );

				// 存在した場合は更新処理
				if( !updateAction() ) {

					//登録失敗ログ出力
					// @LOG  >err >1
					String strLog = "一括登録結果:" + mstrGroupID + mstrGroupName + "ＤＢ登録失敗";
					DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
					boolFailFlag = true;
					return;

				}


				// ツリー移動処理
				if( !moveTree(mstrGroupID, objDa ) ) {

					//登録失敗ログ出力
					// @LOG  >err >1
					String strLog = "一括登録結果:" + mstrGroupID + mstrGroupName + "ＤＢ登録失敗";
					DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
					boolFailFlag = true;
					return;

				}
			}
			else
			{

				// 設定内容をクリアする。
				mobjGc.clear();

				// 更新用のパラメータチェックを実施する
				if(!checkInsParameter())
				{
					// @LOG >err >1
					DebugLog.write(
					this.getClass(),
					"入力内容が不正のため登録しません UserName : " +
					mstrGroupName, DebugLog.HIGHT);
					boolFailFlag = true;
					return;
				}

				// DB登録設定
				mobjGc.setParentID(strParentID);						// 親ID設定
				mobjGc.setForeignID(mstrForeignID);						// 外部ID設定
				mobjGc.setGroupName(mstrGroupName);						// グループ名設定
				mobjGc.setGroupType(mstrGroupType);						// グループタイプ設定
				mobjGc.setOid(mstrOid);									// オブジェクトID設定
				mobjGc.setCustomMsgDir(mstrCustomMsgDir);				// コメント設定
				mobjGc.setDeleteFlag("0");								// 削除フラグ設定
				mobjGc.setAdDn( mstrADDN );								// AD_DN

				// トランザクションの共有
				mobjGc.setConnectionIndex( objDa.getConnectionIndex() );

				//存在しない場合は登録
				if(!insertAction())
				{
					//登録失敗ログ出力
					// @LOG  >err >1
					String strLog = "一括登録結果:" + mstrGroupID + mstrGroupName + "ＤＢ登録失敗";
					DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
					boolFailFlag = true;
					return;
				}

				// 登録したグループIDを取得する。
				if( mobjGc.next() ) {
					mstrGroupID = mobjGc.getGroupID();
				}
				else {
					// 登録グループIDが取得出来ない場合はエラーとする。
					//登録失敗ログ出力
					// @LOG  >err >1
					String strLog = "一括登録結果:" + mstrGroupID + mstrGroupName + "ＤＢ登録失敗";
					DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
					boolFailFlag = true;
					return;
				}
			}

		}
		catch(Exception e)
		{
			// 例外発生時はシステムエラーとする。
			// @LOG  >err >1
			DebugLog.write(this.getClass(), e, DebugLog.HIGHT);
			throw new XMOException( SYSTEM_ERR );
		}

		// @LOG >info >5 一括登録：グループの登録が終了しました。
		DebugLog.write( this.getClass(), "一括登録：グループの登録が終了しました。" + mstrGroupName, DebugLog.MID );
	}

	/**
	 * 更新処理を行います。
	 * @return boolean true：正常 false: 異常
	 */
	private boolean updateAction()
		throws Exception
	{

		if(!mobjGc.update()) {

			String strMessageID = mobjGc.getMessageID();
			// 更新エラーが外部ID重複エラーの場合は重複対応を行い再更新
			if( strMessageID != null && strMessageID.equals(GroupsMessage.EXIT_FOREIGNID_WAR) ) {
				String strForeignID = XMOString.makeNoDupliString( mstrForeignID, mintForeignIDCount, GroupsTable.FOREIGNID_LENB );

				if( strForeignID == null ) {
					return false;
				}
				// 外部ID重複対応
				mobjGc.setForeignID( strForeignID );

				// 再更新
				mintForeignIDCount++;
				return updateAction();
			}
			// データベースエラーの場合は例外を投げる
			else if( strMessageID != null && strMessageID.equals(GroupsMessage.DB_ERR) ) {
				throw new XMOException( DB_ERR );
			}
			else {
				return false;
			}

		}

		return true;
	}

	/**
	 * 登録処理を行います
	 * @return boolean true：正常 false: 異常
	 */
	private boolean insertAction()
		throws Exception
	{
		if(!mobjGc.insert()) {

			String strMessageID = mobjGc.getMessageID();
			// 更新エラーが外部ID重複エラーの場合は重複対応を行い再更新
			if( strMessageID != null && strMessageID.equals(GroupsMessage.EXIT_FOREIGNID_WAR) ) {
				String strForeignID = XMOString.makeNoDupliString( mstrForeignID, mintForeignIDCount, GroupsTable.FOREIGNID_LENB );

				if( strForeignID == null ) {
					return false;
				}
				// 外部ID重複対応
				mobjGc.setForeignID( strForeignID );

				// 再更新
				mintForeignIDCount++;
				return insertAction();
			}
			// データベースエラーの場合は例外を投げる
			else if( strMessageID != null && strMessageID.equals(GroupsMessage.DB_ERR) ) {
				throw new XMOException( DB_ERR );
			}
			else {
				return false;
			}

		}
		else {
			return true;
		}
	}

	/**
	 * パラメータをチェックします<BR>
	 * @return boolean 0:不正、1:正常
	 */
	public boolean checkParseParameter()
	{
		return checkUpdParameter();
	}

	/**
	 * 新規登録時のパラメータをチェックします<BR>
	 * 更新フラグの状態に関わらずチェックはすべての項目に対し行われ、エラー内容はログに書き出されます。
	 * @return boolean 0:不正、1:正常
	 */
	private boolean checkInsParameter()
	{
		boolean boolRet = true;
		// 必須項目チェック
		// グループ名チェック(入力チェックはエラーとする)
		if(LumpUtil.checkUserName(mstrGroupName) == false) {
			boolRet = false;
		}

		// 外部IDチェック(入力チェックはエラーとする)
		if(LumpUtil.checkForeignID(mstrForeignID) == false) {
			boolRet = false;
		}

		// 必須以外チェック
		// オブジェクトIDチェック(未入力はエラーとしない)
		if(LumpUtil.checkOid(mstrOid) == false) {
			if(mstrOid != null && !mstrOid.equals(""))
			{
				boolRet = false;
			}
			mstrOid = null;
		}

		// コメントチェック(入力チェックはエラーとしない)
		if(LumpUtil.checkCustomMsgDir(mstrCustomMsgDir) == false) {
			mstrCustomMsgDir = null;
		}

		// DNチェック(入力チェックはエラーとしない)
		if(LumpUtil.checkADDN(mstrADDN) == false) {
			mstrADDN = null;
		}
		return boolRet;
	}

	/**
	 * 更新時のパラメータをチェックします<BR>
	 * 更新フラグがoffの項目を除いてチェックを行い、エラー内容はログに書き出されます。
	 * @return boolean 0:不正、1:正常
	 */
	private boolean checkUpdParameter()
	{
		boolean boolRet = true;
		// 必須項目チェック
		// グループ名の設定(更新フラグがonのときのみ)
		if( mblGroupNameUpFlag ) {
			// グループ名チェック(入力チェックはエラーとする)
			if(LumpUtil.checkUserName(mstrGroupName) == false) {
				boolRet = false;
			}
		}

		// 外部IDの設定（更新フラグがonのときのみ)
		if( mblForeignIDUpFlag ) {
			// 外部IDチェック(入力チェックはエラーとする)
			if(LumpUtil.checkForeignID(mstrForeignID) == false) {
				boolRet = false;
			}
		}

		// 必須以外チェック
		// オブジェクトIDチェック(未入力はエラーとしない)
		if(LumpUtil.checkOid(mstrOid) == false) {
			if(mstrOid != null && !mstrOid.equals(""))
			{
				boolRet = false;
			}
			mstrOid = null;
		}

		// コメントチェック(入力チェックはエラーとしない)
		if(LumpUtil.checkCustomMsgDir(mstrCustomMsgDir) == false) {
			mstrCustomMsgDir = null;
		}

		// DNチェック(入力チェックはエラーとしない)
		if(LumpUtil.checkADDN(mstrADDN) == false) {
			mstrADDN = null;
		}
		return boolRet;
	}

	/**
	 * 対象のパスに画面で選択したグループが含まれているかチェックします。<BR>
	 * @return boolean true:含まれている、false:含まれていない
	 */
	private boolean isContains(String strStartGID, String strTargetID)
		throws Exception{

		boolean result = false;

		GroupAndPeopleClient objGap = new GroupAndPeopleClient();
		objGap.searchPath(strTargetID);

		String strFullPath = "";
		if( objGap.next() ) {
			String[] strPath = objGap.getPath();
			for( int j = 0; j < strPath.length; j++ ) {
				strFullPath += "/" + strPath[j];
			}
			if ( strFullPath.indexOf(strStartGID) != -1 ){
				result = true;
			}
		}
		return result;

	}
}

