/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUPitsInterface
 *   ソースファイル名：JFUPitsInterface.java
 *   作成者          ：富士通
 *   日付            ：2012年10月06日
 *＜機能概要＞
 *   PITSの外部APIを呼び出すIF部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v4.00.00    2012/10/06   FJ）西川    新規作成
 *
 **********************************************************************/
package eo.web.webview.common;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Map.Entry;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.fujitsu.futurity.web.x31.X31SWebLog;

import eo.common.constant.JFUStrConst;

/**
 * PITSの外部APIを呼び出すIF部品です。
 *
 * <br>
 * @author 富士通
 * @see JFUUrlConnection フロント用HTTP又はSSLリクエストの送信部品
 */
public class JFUPitsInterface extends JFUUrlConnection
{

	/**
	 * フォームID
	 */
	public static final String REQ_FORMID;

	/**
	 * パスワード
	 */
	public static final String REQ_PASSWORD;

	/**
	 * 項目1
	 */
	public static final String REQ_ITEM1;

	/**
	 * 項目2
	 */
	public static final String REQ_ITEM2;

	/**
	 * 項目3
	 */
	public static final String REQ_ITEM3;

	/**
	 * 項目4
	 */
	public static final String REQ_ITEM4;

	/**
	 * 項目5
	 */
	public static final String REQ_ITEM5;

	/**
	 * 項目6
	 */
	public static final String REQ_ITEM6;

	/**
	 * 項目7
	 */
	public static final String REQ_ITEM7;

	/**
	 * 項目8
	 */
	public static final String REQ_ITEM8;

	/**
	 * 項目9
	 */
	public static final String REQ_ITEM9;

	/**
	 * 項目10
	 */
	public static final String REQ_ITEM10;

	/**
	 * 項目11
	 */
	public static final String REQ_ITEM11;

	/**
	 * 項目12
	 */
	public static final String REQ_ITEM12;

	/**
	 * 項目13
	 */
	public static final String REQ_ITEM13;

	/**
	 * 項目14
	 */
	public static final String REQ_ITEM14;

	/**
	 * 項目15
	 */
	public static final String REQ_ITEM15;

	/**
	 * 項目16
	 */
	public static final String REQ_ITEM16;

	/**
	 * 項目17
	 */
	public static final String REQ_ITEM17;

	/**
	 * 項目18
	 */
	public static final String REQ_ITEM18;

	/**
	 * 項目19
	 */
	public static final String REQ_ITEM19;

	/**
	 * 項目20
	 */
	public static final String REQ_ITEM20;

	/**
	 * 項目21
	 */
	public static final String REQ_ITEM21;

	/**
	 * 項目22
	 */
	public static final String REQ_ITEM22;

	/**
	 * 項目23
	 */
	public static final String REQ_ITEM23;

	/**
	 * 項目24
	 */
	public static final String REQ_ITEM24;

	/**
	 * 項目25
	 */
	public static final String REQ_ITEM25;

	/**
	 * 項目26
	 */
	public static final String REQ_ITEM26;

	/**
	 * 項目27
	 */
	public static final String REQ_ITEM27;

	/**
	 * 項目28
	 */
	public static final String REQ_ITEM28;

	/**
	 * 項目29
	 */
	public static final String REQ_ITEM29;

	/**
	 * 項目30
	 */
	public static final String REQ_ITEM30;

	/**
	 * 項目31
	 */
	public static final String REQ_ITEM31;

	/**
	 * 項目32
	 */
	public static final String REQ_ITEM32;

	/**
	 * 項目33
	 */
	public static final String REQ_ITEM33;

	/**
	 * 項目34
	 */
	public static final String REQ_ITEM34;

	/**
	 * 項目35
	 */
	public static final String REQ_ITEM35;

	/**
	 * 項目36
	 */
	public static final String REQ_ITEM36;

	/**
	 * 項目37
	 */
	public static final String REQ_ITEM37;

