/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*   モジュール名    ：JECC0041A110TPMA
*   ソースファイル名：JECC0041A110TPMA.java
*   作成者          ：富士通
*   日付            ：2011年05月20日
*＜機能概要＞
*   帳票生成独自処理部品です
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/07/07  富士通      新規作成
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

import java.rmi.server.UID;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.ArrayList;
import java.util.TreeSet;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
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.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.util.JCCFileUtil;
import eo.common.util.JCCSendFaxUtil;
import eo.common.util.JCCUnCompressFileUtil;
import eo.common.util.JCCListCreateUtil;
import eo.common.util.JCCFrameworkException;
import eo.common.util.JCCcomEncryptionUtil;

import eo.ejb.cbm.entity.ZM0311ETMsg;
import eo.ejb.cbs.cbsmsg.ECC0041A110CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECC0041A110CBSMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JCCejbEFile;

public class JECC0041A110TPMA implements TemplateMainHandler {
	
	/**
	 * コンストラクタです。
	 */
	public JECC0041A110TPMA()
	{
		super();
	}
	
	/** 画像ファイルを判定するための拡張子 */
	final static private String MEDIA_BMP  = ".BMP";
	final static private String MEDIA_JPG  = ".JPG";
	final static private String MEDIA_JPEG = ".JPEG";
	final static private String MEDIA_TIF  = ".TIF";
	final static private String MEDIA_TIFF = ".TIFF";
	final static private String MEDIA_PNG  = ".PNG";
	final static private String[] MEDIA_LIST = { MEDIA_BMP, MEDIA_JPG, MEDIA_JPEG, MEDIA_TIF, MEDIA_TIFF, MEDIA_PNG };
	
	/** 帳票定義体を判定するための拡張子 */
	final static private String TEIGI_SMD  = ".SMD";
	final static private String TEIGI_PMD  = ".PMD";
	final static private String TEIGI_OVD  = ".OVD";
	final static private String TEIGI_PSF  = ".PSF";
	final static private String TEIGI_BIP  = ".BIP";
	final static private String TEIGI_DSE  = ".DSE";
	final static private String[] TEIGI_LIST = { TEIGI_SMD, TEIGI_PMD, TEIGI_OVD, TEIGI_PSF, TEIGI_BIP, TEIGI_DSE };
	
