/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACFtpPut
*	ソースファイル名	：JBSbatACFtpPut.java
*	作成者				：富士通　
*	作成日				：2011年12月13日
*＜機能概要＞
*　FTP送信部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/13   富士通		新規作成
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.application.JBSbatBusinessException;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACFtpPut extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** FTP転送対象ファイルリスト(ローカルのフルパス)（ファイル名 or ディレクトリ名） */
	private ArrayList<String> 		fileNameList		 = 	null;
	
	/** 退避.インターフェースID */
	private String 				interfaceId 		= 	null;

	/** 退避.ESB種別 1:ISI(定数JCCModelCommon.ISI) 2:III(定数JCCModelCommon.III) */
	private int 					esbSbt 				= 	0;
	
	/** ファイルリスト指定開始位置 */
	private static final int 	COUNT				=	2;
	
	/** 退避.ファイルリスト */
	private File 					targetDir	 		= 	null;
	
	/** 退避.ディレクトリの中にあるファイルリスト */
	private String					directoryFileList	=	null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate = " + opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem = " + freeItem + "]");
		
		// フリー項目を区切る
		String[] freeSplit 	= super.freeItem.split(JACStrConst.FREE_DIV);

		// FTP転送依頼するインターフェイスID
		this.interfaceId = freeSplit[0];
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][インターフェイスID = " + freeSplit[0] + "]");

		// FTP転送先のESB種別
		this.esbSbt = Integer.parseInt(freeSplit[1]);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][ESB種別 = " + freeSplit[1] + "]");
		
		// FTP転送対象ファイルリスト(ローカルのフルパス)
		fileNameList = new ArrayList<String>();

		int k = COUNT;
		if(k >=  freeSplit.length)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial][フリー項目数不正]");

			// メッセージコード登録後修正：EACB0720CE
			// 業務例外を発生「【エラー】フリー項目不正エラー：%1%」
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0720CE, new String[] {super.freeItem});
		}
		
		while(k < freeSplit.length)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][指定ファイル" + (k - 1) + " = " + freeSplit[k] + "]");

			// targetDirのインスタンスを作成する
			targetDir = new File(freeSplit[k]);
			
			// targetDirが「ディレクトリ」のとき
			if (targetDir.isDirectory())
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][指定ファイル" + (k - 1) + " = ディレクトリ]");

				fileNameGet(targetDir);
			}
			
			// targetDirが「ファイル」のとき
			else if (targetDir.isFile())
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][指定ファイル" + (k - 1) + " = ファイル]");

				// fileNameListにファイル名を格納する
				fileNameList.add(freeSplit[k]);
			}
			
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial][指定ファイルが存在しない]");

				// メッセージコード登録後修正：EACB0710CE
				// 業務例外を発生「指定されたファイルまたはディレクトリが存在しません。：%1%」
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0710CE, new String[] {freeSplit[k]});
			}
			k++;
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * ディレクトリの中にあるファイルを取得する
	 * @param File targetDirectory 送信対象のファイルが格納されているディレクトリのフルパス
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void fileNameGet(File targetDirectory) throws Exception
	{
		// fileListに指定したディレクトリの中にあるファイルを格納する
		File[] fileList = targetDirectory.listFiles();
		
		// fileListに格納されているファイルの個数回繰り返す
		for (int i = 0 ; i < fileList.length; i++)
		{
			// ディレクトリの中にあるファイルリスト
			directoryFileList = fileList[i].getAbsolutePath();
			
			// fileNameのインスタンスを作成する
			File fileName = new File(directoryFileList);
			
			// 指定したディレクトリの中のファイルが「ファイル」のとき
			if(fileName.isFile())
			{
				// fileNameListにファイル名を格納する
				fileNameList.add(directoryFileList);
			}
			
		}
	}
	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");

		// 結果を格納するMAPを生成
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		
		// FTP部品アクセッサを呼び出す
		JCCBatCommon.putFTP(commonItem, fileNameList, interfaceId, esbSbt, resultMap);
		
		// エラー区分を取得
		String errKbn = resultMap.get(JACStrConst.FTP_ERR_KBN).toString();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][エラー区分 = " + errKbn + "]");

		// 接続エラーの場合
		if (JACStrConst.FTP_ERR_KBN_CONNECT_ERR.equals(errKbn))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][接続エラー フラグ判定前]");

			// 接続エラー情報を取得
			HashMap<?, ?> connectErr = (HashMap<?, ?>)resultMap.get(JACStrConst.FTP_CONNECT_ERR);
			// エラーフラグを取得
			boolean errFlg = Boolean.valueOf(connectErr.get(JACStrConst.FTP_CONNECT_ERR_FLG).toString()).booleanValue();
			// 接続エラーの判定処理
			if (!errFlg)
			{
				// 接続エラーの場合
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][接続エラー フラグ判定後]");

				// エラーメッセージを取得
				String msg = connectErr.get(JACStrConst.FTP_CONNECT_ERR_MESSAGE).toString();
				// 業務例外を発生
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0530CE, new String[] {msg});
			}
		}
		// ファイルエラーの場合
		else if (JACStrConst.FTP_ERR_KBN_FILE_ERR.equals(errKbn))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][ファイルエラー フラグ判定前]");
			
			// ファイルエラーリストの回数分繰り返す
			ArrayList<?> fileErrList = (ArrayList<?>)resultMap.get(JACStrConst.FTP_FILE_ERR);
			for(int i = 0; i < fileErrList.size(); i++)
			{
				// ファイルエラー情報を取得
				HashMap<?, ?> fileErr = (HashMap<?, ?>)fileErrList.get(i);
				// エラーフラグを取得
				boolean errFlg = Boolean.valueOf(fileErr.get(JACStrConst.FTP_FILE_ERR_FLG).toString()).booleanValue();
				// ファイルエラーの判定処理
				if (!errFlg)
				{

					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][ファイルエラー フラグ判定後]");
					
					// エラーメッセージを取得
					String msg = fileErr.get(JACStrConst.FTP_FILE_ERR_MESSAGE).toString();
					// 業務例外を発生
					throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0530CE, new String[] {msg});
				}
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][execute]");

		// nullを返却
		return null;
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
