/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCbatDenshiFileUtil
*   ソースファイル名：JCCbatDenshiFileUtil.java
*   作成者          ：富士通
*   日付            ：2011年04月01日
*＜機能概要＞
*   バッチ処理にて電子ファイル管理テーブルへ電子ファイルの登録/更新/削除
*   および電子ファイル管理テーブルへの参照処理を行う部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/04/25   富士通    新規作成
*
**********************************************************************/
package eo.business.common;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


import oracle.sql.BLOB;

import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.common.util.JCCCompressFileUtil;
import eo.common.util.JCCFileUtil;
import eo.common.util.JCCFrameworkException;
import eo.common.util.JCCOracleSeqUtil;
import eo.common.util.JCCUnCompressFileUtil;
import eo.framework.application.JBSbatBatchInvoker;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.application.JCCbatFrameworkException;
import eo.framework.db.JBSbatSQLAccess;

/**
 * 電子ファイル管理部品です。
 * <BR>
 * @author 富士通
 */
public class JCCbatDenshiFileUtil
{

	/**
	 * 圧縮ファイル格納作業ディレクトリのプロパティファイルキー
	 */
	private static final String PROP_KEY_DIR_COMP_TMP = "DIR_COMP_TMP";
	/**
	 * 登録ファイル上限サイズのプロパティファイルキー
	 */
	private static final String PROP_KEY_MAX_SIZE_TOROKU_FILE = "MAX_SIZE_TOROKU_FILE";
	/**
	 * 解凍ファイル格納作業ディレクトリのプロパティファイルキー
	 */
	private static final String PROP_KEY_DIR_UNCOMP_TMP = "DIR_UNCOMP_TMP";
	/**
	 * 圧縮レベルのプロパティファイルキー
	 */
	private static final String PROP_KEY_COMP_LEVEL = "COMP_LEVEL";
	/**
	 * 電子ファイル管理番号用シーケンス名
	 */
	private static final String SEQ_NAME = "SEQ_EFILE_KANRI_NO";
	/**
	 * 電子ファイル管理用テーブル名
	 */
	private static final String TABLE_NAME = "CC_T_EFILE_KANRI";
	
	/**
	 * 電子ファイル管理テーブルへの登録を行う。
	 * @param commonItem 業務共通電文クラス
	 * @param fileCd ファイルコード
	 * @param filePath 登録ファイルの絶対パス
	 * @param fileDelYmd ファイル削除日付
	 * @return String 電子ファイル管理番号
	 * @throws JCCbatFrameworkException
	 * @throws Exception
	 * フレームワーク例外、およびJavaのネイティブな例外が発生した場合、スローします。
	 */
	public static String[] createDenshiFile(JBSbatCommonItem commonItem, String fileCd, String filePath, String fileDelYmd)
		throws JCCbatFrameworkException, Exception
	{

		// 圧縮ファイル格納作業ディレクトリ
		String outDirPath = null;
		
		// 業務共通電文クラスチェック
		chkCommonItem(commonItem);
		
		// DBコネクションの取得
		Connection con = commonItem.getConnection();
		
		// システムコードの取得
		String sysCd = commonItem.getSystemCode();
		
		// システム日時の取得
		String sysDate =  JCCBatCommon.getSysDateTimeStamp();
		
		// ユーザIDの取得
		String userId = commonItem.getBatchUserId();
		
		// パラメータチェック
		chkParamCreateDenshiFile(con , sysCd , userId , sysDate , fileCd , fileDelYmd);

		// 登録対象ファイルのチェック
		chkSrcFile(filePath);
		
		// 圧縮ファイル格納作業ディレクトリの取得とチェック
		outDirPath = getCompTempDir();
		
		// 圧縮レベルの取得
		String compLevel = getCompLevel();
		
		// 電子ファイル登録部品の呼び出し
		String docNo = registerDoc(commonItem, con, sysCd, fileCd, filePath, outDirPath, fileDelYmd, userId, sysDate, compLevel);
		return new String[]{docNo, sysDate};
		
	}

