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

//
//	MailSendAction.java メール送信Beanクラス
//			変更履歴
//				2004/01/08	新規作成	工藤明洋
//
package jp.co.ntt.lms.xms.common.mail;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import jp.co.ntt.lms.xmo.Mail.MailClient;
import jp.co.ntt.lms.xmo.Mail.MailConst;
import jp.co.ntt.lms.xmo.Mail.MailTemplateVO;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xms.common.user.User;
import jp.co.ntt.lms.xms.framework.XmsBusinessAction;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsRequest;
import jp.co.ntt.lms.xms.framework.XmsResponse;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;
import jp.co.ntt.lms.xms.login.base.OperateSession;
//import jp.co.ntt.lms.xms.logsumup.LoLogCommon_inc;

/**
 * メール送信処理クラスです。<BR>
 *	
 * メールテンプレートフレームを持つ画面からのメール送信処理を行います。
 *	
 */
public class MailSendBusinessAction extends XmsBusinessAction {

	// ログイン情報が取得できなかった場合の遷移先JSP定義
	private final String URL_LOGIN_REDIRECTOR = "LoginRedirector.vm";

	MailSendBean sendBean = new MailSendBean();
	
	List resultList = new ArrayList();

	/**
	 * 初期化処理を行います。<BR>
	 * 処理はありません。<BR>
	 * @param xmsRequest リクエストオブジェクト
	 * @param xmsResponse レスポンスオブジェクト
	 * @return なし
	 */
	protected void initProcessRequest( XmsRequest xmsRequest )
		throws XmsException	{
	}

