/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom, 2010
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JZMBatCommon
*	ソースファイル名：JZMBatCommon.java
*	作成者			：富士通
*	日付			：2011年04月05日
*＜機能概要＞
*	共通(マスタ)バッチ共通部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v2.00.00	2011/04/05	FJ)荒田		新規作成
*	v3.00.00	2012/02/14  FJ)日野		【ST2-2012-0000183】処理時間短縮対応
*	v3.01.00	2012/02/29  FJ)岩元		【ST1-2012-0000020】日付項目にスラッシュ編集を追加
*	v3.02.00	2012/08/01	FJ)日野		【DES-2012-0000004】連携ディレクトリ(ZD)対応
*	v4.00.00	2012/11/15	FJ)伊藤		【TAI-2012-0000140】品質強化対策
*	v4.01.00	2013/01/08  FJ)日野		【TAI-2012-0000142】バッチ異常終了時のメッセージについて【優先度A】
*
**********************************************************************/

package eo.business.common;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;

import java.io.File;
import java.io.FilenameFilter;

import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatCheckUtil;
import eo.business.common.JBSbatZMCsvFileSyori;


/**
 * 共通(マスタ)システムバッチ共通アクセッサー部品<p>
 * <BR>
 * @author 富士通
 */
public class JZMBatCommon extends JCCBatCommon
{
	/** DEBUG ERR MESSAGE 正常終了 */
	private static final String DEBUG_ERR_MSG_OK = "正常終了";

	/** DEBUG ERR MESSAGE エラー区分: */
	private static final String DEBUG_ERR_MSG_ERR_KBN = "エラー区分:";

	/** 属性名 year_month_day1 */
	private static final String ZOKU_NM_YEAR_MONTH_DAY1 = "year_month_day1";

	/** 属性名 year_month3 */
	private static final String ZOKU_NM_YEAR_MONTH3 = "year_month3";

	/** 属性名 no_check */
	private static final String ZOKU_NM_NO_CHECK = "no_check";

	/** 属性名 day_hour1 */
	private static final String ZOKU_NM_DAY_HOUR1 = "day_hour1";

	/** 属性名 zenkaku */
	private static final String ZOKU_NM_ZENKAKU = "zenkaku";

	/** 属性名 hannkakuesuujikana3 */
	private static final String ZOKU_NM_HANNKAKUESUUJIKANA3 = "hannkakuesuujikana3";

	/** 属性名 hannkakukana2 */
	private static final String ZOKU_NM_HANNKAKUKANA2 = "hannkakukana2";

	/** 属性名 hannkakuesuuji3 */
	private static final String ZOKU_NM_HANNKAKUESUUJI3 = "hannkakuesuuji3";

	/** 属性名 hannkakuesuuji2 */
	private static final String ZOKU_NM_HANNKAKUESUUJI2 = "hannkakuesuuji2";

	/** 属性名 hannkakuesuuji1 */
	private static final String ZOKU_NM_HANNKAKUESUUJI1 = "hannkakuesuuji1";

	/** 属性名 hannkakusuuji2 */
	private static final String ZOKU_NM_HANNKAKUSUUJI2 = "hannkakusuuji2";

	/** 属性名 hannkakusuuji1 */
	private static final String ZOKU_NM_HANNKAKUSUUJI1 = "hannkakusuuji1";

	/** エラーメッセージ */
	private static final String ERR_MSG_KYOKUNO = "局番が存在しません。";

	/** エラーメッセージ */
	private static final String ERR_MSG_TEL = "正しい電話番号を設定してください。";

	/** エラー区分 */
	private static final String ERR_KBN = "ERR_KBN";
	
	/** 接続エラー */
	private static final String CONNECT_ERR = "CONNECT_ERR";
	
	/** ファイルエラー */
	private static final String FILE_ERR = "FILE_ERR";
	
	/** エラーメッセージ */
	private static final String ERR_MESSAGE = "ERR_MESSAGE";
	
