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

//
//	CatalogLo　承認依頼サーブレット
//			変更履歴
//				2004/01/08	新規作成	二條　智文
//ADD 2005/02/15 START Katsuhiko Kagami(UNITEC) [LO購入]
//              2005/02/15  LO購入処理対応 Katsuhiko Kagami(UNITEC)
//ADD 2005/02/15 END Katsuhiko Kagami(UNITEC) [LO購入]
//
package jp.co.ntt.lms.lo.Catalog;

// XMS2 API
import jp.co.ntt.lms.xmo.util.*;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.Mail.*;
//ADD 2005/02/15 START Katsuhiko Kagami(UNITEC) [LO購入]
import jp.co.ntt.lms.xmo.Lo.LoExtend.LoExtendTable;
//ADD 2005/02/15 END Katsuhiko Kagami(UNITEC) [LO購入]

// JAVA API
import java.util.*;
import java.io.*;
import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Cookie;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;

/**
 * CatalogLo　承認依頼サーブレット<BR>
 * ログインチェック、権限チェックを行い、権限があるユーザのみ承認依頼メールを送信する
 */
public class CatalogAssignRequestServlet extends HttpServlet {

	// ログ出力定義
	/** パラメータエラー */
	private static final String PARAM_ERR = "パラメータが不正です。";
	/** 処理開始メッセージ */
	private static final String START_LOG = "処理を開始します。";
	/** 処理終了メッセージ */
	private static final String END_LOG = "処理が終了しました。";
	/** ログインチェックエラー */
	private static final String NO_LOGIN = "ログインしていません。";
	/** LOが存在しないエラー */
	private static final String NO_EXIST_LO = "指定されたオフライン学習LOが存在しません。";
	/** LOが存在しないエラー(ログ用) */
	private static final String NO_EXIST_LO_FOR_LOG = "LOが存在しません。";
	/** 権限がない場合のエラー */
	private static final String NO_AUTH_ERR = "権限がありません。";
	/** 学習アサインされていない場合のエラー */
	private static final String NO_LEARN_AUTH_ERR = "学習アサインされていません。";
	/** アサイン者が存在しないエラー */
	private static final String NO_EXIST_ASSIGNER_ERR = "アサイン者が存在しません。";
	/** DBエラー */
	private static final String DB_ERROR = "データベースエラーが発生しました。";
	/** メール送信　ユーザ情報の取得失敗 */
	private static final String MAIL_FAIL_USER_INFO = "ユーザ情報の取得に失敗しました。";
	/** メール送信　メール設定ファイル読み込みエラー */
	private static final String MAIL_FAIL_READ_ENV = "メール設定ファイルの読み込みに失敗しました。";
	/** メール送信　マクロ置換失敗エラー */
	private static final String MAIL_SGCONV_ERR = "マクロ文字列の置換に失敗しました。";
	/** メール送信　テンプレートファイル読み込みエラー */
	private static final String MAIL_TEMPREAD_ERR = "テンプレートファイルの読み込みに失敗しました。";
	/** メール送信　SMTPサーバ接続エラー */
	private static final String MAIL_CONNECT_ERR = "SMTPサーバの接続に失敗しました。";
	/** メール送信　内部矛盾 */
	private static final String MAIL_INTERNAL_ERR = "メール送信で内部矛盾が発生しました。";
	/** メール送信　すべてのメールが未送信 */
	private static final String MAIL_ALL_ERR = "すべてのメールが送信できませんでした。";
	/** メール送信　いくつかのメールが未送信 */
	private static final String MAIL_ANY__ERR = "いくつかのメールが送信できませんでした。";
	/** メール送信　メール送信失敗ユーザ */
	private static final String MAIL_FAIL_USER = "メール送信失敗ユーザ：";
	/** メール送信　メール未送信ユーザ */
	private static final String MAIL_NOT_SEND_USER = "メール未送信ユーザ：";

//	ADD 2005/02/15 START Katsuhiko Kagami(UNITEC) [LO購入]
	/** 購入が必要なコンテンツ */
	private static final String ERROR_REQUIRE_BUY = "購入が必要なコンテンツです。";
	/** 購入が不要なコンテンツ */
	private static final String ERROR_NO_REQUIRE_BUY = "購入が不要なコンテンツです。";
//	ADD 2005/02/15 END Katsuhiko Kagami(UNITEC) [LO購入]