	/**
	 * 電子ファイル登録処理時のパラメータチェックを行ないます。
	 * <br>
	 * @param con DBコネクション
	 * @param sysCd システムコード
	 * @param userId ユーザーID
	 * @param sysDate システム日時
	 * @param fileCd ファイルコード
	 * @param fileDelYmd ファイル削除年月日
	 * @exception JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkParamCreateDenshiFile(Connection con, String sysCd,
			String userId, String sysDate, String fileCd, String fileDelYmd)
		throws JCCbatFrameworkException
	{
		// DBコネクションのチェック
		chkDBConnection(con);
		
		// システムコード
		chkSysCd(sysCd);
		
		// ユーザーID
		chkUserId(userId);
		
		// システム日時
		chkSysDate(sysDate);
		
		// ファイルコード
		chkFileCd(fileCd);
		
		// ファイル削除年月日
		chkFileDelYmd(fileDelYmd);
	}

	/**
	 * 電子ファイルの登録を行う<br>
	 * @param commonItem 
	 * @param con DBコネクション
	 * @param sysCd システムコード
	 * @param fileCd ファイルコード
	 * @param filePath 登録ファイルのパス
	 * @param outDirPath 圧縮ファイル生成作業ディレクトリパス(中間ファイルディレクトリ配下とする)
	 * @param fileDelYmd ファイル削除日付
	 * @param userId ユーザID
	 * @param sysDate システム日時
	 * @param compLevel 圧縮レベル
	 * @throws JCCbatFrameworkException
	 * @throws Exception <br>
	 * @return 電子ファイル管理番号。
	 */	
	private static String registerDoc(JBSbatCommonItem commonItem, Connection con, String sysCd, String fileCd, String filePath,
			String outDirPath, String fileDelYmd, String userId, String sysDate, String compLevel)
		throws JCCbatFrameworkException, Exception
	{
		
		// 電子ファイル管理番号
		String docNo = null;
		// 登録ファイルのサイズ
		String orgFileSize = null;
		// 圧縮ファイルのパス
		String compFilePath = null;
		// 圧縮ファイルのサイズ
		String compFileSize = null;
		
		try
		{
			// 電子ファイル管理番号の取得
			docNo = JCCOracleSeqUtil.getFormatedNextSeq(con, SEQ_NAME, "E", 14);
			
			// 登録ファイルのサイズの取得（Kバイト単位）
			orgFileSize = JCCFileUtil.getFileSize(filePath);
	
			// ファイルの圧縮、圧縮ファイルのパスの取得
			compFilePath = JCCCompressFileUtil.compressFile(filePath, outDirPath, "", "0", compLevel);
			
			// ファイルのリネーム処理
			compFilePath = renameFile(compFilePath);
			
			// 圧縮後ファイルサイズの取得
			compFileSize = JCCFileUtil.getFileSize(compFilePath);
	
			// 電子ファイル管理テーブルへのDB登録
			registerDocumentToTable(commonItem, con , docNo , sysCd , fileCd , compFilePath , 
					orgFileSize , compFileSize , fileDelYmd , userId , sysDate);
			
		} 
		finally 
		{
			// 圧縮ファイル生成作業ディレクトリの削除
			removeDir(compFilePath);
		}
		
		return docNo;
		
	}

	/**
	 * 電子ファイル管理テーブルへの更新を行う。
	 * @param commonItem 業務共通電文クラス
	 * @param eFileKanriNo 電子ファイル管理番号
	 * @param filePath 登録ファイルの絶対パス
	 * @param fileDelYmd ファイル削除日付
	 * @return String 電子ファイル管理番号
	 * @throws JBSbatBusinessException
	 * 以下の場合、明示的にJBSbatBusinessExceptionをスローします。<br>
	 * ・ファイル削除日付必須チェックエラー<br>
	 * ・登録ファイルの読み込みチェックエラー<br>
	 * ・登録ファイルサイズのチェック（APLConst.propertiesの上限値を超えた場合、電子ファイル管理テーブル登録不可とする）<br>
	 * ・ファイル削除日付半角英数字チェックエラー<br>
	 * ・ファイル削除日付桁数チェックエラー（期待値：8桁固定）<br>
	 * @throws Exception
	 * フレームワーク例外、およびJavaのネイティブな例外が発生した場合、スローします。
	 */
	public static String[] updateDenshiFile(JBSbatCommonItem commonItem, String eFileKanriNo, String filePath, String fileDelYmd)
		throws JBSbatBusinessException, Exception
	{
		// 業務共通電文クラスチェック
		chkCommonItem(commonItem);
		
		// DBコネクションの取得
		Connection con = commonItem.getConnection();
		// システムコードの取得

		// システム日時の取得
		String sysDate =  JCCBatCommon.getSysDateTimeStamp();
		
		// ユーザIDの取得
		String userId = commonItem.getBatchUserId();
		
		// パラメータチェック
		chkParamUpdateDenshiFile(con , eFileKanriNo , userId , sysDate , fileDelYmd);
		
		// 登録対象ファイルのチェック
		chkSrcFile(filePath);
		
		// 圧縮ファイル格納作業ディレクトリの取得とチェック
		String outDirPath = getCompTempDir();
		
		// 圧縮レベルの取得
		String compLevel = getCompLevel();
		
		// 電子ファイル更新部品の呼び出し
		String docNo = updateDoc(commonItem, con, eFileKanriNo, filePath, outDirPath, fileDelYmd, userId, sysDate, compLevel);
		return new String[]{docNo, sysDate};
	}
	
