/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKApiCommonUtil
*   ソースファイル名：JKKApiCommonUtil.java
*   作成者          ：富士通
*   日付            ：2011年10月24日
*＜機能概要＞
*   契約管理のAPI共通処理クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/24   FJ)強矢     新規作成
*   v3.00.00    2012/09/10   FJ)強矢     ST1-2012-0000449対応
*   v4.00.00    2012/10/24   FJ)強矢     【ANK-0534-00-00】WDAスマートバリュー対応
*   v4.00.01    2012/11/14   FJ)赤穂     ST1-2012-0000938対応
*   v37.00.00   2018/03/09   FJ)藤本     【ANK-3366-00-00】eo光設備卸対応
*	v41.00.00	2019/03/12	FJ）中原	【ANK-3604-00-00】光卸住所情報の断面更新方式変更
*   v54.00.00   2021/08/03   FJ) 西窪    【ANK-4092-00-00】CX戦略WG方針対応STEP2
*
**********************************************************************/
package eo.web.webview.common;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletRequest;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;

import eo.common.constant.JKKStrConst;
import eo.common.util.JPCCommonUtil;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 *  契約管理のAPI共通処理部品
 *  
 * @author 富士通
 *
 */
public class JKKApiCommonUtil extends JPCCommonUtil
{
	// ANK-3366-00-00 ADD START
	/** JSONデータが設定されるパラメータ名 */
	public static final String PARAMNAME_JSON = "receiveData";

	/** JSONデータの共通項目 */
	public static final String[] COMMON_HEADER_JSON = {"requestID", "serviceID", "channel", "operateDateTime"};
	// ANK-3366-00-00 ADD END

	/**
	 * 結果コードマップ
	 */
	private static HashMap<String, String> rtype_result_map = null;
	
	/** Unicode変換テーブル(EUC/Shift-JIS⇒MS932) */
	private static final char[][] UNI_CONV_1 = {
		{ 0x2014, 0x2015 },
		{ 0x2016, 0x2225 },
		{ 0x2212, 0xff0d },
		{ 0x301c, 0xff5e },
		{ 0x00a2, 0xffe0 },
		{ 0x00a3, 0xffe1 },
		{ 0x00ac, 0xffe2 },
	};

	/** Unicode変換テーブル(MS932⇒EUC/Shift-JIS)*/
	private static final char[][] UNI_CONV_2 = {
		{ 0x2015, 0x2014 },
		{ 0x2225, 0x2016 },
		{ 0xff0d, 0x2212 },
		{ 0xff5e, 0x301c },
		{ 0xffe0, 0x00a2 },
		{ 0xffe1, 0x00a3 },
		{ 0xffe2, 0x00ac },
	};