	/**
	 * 項目38
	 */
	public static final String REQ_ITEM38;

	/**
	 * 項目39
	 */
	public static final String REQ_ITEM39;

	/**
	 * 項目40
	 */
	public static final String REQ_ITEM40;

	/**
	 * 項目41
	 */
	public static final String REQ_ITEM41;

	/**
	 * 項目42
	 */
	public static final String REQ_ITEM42;

	/**
	 * 項目43
	 */
	public static final String REQ_ITEM43;

	/**
	 * 項目44
	 */
	public static final String REQ_ITEM44;

	/**
	 * 項目45
	 */
	public static final String REQ_ITEM45;

	/**
	 * 項目46
	 */
	public static final String REQ_ITEM46;

	/**
	 * 項目47
	 */
	public static final String REQ_ITEM47;

	/**
	 * 項目48
	 */
	public static final String REQ_ITEM48;

	/**
	 * 項目49
	 */
	public static final String REQ_ITEM49;

	/**
	 * 項目50
	 */
	public static final String REQ_ITEM50;

	/**
	 * 項目51
	 */
	public static final String REQ_ITEM51;

	/**
	 * 項目52
	 */
	public static final String REQ_ITEM52;

	/**
	 * 項目53
	 */
	public static final String REQ_ITEM53;

	/**
	 * 項目54
	 */
	public static final String REQ_ITEM54;

	/**
	 * 項目55
	 */
	public static final String REQ_ITEM55;

	/**
	 * 項目56
	 */
	public static final String REQ_ITEM56;

	/**
	 * 項目57
	 */
	public static final String REQ_ITEM57;

	/**
	 * 項目58
	 */
	public static final String REQ_ITEM58;

	/**
	 * 項目59
	 */
	public static final String REQ_ITEM59;

	/**
	 * 項目60
	 */
	public static final String REQ_ITEM60;

	/**
	 * 項目61
	 */
	public static final String REQ_ITEM61;

	/**
	 * 項目62
	 */
	public static final String REQ_ITEM62;

	/**
	 * 項目63
	 */
	public static final String REQ_ITEM63;

	/**
	 * 項目64
	 */
	public static final String REQ_ITEM64;

	/**
	 * 項目65
	 */
	public static final String REQ_ITEM65;

	/**
	 * 項目66
	 */
	public static final String REQ_ITEM66;

	/**
	 * 項目67
	 */
	public static final String REQ_ITEM67;

	/**
	 * 項目68
	 */
	public static final String REQ_ITEM68;

	/**
	 * 項目69
	 */
	public static final String REQ_ITEM69;

	/**
	 * 項目70
	 */
	public static final String REQ_ITEM70;

	/**
	 * 項目71
	 */
	public static final String REQ_ITEM71;

	/**
	 * 項目72
	 */
	public static final String REQ_ITEM72;

	/**
	 * 項目73
	 */
	public static final String REQ_ITEM73;

	/**
	 * 項目74
	 */
	public static final String REQ_ITEM74;

	/**
	 * 項目75
	 */
	public static final String REQ_ITEM75;

	/**
	 * 項目76
	 */
	public static final String REQ_ITEM76;

	/**
	 * 項目77
	 */
	public static final String REQ_ITEM77;

	/**
	 * 項目78
	 */
	public static final String REQ_ITEM78;

	/**
	 * 項目79
	 */
	public static final String REQ_ITEM79;

	/**
	 * 項目80
	 */
	public static final String REQ_ITEM80;

	/**
	 * 項目81
	 */
	public static final String REQ_ITEM81;

	/**
	 * 項目82
	 */
	public static final String REQ_ITEM82;

	/**
	 * 項目83
	 */
	public static final String REQ_ITEM83;

	/**
	 * 項目84
	 */
	public static final String REQ_ITEM84;

	/**
	 * 項目85
	 */
	public static final String REQ_ITEM85;

