/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKBPCommon
*   ソースファイル名：JCKBPCommon.java
*   作成者          ：富士通
*   日付            ：2011年12月05日
*＜機能概要＞
*   サービスコンポーネント呼出用のパラメータ編集を行う。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/05   富士通      新規作成
*
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.values.MessageID;
import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYbpmLog;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.util.JCKLcsCommonUtil;
import eo.common.util.JPCUtilCommon;

/**
 * ＢＰ共通アクセッサー部品です。<p>
 * サービスで実装します。<p>
 * <BR>
 * @ author 富士通
 */
public class JCKBPCommon extends JPCUtilCommon {

	/**
	 * オブジェクトがNULL、または空文字か判定します。<br />
	 * @param val 判定するオブジェクト
	 * @return NULL または空文字の場合はtrue
	 */
	public static boolean isNullOrBlank(Object val){
		return JCKLcsCommonUtil.isNullOrBlank(val);
	}

	/**
	 * リストがNULL、または０件か判定します。
	 * @param list 判定するリストオブジェクト
	 * @return NULL または０件のリストの場合はtrue
	 */
	@SuppressWarnings("unchecked")
	public static boolean isNullOrEmpty(List list){
		return JCKLcsCommonUtil.isNullOrEmpty(list);
	}

	/**
	 * 文字列存在チェック。<br />
	 * 指定された文字列が、配列に存在するかチェックする。<br />
	 * @param val チェック対象の文字列
	 * @param strAry 存在チェックする文字列配列
	 * @return true:存在する、false:存在しない
	 */
	public static boolean inArray(String val, String...strAry){
		return JCKLcsCommonUtil.inArray(val, strAry);
	}

	/**
	 * SC呼出用のパラメータを作成します。
	 * <br />
	 * ※指定がない項目は自動的にnullをセットしてパラメータを作成します。
	 * @param param リクエストパラメータ
	 * @param templateId テンプレートID
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	public static HashMap<String, Object> createScParamForSearch(IRequestParameterReadOnly param, String templateId, Class<?> cbsMsgClass,
			Map<?, ?> param4serviceIf, String funcCode) throws RequestParameterException {
		return JCKPmpScParamHenshu.createScParamForSearch(param, templateId, cbsMsgClass, param4serviceIf, funcCode);
	}

	/**
	 * SC呼出用のパラメータを作成します。
	 * <br />
	 * ※指定がない項目は自動的にnullをセットしてパラメータを作成します。
	 * @param param リクエストパラメータ
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	public static HashMap<String, Object> createScParamForSearch(IRequestParameterReadOnly param,Class<?> cbsMsgClass,
			Map<?, ?> param4serviceIf, String funcCode) throws RequestParameterException {
		return JCKPmpScParamHenshu.createScParamForSearch(param, null, cbsMsgClass, param4serviceIf, funcCode);
	}

	/**
	 * SC呼出用のパラメータを作成します。
	 * @param param リクエストパラメータ
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	public static HashMap<String, Object> createScParam(IRequestParameterReadOnly param, Class<?> cbsMsgClass,
			Map<?, ?> param4serviceIf, String funcCode) throws RequestParameterException {
		return JCKPmpScParamHenshu.createScParam(param, null, cbsMsgClass, param4serviceIf, funcCode);
	}

	/**
	 * SC呼出用のパラメータを作成します。
	 * @param param リクエストパラメータ
	 * @param templateId テンプレートID
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	public static HashMap<String, Object> createScParam(IRequestParameterReadOnly param, String templateId, Class<?> cbsMsgClass,
			Map<?, ?> param4serviceIf, String funcCode) throws RequestParameterException {
		return JCKPmpScParamHenshu.createScParam(param, templateId, cbsMsgClass, param4serviceIf, funcCode);
	}

	/**
	 * ＢＰの下り電文コントロールデータを設定します。
	 * @param param リクエストパラメータ
	 * @param result サービスコンポーネント実行結果
	 * @param scMapkey サービスコンポーネントID
	 * @throws Throwable 
	 */
	public static void setResultCtrlData(IRequestParameterReadWrite param, Map<?, ?> result, String scMapkey) throws Throwable {
		JCKPmpScParamHenshu.setResultCtrlData(param, result, scMapkey);
	}