	static
	{
		rtype_result_map = new HashMap<String, String>();
		rtype_result_map.put("000000", "N"); 	// 正常終了
		rtype_result_map.put("007001", "M"); 	// メンテナンス中です。
		rtype_result_map.put("008001", "W"); 	// ＳＱＬファイルが存在しない場合
		rtype_result_map.put("008002", "W"); 	// データ取得件数が設定値を超えた場合
		rtype_result_map.put("009002", "E"); 	// ＤＢアクセスでエラーが発生しました。
		rtype_result_map.put("009003", "E"); 	// 処理中に致命的なエラーが発生しました。
		rtype_result_map.put("009008", "E"); 	// 必須項目が設定されていません。
		rtype_result_map.put("009009", "E"); 	// 数値項目に数値以外が含まれています。
		rtype_result_map.put("009010", "E"); 	// 最大桁数を超えています。
		rtype_result_map.put("009011", "W"); 	// 不正アクセスの場合
		rtype_result_map.put("009012", "E"); 	// データ矛盾エラー
		rtype_result_map.put("009013", "E"); 	// 情報未存在エラー
		rtype_result_map.put("009014", "E"); 	// ＳＱＬ定義ファイルが不正な場合
		rtype_result_map.put("010001", "N"); 	// パスワードが誤っていた場合
		rtype_result_map.put("010002", "N"); 	// 契約 該当なし
		rtype_result_map.put("010003", "N"); 	// 料金プラン 該当なし
		rtype_result_map.put("010004", "N"); 	// オプションマスタ 該当なし
		rtype_result_map.put("010005", "N"); 	// オプションマスタ 上限０
		rtype_result_map.put("010006", "N"); 	// 翌月料金プランがおでかけパック不可料金プランの場合
		rtype_result_map.put("010007", "N"); 	// パック契約中の場合
		rtype_result_map.put("010008", "N"); 	// 予約データあり（ＩＣＳ予約状態：オプションＳＯＤ依頼）
		rtype_result_map.put("010009", "N"); 	// 予約データあり（ＩＣＳ予約状態：同一請求先番号）
		rtype_result_map.put("010010", "N"); 	// 予約データあり（ＩＣＳ予約状態：同一契約者番号）
		rtype_result_map.put("010011", "N"); 	// 予約データあり（ＷＥＢ予約情報：同一お客様ＩＤ）
		rtype_result_map.put("010012", "N"); 	// 予約データあり（ＷＥＢ予約情報：同一請求先番号）
		rtype_result_map.put("010013", "N"); 	// Web請求情報公開抑止エラー
		rtype_result_map.put("010014", "N"); 	// 同一請求先契約者名　親あり
		rtype_result_map.put("010015", "N"); 	// 同一請求先契約者名不一致
		rtype_result_map.put("010016", "N"); 	// 付加サービス情報 該当なし
		rtype_result_map.put("010017", "N"); 	// 同一請求先もしくは同一契約者 どちらかが複数ある場合
		rtype_result_map.put("010018", "N"); 	// 契約状態不正
		rtype_result_map.put("010019", "N"); 	// 通信機器上限取得済み
		rtype_result_map.put("010020", "N"); 	// オプション　該当なし
		rtype_result_map.put("010021", "N"); 	// プロパティファイルの料金プランに含まれていない場合
		rtype_result_map.put("010022", "N"); 	// サービス開始日が未来日の場合
		rtype_result_map.put("010023", "N"); 	// サービス開始日の値が無い場合
		rtype_result_map.put("010024", "N"); 	// 再送信テレビ入力抑止エラーの場合
		rtype_result_map.put("010025", "N"); 	// サービス対象外ユーザー（ｅｏ光ネットマンションタイプ以外）
		rtype_result_map.put("010026", "N"); 	// モバイル契約テーブル無し
		rtype_result_map.put("018001", "W"); 	// Web予約接続機器申込みあり
		rtype_result_map.put("018002", "W"); 	// 機器グループマスタ　該当なし
		rtype_result_map.put("018003", "W"); 	// 工事依頼　該当なし　もしくは　受注済フラグが受注無の場合
		rtype_result_map.put("018004", "W"); 	// 工事依頼　複数あり
		rtype_result_map.put("018005", "W"); 	// プラン変更予約 複数あり
		rtype_result_map.put("018006", "W"); 	// 機器グループ種別　該当なし
		rtype_result_map.put("018007", "W"); 	// セット品内訳マスタ　該当なし
		rtype_result_map.put("018008", "W"); 	// Web予約ｅｏモバイルお申し込みあり
		rtype_result_map.put("018009", "W"); 	// 汎用マスタ（ルータ関連データ）　該当なし
		rtype_result_map.put("018010", "W"); 	// 汎用マスタ（ルータ関連データ）　複数あり
		rtype_result_map.put("019001", "E"); 	// 契約 複数あり
		rtype_result_map.put("019002", "E"); 	// 料金プラン 複数あり
		rtype_result_map.put("019003", "E"); 	// 契約者 複数あり
		rtype_result_map.put("019004", "E"); 	// 料金プラン変更予約 複数あり
		rtype_result_map.put("019005", "E"); 	// おでかけパック料金プラン一覧をプロパティから取得できない場合
		rtype_result_map.put("019006", "E"); 	// ＤＢから取得した料金プランの値が不正な場合
		rtype_result_map.put("019007", "E"); 	// 契約者番号、請求先番号ともに1件でない場合
		rtype_result_map.put("019008", "E"); 	// 請求付加情報が1件でない場合
		rtype_result_map.put("019009", "E"); 	// 同一請求先契約者名が1件でない場合
		rtype_result_map.put("019010", "E"); 	// 契約番号の値が不正の場合
		rtype_result_map.put("019011", "E"); 	// 契約者番号、請求先番号いずれかの値が不正な場合
		rtype_result_map.put("019012", "E"); 	// 付加サービス情報 複数あり（3件以上）
		rtype_result_map.put("019013", "E"); 	// 同一請求先　該当なし
		rtype_result_map.put("019014", "E"); 	// 同一契約者　該当なし
		rtype_result_map.put("019015", "E"); 	// 契約情報が1件ではない場合
		rtype_result_map.put("019016", "E"); 	// 契約者情報が1件ではない場合
		rtype_result_map.put("019017", "E"); 	// 請求先情報取得件数エラー
		rtype_result_map.put("019018", "E"); 	// 契約請求先相関　複数あり
		rtype_result_map.put("019019", "E"); 	// 契約請求先相関　該当なし
		rtype_result_map.put("019020", "E"); 	// オプション　複数あり
		rtype_result_map.put("019022", "E"); 	// 機器グループマスタ　複数あり
		rtype_result_map.put("019023", "E"); 	// 提供方法不正
		rtype_result_map.put("019024", "E"); 	// 機器グループ種別　値なし
		rtype_result_map.put("019025", "E"); 	// 機器グループ種別 複数あり
		rtype_result_map.put("019026", "E"); 	// メガファイバー系契約一覧をプロパティから取得できない場合
		rtype_result_map.put("019027", "E"); 	// 機器グループ種別　排他エラー
		rtype_result_map.put("019028", "E"); 	// セット品情報　不正エラー
		rtype_result_map.put("019029", "E"); 	// モバイル契約 複数あり
		rtype_result_map.put("020001", "N"); 	// 契約請求先相関　0件でマンション親子区分が1の場合
		rtype_result_map.put("028001", "W"); 	// 現サービス情報　該当なしの場合
		rtype_result_map.put("028002", "W"); 	// 現サービス情報　ＳＩＰユーザーＩＤ相違の場合
		rtype_result_map.put("028003", "W"); 	// STB予約情報が複数存在する場合
		rtype_result_map.put("029001", "E"); 	// ＣＤＲ料金テーブル　該当なしの場合
		rtype_result_map.put("029002", "E"); 	// ＣＤＲ料金テーブル　請求額取得値が不正な場合
		rtype_result_map.put("029003", "E"); 	// ＧＥ−ＰＯＮ利用可否が不正の場合
		rtype_result_map.put("029004", "E"); 	// ＮＴＴ番号案内有無取得値不正エラーの場合
		rtype_result_map.put("029005", "E"); 	// ＷＥＢ用通話明細合計情報　複数件の場合
		rtype_result_map.put("029006", "E"); 	// WEB用表示メッセージ（STB機器情報）　HDDコード重複の場合
		rtype_result_map.put("029007", "E"); 	// WEB用表示メッセージ（STB機器情報）　該当なしの場合
		rtype_result_map.put("029008", "E"); 	// 契約　1件以外の場合
		rtype_result_map.put("029009", "E"); 	// 現サービス情報　オプション種別が複数件の場合
		rtype_result_map.put("029010", "E"); 	// 請求先　該当なしの場合
		rtype_result_map.put("029011", "E"); 	// 請求先　複数件の場合
		rtype_result_map.put("029013", "E"); 	// 請求年月が不正な場合
		rtype_result_map.put("029014", "E"); 	// ハローページ掲載有無取得値不正エラーの場合
		rtype_result_map.put("029015", "E"); 	// 付加サービス　複数件の場合
		rtype_result_map.put("029016", "E"); 	// プランマスタ　プラン名称取得値不正の場合
		rtype_result_map.put("029017", "E"); 	// プラン変更管理　複数件の場合
		rtype_result_map.put("029018", "E"); 	// 料金プラン情報　該当なしの場合
		rtype_result_map.put("029019", "E"); 	// 起点変電所ＣＤ集約局ＣＤ変換マスタ　1件以外の場合　
		rtype_result_map.put("029020", "E"); 	// 契約請求先相関　1件以外の場合
		rtype_result_map.put("029021", "E"); 	// 契約請求先相関　該当なしの場合
		rtype_result_map.put("029022", "E"); 	// 契約請求先相関　複数件の場合
		rtype_result_map.put("029023", "E"); 	// 現サービス情報　複数件の場合
		rtype_result_map.put("029024", "E"); 	// 現在の料金プラン（プラン変更管理）　1件以外の場合
		rtype_result_map.put("029025", "E"); 	// 工事有無フラグが不正の場合
		rtype_result_map.put("029026", "E"); 	// 請求書料金情報　該当なしの場合
		rtype_result_map.put("029027", "E"); 	// 発番通知有無が不正な場合
		rtype_result_map.put("029028", "E"); 	// 付加サービス申込情報 1件以外の場合
		rtype_result_map.put("029029", "E"); 	// 料金プラン情報　上限額値不正の場合
		rtype_result_map.put("029030", "E"); 	// 料金プラン予約情報　複数件の場合
		rtype_result_map.put("029031", "E"); 	// 料金プラン予約情報（プラン変更予約）　複数件の場合
		rtype_result_map.put("029032", "E"); 	// 料金単価情報が取得できなかった場合
		rtype_result_map.put("029033", "E"); 	// ダイヤルアップ用認証ＩＤに値が無い場合
		rtype_result_map.put("029034", "E"); 	// ダイヤルアップオプション詳細種別に値が無い場合
		rtype_result_map.put("029035", "E"); 	// ダイヤルアップ接続プラン名称　該当なしの場合
		rtype_result_map.put("029036", "E"); 	// プランマスタ　複数件の場合
		rtype_result_map.put("029037", "E"); 	// モバイルパケット合計テーブル　0件の場合
		rtype_result_map.put("030001", "N"); 	// パスワードが誤っていた場合
		rtype_result_map.put("030002", "N"); 	// 契約 該当なし
		rtype_result_map.put("030003", "N"); 	// 料金プラン 該当なし
		rtype_result_map.put("030004", "N"); 	// オプション　該当なし
		rtype_result_map.put("039001", "E"); 	// 契約 複数あり
		rtype_result_map.put("039002", "E"); 	// 料金プラン 複数あり
		rtype_result_map.put("039003", "E"); 	// 契約者 複数あり
		rtype_result_map.put("039004", "E"); 	// オプション　複数あり
		rtype_result_map.put("110001", "N"); 	// 契約者 0件の場合
		rtype_result_map.put("118001", "E"); 	// ルータを複数台保有している
		rtype_result_map.put("119001", "E"); 	// 料金単価取得失敗
		rtype_result_map.put("119002", "E"); 	// プランマスタ複数あり
		rtype_result_map.put("119003", "E"); 	// 請求月が取得できません。
		rtype_result_map.put("119004", "E"); 	// プランマスタ該当なし
		rtype_result_map.put("119005", "E"); 	// マスタデータ複数あり
		rtype_result_map.put("119006", "E"); 	// マスタデータ該当なし
		rtype_result_map.put("219001", "E"); 	// オプション種別が重複している。
		rtype_result_map.put("318001", "W"); 	// サービスコードが不正な場合
		rtype_result_map.put("319001", "E"); 	// 接続機器のHDDコードに対応するSTB情報がWEB用表示メッセージデータにありません。
		rtype_result_map.put("319002", "E"); 	// 出張費が取得できません。
		rtype_result_map.put("319003", "E"); 	// 追加手数料が取得できません。
		rtype_result_map.put("319004", "E"); 	// 交換手数料が取得できません。
		rtype_result_map.put("319005", "E"); 	// 出張費が複数取得されました。
		rtype_result_map.put("319006", "E"); 	// 追加手数料が複数取得されました。
		rtype_result_map.put("319007", "E"); 	// 交換手数料が複数取得されました。
		rtype_result_map.put("319008", "E"); 	// ＢＳＰＴ工事費が取得できません。
		rtype_result_map.put("319009", "E"); 	// ＢＳＰＴ工事費が複数取得されました。
		rtype_result_map.put("319010", "E"); 	// ＳＴＢ撤去費が取得できません。
		rtype_result_map.put("319011", "E"); 	// ＳＴＢ撤去費が複数取得されました。
		rtype_result_map.put("058001", "W"); 	// ＳＱＬ名が不正な場合
		rtype_result_map.put("818001", "W"); 	// 完了コードが排他エラーの場合
		rtype_result_map.put("818002", "W"); 	// 完了コードが排他エラーの場合（完了コード:30　詳細コード:43654以外)
		rtype_result_map.put("818003", "W"); 	// 完了コードが利用制限の場合
		rtype_result_map.put("818004", "W"); 	// 完了コードがサーバー混雑エラーの場合
		rtype_result_map.put("818005", "W"); 	// 完了コードが重複エラーの場合
		rtype_result_map.put("818006", "W"); 	// 完了コードが警告エラーの場合
		rtype_result_map.put("818007", "W"); 	// 完了コードが契約状態エラーの場合
		rtype_result_map.put("819001", "E"); 	// シーケンスの取得に失敗した場合
		rtype_result_map.put("819002", "E"); 	// 完了コードがその他のエラーの場合
		rtype_result_map.put("819003", "E"); 	// Web受付結果が取得できない場合
		rtype_result_map.put("819004", "E"); 	// 応答内容０１の値がない場合
		rtype_result_map.put("819005", "E"); 	// WEB新規申し込み情報結果が取得できない場合
		rtype_result_map.put("819006", "E"); 	// 顧客検索結果が取得できない場合
		rtype_result_map.put("828001", "W"); 	// Ｗｅｂ予約情報が取得できなかった場合（1回目）
		rtype_result_map.put("828002", "W"); 	// Ｗｅｂ予約情報が取得できなかった場合（2回目）
		rtype_result_map.put("828003", "W"); 	// Ｗｅｂ予約情報が取得できなかった場合
		rtype_result_map.put("828004", "W"); 	// Ｗｅｂ予約情報が複数存在する場合
		rtype_result_map.put("828005", "W"); 	// 更新結果が1件ではない場合
		rtype_result_map.put("828006", "W"); 	// Ｗｅｂ予約情報が1件ではない場合
		rtype_result_map.put("828007", "W"); 	// 工事依頼データありの場合
		rtype_result_map.put("828008", "W"); 	// 更新結果が1件ではない場合
		rtype_result_map.put("828009", "W"); 	// 同一お客さまＩＤで既にＷｅｂ予約が存在する場合
		rtype_result_map.put("828010", "W"); 	// 同一請求先番号で既にＷｅｂ予約が存在する場合
		rtype_result_map.put("828011", "W"); 	// 同一契約者番号で既にＷｅｂ予約が存在する場合
		rtype_result_map.put("919001", "E"); 	// 処理結果コードが取得できませんでした。
	}
	
