/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUTransferCC
*   ソースファイル名：JFUTransferCC.java
*   作成者          ：富士通
*   日付            ：2011年10月31日
*＜機能概要＞
*   サービスIFの結果データを移送するコモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/31   FJ）岡井    新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;

import eo.common.constant.JFUStrConst;

/**
 * サービスIF結果データ移送コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUTransferCC extends JFUBaseCC
{
	/** マップキー 移送先名取得 */
	private static final String KEY_TRAN_NAME = "tranNm";
	/** マップキー キーカウント */
	private static final String KEY_KEY_CNT = "key_cnt";
	/** マップキー生成用文字列 */
	private static final String KEY_PART = "key_";
	/** コンマ */
	private static final String COMMA = ",";
	/** コロン */
	private static final String COLON = ":";
	/** パラメータ不正エラー */
	private static final String CC_ERR_MSG_NO_PARAM = "パラメータ不正エラー";

	/**
	 * データ移送の処理をします。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param ユーザデータ
	 * @param fixedText 
	 * @return param 返却データ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite transferHakkoSod(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Exception
	{
		// 結果格納マップ
		HashMap resMap = new HashMap();
		// ユーザデータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 移送先
		String tranNm = (String)dataMap.get(KEY_TRAN_NAME);
		// 移送データ
		String tranData = null;
		// 移送データ数
		int cnt = Integer.parseInt((String)dataMap.get(KEY_KEY_CNT));

		// ●結果データの受渡し(メイン処理)
		for (int i = 0; i < cnt; i++)
		{
			// クエリの分解
			String[] parentQuery = ((String)dataMap.get(KEY_PART + (i + 1))).split(COMMA);
			String[] getQuery = parentQuery[0].split(COLON);
			String[] tranQuery = parentQuery[1].split(COLON);

			// ★移送データの受取り
			tranData = getData(param, getQuery);

			// ★移送データの設定
			if (tranData != null)
			{
				// 移送データがある場合のみ移送する
				resMap.putAll(transferHakkoSod(param, tranNm, tranData, tranQuery));
			}
		}

		// ユーザデータに設定
		if (resMap.size() != 0)
		{
			// 設定データがある場合のみ設定する
			param.setData(tranNm, resMap);
		}

		return param;
	}

	/**
	 * 移送データを設定します。
	 * 
	 * <br>
	 * @param param ユーザデータ
	 * @param tranNm 移送先名
	 * @param tranData 移送データ
	 * @param query クエリ
	 * @return map 返却データ
	 * @throws RequestParameterException 例外
	 */
	@SuppressWarnings("unchecked")
	private HashMap transferHakkoSod(IRequestParameterReadWrite param, String tranNm, String tranData, String[] query)
			throws RequestParameterException
	{
		// 移送後格納用マップ
		HashMap map = new HashMap();

		// ユーザデータ取得
		HashMap setDataMap = (HashMap)param.getData(tranNm);
		ArrayList setList = null;

		// リスト指定文字列の存在判定
		if (!"".equals(query[0]))
		{
			// 存在する場合、リストを取得する
			setList = (ArrayList)setDataMap.get(query[0]);
		}

		// リスト指定判定
		if (setList != null)
		{
			// リスト指定がある場合のデータ移送処理
			for (int j = 0; j < setList.size(); j++)
			{
				HashMap childMap = (HashMap)setList.get(j);
				HashMap childMap2 = null;

				// 孫マップ指定判定
				if (!"".equals(query[1]))
				{
					// 指定がある場合の処理
					childMap2 = (HashMap)childMap.get(query[1]);
					childMap2.put(query[2], tranData);
					childMap.put(query[1], childMap2);
					setList.set(j, childMap);
					setDataMap.put(query[0], setList);
				}
				else if ("".equals(query[1]))
				{
					// 指定がない場合の処理
					childMap.put(query[2], tranData);
					setList.set(j, childMap);
					setDataMap.put(query[0], setList);
				}
			}
		}
		else
		{
			// リスト指定がない場合の処理
			setDataMap.put(query[2], tranData);
		}

		// 移送用のマップに入れる
		map.putAll(setDataMap);

		return map;
	}

	/**
	 * チェック処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return チェック処理用マップ
	 * @throws Exception 
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * サービスIFの結果からデータを取得します。
	 * 
	 * <br>
	 * @param param ユーザデータ
	 * @param query クエリ
	 * @return data 返却データ
	 * @throws RequestParameterException 例外
	 * @throws CCException 
	 */
	@SuppressWarnings("unchecked")
	private String getData(IRequestParameterReadWrite param, String[] query) throws RequestParameterException, CCException
	{
		// 返却データ格納用
		String data = null;

		// ユーザデータの取得
		HashMap getDataMap = (HashMap)param.getData(query[0]);
		ArrayList getDataMapList = null;
		if (getDataMap != null)
		{
			getDataMapList = (ArrayList)getDataMap.get(query[1]);
		}
		else
		{
			throw new CCException(CC_ERR_MSG_NO_PARAM, new Exception());
		}

		// リスト指定判定
		if (getDataMapList != null)
		{
			// 指定がある場合
			for (int j = 0; j < getDataMapList.size(); j++)
			{
				HashMap childMap = (HashMap)getDataMapList.get(j);

				// マップキー存在判定
				if (childMap.containsKey(query[2]))
				{
					// 存在する場合：対象項目のデータを受取る
					data = (String)childMap.get(query[2]);
				}
			}
		}
		else
		{
			// 指定がない場合
			data = (String)getDataMap.get(query[2]);
		}

		return data;
	}

	/**
	 * データ移送の処理をします。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param ユーザデータ
	 * @param fixedText 
	 * @return param 返却データ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite transferBpValue(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Exception
	{

		// 結果格納マップ
		HashMap resMap = new HashMap();
		// ユーザデータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 移送先
		String tranNm = (String)dataMap.get(KEY_TRAN_NAME);
		// 移送データ
		String tranData = null;
		// 移送データ数
		int cnt = Integer.parseInt((String)dataMap.get(KEY_KEY_CNT));

		// ●結果データの受渡し(メイン処理)
		for (int i = 0; i < cnt; i++)
		{
			// クエリの分解
			String[] parentQuery = ((String)dataMap.get(KEY_PART + (i + 1))).split(COMMA);
			String[] getQuery = parentQuery[0].split(COLON);
			String[] tranQuery = parentQuery[1].split(COLON);

			// ★移送データの受取り
			tranData = getData(param, getQuery);

			// ★移送データの設定
			if (tranData != null)
			{
				// 移送データがある場合のみ移送する
				resMap.putAll(transferData(param, tranNm, tranData, tranQuery));
			}
		}

		// ユーザデータに設定
		if (resMap.size() != 0)
		{
			// 設定データがある場合のみ設定する
			param.setData(tranNm, resMap);
		}
		return param;
	}

	/**
	 * 移送データを設定します。
	 * 
	 * <br>
	 * @param param ユーザデータ
	 * @param tranNm 移送先名
	 * @param tranData 移送データ
	 * @param query クエリ
	 * @return map 返却データ
	 * @throws RequestParameterException 例外
	 */
	@SuppressWarnings("unchecked")
	private HashMap transferData(IRequestParameterReadWrite param, String tranNm, String tranData, String[] query)
			throws RequestParameterException
	{
		// 移送後格納用マップ
		HashMap map = new HashMap();

		// ユーザデータ取得
		HashMap setDataMap = (HashMap)param.getData(tranNm);
		ArrayList setList = null;

		// リスト指定文字列の存在判定
		if (!"".equals(query[0]))
		{
			// 存在する場合、リストを取得する
			setList = (ArrayList)setDataMap.get(query[0]);
		}

		// リスト指定判定
		if (setList != null)
		{
			// リスト指定がある場合のデータ移送処理
			for (int j = 0; j < setList.size(); j++)
			{
				HashMap childMap = (HashMap)setList.get(j);

				// 孫マップ指定判定
				if (!"".equals(query[1]))
				{
					// 指定がある場合の処理
					childMap.put(query[2], tranData);
					setList.set(j, childMap);
					setDataMap.put(query[0], setList);
				}
				else if ("".equals(query[1]))
				{
					// 指定がない場合の処理
					childMap.put(query[2], tranData);
					setList.set(j, childMap);
					setDataMap.put(query[0], setList);
				}
			}
		}
		else
		{
			// リスト指定がない場合の処理
			setDataMap.put(query[2], tranData);
		}

		// 移送用のマップに入れる
		map.putAll(setDataMap);

		return map;
	}

	/**
	 * データ移送の処理をします。（配列対応）
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param ユーザデータ
	 * @param fixedText 当CCのマップ名
	 * @return param 返却データ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite transferHakkoSodArray(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Exception
	{
		// 結果格納マップ
		HashMap resMap = new HashMap();
		// ユーザデータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 移送先（FUSVxxxxyyCC）
		String tranNm = (String)dataMap.get(KEY_TRAN_NAME);
		// 移送データ
		String tranData = null;
		// 移送データ数
		int cnt = Integer.parseInt((String)dataMap.get(KEY_KEY_CNT));

		// ●結果データの受渡し(メイン処理)
		for (int i = 0; i < cnt; i++)
		{
			// クエリの分解
			String[] parentQuery = ((String)dataMap.get(KEY_PART + (i + 1))).split(COMMA);
			String[] getQuery = parentQuery[0].split(COLON);
			String[] tranQuery = parentQuery[1].split(COLON);

			// ★移送データの受取り
			tranData = getData(param, getQuery);

			// ★移送データの設定
			if (tranData != null)
			{
				// 移送データがある場合のみ移送する
				resMap.putAll(transferHakkoSodArray(param, tranNm, tranData, tranQuery));
			}
		}

		// ユーザデータに設定
		if (resMap.size() != 0)
		{
			// 設定データがある場合のみ設定する
			param.setData(tranNm, resMap);
		}

		return param;
	}

	/**
	 * 移送データを設定します。（配列対応）
	 * 
	 * <br>
	 * @param param ユーザデータ
	 * @param tranNm 移送先名
	 * @param tranData 移送データ
	 * @param query クエリ「移送先リスト名:配列番号:移送先マップ名:移送先項目名」
	 * @return map 返却データ
	 * @throws RequestParameterException 例外
	 */
	@SuppressWarnings("unchecked")
	private HashMap transferHakkoSodArray(IRequestParameterReadWrite param, String tranNm, String tranData, String[] query)
			throws RequestParameterException
	{
		// 移送後格納用マップ
		HashMap map = new HashMap();

		// ユーザデータ取得
		HashMap setDataMap = (HashMap)param.getData(tranNm);
		ArrayList setList = null;

		// リスト指定文字列の存在判定
		if (!"".equals(query[0]))
		{
			// 存在する場合、リストを取得する
			setList = (ArrayList)setDataMap.get(query[0]);
		}

		// リスト指定判定
		if (setList != null)
		{
			// リスト指定がある場合、リストの配列番号にデータ転送する
			// 配列番号の指定が無ければ、0番目とする
			int indexNo = 0;
			if (!"".equals(query[1]))
			{
				indexNo = Integer.parseInt(query[1]);
			}

			// 対象データの現在のマップ数を精査する
			// 無ければ空マップを作成する
			int listCnt = setList.size();
			for (int i = listCnt; i <= indexNo; i++)
			{
				HashMap sodMap = new HashMap<String, HashMap<String, String>>();
				setList.add(sodMap);
			}

			HashMap childMap = (HashMap)setList.get(indexNo);
			HashMap childMap2 = null;

			// 孫マップ指定判定
			if (!"".equals(query[2]))
			{
				// 指定がある場合の処理
				childMap2 = (HashMap)childMap.get(query[2]);
				if (childMap2 == null)
				{
					childMap2 = new HashMap<String, String>();
				}
				childMap2.put(query[3], tranData);
				childMap.put(query[2], childMap2);
				setList.set(indexNo, childMap);
				setDataMap.put(query[0], setList);
			}
			else if ("".equals(query[2]))
			{
				// 指定がない場合の処理
				childMap.put(query[3], tranData);
				setList.set(indexNo, childMap);
				setDataMap.put(query[0], setList);
			}
		}
		else
		{
			// リスト指定がない場合の処理
			setDataMap.put(query[3], tranData);
		}

		// 移送用のマップに入れる
		map.putAll(setDataMap);

		return map;
	}

	/**
	 * SOD用マップ内のコピー処理をします。（配列対応）
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param ユーザデータ
	 * @param fixedText 当CCのマップ名
	 * @return param 返却データ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite copyHakkoSodArray(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Exception
	{
		// 結果格納マップ
		HashMap resMap = new HashMap();
		// ユーザデータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 移送先（FUSVxxxxyyCC）
		String tranNm = (String)dataMap.get(KEY_TRAN_NAME);
		// 移送データ
		String tranData = null;
		// 移送データ数
		int cnt = Integer.parseInt((String)dataMap.get(KEY_KEY_CNT));

		// ●結果データの受渡し(メイン処理)
		for (int i = 0; i < cnt; i++)
		{
			// クエリの分解
			String[] parentQuery = ((String)dataMap.get(KEY_PART + (i + 1))).split(COMMA);
			String[] getQuery = parentQuery[0].split(COLON);
			String[] tranQuery = parentQuery[1].split(COLON);

			// ★移送データの受取り
			tranData = getHakkoSod(param, tranNm, getQuery);

			// ★移送データの設定
			if (tranData != null)
			{
				// 移送データがある場合のみ移送する
				resMap.putAll(transferHakkoSodArray(param, tranNm, tranData, tranQuery));
			}
		}

		// ユーザデータに設定
		if (resMap.size() != 0)
		{
			// 設定データがある場合のみ設定する
			param.setData(tranNm, resMap);
		}

		return param;
	}

	/**
	 * 
	 * 
	 * <br>
	 * @param param ユーザデータ
	 * @param tranNm 移送先名
	 * @param query 対象データリスト(trgt_data_list), 対象データリストのインデックス, SODマップ内のマップ名, 項目名
	 * @return
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private String getHakkoSod(IRequestParameterReadWrite param, String tranNm, String[] query) throws RequestParameterException
	{
		String retValue = "";

		// ユーザデータ取得
		HashMap sodHakkoMap = (HashMap)param.getData(tranNm);
		ArrayList setList = null;

		// リスト指定文字列の存在判定
		if (!"".equals(query[0]))
		{
			// 存在する場合、リストを取得する
			setList = (ArrayList)sodHakkoMap.get(query[0]);
		}

		// リスト指定判定
		if (setList != null)
		{
			// リスト指定がある場合、リストの配列番号にデータ転送する
			// 配列番号の指定が無ければ、0番目とする
			int indexNo = 0;
			if (!"".equals(query[1]))
			{
				indexNo = Integer.parseInt(query[1]);
			}

			// 対象データの現在のマップ数を精査する
			int listCnt = setList.size();

			if (listCnt > indexNo)
			{
				HashMap childMap = (HashMap)setList.get(indexNo);

				if (!"".equals(query[2]))
				{
					if (childMap.containsKey(query[2]))
					{
						HashMap childMap2 = (HashMap)childMap.get(query[2]);
						if (childMap2.containsKey(query[3]))
						{
							retValue = (String)childMap2.get(query[3]);
						}
					}
				}
			}
		}

		return retValue;
	}

}