	/**
	 * 項目86
	 */
	public static final String REQ_ITEM86;

	/**
	 * 項目87
	 */
	public static final String REQ_ITEM87;

	/**
	 * 項目88
	 */
	public static final String REQ_ITEM88;

	/**
	 * 項目89
	 */
	public static final String REQ_ITEM89;

	/**
	 * 項目90
	 */
	public static final String REQ_ITEM90;

	/**
	 * 項目91
	 */
	public static final String REQ_ITEM91;

	/**
	 * 項目92
	 */
	public static final String REQ_ITEM92;

	/**
	 * 項目93
	 */
	public static final String REQ_ITEM93;

	/**
	 * 項目94
	 */
	public static final String REQ_ITEM94;

	/**
	 * 項目95
	 */
	public static final String REQ_ITEM95;

	/**
	 * 項目96
	 */
	public static final String REQ_ITEM96;

	/**
	 * 項目97
	 */
	public static final String REQ_ITEM97;

	/**
	 * 項目98
	 */
	public static final String REQ_ITEM98;

	/**
	 * 項目99
	 */
	public static final String REQ_ITEM99;

	/**
	 * 項目100
	 */
	public static final String REQ_ITEM100;

	/**
	 * 項目101
	 */
	public static final String REQ_ITEM101;

	/**
	 * 項目102
	 */
	public static final String REQ_ITEM102;

	/**
	 * 項目103
	 */
	public static final String REQ_ITEM103;

	/**
	 * 項目104
	 */
	public static final String REQ_ITEM104;

	/**
	 * 項目105
	 */
	public static final String REQ_ITEM105;

	/**
	 * 項目106
	 */
	public static final String REQ_ITEM106;

	/**
	 * 項目107
	 */
	public static final String REQ_ITEM107;

	/**
	 * 項目108
	 */
	public static final String REQ_ITEM108;

	/**
	 * 項目109
	 */
	public static final String REQ_ITEM109;

	/**
	 * 項目110
	 */
	public static final String REQ_ITEM110;

	/**
	 * 項目111
	 */
	public static final String REQ_ITEM111;

	/**
	 * 項目112
	 */
	public static final String REQ_ITEM112;

	/**
	 * 項目113
	 */
	public static final String REQ_ITEM113;

	/**
	 * 項目114
	 */
	public static final String REQ_ITEM114;

	/**
	 * 項目115
	 */
	public static final String REQ_ITEM115;

	/**
	 * 項目116
	 */
	public static final String REQ_ITEM116;

	/**
	 * 項目117
	 */
	public static final String REQ_ITEM117;

	/**
	 * 項目118
	 */
	public static final String REQ_ITEM118;

	/**
	 * 項目119
	 */
	public static final String REQ_ITEM119;

	/**
	 * 項目120
	 */
	public static final String REQ_ITEM120;