	/**
	 * 帳票生成処理及びFAX送信処理を行います
	 * <br>
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @throws JCCFrameworkException
	 * @throws Exception
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws JCCFrameworkException, Exception
	{
		
		// 自動生成不可の単関連チェックはここで行う
		if("1".equals(inCBSMsg.getString(ECC0041A110CBSMsg.FUNC_CODE)))
		{
			// 機能コードが1指定でデータファイルの電子ファイル管理番号が指定されていない
			if(null == inCBSMsg.getString(ECC0041A110CBSMsg.DATA_FILE_NO))
			{
				inCBSMsg.set(ECC0041A110CBSMsg.DATA_FILE_NO_ERR, "E1");
				inCBSMsg.set(ECC0041A110CBSMsg.STATUS, StatusCodes.ITEM_RELATION_ERR);
				return;
			}
		}
		if("2".equals(inCBSMsg.getString(ECC0041A110CBSMsg.FUNC_CODE)))
		{
			// 機能コードが2指定でデータファイルが指定されていない
			if(null == inCBSMsg.getObject(ECC0041A110CBSMsg.DATA_FILE))
			{
				inCBSMsg.set(ECC0041A110CBSMsg.DATA_FILE_ERR, "E2");
				inCBSMsg.set(ECC0041A110CBSMsg.STATUS, StatusCodes.ITEM_RELATION_ERR);
				return;
			}
		}
		//返却用のCAANMsg生成
		CAANMsg[] outMsgList = new CAANMsg[1];
		CAANMsg outMsg = new CAANMsg("eo.ejb.cbs.cbsmsg.ECC0041A110CBSMsg1List");
		// 帳票生成情報の格納領域
		HashMap<String, Object> mapChohyoInfo = new HashMap<String, Object>();
		// Fax送信情報の格納領域
		HashMap<String, Object> mapFaxInfo = new HashMap<String, Object>();
		// 生成した帳票のフルパス
		String outPath = null;
		// Fax送信結果コード設定領域
		String resultCode = null;
		try
		{
			// 帳票生成情報のチェック及び組立てを行う
			if(chkChohyoItemRelation(inCBSMsg, mapChohyoInfo) == false)
			{
				return;
			}
			// 処理種別が"3"(FAXイメージFTP転送の場合
			// Fax送信情報のチェック及び組立てを行う
			if("3".equals(inCBSMsg.getString(ECC0041A110CBSMsg.TRAN_SBT)))
			{
				if(chkFaxItemRelation(inCBSMsg, mapFaxInfo) == false)
				{
					return;
				}
			}
			// 帳票を生成する
			outPath = createChohyo(inCBSMsg, mapChohyoInfo);
			
			// システム日付、帳票ID、UIDを組み合せて出力パラメータの帳票名を構築(dotFAXの自動送信の仕様上アンダースコア"_"は使用できない)
			File fl = new File(outPath);
			StringBuffer outName = new StringBuffer();
			
			if("3".equals(inCBSMsg.getString(ECC0041A110CBSMsg.TRAN_SBT)))
			{
				// 環境識別コードの取得
				String skbtCd = JCCModelCommon.getApplicationConst("KANKYO_SKBT_CD");
				if(null == skbtCd)
				{
					throw new JCCFrameworkException("APLConstに環境識別コードが設定されていません。");
				}
				outName.append("AS_" + (String)mapFaxInfo.get("FAX_TEL_NUMBER") + "_" + skbtCd);
			}
			
			outName.append(JCCModelCommon.getSysDateTimeStamp());
			outName.append(inCBSMsg.getString(ECC0041A110CBSMsg.USER_ID));
			String tmpFileName = fl.getName();
			tmpFileName = tmpFileName.replace("_", "");
			outName.append(tmpFileName);
			String tmpUID = new UID().toString();
			tmpUID = tmpUID.replace(":", "0");
			tmpUID = tmpUID.replace("-", "0");
			tmpUID = tmpUID.replace("_", "0");
			outName.insert(outName.lastIndexOf("."), tmpUID);
			
			// File名とFileパスを変更
			String chgPath = outPath;
			chgPath = chgPath.replace(fl.getName(), outName.toString());
			fl.renameTo(new File(chgPath));
			
			// 処理種別が"3"(FAXイメージFTP転送)の場合
			if("3".equals(inCBSMsg.getString(ECC0041A110CBSMsg.TRAN_SBT)))
			{
				// FAX送信データのフルパスをマッピング
				String[] faxImagePath = new String[1];
				faxImagePath[0] = chgPath;
				mapFaxInfo.put("FAX_IMAGE_PATH", faxImagePath);
				
				// FAX送信
				resultCode = sendFax(inCBSMsg, mapFaxInfo);
				
				// FAX送信結果コードをセット
				outMsg.set(ECC0041A110CBSMsg1List.SEND_RESULT_CD, resultCode);
			}
			else
			{
				outMsg.setNull(ECC0041A110CBSMsg1List.SEND_RESULT_CD);
			}
			
			// 帳票ファイルのbyte配列を出力用CAANMsgにセット
			byte[] outData = createBytes(chgPath);
			outMsg.set(ECC0041A110CBSMsg1List.OUTPUT_CHOHYO, outData);

			// 出力ファイル名を返却用のCAANMsgにセット			
			outMsg.set(ECC0041A110CBSMsg1List.OUTPUT_CHOHYO_NM, outName.toString());
			
			// 出力用CAANMsgListに値をセット
			outMsgList[0] = outMsg;
			inCBSMsg.set(ECC0041A110CBSMsg.ECC0041A110CBSMSG1LIST, outMsgList);
			
			// テストモードの時は生成したmap情報をログ表示する
			if(isTestMode())
			{
				printLog(inCBSMsg, inContext, mapChohyoInfo);
				printLog(inCBSMsg, inContext, mapFaxInfo);
			}
		}
//		catch(JCCFrameworkException e)
//		{
//			throw e;
//		}
//		catch(Exception e)
//		{
//			throw e;
//		}
		finally
		{
			// 生成した一時ファイル保存先ディレクトリの削除
			if(null != mapChohyoInfo.get("CHOHYO_TEIGI_PATH"))
			{
				deleteFile((String)mapChohyoInfo.get("CHOHYO_TEIGI_PATH"));
			}
		}
		return;
	}
	
	/**
	 * 帳票生成情報の関連チェック及び組立てを行います
	 * <br>
	 * @param inCBSMsg CBSメッセージ
	 * @param mapChohyoInfo 帳票生成情報
	 * @throws JCCFrameworkException
	 */
	private boolean chkChohyoItemRelation(CAANMsg inCBSMsg, HashMap<String, Object> mapChohyoInfo) throws JCCFrameworkException
	{
		// 帳票定義体の格納領域(圧縮ファイル)
		byte[] zipFile = null;
		// 帳票定義体の一時ファイルフルパス
		String zipFilePath = null;
		
		// 入力データの格納領域
		byte[] csvFile = null;
		// 帳票定義体の一時ファイルフルパス
		String csvFilePath = null;
		
		// 帳票ID及び帳票名
		String   chohyoID = null;
		String[] chohyoNm = null;
		
		// 組込みメディアファイルのパス
		String[] mediaDataPath = null;
		
		// 出力帳票種別
		String chohyoKind = null;
			
		// 帳票定義体の一時保存先フォルダのパス
		String tmpDir = JCCModelCommon.getApplicationConst("CHOHYO_DATA_TMP_DIR");
		if(null == tmpDir)
		{
			throw new JCCFrameworkException("APLConstに帳票定義体の一時保存先ディレクトリが設定されていません。");
		}
		// 帳票定義体の解凍先に指定するフォルダのパス
		String unCompPath = null;
		
		// 帳票サーバー名の取得
		String chohyoServerNm = JCCModelCommon.getApplicationConst("CHOHYO_SERVER_NM");
		if(null == chohyoServerNm)
		{
			throw new JCCFrameworkException("APLConstに帳票サーバー名またはIPアドレスが設定されていません。");
		}
		
		// 帳票データの文字コード取得
		String chohyoMojiCd = JCCModelCommon.getApplicationConst("CHOHYO_DATA_MOJI_CD");
		if(null == chohyoMojiCd)
		{
			// 指定がない場合はUTF-8とする
			chohyoMojiCd = "UTF-8";
		}
		// pdf文書情報ファイルパス取得
		String pdfInfoFilePath = JCCModelCommon.getApplicationConst("PDF_INFO_FILE_PATH");
		if(null == pdfInfoFilePath)
		{
			throw new JCCFrameworkException("APLConstにpdf文書情報ファイルパスが設定されていません。");
		}
		// 2012/02/29 帳票定義体格納ディレクトリパス取得 start
		String chohyoTeigiPath = JCCModelCommon.getApplicationConst("CHOHYO_TEIGI_DIR");
		if(null == chohyoTeigiPath)
		{
			throw new JCCFrameworkException("APLConstに帳票定義体格納先パスが設定されていません。");
		}
		// 2012/02/29 帳票定義体格納ディレクトリパス取得 end
		
		try
		{	
			// 入力パラメータで指定された帳票データの電子ファイル管理番号から電子ファイルを取得
			try
			{
				// 2012/02/29 帳票定義体の格納先をテーブルからサーバディレクトリ上に変更 start 
				//zipFile = JCCejbEFile.getEFile(inCBSMsg.getString(ECC0041A110CBSMsg.CHOHYO_TEIGI_NO));
				zipFile = createBytes(chohyoTeigiPath + File.separator + inCBSMsg.getString(ECC0041A110CBSMsg.CHOHYO_TEIGI_NO) + ".zip");
				// 2012/02/29 帳票定義体の格納先をテーブルからサーバディレクトリ上に変更 end
			}
			catch(JCCFrameworkException jcce)
			{
				// 指定の電子ファイル管理番号に紐づく情報が取得できない(EA)
				inCBSMsg.set(ECC0041A110CBSMsg.CHOHYO_TEIGI_NO_ERR, "EA");
				inCBSMsg.set(ECC0041A110CBSMsg.STATUS, StatusCodes.RELATION_ERR);
				return false;
			}
			// サービスIF機能番号が"1"(入力データを電子ファイル管理テーブルから取得)の場合
			if("1".equals(inCBSMsg.getString(ECC0041A110CBSMsg.FUNC_CODE)))
			{
				// 入力パラメータで指定された入力データの電子ファイル管理番号から電子ファイルを取得
				try
				{
					csvFile = JCCejbEFile.getEFile(inCBSMsg.getString(ECC0041A110CBSMsg.DATA_FILE_NO));
				}
				catch(JCCFrameworkException jcce)
				{
					Object obj = jcce.getCausedByObject();
					if(null != obj)
					{
						String str = obj.toString();
						String chk = "指定の電子ファイル管理番号に紐づく情報が取得できませんでした。";
						if(null != str)
						{
							if(str.indexOf(chk) >= 0)
							{
								// 指定の電子ファイル管理番号に紐づく情報が取得できない(EB)
								inCBSMsg.set(ECC0041A110CBSMsg.DATA_FILE_NO_ERR, "EB");
								inCBSMsg.set(ECC0041A110CBSMsg.STATUS, StatusCodes.RELATION_ERR);
								return false;
							}
						}
					}
					throw jcce;
				}
			}
			// 入力データをサービスIFの入力パラメータで指定する場合
			else
			{
				csvFile = (byte[])inCBSMsg.getObject(ECC0041A110CBSMsg.DATA_FILE);
			}
			// 電子ファイルの解凍先フォルダを生成する
			unCompPath = JCCFileUtil.createFileNameUid(tmpDir);
			if(makeDir(unCompPath) == false)
			{
				throw new JCCFrameworkException("作業ディレクトリの作成に失敗しました");
			}
			
			// 帳票定義体のbyte配列をファイルに書込む
			zipFilePath = JCCFileUtil.createFileNameUid(unCompPath) ;
			createDataFile(zipFilePath, zipFile);
			
			// 入力データのbyte配列をファイルに書込む
			csvFilePath = JCCFileUtil.createFileNameUid(unCompPath) + ".csv";
			createDataFile(csvFilePath, csvFile);
			
			// 帳票定義体のzipファイルを解凍する
			String[] pathList = JCCUnCompressFileUtil.uncompressFileMulti(zipFilePath, unCompPath, "0");
			if(null == pathList || pathList.length == 0)
			{
				throw new JCCFrameworkException("帳票定義体(群)の圧縮形式が不正です");
			}
			
			// 解凍したファイルのパスから帳票ID、帳票定義体名(リスト)、画像ファイルの情報を取得する
			String extStr = null;
			HashMap<String, String> teigiMap = new HashMap<String, String>();
			ArrayList<String> mediaAry = new ArrayList<String>();
			for(int i = 0; i < pathList.length; i++)
			{
				// 取得したファイルの拡張子を判定
				extStr = pathList[i].substring(pathList[i].lastIndexOf("."));
				
				// 画像ファイルの場合
				if(isMediaFile(extStr))
				{
					mediaAry.add(pathList[i]);
				}
				// 定義体の場合
				else if(isTeigiFile(extStr))
				{
					// 拡張子を除去してHashMapのキーにセット
					String tmpStr = new File(pathList[i]).getName();
					tmpStr= tmpStr.substring(0, tmpStr.lastIndexOf("."));
					teigiMap.put(tmpStr, "");
				}
				// その他のファイルが混入している場合は読み飛ばす(エラー無し)
			}
			// 帳票名をString[]にセット
			Set keySet = teigiMap.keySet();
			keySet = new TreeSet(keySet);
			chohyoNm = (String[])keySet.toArray(new String[0]);
			// 帳票IDを取得
			if(chohyoNm[0].length() >= 10)
			{
				chohyoID = chohyoNm[0].substring(0, 10);
			}
			else
			{
				chohyoID = chohyoNm[0];
			}
			// メディアファイルパスをString[]にセット
			mediaDataPath = (String[])mediaAry.toArray(new String[0]);
			
			// csvデータのマスキングを行う
			csvFilePath = JCCModelCommon.maskingChyohyoFile(chohyoID, csvFilePath);
			
			// 出力する帳票の種別を決定する
			if("2".equals(inCBSMsg.getString(ECC0041A110CBSMsg.TRAN_SBT)))
			{
				// エクセル形式
				chohyoKind = "0";
			}
			else
			{
				// PDF形式
				chohyoKind = "1";
			}
			
			// 帳票生成情報のマッピングを行う
			mapChohyoInfo.put("CHOHYO_SERVER_NM", chohyoServerNm);			// 帳票サーバー名
			mapChohyoInfo.put("CHOHYO_NM", chohyoNm);						// 帳票名
			mapChohyoInfo.put("CHOHYO_KIND", chohyoKind);					// 帳票種別
			mapChohyoInfo.put("CHOHYO_TEIGI_PATH", unCompPath);				// 帳票定義体格納先パス
			mapChohyoInfo.put("CHOHYO_DATA_PATH", csvFilePath);				// 帳票入力データのパス
			mapChohyoInfo.put("CHOHYO_MEDIA_PATH", mediaDataPath);			// 帳票組込みメディアデータのパス
			mapChohyoInfo.put("CHOHYO_MOJI_CD", chohyoMojiCd);				// 帳票入力データの文字コード
			mapChohyoInfo.put("PDF_INFO_FILE_PATH", pdfInfoFilePath);		// pdf文書情報ファイルパス
		}
		catch(Exception e)
		{
			throw new JCCFrameworkException(e);
		}
		finally
		{
			if(null != unCompPath)
			{
				if(mapChohyoInfo.containsKey("CHOHYO_TEIGI_PATH") == false)
				{
					// 削除用のディレクトリに値がセットされていない場合はパスをセットしておく
					mapChohyoInfo.put("CHOHYO_TEIGI_PATH", unCompPath);
				}
			}
		}
		return true;
	}
	
