/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCCejbEFile
*	ソースファイル名：JCCejbEFile.java
*	作成者			：EKek0070
*	日付			：2011年04月12日
*＜機能概要＞
*	電子ファイル情報チェック
*	電子ファイル管理番号取得
*	電子ファイル情報登録
*	電子ファイル取得
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*   ｖ32.00.00	2017/05/26	FJ)河邊		【OM-2017-0000488】オープンカーソルエラー
*
********************************************************************************/
package eo.ejb.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.rmi.server.UID;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

import oracle.jdbc.OracleResultSet;
import oracle.sql.BLOB;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
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 eo.common.util.JCCCompressFileUtil;
import eo.common.util.JCCFileUtil;
import eo.common.util.JCCFrameworkException;
import eo.common.util.JCCUnCompressFileUtil;
import eo.ejb.cbm.entity.CC0041ETMsg;
import eo.ejb.cbm.entity.JSYejbCC0041ETDA;
import eo.ejb.cbs.cbsmsg.ECC0041A010CBSMsg;
import eo.ejb.common.JCCModelCommon;

import eo.ejb.common.db.JCCejbCC0041DBABase;
import eo.ejb.common.db.JCCejbCC0161DBABase;

/**
 * 電子ファイル圧縮、ファイルサイズチェック、電子管理番号取得、
 * 電子ファイル情報の登録を行うクラスです。
 * 
 * @author 富士通
 */
@SuppressWarnings("unused")
public class JCCejbEFile
{
	
	// 20110423 FST START
	public final static String REMOVE_TEMP_DIR = "REMOVE_TEMP_DIR";
// 20110423 FST END