	/**
	 * 静的初期化子です。
	 * 項目名定数の値を設定します。
	 */
	static
	{
		REQ_FORMID = "formId";
		REQ_PASSWORD = "password";
		REQ_ITEM1 = "item1";
		REQ_ITEM2 = "item2";
		REQ_ITEM3 = "item3";
		REQ_ITEM4 = "item4";
		REQ_ITEM5 = "item5";
		REQ_ITEM6 = "item6";
		REQ_ITEM7 = "item7";
		REQ_ITEM8 = "item8";
		REQ_ITEM9 = "item9";
		REQ_ITEM10 = "item10";
		REQ_ITEM11 = "item11";
		REQ_ITEM12 = "item12";
		REQ_ITEM13 = "item13";
		REQ_ITEM14 = "item14";
		REQ_ITEM15 = "item15";
		REQ_ITEM16 = "item16";
		REQ_ITEM17 = "item17";
		REQ_ITEM18 = "item18";
		REQ_ITEM19 = "item19";
		REQ_ITEM20 = "item20";
		REQ_ITEM21 = "item21";
		REQ_ITEM22 = "item22";
		REQ_ITEM23 = "item23";
		REQ_ITEM24 = "item24";
		REQ_ITEM25 = "item25";
		REQ_ITEM26 = "item26";
		REQ_ITEM27 = "item27";
		REQ_ITEM28 = "item28";
		REQ_ITEM29 = "item29";
		REQ_ITEM30 = "item30";
		REQ_ITEM31 = "item31";
		REQ_ITEM32 = "item32";
		REQ_ITEM33 = "item33";
		REQ_ITEM34 = "item34";
		REQ_ITEM35 = "item35";
		REQ_ITEM36 = "item36";
		REQ_ITEM37 = "item37";
		REQ_ITEM38 = "item38";
		REQ_ITEM39 = "item39";
		REQ_ITEM40 = "item40";
		REQ_ITEM41 = "item41";
		REQ_ITEM42 = "item42";
		REQ_ITEM43 = "item43";
		REQ_ITEM44 = "item44";
		REQ_ITEM45 = "item45";
		REQ_ITEM46 = "item46";
		REQ_ITEM47 = "item47";
		REQ_ITEM48 = "item48";
		REQ_ITEM49 = "item49";
		REQ_ITEM50 = "item50";
		REQ_ITEM51 = "item51";
		REQ_ITEM52 = "item52";
		REQ_ITEM53 = "item53";
		REQ_ITEM54 = "item54";
		REQ_ITEM55 = "item55";
		REQ_ITEM56 = "item56";
		REQ_ITEM57 = "item57";
		REQ_ITEM58 = "item58";
		REQ_ITEM59 = "item59";
		REQ_ITEM60 = "item60";
		REQ_ITEM61 = "item61";
		REQ_ITEM62 = "item62";
		REQ_ITEM63 = "item63";
		REQ_ITEM64 = "item64";
		REQ_ITEM65 = "item65";
		REQ_ITEM66 = "item66";
		REQ_ITEM67 = "item67";
		REQ_ITEM68 = "item68";
		REQ_ITEM69 = "item69";
		REQ_ITEM70 = "item70";
		REQ_ITEM71 = "item71";
		REQ_ITEM72 = "item72";
		REQ_ITEM73 = "item73";
		REQ_ITEM74 = "item74";
		REQ_ITEM75 = "item75";
		REQ_ITEM76 = "item76";
		REQ_ITEM77 = "item77";
		REQ_ITEM78 = "item78";
		REQ_ITEM79 = "item79";
		REQ_ITEM80 = "item80";
		REQ_ITEM81 = "item81";
		REQ_ITEM82 = "item82";
		REQ_ITEM83 = "item83";
		REQ_ITEM84 = "item84";
		REQ_ITEM85 = "item85";
		REQ_ITEM86 = "item86";
		REQ_ITEM87 = "item87";
		REQ_ITEM88 = "item88";
		REQ_ITEM89 = "item89";
		REQ_ITEM90 = "item90";
		REQ_ITEM91 = "item91";
		REQ_ITEM92 = "item92";
		REQ_ITEM93 = "item93";
		REQ_ITEM94 = "item94";
		REQ_ITEM95 = "item95";
		REQ_ITEM96 = "item96";
		REQ_ITEM97 = "item97";
		REQ_ITEM98 = "item98";
		REQ_ITEM99 = "item99";
		REQ_ITEM100 = "item100";
		REQ_ITEM101 = "item101";
		REQ_ITEM102 = "item102";
		REQ_ITEM103 = "item103";
		REQ_ITEM104 = "item104";
		REQ_ITEM105 = "item105";
		REQ_ITEM106 = "item106";
		REQ_ITEM107 = "item107";
		REQ_ITEM108 = "item108";
		REQ_ITEM109 = "item109";
		REQ_ITEM110 = "item110";
		REQ_ITEM111 = "item111";
		REQ_ITEM112 = "item112";
		REQ_ITEM113 = "item113";
		REQ_ITEM114 = "item114";
		REQ_ITEM115 = "item115";
		REQ_ITEM116 = "item116";
		REQ_ITEM117 = "item117";
		REQ_ITEM118 = "item118";
		REQ_ITEM119 = "item119";
		REQ_ITEM120 = "item120";
	}