	/**
	 * 業務規制チェック処理です。<br>
	 * 共有フォームBeanの業務規制フラグが規制中かどうかを判定します。
	 * <br>
	 * @param commonBean 共有フォームBean
	 * @return true:規制なしの場合  false:規制中の場合
	 * @throws Exception エラーが発生した場合
	 */
	public static boolean checkRequestRestriction(X31SDataBeanAccess commonBean)
	{
		X31SDataBeanAccessArray reqRestList = commonBean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);
		for (int i = 0; i < reqRestList.getCount(); i++)
		{
			X31SDataBeanAccess commonSubBean = reqRestList.getDataBean(i);
			String reqRestFlg = commonSubBean.sendMessageString(CommonInfoCFConst.REQUEST_RESTRICTION_FLG_04, X31CWebConst.DATABEAN_GET_VALUE);
			
			// 業務規制エラーの場合（共有フォームBeanの業務規制フラグ（REQUEST_RESTRICTION_FLG_04）が１つでも、"1:規制中"となっている場合）
			if ("1".equals(reqRestFlg))
			{
				return false;
			}
		}
		return true;
	}
	
	/**
	 * オブジェクトに値が設定されているか判定します。
	 * <br>
	 * @param value 判定するオブジェクト
	 * @return オブジェクトに値が設定されていない場合はtrue
	 */
	public static boolean isNull(String value)
	{
		return JPCCommonUtil.isNull(value);
	}
	
	/**
	 * 値が数値項目か判定します。
	 * <br>
	 * @param value 処理要求電文の数値項目の値
	 * @return 数値変換に成功した場合はtrue、それ以外はfalseを返却する。
	 */
	public static boolean isNumber(String value)
	{
		if (value == null)
		{
			return false;
		}
		
		try
		{
			Long.parseLong(value);
		}
		catch (NumberFormatException e)
		{
			return false;
		}
		return true;
	}
	
	/**
	 * 結果コードに対応する種別を取得する。
	 * <br>
	 * @param result 処理応答電文の結果コード（WDA_COM_RESULT）の値
	 * @return 結果コードに対応する種別（WDA_COM_RTYPE）を返却する。
	 */
	public static String getRtype(String result)
	{
		if (result == null)
		{
			return "";
		}
		
		String rtype = rtype_result_map.get(result);
		if (rtype != null)
		{
			return rtype;
		}
		else
		{
			return "";
		}
	}
	
	/**
	 * Mapから共通セクタ情報を取得し、処理応答電文（共通セクタ）の形式に変換する。
	 * <br>
	 * @param paramMap 共通セクタ情報が格納されているMap
	 * @return 処理応答電文（共通セクタ）の形式に変換された文字列を返却する。
	 */
	public static String getCommonSector(HashMap<String, Object> paramMap)
	{
		StringBuilder sb = new StringBuilder();
		sb.append("#!sector[CommonPart]!#");
		sb.append(System.getProperty("line.separator"));
		sb.append("WDA_COM_RTYPE=");
		sb.append(getMapValue(paramMap, "WDA_COM_RTYPE"));
		sb.append(System.getProperty("line.separator"));
		sb.append("WDA_COM_RESULT=");
		sb.append(getMapValue(paramMap, "WDA_COM_RESULT"));
		sb.append(System.getProperty("line.separator"));
		sb.append("WDA_COM_DETAIL1=");
		sb.append(getMapValue(paramMap, "WDA_COM_DETAIL1"));
		sb.append(System.getProperty("line.separator"));
		sb.append("WDA_COM_DETAIL2=");
		sb.append(getMapValue(paramMap, "WDA_COM_DETAIL2"));
		sb.append(System.getProperty("line.separator"));
		sb.append("WDA_COM_DETAIL3=");
		sb.append(getMapValue(paramMap, "WDA_COM_DETAIL3"));
		sb.append(System.getProperty("line.separator"));
		sb.append("WDA_COM_DETAIL4=");
		sb.append(getMapValue(paramMap, "WDA_COM_DETAIL4"));
		sb.append(System.getProperty("line.separator"));
		sb.append("WDA_COM_DETAIL5=");
		sb.append(getMapValue(paramMap, "WDA_COM_DETAIL5"));
		sb.append(System.getProperty("line.separator"));
		sb.append("WDA_COM_DETAIL6=");
		sb.append(getMapValue(paramMap, "WDA_COM_DETAIL6"));
		sb.append(System.getProperty("line.separator"));
		
		return sb.toString();
	}
	
	/**
	 * 結果コードから、結果コードと種別のみの処理応答電文（共通セクタ）の形式に変換する。
	 * <br>
	 * @param result 処理応答電文の結果コード（WDA_COM_RESULT）の値
	 * @return 処理応答電文（共通セクタ）の形式に変換された文字列を返却する。
	 */
	public static String getCommonSector(String result)
	{
		// 結果コードに対応する種別を取得する
		String rtype = getRtype(result);
		
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("WDA_COM_RTYPE", rtype);
		paramMap.put("WDA_COM_RESULT", result);
		
		return getCommonSector(paramMap);
	}
	
	/**
	 * Mapからシンプルセクタ情報を取得し、処理応答電文（シンプルセクタ）の形式に変換する。
	 * <br>
	 * @param paramMap シンプルセクタ情報が格納されているMap
	 * @return 処理応答電文（シンプルセクタ）の形式に変換された文字列を返却する。
	 */
	public static String getSimpleSector(HashMap<String, Object> paramMap)
	{
		if (paramMap == null)
		{
			return "";
		}
		
		StringBuilder sb = new StringBuilder("");
		
		Iterator<String> iterator = paramMap.keySet().iterator();
		
		// マップに格納されているキーを全て取得するまで処理を繰り返す
		for (int i = 0; iterator.hasNext(); i++)
		{
			if (i == 0)
			{
				sb.append("#!sector[SimplePart]!#");
				sb.append(System.getProperty("line.separator"));
			}
			
			String key = (String)iterator.next();
			
			sb.append(key);
			sb.append("=");
			sb.append(getMapValue(paramMap, key));
			sb.append(System.getProperty("line.separator"));
		}
		
		return sb.toString();
	}
	
	/**
	 * Listからマルチセクタ情報Mapを取得し、処理応答電文（マルチセクタ）の形式に変換する。
	 * <br>
	 * @param paramList マルチセクタ情報が格納されているMapのリスト
	 * @param sector_nm マルチセクタ定義部のセクタ名称（キー名）
	 * @return 処理応答電文（マルチセクタ）の形式に変換された文字列を返却する。
	 */
	public static String getMultipleSector(ArrayList<HashMap<String, Object>> paramList, String sector_nm)
	{
		if (paramList == null)
		{
			return "";
		}
		
		StringBuilder sb = new StringBuilder("");
		
		for (int i = 0; i < paramList.size(); i++)
		{
			HashMap<String, Object> mltiMap = (HashMap<String, Object>)paramList.get(i);
			
			Iterator<String> iterator = mltiMap.keySet().iterator();
			
			// マップに格納されているキーを全て取得するまで処理を繰り返す
			for (int j = 0; iterator.hasNext(); j++)
			{
				if (j == 0)
				{
					sb.append("#!sector[MultiplePart[");
					sb.append(sector_nm);
					sb.append("]]!#");
					sb.append(System.getProperty("line.separator"));
				}
				
				String key = (String)iterator.next();
				
				sb.append(key);
				sb.append("=");
				sb.append(getMapValue(mltiMap, key));
				sb.append(System.getProperty("line.separator"));
			}
		}
		
		return sb.toString();
	}
	
	/**
	 * 指定されたキーでマップの値を取得し返却する。<br>
	 * マップがnullの場合や値がnullの場合は空文字を返す。
	 * <br>
	 * @param map マップ
	 * @param key キー
	 * @return 指定されたキーでマップの値を取得し返却する。
	 */
	private static String getMapValue(HashMap<String, Object> map, String key)
	{
		if (map == null)
		{
			return "";
		}
		
		String value = (String)map.get(key);
		if (value == null)
		{
			return "";
		}
		
		// CRLFの除去
		String cr = "\r";
		String lf = "\n";
		
		// 改行コードを空文字に変換
		value = value.replace(cr, "");
		value = value.replace(lf, "");
		
		return value;
	}
	
	/**
	 * 例外情報をデバッグログに出力します。
	 * @param e 例外情報
	 */
	public static void printDebugLog(Exception e)
	{
		DEBUG_LOG.debug("    " + e.toString());
		StackTraceElement[] element = e.getStackTrace();
		for (int i = 0; i < element.length; i++)
		{
			DEBUG_LOG.debug("    " + element[i].toString());
		}
	}
	
	/**
	 * サービス側で発生したエラー情報をデバッグログに出力します。
	 * @param jwse JCCWebServiceException
	 */
	public static void printDebugLog(JCCWebServiceException jwse)
	{
		DEBUG_LOG.debug("□サービス側エラー情報");
		
		X31CMessageResult messageResult = jwse.getMessageList();
		X31CMessageMoreInfo[] msgMoreInfoList = messageResult.getMessageMoreInfoList();
		
		for (int i = 0; i < msgMoreInfoList.length; i++)
		{
			X31CMessageMoreInfo msgMoreInfo = msgMoreInfoList[i];
			String templateId = msgMoreInfo.getTemplateId();
			String status = msgMoreInfo.getStatus();
			String itemId = msgMoreInfo.getItemId();
			String itemCheckErr = msgMoreInfo.getItemCheckErr();
			
			DEBUG_LOG.debug("    サービスI/F[ステータス]：" + String.format("%s[%s]", templateId, status));
			DEBUG_LOG.debug("    項目ID[エラーID]：" + String.format("%s[%s]", itemId, itemCheckErr));
		}
	}
	
	/**
	 * 文字コードの変換を行います。<br>
	 * Unicodeコードポイントの強制変換を行います。
	 * <br>
	 * @param value コード変換対象の文字列
	 * @return 変換後の文字列
	 */
	public static String charConverter(String value)
	{
		return changeUnicode(value, UNI_CONV_1);
	}
	
	/**
	 * 文字コードの変換を行います。<br>
	 * Unicodeコードポイントの強制変換します。
	 * <br>
	 * @param value コード変換対象の文字列
	 * @param charCode 出力する文字コードを「UTF-8」「Shift-JIS」「EUC-JP」「DEFAULT」で指定する。<br>
	 * 　　　　　　　　 ※「DEFAULT」はOSに準拠した文字コード
	 * @return 変換後の文字列
	 */
	public static String charConverter(String value, String charCode)
	{
		//Shift-JIS・EUC-JPのみ変換用の変換
		if("Shift-JIS".equals(charCode) || "EUC-JP".equals(charCode))
		{
			return changeUnicode(value, UNI_CONV_2);
		}
		//その他の変換（UTF-8）
		else
		{
			return changeUnicode(value, UNI_CONV_1);
		}
	}
	
	/**
	 * Unicodeの強制変換を行います。
	 * <br>
	 * @param arg0 変換対象の文字列
	 * @param convList Unicode変換定義
	 * @return 変換後文字列
	 */
	private static String changeUnicode(String arg0, char[][] convList)
	{
		if (JKKApiCommon.isNull(arg0))
		{
			return arg0;
		}
		
		char[] chars = arg0.toCharArray();
		
		for (int i = 0; i < chars.length; i++)
		{
			chars[i] = transUnicode(chars[i], convList);
		}
		
		return new String(chars);
	}
	
	/**
	 * 指定された変換定義に従ってUnicodeの強制変換を行います。
	 * <br>
	 * @param c Unicode変換する文字
	 * @param convList Unicode変換定義
	 * @return Unicode変換された文字
	 */
	private static char transUnicode(char c, char[][] convList)
	{
		for (int i = 0; i < convList.length; i++)
		{
			char[] chars = convList[i];
			
			if (chars[0] == c)
			{
				return chars[1];
			}
		}
		
		return c;
	}
	
	/**
	 * Null項目変換処理
	 * @param map
	 * @param keys
	 */
	public static void setNulltoBlank(HashMap<String, Object> map, String[] keys)
	{
		
		for(int i = 0; i < keys.length; i++)
		{
			
			if(!map.containsKey(keys[i]))
			{
				map.put(keys[i], "");
			}
			
			if(map.get(keys[i]) == null)
			{
				map.put(keys[i], "");
			}
			
		}
		
	}

	// ANK-3366-00-00 ADD START
	/**
	 * 卸先事業者のリクエストパラメータからJSONデータを取得して返します。
	 * <br />
	 * @param sessionId セッションID
	 * @return JSON形式の文字列から作成したMapオブジェクト
	 * @throws IOException リクエストパラメータ取得処理でエラーが発生した場合
	 * @throws JSONException JSON操作でエラーが発生した場合
	 */
	public static Map<String, Object> getJsonDataFromOrs(String sessionId) throws IOException, JSONException
	{
		JSYwebLog.println(JSYLogBase.EXECUTION, JKKApiCommonUtil.class, null, "BPCON0I002", new String[]{"----- 卸先事業者連携受信データ START -----"}, null);

		String json = getJsonData(sessionId, JKKStrConst.ENCODE_UTF8, PARAMNAME_JSON);

		Map<String, Object> requestMap = jsonToMap(json);

		JSYwebLog.println(JSYLogBase.EXECUTION, JKKApiCommonUtil.class, null, "BPCON0I002", new String[]{"----- 卸先事業者連携受信データ END -----"}, null);

		return requestMap;
	}

	/**
	 * リクエストパラメータからJSONデータを取得して返します。
	 * <br />
	 * @param sessionId セッションID
	 * @param encoding 文字コード
	 * @param paramName JSONデータが設定されているパラメータ名
	 * @return JSONデータ
	 * @throws IOException リクエストパラメータ取得処理でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	public static String getJsonData(String sessionId, String encoding, String paramName) throws IOException
	{
		ServletRequest request = JCKLcsApiCommonUtil.getServletRequest(sessionId);
		Map receiveMap = JCKLcsApiCommonUtil.getRequestParamMap(request, encoding);

		JSYwebLog.println(JSYLogBase.EXECUTION, JKKApiCommonUtil.class, null, "BPCON0I002", new String[]{receiveMap.toString()}, null);

		return (String)receiveMap.get(paramName);
	}

// ----------------- ANK-4092-00-00 ADD START
	/**
	 * リクエストパラメータからJSONデータを取得して返します。
	 * <br />
	 * @param sessionId セッションID
	 * @param encoding 文字コード
	 * @param paramName JSONデータが設定されているパラメータ名
	 * @return JSONデータ
	 * @throws IOException リクエストパラメータ取得処理でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	public static String getJsonDataInBody(String sessionId) throws IOException
	{
		ServletRequest request = JCKLcsApiCommonUtil.getServletRequest(sessionId);
		String jsonData = JCKLcsApiCommonUtil.getRequestParamMapForJson(request);

		JSYwebLog.println(JSYLogBase.EXECUTION, JKKApiCommonUtil.class, null, "BPCON0I002", new String[]{jsonData}, null);

		return jsonData;
	}
	
// ----------------- ANK-4092-00-00 ADD END
	/**
	 * JSON形式の文字列をMapオブジェクトに変換します。<br />
	 * JSONの値はすべてStringに変換して設定します。JSONの値がnullの場合は、Mapの値もnullになります。
	 * <br />
	 * @param json JSON形式の文字列
	 * @return JSON形式の文字列から作成したMapオブジェクト
	 * @throws JSONException JSON操作でエラーが発生した場合
	 */
	public static Map<String, Object> jsonToMap(String json) throws JSONException
	{
		JSONObject jsonObj = new JSONObject(json);
		Map<String, Object> map = new HashMap<String, Object>();
		Iterator<?> it = jsonObj.keys();
		while (it.hasNext())
		{
			String key = (String)it.next();
			Object value = jsonObj.opt(key);
			if (value instanceof JSONArray)
			{
				map.put(key, jsonArrayToList((JSONArray)value));
			}
			else if (value instanceof JSONObject)
			{
				map.put(key, jsonToMap(String.valueOf(value)));
			}
			else if (JSONObject.NULL.equals(value))
			{
				map.put(key, null);
			}
			else
			{
				map.put(key, String.valueOf(value));
			}
		}

		return map;
	}

	/**
	 * JSONArrayオブジェクトをListオブジェクトに変換します。
	 * <br />
	 * @param jsonArray JSONArrayオブジェクト
	 * @return JSONArrayオブジェクトから作成したListオブジェクト
	 * @throws JSONException JSON操作でエラーが発生した場合
	 */
	public static List<Object> jsonArrayToList(JSONArray jsonArray) throws JSONException
	{
		List<Object> list = new ArrayList<Object>();
		for (int i = 0; i < jsonArray.length(); i++)
		{
			Object value = jsonArray.get(i);
			if (value instanceof JSONArray)
			{
				list.add(jsonArrayToList((JSONArray)value));
			}
			else if (value instanceof JSONObject)
			{
				list.add(jsonToMap(String.valueOf(value)));
			}
			else if (JSONObject.NULL.equals(value))
			{
				list.add(null);
			}
			else
			{
				list.add(String.valueOf(value));
			}
		}

		return list;
	}

	/**
	 * 共通項目を設定したJSONオブジェクトを生成して返します。
	 * <br />
	 * @param requestMap リクエストパラメータ(JSONデータ)
	 * @param returnCode リターンコード
	 * @param returnMessage リターンメッセージ
	 * @return 共通項目を設定したJSONオブジェクト
	 * @throws JSONException JSON操作でエラーが発生した場合
	 */
	public static JSONObject createJsonResponse(Map<String, Object> requestMap, String returnCode, String returnMessage) throws JSONException
	{
		JSONObject jsonObj = new JSONObject();
		for (String commonHeader : COMMON_HEADER_JSON)
		{
			if (requestMap != null)
			{
				jsonObj.put(commonHeader, getJsonValue(requestMap.get(commonHeader)));
			}
		}
		jsonObj.put("returnCode", getJsonValue(returnCode));
		jsonObj.put("returnMessage", getJsonValue(returnMessage));

		// ANK-3604-00-00 ADD START
		JSYwebLog.println(JSYLogBase.EXECUTION, JKKApiCommonUtil.class, null, "BPCON0I002", new String[]{jsonObj.toString()}, null);
		// ANK-3604-00-00 ADD END

		return jsonObj;
	}

	/**
	 * JSONに設定する値を返します。
	 * <br />
	 * @param value 値
	 * @return 値がnullの場合はJSONObject.NULL、nullでない場合は値(何もしない)
	 */
	public static Object getJsonValue(Object value)
	{
		if (value == null)
		{
			return JSONObject.NULL;
		}

		return value;
	}

	/**
	 * 処理応答電文を返します。
	 * <br />
	 * @param jsonResponse JSONデータ
	 * @return 処理応答電文
	 */
	public static String getResponseMsg(String jsonResponse)
	{
		return PARAMNAME_JSON + "=" + jsonResponse;
	}
	// ANK-3366-00-00 ADD END
}
