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

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Vector;

import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.MenuData;
import jp.co.ntt.lms.xmo.XMOClient;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsEnv;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;

/**
 * メール送信 XMO クライアントクラスです。<BR>
 * このクラスはメール送信 XMO サーバクラスとの接続を行います。
 */
public class MailClient extends XMOClient {

	/** メソッド名定義 */
	private static final String METHOD1 = "sendMail";

	private static final String METHOD_GETTEMPLIST = "getTemplateList";

	private static final String METHOD_GETTEMPINFO = "getTemplateInfo";

	private static final String METHOD_GETKEYLIST = "getKeywordList";

	private static final String METHOD_SENDMAIL = "sendCustomizeMail";

	private static final String METHOD_GETTEMPDIRPATH = "getTemplateDirectoryPath";

	/** 接続先サーバクラス名です */
	private static final String CLASS_NAME = "jp.co.ntt.lms.xmo.Mail.Mail";

	/** 送信結果Vector */
	private Vector mvtResult = null;

	/** テンプレート一覧結果Vector */
	private Vector mvcTemplateListResult = null;

	/** テンプレート結果Vector */
	private Vector mvcTemplateResult = null;

	/** 置換キーワード結果Vector */
	private Vector mvcKeywordListResult = null;

	/**
	 * コンストラクタ<BR>
	 * @exception Exception RMI接続に失敗した場合
	 */
	public MailClient() throws Exception {
		super( CLASS_NAME );
	}

	/**
	 * XMOの基本メソッド<BR>
	 * メニューのリストを返します
	 * @return Vector メニューリスト
	 * @exception Exception RMI接続に失敗した場合
	 */
	public Vector getMenuList(Hashtable htbParam)
		throws Exception
	{
		return super.getMenuList(htbParam);
	}

	/**
	 * XMOの基本メソッド<BR>
	 * メソッドのリストを返します
	 * @return Vector メニューリスト
	 * @exception Exception RMI接続に失敗した場合
	 */
	public Vector getMethodList()
		throws Exception
	{
		return super.getMethodList();
	}

	/**
	 * XMOの基本メソッド<BR>
	 * デフォルトのメニューを返します
	 * @return String デフォルトメニューURL
	 * @exception Exception RMI接続に失敗した場合
	 */
	public MenuData getDefaultMenu()
		throws Exception
	{
		return super.getDefaultMenu();
	}

	/**
	 * XMOの基本メソッド<BR>
	 * リモートメソッド起動メソッドです。
	 * @param strMethodName 起動するメソッド名
	 * @param objData パラメータ
	 * @exception Exception RMI接続に失敗した場合
	 */
	public Object execute( String strMethodName, Hashtable objData )
		throws Exception
	{
		return super.execute( strMethodName, objData );
	}

	/**
	 * 送信処理メソッドを実行します。<BR>
	 * ユーザID、テンプレートファイルパス以外は省略可能です。
	 * 省略時はnullを設定してください。
	 * @param strUserIds メール送信ユーザID群
 	 * @param strTeacherId 管理者 or 先生のユーザID
	 * @param strLoginUrl  ログインURL
	 * @param strTmaterial 教材名
	 * @param strTmaterialUrl 教材URL
	 * @param strTemplatePath テンプレートファイルフルパス
	 * @return int 戻り値<BR>
	 *	MailConst.RESULT_SUCCESS：正常<BR>
 	 *	MailConst.RESULT_NOUSER_ERR：ユーザ情報取得エラー<BR>
	 *	MailConst.RESULT_SGREAD_ERR：環境設定ファイル読み込みエラー<BR>
	 *	MailConst.RESULT_SGCONV_ERR：環境設定ファイル置換エラー<BR>
	 *	MailConst.RESULT_TEMPREAD_ERR：テンプレートファイル読み込みエラー<BR>
	 *	MailConst.RESULT_CONNECT_ERR：SMTPサーバコネクトエラー<BR>
	 *	MailConst.RESULT_INTERNAL_ERR：内部矛盾発生<BR>
	 * @exception Exception RMI接続に失敗した場合
	 */
	public int sendMail( String[] strUserIds,
							 String strTeacherId,
							 String strLoginUrl,
							 String strTmaterial,
							 String strTmaterialUrl,
							 String strTemplatePath ) throws Exception
	{
		return sendMail( strUserIds, strTeacherId, strLoginUrl, strTmaterial, strTmaterialUrl, null, strTemplatePath );
	}
	
