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

//
//	LO SmartForce教材 サーバクラス
//			変更履歴
//				2004.01.08	新規作成	五木田　泰史
//
package jp.co.ntt.lms.lo.SmartForce;

import java.util.*;
import java.io.*;
import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;
import jp.co.ntt.lms.lo.*;
import jp.co.ntt.lms.xmo.util.*;

public class SmartForceLoEnv extends LoEnvironment
{
	private static final String mstrFileName = "/conf/lo/SmartForce.ini";
	/** プロパティファイルを保持します */
	private static Properties objProperty = null;
	// プロパティ定義
	/** 教材ウィンドウオープンURL */
	private static final String OPEN_URL      = "open_url";
	/** 教材リストフォルダパス */
	private static final String MATERIAL_PATH = "material_path";
	/** 教材URL */
	private static final String MATERIAL_URL  = "material_url";
	/** プロキシサーバURL */
	private static final String PROXY_URL     = "proxy_url";
	/** WolfサーバURL */
	private static final String WOLF_SERVER   = "wolf_server";
	/** Wolfサーバポート番号 */
	private static final String WOLF_PORT     = "wolf_port";
	/** CBT教材URL */
	private static final String CBT_LIB       = "cbt_lib";
	/** 教材パラメータ */
	private static final String MATERIAL_QUR  = "material_qur";
	/** 教材起動URLとパラメータ */
	private static final String LAUNCH_URL    = "launch_url";
	/** DBコネクションプール数 */
	private static final String POOL_COUNT    = "pool_count";
	/** DBHost名称 */
	private static final String DB_HOST       = "db_host";
	/** DBPort番号 */
	private static final String DB_PORT       = "db_port";
	/** データベース名 */
	private static final String DB_NAME       = "db_name";
	/** データベースユーザ名 */
	private static final String DB_USER       = "db_user";
	/** データベースパスワード */
	private static final String DB_PASS       = "db_pass";
	/** DB切替え種別(MS SQLServer or Oracle) */
	private static final String DB_SERVER = "db_server";
	/** JDBCドライバー名称 */
	private static final String DB_DRIVER     = "db_driver";
	/** 接続文字列 */
	private static final String DB_CON_STR    = "db_con_str";
	/** 個別ログ取得サーブレットURL */
	public static final String LOGSERVLET_URL = "logservlet_url";
	/** 登録メニューURLパス */
	public static final String INSERT_MENU_URL = "insert_menu_url";
	/** 更新メニューURLパス */
	public static final String UPDATE_MENU_URL = "update_menu_url";
	/** 削除メニューURLパス */
	public static final String DELETE_MENU_URL = "delete_menu_url";
	
	/**
	 * コンストラクタです
	 *
	 */
	public SmartForceLoEnv()
		throws LOException
	{
		super();
		// クラス単位の排他処理を行う。
		synchronized( this.getClass() ) {
			//	環境情報の初期化が行われていない時のみ
			//	環境ファイルを読み込む
			if( objProperty == null ) {
				objProperty = loadProperty(mstrFileName);
			}
		}
	}

	/**
	 * DBコネクションプール数を取得します
	 *
	 * @return String DBコネクションプール数
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getPoolCount()
		throws LOException
	{
		return getProperty( POOL_COUNT, objProperty );
	}

	/**
	 * DBHost名称を取得します
	 *
	 * @return String DBHost名称
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getDBHost()
		throws LOException
	{
		return getProperty( DB_HOST, objProperty );
	}

	/**
	 * DBPort番号を取得します
	 *
	 * @return String DBPort番号
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getDBPort()
		throws LOException
	{
		return getProperty( DB_PORT, objProperty );
	}

	/**
	 * データベース名を取得します
	 *
	 * @return String データベース名
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getDBName()
		throws LOException
	{
		return getProperty( DB_NAME, objProperty );
	}

	/**
	 * データベースユーザ名を取得します
	 *
	 * @return String データベースユーザ名
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getDBUser()
		throws LOException
	{
		return getProperty( DB_USER, objProperty );
	}

	/**
	 * データベースパスワードを取得します
	 *
	 * @return String データベースパスワード
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getDBPass()
		throws LOException
	{
		return getProperty( DB_PASS, objProperty );
	}
	
	/**	
	 * DB種別の取得を行います	
 	 * @return String DB種別( MS SQLServer：0、Oracle：1)	
 	 */	
	public String getDBType()	
		throws Exception
	{	
		return getProperty( DB_SERVER , objProperty );
	}	

