/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム構築
*   モジュール名    ：JCCbatSyslogFormat
*   ソースファイル名：JCCbatSyslogFormat.java
*   作成者          ：富士通
*   日付            ：2011年08月24日
*＜機能概要＞
*   シスログのフォーマットを生成するクラスです。
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/08/24  FJ)藤田     新規作成
*
**********************************************************************/

package eo.business.common;

import java.util.HashMap;

import com.fujitsu.futurity.common.JCCSuperComExecUtil;
import com.fujitsu.futurity.common.JCCSyslogFormat;

import eo.common.util.JCCSyslogContentsChangeCache;
import eo.framework.application.JBSbatBatchInvoker;
import eo.framework.util.JBSbatAplConst;

/**
 * シスログのフォーマットを生成するクラスです。
 * 
 * @author 富士通
 */
public class JCCbatSyslogFormat
{
	
	/** 
	 * メッセージ区分
	 */
	public static final String NON = "NON";
	public static final String INF_S = "INF";
	public static final String WAR_S = "WAR";
	public static final String ERR_S = "ERR";
	
	/**
	 * tab文字
	 */
	public static final String TAB = "\t";
	
	/**
	 * アプリケーションプロパティキー
	 */
	public static final String SYSLOG_CONTENTS_CHANGE_FILE_PATH_KEY = "SYSLOG_CONTENTS_CHANGE_FILE_PATH";
	public static final String SYSLOG_CONTENTS_CHANGE_FILE_ENCODING_KEY = "SYSLOG_CONTENTS_CHANGE_FILE_ENCODING";
	
	
	/**
	 * リターンコード定義 2012/07/06
	 */
	public final static int NML = 0;
	public final static int INF = 4;
	public final static int MN  = 8;
	public final static int MJ  = 127;
	
	
	/**
	 * バッチ用シスログフォーマット部品です。
	 * @param  msgId     		メッセージID
	 * @param  msgString 		メッセージ本文
	 * @param  programJobId		プログラム定義マスタから取得したジョブID
	 * @return シスログ部品に渡したメッセージ文字列
	 */
	public static String logger(String msgId, String msgString, String programJobId)
	{
		// 環境変数よりJobIDを取得
		String JobID = System.getenv("AJSJOBNAME");
		
		// 環境変数にて取得できなかった場合は、プログラム定義マスタから取得したジョブIDを定義
		if(JobID == null)
		{
// 2013/01/25 AJSJOBNAMEとJOBIDの双方をシスログ出力する start
			//JobID = programJobId;
			JobID = "[" + programJobId + "]";
		}
		else
		{
			JobID = JobID +  " [" + programJobId + "]";
		}
// 2013/01/25 AJSJOBNAMEとJOBIDの双方をシスログ出力する end
		
		HashMap<String, Object> propMap = new HashMap<String, Object>();
		
		JCCSuperComExecUtil execCmd = new JCCSuperComExecUtil();
		JCCBatCommon.getAPLPropForExec(propMap, execCmd.EXEC_ACCESS_PROHIBIT_DIR);
		JCCBatCommon.getAPLPropForExec(propMap, execCmd.EXEC_ACCESS_PERMIT_DIR, JobID);
		JCCBatCommon.getAPLPropForExec(propMap, execCmd.EXEC_PROHIBIT_CMD);
		JCCBatCommon.getAPLPropForExec(propMap, execCmd.EXEC_PERMIT_CMD, JobID);
		JCCBatCommon.getAPLPropForExec(propMap, execCmd.EXEC_PROHIBIT_ARGS);
		JCCBatCommon.getAPLPropForExec(propMap, execCmd.EXEC_PERMIT_ARGS, JobID);
		propMap.put(execCmd.EXEC_BUFF_SIZE, JCCBatCommon.getApplicationConst(execCmd.EXEC_BUFF_SIZE));
		propMap.put(execCmd.EXEC_PERMIT_MEMORY, JCCBatCommon.getApplicationConst(execCmd.EXEC_PERMIT_MEMORY));
// 2012/03/26 FST)arata pオプションの追加 start
		propMap.put(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION, JCCBatCommon.getApplicationConst(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION));
// 2012/03/26 FST)arata pオプションの追加 end
		
		// フォーマットパターン取得
		String formatPtn = JCCBatCommon.getApplicationConst(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY );
		propMap.put(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY, formatPtn);
		
		// メーリングID取得
		String mailingId = JCCBatCommon.getApplicationConst(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY);
		propMap.put(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY, mailingId);
		
		// 運用監視通知内容変更ファイル情報取得
		JCCSyslogContentsChangeCache.setPath(JBSbatAplConst.getAplConstValue(SYSLOG_CONTENTS_CHANGE_FILE_PATH_KEY),
				JBSbatAplConst.getAplConstValue(SYSLOG_CONTENTS_CHANGE_FILE_ENCODING_KEY));
		// ジョブID+メッセージIDをキーとし、紐づく値を取得
		String msgKbnStr = JCCSyslogContentsChangeCache.getValue(programJobId+msgId);
		
		// メッセージ区分が"ＮＯＮ"の場合、シスログ出力は行わない
		if(msgKbnStr != null && NON.equals(msgKbnStr.split(TAB)[0]))
		{
			return null;
		}
		
		// 2012/07/05 メッセージ区分を判定してリターンコードをセットする start
		// 運用監視通知内容変更定義情報取得
		int returnCode = NML;
		String msgKbn = null;
		if(msgKbnStr != null)
		{
			String[] msgKbnSplit = msgKbnStr.split(TAB);
			// 置換対象の場合はMapからメッセージ区分を取得
			msgKbn = msgKbnSplit[0];
			if(INF_S.equals(msgKbn))
			{
				returnCode = INF;
			}
			else if(WAR_S.equals(msgKbn))
			{
				returnCode = MN;
			}
			else
			{
				returnCode = MJ;
			}
		}
		else
		{
			// 置換対象でない場合はメッセージIDからメッセージ区分を判定
			String lastChar = msgId.substring(msgId.length() - 1);
			if("I".equals(lastChar))
			{
				returnCode = INF;
			}
			else if("W".equals(lastChar))
			{
				returnCode = MN;
			}
			else
			{
				returnCode = MJ;
			}
		}
		// リターンコードの設定
		JBSbatBatchInvoker.setReturnCode(returnCode);
		// 2012/07/05 メッセージ区分を判定してリターンコードをセットする end
		
		// システム日時取得
		String sysdate = JCCBatCommon.getSysDateTime();
		
		String output = JCCSyslogFormat.logger(JobID, msgId, sysdate, msgString, msgKbnStr, propMap);
		
		return output;
	}
}