	/**
	 * 電子ファイル情報チェック部品
	 * @param eFile			電子ファイル
	 * @param fileDelYmd	ファイル削除年月日
	 * @return				電子ファイル情報の HashMap
	 * @throws Exception
	 */
	public HashMap<String, String> eFileInfoCheck(byte[] eFile, String fileDelYmd) throws Exception
	{
//20130426 Kusukami START ローカル変数へ変更
		/** 圧縮レベル */
		String COMP_LEVEL = "";
		/** 圧縮ファイルサイズ上限 */
		long MAX_SIZE = 0;
//20130426 Kusukami END
		
		HashMap<String, String> eFileInfo = new HashMap<String, String>();

		// (1)アプリケーションプロパティファイルからの設定値取得
		// (a)圧縮ファイル格納作業ディレクトリ取得
		String dir_tmp = JCCModelCommon.getApplicationConst("DIR_COMP_TMP");
		// @取得できない場合
		if (null == dir_tmp || dir_tmp.isEmpty())
		{
			// JCCFrameworkExceptionをスロー
			throw new JCCFrameworkException(
					"圧縮ファイル格納作業ディレクトリ（キー：DIR_COMP_TMP）が" +
					"アプリケーションプロパティファイル（AplConst）にて設定されていません。", dir_tmp);
		}
		// A取得できた場合、返却値HashMapへの設定
		// 圧縮ファイル格納作業ディレクトリを設定
		eFileInfo.put("DIR_COMP_TMP", dir_tmp);

		// (b)圧縮レベル取得
		String comp_level = JCCModelCommon.getApplicationConst("COMP_LEVEL");
		int level = 0;
		
		// @取得できない場合 または、「1〜9」以外の場合
		if (null == comp_level || comp_level.isEmpty())
		{
			// JCCFrameworkExceptionをスロー
			throw new JCCFrameworkException(
					"圧縮レベル（キー：COMP_LEVEL）がアプリケーションプロパティファイル" +
							"（AplConst）にて有効な数値として設定されていません。", comp_level);
		}
		else 
		{
			try
			{
				level = Integer.parseInt(comp_level);
				if (1 > level || 9 < level){
					throw new Exception();
				}
			}
			catch (Exception levelEx)
			{
				// JCCFrameworkExceptionをスロー
				throw new JCCFrameworkException(
						"圧縮レベル（キー：COMP_LEVEL）がアプリケーションプロパティファイル" +
								"（AplConst）にて有効な数値として設定されていません。", comp_level);
			}
			
		}
		// A取得できた場合
		// 圧縮レベルの値を内部変数へ保持
		COMP_LEVEL = comp_level;

		long max_size = 0;
		try
		{
			// (c)圧縮ファイルサイズ上限の設定値取得
			max_size = Long.parseLong(JCCModelCommon.getApplicationConst("MAX_SIZE_TOROKU_FILE"));
		}
		// 取得できない場合、または数値でない場合
		catch (Exception e)
		{
			// JCCFrameworkExceptionをスロー
			throw new JCCFrameworkException(
					"圧縮ファイルサイズ上限値（キー：MAX_SIZE_TOROKU_FILE）が" +
					"アプリケーションプロパティファイル（AplConst）にて有効な数値として設定されていません。",
					JCCModelCommon.getApplicationConst("MAX_SIZE_TOROKU_FILE"));
		}
		// A取得できた場合
		// 圧縮ファイルサイズ上限の値を内部変数へ保持
		MAX_SIZE = max_size;


		// （2）ファイルサイズチェック
		// @圧縮ファイル格納作業ディレクトリ内でシステム一意となるディレクトリを（UIDにて）作成
		String dirUid = JCCFileUtil.createDirUid(dir_tmp);

		// A作成した作業用ディレクトリにて、システム一意となるファイル名を（UIDにて）作成
		String fileUid = JCCFileUtil.createFileNameUid(dirUid);

		// B作成したディレクトリおよびファイル名より、ファイルパスを作成する。（@ + "/" + A）
		String filePath = fileUid;

		// C作成したディレクトリおよびファイル名より、ファイルオブジェクトを作成
		File workDir = JCCFileUtil.createDir(fileUid);

		// D作成したファイルに、電子ファイルオブジェクトの書き込み
		ByteArrayInputStream bis = null;
		FileOutputStream bos = null;
		OutputStream os = null;
		try
		{

			bis = new ByteArrayInputStream(eFile);
			bos = new FileOutputStream(workDir);

			os = JCCFileUtil.writeOutputStream(bis, bos);
		}
		// 電子ファイルオブジェクトの書き込みに失敗した場合
		catch (IOException e)
		{
			JCCFileUtil.removeDir(dirUid);

			throw new JCCFrameworkException("圧縮前ファイルの生成に失敗しました。", e);

		}
		
		finally 
		{
			if ( null != bis ) 
			{
				bis.close();
			}
			if ( null != bos ) 
			{
				bos.close();
			}
			if ( null != os ) 
			{
				os.close();
			}
		}

		// Eファイルサイズの取得を行う。
		Long fileSize = Long.parseLong(JCCFileUtil.getFileSize(filePath));

		// 圧縮前ファイルサイズ上限値よりサイズが大きい場合
		if (MAX_SIZE < fileSize)
		{
			// 返却値HashMapにnullを設定
			eFileInfo = null;
			
			// 作成した作業用ディレクトリを削除
			JCCFileUtil.removeDir(dirUid);
			
			return eFileInfo;

		}
		// F上記以外の場合
		else
		{
			// 返却値HashMap(FILE_SIZE)に圧縮前ファイルサイズを設定
			eFileInfo.put("FILE_SIZE", String.valueOf(fileSize));
		}

		// (3)電子ファイル情報設定
		// (a)ファイル圧縮・圧縮ファイルパスの取得
		String asshukuFilePath = "";
		String asshukuFileSize = "";
		String butsuriFileName = "";
		try
		{
			// @ファイル圧縮部品より、ファイル圧縮および圧縮後のファイルパスの取得
			asshukuFilePath = JCCCompressFileUtil.compressFile(filePath, dirUid, null, "0", COMP_LEVEL);

			// A取得した圧縮ファイルのサイズを取得
			asshukuFileSize = JCCFileUtil.getFileSize(asshukuFilePath);

			// Bファイル名を取得
			File file = new File(asshukuFilePath);
			butsuriFileName = file.getName();

		}
		// Cファイルの圧縮に失敗した場合
		catch (Exception e)
		{
			// 作業用ディレクトリの削除
			//□□ 2011.04.24 From
			JCCFileUtil.removeDir(dirUid);
			//□□ 2011.04.24 To

			// JCCFrameworkExceptionをスロー
			throw new JCCFrameworkException("ファイルの圧縮に失敗しました。", e);
		}

		// (b)返却値HashMapに設定
		// @圧縮後ファイルパスを設定
		eFileInfo.put("ASSHUKU_FILE_PATH", asshukuFilePath);
		// A圧縮後ファイルサイズを設定
		eFileInfo.put("ASSHUKU_FILE_SIZE", asshukuFileSize);
		// B圧縮後ファイル名（物理ファイル名）を設定
		eFileInfo.put("BUTSURI_FILE_NM", butsuriFileName);

		// (c)ファイル削除日付チェック
		// @ファイル削除年月日が空白の場合
		if (null == fileDelYmd || fileDelYmd.isEmpty())
		{
			// A返却値HashMap(FILE_DEL_YMD)に「20991231」を設定
			eFileInfo.put("FILE_DEL_YMD", "20991231");
		}
		// A上記以外の場合
		else
		{
			// 返却値HashMap(FILE_DEL_YMD)にファイル削除年月日を設定
			eFileInfo.put("FILE_DEL_YMD", fileDelYmd);
		}
		
		// 20110423 FST START
		eFileInfo.put(REMOVE_TEMP_DIR,dirUid);
		// 20110423 FST END
		return eFileInfo;
	}


