/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKTjgsAreaIfAddRsltRcv
*	ソースファイル名	：JBSbatKKTjgsAreaIfAddRsltRcv.java
*	作成者				：富士通　
*	作成日				：2013年01月07日
*＜機能概要＞
*　他事業者向けエリア情報登録結果ファイル受信部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/01/07   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatConst;
import eo.business.common.JKKTjgsAreaIfAddRsltRcvFile;
import eo.common.constant.JCNStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKTjgsAreaIfAddRsltRcv extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** ダウンロードファイル格納先ディレクトリパス */
	private String dlDirPath = "";
	
	/** コンペア用ファイル格納先ディレクトリパス */
	private String cpDirPath = "";
	
	/** ダウンロードファイルパス */
	private String dlFilePath = "";
	
	/** コンペア用ファイルパス */
	private String cpFilePath = "";
	
	/** ダウンロードファイル名 */
	private String dlFileName = "";
	
	/** コンペア用ファイル名 */
	private String cpFileName = "";
	
	/** 半角スラッシュ*/
	public static final String T_HALF_SLASH = "/";
	
	/** 終了コード（エラーなし）*/
	public static final String NG_CODE = "02";
	
	/** データ作成日時*/
	public static final int DAY_RECODE = 1;
	
	/** コンペアファイル識別子*/
	public static final String CP_JUDGE = "_CP";
	
	private static final String MSG_SHUTSURYOKU_DIR = "出力先ディレクトリ";
	
	/** 文字コード(Shift-JIS)*/
	public static final String UTF8 = "UTF-8";
	
	/** 共通部品（スマートバリュー受信ファイル部品） */
	private JKKTjgsAreaIfAddRsltRcvFile receiveFile = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// 共通部品の初期化
		receiveFile = new JKKTjgsAreaIfAddRsltRcvFile();
		// ログを設定
		receiveFile.setLogger(commonItem);
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		// フリー項目取得
		String dil = commonItem.getFreeItem();
		
		// フリー項目の存在チェック
		if (null == dil || "".equals(dil)) 
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0890CW, new String[] {MSG_SHUTSURYOKU_DIR});
		}
		else
		{
			// ファイル受信ディレクトリを取得
			String[] free = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
			dlDirPath = free[0];
			cpDirPath = free[1];
		}
		
		// KDDIからファイルの受信を行う。
		// ファイル受信処理は共通部品により行う。
		receiveFile.receiveFile(dlDirPath);
		if (!receiveFile.existReceiveFile())
		{
			// ファイルの受信エラーを返す。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0860CW);
		}
		else
		{
			// ダウンロードファイル名を取得
			dlFileName = receiveFile.getFileName();
			
			// コンペア用ファイルの受信を行う。
			receiveFile.receiveFile(cpDirPath);
			
			if (!receiveFile.existReceiveFile())
			{
				// コンペア用ファイルの受信エラーを返す。
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0940CW);
			}
			else
			{
				// コンペア用ファイル名を取得
				cpFileName = receiveFile.getFileName();
			}
		}
		
		// 取得ファイル名の不一致チェック
		if (dlFileName.equals(cpFileName))
		{
			// 受信ファイルパスの作成
			dlFilePath = dlDirPath + T_HALF_SLASH + dlFileName;
			cpFilePath = cpDirPath + T_HALF_SLASH + cpFileName;
			
			JBSbatInputFileUtil dlFile = new JBSbatInputFileUtil(dlFilePath);
			JBSbatInputFileUtil cpFile = new JBSbatInputFileUtil(cpFilePath);
			
			// 文字コードの設定
			dlFile.setEncode(UTF8);
			cpFile.setEncode(UTF8);
			
			//改行コードの設定
			dlFile.setLine(JCNStrConst.S_LINE_SEPARAOR_LF);
			cpFile.setLine(JCNStrConst.S_LINE_SEPARAOR_LF);
			
			//ファイル内容格納領域の作成
			ArrayList<String> dlLine = new ArrayList<String>();
			ArrayList<String> cpLine = new ArrayList<String>();
			
			int dlLineCount = 0;
			int cpLineCount = 0;
			
			try
			{
				
				// ダウンロードファイル
				dlFile.createReader();
				
				
				while (dlFile.ready())
				{
					// 一行読み込み
					String line = dlFile.readLine();
					
					// ファイル内容を格納
					dlLine.add(line);
				}
				// ダウンロードファイルの行数を取得
				dlLineCount = dlLine.size();
				
				
				// コンペア用ファイル
				cpFile.createReader();
				
				while (cpFile.ready())
				{
					// 一行読み込み
					String line = cpFile.readLine();
					// ファイル内容を格納
					cpLine.add(line);
				}
				cpLineCount = cpLine.size();
				
			}
			catch (IOException ioe)
			{
			}
			finally
			{
				// ダウンロードファイルクローズ
				dlFile.close();
				// コンペア用ファイルクローズ
				cpFile.close();
			}
			
			// 空ファイルチェック
			if (0 == dlLineCount || 0 == cpLineCount){
				
				fileRemove();
				
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0950CW);
			}
			else
			{
				// 終了コード取得
				String endCode = dlLine.get(0);
				
				// 行数チェック
				if (dlLineCount == cpLineCount)
				{
					int i = 0;
					for(i=0; i<dlLineCount; i++)
					{
						String dlWork = dlLine.get(i);
						String cpWork = cpLine.get(i);
						
						if(!dlWork.equals(cpWork))
						{
							fileRemove();
							
							throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0880CW);
						}
					}
					
					// コンペア用ファイルの削除
					File deleateFile = new File(cpFilePath);
					deleateFile.delete();
					
					// 終了コードチェック
					if (NG_CODE.equals(endCode))
					{
						int j = 0;
						
						for(j=1; j<dlLineCount; j++)
						{
							// データ作成日時およびエラー内容の取得
							String printRecode = dlLine.get(j);
							
							if (j == DAY_RECODE)
							{
								// データ作成日時を業務ログに出力
								//super.logPrint.printLogMsg(JPCBatchMessageConstant.EKKB0930AI, printRecode);
								super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0930AI, new String[] {printRecode});
							}
							else
							{
								// エラー内容を業務ログに出力
								//super.logPrint.printLogMsg(JPCBatchMessageConstant.EKKB0960AI, printRecode);
								
								super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0960AI, new String[] {printRecode});
							}
						}
						
						// エラーメッセージを出力
						throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0920TW);
					}
					else
					{
						// データ作成日時の取得
						String createDate = dlLine.get(1);
						
						// super.logPrint.printLogMsg(JPCBatchMessageConstant.EKKB0930AI,createDate);
						super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0930AI, new String[] {createDate});
					}
				}
				else
				{
					fileRemove();
					
					throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0880CW);
				}
			}
		}
		else
		{
			// ファイルのパスを取得
			cpFilePath = cpDirPath + T_HALF_SLASH + cpFileName;
			fileRemove();
			
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0870CW);
		}
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * コンペアファイル移動処理
	 */
	public void fileRemove(){
		String rename = dlDirPath + T_HALF_SLASH + cpFileName + CP_JUDGE;
		File bfFile = new File(cpFilePath);
		File renameFile = new File(rename);
		
		// コンペア用ファイルの名前を変更し、フォルダ移動
		bfFile.renameTo(renameFile);
		
	}
}