	/**
	 * メール送信処理を行います。<BR>
	 * @param xmsRequest リクエストオブジェクト
	 * @param xmsResponse レスポンスオブジェクト
	 * @return なし
	 * @exception XmsException	処理中に例外が発生した場合
	 */
	protected void processRequest( XmsRequest xmsRequest, XmsResponse xmsResponse )
		throws XmsException {

		//LoLogCommon_inc cominc = new LoLogCommon_inc();

		// リクエスト情報を取得
		HttpServletRequest request = xmsRequest.getRequest();

		try {

			String strFromAddress = request.getParameter("from"); //cominc.charEncode(request.getParameter("from"));
			String strSubject = request.getParameter("title"); //cominc.charEncode(request.getParameter("title"));
			String strBody = request.getParameter("body"); //cominc.charEncode(request.getParameter("body"));
	
			// セッションを取得
			HttpSession session = request.getSession();
	
			// ログインチェック
			// セッションからログイン済み判定を取得
			// ユーザオブジェクトをセッションから取得
			User userObject = ( User ) session.getAttribute( OperateSession.USER_SESSION );
	
			// ログイン情報のチェック
			if( userObject == null ) {
				// ログイン済みではなかった場合
				// ログイン画面へリダイレクトする
				// ワーニングとする
				throw new XmsWarningException( URL_LOGIN_REDIRECTOR );
			}
	
			// ログインIDを取り出します。
			String strLoginID = userObject.getLoginID();
	
			// 送信先ユーザ情報の取得
			// セッションから送信先ユーザ情報を取得します。
			SendUser objSendUser = ( SendUser ) session.getAttribute( MailConst.SKEY_SENDUSER );
	
			if( objSendUser == null ) {
				// 送信先ユーザ情報が取得できなかった場合
				// システムエラーとする
				// デフォルトのシステムエラー画面へリダイレクトします。
				throw new XmsSystemException( "" );
			}
	
			// 送信先ユーザ情報から以下の情報を取り出します。
			// 		送信先ユーザID、送信インデックス、一括送信数
			int	iIndex = objSendUser.getIndex();
			int	iSendCountMax = objSendUser.getSendCountMax();
			Vector	vcSendUserList = objSendUser.getUserList();
			Vector	vcSendLoList = objSendUser.getLoList();
	
			// メールテンプレート情報から以下の情報を取り出します。
			// 		送信元ユーザID、題名、本文
			MailTemplateVO voMailInfo = new MailTemplateVO();

			voMailInfo.setFromAddress( strFromAddress );	// 送信元メールアドレス
			voMailInfo.setSubject( strSubject );			// 題名
			voMailInfo.setBody( strBody );					// 本文

			// インデックス位置から送信するユーザIDリストを抽出します。
			Vector vcUserList = new Vector();
			Vector vcLoList = new Vector();
			
			for(int i=iIndex; i<iSendCountMax + iIndex; i++) {
				// ユーザリストがまだある場合
				if (i != vcSendUserList.size()) {
					vcUserList.add((String)vcSendUserList.get(i));
					if (vcSendLoList != null) {
						vcLoList.add((String)vcSendLoList.get(i));
					}				
					// ループの最終に達した場合
					if (i == iSendCountMax + iIndex - 1) {
						if (iSendCountMax + iIndex == vcSendUserList.size()) {
							sendBean.setNextData(false);
							break;
						}
						objSendUser.setIndex(iSendCountMax + iIndex);
						sendBean.setNextData(true);
						break;
					}
					
				// ユーザリストが無くなった場合
				} else {
					sendBean.setNextData(false);
					break;
				}
			}
	
			sendMail( strLoginID, vcUserList, voMailInfo, vcLoList );

			int maxSendUser = vcSendUserList.size();
			// 残りの送信数を設定する
			maxSendUser -= objSendUser.getIndex();
			sendBean.setMailSendUserRest( maxSendUser );

			// 返却値オブジェクトのインスタンス生成
			xmsResponse.setBusinessBean( sendBean );
			// 返却値タイプを設定　当クラスはリダイレクトせずにJSPにフォワード
			xmsResponse.setOutType( XmsResponse.JSP );

			String businessStatus = objSendUser.getStatus();
			xmsResponse.setBusinessStatus(businessStatus);

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

	}

// ------------------ 内部関数 ----------------------------------
	/**
	 * メール送信を行います。<BR>
	 * 指定されたユーザリストのユーザに、入力されたメール情報を送信します。<BR>
	 * @param xmsRequest リクエストオブジェクト
	 * @param xmsResponse レスポンスオブジェクト
	 * @return なし
	 */
	private void sendMail(String strFromLoginID, Vector vcUserList, 
		MailTemplateVO voMailInfo, Vector vcLoList )
		throws XmsException {

		try {

			int intRet = 0;

			// メールXMOクライアントに対してメール送信を要求します。
			MailClient objMailC	  = new MailClient();

			// Vectorから配列へ変換
			String[] strUserIDList = (String[])vcUserList.toArray(new String[vcUserList.size()]);

			//メール送信
			Vector mvtResult = objMailC.sendMail( strFromLoginID,	// 送信元ログインID
												strUserIDList,		// メール送信先ユーザID群
												voMailInfo,			// メール送信元ユーザID
												vcLoList);			// LOID群

			if ( mvtResult == null || mvtResult.isEmpty() ){
				intRet = MailConst.RESULT_INTERNAL_ERR;
			}
			else{
				Object objOut = mvtResult.get(0);
				if( objOut instanceof Hashtable[] ) {
					//　Hashtableの場合は正常終了（SMTP通信は出来た）
					intRet = MailConst.RESULT_SUCCESS;
				} else if ( objOut instanceof Integer ){
					//　Integerの場合、送信自体が失敗
					throw new XmsSystemException("mail.w.send.transmissionfailure");	
				}
			}

			//ログ出力処理
			Hashtable[] htbResult = (Hashtable[])mvtResult.get(0);
			for (int i = 0; i < htbResult.length; i++) {
				outputLog(objMailC, intRet, htbResult[i]);
			}
			
			sendBean.setTransResultList(resultList);


		} catch(XmsException ex) {
			throw ex;	
		}
		catch (Exception ex) {
			//例外処理
			throw new XmsSystemException( ex );
		}
	}

	/**
	 * ログ出力処理を実行します。<BR>
	 * メール送信が異常な場合にのみ呼ばれます。
	 * @param objMCL メールクライアントインスタンス<BR>
	 * @param strUserID ユーザID<BR>
	 * @param strUserName ユーザ名<BR>
	 * @param intRet メールクライアント送信結果<BR>
	 * @param vctRet クライアントへの返却情報<BR>
	 * @return void <BR>
	 * @exception Exception
	 */
	private void outputLog(MailClient objMCL, int intRet, Hashtable htbResult)
		throws XmsException
	{
		try
		{
			outputConsole("ログ出力開始");

			Hashtable htbResultList = new Hashtable();

			// ユーザ名
			String strUserName = (String)htbResult.get(MailConst.USER_NAME);
			// ユーザID
			String strUserID = (String)htbResult.get(MailConst.USER_ID);
			// 返却情報作成
			htbResultList.put(MailConst.USER_NAME, strUserName);
			htbResultList.put(MailConst.LOGIN_ID, strUserID);


			String strLog = "メール送信結果:";
			if( intRet != MailConst.RESULT_SUCCESS )
			{
				// メール送信に失敗した場合
				//		  ユーザID			ユーザ名			DB登録結果				 メール送信結果
				strLog	= strLog
						+ strUserID + ":" + strUserName + ":" + MailConst.DB_RESULT_SUCCESS + ":" + MailConst.MAIL_RESULT_FAIL;
				//出力
				DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
				outputConsole(strLog);

				htbResultList.put(MailConst.SEND_RESULT, MailConst.MAIL_RESULT_FAIL);
				resultList.add(htbResultList);
			}
			else
			{
				int	nResult = 0;

				// 配送失敗メールの確認
				ArrayList objNgResult = objMCL.checkNgResult();

				if (objNgResult.contains(strUserID)) {

					//		  ユーザID			ユーザ名			DB登録結果				 メール送信結果
					strLog	= strLog
							+ strUserID + ":" + strUserName + ":" + MailConst.DB_RESULT_SUCCESS + ":" + MailConst.MAIL_RESULT_FAIL;
					//出力
					DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
					outputConsole(strLog);

					htbResultList.put(MailConst.SEND_RESULT, MailConst.MAIL_RESULT_FAIL);
					resultList.add(htbResultList);

					nResult = 1;

				}

				if( nResult != 1 ) {

					// 未配送メールの確認
					ArrayList objNotSendResult = objMCL.checkNotSendResult();
					if(objNotSendResult != null) {

						if (objNotSendResult.contains(strUserID)) {
							//		  ユーザID			ユーザ名			DB登録結果				 メール送信結果
							strLog	= strLog
									+ strUserID + ":" + strUserName + ":" + MailConst.DB_RESULT_SUCCESS + ":" + MailConst.MAIL_RESULT_NOTSEND;
							//出力
							DebugLog.write(this.getClass(), strLog, DebugLog.HIGHT);
							outputConsole(strLog);

							htbResultList.put(MailConst.SEND_RESULT, MailConst.MAIL_RESULT_NOTSEND);
							resultList.add(htbResultList);
						} else {
							//送信成功
							//		  ユーザID			ユーザ名			DB登録結果				 メール送信結果
							strLog	= strLog
									+ strUserID + ":" + strUserName + ":" + MailConst.DB_RESULT_SUCCESS + ":" + MailConst.MAIL_RESULT_SUCCESS;
							//出力
							DebugLog.write(this.getClass(), strLog, DebugLog.ROW);
							outputConsole(strLog);

							htbResultList.put(MailConst.SEND_RESULT, MailConst.MAIL_RESULT_SUCCESS);
							resultList.add(htbResultList);
						}
					}
				}
			}

			outputConsole("ログ出力終了");
		}
		catch (Exception ex)
		{
			//例外処理
			ex.printStackTrace();
			throw new XmsSystemException(MailConst.SYSTEM_ERR);
		}
	}

	/**
	 * デバッグ用<BR>
	*/
	private void outputConsole(String strMsg)
	{
		
	}
}