/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbECC0011A010TPDA
*	ソースファイル名：JSYejbECC0011A010TPDA.java
*	作成者			：EKek0070
*	日付			：2011年05月18日
*＜機能概要＞
*	SQLFacility
*	テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00	2011/05/19	富士通		新規作成
*
********************************************************************************/

package eo.ejb.cbs.sqlf;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANSQLFacility;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateDBAccessHandler;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import eo.common.util.JCCFileUtil;
import eo.common.util.JCCFrameworkException;
import eo.common.util.JCCUnCompressFileUtil;
import eo.ejb.cbs.cbsmsg.ECC0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECC0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECC0011A010CBSMsg2List;
import eo.ejb.cbs.cbsmsg.ECC0011A010CBSMsg3List;
import eo.ejb.cbm.entity.CC0011ETMsg;
import eo.ejb.cbm.entity.CC0131ETMsg;
import eo.ejb.cbm.entity.CC0031ETMsg;
import eo.ejb.common.JCCModelCommon;

/**
*
*  テンプレートDBアクセス部品　ECC0011A010_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbECC0011A010TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbECC0011A010TPDA()	{
	}
	
	/**
	*   ECC0011A010_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		Connection con2 = null;
		Connection con3 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CC0011ETMsg.getTableName());
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT CC0011.MAIL_RCV_NO, ")
					.append("        CC0011.MAIL_RCV_STAT, ")
					.append("        (SELECT ZM0171.CD_DIV_NM ")
					.append("           FROM ZM_M_CD_NM_KANRI ZM0171 ")
					.append("          WHERE ZM0171.CD_SBT_CD = 'CD00787' ")
					.append("            AND ZM0171.CD_DIV = CC0011.MAIL_RCV_STAT ")
					.append("            AND ZM0171.CD_TSTAYMD < ? ")
					.append("            AND ZM0171.CD_TENDYMD > ? ")
					.append("            AND ZM0171.MK_FLG = '1') AS MAIL_RCV_STAT_NM, ")
					.append("        CC0011.MAIL_RCV_CD, ")
					.append("        CC0011.MAIL_TITLE, ")
					.append("        CC0011.MAIL_TEXT, ")
					.append("        CC0011.MAIL_RCV_DTM, ")
					.append("        CC0011.MAIL_KAIFU_TRN_DTM, ")
					.append("        CC0011.MAIL_HNSIN_TRN_DTM, ")
					.append("        CC0011.MAIL_HIDSP_TRN_DTM, ")
					.append("        CC0011.MAIL_HEADER_IF, ")
					.append("        CC0011.ADD_DTM, ")
					.append("        CC0011.ADD_OPEACNT, ")
					.append("        CC0011.UPD_DTM, ")
					.append("        CC0011.UPD_OPEACNT, ")
					.append("        CC0011.DEL_DTM, ")
					.append("        CC0011.DEL_OPEACNT, ")
					.append("        CC0011.MK_FLG ")
					.append(" FROM   CC_T_MAIL_RCV CC0011 ");
			// SQL文_個別部1
			if ( "1".equals( inMsg.getObject(ECC0011A010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE CC0011.MAIL_RCV_NO = ? ")
						.append("   AND CC0011.MK_FLG = '0' ");
			}
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
// ■■メール受信対応 2011.05.23 Add Start
			String strOpeDate = "";
			
			try
			{
// ■■メール受信対応に伴う修正 2011.05.25 Start
				// 運用日時を取得
				strOpeDate = inMsg.getString(JCCModelCommon.getOpeDate(inMsg, null));
// ■■メール受信対応に伴う修正 2011.05.25 End
			}
			catch(Exception e)
			{
				throw new CAANRuntimeException(new JCCFrameworkException("運用日時の取得に失敗しました。",e));
			}
// ■■メール受信対応 2011.05.23 Add End
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(ECC0011A010CBSMsg.FUNC_CODE) ) ) {
// ■■メール受信対応 2011.05.23 Add Start
				// パラメータの設定(運用日時を指定)
				CAANJDBCUtil.setParam(pstmt, 1, strOpeDate);
				// パラメータの設定(運用日時を指定)
				CAANJDBCUtil.setParam(pstmt, 2, strOpeDate);
// ■■メール受信対応 2011.05.23 Add End
				// パラメータの設定(ＫＥＹ＿メール受信番号を指定)
				CAANJDBCUtil.setParam(pstmt, 3, inMsg.getObject(ECC0011A010CBSMsg.KEY_MAIL_RCV_NO));
			}
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// ECC0011A010CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  ECC0011A010CBSMsg1List.MAIL_RCV_NO
					, ECC0011A010CBSMsg1List.MAIL_RCV_STAT
					, ECC0011A010CBSMsg1List.MAIL_RCV_STAT_NM
					, ECC0011A010CBSMsg1List.MAIL_RCV_CD
					, ECC0011A010CBSMsg1List.MAIL_TITLE
					, ECC0011A010CBSMsg1List.MAIL_TEXT
					, ECC0011A010CBSMsg1List.MAIL_RCV_DTM
					, ECC0011A010CBSMsg1List.MAIL_KAIFU_TRN_DTM
					, ECC0011A010CBSMsg1List.MAIL_HNSIN_TRN_DTM
					, ECC0011A010CBSMsg1List.MAIL_HIDSP_TRN_DTM
					, ECC0011A010CBSMsg1List.MAIL_HEADER_IF
					, ECC0011A010CBSMsg1List.ADD_DTM
					, ECC0011A010CBSMsg1List.ADD_OPEACNT
					, ECC0011A010CBSMsg1List.UPD_DTM
					, ECC0011A010CBSMsg1List.UPD_OPEACNT
					, ECC0011A010CBSMsg1List.DEL_DTM
					, ECC0011A010CBSMsg1List.DEL_OPEACNT
					, ECC0011A010CBSMsg1List.MK_FLG
			};
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.ECC0011A010CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECC0011A010CBSMsg1List", outMsg1);
			
			//コネクション取得
			con2 = JSYejbConnection.getConnection(CC0131ETMsg.getTableName());
			
			
			// SQL文_基本部2
			sql_Buff.delete(0,sql_Buff.length());
			sql_Buff.append(" SELECT CC0131.MLAD_NO, ")
					.append("        CC0131.MLAD, ")
					.append("        CC0131.MLAD_SET_FIELD_CD, ")
					.append("        (SELECT ZM0171.CD_DIV_NM ")
					.append("           FROM ZM_M_CD_NM_KANRI ZM0171 ")
					.append("          WHERE ZM0171.CD_SBT_CD = 'CD00788' ")
					.append("            AND ZM0171.CD_DIV = CC0131.MLAD_SET_FIELD_CD ")
					.append("            AND ZM0171.CD_TSTAYMD < ? ")
					.append("            AND ZM0171.CD_TENDYMD > ? ")
					.append("            AND ZM0171.MK_FLG = '0') AS MLAD_SET_FIELD_CD_NM ")
					.append(" FROM   CC_T_MLAD CC0131 ");

			// SQL文_個別部2
			if ( "1".equals( inMsg.getObject(ECC0011A010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE CC0131.MAIL_RCV_NO = ? ")
						.append("   AND CC0131.MK_FLG = '0' ")
						.append(" ORDER BY ")
						.append("       CC0131.MLAD_SET_FIELD_CD ASC, ")
						.append("       CC0131.MLAD ASC ");
			}
			
			//2012/03/21 prepareStatementをクローズする start
			if(null != pstmt)
			{
				pstmt.close();
			}
			//2012/03/21 prepareStatementをクローズする end
			
			//prepareStatementにSQL文をセット
			pstmt = con2.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(ECC0011A010CBSMsg.FUNC_CODE) ) ) {
// ■■メール受信対応 2011.05.23 Add Start
				// パラメータの設定(ＫＥＹ＿メール受信番号を指定)
				CAANJDBCUtil.setParam(pstmt, 1, strOpeDate);
				// パラメータの設定(ＫＥＹ＿メール受信番号を指定)
				CAANJDBCUtil.setParam(pstmt, 2, strOpeDate);
// ■■メール受信対応 2011.05.23 Add End
				// パラメータの設定(ＫＥＹ＿メール受信番号を指定)
				CAANJDBCUtil.setParam(pstmt, 3, inMsg.getObject(ECC0011A010CBSMsg.KEY_MAIL_RCV_NO));
			}
			
			//2012/03/21 ResultSetをクローズする start
			if(null != rsltQuery)
			{
				rsltQuery.close();
			}
			//2012/03/21 ResultSetをクローズする start
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// ECC0011A010CBSMsgの明細にセットする項目
			String[] msgKeyList2 = {
					  ECC0011A010CBSMsg2List.MLAD_NO
					, ECC0011A010CBSMsg2List.MLAD
					, ECC0011A010CBSMsg2List.MLAD_SET_FIELD_CD
					, ECC0011A010CBSMsg2List.MLAD_SET_FIELD_CD_NM
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg2 = mapMessageList(rsltQuery,msgKeyList2,"eo.ejb.cbs.cbsmsg.ECC0011A010CBSMsg2List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECC0011A010CBSMsg2List", outMsg2);
			

			//コネクション取得
			con3 = JSYejbConnection.getConnection(CC0031ETMsg.getTableName());
			
			
			// SQL文_基本部3
			sql_Buff.delete(0,sql_Buff.length());
			sql_Buff.append(" SELECT CC0031.TEMP_FILE_NO, ")
					.append("        CC0031.EFILE_KANRI_NO, ")
					.append("        CC0031.FILE_NM, ")
					.append("        CC0041.EFILE ")
					.append(" FROM   CC_T_TEMP_FILE CC0031, ")
					.append("        CC_T_EFILE_KANRI CC0041 ");

			// SQL文_個別部3
			if ( "1".equals( inMsg.getObject(ECC0011A010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE CC0031.MAIL_RCV_NO = ? ")
						.append("   AND CC0031.MK_FLG = '0' ")
						.append("   AND CC0041.EFILE_KANRI_NO = CC0031.TEMP_FILE_NO(+) ")
						.append("   AND CC0041.GENE_ADD_DTM = (SELECT MAX(CC0041_1.GENE_ADD_DTM ) FROM CC_T_EFILE_KANRI CC0041_1 ")
// ■■メール受信対応に伴う修正 2011.05.25 Start
						.append("       WHERE CC0041_1.EFILE_KANRI_NO = CC0031.TEMP_FILE_NO ) ")
// ■■メール受信対応に伴う修正 2011.05.25 End
						.append("   AND CC0041.MK_FLG = '0' ")
						.append(" ORDER BY ")
						.append("       CC0031.TEMP_FILE_NO ASC ");
			}
			
			//2012/03/21 prepareStatementをクローズする start
			if(null != pstmt)
			{
				pstmt.close();
			}
			//2012/03/21 prepareStatementをクローズする end
			//prepareStatementにSQL文をセット
			pstmt = con3.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(ECC0011A010CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿メール受信番号を指定)
				CAANJDBCUtil.setParam(pstmt, 1, inMsg.getObject(ECC0011A010CBSMsg.KEY_MAIL_RCV_NO));
			}
			
			//2012/03/21 ResultSetをクローズする start
			if(null != rsltQuery)
			{
				rsltQuery.close();
			}
			//2012/03/21 ResultSetをクローズする start
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// ECC0011A010CBSMsgの明細にセットする項目
			String[] msgKeyList3 = {
					  ECC0011A010CBSMsg3List.TEMP_FILE_NO
					, ECC0011A010CBSMsg3List.EFILE_KANRI_NO
					, ECC0011A010CBSMsg3List.FILE_NM
					, ECC0011A010CBSMsg3List.EFILE
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg3 = mapMessageList(rsltQuery,msgKeyList3,"eo.ejb.cbs.cbsmsg.ECC0011A010CBSMsg3List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECC0011A010CBSMsg3List", outMsg3);
			

		} catch(SQLException e) {
			inMsg.set(ECC0011A010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
				if(con2 != null){
					closeConnection(con2);
				}
				if(con3 != null){
					closeConnection(con3);
				}
			}catch(SQLException e){
				inMsg.set(ECC0011A010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}

// ■■メール受信対応 2011.05.19 Start
		String errMsg = "";
		// (1)アプリケーションプロパティファイルからの設定値取得
		// 解凍ファイル格納作業ディレクトリ取得
		String dirUncompTMP = JCCModelCommon.getApplicationConst("DIR_UNCOMP_TMP");

		// 解凍ファイル格納作業ディレクトリが取得できない場合、システムエラーとして終了する。
		// 取得できた場合、解凍ファイル格納作業ディレクトリを内部変数へ設定する。
		if (null == dirUncompTMP || dirUncompTMP.isEmpty())
		{
			errMsg = "解凍ファイル格納作業ディレクトリ（キー：DIR_UNCOMP_TMP）が"+
				  "アプリケーションプロパティファイル（AplConst）にて設定されていません。";
				throw new CAANRuntimeException(new JCCFrameworkException(errMsg));
		}

		// (2) 電子ファイル解凍処理
		String workDir = "";
		String filePath = "";

		CAANMsg[] cAANMsgList = inMsg.getCAANMsgList("ECC0011A010CBSMsg3List");
		for(int i = 0; i < cAANMsgList.length; i++)
		{
			try{
// ■■メール受信対応に伴う修正 2011.05.29 Add Start
				//ファイル名の取得
				CAANMsg[] list = inMsg.getCAANMsgList(ECC0011A010CBSMsg.ECC0011A010CBSMSG3LIST);
				String zipFile = list[0].getString(ECC0011A010CBSMsg3List.FILE_NM);
				workDir = JCCFileUtil.createDirUid(dirUncompTMP);

				//ファイルのフルパスを取得
				zipFile = workDir + File.separator + zipFile;

				//ディレクトリの作成
				JCCFileUtil.createDir(zipFile);
// ■■メール受信対応に伴う修正 2011.05.29 Add End
			}
			// 作業ディレクトリの作成に失敗した場合
			catch(Exception e)
			{
				errMsg = "「作業ディレクトリの作成に失敗しました。" +
						"(ディレクトリ指定の誤り／書き込み権限／同名ディレクトリの有無を確認してください）："+ workDir + "」";
				try
				{
// ■■メール受信対応に伴う修正 2011.05.29 Add Start
					// 解凍ファイル格納作業ディレクトリの削除
					File workFile = new File(workDir);
					if (null != workFile && workFile.exists() && workFile.isDirectory())
					{
						JCCFileUtil.removeDir(workDir);
					}
// ■■メール受信対応に伴う修正 2011.05.29 Add End
				}
				catch (Exception ex)
				{
				}
// ■■メール受信対応に伴う修正 2011.05.29 Add Start
				throw new CAANRuntimeException(new JCCFrameworkException(errMsg, e));
// ■■メール受信対応に伴う修正 2011.05.29 Add End
			}

			byte[] efile = null;
			File file = null;
			ByteArrayInputStream bis = null;
			ByteArrayOutputStream bos = null;
			FileOutputStream fos = null;
			FileInputStream fis = null;
			OutputStream os = null;
			try
			{
				filePath = JCCFileUtil.createFileNameUid(workDir);
				file = new File(filePath);
				efile = (byte[])(cAANMsgList[i].getObject(ECC0011A010CBSMsg3List.EFILE));
				bis = new ByteArrayInputStream(efile);
				fos = new FileOutputStream(file);

				// 作成したファイルに、電子ファイルオブジェクトの書き込み
				os = JCCFileUtil.writeOutputStream(bis, fos);
				os.flush();
// ■■メール受信対応に伴う修正 2011.05.29 Add Start
				os.close();
// ■■メール受信対応に伴う修正 2011.05.29 Add End

			}
			// 電子ファイルオブジェクトの書き込みに失敗した場合
			catch (Exception e)
			{
				try
				{
					// 解凍ファイル格納作業ディレクトリの削除
					JCCFileUtil.removeDir(workDir);
				}
				catch (Exception ex)
				{
				}
				throw new CAANRuntimeException(new JCCFrameworkException("解凍前ファイルの生成に失敗しました。", e));
			}

			String uncompFilePath = null;
			try
			{
				// 解凍後のファイルパスの取得
				uncompFilePath = JCCUnCompressFileUtil.uncompressFile(filePath, workDir, "0");
			}
			catch (Exception e)
			{
				try
				{
					// 作業ディレクトリの削除
					JCCFileUtil.removeDir(workDir);
				}
				catch (Exception ex)
				{
				}
				throw new CAANRuntimeException("作業用ディレクトリの削除に失敗しました",e);
			}

			try
			{
				// 解凍後のファイルパスよりファイルオブジェクトを生成
				file = new File(uncompFilePath);
				fis = new FileInputStream(file);
				byte[] b = new byte[1];
				bos = new ByteArrayOutputStream();
				while(fis.read(b) > 0)
				{
					bos.write(b);
				}

				bos.close();
				fis.close();
				
				// byte[]型へ変換
				b = bos.toByteArray();
				// 電子ファイルへ格納
				cAANMsgList[i].set(ECC0011A010CBSMsg3List.EFILE, b);
			}
			catch (FileNotFoundException e)
			{
				throw new CAANRuntimeException(e);
			}
			catch (IOException e) 
			{
				throw new CAANRuntimeException(e);
			}

			try
			{
				//解凍ファイル格納作業ディレクトリの削除
				JCCFileUtil.removeDir(workDir);
			}
			// 作業ディレクトリの作成に失敗した場合
			catch (Exception e)
			{
				throw new CAANRuntimeException("作業用ディレクトリの削除に失敗しました",e);
			}
		}
// ■■メール受信対応 2011.05.19 End
	}
}