	/** エラーコード */
	private static final String ERR_CD = "ERR_CD";
	
	/** ファイル名 */
	private static final String FILE_NAME = "FILE_NAME";
	
	/** 局番 */
	private static final String KYOKU_NO = "KYOKU_NO";
	
	/** 市外局番 */
	private static final String AREACD = "AREACD";
	
	/**
	 * 引数で指定された文字列を引数の囲い文字で囲う処理。
	 * @param  data 編集対象文字列
	 * @return Stirng 編集後の文字列
	 */
	public static String addDoubleQuot(String data)
	{
		String addData = addKakoiMoji(data, JZMBatConst.DOUBLE_QUOT);
		return addData;
	}
	
	/**
	 * 引数で指定された文字列を引数の囲い文字で囲う処理。
	 * @param  data 編集対象文字列
	 * @param  kakoiMoji 囲い文字
	 * @return Stirng 編集後の文字列
	 */
	public static String addKakoiMoji(String data, String kakoiMoji)
	{
		String addData = new StringBuffer(kakoiMoji).append(data).append(kakoiMoji).toString();
		return addData;
	}
		
	/**
	 * 引数1に引数2ミリ秒加算した値を返します。
	 * @param arg0 yyyyMMddHHmmsssss
	 * @param i 加算ミリ病
	 * @return 加算値
	 * @throws ParseException
	 */
	public static String addMillSec(String arg0, int i) throws ParseException
	{
		int arg0Length = arg0.length();

		Calendar calendar = transCalendar(arg0, arg0Length);

		SimpleDateFormat form = new SimpleDateFormat(JZMBatConst.YYYYMMDDHHMMSSSSS);

		calendar.add(Calendar.MILLISECOND, i);

		return form.format(calendar.getTime());
	}

	/**
	 * String型で渡された日付をCalendar型に変換します。
	 * <br>
	 * @param date 変換する日付
	 * @param length 変換する日付書式の桁数
	 * @return Calendar 日付書式に変換された文字列
	 * @exception ParseException 日付書式の変換処理にて、例外が発生した場合
	 * 	*/
	private static Calendar transCalendar(String date, int length) throws ParseException
	{
		SimpleDateFormat form = new SimpleDateFormat(JZMBatConst.YYYYMMDDHHMMSSSSS);

		Calendar carender = Calendar.getInstance();

		carender.setTime(form.parse(date));

		return carender;
	}
	
	/**
	 * 引数をtrimします。引数がnullの場合はnullを返します。
	 * @param str trimする文字列
	 * @return String
	 */
	public static String trim(String str)
	{
		String rtn = null;
		if(!isNull(str))
		{
			rtn = str.trim();
		}
		return rtn;
	}
	
	/**
	 * 引数がnullかどうかを返します。
	 * @param obj
	 * @return boolean
	 */
	public static boolean isNull(Object obj)
	{
		return null == obj;
	}
	
	/**
	 * 引数がnullの場合、ブランク("")を返します。
	 * @param str
	 * @return String
	 */
	public static String nullToBlank(String str)
	{
		if(isNull(str))
		{
			return JZMBatConst.BLANK;
		}
		else
		{
			return str;
		}
	}

	/**
	 * 中間ファイル配置先のパスをプロパティファイルから取得します。
	 * @return 配置先パス
	 * @throws JBSbatBusinessException パスが取得できなかった場合JBSbatBusinessExceptionを返す。
	 */
	public static String getMidDir() throws JBSbatBusinessException
	{
		
		String path = getApplicationConst(JZMBatConst.PATH_MID_DIR);

		if (null == path)
		{
			
			// EZMB0010CE:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0010CW, new String[]{JZMBatConst.PATH_MID_DIR});
		}

		return path;
	}

