/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：Futurity
*	モジュール名	：JBSbatCsvFileSyori
*	ソースファイル名：JBSbatCsvFileSyori.java
*	作成者			：富士通
*	日付			：2011年04月7日
*＜機能概要＞
*	業務サービススーパークラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/02/28	富士通		新規作成
*	v4.00.00	2012/09/12	FJ)早崎		【TAI-2012-0000095】Fortify対応
*	v4.01.00	2012/11/15	FJ)伊藤		【TAI-2012-0000140】品質強化対策
*
**********************************************************************/


package eo.business.common;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.item.JBSbatCommonItem;


public class JBSbatZMCsvFileSyori {

	/**
	 * 引数で指定されたCSVファイル名からファイルの内容を一行ずつ読取り、カンマ区切りの文字を
	 * List格納する。格納した行データのArrayListをArrayList配列に順番に格納し返却する。
	 * 引数で指定されたファイルパスを取得し、返却する。
	 * @param commonItem バッチ共通パラメータ電文
	 * @param fileName ファイル名(パスを含む)
	 * @return ArrayList ファイル内データを格納したリスト
	 * @throws Exception 例外
	 */
	public static ArrayList<ArrayList<String>> convCsvFiletoList(JBSbatCommonItem commonItem,
																	String fileName) throws Exception
																	{

		ArrayList<ArrayList<String>> csvFileList = new ArrayList<ArrayList<String>>();

		// CSV指定ファイルパスチェック
		if(null == fileName || JZMBatConst.BLANK.equals(fileName))
		{
			// エラーの場合空文字を返す。
			return null;
		}
		
		File file = null;
		FileReader fr = null;
		BufferedReader br = null;
		
		try
		{
			// CSV指定ファイル読込み
			file = new File(fileName);
			fr = new FileReader(file);
			br = new BufferedReader(fr);
			ArrayList<String> workList;
			String lineData = "";
			
			while (null != lineData)
			{
				// ワークリストを初期化
				workList = new ArrayList<String>();

				// CSVファイル一行読込み
				lineData = br.readLine();
				if(null != lineData && !JZMBatConst.BLANK.equals(lineData))
				{
					
					// リストに格納された一行分のファイルデータを格納
					workList = convStringToList(commonItem, lineData);
					csvFileList.add(workList);
				}
			}
		}
		catch(IOException e)
		{
			// EZMB0020CE:入力ファイルが存在しません。（ファイルパス:%1%）
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0140CW, new String[]{fileName});
		}
		finally
		{
			try
			{
				br.close();
			}
			catch (Exception e)
			{
				
			}
			
			try
			{
				fr.close();
			}
			catch  (Exception e)
			{
				
			}
		}

		return csvFileList;
	}
	
	/**
	 * 引数で指定されたCSVファイルの一行データを項目ごとにArrayList格納する。
	 * @param commonItem バッチ共通パラメータ電文
	 * @param lineData 一行分のCSVデータ
	 * @return ArrayList 項目ごとにCSVデータを格納したList
	 * @throws Exception 例外
	 **/
	public static ArrayList<String> convStringToList(JBSbatCommonItem commonItem,
														String lineData) throws Exception
														{
		
		// 戻り値格納用List
		ArrayList<String> resultList = new ArrayList<String>();
		
		// CSV指定ファイル読込み
		// 文字列リスト変換エスケープ処理に囲み文字の"を指定して呼出す。
		resultList = convEscapeStringToList(commonItem, lineData, '"');
		
		return resultList;
		
	}
	
	/**
	 * 引数で指定されたCSVファイルの一行データを項目ごとに分割し、
	 * 引数の囲い文字を除外した状態でList格納する。
	 * @param commonItem バッチ共通パラメータ電文
	 * @param  line 一行分のCSVデータ
	 * @param  kakoiMoji 囲み文字
	 * @return ArrayList 項目ごとにCSVデータを格納したList
	 * @throws Exception 例外
	 */
	public static ArrayList<String> convEscapeStringToList(JBSbatCommonItem commonItem,
															String line,
															char kakoiMoji) throws Exception
															{
		
		// 戻り値格納用List
		ArrayList<String> resultList = new ArrayList<String>();

		try
		{
			StringTokenizer st = new StringTokenizer(line, JZMBatConst.CONMA );
			StringBuffer bf = new StringBuffer();
			int len = 0;
			
			while(st.hasMoreElements())
			{
				String s =st.nextToken();
				bf = new StringBuffer();
				bf.append(s);
				len = bf.length();
				
				// 先頭文字が囲み文字の場合除去
				if(bf.charAt(0) == (kakoiMoji))
				{
					bf.delete(0, 1);
					len = len - 1;
				}
				
				// 終端文字が囲み文字の場合除去
				if(bf.charAt(len-1) == (kakoiMoji))
				{
					bf.delete(len-1, len) ;
				}
				
				// 戻り値となるリストに1項目分のデータ格納
				resultList.add(bf.toString());
			}
		} catch(NoSuchElementException e)
		{
			// 例外処理
			
			commonItem.getLogPrint().printDebugLog("JBSbatZMCsvFileSyori.convEscapeStringToList NoSuchElementException発生:");
			
			throw e;
		}
		// 1行分のデータを格納したListを返却
		return resultList;
	}
	
	/**
	 * 引数で指定された文字列を引数の囲い文字で囲う処理。
	 * @param  line 編集対象文字列
	 * @param  kakoiMoji 囲い文字
	 * @return Stirng 編集後の文字列
	 * @throws Exception 例外
	 */
	public static String addDoubleQuot(String data) throws Exception
	{
		String addData = addKakoiMoji(data, JZMBatConst.DOUBLE_QUOT);
		return addData.toString();
	}
	
	/**
	 * 引数で指定された文字列を引数の囲い文字で囲う処理。
	 * @param  line 編集対象文字列
	 * @param  kakoiMoji 囲い文字
	 * @return Stirng 編集後の文字列
	 * @throws Exception 例外
	 */
	public static String addKakoiMoji(String data, String kakoiMoji) throws Exception
	{
		StringBuffer addData = new StringBuffer(kakoiMoji).append(data).append(kakoiMoji);
		return addData.toString();
	}
}
