/********************************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JPCBatCNCommon
 *	ソースファイル名：JPCBatCNCommon.java
 *	作成者			：富士通
 *	日付			：2011年04月07日
 *＜機能概要＞
 *	コンテンツ決済用のファイル出力・編集処理を提供する。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/04/07	富士通		新規作成
 *
 ********************************************************************************/
package eo.business.common;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

import eo.common.constant.JCNStrConst;
import eo.framework.application.JBSbatBusinessException;


/**
 * コンテンツ決済用のファイル出力・編集処理を提供する。<p>
 * <br>
 * @author 富士通
 */
public class JCNBatFileUtil 
{
	
	/** メッセージキー*/
	private static final String ECNB0060KE = "ECNB0060KE";
	
	/**
	 * ファイル出力処理を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でファイル出力対象データ、出力ファイル名、出力ディレクトリを設定します。
	 *   出力ディレクトリ未設定の場合はファイル名をフルパスとみなします。<br>
	 *
	 * 2.引数を元に文字コードShift-JISにてファイルの出力を行います。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param recList       出力対象データ。
	 * @param strFileName   出力ファイル名。
	 * @param strFileDir    出力ディレクトリ。
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	public static void createFile(ArrayList<String> recList, String strFileName, String strFileDir) throws Exception
	{
		
		StringBuffer sBufFileDir = new StringBuffer();
		if(!"".equals(strFileDir))
		{
			sBufFileDir.append(strFileDir);
			sBufFileDir.append("/");
			sBufFileDir.append(strFileName);
		}
		else
		{
			sBufFileDir.append(strFileName);
		}
		
		File fOutFile = new File(inspection(sBufFileDir.toString()));
		
		BufferedWriter pw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fOutFile), JCNStrConst.SJIS));
		
		try
		{
			
			for (int i = 0; i < recList.size(); i++)
			{
				pw.write(recList.get(i).toString());
			}
			
			return;
		
		} 
		catch (IOException e)
		{
			throw e;
		}
		finally
		{
			pw.close();
		}
	}
	
	/**
	 * ファイルのリネーム処理を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で対象ファイル名、出力ファイル名、出力ディレクトリを設定します。
	 *   出力ディレクトリ未設定の場合はファイル名をフルパスとみなします。<br>
	 *
	 * 2.引数を元に対象ファイル名を出力ファイル名にリネームします。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param strFileName1    対象ファイル名。
	 * @param strFileName2    出力ファイル名。
	 * @param strFileDir      出力ディレクトリ。
	 * @throws Exception      業務サービス内で発生した例外全般。
	 */
	public static void updateFileName(String strFileName1, String strFileName2, String strFileDir) throws Exception
	{
		//対象ファイル名
		StringBuffer sBufFileDir1 = new StringBuffer();
		if(!"".equals(strFileDir))
		{
			sBufFileDir1.append(strFileDir);
			sBufFileDir1.append("/");
			sBufFileDir1.append(strFileName1);
		}
		else
		{
			sBufFileDir1.append(strFileName1);
		}
		
		//出力ファイル名
		StringBuffer sBufFileDir2 = new StringBuffer();
		if(!"".equals(strFileDir))
		{
			sBufFileDir2.append(strFileDir);
			sBufFileDir2.append("/");
			sBufFileDir2.append(strFileName2);
		}
		else
		{
			sBufFileDir2.append(strFileName2);
		}

		File fOutFile1 = new File(inspection(sBufFileDir1.toString()));

		File fOutFile2 = new File(inspection(sBufFileDir2.toString()));
		
		//リネーム処理(FileName1⇒FileName2)
		fOutFile1.renameTo(fOutFile2);
	}
	
	/**
	 * 文字列連結を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で連結文字列、区切り文字を設定します。<br>
	 *
	 * 2.引数を元に文字列を連結します。
	 *   連結文字列最後尾には改行コードを設定します。<br>
	 *   返却文字列内のnullは""へ置換します。
	 * </pre>
	 * <p>
	 * @param strData       出力対象データ。
	 * @param strSeparete   区切り文字。
	 * @return strRec       文字列連結結果を返却します。
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	public static String setStrUnion(String[] strData, String strSeparete) throws Exception
	{

		StringBuffer sBufRec = new StringBuffer();

		for (int i = 0; i < strData.length; i++)
		{
			sBufRec.append(strData[i]);
			if(i < strData.length - 1)
			{
					sBufRec.append(strSeparete);
			}
		}
		
		sBufRec.append(System.getProperty("line.separator"));
		
		return sBufRec.toString().replace(JCNStrConst.S_IS_NULL, "");
	}
	
	/**
	 * ファイル出力先照査を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でファイル出力先を設定します。<br>
	 *
	 * 2.引数を元に半角英数字記号にて構成されているか照査を行います。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param strFileOut    出力ファイル(フルパス)
	 * @return strFileOut   出力ファイル(フルパス)
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	private static String inspection(String strFileOut) throws Exception
	{
		if(strFileOut.matches("^[a-zA-Z0-9 -/:_]+$")) 
		{
			return strFileOut;
		}
		
		throw new JBSbatBusinessException(ECNB0060KE, new String[] {strFileOut});
	}
	
	/**
	 * ファイル追加出力処理を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でファイル出力対象データ、出力ファイル名、出力ディレクトリを設定します。<br>
	 *
	 * 2.引数を元にファイルへ追加出力を行います。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param strData       出力対象データ。
	 * @param strFileName   出力ファイル名。
	 * @param strFileDir    出力ディレクトリ。
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	public static void addFileWrite(String strData, String strFileName, String strFileDir) throws Exception
	{
		
		StringBuffer sBufFileDir = new StringBuffer();
		sBufFileDir.append(strFileDir);
		sBufFileDir.append("/");
		sBufFileDir.append(strFileName);
		
		File fOutFile = new File(inspection(sBufFileDir.toString()));
		
		FileWriter fWriteFile = new FileWriter(fOutFile, true);
		
		try
		{
			String strEncode = new String(strData.getBytes(), JCNStrConst.SJIS);
			fWriteFile.write(strEncode);
			
			return;
		
		} 
		catch (IOException e)
		{
			throw e;
		}
		finally
		{
			fWriteFile.close();
		}
	}
	
	/**
	 * ファイル読み込み処理を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で読込ファイルディレクトリ(フルパス)を設定します。<br>
	 *
	 * 2.引数を元にファイル読込を行い、行をListへ格納します。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param strFileDir    出力ディレクトリ(フルパス)。
	 * @return resultList   返却用List
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	public static ArrayList<String> readFile(String strFileDir) throws Exception
	{
		
		FileReader fRead = new FileReader(inspection(strFileDir));
		
		BufferedReader br = new BufferedReader(fRead);
		
		String strline = "";
		
		ArrayList<String> resultList = new  ArrayList<String>();
		
		try
		{
			for(strline = br.readLine(); null != strline; strline = br.readLine())
			{
				resultList.add(strline);
			}
			
			return resultList;
		
		} 
		catch (IOException e)
		{
			throw e;
		}
		finally
		{
			fRead.close();
			br.close();
		}
	}
}