	/**
	 * 送信処理メソッドを実行します。<BR>
	 * ユーザID、テンプレートファイルパス以外は省略可能です。
	 * 省略時はnullを設定してください。
	 * @param strUserIds メール送信ユーザID群
 	 * @param strTeacherId 管理者 or 先生のユーザID
	 * @param strLoginUrl  ログインURL
	 * @param strTmaterial 教材名
	 * @param strTmaterialUrl 教材URL
	 * @param strCatalogTitle カタログタイトル
	 * @param strTemplatePath テンプレートファイルフルパス
	 * @return int 戻り値<BR>
	 *	MailConst.RESULT_SUCCESS：正常<BR>
 	 *	MailConst.RESULT_NOUSER_ERR：ユーザ情報取得エラー<BR>
	 *	MailConst.RESULT_SGREAD_ERR：環境設定ファイル読み込みエラー<BR>
	 *	MailConst.RESULT_SGCONV_ERR：環境設定ファイル置換エラー<BR>
	 *	MailConst.RESULT_TEMPREAD_ERR：テンプレートファイル読み込みエラー<BR>
	 *	MailConst.RESULT_CONNECT_ERR：SMTPサーバコネクトエラー<BR>
	 *	MailConst.RESULT_INTERNAL_ERR：内部矛盾発生<BR>
	 * @exception Exception RMI接続に失敗した場合
	 */
	public int sendMail( String[] strUserIds,
							 String strTeacherId,
							 String strLoginUrl,
							 String strTmaterial,
							 String strTmaterialUrl,
							 String strCatalogTitle,
							 String strTemplatePath ) throws Exception
	{
		if ( strUserIds == null || strTemplatePath == null ){
			return MailConst.RESULT_INTERNAL_ERR;
		}

		/* 管理者 or 先生のユーザ情報取得 */
		PeopleClient objTeacherPc = null ;

		if ( strTeacherId != null ){
			objTeacherPc = getUserInfo( strTeacherId );
			// 入力されたIDのユーザ情報取得エラー。
			if ( objTeacherPc == null ){
				return MailConst.RESULT_NOUSER_ERR;
			}
		}


		/* メール送信用パラメータテーブルを作成します */
		int sendCnt = strUserIds.length;
		Hashtable[]	htMailInfos = new Hashtable[sendCnt];


		for ( int i=0; i < sendCnt; i++ ){
			htMailInfos[i] = setMailInfo(strUserIds[i], objTeacherPc, strLoginUrl,
											strTmaterial, strCatalogTitle, strTmaterialUrl );
			if ( htMailInfos[i] == null ){
				/* 存在しないユーザが指定された場合、配列の数が合わなくなるため
				エラーを返却します */
				return MailConst.RESULT_NOUSER_ERR;
			}
		}
		Hashtable htParam = new Hashtable();
		htParam.put( MailConst.MAILINFOS, htMailInfos );
		htParam.put( MailConst.TEMPLATE_PATH, strTemplatePath );


		/* メール送信処理実行 */
		mvtResult = (Vector)execute( METHOD1, htParam );
		if ( mvtResult == null || mvtResult.size() == 0 ){
			return MailConst.RESULT_INTERNAL_ERR;
		}
		else{
			Object objOut = mvtResult.get(0);
			if( objOut instanceof Hashtable[]  ) {
				//　Hashtableの場合は正常終了（SMTP通信は出来た）
				return MailConst.RESULT_SUCCESS;
			}
			else if ( objOut instanceof Integer ){
				//　Integerの場合、送信自体が失敗
					Integer iResult = (Integer)objOut;
					return iResult.intValue();
			}
			else{
				return MailConst.RESULT_INTERNAL_ERR;
			}
		}
	}
	
	/**
	 * 送信処理メソッドを実行します。<BR>
	 * ユーザID、テンプレートファイルパス以外は省略可能です。
	 * 省略時はnullを設定してください。
	 * @param strUserIds メール送信ユーザID群
 	 * @param strTeacherId 管理者 or 先生のユーザID
	 * @param strLoginUrl  ログインURL
	 * @param strTmaterial 教材名
	 * @param strTmaterialUrl 教材URL
	 * @param strCatalogTitle カタログタイトル
	 * @param strTemplatePath テンプレートファイルフルパス
	 * @return int 戻り値<BR>
	 *	MailConst.RESULT_SUCCESS：正常<BR>
 	 *	MailConst.RESULT_NOUSER_ERR：ユーザ情報取得エラー<BR>
	 *	MailConst.RESULT_SGREAD_ERR：環境設定ファイル読み込みエラー<BR>
	 *	MailConst.RESULT_SGCONV_ERR：環境設定ファイル置換エラー<BR>
	 *	MailConst.RESULT_TEMPREAD_ERR：テンプレートファイル読み込みエラー<BR>
	 *	MailConst.RESULT_CONNECT_ERR：SMTPサーバコネクトエラー<BR>
	 *	MailConst.RESULT_INTERNAL_ERR：内部矛盾発生<BR>
	 * @exception Exception RMI接続に失敗した場合
	 */
	public int sendMail(String[] aryToAddresses, String strFromAddress, String strTemplatePath, Hashtable htKeywords)
		throws Exception
	{
		if (aryToAddresses == null || strFromAddress == null || strTemplatePath == null)
		{
			return MailConst.RESULT_INTERNAL_ERR;
		}

		/* メール送信用パラメータテーブルを作成します */
		int nCount = aryToAddresses.length;
		Hashtable[]	htMailInfos = new Hashtable[nCount];


		for (int i = 0; i < nCount; i++)
		{
			htMailInfos[i] = setMailInfo(aryToAddresses[i], strFromAddress);
		}
		Hashtable htParam = new Hashtable();
		// メール情報
		htParam.put(MailConst.MAILINFOS, htMailInfos);
		// テンプレートパス
		htParam.put(MailConst.TEMPLATE_PATH, strTemplatePath);
		// キーワード
		htParam.put(MailConst.KEYWORDS, htKeywords);

		/* メール送信処理実行 */
		mvtResult = (Vector)execute(METHOD1, htParam);
		if (mvtResult == null || mvtResult.size() == 0)
		{
			return MailConst.RESULT_INTERNAL_ERR;
		}
		else
		{
			Object objOut = mvtResult.get(0);
			if (objOut instanceof Hashtable[])
			{
				//　Hashtableの場合は正常終了（SMTP通信は出来た）
				return MailConst.RESULT_SUCCESS;
			}
			else if (objOut instanceof Integer)
			{
				//　Integerの場合、送信自体が失敗
				Integer iResult = (Integer)objOut;
				return iResult.intValue();
			}
			else
			{
				return MailConst.RESULT_INTERNAL_ERR;
			}
		}
	}
	/**
	 * パスワード通知メール送信処理<BR>
	 * 入力されたユーザIDのユーザにメールを一通送信します。
	 * @param strUserId メール送信ユーザID
	 * @param strLoginUrl システムログインURL
	 * @param strTemplatePath テンプレートファイルフルパス
	 * @return int 戻り値
	 * @exception Exception RMI接続に失敗した場合
	 */
	public int sendMail( String strUserId,
						 String strLoginUrl,
						 String strTemplatePath ) throws Exception
	{
		String[] to = { strUserId };
		return this.sendMail( to, null, strLoginUrl, null, null, strTemplatePath );
	}