	/**
	 * JDBCドライバー名称を取得します
	 *
	 * @return String JDBCドライバー名称
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getDBDriver()
		throws LOException
	{
		return getProperty( DB_DRIVER, objProperty );
	}

	/**
	 * データベース接続文字列を取得します<BR>
	 * 設定ファイル上の'$'で囲まれた文字列を適切な値に
	 * 変換して返します
	 * @return String 接続文字列
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getDBConStr()
		throws LOException
	{
		// DBホスト名を取得します
		String strDBHost = getDBHost();
		// DBポート名を取得します
		String strDBPort = getDBPort();
		// DB名を取得します
		String strDBName = getDBName();

		// マクロ展開用にHastableにキーと値を入れます。
		Hashtable htMacro = new Hashtable();
		htMacro.put( DB_HOST, strDBHost );
		htMacro.put( DB_PORT, strDBPort );
		htMacro.put( DB_NAME, strDBName );

		// 接続文字列を取得します
		String strConStr = getProperty( DB_CON_STR, objProperty );

		// マクロ展開
		strConStr = expand( strConStr, htMacro );
		return strConStr;
	}
	
	/**
	 * 教材格納フォルダを取得します
	 *
	 * @return String 教材格納フォルダ
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getMaterialPath()
		throws LOException
	{
		return getProperty( MATERIAL_PATH, objProperty );
	}
	
	/**
	 * 教材URLを取得します
	 *
	 * @return String 教材URL
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getMaterialURL()
		throws LOException
	{
		return getProperty( MATERIAL_URL, objProperty );
	}
	
	/**
	 * プロキシサーバURLを取得します
	 *
	 * @return String プロキシサーバURL
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getProxyURL()
		throws LOException
	{
		return getProperty( PROXY_URL, objProperty );
	}
	
	/**
	 * WolfサーバURLを取得します
	 * <PRE>
	 *   設定ファイル上の'$'で囲まれた文字列を適切な値に
	 *   変換して返します
	 * <PRE>
	 *
	 * @return String WolfサーバURL
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getWolfServer()
		throws LOException
	{
		// 教材URLを取得します
		String strMaterialURL = getMaterialURL();
		
		// マクロ展開用にHastableにキーと値を入れます。
		Hashtable htMacro = new Hashtable();
		htMacro.put( MATERIAL_URL, strMaterialURL );
		
		// WolfサーバURLを取得します
		String strWolfServer = getProperty( WOLF_SERVER, objProperty );
		
		// マクロ展開
		strWolfServer = expand( strWolfServer, htMacro );
		return strWolfServer;
	}
	
	/**
	 * Wolfサーバポート番号を取得します
	 *
	 * @return String Wolfサーバポート番号
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getWolfPort()
		throws LOException
	{
		return getProperty( WOLF_PORT, objProperty );
	}
	
	/**
	 * CBT教材URLを取得します
	 * <PRE>
	 *   設定ファイル上の'$'で囲まれた文字列を適切な値に
	 *   変換して返します
	 * <PRE>
	 *
	 * @return String CBT教材URL
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getCbtLib()
		throws LOException
	{
		// 教材URLを取得します
		String strMaterialURL = getMaterialURL();
		
		// マクロ展開用にHastableにキーと値を入れます。
		Hashtable htMacro = new Hashtable();
		htMacro.put( MATERIAL_URL, strMaterialURL );
		
		// WolfサーバURLを取得します
		String strCbtLib = getProperty( CBT_LIB, objProperty );
		
		// マクロ展開
		strCbtLib = expand( strCbtLib, htMacro );
		return strCbtLib;
	}
	
	/**
	 * 教材起動パラメータを取得します
	 * <PRE>
	 *   設定ファイル上の'$'で囲まれた文字列を適切な値に
	 *   変換して返します
	 * <PRE>
	 *
	 * @param Hashtable マクロ情報
	 * @return String 教材起動パラメータ
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getMaterialParam(Hashtable htMacro)
		throws LOException, UnsupportedEncodingException
	{
		// プロキシURLを取得します
		String strProxyURL   = getProxyURL();
		// WolfサーバURLを取得します
		String strWolfServer = getWolfServer();
		// Wolfサーバポート番号を取得します
		String strWolfPort   = getWolfPort();
		// CBT教材URLを取得します
		String strCbtLib     = getCbtLib();
		// CBT教材起動URLを取得します
		String strLaunchURL  = getLaunchURL(htMacro);
		
		if(strProxyURL == null)
		{
			strProxyURL = "";
		}
		if(strWolfServer == null)
		{
			strWolfServer = "";
		}
		if(strCbtLib == null)
		{
			strCbtLib = "";
		}
		if(strLaunchURL == null)
		{
			strLaunchURL = "";
		}
		try{

		// マクロ展開用にHastableにキーと値を入れます。
			htMacro.put( PROXY_URL, URLEncoder.encode(strProxyURL, "UTF-8") );
			htMacro.put( WOLF_SERVER, URLEncoder.encode(strWolfServer, "UTF-8") );
			htMacro.put( WOLF_PORT, strWolfPort );
			htMacro.put( CBT_LIB, URLEncoder.encode(strCbtLib, "UTF-8") );
			htMacro.put( LAUNCH_URL, URLEncoder.encode(strLaunchURL, "UTF-8") );
		} catch(UnsupportedEncodingException e) {
			throw e;	
		}	
		// 教材起動パラメータを取得します
		String strMaterialParam = getProperty( MATERIAL_QUR, objProperty );
		
		// マクロ展開
		strMaterialParam = expand( strMaterialParam, htMacro );
		return strMaterialParam;
	}
	
	/**
	 * 教材起動URLを取得します
	 * <PRE>
	 *   設定ファイル上の'$'で囲まれた文字列を適切な値に
	 *   変換して返します
	 * <PRE>
	 *
	 * @param Hashtable マクロ情報
	 * @return String 教材起動URL
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getLaunchURL(Hashtable htbParam)
		throws LOException
	{
		// 教材URLを取得します
		String strMaterialURL   = getMaterialURL();
		
		// マクロ展開用にHastableにキーと値を入れます。
		htbParam.put( MATERIAL_URL, strMaterialURL );
		
		// 教材起動URLを取得します
		String strLaunchURL = getProperty( LAUNCH_URL, objProperty );
		
		// マクロ展開
		strLaunchURL = expand( strLaunchURL, htbParam );
		return strLaunchURL;
	}
	
	/**
	 * 教材ウィンドウオープンURLを取得します
	 * <PRE>
	 *   設定ファイル上の'$'で囲まれた文字列を適切な値に
	 *   変換して返します
	 * <PRE>
	 *
	 * @param Hashtable マクロ情報
	 * @return String 教材ウィンドウオープンURL
	 * @exception LOException Lo固有の例外エラー
	 */
	public String getOpenURL(Hashtable htbParam)
		throws LOException, UnsupportedEncodingException
	{
		try
		{
			// 教材起動パラメータを取得します
			String strMaterialParam = getMaterialParam(htbParam);
			
			// マクロ展開用にHastableにキーと値を入れます。
			htbParam.put( mobjEnv.SYSTEM_URL, mobjEnv.getSystemURL() );
			htbParam.put( MATERIAL_QUR, strMaterialParam );
			
			// 教材ウィンドウオープンURLを取得します
			String strOpenURL = getProperty( OPEN_URL, objProperty );
			
			// マクロ展開
			strOpenURL = expand( strOpenURL, htbParam );
			return strOpenURL;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			throw new LOException(e.getMessage());
		}
	}
	