	/** すべてのログの先頭につける */
	private static final String PREFIX = "CatalogLO：認証依頼処理：";
	/** 権限チェックログの先頭につける */
	private static final String AUTH_PREFIX = "CatalogLO：認証依頼処理：権限チェック：";
	/** メール送信ログの先頭につける */
	private static final String MAIL_PREFIX = "CatalogLO: 承認依頼処理：メール送信処理：";

	// 閲覧画面への送信メッセージ
	private static final String MAIL_END_MSG = "承認依頼メールを送信しました。";
	private static final String MAIL_ALL_FAIL_MSG = "承認依頼メールの送信に失敗しました。";

	// 閲覧画面の相対URL
	private static final String CATALOGPERUSAL_URL = "../";

	// クッキー期限のデフォルト日数 = 1 日
	private static int DEFAULT_EXPIRES = 1;

	/**
	 * コンストラクタ
	 */
	public CatalogAssignRequestServlet() {}

	/**
	 * ＧＥＴ要求を処理するメソッド<BR>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @return void
	 * @exception javax.servlet.ServletException	サーブレット例外
	 * @exception java.io.IOException				入出力例外
	 */
	public void doGet(
		HttpServletRequest request,HttpServletResponse response)
			throws ServletException, IOException, UnsupportedEncodingException
	{
		// リクエスト処理を呼び出します
		this.doRequest(request, response);
	}

	/**
	 * ＰＯＳＴ要求を処理するメソッド<BR>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @return void
	 * @exception javax.servlet.ServletException	サーブレット例外
	 * @exception java.io.IOException				入出力例外
	 */
	public void doPost(
		HttpServletRequest request,HttpServletResponse response)
			throws ServletException, IOException, UnsupportedEncodingException
	{
		// リクエスト処理を呼び出します
		this.doRequest(request, response);
	}