	/**
	 * カタログLOの承認依頼メールを送信します
	 * @param strTeacherIDs 承認依頼メールの送信先管理者ID
	 * @param strUserID 承認依頼メールを送信する学習者ID
	 * @param strTmaterial 承認してもらいたい教材名
	 * @param strCatalogTitle カタログ名
	 * @param strAssignOKURL 承認URL
	 * @param strAssignNGURL 否認URL
	 * @param strTemplatePath テンプレートファイルフルパス
	 * @return int 戻り値<BR>
	 *	MailConst.RESULT_SUCCESS：正常<BR>
 	 *	MailConst.RESULT_NOUSER_ERR：ユーザ情報取得エラー<BR>
	 *	MailConst.RESULT_SGREAD_ERR：環境設定ファイル読み込みエラー<BR>
	 *	MailConst.RESULT_SGCONV_ERR：環境設定ファイル置換エラー<BR>
	 *	MailConst.RESULT_TEMPREAD_ERR：テンプレートファイル読み込みエラー<BR>
	 *	MailConst.RESULT_CONNECT_ERR：SMTPサーバコネクトエラー<BR>
	 *	MailConst.RESULT_INTERNAL_ERR：内部矛盾発生<BR>
	 * @exception Exception RMI接続に失敗した場合
	 */
	public int sendAssignRequest(
		String[] strTeacherIDs,
		String strUserID,
		String strTmaterial,
		String strCatalogTitle,
		String strAssignOKURL,
		String strAssignNGURL,
		String strTemplatePath
	)
		throws Exception
	{
		// パラメータチェック
		if ( strTeacherIDs == null || strUserID == null || strTemplatePath == null ){
			return MailConst.RESULT_INTERNAL_ERR;
		}

		/* 学習者のユーザ情報取得 */
		PeopleClient objUserPc = null ;

		if ( strUserID != null ){
			objUserPc = getUserInfo( strUserID );
			// 入力されたIDのユーザ情報取得エラー。
			if ( objUserPc == null ){
				return MailConst.RESULT_NOUSER_ERR;
			}
		}

		/* メール送信用パラメータテーブルを作成します */
		int sendCnt = strTeacherIDs.length;
		Hashtable[]	htMailInfos = new Hashtable[sendCnt];


		for ( int i=0; i < sendCnt; i++ ){
			htMailInfos[i] = setAssigneRequestMailInfo(strTeacherIDs[i], objUserPc,
											strTmaterial, strCatalogTitle, strAssignOKURL, strAssignNGURL );
			if ( htMailInfos[i] == null ){
				/* 存在しないユーザが指定された場合、配列の数が合わなくなるため
				エラーを返却します */
				return MailConst.RESULT_NOUSER_ERR;
			}
		}
		Hashtable htParam = new Hashtable();
		htParam.put( MailConst.MAILINFOS, htMailInfos );
		htParam.put( MailConst.TEMPLATE_PATH, strTemplatePath );


		/* メール送信処理実行 */
		mvtResult = (Vector)execute( METHOD1, htParam );
		if ( mvtResult == null || mvtResult.size() == 0 ){
			return MailConst.RESULT_INTERNAL_ERR;
		}
		else{
			Object objOut = mvtResult.get(0);
			if( objOut instanceof Hashtable[]  ) {
				//　Hashtableの場合は正常終了（SMTP通信は出来た）
				return MailConst.RESULT_SUCCESS;
			}
			else if ( objOut instanceof Integer ){
				//　Integerの場合、送信自体が失敗
					Integer iResult = (Integer)objOut;
					return iResult.intValue();
			}
			else{
				return MailConst.RESULT_INTERNAL_ERR;
			}
		}

	}

	/**
	 * 異常送信結果が存在するかチェックします。<BR>
	 * 送信処理結果が正常の場合にコールしてください。
	 * （送信していないのにコールされた場合nullを返却します）<BR>
	 * 全ての送信要求が正常or未送信の場合ArrayList.size()はゼロです。<BR>
	 * 送信異常となった送信要求が存在した場合、
	 * 対象のユーザIDをArrayListで返却します。
	 * @return ArrayList 送信異常となったユーザID群
	 */
	public ArrayList checkNgResult() throws Exception
	{

		if ( mvtResult == null ){
			return null;
		}
		if ( mvtResult.size() == 0 ){
			return null;
		}

		ArrayList objErrors = new ArrayList();
		Hashtable[] htResultInfo;

		try{
			htResultInfo = (Hashtable[])mvtResult.get(0);
		}catch ( ClassCastException ex ){
			ex.printStackTrace();
			throw ex;
		}

		int cnt = htResultInfo.length;

		/* 結果のHashtableを確認しエラーのユーザIDを格納 */
		for ( int i=0; i<cnt; i++ ){
			String strResultCode = (String)htResultInfo[i].get( MailConst.RESULT );
			if ( strResultCode.equals( MailConst.NG ) == true ){
				objErrors.add( (String)htResultInfo[i].get( MailConst.USER_ID ) );
			}
		}
		return objErrors;
	}

