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

//
//	メッセージ 管理XMO サーバクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo.Message;

// java API
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
import java.util.*;
import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;
// XMO
import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 * メッセージ 管理XMO サーバクラスです。<BR>
 * メッセージIDを受け取り、プロパティファイルからメッセージを読み込みます。<BR>
 * また、受け取ったメッセージがエラーまたは警告の種別であった場合、そのメッセージを
 * 表示する画面のURLを作成します。<BR>
 * RMIサーバとして動作するためRemoteインタフェースであるXMOインタフェースを実装し、
 * 永続的な起動状態を確保するためjava.rmi.server.UnicastRemoteObjectクラスを継承します。
 * @author T.Nijou
 * @version 0.0.0.1 2004.01.08
 */
public class Message extends UnicastRemoteObject implements XMO {

	//////////////////////////////////////////////////////////////////
	// メソッド名定義
	//////////////////////////////////////////////////////////////////
	/** メッセージオブジェクトの取得メソッド名です */
	private static final String METHOD1 = "getMessageData";

	/**
	 * メッセージ読み込みクラスを保持します
	 */
	private MessageProperties objMessageProperties = null;

	/**
	 * 自身のインスタンスを保持します
	 */
	private static Message mobjMessage = null;

	/**
	 * コンストラクタです。
	 */
	public Message() throws RemoteException {
		// リモートオブジェクトをエクスポートする
		// java.rmi.server.UnicastRemoteObject の
		// 引数なしのコンストラクタを呼び出す
		super();
		try {
			// メッセージファイルをロードします
			objMessageProperties = new MessageProperties();
			// 自身のインスタンスを保持します
			mobjMessage = this;
		}
		catch( Exception e ) {
			e.printStackTrace();
		}

	}

	/**
	 * 自身のインスタンスを返します
	 * @return Message 自身のインスタンス
	 */
	public static Message getInstance() {
		if( mobjMessage == null ) {
			try {
				mobjMessage = new Message();
			}
			catch( RemoteException e ) {
				// 特に何もしない
			}
		}
		return mobjMessage;
	}

	/**
	 * メニュー一覧を返します
	 * @return Vector メニュー一覧
	 */
	public Vector getMenuList(Hashtable htbParam) {
		Vector vecMenuList = new Vector();
		return vecMenuList;
	}

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

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

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

		Object objReturn = null;

		if( strMethodName.equals( METHOD1 ) ) {
			objReturn = getMessageData( htData );
		}

