/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：KKPageControlCC
 *   ソースファイル名：KKPageControlCC.java
 *   作成者          ：富士通
 *   日付            ：2011年04月22日
 *＜機能概要＞
 *   ページリンクを表示する画面で実施する処理のBP側部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/04/22   FJ）青木    新規作成
 *
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.sc.IInputMessageEditor;
import com.fujitsu.futurity.bp.x21.sc.IOutputMessageEditor;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;

/**
 * ページ処理用の共通処理です。
 * <p>
 * <br>
 * 
 * @author 富士通
 */
public abstract class JKKPageControlCC extends AbstractCommonComponent
{
	/** BP-サービスIF inputマッパー */
	public IInputMessageEditor input_mapper = null;
	
	/** BP-サービスIF outputマッパー */
	public IOutputMessageEditor output_mapper = null;
	
	/** BP-サービスIF error infoマッパー */
	public IOutputErrorInfoEditor errinfo_mapper = null;
	
	/** BP側のマップキー名 */
	public String bp_mapkey = null;
	
	/** サービスIF側の検索結果CAANMsg配列が格納されているキー名 */
	public String db_listkey = null;
	
	/** サービスIF側のプライマリキー */
	public List<String> db_primary_key_list = new ArrayList<String>();
	
	/**
	 * ページ処理を実施するために情報をセットするメソッドです。<br>
	 * 必ず以下の情報をセットしてください<br>
	 * <br>
	 * 
	 * ■input_mapper・output_mapper・errinfo_mappaer <br>
	 * 使用するDB-サービスIFマッパー（IMRCで作成されるマッパー） <br>
	 * ※基本すべてマッパーを指定してください。宣言されているinterfaceの都合です。 <br>
	 * 
	 * ■bp_mapkey <br>
	 * BP側から渡されるマップの先頭キー名です。 <br>
	 * 例) KKSV9999SC <br>
	 * <br>
	 * ■db_listkey <br>
	 * サービスIF側から返された検索結果情報が入っているリストのキー名です。 <br>
	 * 例)EKK0841B010CBSMsg.EKK0841B010CBSMSG1LIST <br>
	 * 
	 * ■db_primary_key_list <br>
	 * 検索した結果のプライマリとなりうるカラム名を格納したリストです。 <br>
	 * 変更完了後に一覧に戻ってきた際などに、同じページを表示するか、先頭ページを 表示するかを判断するのに使用します <br>
	 */
	public abstract void setInfo();
	
	/**
	 * コンストラクタ
	 */
	public JKKPageControlCC()
	{
		// 継承元処理実施
		setInfo();
	}
	
	/**
	 * 一覧照会取得処理です。
	 * 
	 * 
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite search(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		/* ◇上りマッピング処理 */
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// リクエストパラメータを引数に上りマッピング処理メソッドを実行
		paramMap = input_mapper.editInMsg(param);
		
		/* ◇ＳＣ呼出実行 */
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// 検索リストを取得する。
		CAANMsg[] serchList = msg.getCAANMsgList(db_listkey);
		
		/* ユーザデータ情報 */
		// 画面で選択されていたデータを取得する。
		HashMap inParamMap = (HashMap)param.getData(bp_mapkey);
		String key = (String)inParamMap.get("key");
		
		// 画面で選択していたデータが検索結果に存在するかチェックを行う。
		boolean flg = false;
		if (serchList != null && serchList.length > 0)
		{
			if (key != null && key.length() > 0)
			{
				
				// 画面で選択したキー情報が存在するとき(完了からの戻りなど
				for (int i = 0; i < serchList.length; i++)
				{
					CAANMsg childTemplate = serchList[i];
					
					// TODO:[KSSOL 青木] 複数キーには未対応
					String db_primary_data = null;
					for (String db_primary_key : db_primary_key_list)
					{
						db_primary_data = childTemplate.getString(db_primary_key);
					}
					
					// 選択データが検索結果にある場合はチェック終了
					if (key != null && key.equals(db_primary_data))
					{
						flg = true;
						// キー情報が取れた場合はキー情報を削除
						// TODO:[KSSOL 青木]
						// キー情報が取れた場合はキー情報を削除処理については未テスト（完了まで行って戻るような画面がまだ存在していない）
						inParamMap.put("key", "");
						break;
					}
				}
			}
			else
			{
				// 画面で選択したキー情報が存在しない(ページリンクなど
				flg = true;
			}
		}
		
		// 画面で選択していたデータがない場合は1ページ目を再検索する。
		if (!flg)
		{
			HashMap inMap = (HashMap)param.getData(bp_mapkey);
			// 表示ページ番号を1ページに設定する。
			inMap.put("display_page_num", "1");
			// 画面制御のため検索エラーフラグを3に設定する。
			inMap.put("search_err_flg", "3");
			
			// リクエストパラメータを引数に上りマッピング処理メソッドを実行
			paramMap = input_mapper.editInMsg(param);
			
			/* ◇ＳＣ呼出実行 */
			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
			scCall = new ServiceComponentRequestInvoker();
			result = scCall.run(paramMap, handle);
		}
		
		/* ◇下りマッピング処理 */
		output_mapper.editResultRP(result, param);
		
		return param;
	}
	
	/**
	 * 一覧照会チェック処理です。<br>
	 * チェック処理用のマップを作成し返却します。<br>
	 * <br>
	 * 
	 * @param handle セッションハンドル
	 * @param param (I) 業務データ取得用I/F
	 * @param fixedText (I) ユーザ定義文字列
	 * @return サービスコンポーネント実行用CAANMsg
	 * @exception Throwableがスローされます 。
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		return input_mapper.editInMsg(param);
	}
	
	/**
	 *<DL>
	 *<DT>処理概要:
	 *<DD>サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 *</DL>
	 * 
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 * @since 2011.05.19
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode) throws Throwable
	{
		return errinfo_mapper.editErrorInfo(param, templates, returnCode);
	}
	
	/**
	 *<DL>
	 *<DT>処理概要: 下りマッピング処理
	 *<DD>サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 *</DL>
	 * 
	 * @param msgList (I) CAANMsgクラス
	 * @param param (I) 業務データ取得・書込用I/F
	 * @throws Throwable
	 * @return 業務データ取得・書込用I/F
	 */
	public IRequestParameterReadWrite editResultRP(Map<?, ?> msgList, IRequestParameterReadWrite param) throws Throwable
	{
		return output_mapper.editResultRP(msgList, param);
	}
	
}