	/**
	 * 未送信が存在するかチェックします。<BR>
	 * 送信処理結果が正常の場合にコールしてください。
	 * （送信していないのにコールされた場合nullを返却します）<BR>
	 * 全ての送信要求が正常or異常の場合ArrayList.size()はゼロです。<BR>
	 * 未送信となった送信要求が存在した場合、
	 * 対象のユーザIDをArrayListで返却します。
	 * @return ArrayList 未送信であったユーザID群
	 */
	public ArrayList checkNotSendResult() throws Exception
	{

		if ( mvtResult == null ){
			return null;
		}
		if ( mvtResult.size() == 0 ){
			return null;
		}

		ArrayList objErrors = new ArrayList();
		Hashtable[] htResultInfo;

		try{
			htResultInfo = (Hashtable[])mvtResult.get(0);
		}catch ( ClassCastException ex ){
			ex.printStackTrace();
			throw ex;
		}

		int cnt = htResultInfo.length;

		/* 結果のHashtableを確認し未送信のユーザIDを格納 */
		for ( int i=0; i<cnt; i++ ){
			String strResultCode = (String)htResultInfo[i].get( MailConst.RESULT );
			if ( strResultCode.equals( MailConst.NOTSEND ) == true ){
				objErrors.add( (String)htResultInfo[i].get( MailConst.USER_ID ) );
			}
		}
		return objErrors;
	}

	/**
	 * １ユーザ分のメール用Hashtableを生成します。<BR>
	 * @param strUserId ユーザID
	 * @param PeopleClient 管理者 or 先生のPeopleClientオブジェクト
	 * @param strTmaterial 教材名
	 * @param strTmaterialUrl 教材URL
	 * @return Hashtable １ユーザ分のメール送信情報
	 */
	private Hashtable setMailInfo( String strUserId,
									PeopleClient objTeacherPc,
									String strLoginUrl,
									String strTmaterial,
									String strCatalogTitle,
									String strTmaterialUrl )
		throws Exception
	{

		Hashtable htMailInfo = null;

		/* PeopleXMOから送信先ユーザ情報を取得 */
		PeopleClient objUserPc;
		objUserPc = getUserInfo( strUserId );
		if ( objUserPc == null ){
			/* 存在しないユーザが指定された場合はnullを返却 */
			return htMailInfo;
		}

		htMailInfo = new Hashtable();

		// メールアドレス１の取得
		String strUserEmail1 = objUserPc.getContactEmail();
		if ( strUserEmail1 != null ){
			htMailInfo.put( MailConst.USER_MAIL1, strUserEmail1  );

			// 送信先１設定
			htMailInfo.put( MailConst.MAIL_TO1, strUserEmail1 );
		}
		// メールアドレス２の取得
		String strUserEmail2 = objUserPc.getContactEmail2();
		if ( strUserEmail2 != null ){
			htMailInfo.put( MailConst.USER_MAIL2, strUserEmail2  );
			// 送信先２設定
			htMailInfo.put( MailConst.MAIL_TO2, strUserEmail2 );
		}
		//ユーザID、ログインID、名前、パスワードの設定
		htMailInfo.put( MailConst.USER_ID, strUserId );
		htMailInfo.put( MailConst.LOGIN_ID, objUserPc.getLoginID() );
		htMailInfo.put( MailConst.USER_NAME, objUserPc.getUserName() );
		htMailInfo.put( MailConst.USER_PASSWORD, objUserPc.getEncryptPassword() );

		// 管理者 or　先生のユーザ情報が入力された場合、情報を取得し設定する。
		if ( objTeacherPc != null ){
			//メールアドレス１の取得
			String strTeacherEmail1 = objTeacherPc.getContactEmail();
			if ( strTeacherEmail1 != null ){
				htMailInfo.put( MailConst.ADMINISTRATOR_MAIL1, strTeacherEmail1  );
			}
			//メールアドレス２の取得
			String strTeacherEmail2 = objTeacherPc.getContactEmail2();
			if ( strTeacherEmail2 != null ){
				htMailInfo.put( MailConst.ADMINISTRATOR_MAIL2, strTeacherEmail2  );
			}
			//名前の設定
			htMailInfo.put( MailConst.ADMINISTRATOR_NAME, objTeacherPc.getUserName() );
		}

		// 教材名が入力されない場合
		if ( strTmaterial == null ){
			strTmaterial = "";
		}
		// 教材URLが入力されない場合
		if ( strTmaterialUrl == null ){
			strTmaterialUrl = "";
		}
		// ログインURLが入力されない場合
		if ( strLoginUrl == null ){
			strLoginUrl = "";
		}
		// カタログタイトルが入力されない場合
		if( strCatalogTitle == null ) {
			strCatalogTitle = "";
		}
		htMailInfo.put( MailConst.TMATERIAL, strTmaterial );
		htMailInfo.put( MailConst.TMATERIAL_URL, strTmaterialUrl );
		htMailInfo.put( MailConst.LOGIN_URL, strLoginUrl );
		htMailInfo.put( MailConst.CATALOG_TITLE, strCatalogTitle );
		return htMailInfo;
	}