	/**
	 * 要求を処理するメソッド<BR>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @return void
	 */
	private void doRequest(
		HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException, UnsupportedEncodingException
	{
		String strLoID			= request.getParameter( "LOID" );		// LoID
		String strCatalogLoID	= request.getParameter( "CatalogLOID" );// カタログLOID
		String strLoType	= request.getParameter( "LOType" );			// LOタイプ
//		ADD 2005/02/15 START Katsuhiko Kagami(UNITEC) [LO購入]
		String strLoBuy			= request.getParameter( "LOBUY" );		// Lo購入申請
//		ADD 2005/02/15 END Katsuhiko Kagami(UNITEC) [LO購入]
		LoClient objRequestLo = null;		// 承認LO
		LoClient objCatalogLo = null;		// カタログLO
		String[] strAssignerList = null;	// アサイン者リスト
		
		// セッションからログインユーザIDを取得する
		HttpSession session = request.getSession();
		String strLoginUserID = (String)session.getAttribute("userId");

		// @LOG >info >5
		DebugLog.write( this.getClass(), PREFIX + START_LOG + ":" +
						strLoID + ":" + strCatalogLoID + ":" + strLoginUserID,
						DebugLog.MID);

		// パラメータチェック
		if( strLoID == null ||
			strLoID.equals("") ||
			strCatalogLoID == null ||
			strCatalogLoID.equals("") ||
			strLoType == null ||
			strLoType.equals("") ||
//			ADD 2005/02/15 START Katsuhiko Kagami(UNITEC) [LO購入]
			strLoBuy == null ||
			strLoBuy.equals("") ||
			(!strLoBuy.equals(LoExtendTable.LOEXTEND_NOREQUIRE_BUY) && 
			 !strLoBuy.equals(LoExtendTable.LOEXTEND_REQUIRE_BUY)))
//			ADD 2005/02/15 END Katsuhiko Kagami(UNITEC) [LO購入]
		{
			// @LOG >err >1
			DebugLog.write( this.getClass(), PREFIX + PARAM_ERR + ":" +
							strLoID + ":" + strCatalogLoID + ":" + strLoginUserID,
							DebugLog.HIGHT);
			// パラメータが不正の場合は権限エラー画面に遷移する。
			goWarningpage( request, response, PARAM_ERR );
			return;
		}

		// ログインチェック
		if( strLoginUserID == null ) {
			// @LOG >err >1
			DebugLog.write( this.getClass(), AUTH_PREFIX + NO_LOGIN, DebugLog.HIGHT);
			// ログインしていない場合は権限エラー画面に遷移する。
			goWarningpage( request, response, NO_AUTH_ERR );
			return;
		}

		try {
			// 承認LO情報の取得
			objRequestLo = getLoInfo( strLoID, request, response );
			if( objRequestLo == null ) {
				// @LOG >err >1
				DebugLog.write( this.getClass(), PREFIX + NO_EXIST_LO_FOR_LOG +
								":" + strLoID + ":" + strLoginUserID,
								DebugLog.HIGHT);

				// 取得できない場合は処理終了
				return;
			}

//			ADD 2005/02/15 START Katsuhiko Kagami(UNITEC) [LO購入]
			// Loタイトルの保存
			String strLoTitle = objRequestLo.getLoTytle();

			// LoExtend情報を参照して、購入ステータスを確認する。
			if (objRequestLo.selectLoExtend(strLoID)) {
				if (objRequestLo.isExistLoExtend()) {
					if (!objRequestLo.getLoExtendRecord().getBuy().equals(strLoBuy)) {
						// 購入ステータスが一致しない場合
						if (strLoBuy.equals(LoExtendTable.LOEXTEND_NOREQUIRE_BUY)) {
							// 購入が必要なコンテンツ
							// LOG_ERROR
							DebugLog.write( this.getClass(), PREFIX + ERROR_REQUIRE_BUY + "/" +
									"LOID=" + strLoID + "/LOBUY=" + strLoBuy + "/userId=" + strLoginUserID, DebugLog.HIGHT);
							// 購入が必要である事を警告。
							goWarningpage( request, response, ERROR_REQUIRE_BUY );
							return;
						} else {
							// 購入が不要なコンテンツ
							// LOG_ERROR
							DebugLog.write( this.getClass(), PREFIX + ERROR_NO_REQUIRE_BUY + "/" +
									"LOID=" + strLoID + "/LOBUY=" + strLoBuy + "/userId=" + strLoginUserID, DebugLog.HIGHT);
							// 購入が不要である事を警告。
							goWarningpage( request, response, ERROR_NO_REQUIRE_BUY );
							return;
						}
					}
				}
			} else {
				// LOG_ERROR
				DebugLog.write( this.getClass(),
						PREFIX + objRequestLo.getMessage() + "/" + strLoID, 
						DebugLog.HIGHT);
				// 検索過程でエラーが発生した場合はエラー画面を表示する。
				goErrorPage( request, response, objRequestLo.getMessage() );
				return;
			}
//			ADD 2005/02/15 END Katsuhiko Kagami(UNITEC) [LO購入]
			
			
			// カタログLO情報の取得
			objCatalogLo = getLoInfo( strCatalogLoID, request, response );
			if( objCatalogLo == null ) {
				// @LOG >err >1
				DebugLog.write( this.getClass(), PREFIX + NO_EXIST_LO_FOR_LOG +
								":" + strCatalogLoID + ":" + strLoginUserID,
								DebugLog.HIGHT);
				// 取得できない場合は処理終了
				return;
			}

			// アサイン者リストを取得する
			AssignmentsClient objAssign = new AssignmentsClient();

			// アサイン者の検索(アサインタイプは学習アサインに限定する)
			if( !objAssign.searchAssignerList( strLoginUserID, strCatalogLoID, AssignmentsClient.LEARN_TYPE ) ) {
				// アサイン者の検索に失敗した場合はエラーとする
				throw new Exception( objAssign.getMessage() );
			}

			strAssignerList = objAssign.getAssignerList();

			// アサイン者リストが取得できない場合は権限エラー画面に遷移する
			if( strAssignerList == null ||
				strAssignerList.length == 0 )
			{
				// @LOG >err >1
				DebugLog.write( this.getClass(), AUTH_PREFIX + NO_LEARN_AUTH_ERR, DebugLog.HIGHT);
				// アサイン者リストが取得できない場合は権限エラー画面に遷移する。
				goWarningpage( request, response, NO_AUTH_ERR );
				return;
			}

			CatalogLoEnv objEnv = new CatalogLoEnv();

			// メール送信を行う。
			boolean blSendMailResult = false;
			for( int i = 0; i < strAssignerList.length; i++ ) {
				// 承認・否認URLの作成
				String[] strURL = makeAssignURL( strAssignerList[i], strLoginUserID, strCatalogLoID, strLoID );
				String strAssignOKURL = strURL[0];
				String strAssignNGURL = strURL[1];

//				ADD 2005/02/15 START Katsuhiko Kagami(UNITEC) [LO購入]
				// 承認依頼メールテンプレートのパスを設定ファイル(Catalog.ini)から取得する
				String strTemplatePath = null;
				// 受講申請メールテンプレートのパスを設定ファイルから取得する
				if (strLoBuy.equals(LoExtendTable.LOEXTEND_REQUIRE_BUY)) {
					// 購入申請の場合のメールテンプレート
					strTemplatePath = objEnv.getAssign_buy_rq_mail_temp_path();
				} else {
					// 受講申請の場合のメールテンプレート
					strTemplatePath = objEnv.getAssign_rq_mail_temp_path();
				}
//				ADD 2005/02/15 END Katsuhiko Kagami(UNITEC) [LO購入]


				// 承認依頼メールの送信
				boolean blResult = sendRequestMail(strAssignerList[i],
													strLoginUserID,
// MOD 2005/02/15 START Katsuhiko Kagami(UNITEC) [LO購入]
//													objRequestLo.getLoTytle(),
													strLoTitle,
// MOD 2005/02/15 START Katsuhiko Kagami(UNITEC) [LO購入]
													objCatalogLo.getLoTytle(),
													strAssignOKURL,
													strAssignNGURL,
													strTemplatePath );

				// 一通でも送信できた場合は送信成功とする
				if( blResult ) {
					blSendMailResult = true;
				}
			}

			String strMessage = MAIL_END_MSG;

			if( !blSendMailResult ) {
				// すべてのメール送信に失敗した場合
				strMessage = MAIL_ALL_FAIL_MSG;
			}

			// 送信失敗メッセージ以外はクッキーを設定する
			if( !strMessage.equals( MAIL_ALL_FAIL_MSG ) ) {
				// 申請済みクッキーの設定
				// 申請済みクッキーを設定するのは一通でもメールが尊信できた場合
				// 一通もメールが送信できなかった場合は設定しない。
				// クッキー名は LOID + ユーザID とする
				setCookie( strLoID + strLoginUserID, java.net.URLEncoder.encode("申請済み","UTF-8"), request, response, objEnv );

			}

			// カタログ閲覧画面にリダイレクトを行う
			String	strURL = CATALOGPERUSAL_URL + objEnv.getLaunch_URL() +
							"?LOID=" + strCatalogLoID +
							"&LOType=" + strLoType +
							"&message=" + URLEncoder.encode(strMessage, "UTF-8");
			
			response.sendRedirect( strURL );
		}
		catch( Exception e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			goErrorPage( request, response, e.getMessage() );
			return;
		}

		// @LOG >info >5
		DebugLog.write( this.getClass(), PREFIX + END_LOG + ":" +
						strLoID + ":" + strCatalogLoID + ":" + strLoginUserID,
						DebugLog.MID);
	}

	/**
	 * エラー画面へフォワードするメソッド<BR>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @param HttpServletResponse	エラーメッセージ
	 * @return void
	 */
	private void goErrorPage(
		HttpServletRequest request, HttpServletResponse response,
		String strErrorMessage)
			throws ServletException, IOException
	{
		request.setAttribute("ErrorMessage", strErrorMessage);
		ServletContext objSc    = getServletContext();
		RequestDispatcher objRd = objSc.getRequestDispatcher("/view/lo/Com/ComErr.vm");
		objRd.forward(request, response);
	}

	/**
	 * 警告画面へフォワードするメソッド<BR>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @param HttpServletResponse	エラーメッセージ
	 * @return void
	 */
	private void goWarningpage(
		HttpServletRequest request, HttpServletResponse response,
		String strErrorMessage)
			throws ServletException, IOException
	{
		response.setContentType( "text/html" );
		request.setAttribute("WarningMessage", strErrorMessage);
		ServletContext objSc    = getServletContext();
		RequestDispatcher objRd = objSc.getRequestDispatcher("/view/lo/Catalog/CatalogWarning.vm");
		objRd.forward(request, response);
	}


	/**
	 * 指定されたLOIDのLOを取得します。
	 * @param strLoID LOID
	 * @return LoClient LO情報 (取得できなかった場合はnullを返す)
	 * @exception Exception RMI通信エラー
	 */
	private LoClient getLoInfo( String strLoID,
								HttpServletRequest request,
								HttpServletResponse response )
		throws Exception
	{
		// 承引依頼LOIDの有効性チェック
		// LO情報をLOXMOより取得します。
		LoClient objLo = new LoClient();
		// 検索条件を設定
		objLo.setWhereLoID(strLoID);
		if( !objLo.select() ) {
			// 検索がうまくいかなかった場合
			String strMessage =  objLo.getMessage();
			DebugLog.write( this.getClass(), PREFIX + strMessage + ":" + strLoID, DebugLog.HIGHT);
			goErrorPage( request, response, strMessage );
			return null;
		}

		// LOテーブルからLOIDのレコードを取得きたかチェックする
		if( !objLo.next() ) {
			goWarningpage( request, response, NO_EXIST_LO );
			return null;
		}

		return objLo;
	}

	/**
	 * 一通の承認依頼メール送信を行います。
	 * @param strTeacherID 承認依頼メールの送信先管理者ID
	 * @param strLearnerID 承認依頼メールを送信する学習者ID
	 * @param strTmaterial 承認してもらいたい教材名
	 * @param strTcatalog カタログ名
	 * @param strAssignOKURL 承認URL
	 * @param strAssignNGURL 否認URL
	 * @param strTemplatePath テンプレートファイルフルパス
	 * @return boolean 送信結果
	 *                 true: 送信OK false: 送信NG
	 * @exception Exception RMI通信エラー
	 */
	private boolean sendRequestMail(
					String strTeacherID,
					String strLearnerID,
					String strTmaterial,
					String strTcatalog,
					String strAssignOKURL,
					String strAssignNGURL,
					String strTemplatePath
	)
		throws Exception
	{
		// @LOG >info >5
		DebugLog.write( this.getClass(), MAIL_PREFIX + START_LOG + ":" +
						strLearnerID + ":" + strTmaterial,
						DebugLog.MID);

		// メール送信クライアントをインスタンス化
		MailClient mail = new MailClient();

		String[] strTeacherIDs = new String[1];
		strTeacherIDs[0] = strTeacherID;

		// 承認依頼メールの送信
		int intRes = mail.sendAssignRequest(
												strTeacherIDs,
												strLearnerID,
												strTmaterial,
												strTcatalog,
												strAssignOKURL,
												strAssignNGURL,
												strTemplatePath );

		if( intRes == MailConst.RESULT_SUCCESS ) {
		}
		else if( intRes == MailConst.RESULT_NOUSER_ERR ) {
			// @LOG >err >1
			DebugLog.write( this.getClass(), MAIL_PREFIX + MAIL_FAIL_USER_INFO + ":" +
							strLearnerID + ":" + strTmaterial,
							DebugLog.HIGHT);
			return false;
		}
		else if( intRes == MailConst.RESULT_SGREAD_ERR ) {
			// @LOG >err >1
			DebugLog.write( this.getClass(), MAIL_PREFIX + MAIL_FAIL_READ_ENV + ":" +
							strLearnerID + ":" + strTmaterial,
							DebugLog.HIGHT);
			return false;
		}
		else if( intRes == MailConst.RESULT_SGCONV_ERR ) {
			// @LOG >err >1
			DebugLog.write( this.getClass(), MAIL_PREFIX + MAIL_SGCONV_ERR + ":" +
							strLearnerID + ":" + strTmaterial,
							DebugLog.HIGHT);
			return false;
		}
		else if( intRes == MailConst.RESULT_TEMPREAD_ERR ) {
			// @LOG >err >1
			DebugLog.write( this.getClass(), MAIL_PREFIX + MAIL_TEMPREAD_ERR + ":" +
							strLearnerID + ":" + strTmaterial,
							DebugLog.HIGHT);
			return false;
		}
		else if( intRes == MailConst.RESULT_CONNECT_ERR ) {
			// @LOG >err >1
			DebugLog.write( this.getClass(), MAIL_PREFIX + MAIL_CONNECT_ERR + ":" +
							strLearnerID + ":" + strTmaterial,
							DebugLog.HIGHT);
			return false;
		}
		else if( intRes == MailConst.RESULT_INTERNAL_ERR ) {
			// 内部矛盾の場合は例外とする
			throw new Exception( MAIL_INTERNAL_ERR );
		}

		// 送信失敗ユーザリスト取得
		ArrayList objNG = mail.checkNgResult();
		// 送信失敗ユーザIDをログに出力
		for( int i = 0; i < objNG.size(); i++ ) {
			// @LOG >info >1
			DebugLog.write( this.getClass(), MAIL_PREFIX + MAIL_FAIL_USER +
							objNG.get(i),
							DebugLog.HIGHT);
		}

		// 未送信ユーザリスト取得
		ArrayList objNotSend = mail.checkNotSendResult();
		// 未送信ユーザIDをログに出力
		for( int i = 0; i < objNotSend.size(); i++ ) {
			// @LOG >info >1
			DebugLog.write( this.getClass(), MAIL_PREFIX + MAIL_NOT_SEND_USER +
							objNotSend.get(i),
							DebugLog.HIGHT);
		}

		// 失敗ユーザ数
		int intNGCount = objNG.size();
		// 未送信ユーザ数
		int intNotSendCount = objNotSend.size();

		// メールを送信しなかった数(メール失敗数 + 未送信数)が
		// 承認通知メール送信先ユーザ同数の場合はメール送信エラーとする
		// （以上はありえないかもしれないがプログラム的には>=で比較)
		if( intNGCount + intNotSendCount >= 1 ) {
			// @LOG >info >1
			DebugLog.write( this.getClass(), MAIL_PREFIX + MAIL_ALL_ERR,
							DebugLog.HIGHT);
			return false;
		}

		// @LOG >info >5
		DebugLog.write( this.getClass(), MAIL_PREFIX + END_LOG + ":" +
						strLearnerID + ":" + strTmaterial,
						DebugLog.MID);

		// すべて正常に送信できた場合は正常メッセージ
		return true;
	}

	/**
	 * 申請済みクッキーを作成します。
	 * @param strCookieName クッキー名
	 * @param strCookieValue クッキー値
	 * @param request HTTPリクエスト
	 * @param response HTTPレスポンス
	 * @param objEnv カタログ設定クラス
	 * @exception 設定ファイル読み込みエラー
	 */
	private void setCookie( String strCookieName,
							String strCookieValue,
							HttpServletRequest request,
							HttpServletResponse response,
							CatalogLoEnv objEnv )
		throws Exception
	{
		Cookie cookie = new Cookie(strCookieName, strCookieValue);
		// 最長存続期間の設定
		int intExpires = DEFAULT_EXPIRES;

		String strExpires = objEnv.getExpires();
		try {
			intExpires = Integer.parseInt( strExpires );
		}
		catch( NumberFormatException ne ) {
		}

		// 日付　→　秒数に変換
		int intMaxAge = intExpires * 24 * 60 * 60;
		cookie.setMaxAge( intMaxAge );
		String strContextPath = request.getContextPath();
		// パスの設定を閲覧画面のみに設定する。
//		cookie.setPath( strContextPath + "/" + objEnv.getLaunch_URL() );
		cookie.setPath( strContextPath + "/" + objEnv.getLaunch_dir() );
		response.addCookie( cookie );
	}

	/**
	 * 承認・否認URLの組み立てを行う。
	 * @param strAssignerID アサイン者のユーザID
	 * @param strLearnerID 被アサイン者のユーザID
	 * @param strCatalogLoID カタログLOID
	 * @param strAssignLoID アサイン対象LOID
	 * @return String[] 承認・否認URL
	 *            [0]: 承認URL
	 *            [1]: 否認URL
	 */
	private String[] makeAssignURL( String strAssignerID, String strLearnerID, String strCatalogLoID, String strAssignLoID )
		throws Exception
	{

		// アサイン者情報を取得する
		PeopleClient objPeople = new PeopleClient();
		// 検索条件にユーザIDを設定
		objPeople.setWhereUserID( strAssignerID );
		// 検索実行
		if( !objPeople.select() ) {
			// 検索に失敗した場合はExceptionをスローする
			throw new Exception( objPeople.getMessage() );
		}

		// 検索結果の取得
		if( !objPeople.next() ) {
			// 検索結果が一件も無い場合はエラーとする
			throw new Exception( NO_EXIST_ASSIGNER_ERR );
		}

		// アサイン者のパスワードを取得し、Base64エンコードする
		String strAssignerPass = RmsKPassword.GetEncodePassword( objPeople.getEncryptPassword() );
		// アサイン者のログインIDを取得する。
		String strAssignerLoginID = objPeople.getLoginID();

		// 設定ファイル（Catalog.ini)から承認、否認URLを取得する
		CatalogLoEnv objEnv = new CatalogLoEnv();
		// 承認URL
		String strOkURL = objEnv.getAssign_ok_mail_url();
		// 否認URL
		String strNgURL = objEnv.getAssign_ng_mail_url();

		// 承認URLの作成
		String strOKUrl = strOkURL +
						"?LearnerID=" + strLearnerID +
						"&AssignerID=" + strAssignerID +
						"&AssignerPass=" + URLEncoder.encode( strAssignerPass, "UTF-8") +
						"&AssignerLoginID=" + strAssignerLoginID +
						"&AssignLoID=" + strAssignLoID +
						"&CatalogLoID=" + strCatalogLoID;


		// 否認URLの作成
		String strNGUrl = strNgURL +
						"?LearnerID=" + strLearnerID +
						"&AssignerID=" + strAssignerID +
						"&AssignerPass=" + URLEncoder.encode( strAssignerPass, "UTF-8" ) +
						"&AssignerLoginID=" + strAssignerLoginID +
						"&AssignLoID=" + strAssignLoID +
						"&CatalogLoID=" + strCatalogLoID;

		// 結果の作成
		String[] strResURL = new String[2];
		strResURL[0] = strOKUrl;
		strResURL[1] = strNGUrl;

		return strResURL;
	}
}