	/**
	 * スマートフォースLo登録メニューURLを取得します
	 *
	 * @return String 登録メニューURL
	 * @exception LOException LO固有の例外エラー
	 */
	public String getInsertMenuURL()
		throws LOException
	{
		try
		{
			return getProperty(INSERT_MENU_URL, objProperty);
		}
		catch(Exception e)
		{
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			throw new LOException(e.getMessage());
		}
	}
	
	/**
	 * スマートフォースLo更新メニューURLを取得します
	 *
	 * @return String 更新メニューURL
	 * @exception LOException LO固有の例外エラー
	 */
	public String getUpdateMenuURL()
		throws LOException
	{
		try
		{
			return getProperty(UPDATE_MENU_URL, objProperty);
		}
		catch(Exception e)
		{
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			throw new LOException(e.getMessage());
		}
	}
	
	/**
	 * スマートフォースLo削除メニューURLを取得します
	 *
	 * @return String 削除メニューURL
	 * @exception LOException LO固有の例外エラー
	 */
	public String getDeleteMenuURL()
		throws LOException
	{
		try
		{
			return getProperty(DELETE_MENU_URL, objProperty);
		}
		catch(Exception e)
		{
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			throw new LOException(e.getMessage());
		}
	}
	
	/**
	 * 評価ウィンドウオープンフラグを取得します
	 *
	 * @return String 評価ウィンドウオープンフラグ
	 */
	public String getEstimation()
		throws LOException
	{
		return getProperty(ESTIMATION, objProperty);
	}
	/**
	 * ログ取得サーブレットURLを取得します
	 *
	 * @return String ログ取得サーブレットURL
	 */
	public String getLogServletURL()
		throws LOException
	{
		try
		{
			String strLogServletURL = getProperty(LOGSERVLET_URL, objProperty);
			Hashtable htbMacro = new Hashtable();
			htbMacro.put(mobjEnv.SYSTEM_URL, mobjEnv.getSystemURL());
			strLogServletURL = expand( strLogServletURL, htbMacro );
			return strLogServletURL;
		}
		catch(Exception e)
		{
			throw new LOException(e.getMessage());
		}
	}

}