	/** ステータス 正常終了 */
	public static final String SUCCESS = "00000";
	/** ステータス 項目値の桁・属性エラー */
	public static final String ERR_VALUE = "60000";
	/** ステータス フォームIDとパスワードが一致しない場合 */
	public static final String ERR_AUTH = "60001";
	/** ステータス 項目数がマスタに登録された項目数を超えている場合 */
	public static final String ERR_COL_NUM = "60002";
	/** ステータス 項目1〜120の内容にJIS第一・第二水準以外の文字が含まれている場合 */
	public static final String ERR_VAL_ATR = "61001";
	/** ステータス 項目1〜120の内容が4000バイトを超えている場合 */
	public static final String ERR_VAL_LEN = "61002";
	/** ステータス データベースアクセスで例外処理が発生した場合 */
	public static final String ERR_DB = "90000";
	/** ステータス 負荷分散機からAPIサーバの両系が切り離された場合 */
	public static final String ERR_LB = "90001";
	/** ステータス APIで例外処理が発生した場合 */
	public static final String ERR_API = "99999";

	/** XMLヘッダータグ */
	private static final String XML_HEADER_TAG = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
	/** 結果コード */
	private static final String RES_RESULT_CD = "RESULT_CD";
	/** 結果情報配列 */
	private static final String RES_RESULT_INFOS = "RESULT_INFOS";
	/** 結果情報 */
	private static final String RES_RESULT_INFO = "RESULT_INFO";
	/** エラー項目番号 */
	private static final String RES_ERR_ITEM_NO = "ERR_ITEM_NO";
	/** エラーコード配列 */
	private static final String RES_ERR_CDS = "ERR_CDS";

	/** PITS連携タイムアウト値取得キー */
	private static final String FU_C_API_IF_PITS_TIME_OUT_KEY = "FU_C_API_IF_PITS_TIME_OUT";
	/** PITS連携文字コード値取得キー */
	private static final String FU_C_API_IF_PITS_CHARCODE_KEY = "FU_C_API_IF_PITS_CHARCODE";

	/**
	 * 汎用個人情報取込APIを実行する。
	 * <br>
	 * @param reqPitsMap 汎用個人情報
	 * @return 処理結果
	 * @throws SAXException 
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws NoSuchAlgorithmException 
	 * @throws KeyManagementException 
	 */
	public static ArrayList<String[]> sendComPersonInfo(HashMap<String, String> reqPitsMap) throws KeyManagementException, NoSuchAlgorithmException,
			IOException, ParserConfigurationException, SAXException
	{
		X31SWebLog.DEBUG_LOG.debug("【開始】PITSの外部APIのIF");

		ArrayList<String[]> resList = getResXmltoResutlList(connect(reqPitsMap, KEY_PITS_COM_PERSON_URL));

		X31SWebLog.DEBUG_LOG.debug("【終了】PITSの外部APIのIF");
		return resList;
	}