	/**
	 * １ユーザ分のメール用Hashtableを生成します。<BR>
	 * @param strToAddress 送信先アドレス
	 * @param strFromAddress 送信元アドレス
	 * @return Hashtable １ユーザ分のメール送信情報
	 */
	private Hashtable setMailInfo(String strToAddress, String strFromAddress)
		throws Exception
	{
		Hashtable htMailInfo = new Hashtable();

		// 送信先１設定
		htMailInfo.put(MailConst.MAIL_TO1, strToAddress);
		// ユーザIDの設定
		htMailInfo.put(MailConst.USER_ID, "");
		// 送信者アドレスの設定
		htMailInfo.put(MailConst.ADMINISTRATOR_MAIL1, strFromAddress);
		
		return htMailInfo;
	}
	/**
	 * １ユーザ分のメール用Hashtableを生成します。<BR>
	 * @param strTeacherID 承認依頼メールの送信先管理者ID
	 * @param objUserPc 学習者のPeopleClientオブジェクト
	 * @param strTmaterial 教材名
	 * @param strCatalogTitle カタログ名
	 * @param strAssignOKURL 承認URL
	 * @param strAssignNGURL 否認URL
	 * @return Hashtable １ユーザ分のメール送信情報
	 */
	private Hashtable setAssigneRequestMailInfo( String strTeacherID,
									PeopleClient objUserPc,
									String strTmaterial,
									String strCatalogTitle,
									String strAssignOKURL,
									String strAssignNGURL )
		throws Exception
	{

		Hashtable htMailInfo = null;

		/* PeopleXMOから送信先ユーザ情報を取得 */
		PeopleClient objTeacherPc;
		objTeacherPc = getUserInfo( strTeacherID );
		if ( objTeacherPc == null ){
			/* 存在しないユーザが指定された場合はnullを返却 */
			return htMailInfo;
		}

		htMailInfo = new Hashtable();

		// メールアドレス１の取得
		String strTeacherEmail1 = objTeacherPc.getContactEmail();
		if ( strTeacherEmail1 != null ){
			htMailInfo.put( MailConst.ADMINISTRATOR_MAIL1, strTeacherEmail1  );

			// 送信先１設定
			htMailInfo.put( MailConst.MAIL_TO1, strTeacherEmail1 );
		}
		// メールアドレス２の取得
		String strTeacherEmail2 = objTeacherPc.getContactEmail2();
		if ( strTeacherEmail2 != null ){
			htMailInfo.put( MailConst.ADMINISTRATOR_MAIL2, strTeacherEmail2  );
			// 送信先２設定
			htMailInfo.put( MailConst.MAIL_TO2, strTeacherEmail2 );
		}
		//教師のユーザID、名前の設定
		htMailInfo.put( MailConst.USER_ID, objTeacherPc.getUserID() );
		htMailInfo.put( MailConst.ADMINISTRATOR_NAME, objTeacherPc.getUserName() );

		// 学習者のユーザ情報が入力された場合、情報を取得し設定する。
		if ( objUserPc != null ){
			//メールアドレス１の取得
			String strUserEmail1 = objUserPc.getContactEmail();
			if ( strUserEmail1 != null ){
				htMailInfo.put( MailConst.USER_MAIL1, strUserEmail1  );
			}
			//メールアドレス２の取得
			String strUserEmail2 = objUserPc.getContactEmail2();
			if ( strUserEmail2 != null ){
				htMailInfo.put( MailConst.USER_MAIL2, strUserEmail2  );
			}
			//ログインID、名前、パスワードの設定
			htMailInfo.put( MailConst.LOGIN_ID, objUserPc.getLoginID() );
			htMailInfo.put( MailConst.USER_NAME, objUserPc.getUserName() );
			htMailInfo.put( MailConst.USER_PASSWORD, objUserPc.getEncryptPassword() );
		}

		// 教材名が入力されたとき
		if ( strTmaterial == null ){
			strTmaterial = "";
		}
		// カタログタイトルが入力されたとき
		if( strCatalogTitle == null ) {
			strCatalogTitle = "";
		}
		// 認証URLが入力されたとき
		if ( strAssignOKURL == null ){
			strAssignOKURL = "";
		}
		// 否認URLが入力されたとき
		if ( strAssignNGURL == null ){
			strAssignNGURL = "";
		}
		htMailInfo.put( MailConst.TMATERIAL, strTmaterial );
		htMailInfo.put( MailConst.CATALOG_TITLE, strCatalogTitle );
		htMailInfo.put( MailConst.ASSIGN_OK_URL, strAssignOKURL );
		htMailInfo.put( MailConst.ASSIGN_NG_URL, strAssignNGURL );
		return htMailInfo;
	}

	/**
	 * 指定したユーザIDの検索結果を返却します。<BR>
	 * 異常の場合はnullを返却します。
 	 * @param strUserId ユーザID
	 * @return PeopleClient
 	 * @exception Exception RMI接続に失敗した場合
	 */
	private PeopleClient getUserInfo( String strUserId )
		throws Exception
	{
		PeopleClient objPc = new PeopleClient();
		objPc.setWhereUserID( strUserId );
		if ( objPc.select() != true ){
			return null;
		}

		if ( objPc.next() != true ){
			return null;
		}
		return objPc;

	}