	/**
	 * 電子ファイル管理番号取得.
	 * 
	 * @return eFileKanriNo 電子ファイル管理番号
	 * @throws Exception
	 */
	public String getEFileKanriNo() throws Exception
	{
		String eFileKanriNo = "";

		// (1)電子ファイル管理番号取得
		try
		{
			// @採番部品より、電子ファイル管理番号を取得
			eFileKanriNo = JCCModelCommon.getFormatedNextSeq("SEQ_EFILE_KANRI_NO", "E", 14);
		}
		// A部品からExceptionがスローされた場合
		catch (Exception e)
		{
			// JCCFrameworkExceptionをスロー
			throw new JCCFrameworkException("JCCOracleSeqUtilでエラーが発生しました。", e);
		}


		// (2)電子ファイル情報未存在チェック
		// @コネクションの取得
		Connection con = JSYejbConnection.getConnection(CC0041ETMsg.getTableName());

		StringBuffer sql = new StringBuffer();
		// (a)電子ファイル管理番号を条件に、SQL文の組み立て
		sql.append("SELECT ");
		sql.append("EFILE_KANRI_NO ");
		sql.append("FROM ");
		sql.append("CC_T_EFILE_KANRI ");
		sql.append("WHERE ");
		sql.append("EFILE_KANRI_NO = ? ");

		PreparedStatement stmt = null;
		ResultSet rs = null;
		try
		{
			// (b)PreparedStatementの設定
			stmt = con.prepareStatement(sql.toString());
			// 電子ファイル管理番号を設定
			stmt.setString(1, eFileKanriNo);

			// SQL発行
			rs = stmt.executeQuery();

			// (c)取得件数が1件以上の場合
			if (rs.next())
			{
				// 2013/01/29 FST_mukuo)シーケンス重複の場合は例外をスローする start
				// nullを設定
				//eFileKanriNo = null;
				throw new JCCFrameworkException("シーケンス番号(SEQ_EFILE_KANRI_NO)が重複しました。採番された電子ファイル管理番号：" + eFileKanriNo);
				// 2013/01/29 FST_mukuo)シーケンス重複の場合は例外をスローする start
			}
		}
		// (d)SQLExceptionが発生した場合
		catch (SQLException e)
		{
			// JCCFrameworkExceptionをスロー
			throw new JCCFrameworkException("電子ファイル管理番号検索時にエラーが発生しました。", e);
		}
		// Bクローズ
		finally
		{
			if (null != stmt)
			{
				stmt.close();
			}
			if (null != rs)
			{
				rs.close();
			}
// OM-2017-0000488 2017/05/26 ADD START
			if (null != con)
			{
				CAANConnectionMgr.getInstance().close(con);
			}
// OM-2017-0000488 2017/05/26 ADD END
		}

		return eFileKanriNo;
	}