	/**
	 * 他システムから受信するファイルの配置先のパスをプロパティファイルから取得します。
	 * @param gaibuIfIdDirPath 外部IFIDのフォルダパス
	 * @return 配置先パス
	 * @throws JBSbatBusinessException パスが取得できなかった場合JBSbatBusinessExceptionを返す。
	 */
	public static String getGaibuReceiveDir(String gaibuIfIdDirPath) throws JBSbatBusinessException
	{

		String path = getApplicationConst(JZMBatConst.PATH_GAIBU_RECEIVE_DIR);
		path = path + getApplicationConst(gaibuIfIdDirPath);

		if (null == path)
		{
			
			// EZMB0010CE:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0010CW, new String[]{JZMBatConst.PATH_GAIBU_RECEIVE_DIR});
		}

		return path;
	}

	/**
	 * 他システムへ送信するファイルの配置先のパスをプロパティファイルから取得します。
	 * @param gaibuIfIdDitPath 外部インターフェイスID
	 * @return パス
	 * @throws JBSbatBusinessException
	 */
	public static String getGaibuSendDir(String gaibuIfIdDitPath) throws JBSbatBusinessException
	{

		String path = getApplicationConst(JZMBatConst.PATH_GAIBU_SEND_DIR);
		path = path + getApplicationConst(gaibuIfIdDitPath);
		if (null == path)
		{
			
			// EZMB0010CE:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0010CW, new String[]{JZMBatConst.PATH_GAIBU_SEND_DIR});
		}

		return path;
	}

	/**
	 * イメージへ送信するファイルの配置先のパスをプロパティファイルから取得します。
	 * @param gaibuIfIdDitPath 外部インターフェイスID
	 * @return パス
	 * @throws JBSbatBusinessException
	 */
	public static String getZdGaibuSendDir(String gaibuIfIdDitPath) throws JBSbatBusinessException
	{

		String path = getApplicationConst(JZMBatConst.ZD_PATH_GAIBU_SEND_DIR);
		path = path + getApplicationConst(gaibuIfIdDitPath);
		if (null == path)
		{
			
			// EZMB0010CE:プロパティーファイルの設定が正しくありません。(項目名:%1%)
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0010CW, new String[]{JZMBatConst.ZD_PATH_GAIBU_SEND_DIR});
		}