   /**
	* 指定したログインIDの検索結果を返却します。<BR>
	* 異常の場合はnullを返却します。
	* @param strUserId ユーザID
	* @return PeopleClient
	* @exception Exception RMI接続に失敗した場合
	*/
   private PeopleClient getLoginUserInfo( String strUserId )
	   throws Exception
   {
	   PeopleClient objPc = new PeopleClient();
	   objPc.setWhereLoginID( strUserId );
	   if ( objPc.select() != true ){
		   return null;
	   }

	   if ( objPc.next() != true ){
		   return null;
	   }
	   return objPc;

   }

	/**
	 * 指定したメールテンプレートファイルの情報を取得します。<BR>
 	 * @param strFilePath メールテンプレートファイル名
	 * @return boolean true: 情報取得成功 false: エラー
 	 * @exception Exception RMI接続に失敗した場合
	 */
	public boolean getTemplateInfo( String strTemplatePath )
		throws Exception
	{
		Hashtable htParams = new Hashtable();
		htParams.put( MailConst.TEMPLATE_PATH, strTemplatePath );

		// メールテンプレート情報取得メソッドのリモートメソッドを起動します。
		mvcTemplateResult = (Vector)super.execute( METHOD_GETTEMPINFO, htParams );

		// エラー（結果がnull）の場合、falseを返却します。
		if( mvcTemplateResult == null ) {
			return false;
		}
		return true;
	}

	/**
	 * テンプレート情報を返却します
	 * @return MailTemplateVO テンプレート情報
	 */
	public MailTemplateVO getTemplateResult() {
		return (MailTemplateVO)mvcTemplateResult.get(0);
	}


	/**
	 * MailXMO独自のメソッドです。<BR>
	 * 指定したメール種別のテンプレートファイル一覧を取得します。
	 * @param String strMailType: メール種別
	 * @return boolean true: リスト取得成功 false: エラー
	 */
	public boolean getTemplateList(String strMailType) throws Exception {

		Hashtable htParams = new Hashtable();
		htParams.put( MailConst.MAIL_TYPE, strMailType );

		// メールテンプレート情報取得メソッドのリモートメソッドを起動します。
		mvcTemplateListResult = (Vector)super.execute( METHOD_GETTEMPLIST, htParams );

		if( mvcTemplateListResult == null ) {
			return false;
		}

		return true;

	}

	/**
	 * MailXMO独自のメソッドです。<BR>
	 * 指定したメール種別のテンプレートディレクトリパスを取得します。
	 * @param String strMailType: メール種別
	 * @return boolean true: リスト取得成功 false: エラー
	 */
	public String getTemplateDirectoryPath(String strMailType) throws Exception {

		String templeteDirectryPath = null;
		Hashtable htParams = new Hashtable();
		htParams.put( MailConst.MAIL_TYPE, strMailType );

		// メールテンプレート情報取得メソッドのリモートメソッドを起動します。
		templeteDirectryPath = (String)super.execute( METHOD_GETTEMPDIRPATH, htParams );

		return templeteDirectryPath;

	}

	/**
	 * テンプレートファイル一覧を返却します
	 * @return Vector ユーザリスト
	 */
	public Vector getTemplateListResult() {
		return mvcTemplateListResult;
	}

	/**
	 * MailXMO独自のメソッドです。<BR>
	 * 置換キーワード一覧を取得します。
	 * @return boolean true: リスト取得成功 false: エラー
	 */
	public boolean getKeywordList( ) throws Exception {

		Hashtable htParams = new Hashtable();

		// 置換キーワード一覧取得メソッドのリモートメソッドを起動します。
		mvcKeywordListResult = (Vector)super.execute( METHOD_GETKEYLIST, htParams );

		if( mvcKeywordListResult == null ) {
			return false;
		}

		return true;

	}

