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

//
//	Offline教材 個別ログ(CSV)のSQL作成クラスです。
//			変更履歴
//				2004.01.08	新規作成	滝島　英幸


package jp.co.ntt.lms.lo.Offline;

import jp.co.ntt.lms.lo.*;
import java.util.*;
import java.text.*;

import org.apache.commons.lang.StringEscapeUtils;

/**
 * 	OfflineLO個別ログ(CSV)のSQLを動的に作成します。<BR>
 * 	@author H.Takishima
 * 	@version 2.0.4.0.0 2004/01/08
 */
public class OfflineLoLogSQLMaker {

	// エラー文言の定義
	private static final String ERR_00 = "検索条件に誤りがあります。";

	// 内部変数
	private String mstrQueryID;				/** クエリーIDを保持します */
	private String mstrQuery;				/** クエリーを保持します */
	private String mstrUserID[];			/** ユーザID配列を保持します */
	private String mstrUID[];				/** UID配列を保持します */

	// 定数
	/** SQL置換文字列です。*/
	private static final String USER_LIST = "USER_LIST";
	private static final String UID_LIST = "UID_LIST";

	/**
	 * コンストラクタです。<BR>
	 * クエリーIDと対応するマクロ展開前のSQL文と検索条件Vectorを設定します
	 * @param strQueryID　クエリーID
	 * @param strQuery マクロ展開前のクエリー
	 * @param vecCondition 検索条件
	 */
	public OfflineLoLogSQLMaker(String strQueryID, String strQuery, String[] strUserID, String[] strUID ) {

		// 内部変数に設定します
		mstrQueryID 	= strQueryID;
		mstrQuery 		= strQuery;
		mstrUserID 		= strUserID;
		mstrUID 		= strUID;
	}

	/**
	 * SQL文を作成します。
	 * @return String SQL
	 */
	public String makeQuery()
		throws LOException
	{
		StringBuffer sbUserList = new StringBuffer( "'"+StringEscapeUtils.escapeSql(mstrUserID[0])+"'" );
		StringBuffer sbUIDList = new StringBuffer( "'"+StringEscapeUtils.escapeSql(mstrUID[0])+"'" );
		for( int i = 1; i < mstrUserID.length; i++ ) {
			sbUserList.append( ",'" );
			sbUserList.append( StringEscapeUtils.escapeSql(mstrUserID[i]) );
			sbUserList.append( "'" );
		}

		for( int i = 1; i < mstrUID.length; i++ ) {
			sbUIDList.append( ",'" );
			sbUIDList.append( StringEscapeUtils.escapeSql(mstrUID[i]) );
			sbUIDList.append( "'" );
		}
		// コンストラクタで受け取った文字列をマクロ展開します
		Hashtable htbMacro = new Hashtable();
		htbMacro.put( USER_LIST, sbUserList.toString() );
		htbMacro.put( UID_LIST, sbUIDList.toString() );

		return expand( mstrQuery, htbMacro );
	}

	/**
	 * 文字列をマクロ展開します<BR>
	 * '$'で囲まれた文字列を取得し、引数で渡されたHashtableから
	 * 取得した文字列をキーにして、値を取得し、入れ替えて返します。
	 * @param strBase 変換前
	 * @param htbTable マクロ情報
	 * @return String 変換後文字列
	 */
	private String expand(String strBase , Hashtable htbTable ) {
		// 返還前文字列をchar配列に変換します
		char[] chrBase = strBase.toCharArray();

		// 変換後の文字列を格納します
		StringBuffer sbBase = new StringBuffer();
		// '$'で囲まれてた文字列を格納します
		StringBuffer sbMacro = new StringBuffer();
		// マクロ文字列読み取り中か、普通の文字列読み取り中かを判断する
		boolean blMacro = false;
		// charの配列文ループします
		for( int i = 0; i < chrBase.length; i++ ) {
			// '$'の部分はマクロ文字列として格納します
			if( chrBase[i] == '$' ) {
				if( blMacro ) {
					blMacro = false;
					// マクロ文字列をキーにして、値を入れる
					String strMacro = (String)htbTable.get( sbMacro.toString() );
					// 取得した文字列がnull以外なら、設定
					if( strMacro != null ) {
						sbBase.append( (String)htbTable.get( sbMacro.toString() ) );
					}
					// マクロ文字列を初期化します
					sbMacro = new StringBuffer();
				}
				else {
					blMacro = true;
				}
				continue;
			}

			// マクロ読み取り中の場合
			if( blMacro ) {
				sbMacro.append( chrBase[i] );
			}
			// 普通の文字列読み取り中
			else {
				sbBase.append( chrBase[i] );
			}
		}
		return sbBase.toString();
	}
}