	/**
	 * Fax送信情報の関連チェック及び組立てを行います
	 * <br>
	 * @param inCBSMsg CBSメッセージ
	 * @param mapChohyoInfo 帳票生成情報
	 * @throws JCCFrameworkException
	 */
	private boolean chkFaxItemRelation(CAANMsg inCBSMsg, HashMap<String, Object> mapFaxInfo) throws JCCFrameworkException
	{
		// システムパラメータの取得領域
		String[] sysParam = null;
		
		// FAXサーバー名の取得
		String faxServerNm = JCCModelCommon.getApplicationConst("FAX_SERVER_NM");
		if(null == faxServerNm)
		{
			throw new JCCFrameworkException("APLConstにFAXサーバー名またはIPアドレスが設定されていません。");
		}
		
		// FAXサーバーポート番号名の取得
		String faxPortNum = JCCModelCommon.getApplicationConst("FAX_PORT_NUM");
		if(null == faxPortNum)
		{
			throw new JCCFrameworkException("APLConstにFAXサーバーのポート番号が設定されていません。");
		}
		
		// FAXサーバーユーザ名
		String faxUserNm = JCCModelCommon.getApplicationConst("FAX_USER_NM");
		if(null == faxUserNm)
		{
			throw new JCCFrameworkException("APLConstにFAXサーバーのユーザ名が設定されていません。");
		}
		
		// FAXサーバーパスワード（暗号化済み）
		String faxPassword = JCCModelCommon.getApplicationConst("FAX_PASSWORD");
		if(null == faxPassword)
		{
			throw new JCCFrameworkException("APLConstにFAXサーバーのパスワードが設定されていません。");
		}
		try 
		{
			String encKey = JCCModelCommon.getApplicationConst("ENCRYPT_KEY");
			if(null == encKey)
			{
				throw new JCCFrameworkException("APLConstにパスワード復号化キーが設定されていません。");
			}
			
			// パスワード復号化
			faxPassword = JCCcomEncryptionUtil.decrypt(encKey, faxPassword);
		}
		catch(Throwable e)
		{
			throw new JCCFrameworkException("FAXサーバーパスワードの復号化処理で例外が発生しました。", e);
		}
		
		// FAX自動送信データの転送先フォルダのパス
		String faxSendDir = JCCModelCommon.getApplicationConst("FAX_SEND_DIR");
		if(null == faxSendDir)
		{
			throw new JCCFrameworkException("APLConstにFAXイメージのFTP転送先ディレクトリが設定されていません。");
		}
		
		// FAX自動送信データの転送リトライ間隔
		String faxRetryInterval = JCCModelCommon.getApplicationConst("FAX_FTP_RETRY_INTERVAL");
		if(null == faxRetryInterval)
		{
			throw new JCCFrameworkException("APLConstにFAXイメージのFTP転送リトライ間隔が設定されていません。");
		}
		
		// FAX自動送信データの転送リトライ回数(個別)
		String faxRetryCntUni = JCCModelCommon.getApplicationConst("FAX_FTP_RETRY_COUNT_UNI");
		if(null == faxRetryCntUni)
		{
			throw new JCCFrameworkException("APLConstにFAXイメージのFTP転送リトライ回数(個別)が設定されていません。");
		}
		
		// FAX自動送信データの転送リトライ回数(全体)
		String faxRetryCntGene = JCCModelCommon.getApplicationConst("FAX_FTP_RETRY_COUNT_GEN");
		if(null == faxRetryCntGene)
		{
			throw new JCCFrameworkException("APLConstにFAXイメージのFTP転送リトライ回数(全体)が設定されていません。");
		}
		
		// システムパラメータの取得
		sysParam = getSystemParam(inCBSMsg);
		if(null == sysParam || null == sysParam[0])
		{
			// 指定のFAX送信コードに紐づく情報が取得できない(EC)
			inCBSMsg.set(ECC0041A110CBSMsg.CHOHYO_OPUT_ENV_SKBT_CD_ERR, "EC");
			inCBSMsg.set(ECC0041A110CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return false;
		}
		// FAX送信先電話番号のドメインチェック
		if(HalfCharCheck.isTelno2Check(sysParam[0]) == false)
		{
			throw new JCCFrameworkException("指定された電話番号の形式が不正です");
		}
		
		// FAX送信情報のマッピングを行う
		mapFaxInfo.put("FAX_SERVER_NM", faxServerNm);					// FAXサーバー名
		mapFaxInfo.put("FAX_PORT_NUM", faxPortNum);						// FAXサーバーポート番号
		mapFaxInfo.put("FAX_USER_NM", faxUserNm);						// FAXサーバーユーザ名
		mapFaxInfo.put("FAX_PASSWORD", faxPassword);					// FAXサーバーパスワード
		mapFaxInfo.put("FAX_SEND_DIR", faxSendDir);						// FAX自動送信データの転送先フォルダのパス
		mapFaxInfo.put("FAX_FTP_RETRY_INTERVAL", faxRetryInterval);		// FAXイメージFTP転送リトライ間隔
		mapFaxInfo.put("FAX_FTP_RETRY_COUNT_UNI", faxRetryCntUni);		// FAXイメージFTP転送リトライ回数(個別)
		mapFaxInfo.put("FAX_FTP_RETRY_COUNT_GEN", faxRetryCntGene);		// FAXイメージFTP転送リトライ回数(全体)
		mapFaxInfo.put("FAX_TEL_NUMBER", sysParam[0]);					// FAX送信先電話番号
		
		return true;
	}
	
	/**
	 * 帳票生成を行います
	 * <br>
	 * @param inCBSMsg CBSメッセージ
	 * @param mapChohyoInfo 帳票生成情報
	 * @return outPath 出力した帳票のパス
	 * @throws JCCFrameworkException
	 */
	private String createChohyo(CAANMsg inCBSMsg, HashMap<String, Object> mapChohyoInfo) throws JCCFrameworkException
	{
		String outPath = null;
		try
		{
			// スタブ環境
			if(isTestMode())
			{
				String tmpPath = JCCModelCommon.getApplicationConst("PRINT_TEST_OUTPUTFILE");
				byte[] tmpbyte = createBytes(tmpPath);
				outPath = (String)mapChohyoInfo.get("CHOHYO_TEIGI_PATH");
				String[] nm = (String[])mapChohyoInfo.get("CHOHYO_NM");
				outPath = outPath + File.separator + nm[0];
				if("0".equals((String)mapChohyoInfo.get("CHOHYO_KIND")))
				{
					outPath = outPath + ".xlsx";
				}
				else
				{
					outPath = outPath + ".pdf";
				}
				createDataFile(outPath, tmpbyte);
			}
			// サーバー環境
			else
			{
				outPath = JCCListCreateUtil.callListCreator(mapChohyoInfo);
			}
		}
		catch(Exception e)
		{
			throw new JCCFrameworkException(e);
		}
		return outPath;
	}
	
	/**
	 * 帳票生成を行います
	 * <br>
	 * @param inCBSMsg CBSメッセージ
	 * @param mapChohyoInfo FAX送信情報
	 * @return sendResult 送信結果コード
	 * @throws JCCFrameworkException
	 */
	private String sendFax(CAANMsg inCBSMsg, HashMap<String, Object> mapFaxInfo) throws JCCFrameworkException
	{
		String sendResult = null;
		try
		{
			// FAXイメージをFTP転送する
			sendResult = JCCSendFaxUtil.sendFaxImageFTP(mapFaxInfo);
			if("0".equals(sendResult) == false)
			{
				// エラーの場合はコードの先頭に"3"を付与
				sendResult = "3" + sendResult;
			}
		}
		catch(Exception e)
		{
			throw new JCCFrameworkException(e);
		}
		return sendResult;
	}
	
	/**
	 * 生成した一時ファイルをディレクトリごと削除します
	 * <br>
	 * @param path 消去するディレクトリのパス
	 */	
	private void deleteFile(String path)
	{
		JCCFileUtil.removeDir(path);
	}
	
	/**
	 * システムパラメータの取得
	 * 
	 * @return inCBSMsg CBSメッセージ
	 * @throws Exception
	 */
	private String[] getSystemParam(CAANMsg inCBSMsg) throws JCCFrameworkException
	{
		String faxSkbtCd = inCBSMsg.getString(ECC0041A110CBSMsg.CHOHYO_OPUT_ENV_SKBT_CD);
		String[] sysParam = new String[3];
		
		//------------------------------------------------------------------------
		// システムパラメータを取得する
		//------------------------------------------------------------------------
		Connection con = JSYejbConnection.getConnection(ZM0311ETMsg.getTableName());
		StringBuffer sql = new StringBuffer();
		
		// SQL文の組み立て
		sql.append("SELECT ");
		sql.append("ZM0311.SYS_PARAM_SETTE_VALUE_1, ");
		sql.append("ZM0311.SYS_PARAM_SETTE_VALUE_2, ");
		sql.append("ZM0311.SYS_PARAM_SETTE_VALUE_3  ");
		sql.append("FROM ");
		sql.append("ZM_M_SYS_PARAM_KNRI ZM0311 ");
		sql.append("WHERE ");
		sql.append("ZM0311.SYS_PARAM_BUNRUI_CD = 'FAXSEND' ");
		sql.append("AND ");
		sql.append("ZM0311.SYS_PARAM_ID = ? ");
		sql.append("AND ");
		sql.append("MK_FLG = '0'");
		
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try
		{
			// PreparedStatementの設定
			stmt = con.prepareStatement(sql.toString());
			// Fax用帳票識別コードを指定
			stmt.setString(1, faxSkbtCd);
			// SQL発行
			rs = stmt.executeQuery();
			// 取得件数が0件以上のnull復帰
			if (rs.next() == false)
			{
				return null;
			}
			sysParam[0] = rs.getString("SYS_PARAM_SETTE_VALUE_1");
			sysParam[1] = rs.getString("SYS_PARAM_SETTE_VALUE_2");
			sysParam[2] = rs.getString("SYS_PARAM_SETTE_VALUE_3");
		}
		// SQLExceptionが発生した場合
		catch (SQLException e)
		{
			// JCCFrameworkExceptionをスロー
			throw new JCCFrameworkException("システムパラメータ検索時にエラーが発生しました", e);
		}
		// クローズ
		finally
		{
			if (null != rs)
			{
				try
				{
					rs.close();
				}
				catch(SQLException e)
				{
					throw new JCCFrameworkException(e);
				}
			}
			if (null != stmt)
			{
				try
				{
					stmt.close();
				}
				catch(SQLException e)
				{
					throw new JCCFrameworkException(e);
				}
			}
			if (null != con)
			{
//				try
//				{
					CAANConnectionMgr.getInstance().close(con);
//				}
//				catch(Exception e)
//				{
//					throw new JCCFrameworkException(e);
//				}
			}
		}
		return sysParam;
	}
	
	/**
	 * 指定されたパスに対してディレクトリが存在しなければ
	 * ディレクトリを作成する（排他制御）
	 * 
	 * @param path	ディレクトリを作るパス
	 * @return 作成成否
	 */	
	private synchronized static boolean makeDir(String path)
	{
		File fl = null;
		if(path == null)
		{
			return false;
		}		
		fl = new File(path);
		if(fl.exists() == false)
		{
			if(fl.mkdirs() == true)
			{
				return true;
			}
		}
		return false;
	}

	/**
	 * 指定されたパスに対してbyte配列からファイルに書出す
	 * 
	 * @param 書出し先のファイルパス
	 * @param ファイルのバイナリデータ
	 * @throws JCCFrameworkException
	 */
	private void createDataFile(String path, byte[] inData) throws JCCFrameworkException
	{
		FileOutputStream os = null;
		BufferedOutputStream bos = null;
		try
		{
			File fl = new File(path);
			if(fl.exists() == false)
			{
				fl.createNewFile();
			}
			os = new FileOutputStream(path);
			bos = new BufferedOutputStream(os, 5120);
			for(int i = 0; i < inData.length; i++ )
			{
				bos.write(inData[i]);
			}
			bos.flush();
		}
		catch(IOException e)
		{
			throw new JCCFrameworkException("ファイルの書き出しに失敗しました", e);
		}
		finally
		{
			try
			{
				if(null != bos)
				{
					bos.close();
				}
				if(null != os)
				{
					os.close();
				}
			}
			catch(Exception e)
			{
				// クローズエラーは何もしない
				;
			}
		}
		return;
	}
	
	/**
	 * 指定されたパスから返却用byte配列にデータを格納する
	 * 
	 * @param 読込ファイルパス
	 * @return データを格納したbyte配列
	 * @throws JCCFrameworkException
	 */
	private byte[] createBytes(String path) throws JCCFrameworkException
	{
		//返却用のbyte[]の生成
		byte[] readData = null;
		FileInputStream is = null;
		BufferedInputStream bis = null;
		try
		{
			//ファイルパスからストリームを取得
			is = new FileInputStream(path);
			readData = new byte[is.available()];
			int ret = 0;
			bis = new BufferedInputStream(is, 5120);
			while(ret != -1)
			{
				ret = bis.read(readData);
				if(ret == -1)
				{
					break;
				}
			}
		}
		catch(IOException e)
		{
			throw new JCCFrameworkException("ファイルの読出しに失敗しました", e);
		}
		finally
		{
			try
			{
				if(null != bis)
				{
					bis.close();
				}
				if(null != is)
				{
					is.close();
				}
			}
			catch(Exception e)
			{
				// クローズエラーは何もしない
				;
			}
		}
		return readData;
	}
	/**
	 * 指定された拡張子が画像ファイルかどうかを確認する(大文字小文字を区別しない)
	 * 
	 * @param ext 判定したい拡張子の文字列
	 * @return 画像ファイルの場合trueを返却する
	 */
	private boolean isMediaFile(String ext)
	{
		if(null == ext)
		{
			return false;
		}
		// 拡張子を大文字化する
		String extUp = ext.toUpperCase();
		for(int i = 0; i < MEDIA_LIST.length; i++)
		{
			if(extUp.equals(MEDIA_LIST[i]))
			{
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 指定された拡張子が帳票定義体かどうかを確認する(大文字小文字を区別しない)
	 * 
	 * @param ext 判定したい拡張子の文字列
	 * @return 画像ファイルの場合trueを返却する
	 */
	private boolean isTeigiFile(String ext)
	{
		if(null == ext)
		{
			return false;
		}
		// 拡張子を大文字化する
		String extUp = ext.toUpperCase();
		for(int i = 0; i < TEIGI_LIST.length; i++)
		{
			if(extUp.equals(TEIGI_LIST[i]))
			{
				return true;
			}
		}
		return false;
	}
	
	/**
	 * アプリケーションプロパティファイルの設定からテストモードかどうかの
	 * 判定を行います。
	 * <br>
	 * @return テストモード設定の場合 trueを返却する。
	 */
	private boolean isTestMode()
	{
		String mode = JCCModelCommon.getApplicationConst("PRINT_TEST_MODE");
		if (mode != null && "ON".equals(mode.toUpperCase()))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * マッピングした情報をログ出力します
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @param inMap ログ出力したいHashMapの情報
	 */
	private void printLog(CAANMsg inCBSMsg, AgentDispatchContext inContext, HashMap<String, Object> inMap)
	{
		String nl = System.getProperty("line.separator");
		String key = null;
		String value = null;
		StringBuffer buf = new StringBuffer(nl);
		Set keySet = inMap.keySet();
		Iterator keyIte = keySet.iterator();
		while(keyIte.hasNext())
		{
			key = (String)keyIte.next();
			if(inMap.get(key) instanceof String[])
			{
				buf.append(key + "=" + nl );
				String[] list = (String[])inMap.get(key);
				for(int i = 0; i < list.length; i++)
				{
					buf.append("    "+ list[i] + nl);
				}
			}
			else
			{
				value = (String)inMap.get(key);
				buf.append(key + "=" + value + nl);
			}
		}
		JSYejbLog.outlog(inContext, JSYejbLog.DEBUG, this.getClass(), buf.toString());
	}
}
