/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCCWfsAccessLogProcess
*	ソースファイル名	：JBSbatCCWfsAccessLogProcess.java
*	作成者				：富士通　
*	作成日				：2012年07月20日
*＜機能概要＞
*　WebFOCUSアクセスログ加工部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/07/20   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStreamWriter;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.common.util.JCCWfsAccessLogTargetCache;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.util.JBSbatAplConst;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCCWfsAccessLogProcess extends JBSbatBusinessService
{
	/** WebFOCUSアクセスログ対象ファイルパスキー */
	private static String WFS_ACCESS_LOG_TARGET_FILE_PATH_KEY = "WFS_ACCESS_LOG_TARGET_FILE_PATH";
	/** WebFOCUSアクセスログ対象ファイル文字コードキー */
	private static String WFS_ACCESS_LOG_TARGET_FILE_ENCODING_KEY = "WFS_ACCESS_LOG_TARGET_FILE_ENCODING";
	/** WebFOCUSアクセスログ文字コードキー */
	private static String WFS_ACCESS_LOG_ENCODING_KEY = "WFS_ACCESS_LOG_ENCODING";
	/** WebFOCUSアクセスログ改行コード */
	private static String WFS_ACCESS_LOG_NEWLINE_CODE_KEY = "WFS_ACCESS_LOG_NEWLINE_CODE";
	/** 中間ファイルキー */
	private static String WFS_ACCESS_LOG_TARGET_FILE_NM_KEY = "acc_wfs_";
	/** 中間ファイルの配置先 */
	private static String MID_DIR_CC_KEY = "MID_DIR_CC";
	/** ログ出力先ディレクトリ */
	private static String LOGDIR_KEY = "LOGDIR";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 中間ファイルディレクトリより、WebFOCUSアクセスログ中間ファイルを取得する
		// 中間ファイルディレクトリ取得
		String inputDir = JCCBatCommon.getApplicationConst(MID_DIR_CC_KEY);
		// 取得できない場合はシステムエラーとする
		if(inputDir == null || "".equals(inputDir))
		{
			throw new JBSbatBusinessException("ECCB0130CE", new String[]{"中間ファイルの配置先（キー：" + MID_DIR_CC_KEY +"）"});
		}
		// WebFOCUSアクセスログ文字コード取得
		String wfsAccessLogEncoding = JBSbatAplConst.getAplConstValue(WFS_ACCESS_LOG_ENCODING_KEY);
		// 取得できない場合はシステムエラーとする。
		if(wfsAccessLogEncoding == null || "".equals(wfsAccessLogEncoding))
		{
			throw new JBSbatBusinessException("ECCB0130CE", new String[]{"WebFOCUSアクセスログ文字コード（キー：" + WFS_ACCESS_LOG_ENCODING_KEY +"）"});
		}
		// WebFOCUSアクセスログ改行コード取得
		String wfsAccessLogNewlineCode = JBSbatAplConst.getAplConstValue(WFS_ACCESS_LOG_NEWLINE_CODE_KEY);
		// 取得できない場合はシステムエラーとする。
		if(wfsAccessLogNewlineCode == null || "".equals(wfsAccessLogNewlineCode))
		{
			throw new JBSbatBusinessException("ECCB0130CE", new String[]{"WebFOCUSアクセスログ改行コード（キー：" + WFS_ACCESS_LOG_NEWLINE_CODE_KEY +"）"});
		}
		// 改行コードを文字列から改行コードへ変換
		if(wfsAccessLogNewlineCode.equals("\\r\\n"))
		{
			wfsAccessLogNewlineCode = "\r\n";
		}
		else
		{
			wfsAccessLogNewlineCode = "\n";
		}
		// 出力先のディレクトリ取得
		String outputDir = JCCBatCommon.getApplicationConst(LOGDIR_KEY);
		// ディレクトリのファイルオブジェクト取得
		File dir = new File(inputDir);
		// ファイルリスト取得
		File[] files = dir.listFiles();
		// 存在するファイルぶんループ処理
		for(int i=0; i<files.length; i++)
		{
			// ファイル名取得
			String fileName = files[i].getName();
			// ファイル名に「acc_wfs_」を含んでいる、かつ、ファイルであること
			if(fileName.indexOf(WFS_ACCESS_LOG_TARGET_FILE_NM_KEY) != -1 && files[i].isFile())
			{
				BufferedReader br = null;
				BufferedWriter writer = null;
				try
				{
					FileReader in = new FileReader(files[i]);
					br = new BufferedReader(in);
					String line;
					StringBuffer bf = new StringBuffer();
					// 一つ前のセッションキーを保持
					String beforeSessionKey = null;
					// 日付が同じ場合の識別子
					int sikibetu = 0;
					while((line = br.readLine()) != null)
					{
						// タブおよびブランクを削除
						line = line.replaceAll("\t", "");
						line = line.replaceAll(" ", "");
						// セッションキー|セッション日付|セッション開始時間|ユーザーID|クライアントIPアドレス|プロシージャ名
						String[] lineSplit = line.split("\\|");
						// 6つに分割されなかった場合は終了
						if(lineSplit.length != 6)
						{
							continue;
						}
						// WebFOCUSアクセスログ対象ファイル情報取得
						JCCWfsAccessLogTargetCache.setPath(JBSbatAplConst.getAplConstValue(WFS_ACCESS_LOG_TARGET_FILE_PATH_KEY),
								JBSbatAplConst.getAplConstValue(WFS_ACCESS_LOG_TARGET_FILE_ENCODING_KEY));
						// 対象プロシージャ名をキーとして操作区分を取得
						String msgKbnStr = JCCWfsAccessLogTargetCache.getValue(lineSplit[5]);
						// 存在しない場合は終了
						if(msgKbnStr == null)
						{
							continue;
						}
						// アクセスログの組み立て
						// システムID（K058固定）
						bf.append("K058");
						bf.append("|");
						// 操作端末（クライアントIPアドレス）
						bf.append(lineSplit[4]);
						bf.append("|");
						// 操作者ログインID（ユーザID）
						bf.append(lineSplit[3]);
						bf.append("|");
						// 操作対象ID（WebFOCUS+識別子+システム時刻）
						// 前セッションキーがnull、または、今セッションキーと異なる場合、識別子を1にする
						if(beforeSessionKey== null || !beforeSessionKey.equals(lineSplit[0]))
						{
							// 識別子を1にする
							sikibetu = 1;
							// 前セッションキーに今セッションキーを代入
							beforeSessionKey = lineSplit[0];
						}
						else
						{
							// 識別子を加算する
							sikibetu++;
						}
						bf.append("WebFOCUS" + sikibetu + "_" + lineSplit[1] + lineSplit[2]);
						bf.append("|");
						// 操作対象T#（ブランク）
						bf.append("|");
						// 操作対象C#（ブランク）
						bf.append("|");
						// 操作区分（WebFOCUSアクセスログ対象ファイルに定義されている操作区分）
						bf.append(msgKbnStr);
						bf.append("|");
						// 操作業務（プロシージャ名）
						bf.append(lineSplit[5]);
						bf.append("|");
						// 特記事項（セッションキー）
						bf.append(lineSplit[0]);
						bf.append("|");
						// 操作プログラム（ブランク）
						bf.append("|");
						// 操作日時（システム時刻14桁）
						bf.append(lineSplit[1] + lineSplit[2].substring(0,6));
						bf.append("|");
						// 操作運用日（ブランク）
						bf.append(wfsAccessLogNewlineCode);
					}
					
					// アクセスログを出力する。
					File outFile = new File(outputDir + File.separator + fileName);
					writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),wfsAccessLogEncoding));
					writer.write(bf.toString());
					// クローズしないと削除できないためクローズする
					br.close();
					// 取り込んだ中間ファイルは削除する
					files[i].delete();
					
				}
				finally
				{
					// クローズ処理を行う
					if(br != null)
					{
						br.close();
					}
					
					if(writer != null)
					{
						writer.close();
					}
				}
			}
		}
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