	/**
	 * ＢＰの下り電文コントロールデータを設定します。
	 * @param param リクエストパラメータ
	 * @param result サービスコンポーネント実行結果
	 * @throws Throwable
	 */
	public static void setResultCtrlData(IRequestParameterReadWrite param, Map<?, ?> result) throws Throwable {
		JCKPmpScParamHenshu.setResultCtrlData(param, result, null);
	}

	/**
	 * ＢＰの下り電文コントロールデータを設定します。
	 * @param param リクエストパラメータ
	 * @param result サービスコンポーネント実行結果
	 * @param scMapkey サービスコンポーネントID
	 * @param returnCd リターンコード
	 * @param status ステータスコード
	 * @throws Throwable
	 */
	public static void setResultCtrlData(IRequestParameterReadWrite param, Map<?, ?> result, String scMapkey, Object returnCd, Object status)
			throws Throwable {
		JCKPmpScParamHenshu.setResultCtrlData(param, result, scMapkey, returnCd, status);
	}

	/**
	 * ＢＰの下り電文ユーザデータを設定します。
	 * @param param リクエストパラメータ
	 * @param scMapkey サービスコンポーネントID
	 * @param userData ユーザデータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public static void setResultUserData(IRequestParameterReadWrite param, String scMapkey, Map userData) throws Throwable {
		JCKPmpScParamHenshu.setResultUserData(param, scMapkey, userData);
	}

	/**
	 * サービスコンポーネントの実行結果からリストを取得します。
	 * @param result サービスコンポーネント実行結果
	 * @param listName リスト名
	 * @return 結果(リスト)
	 */
	public static CAANMsg[] getResultMsgList(Map<?, ?> result, String listName) {
		return JCKPmpScParamHenshu.getResultMsgList(result, listName);
	}

	/**
	 * サービスコンポーネントの実行結果から文字列を取得します。
	 * @param result サービスコンポーネント実行結果
	 * @param columnName 項目名
	 * @return 結果(文字列)
	 */
	public static String getResultString(Map<?, ?> result, String columnName) {
		return JCKPmpScParamHenshu.getResultString(result, columnName);
	}

	/**
	 * サービスコンポーネントの実行結果から数値を取得します。
	 * @param result サービスコンポーネント実行結果
	 * @param columnName 項目名
	 * @return 結果(数値)
	 */
	public static Integer getResultInteger(Map<?, ?> result, String columnName) {
		return JCKPmpScParamHenshu.getResultInteger(result, columnName);
	}

	/**
	 * サービスコンポーネントの実行結果からエラー有無を判定します。
	 * @param result サービスコンポーネント実行結果
	 * @return エラー有無(true:エラー有り、false:エラー無し)
	 */
	public static boolean isError(Map<?, ?> result) {
		return JCKPmpScParamHenshu.isError(result);
	}

	/**
	 * サービスコンポーネントの実行結果からエラー有無を判定します。
	 * @param result サービスコンポーネント実行結果
	 * @return エラー有無(false:エラー有り、true:エラー無し)
	 */
	public static boolean isSuccess(Map<?, ?> result) {
		return JCKPmpScParamHenshu.isSuccess(result);
	}

	/**
	 * サービスコンポーネントの実行結果からリターンコードを取得します。
	 * @param result サービスコンポーネント実行結果
	 * @return リターンコード
	 */
	public static Integer getReturnCode(Map<?, ?> result) {
		return JCKPmpScParamHenshu.getReturnCode(result);
	}

	/**
	 * サービスコンポーネントの実行結果からステータスコードを取得します。
	 * @param result サービスコンポーネント実行結果
	 * @return ステータスコード
	 */
	public static Integer getStatus(Map<?, ?> result) {
		return JCKPmpScParamHenshu.getStatus(result);
	}

