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

//
//	Assignments 管理XMO データアクセスクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo.Lo;

import java.util.*;
import java.sql.*;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xmo.Lo.LoExtend.LoExtendDataAccess;
import jp.co.ntt.lms.xmo.Lo.LoLogDelete.LogUtil;
import jp.co.ntt.lms.Common.status.prerequisite.*;
import jp.co.ntt.lms.xmo.Evaluate.EvaluateClient;

import jp.co.ntt.lms.lo.*;
import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.util.*;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.Message.Message;

import jp.co.ntt.lms.xmo.People.PeopleClient;
import java.text.*;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.Common.status.*;

import jp.co.ntt.lms.lo.Catalog.CatalogLoTable;


/**
 * Lo 管理XMO データアクセスクラスです。<BR>
 * このクラスはLoテーブルへの登録、修正、削除、検索処理を実行します。<BR>
 * DataAccessクラスを使用し、登録、修正、削除、検索処理単位で
 * トランザクション管理を行います。
 * @author T.Nijou
 * @version 0.0.0.1 2004.01.08
 */
public class LoDataAccess
	implements LoMessage, LoTable
{

	/**
	 * コンストラクタです。<BR>
	 */
	public LoDataAccess() {
	}

	/**
	 * Loテーブルへ登録処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * なおテーブルの主キー以外を省略した場合は省略したフィールドには
	 * Null値が格納されます。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             LO_ID                   LOID
	 *             LO_ADDRESS              LO実アドレス
	 *             LO_TYPE                 LOタイプ
	 *             LO_TYTLE                LOタイトル
	 *             LO_EXPLANATION          LOの説明
	 *             LO_VERSION              LOのバージョン
	 *             LO_CREATEDATE           作成日
	 *             DELETE_FLAG             隠しフラグ
	 *             FOREIGN_ID             外部キー
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized LoData insert( Hashtable htData )
		throws XMOException
	{
		// グループデータがnullのとき
		if( htData == null ) {
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// 返却LODataオブジェクト
		LoData objData = null;
		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// インサート処理実行メソッドを呼びます
			objData = insertAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		return objData;
	}

	/**
	 * 登録処理実行メソッドです。<BR>
	 * 自分のテーブルに登録処理を行った後、LoRelationテーブルに
	 * 親子関係を登録します。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 登録情報
	 * @return LoData 登録内容
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private LoData insertAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// 最大のLOID取得 プレフィックスとして"LO"を付加します
		String strLoID = "LO" + getMaxLoID(objDataAccess);
		htbParam.put( LO_ID, strLoID );

		// RealLOIDを設定します。
		// 登録処理の場合
		boolean flgRealLOID = htbParam.get(REAL_LOID)==null || htbParam.get(REAL_LOID).equals("");
		if(flgRealLOID){
			// 登録パラメータにRealLOIDが設定されていない場合、LOIDを設定する。
			htbParam.put( REAL_LOID, strLoID );
		}

		//自動採番を行うなら
		String strForeignID = getAutomaticLoForeignID(strLoID);

		// 戻りデータに採番した外部IDを格納する
		if(strForeignID != null){
			htbParam.put( FOREIGN_ID, strForeignID );
		}

		// 登録処理用のデータをセットします
		Hashtable htbData = getData( htbParam );
		//////////////////////////////////////////////////////
		// 外部IDの存在チェックを行います
		//////////////////////////////////////////////////////

		if( objDataAccess.isExit( htbParam, FOREIGN_ID ) ) {
			throw new XMOException( getMessageData( EXIT_FOREIGNID_WAR ) );
		}
		String strSQL = objDataAccess.getInsertSQL(htbData);

		// 登録処理を実行
		objDataAccess.execute( strSQL );


		String strCopyFlag = (String)htbParam.get(COPY_FLAG);
		String strLoType = (String)htbParam.get(LO_TYPE);
		// コピー処理フラグが設定されている場合は、LoRelation登録、LOHistory登録は行わない。
		if ( strCopyFlag == null )
		{
			try {
				// LoRelation登録
				LoRelationClient loRel = new LoRelationClient();
				loRel.setParentID( (String)htbParam.get( PARENT_ID ) );
				loRel.setChildID( strLoID );
				//	ADD 2005/04/27 START Koji Umehara [メソッド管理追加]
				if(htbParam.containsKey(METHOD_FLAG) && ((Boolean)htbParam.get(METHOD_FLAG)).booleanValue()) {
					loRel.setMethodFlag(true);
				}
				//	ADD 2005/04/27 END Koji Umehara [メソッド管理追加]
				// 現在使用中のコネクションインデックスを設定し、トランザクションを
				// 共有します
				loRel.setConnectionIndex( objDataAccess.getConnectionIndex() );

				// インサート処理
				if( !loRel.insert() ) {
					// LOリレーションエラーを投げる
					throw new XMOException( loRel.getMessageData() );
				}
				// LOHistory登録
				insertHistoryAction( htbParam, objDataAccess );

			}
			catch( Exception e ) {
				DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
				// システムエラーを投げる
				throw new XMOException( getMessageData( SYSTEM_ERR ) );
			}

		}
		// コピー処理フラグが設定されている場合でもLOタイプがコンテナの場合は、LOHistory登録を行う。
		else if(flgRealLOID){
			// LOHistory登録
			insertHistoryAction( htbParam, objDataAccess );
		}

		// 前提条件登録
		String strPrerequisite      = (String)htbParam.get( PRERE );
		if ( strPrerequisite != null && !strPrerequisite.equals( "" ) ) {
			// 前提条件が設定されている場合は登録処理をする
			insertPrerequisiteAction( htbParam, objDataAccess );
		}

		LoData objData = new LoData();
		objData.setLoID( strLoID );
		return objData;

	}

	/**
	 * Loテーブルへ更新処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * 省略したフィールドは更新されません。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             LO_ID                   LOID
	 *             LO_ADDRESS              LO実アドレス
	 *             LO_TYPE                 LOタイプ
	 *             LO_TYTLE                LOタイトル
	 *             LO_EXPLANATION          LOの説明
	 *             LO_VERSION              LOのバージョン
	 *             LO_CREATEDATE           作成日
	 *             DELETE_FLAG             隠しフラグ
	 *             FOREIGN_ID             外部キー
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 更新情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized String update( Hashtable htData )
		throws XMOException
	{
		// LOデータがnullのとき
		if( htData == null ) {
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 更新処理実行メソッドを実行します
			updateAction( htData, objDataAccess );

			// RealLOIDを検索し、パラメータに加えます。
			String strLOID = (String)htData.get(LO_ID);
			String strRealLOID = getRealLOID(strLOID, objDataAccess);
			if(strRealLOID != null && !strRealLOID.equals("")){
				htData.put(REAL_LOID, strRealLOID);
			}
			// 前提条件削除
			deletePrerequisiteAction( htData, objDataAccess );
			// 前提条件登録
			String strPrerequisite      = (String)htData.get( PRERE );
			if ( strPrerequisite != null && !strPrerequisite.equals( "" ) ) {
				// 前提条件が設定されている場合は登録処理をする
				insertPrerequisiteAction( htData, objDataAccess );
			}
			insertHistoryAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 正常時空文字返却
		return "";
	}

	/**
	 * Loテーブルへ更新処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * 省略したフィールドは更新されません。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             LO_ID                   LOID
	 *             LO_ADDRESS              LO実アドレス
	 *             LO_TYPE                 LOタイプ
	 *             LO_TYTLE                LOタイトル
	 *             LO_EXPLANATION          LOの説明
	 *             LO_VERSION              LOのバージョン
	 *             LO_CREATEDATE           作成日
	 *             DELETE_FLAG             隠しフラグ
	 *             FOREIGN_ID             外部キー
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 更新情報
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized void loDataUpdate( Hashtable htData )
		throws XMOException {

		// LOデータがnullのとき
		if ( htData == null ) {
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}
		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess( TABLE_NAME );
		try {
			// トランザクションを開始する
			objDataAccess.trans( htData );
			// 更新処理実行メソッドを実行します
			updateAction( htData, objDataAccess );
			// コミット処理
			objDataAccess.commit();
		} catch ( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try {
				objDataAccess.rollback();
			} catch ( Exception ex ) {
			}
			throw xe;
		} catch ( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try {
				objDataAccess.rollback();
			} catch ( Exception ex ) {
			}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}
	}

	/**
	 * 更新処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 更新情報
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void updateAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// 更新するレコードを取得します
		Vector vecSelect = selectAction( htbParam, objDataAccess );
		//////////////////////////////////////////////////////
		// 外部IDの存在チェックを行います
		//////////////////////////////////////////////////////
		String strForeignID = (String)htbParam.get( FOREIGN_ID );
		// 外部IDが更新対象の場合のみ存在チェックを行う
		if( strForeignID != null ) {
			int intCount = vecSelect.size();
			for( int i = 0; i < intCount; i++ ) {
				LoData objData = (LoData)vecSelect.get(i);
				if( !strForeignID.equals( objData.getForeignID() ) ) {
					if( objDataAccess.isExit( htbParam, FOREIGN_ID ) ) {
						throw new XMOException( getMessageData( EXIT_FOREIGNID_WAR ) );
					}
				}
			}
		}

		// 更新処理用のデータをセットします
		Hashtable htbData = getData( htbParam );

		// 更新用SQLの作成
		String strSQL = objDataAccess.getUpdateSQL(htbData);

		// 条件文の取得
		String strCondition = (String)htbParam.get( "condition_key" );
		if( strCondition != null ) {
			strSQL += strCondition;
		}

		// 更新処理を実行
		objDataAccess.execute( strSQL );

	}

	/**
	 * Loテーブルへ削除処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           削除条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 削除情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized String delete( Hashtable htData )
		throws XMOException
	{
		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// ステータス伝搬を行うLOIDリストを格納するVectorです
			Vector vecPropagateList = new Vector();

			// 削除処理実行メソッドを実行します
			deleteAction( htData, vecPropagateList, objDataAccess );

			for( int i = 0; i < vecPropagateList.size(); i++ ) {
				String strID = (String)vecPropagateList.get(i);
				// 伝搬を走らせる
				propagate(strID, objDataAccess);
			}

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}
		return DELETE_COMPLETE;
	}

	/**
	 * 削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 削除情報
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteAction( Hashtable htbParam, Vector vecPropagateList, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		// LOIDの取得
		String strLOID = (String)htbParam.get( DELETE_LOID );
		if( strLOID == null ) {
			throw new XMOException( getMessageData( LOID_GET_FAILD_ERR ) );
		}
		// ParentIDの取得
		String strParentID = (String)htbParam.get( DELETE_PARENTID );
		if( strParentID == null ) {
			throw new XMOException( getMessageData( PARENTID_GET_FAILD_ERR ) );
		}

		// 未整理に移動させるF2FのLOIDリスト格納Vectorを取得します。
		Vector vecF2FList = (Vector)htbParam.get("F2FList");

		String strRealLOID = "";
		String strLoType = "";

		try {
			// 子IDリストを取得します。

			// LoRelationXMOのクライアントをインスタンス化します
			LoRelationClient objLoRelation = new LoRelationClient();
			objLoRelation.setConnectionIndex(
				objDataAccess.getConnectionIndex() );
			objLoRelation.setWhereParentID( strLOID );
			
			//	ADD 2005/04/27 START Koji Umehara [メソッド管理追加]
			boolean blnMethodFlag = false;
			if(htbParam.containsKey(METHOD_FLAG) && ((Boolean)htbParam.get(METHOD_FLAG)).booleanValue()) {
				blnMethodFlag = true;
				objLoRelation.setMethodFlag(true);
			}
			//	ADD 2005/04/27 END Koji Umehara [メソッド管理追加]

			// 検索処理
			if( !objLoRelation.select() ) {
				// 検索に失敗した場合
				throw new XMOException( objLoRelation.getMessageData() );
			}

			while( objLoRelation.next() ) {
				// 子の削除処理を再帰呼び出しする。
				Hashtable htbChildParam = new Hashtable();
				// 削除LOIDの設定
				htbChildParam.put( DELETE_LOID, objLoRelation.getChildID()  );
				// 削除親IDの設定
				htbChildParam.put( DELETE_PARENTID, strLOID );
				// F2FLOIDリストの設定
				htbChildParam.put( "F2FList", vecF2FList );
				// 削除処理を呼び出す
				deleteAction(htbChildParam, vecPropagateList, objDataAccess );
			}


			// 子の削除が終了したら、自身の削除処理を行う。
			// LOIDからRealLoIDを取得する。
			strRealLOID = getRealLOID(strLOID, objDataAccess);

			// 削除するLOのLOタイプを取得する。
			strLoType = getLoType( strLOID , objDataAccess );

			// 他参照の存在チェック
			Vector vecList = getCopyList(strRealLOID, objDataAccess);

			// 親が未整理の場合または参照がある場合は物理削除を行う。
//			if ( strParentID.equals( XMOPropertyDef.WASTES_LOID ) || vecList.size() > 1 )
			if ( strParentID.equals( XMOPropertyDef.WASTES_LOID ) || vecList.size() > 1 || blnMethodFlag )	// ADD 2005/04/27 Koji Umehara [メソッド管理追加]
			{

				// 参照が存在しない場合は以下のテーブルをRealLOIDをキーにして削除
				// 評価テーブル
				// 共通ログテーブル
				// LO個別テーブル、
				// LO個別ログテーブル
				if( vecList.size() == 1)  {
					if( strLoType == null ) {
						// データベースエラー
						throw new XMOException( getMessageData( DB_ERR ) );
					}

					// 評価テーブルの削除
					// EvaluateClientをインスタンス化します
					EvaluateClient objEvaluateClient = new EvaluateClient();
					// EvaluateClientにRealLOIDを設定します。
					objEvaluateClient.setDeleteSelectID( strRealLOID );
					// 現在使用中のコネクションインデックスを設定します
					objEvaluateClient.setConnectionIndex(
						objDataAccess.getConnectionIndex() );
					// 削除処理を実行します。
					if( !objEvaluateClient.delete() ) {
						// 削除に失敗した場合は、例外を送出します。
						throw new XMOException( objEvaluateClient.getMessageData() );
					}

					// LO個別テーブル
					// LOサーバ名の取得
					Environment objEnv = new Environment();
					String strLoServerName = objEnv.getLoServerName();
					// LOクラスをインスタンス化します
					LoTopClient objLoClient = new LoTopClient( strLoServerName, strLoType );
					// 削除用のHashtableの作成
					Hashtable htbLoDeleteData = new Hashtable();
					htbLoDeleteData.put( LoTopClient.LOID, strRealLOID );
					htbLoDeleteData.put( LO_TYPE, strLoType );
					// 個別削除処理
					if( !objLoClient.setUp( LoTopClient.SETUP_DELETE, htbLoDeleteData ) ) {
						throw new XMOException( objLoClient.getMessageData() );
					}
					// 親が未整理の場合削除を行う。
					if ( strParentID.equals( XMOPropertyDef.WASTES_LOID ) )
					{
						deletePrerequisiteAction( htbParam, objDataAccess );
						// PROPAGATERELATIONテーブルより削除対象LOの
						// LOIDを条件としたレコードを物理削除
						PropagateRelationDataAccess objPropa = new PropagateRelationDataAccess();
						objPropa.deleteLOID(strLOID, objDataAccess);
					}
					// RealLOIDを検索し、パラメータに加えます。
					if(strRealLOID != null && !strRealLOID.equals("")){
						htbParam.put(REAL_LOID, strRealLOID);
					}
					// 履歴テーブルを削除します。
					deleteHistoryAction( htbParam, objDataAccess );

					// 共通ログテーブル、個別ログテーブルの削除
					// LO共通ログおよびLO個別ログを削除します
					LogUtil objLogUtil = new LogUtil();
					objLogUtil.delete( strRealLOID, strLoType, objDataAccess );

				}

				// LORelation削除
				// オブジェクトの内容をクリアする。
				objLoRelation.clear();

				//	ADD 2005/04/27 START Koji Umehara [メソッド管理追加]
				objLoRelation.setMethodFlag( blnMethodFlag );
				//	ADD 2005/04/27 END Koji Umehara [メソッド管理追加]

				// LoRelationXMOクライアントにLOID,ParentIDを設定します。
				objLoRelation.setDeleteSelectID( strLOID );
				objLoRelation.setDeleteParentID( strParentID );

				// ステータス伝搬をしないフラグを立てる
				objLoRelation.setCallFromDelete();

				// 現在使用中のコネクションインデックスを設定します
				objLoRelation.setConnectionIndex(
					objDataAccess.getConnectionIndex() );

				// 削除処理を実行します。
				if( !objLoRelation.delete() ) {
					// 削除に失敗した場合は、例外を送出します。
					throw new XMOException( objLoRelation.getMessageData() );
				}

				// ADD 2005/02/25 START Katsuhiko Kagami(UNITEC) [LoExtend削除]
				LoExtendDataAccess LoExtAcc = new LoExtendDataAccess();
				// 削除のための条件を準備
				Hashtable htExtParams = new Hashtable();
				htExtParams.put( LO_ID, strLOID );
				// 検索条件の設定
				String strCondition = LO_ID + "= '" + StringEscapeUtils.escapeSql(strLOID) + "' ";
				htExtParams.put( CONDITION_KEY, " WHERE " + strCondition );
				// 削除を実行
				LoExtAcc.deleteAction(htExtParams, objDataAccess);			
				// ADD 2005/02/25 END Katsuhiko Kagami(UNITEC) [LoExtend削除]
				
				// 自身のLOテーブルの削除
				// 入力のLO_idに等しいレコードを削除する
				StringBuffer sbSQL = new StringBuffer( "DELETE FROM " );
				sbSQL.append( TABLE_NAME );
				sbSQL.append( " WHERE " );
				sbSQL.append( LO_ID );
				sbSQL.append( " = '" );
				sbSQL.append( StringEscapeUtils.escapeSql(strLOID) );
				sbSQL.append( "' ");
				// 削除SQLを実行する
				objDataAccess.execute( sbSQL.toString() );
				// CatalogLo_LoListテーブル削除処理
				deleteActionCatalogLoList( strLOID, objDataAccess );

			}
			// 親が未整理ではなく、参照が存在しない場合は未整理に移動処理を行う。
			else if( !strParentID.equals( XMOPropertyDef.WASTES_LOID ) &&
					 vecList.size() == 1 )
			{
				// オブジェクトの内容をクリアする。
				objLoRelation.clear();

				// ステータス伝搬をしないフラグを立てる
				objLoRelation.setCallFromDelete();

				// 現在使用中のコネクションインデックスを設定します
				objLoRelation.setConnectionIndex(
					objDataAccess.getConnectionIndex() );

				// 移動元ID
				String strSendID = strParentID + "^" + strLOID;
				// 移動先ID
				String strRecieveID = XMOPropertyDef.ROOT_LOID + "^" + XMOPropertyDef.WASTES_LOID;

				// 移動処理
				if( !objLoRelation.transfer( strSendID, strRecieveID, LoRelationClient.IN_TYPE ) ) {
					throw new XMOException( objLoRelation.getMessageData() );
				}

				if( !vecPropagateList.contains( XMOPropertyDef.WASTES_LOID ) ) {
					// 未所属が伝搬リストに格納されていない場合は格納する
					vecPropagateList.add( XMOPropertyDef.WASTES_LOID );
				}

				// LOタイプがF2Fの場合は、RealLOIDを格納する。
				if(strLoType.equals("8") && !vecF2FList.contains( strLOID )){
					vecF2FList.add(strRealLOID);
				}

			}
			// その他の場合はシステムエラー
			else {
				throw new XMOException( getMessageData( SYSTEM_ERR ) );
			}

			if( !vecPropagateList.contains( strParentID ) ) {
				// 親IDが伝搬リストに格納されていない場合は格納する
				vecPropagateList.add( strParentID );
			}

		} catch (XMOException xe) {
			throw xe;
		}
		catch (SQLException se) {
			throw se;
		}
		catch (Exception e) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// システムエラーを設定
			throw new XMOException( getMessageData( SYSTEM_ERR ) );
		}

	}

	/**
	 * ステータス伝搬処理
	 * 移動、削除時にステータス伝搬処理を走らせます。
	 * @param strLoID LOID
	 */
	private void propagate( String strLoID, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		StatusPropagation objPropagation = new StatusPropagation( strLoID );
		PropagateControl.getInstance().addPropagate(objPropagation);
	}

	/**
	 * Loテーブルへ検索処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           検索条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized Vector select( Hashtable htData )
		throws XMOException
	{
		// グループデータがnullのとき
		if( htData == null ) {
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// 戻り値
		Vector vecReturn = new Vector();

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {
			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 検索処理実行メソッド
			vecReturn = selectAction( htData, objDataAccess );

			// コミット
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		return vecReturn;
	}

	/**
	 * 検索処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 検索情報
	 * @return Vector 検索結果
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private Vector selectAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		Vector vecReturn = new Vector();

		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();

			// SQLの組み立て
			StringBuffer sbSQL = new StringBuffer();
			sbSQL.append( "SELECT * FROM " + TABLE_NAME );
			// 条件文の取得
			String strCondition = (String)htbParam.get( "condition_key" );
			if( strCondition != null ) {
				sbSQL.append( strCondition );

				// ORDER BY句がない場合、LOIDのORDER BY句を追加する
				if(strCondition.indexOf("ORDER BY") == -1)
				{
					//SQLServerの場合
					if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
						sbSQL.append(" ORDER BY CONVERT(INT,SUBSTRING(LOID, 3, { fn LENGTH(LOID) })) ");
					//Oracleの場合
					}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
						sbSQL.append(" ORDER BY TO_NUMBER(SUBSTR(LOID, 3, LENGTH(LOID))) ");
					//PostgreSQLの場合
					}else if(objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
						sbSQL.append(" ORDER BY TO_NUMBER(SUBSTR(LOID, 3, LENGTH(LOID)),'9999999999') ");
					}
				}
			}
			else
			{
				//SQLServerの場合
				if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
					sbSQL.append(" ORDER BY CONVERT(INT,SUBSTRING(LOID, 3, { fn LENGTH(LOID) })) ");
				//Oracleの場合
				}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
					sbSQL.append(" ORDER BY TO_NUMBER(SUBSTR(LOID, 3, LENGTH(LOID))) ");
				//PostgreSQLの場合
				}else if(objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
					sbSQL.append(" ORDER BY TO_NUMBER(SUBSTR(LOID, 3, LENGTH(LOID)),'9999999999') ");
				}
			}

			DebugLog.write( this.getClass(), sbSQL.toString(), DebugLog.ROW );
			ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());
			while(rs.next()) {
				String strLoID = ChangeEncode.setChar( rs.getString( LO_ID ) );
				String strLoType = ChangeEncode.setChar( rs.getString( LO_TYPE ) );
				String strLoTytle = ChangeEncode.setChar( rs.getString( LO_TYTLE ) );
				String strLoExplanation = ChangeEncode.setChar( rs.getString( LO_EXPLANATION ) );
				String strLoVersion = ChangeEncode.setChar( rs.getString( LO_VERSION ) );
				String strRealLOID = ChangeEncode.setChar( rs.getString( REAL_LOID ) );
				String strConclusion = ChangeEncode.setChar( rs.getString( CONCLUSION ) );
			   String strMentorEmailAddress = ChangeEncode.setChar( rs.getString( MENTOR_EMAIL_ADDRESS ) );
				String strDeleteFlag = ChangeEncode.setChar( rs.getString( DELETE_FLAG ) );
				String strForeignID = ChangeEncode.setChar( rs.getString( FOREIGN_ID ) );
				String strKeyWord = ChangeEncode.setChar( rs.getString( KEYWORD ) );
				String strPrere = ChangeEncode.setChar( rs.getString( PRERE ) );
				LoData objData = new LoData();
				objData.setLoID( strLoID );
				objData.setLoType( strLoType );
				objData.setLoTytle( strLoTytle );
				objData.setLoexplanation( strLoExplanation );
				objData.setLoVersion( strLoVersion );
				objData.setRealLOID( strRealLOID );
				objData.setConclusion( strConclusion );
				objData.setDeleteFlag( strDeleteFlag );
				objData.setForeignID( strForeignID );
				objData.setKeyWord( strKeyWord );
				objData.setPrere( strPrere );
				objData.setMentorEmail( strMentorEmailAddress );
				vecReturn.add( objData );
			}
		}
		catch(Exception ex)
		{

		}
		return vecReturn;

	}

	/**
	 * Loテーブルへ検索処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           検索条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized HistoryData selectHistory( Hashtable htData )
		throws XMOException
	{
		// グループデータがnullのとき
		if( htData == null ) {
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		HistoryData objHistory = new HistoryData();
		try {
			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 検索処理実行メソッド
			objHistory= selectHistoryAction( htData, objDataAccess );

			// コミット
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		return objHistory;
	}

	/**
	 * 検索処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 検索情報
	 * @return Vector 検索結果
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private HistoryData selectHistoryAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		HistoryData objData = new HistoryData();

		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();

			// SQLの組み立て
			StringBuffer sbSQL = new StringBuffer();

			// 条件文の取得
			String strRealLOID = (String)htbParam.get( REAL_LOID );
			String strSubQuery = "";
			if(strRealLOID != null){
				sbSQL.append(" SELECT MIN(time_stamp) AS EntryDate,");
				sbSQL.append(" MAX(time_stamp) AS LastDate,");
				sbSQL.append(" COUNT(LOID)-1 AS RenewCnt,");
				sbSQL.append(" LOID,");
				sbSQL.append(" (SELECT UserID FROM LOHistory WHERE LOID = '" + StringEscapeUtils.escapeSql(strRealLOID) + "' AND time_stamp = (SELECT MIN(time_stamp) FROM LOHistory WHERE LOID = '" + StringEscapeUtils.escapeSql(strRealLOID) + "')) AS EntryUser,");
				sbSQL.append(" (SELECT UserID FROM LOHistory WHERE LOID = '" + StringEscapeUtils.escapeSql(strRealLOID) + "' AND time_stamp = (SELECT MAX(time_stamp) FROM LOHistory WHERE LOID = '" + StringEscapeUtils.escapeSql(strRealLOID) + "')) AS LastUser");
				sbSQL.append(" FROM LOHistory");
				sbSQL.append(" WHERE LOID = '" + StringEscapeUtils.escapeSql(strRealLOID) + "'");
				sbSQL.append(" GROUP BY LOID");
			}

DebugLog.write( this.getClass(), sbSQL.toString(), DebugLog.ROW );

			ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());
			String strEntryID = "";
			String strLastID = "";
			while(rs.next()) {
				strRealLOID = ChangeEncode.setChar( rs.getString( LO_ID ) );
				String strEntryDate = XMODate.parseYYYYMMDD( rs.getDate( "EntryDate" ) );
				String strLastDate = XMODate.parseYYYYMMDD( rs.getDate( "LastDate" ) );
				int intRenewCnt = rs.getInt( "RenewCnt" );
				strEntryID = ChangeEncode.setChar( rs.getString( "EntryUser" ) );
				strLastID = ChangeEncode.setChar( rs.getString( "LastUser" ) );
				objData.setRealLOID( strRealLOID );
				objData.setEntryDate( strEntryDate );
				objData.setLastDate( strLastDate );
				objData.setRenewCnt( Integer.toString(intRenewCnt) );
			}

			// 登録者名、登録者ログインIDを取得します。
			PeopleClient objPeople = new PeopleClient();
			objPeople.setWhereUserID( strEntryID );

			// 現在使用中のコネクションインデックスを設定し、トランザクションを
			// 共有します
			objPeople.setConnectionIndex( objDataAccess.getConnectionIndex() );

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

			if( objPeople.next() ) {
				objData.setEntryUserName(objPeople.getUserName());
				objData.setEntryLoginID(objPeople.getLoginID());
			}

			// 最終更新者名、最終更新者ログインIDを取得します。
			objPeople.clear();
			objPeople.setWhereUserID( strLastID );

			// 現在使用中のコネクションインデックスを設定し、トランザクションを
			// 共有します
			objPeople.setConnectionIndex( objDataAccess.getConnectionIndex() );

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

			if( objPeople.next() ) {
				objData.setLastUserName(objPeople.getUserName());
				objData.setLastLoginID(objPeople.getLoginID());
			}

		}
		catch(Exception ex)
		{
			throw new XMOException(ex.getMessage());
		}
		return objData;

	}

	/**
	 * Lo種別テーブルへ登録処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * なおテーブルの主キー以外を省略した場合は省略したフィールドには
	 * Null値が格納されます。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             TYPE_NAME               LO種別名
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized String insertLoType( Hashtable htData )
		throws XMOException
	{
		// グループデータがnullのとき
		if( htData == null ) {
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME2);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// インサート処理実行メソッドを呼びます
			insertLoTypeAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 正常時インフォメーションメッセージID返却
		return "";
	}

	/**
	 * Lo種別テーブル登録処理実行メソッドです。<BR>
	 * 自分のテーブルに登録処理を行った後、LoRelationテーブルに
	 * 親子関係を登録します。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 登録情報
	 * @exception Exception データベースエラーが発生した場合
	 */
	private void insertLoTypeAction( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException, XMOException
	{

		// 最大のLOTYPE取得
		String strLoType = getMaxLoType(objDataAccess);
		// 登録処理用のデータをセットします
		Hashtable htbData = new Hashtable();
		putData( htbData, htbParam, TYPE_NAME );
		htbData.put( LO_TYPE, strLoType );

		String strSQL = objDataAccess.getInsertSQL(htbData);

		// 登録処理を実行
		objDataAccess.execute( strSQL );
	}

	/**
	 * Lo種別テーブルへ更新処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * 省略したフィールドは更新されません。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             LO_TYPE                 LOタイプ
	 *             TYPE_NAME               LO種別名
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 更新情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException XMO独自例外
	 * @exception SQLException データベースエラーが発生した場合
	 */
	public synchronized String updateLoType( Hashtable htData )
		throws XMOException
	{
		// LOデータがnullのとき
		if( htData == null ) {
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME2);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 更新処理実行メソッドを実行します
			updateLoTypeAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 正常時インフォメーションメッセージID返却
		return "";
	}

	/**
	 * 更新処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 更新情報
	 * @exception SQLException データベースエラーが発生した場合
	 */
	private void updateLoTypeAction( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException, XMOException
	{

		// 更新処理用のデータをセットします
		Hashtable htbData = new Hashtable();
		putData( htbData, htbParam, LO_TYPE );
		putData( htbData, htbParam, TYPE_NAME );
		putData( htbData, htbParam, LO_SUB_TYPE );

		// 更新用SQLの作成
		String strSQL = objDataAccess.getUpdateSQL(htbData);

		// 条件文の取得
		String strCondition = (String)htbParam.get( "condition_key" );
		if( strCondition != null ) {
			strSQL += strCondition;
		}

		// 更新処理を実行
		objDataAccess.execute( strSQL );

	}

	/**
	 * Lo種別テーブルへ削除処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           削除条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 削除情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized String deleteLoType( Hashtable htData )
		throws XMOException
	{
		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME2);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 削除処理実行メソッドを実行します
			deleteLoTypeAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw new XMOException( getMessageData( DB_ERR ) );
		}
		return "";
	}

	/**
	 * 削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 削除情報
	 * @exception Exception データベースエラーが発生した場合
	 */
	private void deleteLoTypeAction( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException, XMOException
	{
		// @pending ここに処理を記述します
	}

	/**
	 * Lo種別テーブルへ検索処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           検索条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized Vector selectLoType( Hashtable htData )
		throws XMOException
	{
		// グループデータがnullのとき
		if( htData == null ) {
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// 戻り値
		Vector vecReturn = new Vector();

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME2);
		try {
			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 検索処理実行メソッド
			vecReturn = selectLoTypeAction( htData, objDataAccess );

			// コミット
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		return vecReturn;
	}

	/**
	 * 検索処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 検索情報
	 * @return Vector 検索結果
	 * @exception Exception データベースエラーが発生した場合
	 */
	private Vector selectLoTypeAction( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException, XMOException
	{

		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT * FROM " + TABLE_NAME2 );
		// 条件文の取得
		String strCondition = (String)htbParam.get( "condition_key" );
		if( strCondition != null ) {
			sbSQL.append( strCondition );
		}

		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		Vector vecReturn = new Vector();
		while(rs.next()) {
			String strLoType = ChangeEncode.setChar( rs.getString( LO_TYPE ) );
			String strTypeName = ChangeEncode.setChar( rs.getString( TYPE_NAME ) );
			String strLoSubType = ChangeEncode.setChar( rs.getString( LO_SUB_TYPE ) );
			LoData objData = new LoData();
			objData.setLoType( strLoType );
			objData.setTypeName( strTypeName );
			objData.setLoSubType( strLoSubType );
			vecReturn.add( objData );
		}

		return vecReturn;

	}

	/**
	 * LOOptionテーブルへ登録処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * なおテーブルの主キー以外を省略した場合は省略したフィールドには
	 * Null値が格納されます。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             LO_ID                   LoID
	 *             OPTION_ID               OptionID
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized String insertLOOption( Hashtable htData )
		throws XMOException
	{
		// グループデータがnullのとき
		if( htData == null ) {
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME3);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// インサート処理実行メソッドを呼びます
			insertLOOptionAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 正常時空文字返却
		return "";
	}

	/**
	 * LOOptionテーブル登録処理実行メソッドです。<BR>
	 * 自分のテーブルに登録処理を行った後、LoRelationテーブルに
	 * 親子関係を登録します。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 登録情報
	 * @exception Exception データベースエラーが発生した場合
	 */
	private void insertLOOptionAction( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException, XMOException
	{
		String strSQL = objDataAccess.getInsertSQL(htbParam);

		// 登録処理を実行
		objDataAccess.execute( strSQL );
	}

	/**
	 * LOOptionテーブルへ更新処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * 省略したフィールドは更新されません。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             LO_ID                   LoID
	 *             OPTION_ID               OptionID
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 更新情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized String updateLOOption( Hashtable htData )
		throws XMOException
	{
		// LOデータがnullのとき
		if( htData == null ) {
			// パラメータエラーをスローする
			throw new XMOException( PARAM_WAR );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME3);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 更新処理実行メソッドを実行します
			updateLOOptionAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 正常時空文字返却
		return "";
	}

	/**
	 * 更新処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 更新情報
	 * @exception Exception データベースエラーが発生した場合
	 */
	private void updateLOOptionAction( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException, XMOException
	{

		// 更新処理用のデータをセットします
		Hashtable htbData = new Hashtable();
		putData( htbData, htbParam, LO_ID );
		putData( htbData, htbParam, OPTION_ID );

		// 更新用SQLの作成
		String strSQL = objDataAccess.getUpdateSQL(htbData);

		// 条件文の取得
		String strCondition = (String)htbParam.get( "condition_key" );
		if( strCondition != null ) {
			strSQL += strCondition;
		}

		// 更新処理を実行
		objDataAccess.execute( strSQL );

	}

	/**
	 * LOOptionテーブルへ削除処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           削除条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 削除情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized String deleteLOOption( Hashtable htData )
		throws XMOException
	{
		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME3);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 削除処理実行メソッドを実行します
			deleteLOOptionAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw new XMOException( getMessageData( DB_ERR ) );
		}
		return "";
	}

	/**
	 * 削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 削除情報
	 * @exception Exception データベースエラーが発生した場合
	 */
	private void deleteLOOptionAction( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException, XMOException
	{
		// @pending ここに処理を記述します

	}

	/**
	 * LOOptionテーブルへ検索処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           検索条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public synchronized Vector selectLOOption( Hashtable htData )
		throws XMOException
	{
		// グループデータがnullのとき
		if( htData == null ) {
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// 戻り値
		Vector vecReturn = new Vector();

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME3);
		try {
			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 検索処理実行メソッド
			vecReturn = selectLOOptionAction( htData, objDataAccess );

			// コミット
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		return vecReturn;
	}

	/**
	 * 検索処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 検索情報
	 * @return Vector 検索結果
	 * @exception Exception データベースエラーが発生した場合
	 */
	private Vector selectLOOptionAction( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException, XMOException
	{

		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT * FROM " + TABLE_NAME3 );
		// 条件文の取得
		String strCondition = (String)htbParam.get( "condition_key" );
		if( strCondition != null ) {
			sbSQL.append( strCondition );
		}

		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		Vector vecReturn = new Vector();
		LoData objData = new LoData();
		while(rs.next()) {
			String[] strOptionInfo = new String[2];
			strOptionInfo[0] = ChangeEncode.setChar( rs.getString( LO_ID ) );
			strOptionInfo[1] = ChangeEncode.setChar( rs.getString( OPTION_ID ) );
			objData.addOptionInfo( strOptionInfo );
		}
		vecReturn.add( objData );

		return vecReturn;

	}

	/**
	 * 最大のLoID取得
	 * @return String 最大LoID
	 */
	public String getMaxLoID( DataAccess objDataAccess )
		throws SQLException
	{
		String strSQL="";
		String strMaxLoID = "";
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();
			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				strSQL = "select MAX(CONVERT(INT,SUBSTRING(LOID, 3, { fn LENGTH(LOID) }))) + 1 as maxloid from Lo";
			//Oracleの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				strSQL = "select MAX(TO_NUMBER(SUBSTR(LOID, 3,LENGTH(LOID)))) + 1 as maxloid from Lo";
			//PostgreSQLの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				strSQL = "select MAX(TO_NUMBER(SUBSTR(LOID, 3,LENGTH(LOID)),'9999999999')) + 1 as maxloid from Lo";
			}

			Vector vecList = new Vector();

			DebugLog.write( this.getClass(), strSQL, DebugLog.ROW );
			ResultSet rs = objDataAccess.executeQuery(strSQL);

			while(rs.next()) {
				int intTemp = 0;
				intTemp = rs.getInt( "maxloid" );
				strMaxLoID = new Integer(intTemp).toString();
			}
		}
		catch(Exception ex){
			ex.printStackTrace();
		}

		return strMaxLoID;
	}

	/**
	 * 最大のLoType取得
	 * @return String 最大LoType
	 */
	private String getMaxLoType( DataAccess objDataAccess )
		throws SQLException
	{
		String strSQL="";
		String strMaxLoType = "";
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();
			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				strSQL = "select MAX(CONVERT(INT," + LO_TYPE + ")) + 1 as maxlotype from " + TABLE_NAME2;
			//Oracleの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				strSQL = "select MAX(TO_NUMBER(" + LO_TYPE +")) + 1 as maxlotype from " + TABLE_NAME2;
			}

			Vector vecList = new Vector();
			ResultSet rs = objDataAccess.executeQuery(strSQL);

			while(rs.next()) {
				int intTemp = 0;
				intTemp = rs.getInt( "maxlotype" );
				strMaxLoType = new Integer(intTemp).toString();
			}
		}
		catch(Exception ex){
		}
		return strMaxLoType;
	}

	/**
	 * 最大のRealLoID取得
	 * @return String 最大RealLoID
	 */
	public String getMaxRealLoID( DataAccess objDataAccess )
		throws SQLException
	{
		String strSQL="";
		String strMaxRealLoID = "";
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();
			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				strSQL = "select MAX(CONVERT(INT,SUBSTRING(REAL_LOID, 3, { fn LENGTH(REAL_LOID) }))) + 1 as maxrealloid from Lo";
			//Oracleの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				strSQL = "select MAX(TO_NUMBER(SUBSTR(REAL_LOID, 3,LENGTH(REAL_LOID)))) + 1 as maxrealloid from Lo";
			}

			Vector vecList = new Vector();
			ResultSet rs = objDataAccess.executeQuery(strSQL);

			while(rs.next()) {
				int intTemp = 0;
				intTemp = rs.getInt( "maxrealloid" );
				strMaxRealLoID = new Integer(intTemp).toString();
			}
		}
		catch(Exception ex){
		}
		return strMaxRealLoID;
	}

	/**
	 * LOIDからRealLOIDを取得する
	 * @param strLOID LOID
	 * @return String RealLOID
	 */
	public String getRealLOID( String strLOID )
		throws XMOException
	{
		String strRealLOID = null;

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {

			// トランザクションを開始する
			objDataAccess.trans();

			strRealLOID = getRealLOID( strLOID, objDataAccess );

			// コミット
			objDataAccess.commit();
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw new XMOException( getMessageData( DB_ERR ) );
		}


		return strRealLOID;
	}

	/**
	 * LOIDからRealLOIDを取得する
	 * @param strLOID LOID
	 * @return String RealLOID
	 */
	public String getRealLOID( String strLOID, DataAccess objDataAccess )
		throws SQLException
	{
		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT " );
		sbSQL.append( REAL_LOID );
		sbSQL.append( " FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( LO_ID);
		sbSQL.append( " = '");
		sbSQL.append( StringEscapeUtils.escapeSql(strLOID) );
		sbSQL.append( "'" );

		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		String strRealLOID = null;
		while(rs.next()) {
			strRealLOID = ChangeEncode.setChar( rs.getString( REAL_LOID ) );
		}

		return strRealLOID;
	}

	/**
	 * LOIDから参照LOリストを取得する
	 * @param strLOID LOID
	 * @return String[] 参照LOIDリスト
	 */
	public String[] getRefLOList( String strLOID, DataAccess objDataAccess )
		throws SQLException
	{
		// LOIDからRealLOIDを取得する
		String strRealLOID = getRealLOID(strLOID, objDataAccess);

		Vector vecList = getCopyList(strRealLOID, objDataAccess);

		// 配列コピー
		String[] strLOIDList = new String[ vecList.size() ];
		vecList.copyInto( strLOIDList );

		return strLOIDList;
	}

	/**
	 * RealLOIDから参照のLOIDリストを取得する
	 * @param strRealLOID RealLOID
	 * @return Vector LOIDリスト
	 */
	public Vector getCopyList( String strRealLOID )
		throws XMOException
	{
		Vector vecRet = null;
		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {
			// トランザクションを開始する
			objDataAccess.trans();

			vecRet = getCopyList(strRealLOID, objDataAccess);

			// コミット
			objDataAccess.commit();
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		return vecRet;
	}

	/**
	 * RealLOIDから参照のLOIDリストを取得する
	 * @param strRealLOID RealLOID
	 * @return Vector LOIDリスト
	 */
	public Vector getCopyList( String strRealLOID, DataAccess objDataAccess )
		throws SQLException
	{
		Vector vecRet = new Vector();

		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT " );
		sbSQL.append( LO_ID );
		sbSQL.append( " FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( REAL_LOID );
		sbSQL.append( " = '");
		sbSQL.append( StringEscapeUtils.escapeSql(strRealLOID) );
		sbSQL.append( "'" );

		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		String strLOID = "";
		while(rs.next()) {
			strLOID = ChangeEncode.setChar(rs.getString( LO_ID ));
			vecRet.add(strLOID);
		}

		return vecRet;
	}

	/**
	 * 登録、更新処理時のデータを組み立てます
	 * @param htData
	 * @return Hashtable
	 */
	private Hashtable getData( Hashtable htbParam ) {
		Hashtable htbData = new Hashtable();
		putData( htbData, htbParam, LO_ID );
		putData( htbData, htbParam, LO_TYPE );
		putData( htbData, htbParam, LO_TYTLE );
		putData( htbData, htbParam, LO_EXPLANATION );
		putData( htbData, htbParam, LO_VERSION );
		putData( htbData, htbParam, REAL_LOID );
		putData( htbData, htbParam, CONCLUSION );
		putData( htbData, htbParam, DELETE_FLAG );
		putData( htbData, htbParam, FOREIGN_ID );
		putData( htbData, htbParam, KEYWORD );
		putData( htbData, htbParam, PRERE );
		putData( htbData, htbParam, MENTOR_EMAIL_ADDRESS );

		return htbData;
	}

	/**
	 * LOIDからLOタイプを取得する。
	 * @param strLOID LOID
	 * @param objDataAccess
	 * @return String LOタイプ
	 * @exception SQLException
	 */
	private String getLoType( String strLOID , DataAccess objDataAccess )
		throws SQLException
	{

		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT " );
		sbSQL.append( LO_TYPE );
		sbSQL.append( " FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( LO_ID );
		sbSQL.append( " = '");
		sbSQL.append( StringEscapeUtils.escapeSql(strLOID) );
		sbSQL.append( "'" );

		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		String strLoType = null;
		if(rs.next()) {
			strLoType = rs.getString( LO_TYPE );
			if( strLoType != null ) strLoType = strLoType.trim();
		}

		return strLoType;

	}

	/**
	 * LOIDからLOタイトルを取得する。
	 * @param strLOID LOID
	 * @param objDataAccess
	 * @return String LOタイプ
	 * @exception SQLException
	 */
	public String getLoTitle( String strLOID , DataAccess objDataAccess )
		throws SQLException
	{

		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT " );
		sbSQL.append( LO_TYTLE );
		sbSQL.append( " FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( LO_ID );
		sbSQL.append( " = '");
		sbSQL.append( StringEscapeUtils.escapeSql(strLOID) );
		sbSQL.append( "'" );

		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		String strLoTitle = null;
		if(rs.next()) {
			strLoTitle = ChangeEncode.setChar(rs.getString( LO_TYTLE ));
		}

		return strLoTitle;

	}

	/**
	 * 安全にHashtableに追加するメソッドです
	 */
	private void putData( Hashtable htbData,  Hashtable htbParam, String strKey ) {
		String strValue = (String)htbParam.get( strKey );
		if( strValue != null ) {
			htbData.put( strKey, strValue );
		}
	}

	/**
	 * メッセージオブジェクトを作成します
	 * @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;
	}

	/**
	 * 外部ID自動採番
	 * @param strGroupID
	 * @return String 自動採番Lo外部ID
	 */
	public String getAutomaticLoForeignID(String strLoID) {

		String strForeignID = null;
		// XMS2.ini ファイルにグループPrefixが設定しているかをチェックする
		try{
			Environment objEnv = new Environment();
			String strGetLoPrefix = objEnv.getLoPrefix();

			if (strGetLoPrefix != null){
				strForeignID = strGetLoPrefix + strLoID;
			}
		}
		catch(Exception ex)
		{
		}
		return 	strForeignID;
	}


	/**
	 * 履歴テーブルに登録処理を行います。<BR>
	 * @param htbParam 登録情報
	 * @return LoData 登録内容
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	public void insertHistoryAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		String strLoID = (String)htbParam.get(LO_ID);

		// RealLOIDを設定します。
		// 登録処理の場合
		if(htbParam.get(REAL_LOID)==null || htbParam.get(REAL_LOID).equals("")){
			// 登録パラメータにRealLOIDが設定されていない場合、LOIDを設定する。
			htbParam.put( REAL_LOID, strLoID );
		}

		String strREAL_LOID = (String)htbParam.get(REAL_LOID);
		String strLOGIN_USER_ID = (String)htbParam.get( "userId" );
		//システム日付を取得
		String strTIME_STAMP = "";
		if(htbParam.get(TIME_STAMP)==null || htbParam.get(TIME_STAMP).equals("")){
			SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
			java.util.Date currentDate_1 = new java.util.Date();
			strTIME_STAMP = formatter.format(currentDate_1);
		}else{
			strTIME_STAMP = (String)htbParam.get(TIME_STAMP);
		}

		Hashtable htbData = new Hashtable();
		htbData.put( LO_ID , strREAL_LOID);
		htbData.put( TIME_STAMP , strTIME_STAMP);
		htbData.put( LOGIN_USER_ID , strLOGIN_USER_ID );

		// 登録処理用のデータをセットします
		String strSQL = objDataAccess.getInsertSQL(htbData,TABLE_NAME4);

		// 登録処理を実行
		objDataAccess.execute( strSQL );
	}

	/**
	 * LoHistoryテーブルへ削除処理を行います。<BR>
	 * @param htbParam 削除情報
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteHistoryAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		// RealLOIDの取得
		String strRealLOID = (String)htbParam.get( REAL_LOID );
		if( strRealLOID == null ) {
			throw new XMOException( getMessageData( LOID_GET_FAILD_ERR ) );
		}
		// ParentIDの取得
		String strParentID = (String)htbParam.get( DELETE_PARENTID );
		if( strParentID == null ) {
			throw new XMOException( getMessageData( PARENTID_GET_FAILD_ERR ) );
		}
		try {
			// 親が未整理の場合削除を行う。
			if ( strParentID.equals( XMOPropertyDef.WASTES_LOID ) )
			{
				// 削除する
				StringBuffer sbSQL = new StringBuffer( "DELETE FROM " );
				sbSQL.append( TABLE_NAME4 );
				sbSQL.append( " WHERE " );
				sbSQL.append( LO_ID );
				sbSQL.append( " = '" );
				sbSQL.append( StringEscapeUtils.escapeSql(strRealLOID) );
				sbSQL.append( "' ");
				// SQLを実行する
				objDataAccess.execute( sbSQL.toString() );
			}
			// 未整理ではなく、参照が存在しない場合はなにもしない
			else if( !strParentID.equals( XMOPropertyDef.WASTES_LOID ) )
			{
			}
			// その他の場合はシステムエラー
			else {
				throw new XMOException( getMessageData( SYSTEM_ERR ) );
			}
		} catch (XMOException xe) {
			throw xe;
		}
		catch (SQLException se) {
			throw se;
		}
		catch (Exception e) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// システムエラーを設定
			throw new XMOException( getMessageData( SYSTEM_ERR ) );
		}
	}

	/**
	 * コンテナ変換時の処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 検索情報
	 * @return Vector 検索結果
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	public void ChangeTypeHistory( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		HistoryData objData = new HistoryData();

		try{
			// パラメータチェック
			String strRealLOID = (String)htbParam.get( REAL_LOID );
			String strLOID = (String)htbParam.get( LO_ID );
			String strLoginUserID = (String)htbParam.get( "userId" );
			if(strRealLOID == null || strRealLOID.equals("")){
				throw new XMOException("RealLOIDが取得できませんでした。");
			}

			//---------------------------------------------------
			// ログインIDが取得できなかった場合、更新処理を行う。
			//---------------------------------------------------
			if(strLoginUserID == null || strLoginUserID.equals("")){
				Hashtable htbUpdateData = new Hashtable();
				htbUpdateData.put(LO_ID, strLOID);

				// 更新用SQLの作成
				String strSQL = "UPDATE LOHistory SET LOID = '" + StringEscapeUtils.escapeSql(strLOID) + "' WHERE LOID = '" + StringEscapeUtils.escapeSql(strRealLOID) + "'";

				// 更新処理を実行
				objDataAccess.execute( strSQL );
			}
			//---------------------------------------------------
			// ログインIDが取得できた場合、登録処理を行う。
			//---------------------------------------------------
			else{
				// SQLの組み立て
				StringBuffer sbSQL = new StringBuffer();

				// 属性変更前HistoryDataを取得します。
				if(strRealLOID != null){
					sbSQL.append("INSERT INTO LOHistory(LOID, time_stamp, userId) ");
					sbSQL.append("SELECT '");
					sbSQL.append(StringEscapeUtils.escapeSql(strLOID));
					sbSQL.append("', time_stamp, userId FROM LOHistory WHERE LOID ='");
					sbSQL.append(StringEscapeUtils.escapeSql(strRealLOID));
					sbSQL.append("'");

				}

				// 登録処理を実行
				objDataAccess.execute( sbSQL.toString() );

			}
		}
		catch(Exception ex)
		{
			throw new XMOException(ex.getMessage());
		}
	}

	/**
	 * 指定したLOIDリストの中から、指定したLOタイプのLOIDのみフィルタリングします。<BR>
	 * @param htbParam 削除情報
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	public Vector selectListByLoType( Hashtable htbParam )
		throws XMOException, SQLException
	{
		// LOIDリストの取得
		String strCondition = (String)htbParam.get( CONDITION_KEY );
		if( strCondition == null ) {
			throw new XMOException( "検索条件が設定されていません。" );
		}
		// LOタイプの取得
		String strLOType = (String)htbParam.get( LO_TYPE );
		if( strLOType == null ) {
			throw new XMOException( "LOタイプが設定されていません。" );
		}
		// 既に取得したLOIDリストを取得します。
		Vector vecList = (Vector)htbParam.get("LIST");

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {
			// トランザクションを開始する
			objDataAccess.trans();

			//-----------------------------------------------------
			// 指定したLOタイプのLOIDリストをフィルタリングします。
			//-----------------------------------------------------
			// SQLを組み立てます。
			StringBuffer sbSQL = new StringBuffer();
			sbSQL.append("SELECT ");
			sbSQL.append( REAL_LOID );
			sbSQL.append(" FROM ");
			sbSQL.append(TABLE_NAME);
			sbSQL.append(" WHERE ");
			sbSQL.append(LO_TYPE);
			sbSQL.append( " = '" );
			sbSQL.append( StringEscapeUtils.escapeSql(strLOType) );
			sbSQL.append("' AND ");
			sbSQL.append(LO_ID);
			sbSQL.append(" ");
			sbSQL.append(strCondition);

			// SQLを実行する
			ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

			while(rs.next()) {
				String strRealLoID = ChangeEncode.setChar( rs.getString( REAL_LOID ) );	// RealLOID
				if(vecList.indexOf(strRealLoID) < 0){
					vecList.add(strRealLoID);
				}
			}

			// コミット
			objDataAccess.commit();
		}
		catch (Exception e) {
			throw new XMOException(e.getMessage());
		}

		return vecList;
	}

	/**
	 * 前提条件テーブルに登録処理を行います。<BR>
	 * @param strLOID 登録LOID
	 * @param strPrereID 登録内容PrereID
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	public void insertPrerequisiteAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// LOIDの取得
		String strLOID              = (String)htbParam.get( LO_ID );
		if ( strLOID == null || strLOID.equals( "" ) )
		{
			throw new XMOException( getMessageData( LOID_GET_FAILD_ERR ) );
		}
		try {

			// Prerequisiteクラスをインスタンス化
			String strPrerequisite      = (String)htbParam.get( PRERE );
			Prerequisite objPrere = new Prerequisite( strPrerequisite );
			objPrere.parse();
			String strPrere[] = (String[])objPrere.getLoIDList();
			for ( int i=0; i < strPrere.length; i++ )
			{
				Hashtable htbData = new Hashtable();
				htbData.put( LO_ID , strLOID );
				htbData.put( PRERE_ID , strPrere[i] );
				// 登録処理用のデータをセットします
				String strSQL = objDataAccess.getInsertSQL(htbData,TABLE_NAME5);
				// 登録処理を実行
				objDataAccess.execute( strSQL );
			}
		}
		catch( Exception e )
		{
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			throw new XMOException( getMessageData( SYSTEM_ERR ) );
		}
	}

	/**
	 * prerequisiteテーブルへ削除処理を行います。<BR>
	 * @param strLOID 削除LOIDキー
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deletePrerequisiteAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// LOIDの取得
		String strLOID     = (String)htbParam.get( LO_ID );
		if ( strLOID == null || strLOID.equals( "" ) )
		{
			throw new XMOException( getMessageData( LOID_GET_FAILD_ERR ) );
		}
		try {

				// 削除する
				StringBuffer sbSQL = new StringBuffer( "DELETE FROM " );
				sbSQL.append( TABLE_NAME5 );
				sbSQL.append( " WHERE " );
				sbSQL.append( LO_ID );
				sbSQL.append( " = '" );
				sbSQL.append( StringEscapeUtils.escapeSql(strLOID) );
				sbSQL.append( "' ");
				// SQLを実行する
				objDataAccess.execute( sbSQL.toString() );
		}
		catch (SQLException se)
		{
			throw se;
		}
		catch (Exception e)
		{
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// システムエラーを設定
			throw new XMOException( getMessageData( SYSTEM_ERR ) );
		}
	}

	/**
	 * 前提条件テーブル検索メソッドです。<BR>
	 * PrereIDからLOIDリストを取得します。
	 * @param htbParam 検索情報
	 * @return String[] 検索結果
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	public String[] selectLOIDFromPrere( Hashtable htbParam )
		throws XMOException
	{
		Vector vecList = new Vector();
		
		String strPrereID = (String)htbParam.get(PRERE);
		
		// パラメータチェックを行います。
		if(strPrereID == null || strPrereID.equals("")){
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}
		
		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try{
		
			// トランザクションを開始する
			objDataAccess.trans();
		
			// SQLを組み立てます。
			StringBuffer sbSQL = new StringBuffer();
			sbSQL.append("SELECT ");
			sbSQL.append(LO_ID);
			sbSQL.append(" FROM ");
			sbSQL.append(TABLE_NAME5);
			sbSQL.append(" WHERE ");
			sbSQL.append(PRERE_ID);
			sbSQL.append(" = '");
			sbSQL.append(StringEscapeUtils.escapeSql(strPrereID));
			sbSQL.append("'");
			
			// SQLを実行する
			ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

			while(rs.next()) {
				String strLOID = ChangeEncode.setChar( rs.getString( LO_ID ) );	// LOID
				vecList.add(strLOID);
			}

			// コミット
			objDataAccess.commit();
			
		}
		catch(SQLException e)
		{
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		String[] strLOIDList = new String[vecList.size()];
		vecList.copyInto(strLOIDList);
		
		return strLOIDList;
	}

	/**
	 * カタログリストテーブルの中からCatalogLOID=指定したLOIDのレコードを削除する、<BR>
	 * @param strLOID 削除キー
	 * @param objDataAccess データアクセス
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	*/

	private void deleteActionCatalogLoList(String strLOID, DataAccess objDataAccess)
		throws XMOException, SQLException
	{
		// CatalogLo_LoListテーブル削除処理
		// CatalogLOID=指定したLOID レコードを削除する
		StringBuffer sbSQL = new StringBuffer( "DELETE FROM " );
		sbSQL.append( CatalogLoTable.TABLE_NAME2 );
		sbSQL.append( " WHERE " );
		sbSQL.append( CatalogLoTable.CATALOG_LIST_LOID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strLOID) );
		sbSQL.append( "' ");

		// 削除SQLを実行する
		objDataAccess.execute( sbSQL.toString() );
	}

}