	/**
	 * 置換キーワード一覧を返却します
	 * @return Vector 置換キーワードリスト
	 */
	public Vector getKeywordListResult() {
		return mvcKeywordListResult;
	}
	/**
	 * メールテンプレート入力時の送信処理メソッドを実行します。<BR>
 	 * @param strLoginID ログインID
	 * @param strUserIds 送信先ユーザIDリスト
	 * @param voMailInfo テンプレートVO
	 * @param voLoList	 LOID群
	 * @return int 戻り値<BR>
	 *	MailConst.RESULT_SUCCESS：正常<BR>
 	 *	MailConst.RESULT_NOUSER_ERR：ユーザ情報取得エラー<BR>
	 *	MailConst.RESULT_SGREAD_ERR：環境設定ファイル読み込みエラー<BR>
	 *	MailConst.RESULT_SGCONV_ERR：環境設定ファイル置換エラー<BR>
	 *	MailConst.RESULT_TEMPINPUT_ERR：テンプレート入力エラー<BR>
	 *	MailConst.RESULT_CONNECT_ERR：SMTPサーバコネクトエラー<BR>
	 *	MailConst.RESULT_INTERNAL_ERR：内部矛盾発生<BR>
	 * @exception Exception RMI接続に失敗した場合
	 */
	public Vector sendMail( String strLoginID,
							 String[] strUserIds,
							 MailTemplateVO voMailInfo,
							 Vector vcLoList)
							 throws XmsException {
		try {

			if ( strUserIds == null || voMailInfo == null ){
				mvtResult.add(Integer.toString(MailConst.RESULT_INTERNAL_ERR));
				return mvtResult;
			}
	
			// --- ログインユーザのユーザ情報取得 --- //
			PeopleClient objLoginPc = null ;
	
			if ( strLoginID != null ){
				objLoginPc = getLoginUserInfo( strLoginID );
				// 入力されたIDのユーザ情報取得エラー。
				if ( objLoginPc == null ){
					mvtResult.add(Integer.toString(MailConst.RESULT_NOUSER_ERR));
					return mvtResult;
				}
			}
	
			// --- メール送信用パラメータテーブルの作成 --- //
			int sendCnt = strUserIds.length;
			Hashtable[]	htMailInfos = new Hashtable[sendCnt];
	
			for ( int i = 0; i < sendCnt; i++ ) {
	
				String strLoId = null;
				if (!(vcLoList == null || vcLoList.isEmpty())) {
					strLoId = (String)vcLoList.get(i);
				}
				// メールテンプレート使用時の１ユーザ分のメール用Hashtableを生成します。
				htMailInfos[i] = setMailInfo(strUserIds[i], objLoginPc, voMailInfo, strLoId );
				if ( htMailInfos[i] == null ){
					//存在しないユーザが指定された場合、
					//配列の数が合わなくなる為、エラーを返却します 
					mvtResult.add(Integer.toString(MailConst.RESULT_NOUSER_ERR));
					return mvtResult;
				}
			}
			Hashtable htParam = new Hashtable();
			// 全ユーザ分のメール用Hashtableを設定
			htParam.put( MailConst.MAILINFOS, htMailInfos );
			// テンプレートVOを設定
			htParam.put( MailConst.TEMPLATE_INFO, voMailInfo);
	
			// --- メール送信処理実行 --- //
			mvtResult = (Vector)execute( METHOD_SENDMAIL, htParam );
	
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	
			return mvtResult;
	}

	/**
	 * メールテンプレート使用時の１ユーザ分のメール用Hashtableを生成します。<BR>
	 * @param strUserId 　ユーザID
	 * @param objLoginPc  ログインユーザのクライアントオブジェクト
	 * @param voMailInfo  メールテンプレート情報
	 * @param strLoId　　 LOID
	 * @return Hashtable １ユーザ分のメール送信情報
	 */
	private Hashtable setMailInfo( String strUserId,
									PeopleClient objLoginPc,
									MailTemplateVO voMailInfo,
									String strLoId )
		throws Exception {

		Hashtable htMailInfo = new Hashtable();

		// PeopleXMOから送信先ユーザ情報を取得
		PeopleClient objUserPc;
		objUserPc = getUserInfo( strUserId );

		if ( objUserPc == null ){
			/* 存在しないユーザが指定された場合はnullを返却 */
			return htMailInfo;
		}

		// メールアドレス１の取得
		String strUserEmail1 =objUserPc.getContactEmail();
		if ( strUserEmail1 != null ){
			htMailInfo.put( MailConst.USER_MAIL1, strUserEmail1  );
			// 送信先１設定
			htMailInfo.put( MailConst.MAIL_TO1, strUserEmail1 );
		}
		// メールアドレス２の取得
		String strUserEmail2 = objUserPc.getContactEmail2();
		if ( strUserEmail2 != null ){
			htMailInfo.put( MailConst.USER_MAIL2, strUserEmail2  );
			// 送信先２設定
			htMailInfo.put( MailConst.MAIL_TO2, strUserEmail2 );
		}

		// ユーザIDを設定
		htMailInfo.put( MailConst.USER_ID, strUserId );
		// ログインIDを設定
		htMailInfo.put( MailConst.LOGIN_ID, objUserPc.getLoginID());
		// ユーザ名称を設定
		htMailInfo.put( MailConst.USER_NAME, objUserPc.getUserName());
		// パスワードを設定
		htMailInfo.put( MailConst.USER_PASSWORD, objUserPc.getEncryptPassword());


		// ログインしたユーザのユーザ情報が入力された場合、情報を取得し設定する。
		if ( objLoginPc != null ){
			//メールアドレス１の取得
			String strLoginUserEmail1 = objLoginPc.getContactEmail();
			if ( strLoginUserEmail1 != null ){
				htMailInfo.put( MailConst.ADMINISTRATOR_MAIL1, strLoginUserEmail1  );
			}
			//メールアドレス２の取得
			String strLoginUserEmail2 = objLoginPc.getContactEmail2();
			if ( strLoginUserEmail2 != null ){
				htMailInfo.put( MailConst.ADMINISTRATOR_MAIL2, strLoginUserEmail2  );
			}
			//名前の設定
			htMailInfo.put( MailConst.ADMINISTRATOR_NAME, objLoginPc.getUserName());
		}

		// ログインURLの取得
		Environment objEnv = new Environment();
		// システムURL
		String strSystemURL = objEnv.getSystemURL();
		String strLoginURL = strSystemURL + "/";
		// システムログインURLを設定
		htMailInfo.put( MailConst.LOGIN_URL, strLoginURL);


		if (strLoId != null) {
			// 教材名を設定
			htMailInfo.put( MailConst.TMATERIAL, getLoTitle(strLoId));
			// マクロ展開用の文字列を作成
			Hashtable htbMacro = new Hashtable();
			// ログインID
			htbMacro.put( AssignmentsEnv.UID, objUserPc.getLoginID() );
			// パスワード
			htbMacro.put( AssignmentsEnv.PS, objUserPc.getEncryptPassword() );
			// LOID
			htbMacro.put( AssignmentsEnv.LID, strLoId );
			// マテリアルID
			htbMacro.put( AssignmentsEnv.MTID, getMaterialID(strLoId) );
			AssignmentsEnv objAssignEnv = AssignmentsEnv.getInstance();
			// 教材起動用URLを設定
			htMailInfo.put( MailConst.TMATERIAL_URL, objAssignEnv.getLoginURL(htbMacro));

		}
		else {
			// LOIDがない場合

			// 教材名に空文字を設定
			htMailInfo.put( MailConst.TMATERIAL, "");
			// 教材起動用URLに空文字を設定
			htMailInfo.put( MailConst.TMATERIAL_URL, "");
		}
		return htMailInfo;
	}


	/**
	 * 教材名の取得。<BR>
	 * @param  strLoId 　 LOID
	 * @return getLoTitle 教材名
	 * @exception XmsException
	 */		
	private String getLoTitle( String strLoId ) throws XmsException {

		String strLoTitle = null;

		try {
			// 教材名の取得
			LoClient objLo = new LoClient();
			objLo.setWhereLoID(strLoId);

			// 検索処理の実行
			if( !objLo.select() ) {
				if (objLo.isErr()) {
					//エラーの場合
				throw new XmsSystemException(objLo.getMessage());
			} else {
				//警告の場合
					throw new XmsWarningException(objLo.getMessage());
				}
			}
			
			// 結果の取得
			if( objLo.next() ) {
				strLoTitle = objLo.getLoTytle();
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		return strLoTitle;
	}

	/**
	 * マテリアルIDの取得。<BR>
	 * @param  strLoId 　 LOID
	 * @return strMaterialID マテリアルID
	 * @exception XmsException
	 */		
	private String getMaterialID( String strLoId ) throws XmsException {

		String strMaterialID = null;

		try {

			//マテリアルIDの取得
			LoRelationClient objLoRelation = new LoRelationClient();
			objLoRelation.setWhereChildID(strLoId);
						
			// 検索処理の実行
			if( !objLoRelation.select() ) {
				if (objLoRelation.isErr()) {
					//エラーの場合
					throw new XmsSystemException(objLoRelation.getMessage());
				} else {
					//警告の場合
					throw new XmsWarningException(objLoRelation.getMessage());
				}
			}

			// 結果の取得
			if( objLoRelation.next() ) {
				strMaterialID = objLoRelation.getmaterialID();
			}

		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
			return strMaterialID;
	}

	/**
	 * メールテンプレート使用時の１ユーザ分のメール用Hashtableを生成します。<BR>
	 * @param strUserId 　ユーザID
	 * @param objLoginPc  ログインユーザのクライアントオブジェクト
	 * @param voMailInfo  メールテンプレート情報
	 * @return Hashtable １ユーザ分のメール送信情報
	 */
	private Hashtable setMailInfo( String strUserId,
									PeopleClient objLoginPc,
									MailTemplateVO voMailInfo)
		throws Exception
	{

		Hashtable htMailInfo = null;

		/* PeopleXMOから送信先ユーザ情報を取得 */
		PeopleClient objUserPc;
		objUserPc = getUserInfo( strUserId );
		if ( objUserPc == null ){
			/* 存在しないユーザが指定された場合はnullを返却 */
			return htMailInfo;
		}

		htMailInfo = new Hashtable();

		// メールアドレス１の取得
		String strUserEmail1 =objUserPc.getContactEmail();
		if ( strUserEmail1 != null ){
			htMailInfo.put( MailConst.USER_MAIL1, strUserEmail1  );

			// 送信先１設定
			htMailInfo.put( MailConst.MAIL_TO1, strUserEmail1 );
		}
		// メールアドレス２の取得
		String strUserEmail2 = objUserPc.getContactEmail2();
		if ( strUserEmail2 != null ){
			htMailInfo.put( MailConst.USER_MAIL2, strUserEmail2  );
			// 送信先２設定
			htMailInfo.put( MailConst.MAIL_TO2, strUserEmail2 );
		}
		//ユーザID、ログインID、名前、パスワードの設定
		htMailInfo.put( MailConst.USER_ID, strUserId );
		htMailInfo.put( MailConst.LOGIN_ID, objUserPc.getLoginID());
		htMailInfo.put( MailConst.USER_NAME, objUserPc.getUserName());
		htMailInfo.put( MailConst.USER_PASSWORD, objUserPc.getEncryptPassword());

		// ログインしたユーザのユーザ情報が入力された場合、情報を取得し設定する。
		if ( objLoginPc != null ){
			//メールアドレス１の取得
			String strLoginUserEmail1 = objLoginPc.getContactEmail();
			if ( strLoginUserEmail1 != null ){
				htMailInfo.put( MailConst.ADMINISTRATOR_MAIL1, strLoginUserEmail1  );
			}
			//メールアドレス２の取得
			String strLoginUserEmail2 = objLoginPc.getContactEmail2();
			if ( strLoginUserEmail2 != null ){
				htMailInfo.put( MailConst.ADMINISTRATOR_MAIL2, strLoginUserEmail2  );
			}
			//名前の設定
			htMailInfo.put( MailConst.ADMINISTRATOR_NAME, objLoginPc.getUserName());
		}

		// メールテンプレート情報を設定する。
		if ( voMailInfo == null )
		{	// メールテンプレート情報の設定
			htMailInfo.put( MailConst.TEMPLATE_INFO, voMailInfo );
		}
		return htMailInfo;
	}

}
