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

//
//	XMSBase サーバクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo.Base;

import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.Remote;
import java.rmi.server.UnicastRemoteObject;
import java.util.*;
import java.sql.*;

// XMS2 API
import jp.co.ntt.lms.lo.LoConstant;
import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.Message.Message;
import jp.co.ntt.lms.xmo.Method.MethodClient;
import jp.co.ntt.lms.xmo.Method.MethodData;
import jp.co.ntt.lms.xmo.Groups.*;
import jp.co.ntt.lms.xmo.GroupAndPeople.*;
import jp.co.ntt.lms.xmo.RoleAssignments.*;
import jp.co.ntt.lms.xmo.Roles.*;
import jp.co.ntt.lms.xmo.Lo.*;
import jp.co.ntt.lms.xmo.LoRelation.*;
import jp.co.ntt.lms.xmo.Assignments.*;
import jp.co.ntt.lms.xmo.Base.Gui.*;

/**
 * Base(XMS_B)のサーバクラスです。<BR>
 * XMSBaseインタフェースを実装し、リモートオブジェクトとして動作します。
 * @author T.Nijou
 * @version 0.0.0.1 2004/01/08
 */
public class XMSBase extends UnicastRemoteObject
	implements XMO, XMSBaseMessage, XMSBaseTable, XMOPropertyDef
{

	//////////////////////////////////////////////////////////////////
	// メソッド名定義
	//////////////////////////////////////////////////////////////////
	/** XMOEntry登録処理 */
	private static final String METHOD1 = "insert";
	/** XMOEntry更新処理 */
	private static final String METHOD2 = "update";
	/** XMOEntry削除 */
	private static final String METHOD3 = "delete";
	/** XMOEntry検索 */
	private static final String METHOD4 = "select";
	/** ルートグループリスト検索メソッド名です */
	private static final String METHOD5 = "searchRootGroupList";
	/** ルートLOリスト検索メソッド名です */
	private static final String METHOD6 = "searchRootLoList";
	/** 基本画面の表示データ検索メソッド名です */
	private static final String METHOD7 = "selectBaseDisplay";
	//	ADD 2005/03/25 START Koji Umehara [メソッド管理追加]
	/** ルートメソッドリスト検索メソッド名です */
	private static final String METHOD8 = "searchRootMethodList";
	//	ADD 2005/03/25 END Koji Umehara [メソッド管理追加]

	/** リモートオブジェクト参照用レジストリ */
	private static Registry registry = null;

	/** システムシャットダウンメソッド */
	private static final String METHOD10 = "shutdown";

	/**
	 * データアクセスクラスを保持します
	 */
	private XMSBaseDataAccess pobjDataAccess = null;

	/**
	 * XMOサーバのサーバ名称を保持します
	 */
	private String pstrXmoServerName = "rover";

	/**
	 * XMSBaseの名称を保持します
	 */
	private String pstrXmsBaseName = "jp.co.ntt.lms.base.XMSBase";

	// 起動フラグ
	private boolean isLaunch = false;

	/**
	 * コンストラクタ<BR>
	 * クラスの初期化を行います
	 */
	public XMSBase() throws Exception {
		// リモートオブジェクトをエクスポートする
		// java.rmi.server.UnicastRemoteObject の
		// 引数なしのコンストラクタを呼び出す
		super();

		// データアクセスクラスのインスタンス化
		pobjDataAccess = new XMSBaseDataAccess();

		// 初期化処理
		init();
	}

	/**
	 * 初期化処理を行います
	 */
	public void init() throws Exception {
		// 環境クラスのインスタンス化
		Environment objEnvironment = new Environment();
		// XMOサーバ名称の取得
		pstrXmoServerName = objEnvironment.getServerName();
		// XMSBase名称の取得
		pstrXmsBaseName = objEnvironment.getBaseName();

		if( registry == null ) {
			// RMIレジストリにXMSBaseを登録します。
			registry = LocateRegistry.getRegistry(new Integer( objEnvironment.getXmoRegistryPort() ).intValue());
			registry.rebind("//" + pstrXmoServerName + "/" + pstrXmsBaseName, this);
		}
	}

	/*
	 * メニュー一覧を返します
	 * @return Vector メニュー一覧
	 */
	public Vector getMenuList(Hashtable htbParam) {
		Vector vecMenuList = new Vector();
		try {
			XMSBaseEnv objEnv = XMSBaseEnv.getInstance();
			vecMenuList = objEnv.getMenuList();
		}
		catch( Exception e ) {
			return new Vector();
		}
		return vecMenuList;
	}

	/**
	 * メソッド一覧を返します
	 * @return Vector
	 */
	public Vector getMethodList() {
		Vector vecMethod = new Vector();
		vecMethod.add( METHOD1 );
		vecMethod.add( METHOD2 );
		vecMethod.add( METHOD3 );
		vecMethod.add( METHOD4 );
		return vecMethod;
	}

	/**
	 * デフォルトメニューを返します
	 * @return MenuData
	 */
	public MenuData getDefaultMenu() {
		return null;
	}

	/**
	 * 起動確認（全XMOの起動が完了したらtrue、まだ起動中であればfalseを返す。）
	 * @return boolean 全XMO起動完了：true、全XMO起動中：false
	 */
	public boolean isLaunch() {
		return isLaunch;
	}

	/**
	 * このXMOで定義された、メソッドのクライアント側からの入り口になるメソッドです。
	 * @param strMethodName 実行するメソッド名を指定します
	 * @param htData メソッドで実行するパラメータを指定します<BR>
	 *               なお必要なキーと値は各DAOの処理メソッドの説明を参照して下さい。
	 * @retunr Object 戻り値（さまざまな戻り値に対応するためObject型としてあります)<BR>
	 *                受け取り側では適切な値にキャストする必要があります。
	 */
	public Object execute( String strMethodName, Hashtable htData ) {

		Object objReturn = null;

		if( strMethodName.equals( METHOD1 ) ) {
			objReturn = insertEntry( htData );
		}
		else if( strMethodName.equals( METHOD2 ) ) {
			objReturn = updateEntry( htData );
		}
		else if( strMethodName.equals( METHOD3 ) ) {
			objReturn = deleteEntry( htData );
		}
		else if( strMethodName.equals( METHOD4 ) ) {
			objReturn = selectEntry( htData );
		}
		else if( strMethodName.equals( METHOD5 ) ) {
			objReturn = searchRootGroupList( htData );
		}
		else if( strMethodName.equals( METHOD6 ) ) {
			objReturn = searchRootLoList( htData );
		}
		else if( strMethodName.equals( METHOD7 ) ) {
			objReturn = selectBaseDisplay( htData );
		}
		else if( strMethodName.equals( METHOD8 ) ) {
			objReturn = searchRootMethodList( htData );
		}
		else if( strMethodName.equals( METHOD10 ) ) {
			shutdown( htData );
		}

		return objReturn;
	}

	/*
	 * XMOEntryテーブルへ登録処理を行います。<BR>
	 * 以下のパラメータチェックを行い、すべてOKの場合は
	 * DAOの登録処理メソッドを実行します。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             MEMBER_SHIP_ID          人々ID
	 *             MATERIAL_ID             コンポーネントID
	 *             STUDY_START_DATE        開始日
	 *             END_DATE                終了日
	 *             READ                    学習権限
	 *             MAKE_CONTENTS           作成権限
	 *             COPY_AUTHORITY          作成権
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return Vector 結果（配列の先頭にMessageDataオブジェクトを格納して返します)
	 */
	private Vector insertEntry( Hashtable htData ) {
		Vector vecReturn = new Vector();

		MessageData objMessage = null;
		// 登録処理のパラメータチェックを行います
		String strMessage = insertCheck( htData );
		if( strMessage.equals( "" ) ) {
			try {
				pobjDataAccess.insertEntry( htData );
			}
			catch( XMOException xe ) {
				objMessage = xe.getMessageData();
			}
		}
		else {
			objMessage = getMessageData( strMessage );
			DebugLog.write( this.getClass(), objMessage.getMessage(), DebugLog.HIGHT );
		}
		vecReturn.add( objMessage );
		return vecReturn;
	}

	/**
	 * XMOEntryテーブルへ更新処理を行います。<BR>
	 * 以下のパラメータチェックを行い、すべてOKの場合は
	 * DAOの更新処理メソッドを実行します。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return Vector 結果（配列の先頭にMessageDataオブジェクトを格納して返します)
	 */
	private Vector updateEntry( Hashtable htData ) {
		Vector vecReturn = new Vector();

		MessageData objMessage = null;
		// 更新処理のパラメータチェックを行います
		String strMessage = updateCheck( htData );
		if( strMessage.equals( "" ) ) {
			try {
				pobjDataAccess.updateEntry( htData );
			}
			catch( XMOException xe ) {
				objMessage = xe.getMessageData();
			}
		}
		else {
			objMessage = getMessageData( strMessage );
			DebugLog.write( this.getClass(), objMessage.getMessage(), DebugLog.HIGHT );
		}

		vecReturn.add( objMessage );
		return vecReturn;
	}

	/**
	 * XMOEntryテーブルへ削除処理を行います。<BR>
	 * 以下のパラメータチェックを行い、すべてOKの場合は
	 * DAOの削除処理メソッドを実行します。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 削除情報
	 * @return Vector 結果（配列の先頭にMessageDataオブジェクトを格納して返します)
	 */
	private Vector deleteEntry( Hashtable htData ) {
		Vector vecReturn = new Vector();

		MessageData objMessage = null;
		try {
			pobjDataAccess.deleteEntry( htData );
		}
		catch( XMOException xe ) {
			objMessage = xe.getMessageData();
		}
		vecReturn.add( objMessage );
		return vecReturn;
	}

	/**
	 * XMOEntryテーブルへ検索処理を行います。<BR>
	 * 以下のパラメータチェックを行い、すべてOKの場合は
	 * DAOの検索処理メソッドを実行します。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return Vector 結果（配列の先頭にMessageDataオブジェクトを格納し、２番目移行に
	 *                      AssignmentsDataクラスを格納して返します。)
	 */
	private Vector selectEntry( Hashtable htData ) {
		Vector vecResult = new Vector();

		MessageData objMessage = null;
		try {
			vecResult = pobjDataAccess.selectEntry( htData );
		}
		catch( XMOException xe ) {
			objMessage = xe.getMessageData();
		}

		vecResult.add( 0, objMessage );

		return vecResult;
	}

	/**
	 * 指定されたユーザIDのルート表示するグループリストを検索します。<BR>
	 * XMOIDを指定した場合は、そのXMOIDが権限に含まれるグループのみを検索します。<BR>
	 * XMOIDがnullの場合は、権限が与えられているすべてのグループを検索します。<BR>
	 * また、検索された結果は2重表示を防止する仕組みになっています。<BR>
	 * 2重表示防止とはたとえば以下のような場合です。<BR>
	 * <PRE>
	 *        |―GR1
	 *        |   |―GR11
	 *        |       |―GR111
	 *        |―GR2
	 *            |―GR21
	 *
	 *    上記のようなグループツリーで検索結果が、GR1, GR111, GR2となった場合、同一ツリー上で
	 *    下位の位置にあるGR111は検索結果から削除されます。
	 * </PRE>
	 * @param htData パラメータ
	 */
	public Vector searchRootGroupList( Hashtable htData ) {
		MessageData objMessage = null;
		DataAccess objDataAccess = new DataAccess();

		try {
			// ユーザIDの取得
			String strUserID = (String)htData.get( USER_ID );
			// パラメータチェック
			if( strUserID == null ) {
				throw new XMOException( getMessageData( PARAM_WAR ) );
			}

			// XMOIDの取得
			String[] strXmoID = (String[])htData.get( XMO_ID );

			objDataAccess.trans();

			// XMOIDが指定されていた場合は、そのXMOIDで使用できるRolesIDを取得します。
			String[] strRolesIDList = null;

			if( strXmoID != null ) {
				// XMOIDが指定されていた場合、ユーザに割り当てられている権限で、
				// 指定されたXMOを使用できるRolesIDを取得します。
				RolesClient objRoles = new RolesClient();
				// トランザクションの共有
				objRoles.setConnectionIndex( objDataAccess.getConnectionIndex() );

				Vector vecInput = new Vector();
				for( int i = 0; i < strXmoID.length; i++ ) {
					vecInput.add(strXmoID[i]);
				}

				if ( !objRoles.searchRoleIdFromFunc( vecInput ) ){
					throw new XMOException( objRoles.getMessageData() );
				}

				strRolesIDList = objRoles.getRoleIdList();
			}

			// ユーザIDをキーにして権限割当よりユーザに割り当てられているグループIDリストを取得します
			RoleAssignmentsClient objRoleAss = new RoleAssignmentsClient();
			// トランザクションの共有
			objRoleAss.setConnectionIndex( objDataAccess.getConnectionIndex() );
			// ユーザIDを検索条件に付加します
			objRoleAss.setWhereUserID( strUserID );
			// Assign_idでOrderByする
			objRoleAss.setOrderByRoleAssID();

			// 検索処理を行います。
			if( !objRoleAss.select() ) {
				throw new XMOException( objRoleAss.getMessageData() );
			}

			// マージ用のベクターを用意します
			Vector vecMarge = new Vector();

			GroupAndPeopleClient objGandP = new GroupAndPeopleClient();
			Vector vecGroupList = new Vector();
			// 検索結果の取得
			while( objRoleAss.next() ) {
				// グループを格納します
				String strGroupID = objRoleAss.getGroupID();

				// XMOID指定の合った場合はRoleIDで取得する内容を絞り込みます。
				if( strRolesIDList != null ) {
					String strRoleID = objRoleAss.getRoleID();
					boolean blIsExitRole = false;
					for( int i = 0; i < strRolesIDList.length; i++ ) {
						if( strRoleID.equals( strRolesIDList[i] ) ) {
							blIsExitRole = true;
							break;
						}
					}
					if( !blIsExitRole ) {
						// 同一RoleIDが存在しなかった場合は以下の処理を行わない。
						continue;
					}
				}

				// マージチェックを行います
				if( vecMarge.contains( strGroupID ) ) {
					// すでに存在した場合は以下の処理は行わない
					continue;
				}

				// マージ用ベクターにグループIDをセットします
				vecMarge.add( strGroupID );

				// グループ名を取得します
				GroupsClient objGroups = new GroupsClient();

				// グループIDを検索条件に付加します
				objGroups.setWhereGroupID( strGroupID );
				// 検索処理
				if( !objGroups.select() ) {
					throw new XMOException( objGroups.getMessageData() );
				}

				if( objGroups.next() ) {
					GroupsData objGroupsData = objGroups.getGroupsData();
					// 取得したグループの親グループIDを取得します
					objGandP.clear();
					// トランザクションの共有
					objGandP.setConnectionIndex( objDataAccess.getConnectionIndex() );
					// 子IDを元に親IDを取得する
					objGandP.setWhereChildID( strGroupID );
					// 検索処理
					if( !objGandP.select() ) {
						throw new XMOException( objGandP.getMessageData() );
					}

					// 検索がうまくいったら検索結果から親IDを取得する
					// グループは親をひとつしか持たないため、ループは一回
					if( objGandP.next() ) {
						objGroupsData.setParentID( objGandP.getParentID() );
					}
					// グループ情報をベクターに格納します
					vecGroupList.add( objGroupsData );
				}

			}

			// 検索結果で2重表示されるグループを削除します
			filterDuplicateGroup(vecGroupList);

			objDataAccess.commit();

			GroupsData[] objGroupsList = new GroupsData[vecGroupList.size()];
			vecGroupList.copyInto( objGroupsList );

			Vector vecReturn = new Vector();
			vecReturn.add( objMessage );
			vecReturn.add( objGroupsList );

			return vecReturn;
		}
		catch( XMOException xe ) {
			try { objDataAccess.rollback(); } catch(Exception te) {}
			objMessage = xe.getMessageData();
			Vector vecErr = new Vector();
			vecErr.add( objMessage );
			return vecErr;
		}
		catch( SQLException se ) {
			try { objDataAccess.rollback(); } catch(Exception te) {}
			DebugLog.write( this.getClass(), se, DebugLog.HIGHT );
			objMessage = getMessageData( DB_ERR );
			Vector vecErr = new Vector();
			vecErr.add( objMessage );
			return vecErr;
		}
		catch(Exception e) {
			try { objDataAccess.rollback(); } catch(Exception te) {}
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			objMessage = getMessageData( SYSTEM_ERR );
			Vector vecErr = new Vector();
			vecErr.add( objMessage );
			return vecErr;
		}
	}

	/**
	 * 指定されたユーザIDのルート表示するLOリストを検索します。<BR>
	 * intAssignTypeで指定されたアサインタイプの検索を行います。<BR>
	 * <PRE>
	 *     NON_TYPE    :: アサインタイプ指定なし
	 *     LEARN_TYPE  :: 学習アサインされているもの
	 *     MANAGE_TYPE :: 管理アサインされているもの
	 * </PRE>
	 * また、検索された結果は2重表示を防止する仕組みになっています。<BR>
	 * @param htData パラメータ
	 */
	public Vector searchRootLoList( Hashtable htData ) {
		return searchRootLoMethodList( htData, false );
	}
	
	//	ADD 2005/03/25 START Koji Umehara [メソッド管理追加]
	/**
	 * 指定されたユーザIDのルート表示するメソッドリストを検索します。<BR>
	 * intAssignTypeで指定されたアサインタイプの検索を行います。<BR>
	 * <PRE>
	 *     NON_TYPE    :: アサインタイプ指定なし
	 *     LEARN_TYPE  :: 学習アサインされているもの
	 *     MANAGE_TYPE :: 管理アサインされているもの
	 * </PRE>
	 * @param htData パラメータ
	 */
	public Vector searchRootMethodList( Hashtable htData ) {
		return searchRootLoMethodList( htData, true );
	}
	//	ADD 2005/03/25 START Koji Umehara [メソッド管理追加]

	/**
	 * 指定されたユーザIDのルート表示するLOまたはメソッドリストを検索します。<BR>
	 * intAssignTypeで指定されたアサインタイプの検索を行います。<BR>
	 * <PRE>
	 *     NON_TYPE    :: アサインタイプ指定なし
	 *     LEARN_TYPE  :: 学習アサインされているもの
	 *     MANAGE_TYPE :: 管理アサインされているもの
	 * </PRE>
	 * また、blnAllowDuplicateフラグがfalseの場合、
	 * 検索された結果は2重表示を防止する仕組みになっています。<BR>
	 * 2重表示防止とはたとえば以下のような場合です。<BR>
	 * <PRE>
	 *        |―LO1
	 *        |   |―LO11
	 *        |       |―LO111
	 *        |―LO2
	 *            |―LO21
	 *
	 *    上記のようなグループツリーで検索結果が、LO1, LO111, LO2となった場合、同一ツリー上で
	 *    下位の位置にあるGR111は検索結果から削除されます。
	 * </PRE>
	 * @param htData パラメータ
	 * @param blnMethodFlag false:LOリストを検索/true:メソッドリストを検索
	 */
	public Vector searchRootLoMethodList( Hashtable htData, boolean blnMethodFlag ) {
		MessageData objMessage = null;
		DataAccess objDataAccess = new DataAccess();

		try {
			// ユーザIDの取得
			String strUserID = (String)htData.get( USER_ID );
			// パラメータチェック
			if( strUserID == null ) {
				throw new XMOException( getMessageData( PARAM_WAR ) );
			}

			// アサインタイプの取得
			int intAssignType = ((Integer)htData.get( ASSIGN_TYPE )).intValue();
			
			//	ADD 2005/03/27 START Koji Umehara [メソッド管理追加]
			// 2重表示許可フラグの取得
			boolean blnAllowDuplicate = true;
			if ( htData.containsKey( ALLOW_DUPLICATE ) ) {
				blnAllowDuplicate = ((Boolean)htData.get( ALLOW_DUPLICATE )).booleanValue();
			}
			//	ADD 2005/03/27 END Koji Umehara [メソッド管理追加]

			objDataAccess.trans();

			// グループと人XMOを使用して、MemberShipIDを取得する。
			GroupAndPeopleClient objGroupAndPeople = new GroupAndPeopleClient();
			// トランザクションの共有
			objGroupAndPeople.setConnectionIndex( objDataAccess.getConnectionIndex() );
			// 子IDをキーにしてメンバーシップIDを取得する
			objGroupAndPeople.setWhereChildID( strUserID );

			// 検索処理
			if( !objGroupAndPeople.select() ) {
				throw new XMOException( objGroupAndPeople.getMessageData() );
			}

			// 検索結果の取得
			String strMemberShipID = "";
			Vector vecLoList = new Vector();
			while( objGroupAndPeople.next() ) {
				strMemberShipID = objGroupAndPeople.getMemberShipID();

				// メンバーシップIDをキーにして割り当てられている教材を取得します
				AssignmentsClient objAssignments = new AssignmentsClient();

				// トランザクションの共有
				objAssignments.setConnectionIndex( objDataAccess.getConnectionIndex() );
				// 検索条件にメンバーシップIDを付加する
				objAssignments.setWhereMemberShipID( strMemberShipID );
				
				//	ADD 2005/03/25 START Koji Umehara [メソッド管理追加]
				// 検索条件にメソッドフラグを付加する
				objAssignments.setWhereMethodFlag( blnMethodFlag );
				//	ADD 2005/03/25 END Koji Umehara [メソッド管理追加]
				
				switch( intAssignType ) {
					case LEARN_TYPE:
						// 検索条件に学習アサインを付加する
						objAssignments.setWhereLearnAuthority();
						break;
					case MANAGE_TYPE:
						// 検索条件に管理アサインを付加する
						objAssignments.setWhereManagementAuthority();
						break;
				}
				// Assign_idでOrderByする
				objAssignments.setOrderByAssignmentsID();

				// 検索処理
				if( !objAssignments.select() ) {
					throw new XMOException( objAssignments.getMessageData() );
				}

				int intCounter = 0;
				// 検索結果の取得
				while( objAssignments.next() ) {
					// カウンターアップ
					intCounter++;
					String strMaterialID = objAssignments.getMaterialID();

					// マテリアルIDをキーにして、LOの親IDを取得する
					LoRelationClient objLoRelation = new LoRelationClient();

					// トランザクションの共有
					objLoRelation.setConnectionIndex( objDataAccess.getConnectionIndex() );
					// 検索条件の付加
					objLoRelation.setmaterialID( strMaterialID );

					// 検索処理
					if( !objLoRelation.select() ) {
						throw new XMOException( objLoRelation.getMessageData() );
					}

					// 検索結果の取得
					if( objLoRelation.next() ) {
						String strLoID = objLoRelation.getChildID();
						String strParentLoID = objLoRelation.getParentID();
						if( blnMethodFlag ) {
							// LOIDを元にLo名を取得する
							MethodClient objLo = new MethodClient();

							// トランザクションの共有
							objLo.setConnectionIndex( objDataAccess.getConnectionIndex() );
							// 検索条件の付加
							objLo.setWhereLoID( strLoID );

							// 検索処理
							if( !objLo.select() ) {
								throw new XMOException( objLo.getMessageData() );
							}

							// 検索結果の取得
							if( objLo.next() ) {
								MethodData objLoData = objLo.getMethodData();
								objLoData.setParentID( strParentLoID );
								vecLoList.add( objLoData );
							}
						} else {
							// LOIDを元にLo名を取得する
							LoClient objLo = new LoClient();

							// トランザクションの共有
							objLo.setConnectionIndex( objDataAccess.getConnectionIndex() );
							// 検索条件の付加
							objLo.setWhereLoID( strLoID );

							// 検索処理
							if( !objLo.select() ) {
								throw new XMOException( objLo.getMessageData() );
							}

							// 検索結果の取得
							if( objLo.next() ) {
								LoData objLoData = objLo.getLoData();
								objLoData.setParentID( strParentLoID );
								vecLoList.add( objLoData );
							}
						}
					}
				}
			}

			// 検索結果で2重表示されるLOを削除します
			if( blnAllowDuplicate ) {	//	ADD 2005/03/27 Koji Umehara [メソッド管理追加]
				filterDuplicateLo(vecLoList);
			}
			
			//LOビューにおいて、メソッドの配下にあるLOについては
			//表示をしない。
			if (!blnMethodFlag)
			{
				filterMethodDescendant(vecLoList);
			}

			objDataAccess.commit();

			Vector vecReturn = new Vector();
			vecReturn.add( objMessage );

			if( blnMethodFlag ) {
				MethodData[] objLoList = new MethodData[vecLoList.size()];
				vecLoList.copyInto( objLoList );
				vecReturn.add( objLoList );
			} else {
				LoData[] objLoList = new LoData[vecLoList.size()];
				vecLoList.copyInto( objLoList );
				vecReturn.add( objLoList );
			}

			return vecReturn;
		}
		catch( XMOException xe ) {
			xe.printStackTrace();
			try { objDataAccess.rollback(); } catch(Exception te) {}
			objMessage = xe.getMessageData();
			Vector vecErr = new Vector();
			vecErr.add( objMessage );
			return vecErr;
		}
		catch( SQLException se ) {
			try { objDataAccess.rollback(); } catch(Exception te) {}
			DebugLog.write( this.getClass(), se, DebugLog.HIGHT );
			objMessage = getMessageData( DB_ERR );
			Vector vecErr = new Vector();
			vecErr.add( objMessage );
			return vecErr;
		}
		catch(Exception e) {
			try { objDataAccess.rollback(); } catch(Exception te) {}
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			objMessage = getMessageData( SYSTEM_ERR );
			Vector vecErr = new Vector();
			vecErr.add( objMessage );
			return vecErr;
		}
	}
	
	/**
	 * LOがメソッドの配下のLOの場合に、チェックリストから削除する。
	 * 
	 * @param vecLoList チェックリスト
	 * @throws XMOException
	 */
	private void filterMethodDescendant(Vector vecLoList)
		throws XMOException
	{
		MethodClient client;
		try
		{
			client = new MethodClient();
		}
		catch (Exception e)
		{
			DebugLog.write( XMSBase.class, e, DebugLog.HIGHT );
			throw new XMOException(e.getMessage());
		}
		
		boolean result = false;
		for( int i = vecLoList.size() - 1; i >= 0; i-- )
		{
			LoData objData = (LoData)vecLoList.get(i);
			
			//コンテナについては、表示フィルタしない。(指定されていることがないので。)
			if (objData.getLoType().equals(LoConstant.LO_TYPE_CONTAINER))
			{
				continue;
			}
			
			result = false;
			
			client.clear();
			client.setWhereString(MethodClient.METHODLOID, "=", objData.getLoID());
			try
			{
				client.select();
				if (client.next())
				{
					result = true;
				}
			}
			catch (Exception e)
			{
				DebugLog.write( XMSBase.class, e, DebugLog.HIGHT );
				throw new XMOException(e.getMessage());
			}
			
			if(result)
			{
				// LOListから削除
				vecLoList.remove(i);
			}
		}
		client = null;
	}

	/**
	 * Group　２重表示チェックメソッド
	 * @param vecGroupsList チェックリスト
	 * @exception XMOException
	 */
	private void filterDuplicateGroup( Vector vecGroupsList )
		throws XMOException
	{

		Hashtable htbPath = new Hashtable();
		// LOIDとパスの対応をHashtableに格納する
		for( int i = 0; i < vecGroupsList.size(); i++ ) {
			GroupsData objData = (GroupsData)vecGroupsList.get(i);
			String strGroupID = objData.getGroupID();
			Vector vecPathList = new Vector();
			try {
				// LOIDを元にパスを取得
				GroupAndPeopleClient objReltaion = new GroupAndPeopleClient();
				if( !objReltaion.searchPath(strGroupID) ) {
					throw new XMOException( objReltaion.getMessageData() );
				}

				while( objReltaion.next() ) {
					vecPathList.add( objReltaion.getPath() );
				}
				htbPath.put( objData, vecPathList );
			}
			catch( Exception ex ) {
				throw new XMOException( getMessageData( SYSTEM_ERR ) );
			}
		}

		// 2重チェック
		Hashtable htbDelGroups = new Hashtable(); // 廃棄Hashtable
		Enumeration en = htbPath.keys();
		while(en.hasMoreElements()) {
			GroupsData objData = (GroupsData)en.nextElement();
			for( int i = 0; i < vecGroupsList.size(); i++ ) {
				GroupsData objTempData = (GroupsData)vecGroupsList.get(i);
				if( objData == objTempData ) {
					// 参照が同じ場合は何もしない
					continue;
				}
				if( htbDelGroups.containsKey( objTempData ) ) {
					// すでに廃棄LOに登録されているので何もしない
					continue;
				}
				Vector vecPathList = (Vector)htbPath.get(objTempData);
				if( isContainsPath( objData.getGroupID(), vecPathList ) ) {
					// GroupsIDがパスに含まれている場合は廃棄Hashtableに格納する
					htbDelGroups.put( objTempData, "DELETE" );
				}
			}
		}

		// 廃棄Hashtableに格納されているGroupsDataをvecGroupsListから取り除く
		Enumeration delEn = htbDelGroups.keys();
		while( delEn.hasMoreElements() ) {
			GroupsData objData = (GroupsData)delEn.nextElement();
			vecGroupsList.remove( objData );
		}
	}

	/**
	 * LO　２重表示チェックメソッド
	 * @param vecLoList チェックリスト
	 * @exception XMOException
	 */
	private void filterDuplicateLo( Vector vecLoList )
		throws XMOException
	{

		Hashtable htbPath = new Hashtable();
		Vector vecMarge = new Vector();
		// LOIDとパスの対応をHashtableに格納する
		for( int i = vecLoList.size() - 1; i >= 0; i-- ) {
			LoData objData = (LoData)vecLoList.get(i);
			// マージ処理(同じLOIDが存在した場合は何もしない)
			if( vecMarge.contains( objData.getLoID() ) ) {
				// LOListから削除
				vecLoList.remove(i);
				continue;
			}
			else {
				vecMarge.add( objData.getLoID() );
			}
			String strLoID = objData.getLoID();
			Vector vecPathList = new Vector();
			try {
				// LOIDを元にパスを取得
				LoRelationClient objReltaion = new LoRelationClient();
				if( !objReltaion.searchPath(strLoID) ) {
					throw new XMOException( objReltaion.getMessageData() );
				}

				while( objReltaion.next() ) {
					vecPathList.add( objReltaion.getPath() );
				}
				htbPath.put( objData, vecPathList );
			}
			catch( Exception ex ) {
				throw new XMOException( getMessageData( SYSTEM_ERR ) );
			}
		}

		// 2重チェック
		Hashtable htbDelLo = new Hashtable(); // 廃棄Hashtable
		Enumeration en = htbPath.keys();
		while(en.hasMoreElements()) {
			LoData objData = (LoData)en.nextElement();
			for( int i = 0; i < vecLoList.size(); i++ ) {
				LoData objTempData = (LoData)vecLoList.get(i);
				if( objData == objTempData ) {
					// 参照が同じ場合は何もしない
					continue;
				}
				if( htbDelLo.containsKey( objTempData ) ) {
					// すでに廃棄LOに登録されているので何もしない
					continue;
				}
				Vector vecPathList = (Vector)htbPath.get(objTempData);
				if( isContainsPath( objData.getLoID(), vecPathList ) ) {
					// LoIDがパスに含まれている場合は廃棄Hashtableに格納する
					htbDelLo.put( objTempData, "DELETE" );
				}
			}
		}

		// 廃棄Hashtableに格納されているLoDataをvecLoListから取り除く
		Enumeration delEn = htbDelLo.keys();
		while( delEn.hasMoreElements() ) {
			LoData objData = (LoData)delEn.nextElement();
			vecLoList.remove( objData );
		}
	}

	/**
	 * 内部関数<BR>
	 * パスにターゲットのIDが含まれているかどうかを判断する
	 * @param strTargetID ターゲットID
	 * @param vecPathList パスリスト（中身はString[])
	 * @return boolean true: 含まれる false: 含まれない
	 */
	private boolean isContainsPath( String strTargetID, Vector vecPathList ) {
		for( int i = 0; i < vecPathList.size(); i++ ) {
			String[] strTempPath = (String[])vecPathList.get(i);
			for( int j = 0; j < strTempPath.length; j++ ) {
				if( strTargetID.equals( strTempPath[j] ) ) {
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * メッセージオブジェクトを作成します
	 * @param strMessageID メッセージID
	 * @return MessageData メッセージオブジェクト 例外発生時はnullを返します
	 */
	private MessageData getMessageData( String strMessageID) {
		MessageData objMessage = null;
		try {
			objMessage = Message.getInstance().getMessageData( strMessageID, MSG_FIEL_PATH, MSG_FILE_NAME );
		}
		catch( Exception e ) {

		}
		return objMessage;
	}

	/**
	 * データベース接続の初期化を行います
	 */
	public void initDB()
		throws Exception
	{
		// 環境クラスのインスタンス化
		Environment objEnvironment = new Environment();

		// DB接続情報
		String strDBDriver = "";
		String strConStr = "";
		String strDBUser = "";
		String strDBPass = "";
		int intPoolCount = 0;
		int intRetryCount = 0;
		int intWaitTime = 0;

		try {
			// プール数の取得
			intPoolCount = new Integer( objEnvironment.getPoolCount() ).intValue();
			// リトライ回数の取得
			intRetryCount = new Integer( objEnvironment.getRetryCount() ).intValue();
			// 待ち時間の取得
			intWaitTime = new Integer( objEnvironment.getWaitTime() ).intValue();

			// JDBCドライバー名を取得します
			strDBDriver = objEnvironment.getDBDriver();
			// 接続文字列を取得します
			strConStr = objEnvironment.getDBConStr();
			// DBユーザ名を取得します
			strDBUser = objEnvironment.getDBUser();
			// DBパスワードを取得します
			strDBPass = objEnvironment.getDBPass();
		}
		catch( Exception e ) {
			DebugLog.write( XMSBaseStart.class, "DB接続情報の取得に失敗しました。", DebugLog.HIGHT );
			DebugLog.write( XMSBaseStart.class, e, DebugLog.HIGHT );
			throw e;
		}

		// コネクションの確立
		DBConnector.init(	strDBDriver,
							strConStr,
							strDBUser,
							strDBPass,
							intPoolCount,
							intRetryCount,
							intWaitTime
							);

	}

	/**
	 * XMOの起動を行います
	 * @param strClassName 起動するクラス名称
	 */
	public void startXMO( String strClassName ) {

		// 学習権限およびログ参照権限の場合はダミークラスなのでインスタンスは生成しない
		if( strClassName.equals( LEARN_XMO ) || strClassName.equals( LOG_XMO ) ) {
			return;
		}

		// クラスのインスタンスの生成
		Object objXMO = null;
		try {
			objXMO = newInstance( strClassName );

DebugLog.write( this.getClass(), "Load " +  strClassName + " start!!", DebugLog.ROW );
		}
		catch( Exception e ) {
			// @pending クラスのインスタンスを取得できなかったときの処理
			return;
		}
		// 取得したクラスをRMIに登録します
		if( objXMO != null && objXMO instanceof XMO ) {
			Remote objRemote = (Remote)objXMO;
			try {
				// Bind
				registry.rebind( "//" + pstrXmoServerName + "/" + strClassName, objRemote );
DebugLog.write( this.getClass(), "Bind "  + "//" + pstrXmoServerName + "/" + strClassName, DebugLog.ROW );
DebugLog.write( this.getClass(), "Load " + strClassName +  " Completed!! ", DebugLog.ROW );
			}
			catch( Exception e ) {
				// バインド失敗時の処理
				DebugLog.write( this.getClass(), "Bind failed!!", DebugLog.HIGHT );
				DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			}
		}
		else if( objXMO == null ) {
			// @pending クラスがXMOでないときの処理
			DebugLog.write( this.getClass(), "登録されているXMOが見つかりませんでした。", DebugLog.HIGHT );
			DebugLog.write( this.getClass(), "    classname: " + strClassName, DebugLog.HIGHT );
		}
		else {
			// @pending クラスがXMOでないときの処理
			DebugLog.write( this.getClass(), "登録されているクラスはXMOではありません。", DebugLog.HIGHT );
			DebugLog.write( this.getClass(), "    classname: " + strClassName, DebugLog.HIGHT );
		}
	}

	/**
	 * 登録されているすべてのXMOの起動を行います
	 */
	public void startXMOs() {

		// サーバ側で動作するクライアントクラスをサーバ側の設定にします
		XMOClient.setServerSide();

		// XMO一覧を取得して、RMIregistarに登録する
		Vector vecXmoList = new Vector();
		String strMessage = "";
		try {
			// 検索条件の組み立て（無条件）
			Hashtable htbParam = new Hashtable();
			vecXmoList = pobjDataAccess.selectEntry( htbParam );
		}
		catch( XMOException xe ) {
			strMessage = xe.getMessage();
			xe.printStackTrace();
		}
		// 起動クラスマージ用のVectorを用意する
		Vector vecMarge = new Vector();
		// 結果のインデックス０にはメッセージデータが入っているので、１からループ
		for( int i = 0; i < vecXmoList.size(); i++ ) {
			// XMOIDよりXMOの詳細情報を取得
			XMOEntryData objData = (XMOEntryData)vecXmoList.get(i);
			// 起動フラグの取得
			String strOnFlg = objData.getXmoOnFlg();
			// クラス名の取得
			String strClassName = objData.getClassName();

			if( strClassName != null && !strClassName.equals( "" ) ) {
				if( !vecMarge.contains( strClassName ) ) {
					vecMarge.add( strClassName );
					// XMOを起動させます
					startXMO( strClassName );
				}
			}
		}

		// 登録されているすべてのXMOの起動したらtrueを設定する。
		isLaunch = true;

	}

	/**
	 * システムシャットダウン用のメソッドです<BR>
	 * 通常の業務クラスから呼び出されることはありません。<BR>
	 * 必ずXMSShutDownクラスから呼ばれます。
	 */
	private void shutdown( Hashtable htbParam ) {
		try {
			// コネクションの切断
			DBConnector.getInstance().close();
		}
		catch( Exception e ) {
		}
DebugLog.write( this.getClass(), "################ System Shutdown !!! ##############", DebugLog.HIGHT );
		// システムExit
		System.exit(0);
	}


	/**
	 * クラス名よりクラスのインスタンスを取得する内部関数
	 * @param strClassName パッケージ名を含むクラス名称
	 * @return Object インスタンス化されたオブジェクト
	 * @exception Exception クラスが見つからないとき
	 */
	private static Object newInstance( String strClassName )
		throws Exception
	{
		Class c = Class.forName( strClassName );
		Object obj = c.newInstance();
		return obj;
	}

	/**
	 * 登録処理のパラメータチェックを行います<BR>
	 * 以下のパラメータのチェックを行います。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             XMO_ID                  XMOID
	 *             XMO_NAME                名前
	 *             XMO_OUT_LINE            概要
	 *             XMO_URI                 URI
	 *             XMO_ON_FLG              稼動フラグ
	 *             CLASS_NAME_F            クラス名称
	 *             TREE_VIEW_TIPE          ツリービュータイプ
	 *             INI_MENU                初期メニュー名称
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htbParam パラメータ
	 * @return String エラー時はエラー番号 OKのときは空文字を返します
	 */
	private String insertCheck( Hashtable htbParam ) {

		String strMessage = "";
		String strCheck = "";

		// XMOIDのチェック(必須チェックあり)
		strCheck = (String)htbParam.get( XMO_ID );
		strMessage = XMSBaseCheck.checkXmoID( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 名前のチェック(必須チェックあり)
		strCheck = (String)htbParam.get( XMO_NAME );
		strMessage = XMSBaseCheck.checkXmoName( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 概要のチェック(必須チェックあり)
		strCheck = (String)htbParam.get( XMO_OUT_LINE );
		strMessage = XMSBaseCheck.checkXmoOutLine( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// URIのチェック(必須チェックあり)
		strCheck = (String)htbParam.get( XMO_URI );
		strMessage = XMSBaseCheck.checkXmoUri( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 稼動フラグのチェック(必須チェックあり)
		strCheck = (String)htbParam.get( XMO_ON_FLG );
		strMessage = XMSBaseCheck.checkXmoOnFlg( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// クラス名のチェック(必須チェックあり)
		strCheck = (String)htbParam.get( CLASS_NAME_F );
		strMessage = XMSBaseCheck.checkClassName( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// ツリービュータイプのチェック(必須チェックあり)
		strCheck = (String)htbParam.get( TREE_VIEW_TIPE );
		strMessage = XMSBaseCheck.checkTreeViewType( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 初期メニュー名称のチェック(必須チェックあり)
		strCheck = (String)htbParam.get( INI_MENU );
		strMessage = XMSBaseCheck.checkIniMenu( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 優先度のチェック(必須チェック有り)
		strCheck = (String)htbParam.get( PRIORITY );
		strMessage = XMSBaseCheck.checkPriority( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 正常時は空文字を返す
		return "";
	}

	/**
	 * 登録処理のパラメータチェックを行います<BR>
	 * 以下のパラメータのチェックを行います。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             XMO_ID                  XMOID
	 *             XMO_NAME                名前
	 *             XMO_OUT_LINE            概要
	 *             XMO_URI                 URI
	 *             XMO_ON_FLG              稼動フラグ
	 *             CLASS_NAME_F            クラス名称
	 *             TREE_VIEW_TIPE          ツリービュータイプ
	 *             INI_MENU                初期メニュー名称
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htbParam パラメータ
	 * @return String エラー時はエラー番号 OKのときは空文字を返します
	 */
	private String updateCheck( Hashtable htbParam ) {

		String strMessage = "";
		String strCheck = "";

		// XMO_IDのチェック
		strCheck = (String)htbParam.get( XMO_ID );
		strMessage = XMSBaseCheck.checkXmoID( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 名前のチェック
		strCheck = (String)htbParam.get( XMO_NAME );
		strMessage = XMSBaseCheck.checkXmoName( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 概要のチェック
		strCheck = (String)htbParam.get( XMO_OUT_LINE );
		strMessage = XMSBaseCheck.checkXmoOutLine( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// URIのチェック
		strCheck = (String)htbParam.get( XMO_URI );
		strMessage = XMSBaseCheck.checkXmoUri( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 稼動フラグのチェック
		strCheck = (String)htbParam.get( XMO_ON_FLG );
		strMessage = XMSBaseCheck.checkXmoOnFlg( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// クラス名のチェック
		strCheck = (String)htbParam.get( CLASS_NAME_F );
		strMessage = XMSBaseCheck.checkClassName( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// ツリービュータイプのチェック
		strCheck = (String)htbParam.get( TREE_VIEW_TIPE );
		strMessage = XMSBaseCheck.checkTreeViewType( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 初期メニュー名称のチェック
		strCheck = (String)htbParam.get( INI_MENU );
		strMessage = XMSBaseCheck.checkIniMenu( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 優先度のチェック
		strCheck = (String)htbParam.get( PRIORITY );
		strMessage = XMSBaseCheck.checkPriority( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 正常時は空文字を返す
		return "";
	}


	/**
	 * 指定された親ID配下の情報を基本画面に表示する情報として返します
	 * @param htData パラメータを格納したHashtable
	 * @return Vector 結果
	 */
	private Vector selectBaseDisplay( Hashtable htData ) {

		// 親ID
		String strParentID = null;
		// 処理タイプ
		int intType = 0;

		// 画面表示情報クラス
		BaseDisplayData[] objDisplayList = null;

		DataAccess objDataAccess = new DataAccess();

		try {
			try {
				// 親IDを取得します
				strParentID = (String)htData.get(PARENT_ID);
				// 処理タイプを取得します
				intType = ((Integer)htData.get(PROCCESS_TYPE)).intValue();
			}
			catch(ClassCastException ce) {
				// 内部エラー
				MessageData objMessage = getMessageData(PARAM_WAR);
				throw new XMOException(objMessage);
			}
			// パラメータチェック
			if( strParentID == null ) {
				// 内部エラー
				MessageData objMessage = getMessageData(PARAM_WAR);
				throw new XMOException(objMessage);
			}
			// 処理タイプチェック
			if( !(intType == GROUP_TYPE || intType == LO_TYPE) ) {
				// 内部エラー
				MessageData objMessage = getMessageData(PARAM_WAR);
				throw new XMOException(objMessage);
			}

			objDataAccess.trans();

			if( intType == GROUP_TYPE ) {
				objDisplayList = pobjDataAccess.getGroupDisplay(strParentID, objDataAccess);
			}
			else {
				objDisplayList = pobjDataAccess.getLoDisplay(strParentID, objDataAccess);
			}

			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			try { objDataAccess.rollback(); } catch(Exception te) {}
			DebugLog.write(this.getClass(), xe, DebugLog.HIGHT);
			Vector vecReturn = new Vector();
			vecReturn.add( xe.getMessage() );
			return vecReturn;
		}
		catch( SQLException se ) {
			try { objDataAccess.rollback(); } catch(Exception te) {}
			DebugLog.write( this.getClass(), se, DebugLog.HIGHT );
			MessageData objMessage = getMessageData( DB_ERR );
			Vector vecErr = new Vector();
			vecErr.add( objMessage );
			return vecErr;
		}

		// 正常に終了なので配列の１番目にnullを格納して返す。
		Vector vecReturn = new Vector();
		vecReturn.add(null);
		// ２番目に表示情報配列を格納する。
		vecReturn.add(objDisplayList);
		return vecReturn;
	}



}