	/**
	 * サービスコンポーネントの入力パラメータで指定がない項目にNULLを設定します。
	 * @param cbsMsgClass サービスコンポーネントCBSMsgクラス
	 * @param inMap サービスコンポーネント用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static void setNullColumnForScParam(Class<?> cbsMsgClass, Map inMap){
		JCKPmpScParamHenshu.setNullOtherColumn(cbsMsgClass, inMap);
	}

	/**
	 * サービスコンポーネントの入力パラメータでブランク(空文字)が指定された項目にNULLを設定します。
	 * @param inMap サービスコンポーネント用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static void setNullBlankColumnForScParam(Map inMap){
		JCKPmpScParamHenshu.setNullBlankColumn(inMap);
	}

	/**
	 * デバッグログを出力します。
	 * @param cls クラス
	 * @param debugMsg メッセージ
	 */
	@SuppressWarnings("unchecked")
	public static void printBpDebugLog(Class cls, String debugMsg){
		JSYbpmLog.println(JSYLogBase.DEBUG, cls , debugMsg, MessageID.DEB_X21_DEBUG_MSG,  new String[]{"", ""}, "");
	}

	/**
	 * オブジェクトのダンプログを出力します。
	 * @param cls クラス
	 * @param objName オブジェクト名
	 * @param dumpObj オブジェクト
	 */
	@SuppressWarnings("unchecked")
	public static void printBpDumpLog(Class cls, String objName, Object dumpObj){
		JSYbpmLog.println(JSYLogBase.Message_Dump, cls , dumpObj , MessageID.DEB_X21_DEBUG_MSG,  new String[]{"### オブジェクト", objName}, " ###");
	}

	/**
	 * ＢＰチェックスキップ用のパラメータを作成します。
	 * @return  ＢＰチェックスキップ用パラメータ
	 */
	public static HashMap<String, Object> createBpNotCheckParam(){
		return JCKPmpScParamHenshu.createBpNotCheckParam();
	}

	/**
	 * ＢＰチェック結果を編集します。
	 * @param param リクエストパラメータ
	 * @param caanMsgs CAANメッセージリスト
	 * @param returnCode 
	 * @return ＢＰチェック結果
	 * @throws Throwable
	 */
	public static IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable{
		return JCKPmpScParamHenshu.editErrorInfo(param, caanMsgs, returnCode);
	}

	/**
	 * リクエストパラメータに対象項目のエラー情報が有るか無いかを判定します。
	 * @param param リクエストパラメータ
	 * @param errFieldName エラー項目名
	 * @return エラー有無(true:エラー有り、false:エラー無し)
	 * @throws RequestParameterException
	 */
	public static boolean isErrorField(IRequestParameterReadWrite param, String errFieldName) throws RequestParameterException{
		return JCKPmpScParamHenshu.isErrorField(param, errFieldName);
	}

	/**
	 * 姓の取得(PMP連携用)。<br />
	 * <pre>お客様名を姓、名に分割し姓を返却します。
	 * ※PMP連携時にはFirstNameは名ではなく姓となる為、要注意。<pre>
	 * @param fullName 姓名
	 * @return 姓
	 */
	public static String getFirstNameForPmp(String fullName)
	{
		return JCKLcsCommonUtil.getFirstNameForPmp(fullName);
	}

	/**
	 * 名の取得(PMP連携用)。<br />
	 * <pre>お客様名を姓、名に分割し姓を返却します。
	 * ※PMP連携時にはSecondNameは姓ではなく名となる為、要注意。</pre>
	 * @param fullName 姓名
	 * @return 名
	 */
	public static String getSecondNameForPmp(String fullName)
	{
		return JCKLcsCommonUtil.getSecondNameForPmp(fullName);
	}

	/**
	 * 年齢フラグ取得<br />
	 * @param birthday 生年月日
	 * @param opeDate 運用日付
	 * @return String 年齢フラグ
	 */
	public static String getAgeFlg(String birthday, String opeDate)
	{
		return JCKLcsCommonUtil.getAgeFlg(birthday, opeDate);
	}

	/**
	 * 拗音-直音変換(PMP連携用)<br />
	 * <pre>対象文字列の拗音を直音文字に変換して返します。</pre>
	 * @param targetValue 対象文字列
	 * @return 変換後文字列
	 */
	public static String replaceYouonToChokuon(String targetValue)
	{
		return JCKLcsCommonUtil.replaceYouonToChokuon(targetValue);
	}
}