		return objReturn;
	}

	/**
	 * 起動確認（必ずtrueを返す）
	 * @return boolean 必ずtrueが返ります
	 */
	public boolean isLaunch() {
		return true;
	}

	/**
	 * 以下の情報を受け取り、メッセージファイルからメッセージを読み込んで、
	 * MessageDataクラスに格納して返します。
	 * エラーおよび警告タイプのメッセージの場合はメッセージ表示画面へのURL
	 * も作成します。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------------
	 *             messageid               メッセージID
	 *             filepath                メッセージファイルパス
	 *             filename                メッセージファイル名
	 *          ---------------------------------------------------
	 * </PRE>
	 * @param htData メッセージ情報
	 * @return MessageData メッセージ情報
	 */
	private MessageData getMessageData( Hashtable htData )
	{
		
			MessageData objMessage = new MessageData();
	    try{
			String strMessageID = (String)htData.get( "messageid" );
			String strFilePath = (String)htData.get( "filepath" );
			String strFileName = (String)htData.get( "filename" );
			// メッセージIDを設定
			objMessage.setMessageID( strMessageID );
	DebugLog.write( this.getClass(), "メッセージID: " + strMessageID, DebugLog.ROW );
	
			// メッセージを取得する
			String strMessage = getMessage( strMessageID, strFilePath, strFileName );
			objMessage.setMessage( strMessage );
	DebugLog.write( this.getClass(), "メッセージ取得: " + strMessage, DebugLog.ROW );
			// メッセージタイプの取得
			String strMessageType = strMessageID.substring(2,3);
			objMessage.setMessageType( strMessageType );
	DebugLog.write( this.getClass(), "メッセージタイプ: " + strMessageType, DebugLog.ROW );
	
			// URLの作成
			String strURL = getURL( strMessageID, strMessage, strMessageType );
			objMessage.setURL( strURL );
			
			
	DebugLog.write( this.getClass(), "URL: " + java.net.URLDecoder.decode(strURL, "UTF-8" ), DebugLog.ROW );
				
		} catch(UnsupportedEncodingException e) {}
		return objMessage;
		
	}

	/**
	 * 以下の情報を受け取り、メッセージファイルからメッセージを読み込んで、
	 * MessageDataクラスに格納して返します。
	 * エラーおよび警告タイプのメッセージの場合はメッセージ表示画面へのURL
	 * も作成します。
	 * @param strMessageID メッセージID
	 * @param strFilePath ファイルパス
	 * @param strFileName ファイル名
	 */
	public MessageData getMessageData( String strMessageID, String strFilePath, String strFileName )
		throws UnsupportedEncodingException
	{

		MessageData objMessage = new MessageData();

		// メッセージIDを設定
		objMessage.setMessageID( strMessageID );

		// メッセージを取得する
		String strMessage = getMessage( strMessageID, strFilePath, strFileName );
		objMessage.setMessage( strMessage );
DebugLog.write( this.getClass(), "メッセージ取得: " + strMessage, DebugLog.ROW );

		// メッセージタイプの取得
		String strMessageType = strMessageID.substring(2,3);
		objMessage.setMessageType( strMessageType );

		// URLの作成
		String strURL = getURL( strMessageID, strMessage, strMessageType );
		objMessage.setURL( strURL );

		return objMessage;

	}

	/**
	 * システムエラーメッセージオブジェクトを作成します
	 * @return MessageData システムエラーメッセージオブジェクト
	 */
	public MessageData getSystemErrMessage()
		throws UnsupportedEncodingException
	{

		MessageData objMessage = new MessageData();

		// エラータイプを設定
		objMessage.setMessageType( MessageData.ERR_TYPE );
		// メッセージの設定
		objMessage.setMessage( "システムエラーが発生しました。" );
		// URLの設定
		objMessage.setURL( getURL( "", "システムエラーが発生しました。", MessageData.ERR_TYPE ) );

		return objMessage;
	}

	/**
	 * メッセージ定義ファイルよりメッセージを取得します
	 * @param strMessageID メッセージID
	 * @param strFilePath メッセージファイルパス
	 * @param strFileName メッセージファイル名
	 * @return String メッセージ
	 */
	private String getMessage( String strMessageID, String strFilePath, String strFileName ) {
		String strMessage = "";
		if( objMessageProperties != null ) {
			try {
				strMessage = objMessageProperties.getMessage( strMessageID, strFilePath, strFileName );
			}
			catch( Exception e ) {
				strMessage = e.getMessage();
			}
		}
		return strMessage;
	}

	/**
	 * エラーおよび警告時に表示するURLを作成します
	 * @param strMessageID メッセージID
	 * @param strFilePath メッセージ
	 * @param strFileName メッセージタイプ
	 * @return String URL
	 */
	private String getURL( String strMessageID, String strMessage, String strMessageType )
		throws UnsupportedEncodingException
	{
		String strURL = "";
		String strSystemURL = "";
		// 環境ファイルロードクラスインスタンス化
		try {
			Environment objEnv = new Environment();
			strSystemURL = objEnv.getSystemURL();
		}
		catch(Exception e) {
			strSystemURL = "/xms2/";
		}
		try{
			// 情報の場合
			if( strMessageType.equals( MessageData.INFO_TYPE ) ) {
				return "";
			}
			// エラーの場合
			else if( strMessageType.equals( MessageData.ERR_TYPE ) ) {
				strURL = strSystemURL + "/view/xmo/Message/Messageerror.vm?message=" + URLEncoder.encode( strMessage, "UTF-8") + "&messageid=" + strMessageID;
			}
			// 警告の場合
			else if( strMessageType.equals( MessageData.WAR_TYPE ) ) {
				strURL = strSystemURL + "/view/xmo/Message/Messagewarning.vm?message=" + URLEncoder.encode( strMessage, "UTF-8") + "&messageid=" + strMessageID;
			}
		} catch(UnsupportedEncodingException e) {
			throw e;	
		}
		return strURL;
	}
}

