/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCRCsvFileShori
*	ソースファイル名：JCRCsvFileShori.java
*	作成者			：富士通
*	日付			：2011年04月17日
*＜機能概要＞
*	顧客対応履歴管理システム用CSVファイル関連共通部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/04/17	富士通		新規作成
*
**********************************************************************/

package eo.common.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import eo.common.constant.JCRStrConst;

/**
 * 顧客対応履歴管理システム用CSVファイル関連共通部品<p>
 * <br>
 * @author 富士通
 */
class JCRCsvFileShori
{

	/**
	 * 引数で指定されたCSVファイル名からファイルの内容を一行ずつ読取り、文字列リスト変換処理に渡す
	 * 処理結果をList型に格納し、全ての行の読取りが完了したら、格納したListを呼出し元に返す。
	 * 引数で指定されたファイルパスを取得し、返却する。
	 * @param fileName ファイル名(パスを含む)
	 * @return List<List<String>> ファイル内データを格納したリスト
	 * @throws Exception 例外
	 */
	static List<List<String>> convCsvFiletoList(String fileName) throws Exception
	{

		List<List<String>> csvFileList = new ArrayList<List<String>>();

		// CSV指定ファイルパスチェック
		if (fileName == null || "".equals(fileName.trim()))
		{
			// エラーの場合空文字を返す。
			return null;
		}

		BufferedReader br = null;

		try
		{

			// CSV指定ファイル読込み
			br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(JCRUtilCommon.inspection(fileName))), JCRStrConst.DEFAULT_ENCODE));

			// CSVファイル一行読込み
			String lineData = br.readLine();

			while (lineData != null)
			{
				if (!("".equals(lineData.trim())))
				{
					// リストに格納された一行分のファイルデータを格納
					List<String> workList = convStringToList(lineData);
					if (workList != null)
					{
						csvFileList.add(workList);
					}
				}

				// CSVファイル一行読込み
				lineData = br.readLine();
			}

		}
		catch(IOException ioe)
		{
			// 例外処理
			return null;
		}
		finally
		{
			if (br != null)
			{
				try
				{
					br.close();
				}
				catch (IOException ioe)
				{
					;
				}
			}
		}

		return csvFileList;
	}

	/**
	 * 引数で指定されたバイトデータから一行ずつデータを読取り、文字列リスト変換処理に渡す
	 * 処理結果をList型に格納し、全ての行の読取りが完了したら、格納したListを呼出し元に返す。
	 * 引数で指定されたファイルパスを取得し、返却する。
	 * @param byteData バイトデータ
	 * @return List<List<String>> ファイル内データを格納したリスト
	 * @throws Exception 例外
	 */
	static List<List<String>> convCsvFiletoList(byte[] byteData) throws Exception
	{

		List<List<String>> csvFileList = new ArrayList<List<String>>();

		BufferedReader br = null;

		try
		{

			// CSV指定ファイル読込み
			String data = new String(byteData, JCRStrConst.DEFAULT_ENCODE);
			br = new BufferedReader(new StringReader(data));

			// CSVファイル一行読込み
			String lineData = br.readLine();

			while (lineData != null)
			{
				if (!("".equals(lineData.trim())))
				{
					// リストに格納された一行分のファイルデータを格納
					List<String> workList = convStringToList(lineData);
					if (workList != null)
					{
						csvFileList.add(workList);
					}
				}

				// CSVファイル一行読込み
				lineData = br.readLine();
			}

		}
		catch(IOException ioe)
		{
			// 例外処理
			return null;
		}
		finally
		{
			if (br != null)
			{
				try
				{
					br.close();
				}
				catch (IOException ioe)
				{
					;
				}
			}
		}

		return csvFileList;
	}

	/**
	 * 引数で指定されたCSVファイルの一行データと囲み文字を文字列リスト変換処理に渡し
	 * 処理結果を呼出し元に返す。
	 * @param lineData 一行分のCSVデータ
	 * @return List<String> 項目ごとにCSVデータを格納したList
	 * @throws Exception 例外
	 **/
	static List<String> convStringToList(String lineData) throws Exception
	{

		// CSV指定ファイル読込み
		// 文字列リスト変換エスケープ処理に囲み文字の"を指定して呼出す。
		List<String> resultList = convEscapeStringToList(lineData, "\"");

		return resultList;

	}

	/**
	 * 引数で指定されたCSVファイルの一行データを項目ごとに分割し、
	 * 引数の囲い文字を除外した状態でList格納する。
	 * @param  line 一行分のCSVデータ
	 * @param  kakoiMoji 囲み文字
	 * @return List 項目ごとにCSVデータを格納したList
	 * @throws Exception 例外
	 */
	static List<String> convEscapeStringToList(String line, String kakoiMoji) throws Exception
	{
		
		// 戻り値格納用List
		List<String> resultList = new ArrayList<String>();

		// データがない場合(trim()済みのデータを想定)
		if (line == null || line.length() == 0) 
		{
			return null;
		}

		// 先頭 または 最後がダブルクォート以外の場合 
		if (!line.startsWith(kakoiMoji) || !line.endsWith(kakoiMoji))
		{
			return null;
		}

		// データ分割（「","」で分割）
		String[] result = line.substring(1).split("\"{1}\\s*,\\s*\"{1}");
		for (int i = 0; i < result.length; i++)
		{
			resultList.add(result[i]);
		}

		// 最終項目のダブルクォートを削除
		String strWork = resultList.get(resultList.size() - 1);
		resultList.set(resultList.size() - 1, strWork.replaceAll("\"{1}\\z", ""));
		
		// 1行分のデータを格納したListを返却
		return resultList;
	}

	/**
	 * 引数で指定されたファイルを削除する
	 * @param  filePath 削除を行うファイルパス
	 * @return 正常に完了した場合true
	 * @throws Exception 例外
	 */
	static boolean deleteTempFile(String filePath) throws Exception
	{
		if (filePath != null)
		{
			File file = new File(JCRUtilCommon.inspection(filePath));
			return file.delete();
		}
		return false;
	}

	/**
	 * 引数で指定されたディレクトリを削除する（ファイルやサブフォルダが含まれていても削除します）
	 * @param  dirPath 削除を行うファイルパス
	 * @return 正常に完了した場合true
	 * @throws Exception 例外
	 */
	static boolean deleteDir(String dirPath) throws Exception
	{
		boolean result = false;
		if (dirPath == null)
		{
			return result;
		}
		
		File dir = new  File(JCRUtilCommon.inspection(dirPath));
		if (dir.exists() == false)
		{
			return result;
		}
		else if (dir.isFile())
		{
			result = dir.delete();
		}
		else if (dir.isDirectory())
		{
			File[] fileList = dir.listFiles();
			for (int i = 0; i < fileList.length; i++)
			{
				String subDirPath = fileList[i].getParent() + File.separator + fileList[i].getName();
				result = deleteDir(subDirPath);
			}
			result = dir.delete();
		}
		return result;
		
	}

}