	/**
	 * PITSへ接続します。
	 * 
	 * @param reqPitsMap リクエスト情報
	 * @param urlKey URLキー
	 * @return XML情報
	 * @throws KeyManagementException
	 * @throws NoSuchAlgorithmException
	 * @throws IOException
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 */
	private static String connect(HashMap<String, String> reqPitsMap, String urlKey) throws KeyManagementException, NoSuchAlgorithmException,
			IOException, ParserConfigurationException, SAXException
	{
		X31SWebLog.DEBUG_LOG.debug("【開始】PITSの外部APIのIF PITS接続処理(connect)");

		HttpURLConnection conn = null;
		String resXml = null;
		try
		{
			// リクエストタイムアウト値
			int timeOut = Integer.parseInt(JCCWebCommon.getApplicationConst(FU_C_API_IF_PITS_TIME_OUT_KEY));
			// HTTPリクエストエンコード
			String encoding = JCCWebCommon.getApplicationConst(FU_C_API_IF_PITS_CHARCODE_KEY);
			conn = createConnection(urlKey, timeOut);

			X31SWebLog.DEBUG_LOG.debug("【処理中】PITSの外部APIのIF：URL：" + conn.getURL());
			X31SWebLog.DEBUG_LOG.debug("【処理中】PITSの外部APIのIF：文字コード：" + encoding);
			X31SWebLog.DEBUG_LOG.debug("【処理中】PITSの外部APIのIF：タイムアウト：" + timeOut);

			Set<Entry<String, String>> resSet = reqPitsMap.entrySet();
			StringBuffer sb = new StringBuffer();

			int i = 0;
			for (Iterator<Entry<String, String>> iterator = resSet.iterator(); iterator.hasNext();)
			{
				sb.append(i == 0 ? JFUStrConst.EMPTY : JFUStrConst.HALF_AMPERSAND);
				Entry<String, String> entry = (Entry<String, String>)iterator.next();
				X31SWebLog.DEBUG_LOG.debug("【処理中】PITSの外部APIのIF：" + entry.getKey() + JFUStrConst.HALF_COLON + entry.getValue());
				sb.append(entry.getKey()).append(EQUAL_SIGN).append(entry.getValue());
				i++;
			}
			String param = sb.toString();

			conn = connection(conn, param, encoding);
			BufferedInputStream bis = null;
			ByteArrayOutputStream bos = null;
			byte[] outputByte = null;
			try
			{
				bis = new BufferedInputStream(conn.getInputStream());
				// レスポンスを読込み
				bos = new ByteArrayOutputStream();
				int intByte = 0;
				while (true)
				{
					intByte = bis.read();
					if (-1 == intByte)
					{
						break;
					}
					bos.write(intByte);
				}
				outputByte = bos.toByteArray();
			}
			finally
			{
				if (null != bos)
				{
					bos.close();
				}
				if (null != bis)
				{
					bis.close();
				}
			}
			resXml = new String(outputByte, encoding);
		}
		finally
		{
			if (null != conn)
			{
				conn.disconnect();
			}
		}
		X31SWebLog.DEBUG_LOG.debug("【処理中】PITSの外部APIのIF：外部APIからのレスポンス：" + resXml);
		X31SWebLog.DEBUG_LOG.debug("【終了】PITSの外部APIのIF PITS接続処理(connect)");
		return resXml;
	}