	/**
	 * 電子ファイル更新時のパラメータチェックを行ないます。
	 * @param con DBコネクション
	 * @param eFileKanriNo 電子ファイル管理番号
	 * @param userId ユーザーID
	 * @param sysDate システム日時
	 * @param fileDelYmd ファイル削除年月日
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkParamUpdateDenshiFile(Connection con,
			String eFileKanriNo, String userId, String sysDate,
			String fileDelYmd) throws JCCbatFrameworkException
	{
		
		// DBコネクションクラスチェック
		chkDBConnection(con);
		
		// ユーザID
		chkUserId(userId);
		
		// システム日時
		chkSysDate(sysDate);
		
		// ファイル削除年月日
		chkFileDelYmd(fileDelYmd);
		
		// 電子ファイル管理番号
		chkEFileKanriNo(eFileKanriNo);
	}

	/**
	 * 電子ファイルの更新を行う<br>
	 * @param commonItem 業務共通電文クラス
	 * @param con DBコネクション
	 * @param eFileKanriNo 電子ファイル管理番号
	 * @param filePath 登録ファイルのパス
	 * @param outDirPath 圧縮ファイル生成作業ディレクトリパス(中間ファイルディレクトリ配下とする)
	 * @param fileDelYmd ファイル削除日付
	 * @param userId ユーザID
	 * @param sysDate システム日時
	 * @param compLevel 圧縮レベル
	 * @throws  Exception <br>
	 * @return String 電子ファイル管理番号。
	 */	
	private static String updateDoc(JBSbatCommonItem commonItem, Connection con, String eFileKanriNo, String filePath, 
			String outDirPath, String fileDelYmd, String userId, String sysDate, String compLevel) throws Exception
	{
		
		// アクセスクラス
		JBSbatSQLAccess searchDbAccess = null;
		
		// 登録ファイルのサイズ
		String orgFileSize = null;
		// 圧縮ファイルのパス
		String compFilePath = null;
		// 圧縮ファイルのサイズ
		String compFileSize = null;
		
		try
		{
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 start
			// アクセスクラスの生成
			searchDbAccess = JBSbatBatchInvoker.getFwDbAccessMap(TABLE_NAME);
			if(null == searchDbAccess)
			{
				searchDbAccess = new JBSbatSQLAccess(commonItem, TABLE_NAME);
				JBSbatBatchInvoker.putFwDbAccessMap(TABLE_NAME, searchDbAccess);
				commonItem.getLogPrint().printDebugLog("SQLAccessインスタンス化(" + TABLE_NAME + ")");
				
			}
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 end
			
			//パラメタ組み立て
			JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
			paramList.setValue(eFileKanriNo);
			//SQL実行
			searchDbAccess.selectBySqlDefine(paramList, "CC_SELECT_002");
			
			//結果を取得
			JBSbatCommonDBInterface map = searchDbAccess.selectNext();
			//検索結果が０件の場合
			if(map == null)
			{
				throw new JCCbatFrameworkException("引数の電子ファイル管理番号のデータを取得できません。値：" + eFileKanriNo);
			}
			String sysCd = map.getString("SYS_CD");
			String fileCd = map.getString("FILE_CD");
			
			// 登録ファイルのサイズの取得（Kバイト単位）
			orgFileSize = JCCFileUtil.getFileSize(filePath);
			
			// ファイルの圧縮、圧縮ファイルのパスの取得
			compFilePath = JCCCompressFileUtil.compressFile(filePath, outDirPath, "", "0", compLevel);
			
			// ファイルのリネーム処理
			compFilePath = renameFile(compFilePath);
			
			// 圧縮後ファイルサイズの取得
			compFileSize = JCCFileUtil.getFileSize(compFilePath);
			
			// 電子ファイル管理テーブルへのDB登録
			registerDocumentToTable(commonItem, con, eFileKanriNo, sysCd, fileCd, compFilePath, 
					orgFileSize, compFileSize, fileDelYmd, userId, sysDate);

		} 
		finally
		{
			// 圧縮ファイル生成作業ディレクトリの削除
			removeDir(compFilePath);
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 start
//			if (searchDbAccess != null)
//			{
//				searchDbAccess.close();
//			}
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 end
		}
		
		return eFileKanriNo;
		
	}
	