	/**
	 * 電子ファイル登録部品.
	 * 
	 * <p>
	 * </p>
	 * @param eventId イベントID
	 * @param templateId テンプレートID
	 * @param identifyCd 識別コード
	 * @param status ステータス
	 * @param operatorId オペレータID
	 * @param operatedate 運用日付
	 * @param operateDtm 運用日時
	 * @param acGroupCd 権限制御用項目
	 * @param functionCd 機能コード
	 * @param eFilePath 圧縮後電子ファイルパス
	 * @param workPath 作業用ディレクトリパス
	 * @param eFileKanriNo 電子ファイル管理番号
	 * @param geneAddDtm 世代登録年月日時分秒
	 * @param sysCd システムコード
	 * @param fileCd ファイルコード
	 * @param butsuriFileNm 物理ファイル名
	 * @param fileSize ファイルサイズ
	 * @param asshukuFileSize 圧縮ファイルサイズ
	 * @param fileDelYmd ファイル削除年月日
	 * @return outETMsg
	 * @throws Exception
	 */
	@SuppressWarnings("deprecation")
	public CAANMsg createEFileInfo(
			String eventId,
			String templateId,
			String identifyCd,
			int status,
			String operatorId,
			String operatedate,
			String operateDtm,
			String acGroupCd,
			String functionCd,
			String eFilePath,
			String workPath,
			String eFileKanriNo,
			String geneAddDtm,
			String sysCd,
			String fileCd,
			String butsuriFileNm,
			String fileSize,
			String asshukuFileSize,
			String fileDelYmd
	) throws Exception
	{

		// (1)電子ファイル管理情報登録
		// @コネクションの生成
		Connection con = JSYejbConnection.getConnection(CC0041ETMsg.getTableName());
		PreparedStatement stmt = null;
		ResultSet rs = null;

		// AETMsgインスタンスの生成
//		CAANMsg outETMsg = new CAANMsg();
		CAANMsg outETMsg = new CAANMsg("eo.ejb.cbm.entity.CC0041ETMsg");

		// BETMsgへCBSMsgの共通部項目の転記処理
		// (1)テンプレートID
		outETMsg.set(CC0041ETMsg.TEMPLATEID, templateId);
		// (2)識別コード
		outETMsg.set(CC0041ETMsg.IDENTIFYCD, identifyCd);
		// (3)ステータス
		outETMsg.set(CC0041ETMsg.STATUS, status);
		// (4)オペレータID
		outETMsg.set(CC0041ETMsg.OPERATORID, operatorId);
		// (5)運用日付
		outETMsg.set(CC0041ETMsg.OPERATEDATE, operatedate);
		// (6)運用日時
		outETMsg.set(CC0041ETMsg.OPERATEDATETIME, operateDtm);
		// (7)権限制御用項目
		outETMsg.set(CC0041ETMsg.AC_GROUP_CD, acGroupCd);
		// (8)機能コード
		outETMsg.set(CC0041ETMsg.FUNC_CODE, functionCd);
		// (9)イベントID
		outETMsg.set(CC0041ETMsg.EVENTID, eventId);

		// C入力パラメータよりETMsgへの設定
		// (10)電子ファイル管理番号
		outETMsg.set(CC0041ETMsg.EFILE_KANRI_NO, eFileKanriNo);
		// (11)世代登録年月日時分秒
		outETMsg.set(CC0041ETMsg.GENE_ADD_DTM, geneAddDtm);
		// (12)システムコード
		outETMsg.set(CC0041ETMsg.SYS_CD, sysCd);
		// (13)ファイルコード
		outETMsg.set(CC0041ETMsg.FILE_CD, fileCd);
		// (14)物理ファイル名
		outETMsg.set(CC0041ETMsg.BUTSURI_FILE_NM, butsuriFileNm);
		// (15)ファイルサイズ
		outETMsg.set(CC0041ETMsg.FILE_SIZE, fileSize);
		// (16)圧縮ファイルサイズ
		outETMsg.set(CC0041ETMsg.ASSHUKU_FILE_SIZE, asshukuFileSize);
		// (17)ファイル削除年月日
		outETMsg.set(CC0041ETMsg.FILE_DEL_YMD, fileDelYmd);
		// (18)電子ファイル
		outETMsg.set(CC0041ETMsg.EFILE, (byte[])eFilePath.getBytes());
		// (19)登録オペレータアカウント
		outETMsg.set(CC0041ETMsg.ADD_OPEACNT, operatorId);
		// (20)更新オペレータアカウント
		outETMsg.set(CC0041ETMsg.UPD_OPEACNT, operatorId);
		// (21)無効フラグ
		outETMsg.set(CC0041ETMsg.MK_FLG, "0");

		JSYejbCC0041ETDA registETMsg = new JSYejbCC0041ETDA();

		// DETMsg登録処理
		registETMsg.invoke(outETMsg, null);

		// E電子ファイル（BLOB型）への書き込み
		// (a)入出力ストリームのインスタンス生成
		BufferedInputStream bis = null;
		ByteArrayOutputStream bos = null;
		OutputStream os = null;

		// (b)圧縮後電子ファイルパスのFILEインスタンス生成
		File asshukuFilePath = new  File(eFilePath);

		// (c)生成したFILEインスタンスの読み込み
		FileInputStream fis = new FileInputStream(asshukuFilePath);

		// (d)電子ファイル管理番号と世代登録年月日時分秒を条件に、SQL文の組み立て
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT ");
		sql.append("EFILE ");
		sql.append("FROM ");
		sql.append("CC_T_EFILE_KANRI ");
		sql.append("WHERE ");
		sql.append("EFILE_KANRI_NO = ? ");
		sql.append("AND GENE_ADD_DTM = ? ");

		try
		{
			// (e)設定を行ったSQL文をロック
			stmt = con.prepareStatement(sql.toString(),
					ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

			// (f)ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql);

			// (g)PreparedStatementの設定
			// 電子ファイル管理番号
			stmt.setString(1, eFileKanriNo);
			// 世代登録年月日時分秒
			stmt.setString(2, geneAddDtm);

			bis = new BufferedInputStream(fis);
			bos = new ByteArrayOutputStream();

			// (h)ストリームへ書き込み
			int bytes;
			byte buf[] = new byte[5120];
			while((bytes = bis.read(buf, 0, buf.length)) != -1){
				bos.write(buf, 0, bytes);
				bos.flush();
			}

			// (i)executeQueryの実行
			rs = stmt.executeQuery();

			if(rs.next())
			{
					// (j)書き込んだストリームを、列「EFILE」へ書き込む
					BLOB blob = ((OracleResultSet) rs).getBLOB("EFILE");
					os = blob.getBinaryOutputStream();
					os.write(bos.toByteArray());
					os.flush();
			}
		}
		// 書き込み中にエラーが発生した場合
		catch (IOException e)
		{
			// JCCFrameworkExceptionをスロー
			throw new JCCFrameworkException(
					"電子ファイル管理テーブル(CC_T_EFILE_KANRI)のファイル書き込み処理に" +
					"失敗しました。" , eFilePath +":"+ butsuriFileNm, e);
		}
		finally
		{
			// (k)ストリームの開放
			if (null != fis)
			{
				fis.close();
			}
			if (null != bis)
			{
				bis.close();
			}
			if (null != bos)
			{
				bos.close();
			}
			if (null != os)
			{
				os.close();
			}

			// クローズ
			if(null != rs)
			{
				rs.close();
			}
			if(null != stmt)
			{
				stmt.close();
			}

			// 作業用ディレクトリパスの削除
			JCCFileUtil.removeDir(workPath);
		}

		return outETMsg;
	}

// 20110527 FST START
	/**
	 * 電子ファイル取得部品
	 * 電子ファイル管理番号をキーとして、電子ファイルのbyte配列を取得する
	 * @param 電子ファイル管理番号
	 * @return 電子ファイルのbyte配列
	 * @throws Exception
	 */
	public static byte[] getEFile(String eFileNo) throws Exception
	{
		// 電子ファイル(解凍前のblob領域)
		byte[] eFile = null;
		
		//---------------------------------------------------------------
		// 電子ファイル管理番号からファイルを取得
		//---------------------------------------------------------------
		try
		{
			// 電子ファイル管理テーブルアクセス部品のインスタンス化
			JCCejbCC0041DBABase dbaCC0041 = new JCCejbCC0041DBABase();
			CAANMsg eFileMsg = dbaCC0041.getPrimaryRecord(eFileNo);
			// オブジェクトの読み込み
			if(eFileMsg == null)
			{
				throw new JCCFrameworkException("指定の電子ファイル管理番号に紐づく情報が取得できませんでした。");
			}
			eFile = (byte[])eFileMsg.getObject("EFILE");
		}
		catch(Exception e)
		{
			throw new JCCFrameworkException(e);
		}
		//---------------------------------------------------------------
		// 電子ファイル解凍
		//---------------------------------------------------------------
		final String DIR_UNCOMP_TMP = "DIR_UNCOMP_TMP";
		String errMSG = null;
		
		// 解凍ファイル格納作業ディレクトリ取得
		String dirUncompTMP = JCCModelCommon.getApplicationConst(DIR_UNCOMP_TMP);
		if (null == dirUncompTMP || dirUncompTMP.isEmpty())
		{
			errMSG = "解凍ファイル格納作業ディレクトリ（キー：DIR_UNCOMP_TMP）が"+
			  "アプリケーションプロパティファイル（AplConst）にて設定されていません。" + dirUncompTMP;
			throw new CAANRuntimeException(new JCCFrameworkException(errMSG));
		}
		String workDir = null;
		String filePath = null;
		File file = null;
		byte[] outFile = null;
		InputStream is = null;
		BufferedInputStream bis = null;
		ByteArrayInputStream byis = null;
		FileOutputStream fos = null;
		FileInputStream fis = null;
		OutputStream os = null;		
		String uncompFilePath = null;
		
		// UIDを使って作業ディレクトリを生成
		try
		{
			workDir = JCCFileUtil.createFileNameUid(dirUncompTMP);
			
			if(makeDir(workDir) == false)
			{
				errMSG = "「作業ディレクトリの作成に失敗しました。"
					+ "(ディレクトリ指定の誤り／書き込み権限／同名ディレクトリの有無を確認してください）："
					+ workDir + "」";
				JCCFileUtil.removeDir(dirUncompTMP);
				throw new CAANRuntimeException(new JCCFrameworkException(errMSG));
			}
			// 一時ファイルの絶対パス
			filePath = JCCFileUtil.createFileNameUid(workDir);
			file = new File(filePath);
			
			// byte配列から一時ファイルに変換
			byis = new ByteArrayInputStream(eFile);
			fos = new FileOutputStream(file);
			os = JCCFileUtil.writeOutputStream(byis, fos);
			os.flush();
		}
		catch(IOException io)
		{
			JCCFileUtil.removeDir(workDir);
			throw new CAANRuntimeException(new JCCFrameworkException("解凍前ファイルの生成に失敗しました。", io));
		}
		catch(Exception e)
		{
			JCCFileUtil.removeDir(workDir);
		}
		finally
		{
			try
			{
				// ストリームを閉じる
				if (is != null)
				{
					is.close();
				}
				if(bis != null)
				{
					bis.close();
				}
				if(byis != null)
				{
					byis.close();
				}
				if(fos != null)
				{
					fos.close();
				}
				if(os != null)
				{
					os.close();
				}
			}
			catch (IOException io)
			{
				 ;// 何もしない
			}
		}
		try
		{
			// ファイル解凍メソッド呼出
			uncompFilePath = JCCUnCompressFileUtil.uncompressFile(filePath, workDir, "0");
		}
		catch (Exception e)
		{
			// JCCFrameworkExceptionをスローし、作業ディレクトリの削除
			try
			{
				JCCFileUtil.removeDir(workDir);
			}
			catch (Exception ex)
			{
				;
			}
			throw new JCCFrameworkException(e);
		}
		//---------------------------------------------------------------
		// 解凍後のファイルを出力用のbyte配列にセット
		//---------------------------------------------------------------
		try
		{
			// 解凍後ファイルのパスからストリームを取得
			fis = new FileInputStream(uncompFilePath);
			bis = new BufferedInputStream(fis, 5120);
			// ストリームから書込み用の領域サイズを取得
			outFile = new byte[fis.available()];
			// byte配列にファイルを読込み
			int ret = 0;
			while(ret != -1)
			{
				ret = bis.read(outFile);
				if(ret == -1)
				{
					break;
				}
			}
		}
		catch (FileNotFoundException e)
		{
			throw new JCCFrameworkException(e);
		}
		catch (IOException e) 
		{
			throw new JCCFrameworkException(e);
		}
		finally
		{
			// ストリームをクローズ
			if(fis != null)
			{
				fis.close();
			}
			//20130426 Kusukami START bisをクローズ
			if(bis != null)
			{
				bis.close();
			}
			//20130426 Kusukami END
			//作業用ディレクトリの削除
			try
			{
				JCCFileUtil.removeDir(workDir);
			}
			catch (Exception e)
			{
				throw new JCCFrameworkException("作業用ディレクトリの削除に失敗しました",e);
			}
		}
		return outFile;
	}
// 20110527 FST END
	
	/**
	 * 指定されたディレクトリをその直下のファイルごと削除する。
	 * @param dirPath ファイルの絶対パス
	 * @return boolean 正常に削除された場合、trueを返却する。
	 */
	public static boolean removeDir(String removeDir) throws Exception{
		return JCCFileUtil.removeDir(removeDir);
	}
	
	/**
	 * 指定されたパスに対してディレクトリが存在しなければ
	 * ディレクトリを作成する（排他制御）
	 * 
	 * @param path	ディレクトリを作るパス
	 * @return 作成成否
	 */	
	private synchronized static boolean makeDir(String path)
	{
		File fl = null;
		boolean ret = true;
		if(path == null)
		{
			return false;
		}		
		fl = new File(path);
		if(fl.exists() == false)
		{
			if(fl.mkdirs() == true)
			{
				ret = true;
			}
			else
			{
				ret = false;
			}
		}
		return ret;
	}
}