	/**
	 * 結果情報を作成する。
	 * 
	 * @param resXml XML情報
	 * @return 結果情報
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	private static ArrayList<String[]> getResXmltoResutlList(String resXml) throws ParserConfigurationException, SAXException, IOException
	{

		// XMLの宣言の再設定。
		resXml = resXml.replace(XML_HEADER_TAG, JFUStrConst.EMPTY);
		resXml = XML_HEADER_TAG + resXml;

		InputSource inputs = new InputSource(new StringReader(resXml));
		DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = fact.newDocumentBuilder();
		Document doc = db.parse(inputs);

		// 処理結果
		ArrayList<String[]> resList = new ArrayList<String[]>();
		Element root = doc.getDocumentElement();
		if (root == null || !root.hasChildNodes())
		{
			// エラー
			X31SWebLog.DEBUG_LOG.debug("レスポンス情報がありません。");
			return null;
		}

		NodeList rootNodelist = root.getElementsByTagName(RES_RESULT_CD);
		if (rootNodelist == null || rootNodelist.getLength() == 0)
		{
			// エラー
			X31SWebLog.DEBUG_LOG.debug("XML情報取得（ルート）がありません。");
			return null;
		}

		Node rootNode = rootNodelist.item(0);

		// 結果コード
		String resultCd = rootNode.getTextContent();

		NodeList resultInfosNodeList = root.getElementsByTagName(RES_RESULT_INFOS);
		if (resultInfosNodeList == null || resultInfosNodeList.getLength() == 0)
		{
			// ======================= 正常終了の場合 =======================

			// 結果コード,エラー項目番号,エラーコード
			resList.add(arrayResult(resultCd, null, null));
			return resList;
		}

		// ======================= 異常終了の場合 =======================
		// XML情報取得（結果情報）

		NodeList resultInfoNodeList = root.getElementsByTagName(RES_RESULT_INFO);
		if (resultInfoNodeList == null || resultInfoNodeList.getLength() == 0)
		{
			// 結果コード,エラー項目番号,エラーコード
			resList.add(arrayResult(resultCd, null, null));
			return resList;
		}

		NodeList errItemNoNodeList = root.getElementsByTagName(RES_ERR_ITEM_NO);
		if (errItemNoNodeList == null || errItemNoNodeList.getLength() == 0)
		{
			// 結果コード,エラー項目番号,エラーコード
			resList.add(arrayResult(resultCd, null, null));
			return resList;
		}

		for (int i = 0; i < resultInfoNodeList.getLength(); i++)
		{
			Node resultInfoNode = resultInfoNodeList.item(i);
			NodeList resultInfoChildNodeList = resultInfoNode.getChildNodes();

			// エラー項目番号
			String errItemNo = null;
			for (int j = 0; j < resultInfoChildNodeList.getLength(); j++)
			{
				Node resultInfoChildNode = resultInfoChildNodeList.item(j);
				if (resultInfoChildNode == null)
				{
					// 結果コード,エラー項目番号,エラーコード
					resList.add(arrayResult(resultCd, null, null));
					continue;
				}

				if (RES_ERR_ITEM_NO.equals(resultInfoChildNode.getNodeName()))
				{
					// エラー項目番号
					errItemNo = resultInfoChildNode.getTextContent();
				}
				else if (RES_ERR_CDS.equals(resultInfoChildNode.getNodeName()))
				{
					NodeList errCdNodeList = resultInfoChildNode.getChildNodes();
					if (errCdNodeList == null || errCdNodeList.getLength() == 0)
					{
						// 結果コード,エラー項目番号,エラーコード
						resList.add(arrayResult(resultCd, errItemNo, null));
						continue;
					}

					for (int k = 0; k < errCdNodeList.getLength(); k++)
					{
						Node errCdNode = errCdNodeList.item(k);
						if (errCdNode == null)
						{
							// 結果コード,エラー項目番号,エラーコード
							resList.add(arrayResult(resultCd, errItemNo, null));
						}
						else
						{
							// エラーコード
							String errCd = errCdNode.getTextContent();
							// 結果コード,エラー項目番号,エラーコード
							resList.add(arrayResult(resultCd, errItemNo, JFUWebCommon.isNull(errCd) ? null : errCd));
						}
					}
				}
				else
				{
					// 結果コード,エラー項目番号,エラーコード
					resList.add(arrayResult(resultCd, null, null));
				}
			}
		}
		return resList;
	}

	/**
	 * 結果の配列を作成する。
	 * 
	 * @param resultCd 結果コード
	 * @param errItemNo エラー項目番号
	 * @param errCd エラーコード
	 * @return 返却情報配列
	 */
	private static String[] arrayResult(String resultCd, String errItemNo, String errCd)
	{
		return new String[] { resultCd == null ? JFUStrConst.EMPTY : resultCd, errItemNo == null ? JFUStrConst.EMPTY : errItemNo,
				errCd == null ? JFUStrConst.EMPTY : errCd };
	}
}