	/**
	 * 電子ファイルを登録する。
	 * @param commonItem 業務共通電文クラス
	 * @param con DBコネクション
	 * @param docNo 電子ファイル管理番号
	 * @param sysCd システムコード
	 * @param fileCd ファイルコード
	 * @param compFilePath 圧縮ファイルのパス
	 * @param orgFileSize 圧縮前ファイルのサイズ（Kバイト）
	 * @param compFileSize 圧縮後ファイルのサイズ（Kバイト）
	 * @param fileDelYmd ファイル削除日付
	 * @param userId ユーザID
	 * @param sysDate システム日時
	 * @return int 登録件数
	 * @throws  Exception <br>
	 * １）ファイルIO例外<br>
	 * ２）SQL発行時の例外
	 */
	private static int registerDocumentToTable(JBSbatCommonItem commonItem, Connection con, String docNo, String sysCd, String fileCd,
			String compFilePath, String orgFileSize, String compFileSize,
			String fileDelYmd, String userId, String sysDate) throws Exception
	{
		JBSbatSQLAccess insertDbAccess = null;

		//SQLの作成
		PreparedStatement prepstmt = null;
		ResultSet rs = null;
	
		// BLOB型書き込み準備。入出力ストリームのインスタンス生成
		BufferedInputStream bis = null;
		OutputStream os = null;
		
		// ファイルインプットストリームの設定
		FileInputStream fis = null;

		try
		{
			// ファイルコードの空白処理
			String fileCode = fileCd;
			if (fileCd == null || "".equals(fileCd))
			{
				fileCode = "0000";
			}

			// ファイル削除年月日の空白処理
			String fileDeleteYmd = fileDelYmd;
			if (fileDelYmd == null || "".equals(fileDelYmd))
			{
				fileDeleteYmd = "20991231";
			}
		
			// 圧縮ファイルのパスのFileインスタンスの生成
			File f_filePath = new  File(compFilePath);
		
			// 圧縮ファイルの名前を取得（拡張子付）
			String fileName = f_filePath.getName();
		
			// 圧縮ファイルの読み込み
			fis = new FileInputStream(f_filePath);
			// アクセスクラス

			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 start
			// アクセスクラスの生成
			insertDbAccess = JBSbatBatchInvoker.getFwDbAccessMap(TABLE_NAME);
			if(null == insertDbAccess)
			{
				insertDbAccess = new JBSbatSQLAccess(commonItem, TABLE_NAME);
				JBSbatBatchInvoker.putFwDbAccessMap(TABLE_NAME, insertDbAccess);
				commonItem.getLogPrint().printDebugLog("SQLAccessインスタンス化(" + TABLE_NAME + ")");
				
			}
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 end

			//パラメタ組み立て
			JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
			// 電子ファイル管理番号の設定
			paramList.setValue(docNo);
			// 版数(システム日付)の設定
			paramList.setValue(sysDate);
			// システムコードの設定
			paramList.setValue(sysCd);
			// ファイルコードの設定
			paramList.setValue(fileCode);
			// 自動生成したファイル名の設定
			paramList.setValue(fileName);
			// 元ファイル（圧縮前）サイズの設定
			paramList.setValue(orgFileSize);
			// 圧縮ファイルサイズの設定
			paramList.setValue(compFileSize);
			// ファイル削除日の設定
			paramList.setValue(fileDeleteYmd);
			// 登録年月日時分秒の設定
			paramList.setValue(sysDate);
			// 登録ユーザアカウントの設定
			paramList.setValue(userId);
			// 更新年月日時分秒の設定
			paramList.setValue(sysDate);
			// 更新ユーザアカウントの設定
			paramList.setValue(userId);
			// 削除年月日時分秒の設定
			paramList.setValue(null);
			// 削除ユーザアカウントの設定
			paramList.setValue(null);
			// 無効フラグの設定
			paramList.setValue("0");
			//SQL実行
			int insertCount = insertDbAccess.executeBySqlDefine(paramList, "CC_INSERT_001");
			
			// 電子ファイル（BLOB型）への書き込み
			prepstmt = con.prepareStatement("SELECT EFILE FROM CC_T_EFILE_KANRI WHERE EFILE_KANRI_NO = ? AND GENE_ADD_DTM = ? FOR UPDATE",
					ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

			// 電子ファイル管理番号の設定
			prepstmt.setString(1, docNo);
			// 版数(システム日付)の設定
			prepstmt.setString(2, sysDate);
			
			// SQL実行
			rs = prepstmt.executeQuery();
			
			// オブジェクトの書き込み
			rs.next();
			Blob blob = rs.getBlob("EFILE");
			
			// 圧縮ファイルを読み込み、ストリームに書き込む
			bis = new BufferedInputStream(fis);
			os = blob.setBinaryStream(1L);
			
			int readsize = 0;//読込サイズ
			byte[] buf = new byte[5120];
			//読込ファイルが終了するまで
			while(readsize != -1)
			{
				readsize = bis.read(buf, 0, buf.length);
				if (readsize != -1)
				{
					os.write(buf, 0, readsize);
				}
			}
			os.flush();
			
			return insertCount;
			
		} 
		catch (SQLException e)
		{
			throw e;
		} 
		finally
		{
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 start
//			if (insertDbAccess != null)
//			{
//				insertDbAccess.close();
//			}
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 end
			if(rs != null)
			{
				rs.close();
			}
			if(prepstmt != null)
			{
				prepstmt.close();
			}
			if(fis != null)
			{
				fis.close();
			}
			if(bis != null)
			{
				bis.close();
			}
			if(os != null)
			{
				os.close();
			}
		}
	}
	
	/**
	 * 電子ファイル管理テーブルへの削除を行う。
	 * @param commonItem 業務共通電文クラス
	 * @param eFileKanriNo 電子ファイル管理番号
	 * @throws JBSbatBusinessException
	 * @throws Exception
	 * フレームワーク例外、およびJavaのネイティブな例外が発生した場合、スローします。
	 */
	public static void deleteDenshiFile(JBSbatCommonItem commonItem, String eFileKanriNo)
		throws JBSbatBusinessException, Exception
	{
		
		// 業務共通電文クラスチェック
		chkCommonItem(commonItem);
		
		// システム日時の取得
		String sysDate =  JCCBatCommon.getSysDateTimeStamp();
		
		// ユーザIDの取得
		String userId = commonItem.getBatchUserId();
		
		// パラメータチェック
		chkParamDeleteDenshiFile(eFileKanriNo, sysDate, userId);
		
		// 電子ファイル削除部品の呼び出し
		deleteDoc(commonItem, eFileKanriNo, userId, sysDate);
	}
	
	/**
	 * 電子ファイル削除時のパラメータチェック
	 * @param eFileKanriNo
	 * @param sysDate
	 * @param userId
	 * @throws JCCbatFrameworkException
	 */
	private static void chkParamDeleteDenshiFile(String eFileKanriNo, String sysDate, String userId)
		throws JCCbatFrameworkException
	{
		// システム日時のチェック
		chkSysDate(sysDate);
		
		// ユーザーIDのチェック
		chkUserId(userId);
		
		// 電子ファイル管理番号のチェック
		chkEFileKanriNo(eFileKanriNo);
	}

	/**
	 * 電子ファイルの削除を行う<br>
	 * @param commonItem 業務共通電文クラス
	 * @param eFileKanriNo 電子ファイル管理番号
	 * @param userId ユーザID
	 * @param sysDate システム日時
	 * @throws  Exception <br>
	 */	
	private static void deleteDoc(JBSbatCommonItem commonItem, String eFileKanriNo, 
			String userId, String sysDate) throws Exception
	{
		
		// アクセスクラス
		JBSbatSQLAccess selectDbAccess = null;
//		JBSbatSQLAccess deleteDbAccess = null;
		
		try
		{
			
			// 削除前に対象レコードをロック
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 start
			// アクセスクラスの生成
			selectDbAccess = JBSbatBatchInvoker.getFwDbAccessMap(TABLE_NAME);
			if(null == selectDbAccess)
			{
				selectDbAccess = new JBSbatSQLAccess(commonItem, TABLE_NAME);
				JBSbatBatchInvoker.putFwDbAccessMap(TABLE_NAME, selectDbAccess);
				commonItem.getLogPrint().printDebugLog("SQLAccessインスタンス化(" + TABLE_NAME + ")");
				
			}
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 end
			JBSbatCommonDBInterface params = new JBSbatCommonDBInterface();
			params.setValue(eFileKanriNo);
			selectDbAccess.selectBySqlDefine(params, "CC_SELECT_002");
			
			// 電子ファイル管理番号に紐付くデータの論理削除
//			deleteDbAccess = new JBSbatSQLAccess(commonItem, TABLE_NAME);
			//パラメタ組み立て
			JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
			paramList.setValue(sysDate);		// 更新日時
			paramList.setValue(userId);			// 更新オペレータアカウント
			paramList.setValue(sysDate);		// 削除日時
			paramList.setValue(userId);			// 削除オペレータアカウント
			paramList.setValue("1");			// 無効フラグ
			paramList.setValue(eFileKanriNo);	// 電子ファイル管理番号
			//SQL実行
//			deleteDbAccess.executeBySqlDefine(paramList, "CC_UPDATE_001");
			selectDbAccess.executeBySqlDefine(paramList, "CC_UPDATE_001");
			
		} 
		finally
		{
//			if (selectDbAccess != null)
//			{
//				selectDbAccess.close();
//			}
//			if (deleteDbAccess != null)
//			{
//				deleteDbAccess.close();
//			}
		}
	}
	
	/**
	 * 引数のファイルが残っている場合、そのファイルが入っているディレクトリごと削除する。
	 * @param filePath 削除対象のファイルパス
	 * @throws JCCFrameworkException
	 */
	private static void removeDir(String filePath) throws JCCFrameworkException
	{
		// 作業ディレクトリが残っていた場合、削除
		if(filePath != null)
		{
			File f_dir = new File(new File(filePath).getParent());
			if(f_dir.exists())
			{
				JCCFileUtil.removeDir(new File(filePath).getParent());
			}

		}
	}

	/**
	 * アプリケーションプロパティファイルから圧縮レベルを取得する。
	 * <br>
	 * @return 圧縮レベル
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static String getCompLevel() throws JCCbatFrameworkException 
	{
		// 圧縮レベル
		String compLevel = JCCBatCommon.getApplicationConst(PROP_KEY_COMP_LEVEL);
		if (!JCCBatCommon.isNotNull(compLevel))
		{
			throw new JCCbatFrameworkException("APLConst.propertiesに圧縮レベルの定義がありません。");
		}
		
		// 圧縮レベル（範囲チェック用）
		int intCompLevel = 0;
		try
		{
			intCompLevel = Integer.parseInt(compLevel);
		}
		catch (NumberFormatException e)
		{
			throw new JCCbatFrameworkException("圧縮レベルの定義が不正です。");
		}
		
		// 圧縮レベルの範囲確認
		if (intCompLevel < 1 || 9 < intCompLevel)
		{
			throw new JCCbatFrameworkException("圧縮レベルが範囲外の設定です。");
		}
		return compLevel;
	}

	/**
	 * 引数のファイルを、UIDを使用したランダムな名称に変更する。
	 * <br>
	 * 拡張子は引数のファイルのものを引き継ぎ、拡張子がない場合は拡張子設定は行なわない。
	 * @param filePath ファイル名
	 * @return 変更後のファイル名
	 * @throws Exception
	 * @throws JCCbatFrameworkException
	 */
	private static String renameFile(String filePath) throws JCCbatFrameworkException, Exception
	{
		// 拡張子格納用
		String str = "";
		//拡張子の.位置を取得
		int dotPos = filePath.lastIndexOf(".");
		if (dotPos != -1)
		{
			str = filePath.substring(dotPos);
		}
		String s_FilePath = JCCFileUtil.createDirUid(new File(filePath).getParent()) + str;
		File beforeFile = new File(filePath);
		File afterFile = new File(s_FilePath);
		if(!beforeFile.renameTo(afterFile))
		{
			throw new JCCbatFrameworkException("ファイルのリネーム処理に失敗しました。");
		}
		return s_FilePath;
	}

	/**
	 * 処理対象ファイルのチェックを行ないます。
	 * <br>
	 * @param filePath 登録対象のファイル
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkSrcFile(String filePath) throws JCCbatFrameworkException
	{
		// 対象ファイルのファイルオブジェクト格納用
		File f_filePath = null;
		
		// ファイルパスが適切がどうかのチェック
		try 
		{
			f_filePath = new  File(filePath);
		}
		catch(NullPointerException e)
		{
			throw new JCCbatFrameworkException("引数のファイルパスでファイルオブジェクトが生成できません。ファイル：" + filePath);
		}
		
		// 登録ファイルの読み込みチェック
		if(!f_filePath.exists() || !f_filePath.isFile() || !f_filePath.canRead())
		{
			throw new JCCbatFrameworkException("登録ファイルが存在しない、又はファイルではなくフォルダ、又は読込み権限がありません。ファイル：" + filePath);
		}
		
		// 登録ファイルのサイズ上限チェック
		// 登録ファイルの存在チェック
		// 登録ファイルサイズのチェック（上限値を超えた場合、電子ファイル管理テーブル登録不可とする）
		// ファイルサイズ上限値
		long maxSize = 0;
		try 
		{
			// プロパティファイルからファイルサイズ上限値を取得（Kバイト単位）
			maxSize = Long.parseLong(JCCBatCommon.getApplicationConst(PROP_KEY_MAX_SIZE_TOROKU_FILE));
		}
		catch (NumberFormatException e) 
		{
			throw new JCCbatFrameworkException("APLConst.propertiesに圧縮前ファイルサイズ上限値の定義がありません。");
		}
		
		// 登録ファイルのサイズの取得（Kバイト単位）
		long fileSize = f_filePath.length() / 1024;
		
		// ファイルサイズのチェック
		if(fileSize > maxSize)
		{
			throw new JCCbatFrameworkException("登録ファイルがファイルサイズの上限を超えています。");
		}
	}

	/**
	 * アプリケーションプロパティファイルからの圧縮ファイル格納作業ディレクトリの
	 * 取得とチェック
	 * <br>
	 * @return 圧縮ファイル格納作業ディレクトリ
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static String getCompTempDir() throws JCCbatFrameworkException
	{
		// プロパティファイルから圧縮ファイル格納作業ディレクトリの読み込み
		String outDirPath = JCCBatCommon.getApplicationConst(PROP_KEY_DIR_COMP_TMP);			
		if(outDirPath == null)
		{
			throw new JCCbatFrameworkException("APLConst.propertiesに圧縮ファイル格納作業ディレクトリの定義がありません。");				
		}
		
		// 圧縮ファイル格納作業ディレクトリのFileインスタンスの生成
		File f_outDirPath = new  File(outDirPath);
		// 圧縮ファイル格納作業ディレクトリのチェック(存在チェック、ディレクトリチェック、書き込み権限チェック)
		if(!f_outDirPath.exists() || !f_outDirPath.isDirectory() || !f_outDirPath.canWrite())
		{
			throw new JCCbatFrameworkException("圧縮ファイル格納作業ディレクトリに書き込めません。値：" + outDirPath);
		}
		
		return outDirPath;
	}

	/**
	 * 電子ファイル管理番号のチェック処理を行ないます。
	 * <br>
	 * 引数の電子ファイル管理番号がnull,空文字、又は桁数15桁以外、半角英数字以外の場合
	 * JCCbatFrameworkExceptionがthrowされます。
	 * @param eFileKanriNo 電子ファイル管理番号
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkEFileKanriNo(String eFileKanriNo)
			throws JCCbatFrameworkException
	{
		// 必須チェック
		if(!JCCBatCommon.isNotNull(eFileKanriNo))
		{
			throw new JCCbatFrameworkException("電子ファイル管理番号の必須チェックエラー");
		}
		// 桁数チェック
		if(!JCCBatCommon.isKetasuu1(eFileKanriNo, "15"))
		{
			throw new JCCbatFrameworkException("電子ファイル管理番号の桁数チェックエラー 値：" + eFileKanriNo);
		}
		// 半角英数字チェック
		if(!JCCBatCommon.isHannkakuESuuji1(eFileKanriNo))
		{
			throw new JCCbatFrameworkException("電子ファイル管理番号の半角英数字1チェックエラー 値：" + eFileKanriNo);
		}
	}

	/**
	 * 業務共通電文のチェック処理を行ないます。
	 * <br>
	 * 引数のJBSbatCommonItemオブジェクトがnullの場合、JCCbatFrameworkExceptionがthrowされます。
	 * @param commonItem 業務共通電文オブジェクト
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkCommonItem(JBSbatCommonItem commonItem)
			throws JCCbatFrameworkException
	{
		if(commonItem == null)
		{
			throw new JCCbatFrameworkException("JBSbatCommonItemがnullです。");
		}
	}

	/**
	 * DBコネクションのチェック処理を行ないます。
	 * <br>
	 * 引数のConnectionオブジェクトがnullの場合、JCCbatFrameworkExceptionがthrowされます。
	 * @param con Connectionオブジェクト
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkDBConnection(Connection con)
			throws JCCbatFrameworkException
	{
		if(con == null)
		{
			throw new JCCbatFrameworkException("Connectionがnullです。");
		}
	}

	/**
	 * システムコードのチェック処理を行ないます。
	 * <br>
	 * 引数のシステムコードがnull,空文字、又は桁数が2桁以外、又は半角英数字以外の場合、
	 * JCCbatFrameworkExceptionがthrowされます。
	 * @param sysCd システムコード
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkSysCd(String sysCd) throws JCCbatFrameworkException
	{
		// 必須チェック
		if(!JCCBatCommon.isNotNull(sysCd))
		{
			throw new JCCbatFrameworkException("システムコードの必須チェックエラー");
		}
	}

	/**
	 * ユーザーIDのチェック処理を行ないます。
	 * <br>
	 * 引数のユーザーIDがnull,空文字、又は桁数が1〜8桁以外、又は半角英数字以外の場合、
	 * JCCbatFrameworkExceptionがthrowされます。
	 * @param userId ユーザーID
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkUserId(String userId)
			throws JCCbatFrameworkException
	{
		// 必須チェック
		if(!JCCBatCommon.isNotNull(userId))
		{
			throw new JCCbatFrameworkException("ユーザーIDの必須チェックエラー");
		}
	}

	/**
	 * システム日時のチェックを行ないます。
	 * <br>
	 * 引数のシステム日時がnull,空文字、又は桁数が17桁以外、又は日付として妥当でない場合、
	 * JCCbatFrameworkExceptionがthrowされます。
	 * @param sysDate システム日時
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkSysDate(String sysDate)
			throws JCCbatFrameworkException
	{
		// 必須チェック
		if(!JCCBatCommon.isNotNull(sysDate))
		{
			throw new JCCbatFrameworkException("システム日時の必須チェックエラー");
		}
	}

	/**
	 * ファイルコードのチェックを行ないます。
	 * <br>
	 * 引数のファイルコードが、桁数が4桁以外、又は半角英数字でない場合、
	 * JCCbatFrameworkExceptionがthrowされます。
	 * @param fileCd ファイルコード
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkFileCd(String fileCd)
			throws JCCbatFrameworkException
	{
		// 桁数チェック
		if(!"".equals(fileCd) && !JCCBatCommon.isKetasuu1(fileCd , "4"))
		{
			throw new JCCbatFrameworkException("ファイルコードの桁数１チェックエラー。値：" + fileCd);
		}
		// 半角英数字チェック
		if (!JCCBatCommon.isHannkakuESuuji1(fileCd))
		{
			throw new JCCbatFrameworkException("ファイルコードの半角英数字１チェックエラー。値：" + fileCd);
		}
	}

	/**
	 * ファイル削除年月日のチェックを行ないます。
	 * <br>
	 * 引数のファイル削除年月日がnull,空文字、又は桁数が8桁以外、又は日付として妥当でない場合、
	 * JCCbatFrameworkExceptionがthrowされます。
	 * @param fileDelYmd ファイル削除年月日
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static void chkFileDelYmd(String fileDelYmd)
			throws JCCbatFrameworkException
	{
		// ファイル削除日付
		// 桁数チェック
		if(!"".equals(fileDelYmd) && !JCCBatCommon.isKetasuu1(fileDelYmd, "8"))
		{
			throw new JCCbatFrameworkException("ファイル削除日付の桁数１チェックエラー。値：" + fileDelYmd);
		}
		// 日時チェック
		if (!JCCBatCommon.isYearMonthDay1(fileDelYmd))
		{
			throw new JCCbatFrameworkException("ファイル削除日付の年月日1チェックエラー値：" + fileDelYmd);
		}
	}

	/**
	 * 電子ファイル管理テーブルからファイルの取得を行う<br>
	 * @param commonItem 業務共通電文クラス
	 * @param eFileKanriNo 電子ファイル管理番号
	 * @throws  Exception <br>
	 * @return String 解凍後ファイルのフルパス
	 */	
	public static String searchDenshiFile(JBSbatCommonItem commonItem, String eFileKanriNo) throws Exception
	{
		
		// アクセスクラス
		JBSbatSQLAccess searchDbAccess = null;
		// 出力用ファイル名
		String fileName = null;
		String s_FilePath = null;
		
		try
		{
			// 業務共通電文クラスチェック
			if(commonItem == null)
			{
				throw new JCCbatFrameworkException("バッチ共通電文がnullです。");
			}
			
			//電子ファイル管理番号チェック(業務エラーにするか？)
			if(eFileKanriNo == null || "".equals(eFileKanriNo))
			{
				throw new JCCbatFrameworkException("電子ファイル管理番号を入力してください。");
			}
			
			//作業用ディレクトリの生成
			// プロパティファイルから解凍ファイル格納作業ディレクトリの読み込み
			String outDirPath = JCCBatCommon.getApplicationConst(PROP_KEY_DIR_UNCOMP_TMP);
			if(outDirPath == null || "".equals(outDirPath))
			{
				throw new JCCbatFrameworkException("解凍ファイル格納作業ディレクトリ（キー：DIR_UNCOMP_TMP）が" +
						"アプリケーションプロパティファイル（AplConst）にて設定されていません。");
			}
			
			File f_outDirPath = new File(outDirPath);
			// 解凍ファイル格納先作業ディレクトリのチェック(存在チェック、ディレクトリチェック、書き込み権限チェック)
			if(!f_outDirPath.exists() || !f_outDirPath.isDirectory() || !f_outDirPath.canWrite())
			{
				throw new JCCbatFrameworkException("解凍ファイル格納作業ディレクトリに書き込みを行うことができません。");
			}
			
			// 解凍後ファイル格納先ディレクトリパスの取得
			s_FilePath = JCCFileUtil.createDirUid(outDirPath);
			
			// ファイルオブジェクトを作成
			File f_ZipFilePath = new File(s_FilePath);
			// ディレクトリの作成。ディレクトリの作成に失敗した場合はスリープしてリトライ。
			if(!f_ZipFilePath.mkdir())
			{
				Thread.sleep(1);
				s_FilePath = JCCFileUtil.createDirUid(outDirPath);
				f_ZipFilePath = new File(s_FilePath);
				// リトライしてもディレクトリが重複する場合は例外をスロー
				if(!f_ZipFilePath.mkdir())
				{
					throw new JCCbatFrameworkException("解凍ファイル格納パスの作成に失敗しました。：" + s_FilePath);
				}
			}
			
			//電子ファイル取得
			//DBアクセスクラスを構築
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 start
			// アクセスクラスの生成
			searchDbAccess = JBSbatBatchInvoker.getFwDbAccessMap(TABLE_NAME);
			if(null == searchDbAccess)
			{
				searchDbAccess = new JBSbatSQLAccess(commonItem, TABLE_NAME);
				JBSbatBatchInvoker.putFwDbAccessMap(TABLE_NAME, searchDbAccess);
				commonItem.getLogPrint().printDebugLog("SQLAccessインスタンス化(" + TABLE_NAME + ")");
				
			}
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 end
			
			//パラメタ組み立て
			JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
			paramList.setValue(eFileKanriNo);
			//SQL実行
			searchDbAccess.selectBySqlDefine(paramList, "CC_SELECT_001");
			
			//結果を取得
			JBSbatCommonDBInterface map = searchDbAccess.selectNext();
			//検索結果が０件の場合
			if(map == null)
			{
				return null;
			}
			
// 2012/08/13 FST)arata Fortify対応 start
			// バイナリ電子ファイルとファイル名の取得
			BufferedInputStream  bis = null;
			BufferedOutputStream bos = null;
			InputStream isFile = null;
			try
			{
				// 電子ファイルのストリーム取得
				BLOB bpm = (BLOB)map.getValue("EFILE");
				isFile = bpm.getBinaryStream();
				
				// ファイル名を取得
				fileName = s_FilePath + File.separator + map.getString("BUTSURI_FILE_NM");
				// ファイルインスタンス生成
				bis = new BufferedInputStream(isFile);
				bos = new BufferedOutputStream(new FileOutputStream(fileName));
				
				int len = 0;
				// バイナリ電子ファイル読み込み
				while (len != -1)
				{ 
					len = bis.read();
					if (len != -1)
					{
						bos.write(len);
					}
				}
				// ファイル出力
				bos.flush();
			}
			finally
			{
				if(isFile != null)
				{
					isFile.close();
				}
				if(bos != null)
				{
					bos.close();
				}
				if(bis != null)
				{
					bis.close();
				}
			}
// 2012/08/13 FST)arata Fortify対応 end
			//ファイル解凍
			String filePath = JCCUnCompressFileUtil.uncompressFile(fileName, s_FilePath, "0");
			
			//結果返却
			return filePath;
		}
		finally
		{
			
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 start
//			if(searchDbAccess != null)
//			{
//				searchDbAccess.close();
//			}
			// 2013/05/09 FST_Yanagihara)FW部品で生成したSQLAceessクラスをキャッシュする対応 end

			// 解凍前ファイルは削除する。
			if(fileName != null)
			{
					File f_fileName = new File(fileName);
				if(f_fileName.exists())
				{
					//解凍前ファイルの削除
					f_fileName.delete();
				}
			}
			//解凍に失敗した場合は格納フォルダを削除する。
			//※解凍に成功した場合は解凍後のファイルがあるため格納フォルダは削除されない。
			if(s_FilePath != null)
			{
				File f_filePath = new File(s_FilePath);
				if(f_filePath.exists())
				{
					f_filePath.delete();
				}
			}

		}
	}
}