		return path;
	}

	/**
	 * 入力電文からkeyの値を取得します。
	 * 
	 * @param inMap 入力電文
	 * @param key データ取得key
	 * @return String 設定用データ
	 */
	public static String getInMapData(JBSbatServiceInterfaceMap inMap, String key)
	{
		
		String outData = null;
		
		if (null == inMap.get(key))
		{
			
			// nullの場合は、空文字を設定する。
			outData = JZMBatConst.BLANK;
		}
		else
		{
			
			// 文字列型にして返却
			outData = inMap.get(key).toString();
		}
		
		return outData;
	}
	

	
	/**
	 * 入力電文からkeyの値を取得します。値が"000000"の場合、ブランクに置換します。
	 * @param inMap 入力電文
	 * @param key データ取得key
	 * @return String 設定用データ
	 */
	public static String getInMapDataReplaceSixZero(JBSbatServiceInterfaceMap inMap, String key)
	{
		String rtn = getInMapData(inMap, key);
		if(JZMBatConst.SIX_ZERO.equals(rtn))
		{
			return JZMBatConst.BLANK;
		}
		return rtn;
	}
	
	/**
	 * 電話番号、FAX番号を市外局番、市内局番、加入者番号に分割し、ハイフン編集を行います。
	 * 
	 * @param editList　編集用リスト
	 * @param targetNo 電話番号orFAX番号。数字だけで構成された9桁以上の文字列。
	 * @return String 分割した番号をハイフン編集した文字列。
	 * @throws Exception
	 */
	public static String editTargetNo(List<HashMap<Object, String>> editList, String targetNo) throws Exception
	{
		// Listデータがあるか判定
		if(editList == null)
		{
			return targetNo;
		}
		
		try
		{
			return editTelno(editList, targetNo);
		}
		catch (Exception e)
		{
			return targetNo;
		}
	}
	
	/**
	 * 電話番号を市外局番、市内局番、加入者番号に分割し、ハイフン編集を行う。
	 * 
	 * @param List<HashMap<Object, String>> editList　編集用リスト
	 * @param telno 電話番号。数字だけで構成された9桁以上の文字列。
	 * @return 分割した番号をハイフン編集した文字列。
	 * @throws Exception      業務サービス内で発生した例外全般。
	 */
	public static String editTelno(List<HashMap<Object, String>> editList, String telno) throws Exception 
	{
		if (isNull(telno))
		{
			return telno;
		}
		String[] splitedTelno = splitTelno(editList, telno);
		return splitedTelno[0] + JZMBatConst.HYPHEN + splitedTelno[1] + JZMBatConst.HYPHEN + splitedTelno[2];
	}
	
	/**
	 * 電話番号を市外局番、市内局番、加入者番号に分割する。
	 * 
	 * @param List<HashMap<Object, String>> editList　編集用リスト
	 * @param telno 電話番号。数字だけで構成された9桁以上の文字列。
	 * @return 分割した番号を格納した配列。
	 * @throws Exception      業務サービス内で発生した例外全般。
	 */
	public static String[] splitTelno(List<HashMap<Object, String>> editList, String telno) throws Exception 
	{
		if (isNull(telno))
		{
			return null;
		}
		if (!isTel2(telno))
		{
			throw new Exception(JZMBatCommon.ERR_MSG_TEL);
		}
		
		if (telno.length() == 11)
		{
			// 電話番号が11桁の場合 999-9999-9999に編集する。
			return formatTelNoAdd2(telno).split(JZMBatConst.HYPHEN);
		}
		else
		{
			HashMap<Object, String> editData =  new HashMap<Object, String>();
			
			String areacd = JZMBatConst.BLANK;						// 市外局番
			String chkKyokuNo = JZMBatConst.BLANK;					// チェック用局番
			String kyokuNo = telno.substring(0, 6);	// 局番
			
			for(int i = 0; i < editList.size(); i++)
			{
				
				// データ1件取得
				editData = editList.get(i);
				chkKyokuNo = editData.get(KYOKU_NO);
				
				if(chkKyokuNo.equals(kyokuNo))
				{
					areacd = editData.get(AREACD);
					break;
				}
			}
			
			if (JZMBatConst.BLANK.equals(areacd))
			{
				throw new Exception(JZMBatCommon.ERR_MSG_KYOKUNO);
			}
			
			String[] splitedTelno = new String[3];
			splitedTelno[0] = areacd;									// 市外局番
			splitedTelno[1] = kyokuNo.substring(areacd.length());		// 市内局番
			splitedTelno[2] = telno.substring(kyokuNo.length());		// 加入者番号
			
			return splitedTelno;
		}
	}
	
	/**
	 * 文字列を指定された桁数で切り出す。
	 * 文字列が指定された桁数より小さい場合、
	 * 文字列をそのまま返却する。
	 * 
	 * @param arg0　対象文字列
	 * @param arg1 切り出す桁数
	 * @return String 編集後の文字列
	 * @throws Exception
	 */
	public static String subStringKami(String arg0, int arg1) throws Exception
	{
		
		// 対象文字列がnullならばブランクを返却する。
		if(arg0 == null)
		{
			return JZMBatConst.BLANK;
		}
		
		if(arg0.length() < arg1)
		{
			return arg0;
		}
		else
		{
			return arg0.substring(0, arg1);
		}
	}
	
	
	/**
	 * 必須チェックを行います。属性値がnullまたはブランクの場合ログを出力します。
	 * @param commonItem バッチ共通電文
	 * @param kmkNm 項目名
	 * @param kmkVal 項目値
	 * @param strKey キー情報
	 * @return boolean 
	 */
	public static boolean nullBlankCheck(JBSbatCommonItem commonItem, String kmkNm, String kmkVal, String strKey)
	{
		if(kmkVal == null || JZMBatConst.BLANK.equals(kmkVal))
		{
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EZMB0030TW, new String[]{kmkNm + strKey});
			return false;
		}
		return true;
	}
	
	/**
	 * 属性チェックを行います。属性エラーの場合ログを出力します。
	 * @param commonItem バッチ共通電文
	 * @param kmkNm 項目名
	 * @param kmkVal 項目値
	 * @param zoku 属性
	 * @param strKey キー情報
	 * @return boolean
	 */
	public static boolean zokuCheck(JBSbatCommonItem commonItem, String kmkNm, String kmkVal, JZMBatConstZokuseiEnum zoku, String strKey)
	{
		String zokuNm = getZokuName(zoku);
		if(!JBSbatCheckUtil.invoke(kmkVal, new String[]{zokuNm}))
		{
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EZMB0040TW, new String[]{kmkNm + strKey});
			return false;
		}
		return true;
	}
	
	/**
	 * 桁数チェックを行います。桁数エラーの場合、または桁数１、桁数２に数値以外を入れられた場合、ログを出力します。
	 * @param commonItem バッチ共通電文
	 * @param kmkNm 項目名
	 * @param kmkVal 項目値
	 * @param min 桁数1（最小値）
	 * @param max 桁数2（最大値）
	 * @param strKey キー情報
	 * @return boolean
	 */
	public static boolean ketaCheck(JBSbatCommonItem commonItem, String kmkNm, String kmkVal, int min, int max, String strKey)
	{

		int len = kmkVal.length();
		if(min > len || len > max)
		{
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EZMB0050TW, new String[]{kmkNm + strKey});
			return false;
		}
		return true;
	}
	
	/**
	 * 属性名を取得します。
	 * @param zoku 属性enum
	 * @return String 属性名
	 */
	private static String getZokuName(JZMBatConstZokuseiEnum zoku)
	{
		if(JZMBatConstZokuseiEnum.hannkakusuuji1.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_HANNKAKUSUUJI1;
		}
		if(JZMBatConstZokuseiEnum.hannkakusuuji2.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_HANNKAKUSUUJI2;
		}
		if(JZMBatConstZokuseiEnum.hannkakuesuuji1.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_HANNKAKUESUUJI1;
		}
		if(JZMBatConstZokuseiEnum.hannkakuesuuji2.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_HANNKAKUESUUJI2;
		}
		if(JZMBatConstZokuseiEnum.hannkakuesuuji3.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_HANNKAKUESUUJI3;
		}
		if(JZMBatConstZokuseiEnum.hannkakukana2.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_HANNKAKUKANA2;
		}
		if(JZMBatConstZokuseiEnum.hannkakuesuujikana3.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_HANNKAKUESUUJIKANA3;
		}
		if(JZMBatConstZokuseiEnum.zenkaku.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_ZENKAKU;
		}
		if(JZMBatConstZokuseiEnum.day_hour1.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_DAY_HOUR1;
		}
		if(JZMBatConstZokuseiEnum.no_check.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_NO_CHECK;
		}
		if(JZMBatConstZokuseiEnum.year_month_day1.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_YEAR_MONTH_DAY1;
		}
		if(JZMBatConstZokuseiEnum.year_month3.equals(zoku))
		{
			return JZMBatCommon.ZOKU_NM_YEAR_MONTH3;
		}
		return JZMBatCommon.ZOKU_NM_NO_CHECK;
	}
	
	
	/**
	 * 単項目チェックを実行します。
	 * @param commonItem バッチ共通電文
	 * @param kmkNm 項目名
	 * @param kmkVal 項目値
	 * @param zokusei 属性
	 * @param min 桁数１（最小値）
	 * @param max 桁数２（最大値）
	 * @param strKey キー情報
	 * @throws JBSbatBusinessException バッチ業務エラー
	 */
	public static void singleCheck(JBSbatCommonItem commonItem, String kmkNm, String kmkVal, JZMBatConstZokuseiEnum zoku, int min, int max, String strKey)
	throws JBSbatBusinessException
	{
		if(!nullBlankCheck(commonItem, kmkNm, kmkVal, strKey) ||
			!ketaCheck(commonItem, kmkNm, kmkVal, min, max, strKey) ||
			!zokuCheck(commonItem, kmkNm, kmkVal, zoku, strKey))
		{
			
			// 単項目チェックでエラーが発生した場合、処理を終了する。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0060CW);
		}
	}
	
	/**
	 * 他システムに対するFTPクライアントのPUT処理です。(ESB種別 1:ISI)
	 * @param commonItem バッチ共通電文
	 * @param fileList FTP転送対象のファイルリスト(ローカルのフルパス)
	 * @param intrfcId FTP転送依頼するインターフェイスID
	 */
	@SuppressWarnings("unchecked")
	public static void putFTPGaibu(JBSbatCommonItem commonItem, ArrayList<String> fileList, String intrfcId)
	{
		
		// 処理結果用マップ
		HashMap<String, Object> rsMap = new HashMap<String, Object>();
		
		// ファイルFTP転送
		if(!putFTP(commonItem, fileList, intrfcId, rsMap))
		{
			String fileNm = null;
			String errMsg = null;
			String errCd = null;
			
			String errKbn = rsMap.get(ERR_KBN).toString();
			
			commonItem.getLogPrint().printDebugLog(JZMBatCommon.DEBUG_ERR_MSG_ERR_KBN + errKbn);
			
			// 接続エラー
			if(JZMBatConst.ONE.equals(errKbn))
			{
				HashMap conErrMap = (HashMap)rsMap.get(CONNECT_ERR);
				errMsg = conErrMap.get(ERR_MESSAGE).toString();
				errCd = conErrMap.get(ERR_CD).toString();
				
				// FTP転送接続エラーMSG
				commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EZMB0100CW, new String[]{errCd, errMsg});
			}
			// ファイルエラー
			else if(JZMBatConst.TWO.equals(errKbn))
			{
				ArrayList<HashMap> fileErrList = (ArrayList<HashMap>)rsMap.get(FILE_ERR);
				
				HashMap errMap = null;
				
				for(int i = 0; i < fileErrList.size(); i++)
				{
					errMap = (HashMap)fileErrList.get(i);
					
					fileNm = errMap.get(FILE_NAME).toString();
					errMsg = errMap.get(ERR_MESSAGE).toString();
					errCd = errMap.get(ERR_CD).toString();
					
					// FTP転送ファイルエラーMSG
					commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EZMB0110CW, new String[]{fileNm, errCd, errMsg});
				}
			}
			return;
		}
		commonItem.getLogPrint().printDebugLog(JZMBatCommon.DEBUG_ERR_MSG_OK);
	}
	


	/**
	 * 件数ファイルを出力します。
	 * @param outPutFileFullPath 件数ファイルフルパス
	 * @param cnt 件数
	 * @throws Exception
	 */
	public static void printDoubleQuoteCntFile(String outPutFileFullPath, int cnt) throws Exception
	{
		// ファイル出力クラス
		JBSbatBusinessFileUtil outputFile = getBusinessFileUtil(outPutFileFullPath);
		
		ArrayList<String> outputList = new ArrayList<String>();
		outputList.add(String.valueOf(cnt));
		outputList.add(JZMBatCommon.getSysDateTimeStamp());
		outputFile.printDoubleQuote(outputList);
		outputFile.close();
		outputFile = null;
	}

	/**
	 * 件数ファイルを出力します。
	 * @param outPutFileFullPath 件数ファイルフルパス
	 * @param cnt 件数
	 * @param moji 文字コード 0:CRLF 1:LF
	 * @throws Exception
	 */
	public static void printDoubleQuoteCntFile(String outPutFileFullPath, int cnt, int moji) throws Exception
	{
		
		// ファイル出力クラス
		JBSbatBusinessFileUtil outputFile = null;
		if(moji == 1)
		{
			outputFile = getBusinessFileUtilLF(outPutFileFullPath);
		}
		else
		{
			outputFile = getBusinessFileUtil(outPutFileFullPath);
		}
		
		ArrayList<String> outputList = new ArrayList<String>();
		outputList.add(String.valueOf(cnt));
		outputList.add(JZMBatCommon.getSysDateTimeStamp());
		outputFile.printDoubleQuote(outputList);
		outputFile.close();
		outputFile = null;
	}
	
	/**
	 * フラグファイルを出力します。
	 * @param outPutFileFullPath
	 * @throws Exception 
	 */
	public static void printDoubleQuoteFlgFile(String outPutFileFullPath) throws Exception
	{
		
		// ファイル出力クラス
		JBSbatBusinessFileUtil outputFile = getBusinessFileUtil(outPutFileFullPath);
		
		ArrayList<String> outputList = new ArrayList<String>();
		outputList.add(JZMBatCommon.getSysDateTimeStamp());
		outputFile.printDoubleQuote(outputList);
		outputFile.close();
		outputFile = null;
		
	}
	
	/**
	 * フラグファイルを出力します。
	 * @param outPutFileFullPath
	 * @param moji 0:CRLF 1:LF
	 * @throws Exception 
	 */
	public static void printDoubleQuoteFlgFile(String outPutFileFullPath, int moji) throws Exception
	{
		// ファイル出力クラス
		JBSbatBusinessFileUtil outputFile = null;
		if(moji == 1)
		{
			outputFile = getBusinessFileUtilLF(outPutFileFullPath);
		}
		else
		{
			outputFile = getBusinessFileUtil(outPutFileFullPath);
		}
		
		ArrayList<String> outputList = new ArrayList<String>();
		outputList.add(JZMBatCommon.getSysDateTimeStamp());
		outputFile.printDoubleQuote(outputList);
		outputFile.close();
		outputFile = null;
		
	}
	
	/**
	 * JBSbatBusinessFileUtilを取得します。(文字コード:CRLF)
	 * @param fullpath ファイルフルパス
	 * @return JBSbatBusinessFileUtil
	 * @throws Exception
	 */
	public static JBSbatBusinessFileUtil getBusinessFileUtil(String fullpath) throws Exception
	{
		return JZMBatCommon.createBusinessFileUtil(fullpath,
				JZMBatConst.SJIS,
				JZMBatConst.CRLF,
				JZMBatConst.CONMA);
	}

	/**
	 * JBSbatBusinessFileUtilを取得します。(文字コード:LF)
	 * @param fullpath ファイルフルパス
	 * @return JBSbatBusinessFileUtil
	 * @throws Exception
	 */
	public static JBSbatBusinessFileUtil getBusinessFileUtilLF(String fullpath) throws Exception
	{
		return JZMBatCommon.createBusinessFileUtil(fullpath,
				JZMBatConst.SJIS,
				JZMBatConst.LF,
				JZMBatConst.CONMA);
	}
	
	/**
	 * 正規表現の条件に一致するFilenameFilterを取得します。
	 * @param regex 検索条件の正規表現文字
	 * @return FilenameFilter
	 */
	public static FilenameFilter getFileRegexFilter(String regex)
	{
		final String FILE_REGEX = regex;
		return new FilenameFilter()
		{

			/**
			 * 正規表現の条件に一致するFilenameFilterを取得します。
			 * @param file Fileオブジェクト
			 * @param name 検索対象list
			 * @return 検索結果 true：一致するものあり false：一致するものなし
			 */
			public boolean accept(File file, String name)
			{
				boolean ret = name.matches(FILE_REGEX);
				return ret;
			}
		};
	}

	/**
	 * 日付情報を含むファイル名を取得します。（前方一致）
	 * @param filePath ファイルパス（末尾\\）
	 * @param srcPrev 前方一致条件
	 * @param srcDate 日付フォーマット条件（「/」なし）
	 * @param srcExt 拡張子（ピリオド付）
	 * @return 日付フォーマットで最新のファイル名
	 * @throws Exception
	 */
	public static String getFileNameDatePattern(String filePath, String srcPrev, String srcDate, String srcExt) throws Exception
	{
		// 前方一致条件
		String srcPrevReg = srcPrev;
		
		// 日付フォーマット条件の文字数
		String srcDateReg = Integer.toString(srcDate.length());
		
		// 拡張子のピリオドをエスケープ文字に変換
		String srcExeReg = srcExt.replace(JZMBatConst.PRIOD, JZMBatConst.PRIOD_ESC);

		String ret = null;

		try
		{
			// 該当ファイルパスの情報取得
			File dr = new File(filePath);
			
			if (dr != null)
			{
				// 正規表現文字の条件に一致するファイルのみフィルタリング
				String[] files = dr.list(getFileRegexFilter(srcPrevReg + "[0-9]{" + srcDateReg + "}" + srcExeReg));
				
				if (files != null)
				{
					if (files.length > 0)
					{
						// フィルタリングした情報をソート（昇順）
						Arrays.sort(files);
						
						// 日付フォーマットで最新のファイル名を設定
						ret = files[files.length - 1];
					}
				}
			}

			return ret;
		}
		catch(Exception ex)
		{
			throw ex;
		}
	}

	/**
	 * YYYYMM形式の文字列にスラッシュを付与します。
	 * @param str YYYYMM
	 * @return YYYY/MM
	 */
	public static String addSlashYYYYMM(String str)
	{
		return addSlash(str, false);
	}


	/**
	 * YYYYMMDD形式の文字列にスラッシュを付与します。
	 * @param str YYYYMMDD
	 * @return YYYY/MM/DD
	 */
	public static String addSlashYYYYMMDD(String str)
	{
		return addSlash(str, true);
	}
	
	/**
	 * 日付文字列にスラッシュを付与します。
	 * @param str 日付文字列
	 * @param hasDay 日の有無。
	 * @return スラッシュを付与した日付文字列
	 */
	private static String addSlash(String str, boolean hasDay)
	{
		StringBuilder ans = new StringBuilder();
		ans.append(str);
		if(ans.length() == 6 || (hasDay && ans.length() == 8))
		{
			if(hasDay)
			{
				ans.insert(6, JZMBatConst.SLASH);
			}
			ans.insert(4, JZMBatConst.SLASH);
		}
		return ans.toString();
	}
	
	/**
	 * 引数で指定されたCSVファイルの一行データを項目ごとにArrayList格納する。
	 * @param commonItem バッチ共通パラメータ電文
	 * @param lineData 一行分のCSVデータ
	 * @return ArrayList 項目ごとにCSVデータを格納したList
	 * @throws Exception 例外
	 **/
	public static ArrayList<String> convStringToList(JBSbatCommonItem commonItem,
			String lineData) throws Exception
	{
		ArrayList<String> arrlist = JBSbatZMCsvFileSyori.convStringToList(commonItem, lineData);
		
		return arrlist;
	}

	/**
	 * DBIFから値を取得しnullの場合ブランクに置換します。
	 * @param dbif DBIF
	 * @param columnName 項目名
	 * @return String 取得値
	 * @throws Exception
	 */
	public static String getDbifValString(JBSbatCommonDBInterface dbif, String columnName) throws Exception
	{
		return JZMBatCommon.nullToBlank(dbif.getString(columnName));
	}
}
