/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCbatMojiChgUtil
*   ソースファイル名：JCCbatMojiChgUtil.java
*   作成者          ：富士通
*   日付            ：2011年06月01日
*＜機能概要＞
*   文字列変換リファレンス定義と変換ルールに従って文字列を置換します
*＜修正履歴＞
*   バージョン  修正日       修正者    修正内容
*   v1.00.00    2011/06/01   富士通    新規作成
*
**********************************************************************/
package eo.business.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCMConvertCharacter;

import eo.common.util.JCCFrameworkException;
import eo.business.common.JCCbatMojiChgReferenceCache;
import eo.business.common.JCCbatMojiChgRuleCache;
import eo.framework.application.JCCbatFrameworkException;

/**
 * バッチ用文字変換部品です。
 * <BR>
 * @author 富士通
 */
public class JCCbatConvertCharacterUtil extends JCMConvertCharacter
{
	
	/**
	 * バッチ用文字変換部品です。
	 * 
	 * @param jobID ジョブID
	 * @param key 変換対象となる項目名
	 * @param srcStr 変換元となる文字列
	 * @return StringBuffer
	 * @throws JCCbatFrameworkException
	 */
	public static StringBuffer convertCharacter(String jobID, String key, String srcStr) throws JCCbatFrameworkException
	{
		// 出力用の領域
		StringBuffer outBuffer = new StringBuffer();
		
		// ジョブIDのnullチェック
		if(chkObject(jobID))
		{
			throw new JCCbatFrameworkException("ジョブIDが指定されていません。");
		}
		// ジョブIDの桁数チェック
		if(jobID.length() != 11)
		{
			throw new JCCbatFrameworkException("ジョブIDが11桁で指定されていません。");
		}
		// 変換元文字列のnullチェック
		if(null == srcStr)
		{
			throw new JCCbatFrameworkException("変換元となる文字列がnullです。");
		}
		// 変換元文字列が空文字の場合はそのまま復帰
		if("".equals(srcStr))
		{
			return new StringBuffer(srcStr);
		}
		
		// 入力パラメータをローカル変数にコピー
		String inputStr = srcStr;
		
		// 文字変換処理
		try
		{
			// アプリケーションプロパティファイルのパスを設定
			JCCbatMojiChgReferenceCache.setPath();
			JCCbatMojiChgRuleCache.setPath();
			
			// 文字変換リファレンス定義からバッチアプリケーションIDに紐づく文字列を取得(項目名のリスト)
			String strReference = JCCbatMojiChgReferenceCache.getValue(jobID);
			// 該当するIDがリファレンスに存在しない場合はここで復帰
			if(chkObject(strReference))
			{
				return new StringBuffer(srcStr);
			}
			
			// リファレンス文字列をタブ文字（または空白）によって分解
			String[] localReference = strReference.split("\t| ");
			// 取得したキーリストのフォーマットチェック
			if(chkObject(localReference))
			{
				throw new JCCFrameworkException("文字変換リファレンス定義ファイルのフォーマット誤り。システムIDが未設定。");
			}
			else if(localReference.length < 2)
			{
				throw new JCCFrameworkException("文字変換リファレンス定義ファイルのフォーマット誤り。項目名が未設定。");
			}
			
			// 取得したリファレンスリストの中に変換対象の項目名が存在しない場合はここで復帰
			ArrayList<String> chkAry = new ArrayList<String>(Arrays.asList(localReference));
			if(chkAry.contains(key) == false)
			{
				return new StringBuffer(srcStr);
			}
			
			// システムIDの取得
			String ruleSystemKey = localReference[0];
			
			// 文字変換ルール定義から変換のキーと値を格納したHashMapを取得
			HashMap<String, Object> ruleMap = JCCbatMojiChgRuleCache.getMap(ruleSystemKey);
			
			// 入力された文字列を文字変換ルールに従って置換
			outBuffer.append(convertCharacter(inputStr, ruleMap));
		}
		catch(Exception e)
		{
			String str = e.getMessage();
			throw new JCCFrameworkException(str);
		}
		return outBuffer;
	}
}
	