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

//
//	LOLogDelete クラス
//			変更履歴
//				2004.01.08	新規作成	　　　　　　杉原正美
//
package jp.co.ntt.lms.xmo.Lo.LoLogDelete;

import java.sql.*;
import java.util.*;

import org.apache.commons.lang.StringEscapeUtils;

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

/**
 * LoLogDelete クラスです。<BR>
 * このクラスはLOLogテーブルおよびLOLogSessionテーブルのレコードを削除します。
 * また、LOの個別ログの削除を各種LOに依頼します。<BR>
 * DataAccessクラスを使用し、トランザクション管理を行います。
 *
 * @author M.Sugihara
 * @version 0.0.0.1 2004/01/08
 */
public class LogUtil
	implements LogUtilTable
{

	/**
	 * コンストラクタ
	 */
	public LogUtil() {
		super();
	}

	/**
	 * LOLogテーブル、LOLogSessionテーブルおよび
	 * LO 個別ログの削除処理を行います。<BR>
	 * <BR>LO 個別ログの削除に失敗しても処理を中断せず継続します。
	 * <BR>また、発生した例外のログ出力は、呼び出し元で行ってください。
	 *
	 * @param strUserId ユーザーID
	 * @param objDataAccess データアクセスクラス
	 * @return boolean true: 個別ログ削除成功、false:個別ログ削除エラー
	 * @exception XMOException データベースエラーが発生した場合
	 * @exception SQLException データベースエラーが発生した場合
	 * @exception Exception
	 */
	public boolean delete( String strUserId, DataAccess objDataAccess )
		throws XMOException, SQLException, Exception
	{

		// 削除処理実行メソッドを実行します -- LOLogテーブル
		deleteLOLog( strUserId, null, objDataAccess );

		// 削除処理実行メソッドを実行します -- LOLogSessionテーブル
		deleteLOLogSession( strUserId, null, objDataAccess );

		// LO個別ログ削除
		boolean bDel = deleteIndividualLog( strUserId, objDataAccess );

		return bDel;

	}

	/**
	 * LOLogテーブル、LOLogSessionテーブルおよび
	 * LO 個別ログの削除処理を行います。<BR>
	 * <BR>LO 個別ログの削除に失敗しても処理を中断せず継続します。
	 * <BR>また、発生した例外のログ出力は、呼び出し元で行ってください。
	 *
	 * @param strLoId LOID
	 * @param strLoType
	 * @param objDataAccess データアクセスクラス
	 * @return boolean true: 個別ログ削除成功、false:個別ログ削除エラー
	 * @exception XMOException データベースエラーが発生した場合
	 * @exception SQLException データベースエラーが発生した場合
	 * @exception Exception
	 */
	public boolean delete( String strLoId, String strLoType,
		DataAccess objDataAccess ) throws XMOException, SQLException, Exception
	{

		// 削除処理実行メソッドを実行します -- LOLogテーブル
		deleteLOLog( null, strLoId, objDataAccess );

		// 削除処理実行メソッドを実行します -- LOLogSessionテーブル
		deleteLOLogSession( null, strLoId, objDataAccess );

		// LO個別ログ削除
		boolean bDel = deleteIndividualLog( strLoId, strLoType, objDataAccess );

		return bDel;

	}

	/**
	 * 削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param strUserId ユーザーID or null
	 * @param strLoId LOID LOID or null
	 * @exception XMOException XMO独自例外
	 * @exception SQLException DBエラー
	 */
	private void deleteLOLog( String strUserId, String strLoId,
		DataAccess objDataAccess ) throws XMOException, SQLException
	{
		// LOLogテーブルデータ削除用SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "DELETE FROM " );
		sbSQL.append( TABLE_NAME_LOLOG );
		sbSQL.append( " WHERE " );
		if( strUserId != null ) {
			sbSQL.append( USERID );
		} else {
			sbSQL.append( LOID );
		}
		sbSQL.append( " = '" );
		if( strUserId != null ) {
			sbSQL.append( StringEscapeUtils.escapeSql(strUserId) );
		} else {
			sbSQL.append( StringEscapeUtils.escapeSql(strLoId) );
		}
		sbSQL.append( "' ");

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

	}

	/**
	 * 削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param strUserId ユーザーID or null
	 * @param strLoId LOID LOID or null
	 * @exception XMOException XMO独自例外
	 * @exception SQLException DBエラー
	 */
	private void deleteLOLogSession( String strUserId, String strLoId,
		DataAccess objDataAccess ) throws XMOException, SQLException
	{
		// LOLogSessionテーブルデータ削除用SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "DELETE FROM " );
		sbSQL.append( TABLE_NAME_LOLOGSESSION );
		sbSQL.append( " WHERE " );
		if( strUserId != null ) {
			sbSQL.append( USERID );
		} else {
			sbSQL.append( LOID );
		}
		sbSQL.append( " = '" );
		if( strUserId != null ) {
			sbSQL.append( StringEscapeUtils.escapeSql(strUserId) );
		} else {
			sbSQL.append( StringEscapeUtils.escapeSql(strLoId) );
		}
		sbSQL.append( "' ");

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

	}

	/**
	 * LO個別ログ削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 *
	 * @param strUserId ユーザーID
	 * @return boolean true: 個別ログ削除成功、false:個別ログ削除エラー
	 * @exception XMOException XMO独自例外
	 * @exception SQLException DBエラー
	 * @exception Exception
	 */
	private boolean deleteIndividualLog( String strUserId,
		DataAccess objDataAccess ) throws XMOException, SQLException, Exception
	{

		// LO サーバー名を取得します
		// 環境クラスをインスタンス化
		Environment objEnv = new Environment();
		// LoServer名の取得
		String strLoServerName = objEnv.getLoServerName();

		// LO XMOのクライアントをインスタンス化します
		LoClient objLo = new LoClient();
		// コネクションのインデックスを設定します。
		objLo.setConnectionIndex( objDataAccess.getConnectionIndex() );
		// LO種別テーブルの検索を行います
		if( !objLo.selectLoType( ) ) {
			throw new XMOException( objLo.getMessageData() );
		}

		boolean bDel = true;
		while( objLo.next() ) {
			String strLoType = objLo.getLoType();

			// LoTopClient をインスタンス化します
			LoTopClient objLoTop =
				new LoTopClient( strLoServerName, strLoType );
			if( !objLoTop.deleteIndividualLog( strUserId, null ) ) {
				bDel = false;
			}
		}
		return bDel;

	}

	/**
	 * LO個別ログ削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param strLoId LOID
	 * @param strLoType
	 * @return boolean true: 個別ログ削除成功、false:個別ログ削除エラー
	 * @exception XMOException XMO独自例外
	 * @exception SQLException DBエラー
	 * @exception Exception
	 */
	private boolean deleteIndividualLog( String strLoId, String strLoType,
		DataAccess objDataAccess ) throws XMOException, SQLException, Exception
	{

		// LO サーバー名を取得します
		// 環境クラスをインスタンス化
		Environment objEnv = new Environment();
		// LoServer名の取得
		String strLoServerName = objEnv.getLoServerName();

		// LoTopClient をインスタンス化します
		LoTopClient objLoTop =
			new LoTopClient( strLoServerName, strLoType );
		boolean bDel = true;
		if( !objLoTop.deleteIndividualLog( null, strLoId ) ) {
			bDel = false;
		}
		return bDel;

	}

	/**
	 * LOLogテーブルへ検索処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           検索条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public void changeType( String strOldID, String strNewID, DataAccess objDataAccess )
		throws LOException
	{
		try {
			// LOデータがnullのとき
			if( strOldID != null  && strNewID!=null ) {
				Vector vecReturn = selectAction( strOldID, strNewID, objDataAccess );
				for(int i=0; i<vecReturn.size(); i++){
					LoLogRecord objRecord = (LoLogRecord)vecReturn.get(i);
					insertAction(objRecord, objDataAccess);
				}
			}
		}
		catch( SQLException e ) {
			e.printStackTrace();
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new LOException( e.getMessage() );
		}
	}

	/**
	 * 検索処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param strOldLOID	検索条件LOID
	 * @param NewLOID		更新対象LOID
	 * @param objDataAccess
	 * @return Vector 検索結果
	 * @exception SQLException DBエラーが発生した場合
	 */
	private Vector selectAction( String strOldLOID, String NewLOID, DataAccess objDataAccess )
		throws SQLException
	{

		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT * FROM " + TABLE_NAME_LOLOG );
		if( strOldLOID != null ) {
			sbSQL.append( " WHERE " + LOID + " = '" + StringEscapeUtils.escapeSql(strOldLOID) + "'");
		}
		// クエリーを実行します
		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		Vector vecRet = new Vector();

		while(rs.next()) {

			LoLogRecord objData = new LoLogRecord();

			String strFullScore = rs.getString( FULLSCORE );
			String strStudyStartDate = XMODate.parseTime(rs.getTimestamp( STUDY_START_DATE ));
			String strResidenceTime = rs.getString( RESIDANCETIME );
			String strPassDay = XMODate.parseTime(rs.getTimestamp( PASSDAY ));
			String strStudyEndDate = XMODate.parseTime(rs.getTimestamp( STUDY_END_DATE ));
			String strHighScore = rs.getString( HIGHTSCORE );
			String strLowScore = rs.getString( LOWSSCORE );
			String strExecisePoint = rs.getString( EXECISE_POINT );
			String strUserID = rs.getString( USERID );
			String strAccessCnt = rs.getString( ACCESS_CNT );
			String strLastAccess = XMODate.parseTime(rs.getTimestamp( LAST_ACCESS ));
			objData.setFullScore( strFullScore );
			objData.setStudyStartDate( strStudyStartDate );
			objData.setResidanceTime( strResidenceTime );
			objData.setPassday( strPassDay );
			objData.setStudyEndDate( strStudyEndDate );
			objData.setHighScore( strHighScore );
			objData.setLowScore( strLowScore );
			objData.setExecisePoint( strExecisePoint );
			objData.setUserID( strUserID );
			objData.setLoID( NewLOID );
			objData.setAccessCnt( strAccessCnt );
			objData.setLastAccess( strLastAccess );

			vecRet.add(objData);
		}

		return vecRet;

	}

	/**
	 * ステータスLOログテーブルへの登録処理を行います
	 * @param objLoLog ログ情報データクラス
	 * @exception SQLException DBエラー
	 */
	private void insertAction( LoLogRecord objLoLog, DataAccess objDataAccess )
		throws SQLException
	{
		// 登録SQL発行用のHashtable
		Hashtable htbData = new Hashtable();

		// DBに登録するデータをハッシュテーブルに格納します
		if(objLoLog.getFullScore() != null && !objLoLog.getFullScore().equals("")){
			htbData.put( FULLSCORE, objLoLog.getFullScore() );
		}
		if(objLoLog.getStudyStartDate() != null && !objLoLog.getStudyStartDate().equals("")){
			htbData.put( STUDY_START_DATE, objLoLog.getStudyStartDate() );
		}
		if(objLoLog.getResidanceTime() != null && !objLoLog.getResidanceTime().equals("")){
			htbData.put( RESIDANCETIME, objLoLog.getResidanceTime() );
		}
		if(objLoLog.getPassday() != null && !objLoLog.getPassday().equals("")){
			htbData.put( PASSDAY, objLoLog.getPassday() );
		}
		if(objLoLog.getStudyEndDate() != null && !objLoLog.getStudyEndDate().equals("")){
			htbData.put( STUDY_END_DATE, objLoLog.getStudyEndDate() );
		}
		if(objLoLog.getAccessCnt() != null && !objLoLog.getAccessCnt().equals("")){
			htbData.put( ACCESS_CNT, objLoLog.getAccessCnt() );
		}
		if(objLoLog.getLastAccess() != null && !objLoLog.getLastAccess().equals("")){
			htbData.put( LAST_ACCESS, objLoLog.getLastAccess() );
		}
		if(objLoLog.getHighScore() != null && !objLoLog.getHighScore().equals("")){
			htbData.put( HIGHTSCORE, objLoLog.getHighScore() );
		}
		if(objLoLog.getLowScore() != null && !objLoLog.getLowScore().equals("")){
			htbData.put( LOWSSCORE, objLoLog.getLowScore() );
		}
		if(objLoLog.getExecisePoint() != null && !objLoLog.getExecisePoint().equals("")){
			htbData.put( EXECISE_POINT, objLoLog.getExecisePoint() );
		}
		htbData.put( USERID, objLoLog.getUserID() );
		htbData.put( LOID, objLoLog.getLoID() );

		// 登録用SQLを生成します
		String strSQL = objDataAccess.getInsertSQL( htbData, TABLE_NAME_LOLOG );

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



}
