/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	LO Perception教材　QMWISe通信クラス
//			変更履歴
// 				2004.01.08 新規作成		suzuki
//
package jp.co.ntt.lms.lo.Perception;

import java.net.URL;
import java.io.*;
import java.util.*;

import org.apache.xerces.parsers.*;
import org.xml.sax.InputSource;
import org.apache.soap.*;
import org.apache.soap.transport.http.SOAPHTTPConnection;
import org.apache.soap.messaging.Message;
import org.apache.soap.transport.SOAPTransport;
import org.apache.soap.util.xml.XMLParserUtils;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.*;
import java.text.*;

import jp.co.ntt.lms.lo.Perception.*;
import jp.co.ntt.lms.lo.*;
import jp.co.ntt.lms.xmo.util.*;

/**
 * Perception教材　QMWISe通信クラスです。<BR>
 * @author T.Suzuki
 * @version 0.0.0.1 2004/01/08
//			変更履歴
 */
public class PerceptionCorrespondQMWISe implements PerceptionPropertyDef
{
	/** メソッド名定数 */
	public static final String METHOD_NAME = "MethodName";

	/** 名前空間定数 */
	public static final String NAME_SPACE = "NameSpace";

	/** リクエストパラメータオブジェクト */
	private PerceptionRequestData mobjParam;

	/** アセスメントリストオブジェクト */
	private PerceptionResponseAssessmentData objReAssessmentList;

	/** 結果一覧オブジェクト */
	private PerceptionResponseResultData objReResultList;

	/** 受講者個人レポートデータオブジェクト */
	PerceptionResponseReportData objReReport;

	// アセスメントリスト格納用
	Vector vecList = new Vector();

	// SOAP Fault情報取得開始用フラグ
	boolean boolFlg = false;

	/**
	 * コンストラクタです
	 * @param objParam パラメータ
	 * @param objParam パラメータ
	 * @param objParam パラメータ
	 */
	public PerceptionCorrespondQMWISe(PerceptionRequestData objParam)
		throws LOException
	{
		mobjParam = objParam;
	}

	/**
	 * SOAP Request
	 * @return Vector メッセージデータ
	 */
	public Vector CorrespondQMWISe() throws LOException
	{
			boolean boolFault = true;		// SOAPFault(無し:true 有り:false)
		try{

			DocumentBuilder db = XMLParserUtils.getXMLDocBuilder();
			Document doc = db.newDocument();

			// SOAPエンベロープを作成する
			Envelope envelope = new Envelope();

			// ヘッダ要素を収集するためのVectorを作成する
			Vector vecHeaderElements = new Vector();

			// ターゲットオブジェクトのURIを取得し、メソッド名と名前空間を取得
			String strURI = mobjParam.getURI();
			Hashtable htbMN = getMethodAndNameSpace(strURI);

			// 名前空間内にヘッダ要素を作成する
			Element headerElement = doc.createElementNS("", SECURITY);
			headerElement.setAttribute(XMLNS, (String)htbMN.get(NAME_SPACE));

			// MessageHeader内にサブノードを作る
			// ヘッダサブ要素にClientIDを追加
			Element ele = doc.createElement(CLIENT_ID);
			Text textNode = doc.createTextNode(mobjParam.getClientID());
			Node tempNode = ele.appendChild(textNode);

			tempNode = headerElement.appendChild(ele);

			// ヘッダサブ要素にChecksumを追加
			ele = doc.createElement(CHECKSUM);
			textNode = doc.createTextNode(mobjParam.getChecksum());
			tempNode = ele.appendChild(textNode);

			tempNode = headerElement.appendChild(ele);

			vecHeaderElements.add(headerElement);

			// SOAPヘッダ要素を作成する
			Header header = new Header();
			header.setHeaderEntries(vecHeaderElements);

			// SOAPヘッダ要素をエンベロープに追加する
			envelope.setHeader(header);

			// ボディ要素を収集するためのVectorを作成する
			Vector vecBodyElements = new Vector();

			// 名前空間内にボディ要素を作成する
			Element bodyElement = doc.createElementNS("", (String)htbMN.get(METHOD_NAME));
			bodyElement.setAttribute(XMLNS, (String)htbMN.get(NAME_SPACE));

			// MessageBody内にサブノードを作る
			// ヘッダサブ要素にParticipantNameIDを追加
			Element ele_body;
			Text textNode_body;
			Node tempNode_body;

			if( mobjParam.getUserID() != null && !mobjParam.getUserID().equals("")){
				ele_body = doc.createElement(PARTICIPANT_NAME);
				textNode_body = doc.createTextNode(mobjParam.getUserID());
				tempNode_body = ele_body.appendChild(textNode_body);

				tempNode_body = bodyElement.appendChild(ele_body);
			}
			// ヘッダサブ要素にResultIDを追加
			else if( mobjParam.getResultID() != null && !mobjParam.getResultID().equals("")){
				ele_body = doc.createElement(RESULT_ID);
				textNode_body = doc.createTextNode(mobjParam.getResultID());
				tempNode_body = ele_body.appendChild(textNode_body);

				tempNode_body = bodyElement.appendChild(ele_body);
			}

			vecBodyElements.add(bodyElement);

			// SOAPボディ要素を作成する
			Body body = new Body();
			body.setBodyEntries(vecBodyElements);

			// SOAPボディ要素をエンベロープに追加する
			envelope.setBody(body);

			// Messageを構築する
			Message msg = new Message();

			// タイムアウトを設定
			SOAPHTTPConnection objCon = new SOAPHTTPConnection();
			int intTimeout = Integer.parseInt(mobjParam.getTimeout());
			objCon.setTimeout(intTimeout);
			msg.setSOAPTransport(objCon);

			// Messageを送信する
			msg.send(new URL( mobjParam.getQMWISeUrl() ), strURI, envelope);
DebugLog.write( this.getClass(), "Sent SOAP Message with Apache HTTP SOAP Client.", DebugLog.ROW );

			// トランスポートからレスポンスを受信
DebugLog.write( this.getClass(), "Waiting for response...", DebugLog.ROW );
			SOAPTransport st = msg.getSOAPTransport();

			// DOMパーサーを作成
			DOMParser parser = new DOMParser();

			// 入力ストリームを作る
			BufferedReader br = st.receive();
			InputSource is = new InputSource(br);

			// パースする
			parser.parse(is);

			// ドキュメントを得る
			Document objDoc = parser.getDocument();

			// SOAPエラーの場合、SOAPFalut以下をエラーオブジェクトに
			NodeList objErr = objDoc.getElementsByTagName(SOAP_FAULT);
			if ( objErr.getLength() > 0 ){
DebugLog.write( this.getClass(), "SOAP Fault....", DebugLog.ROW );
				boolFault = false;
			}

DebugLog.write( this.getClass(), "#########################################", DebugLog.ROW );
DebugLog.write( this.getClass(), "     Perception教材: SOAP Response", DebugLog.ROW );
DebugLog.write( this.getClass(), "#########################################", DebugLog.ROW );
			// レスポンスオブジェクトを作成
			if(GET_ASSESSMENT_LIST.equals((String)htbMN.get(METHOD_NAME))){
				// アセスメントリストをレスポンスオブジェクトに格納する
				inputAssessmentData(objDoc, 0, boolFault);
				// リストのフィルタリングとソート処理を行う
				try{
					if(boolFault){
						// フィルタリング
						vecList = Assessmentfilter(vecList);
						// ソート
						if(vecList.size()>1){
							vecList = AssessmentSort(vecList);
						}
					}
				}
				catch(LOException le){
					throw le;
				}
			}
			else if(GET_RESULT_BY_PARTICIPANT.equals((String)htbMN.get(METHOD_NAME))){
				// 結果一覧情報をレスポンスオブジェクトに格納する
				inputRsultData(objDoc, 0, boolFault);
				// リストのフィルタリングとソート処理を行う
				try{
					if(boolFault){
						// フィルタリング
						vecList = Resultfilter(vecList, (String)mobjParam.getAssessmentID());
						// ソート
						if(vecList.size()>1){
							vecList = ResultSort(vecList);
						}
					}
				}
				catch(LOException le){
					throw le;
				}
			}
			else if(GET_ACCESS_REPORT.equals((String)htbMN.get(METHOD_NAME))){
				// 受講者個人レポート情報をレスポンスオブジェクトに格納する
				inputReportData(objDoc, 0, boolFault);
			}

		}catch(LOException le){
			throw le;
		}catch(Exception e){
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			throw new LOException(e.getMessage());
		}

		return vecList;
	}

	/**
	 * アセスメントリストをレスポンスオブジェクトに格納します。
	 * @param node ノードオブジェクト
	 * @param int indent
	 * @return Vector アセスメントリスト
	 */
	private void inputAssessmentData(Node node, int indent, boolean boolFault)
		throws IOException,LOException
	{
		//#TEXT型のインデントは読み飛ばす
		if(node.getNodeType() != Node.TEXT_NODE)
		{
			// SOAPFaultならば
			if(!boolFault){
				if(boolFlg){
					// レスポンスデータオブジェクトをインスタンス化
					objReAssessmentList = new PerceptionResponseAssessmentData();
					objReAssessmentList.setFault(node.getNodeName());
					objReAssessmentList.setFaultDescription(getElementValue(node));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
					vecList.add(objReAssessmentList);
				}
				if(node.getNodeName().equalsIgnoreCase(SOAP_FAULT)){
					boolFlg = true;
				}
			}
			// アセスメント要素ならば
			else if(node.getNodeName().equalsIgnoreCase(ASSESSMENT)){
				// レスポンスデータオブジェクトをインスタンス化
				objReAssessmentList = new PerceptionResponseAssessmentData();
			}
			// アセスメントID要素ならば
			else if(node.getNodeName().equalsIgnoreCase(ASSESSMENT_ID)){
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
				objReAssessmentList.setAssessmentID(getElementValue(node));
			}
			// セッション名要素ならば
			else if(node.getNodeName().equalsIgnoreCase(SESSION_NAME)){
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
				objReAssessmentList.setSessionName(getElementValue(node));
			}
			// コメント要素ならば
			else if(node.getNodeName().equalsIgnoreCase(COMMENT)){
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
				objReAssessmentList.setDescription(getElementValue(node));
			}
			// 作成日要素ならば
			else if(node.getNodeName().equalsIgnoreCase(CREATE_DATE)){
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
				objReAssessmentList.setCreatedDate(getElementValue(node));

				// レスポンスデータオブジェクトを格納
				if(objReAssessmentList != null){
					vecList.add(objReAssessmentList);
				}
			}
		}

		Node objNode;
		for(objNode = node.getFirstChild();objNode != null; objNode = objNode.getNextSibling()){
			// 再帰呼び出し
			inputAssessmentData(objNode, indent+1, boolFault);
		}
	}

	/**
	 * 結果一覧情報をレスポンスオブジェクトに格納します。
	 * @param node ノードオブジェクト
	 * @param int indent
	 * @return Vector 結果一覧情報
	 */
	private void inputRsultData(Node node, int indent, boolean boolFault)
		throws IOException,LOException
	{

		//#TEXT型のインデントは読み飛ばす
		if(node.getNodeType() != Node.TEXT_NODE)
		{
			// SOAPFaultならば
			if(!boolFault){
				if(boolFlg){
					// レスポンスデータオブジェクトをインスタンス化
					objReResultList = new PerceptionResponseResultData();
					objReResultList.setFault(node.getNodeName());
					objReResultList.setFaultDescription(getElementValue(node));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
					vecList.add(objReResultList);
				}
				if(node.getNodeName().equalsIgnoreCase(SOAP_FAULT)){
					boolFlg = true;
				}
			}
			// 結果要素ならば
			else if(node.getNodeName().equalsIgnoreCase(RESULT)){
				// レスポンスデータオブジェクトをインスタンス化
				objReResultList = new PerceptionResponseResultData();
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
			}
			// 結果ID要素ならば
			else if(node.getNodeName().equalsIgnoreCase(RESULT_ID)){
				objReResultList.setResultID(getElementValue(node));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
			}
			// アセスメントID要素ならば
			else if(node.getNodeName().equalsIgnoreCase(ASSESSMENT_ID)){
				objReResultList.setAssessmentID(getElementValue(node));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
			}
			// 満点要素ならば
			else if(node.getNodeName().equalsIgnoreCase(MAX_SCORE)){
				objReResultList.setMaxScore(getElementValue(node));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
			}
			// 得点要素ならば
			else if(node.getNodeName().equalsIgnoreCase(TOTAL_SCORE)){
				objReResultList.setTotalScore(getElementValue(node));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
			}
			// 滞在時間要素ならば
			else if(node.getNodeName().equalsIgnoreCase(TIME_TAKEN)){
				objReResultList.setTimeTaken(convertMinutes(getElementValue(node)));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
			}
			// 試験結果要素ならば
			else if(node.getNodeName().equalsIgnoreCase(SCORE_BAND_TITLE)){
				objReResultList.setScoreBandTitle(getStatus(getElementValue(node)));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
			}
			// 得点のパーセンテージ要素ならば
			else if(node.getNodeName().equalsIgnoreCase(PERCENTAGE_SCORE)){
				objReResultList.setPercentageScore(getElementValue(node));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
			}
			// 開始年月日時要素ならば
			else if(node.getNodeName().equalsIgnoreCase(WHEN_STARTED)){
				objReResultList.setWhenStarted(getQMWISeDate(getElementValue(node)));
				
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
			}
			// 終了年月日時要素ならば
			else if(node.getNodeName().equalsIgnoreCase(WHEN_FINISHED)){
				objReResultList.setWhenFinished(getQMWISeDate(getElementValue(node)));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );

				// レスポンスデータオブジェクトを格納
				if(objReResultList != null){
					vecList.add(objReResultList);
				}
			}
		}

		Node objNode;
		for(objNode = node.getFirstChild();objNode != null; objNode = objNode.getNextSibling()){
			// 再帰呼び出し
			inputRsultData(objNode, indent+1, boolFault);
		}
	}

	/**
	 * 受講者個人レポート情報をレスポンスオブジェクトに格納します。
	 * @param node ノードオブジェクト
	 * @param int indent
	 * @return Vector 受講者個人レポート情報
	 */
	private void inputReportData(Node node, int indent, boolean boolFault)
		throws IOException,LOException
	{

		//#TEXT型のインデントは読み飛ばす
		if(node.getNodeType() != Node.TEXT_NODE)
		{
			// SOAPFaultならば
			if(!boolFault){
				if(boolFlg){
					// レスポンスデータオブジェクトをインスタンス化
					objReReport = new PerceptionResponseReportData();
					objReReport.setFault(node.getNodeName());
					objReReport.setFaultDescription(getElementValue(node));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );
					// レスポンスデータオブジェクトを格納
					vecList.add(objReReport);
				}
				if(node.getNodeName().equalsIgnoreCase(SOAP_FAULT)){
					boolFlg = true;
				}
			}
			// URL要素ならば
			else if(node.getNodeName().equalsIgnoreCase(URL)){
				objReReport = new PerceptionResponseReportData();
				objReReport.setURL(getElementValue(node));
DebugLog.write( this.getClass(), node.getNodeName() + " : " + getElementValue(node), DebugLog.ROW );

				// レスポンスデータオブジェクトを格納
				vecList.add(objReReport);
			}
		}

		Node objNode;
		for(objNode = node.getFirstChild();objNode != null; objNode = objNode.getNextSibling()){
			// 再帰呼び出し
			inputReportData(objNode, indent+1, boolFault);
		}
	}

	/**
	 * メソッド名と名前空間を取得
	 * @param strURI ターゲットオブジェクトのURI
	 * @return Hashtable メソッド名と名前空間を格納
	 */
	private Hashtable getMethodAndNameSpace(String strURI) throws LOException
	{
		Hashtable htbRet = new Hashtable();

		StringTokenizer objST = new StringTokenizer(strURI, "/");
		String strMethodName = "";
		while(objST.hasMoreTokens()){
			strMethodName = objST.nextToken();
		}
		String strNameSpace = strURI.substring(0, strURI.indexOf(strMethodName));
		htbRet.put(METHOD_NAME, strMethodName);
		htbRet.put(NAME_SPACE, strNameSpace);

		return htbRet;
	}

	/**
	 * 要素値取得
	 * @param objElementNode ノードオブジェクト
	 * @return String ノード値
	 */
	private String getElementValue(Node objElementNode)
	{
		String strRet = "";
		Node objTextNode = objElementNode.getFirstChild();
		if(objTextNode != null)
		{
			if(objTextNode.getNodeName().equals("#text"))
			{
				// 空白をとりのぞいた値を設定
				strRet = objTextNode.getNodeValue().trim();
			}
		}
		return strRet;
	}

	/**
	 * 日付フォーマット変換
	 * @param strDate 変換前日付
	 * @return String 変換後日付
	 */
	private String getQMWISeDate(String strDate)
	{
		if(strDate != null && !strDate.equals("")){
			// 日時をフォーマット変換
			SimpleDateFormat formatter1 = new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss");

			ParsePosition pos = new ParsePosition(0);
//ADD+MOD start NTTR-an QMWISe出力時間補正+不正終了時の表示日時対策			
			Date dtStudyEndDate = formatter1.parse(strDate, pos);
			// DateオブジェクトはGMTなのでJSTに変換する(9h=32400000ms)			
			long numEndDate = dtStudyEndDate.getTime() + 32400000;
			Date dtStudyEndDate2 = new Date(numEndDate);
			SimpleDateFormat formatter2 = new SimpleDateFormat ("yyyy/MM/dd HH:mm:ss");
//			strDate = formatter2.format(dtStudyEndDate);
			strDate = formatter2.format(dtStudyEndDate2);
			//ADD+MOD end
//ADD start NTTR-an Perception不正終了時の表示日時対策
			if(strDate.substring(0,4).equals("1899")){
				strDate = "−−−　　　　　　";
			}
//ADD end
		}
		return strDate;
	}

	/**
	 * ステータス決定
	 * @param strScoreBandTitle ScoreBandTitle
	 * @return String ステータス
	 */
	private String getStatus(String strScoreBandTitle)
	{
		// ステータスを決定
		if(strScoreBandTitle != null && !strScoreBandTitle.equals("")){
			if((strScoreBandTitle.length()>=2 && strScoreBandTitle.substring(0, 2).equals("合格")) || (strScoreBandTitle.length()>=4 && strScoreBandTitle.substring(0, 4).equalsIgnoreCase("pass"))){
				strScoreBandTitle = "合格　";
			}else if((strScoreBandTitle.length()>=3 && strScoreBandTitle.substring(0, 3).equals("不合格")) || (strScoreBandTitle.length()>=4 && strScoreBandTitle.substring(0, 4).equalsIgnoreCase("fail"))){
				strScoreBandTitle = "不合格";
			}else{
				strScoreBandTitle = "−−−";
			}
		}else{
			strScoreBandTitle = "−−−";
		}

		return strScoreBandTitle;
	}

	/**
	 * 滞在時間を秒から分にフォーマット変換
	 * @param strScoreBandTitle ScoreBandTitle
	 * @return String ステータス
	 */
	private String convertMinutes(String strSec)
	{
		String strRet = "";
		if(strSec.equals("")){
			return strRet;
		}
		long longSec = new Long(strSec).longValue();

		if(longSec == 0){
			strRet = "0.0";
		}else{
			double doubleHour = (double)longSec / 60;
			DecimalFormat objFormat = new DecimalFormat( DEF_TOTAL_LEARN_TIME_FORMAT );
			try{
				strRet = objFormat.format(doubleHour);
			}catch(Exception e ){
				strRet = "";
			}
		}
		return strRet;
	}

	/**
	 * アセスメントリストをアセスメントIDでフィルタリングし、作成日付順にソートします。<BR>
	 * フィルタリング・ソート済みアセスメントデータオブジェクトのリストを返却します。
	 * @param vecList フィルタリング前アセスメントデータオブジェクトのリスト
	 * @return Vector フィルタリング後アセスメントデータオブジェクトのリスト
	 */
	private Vector Assessmentfilter(Vector vecList)
		throws LOException
	{
		Vector vecRet = new Vector();
		// 登録済みアセスメントリストを取得する
		PerceptionLoDataAccess objDataAccess = new PerceptionLoDataAccess();
		Vector vecListInserted = objDataAccess.getAssessmentInserted();		// 登録済みデータ
		for( int i = 0; i < vecList.size(); i++ ) {
			PerceptionResponseAssessmentData objList = (PerceptionResponseAssessmentData)vecList.get(i);
				// 未登録の場合、リストに加える
				if(!vecListInserted.contains(objList.getAssessmentID())){
					vecRet.add(objList);
				}
		}
		return vecRet;
	}

	/**
	 * 「結果一覧」リストをアセスメントIDでフィルタリングし、開始日付順にソートします。<BR>
	 * フィルタリング・ソート済み「結果一覧」データオブジェクトのリストを返却します。
	 * @param vecList フィルタリング「結果一覧」データオブジェクトのリスト
	 * @return Vector フィルタリング「結果一覧」データオブジェクトのリスト
	 */
	private Vector Resultfilter(Vector vecList, String strAssessmentID)
		throws LOException
	{
		Vector vecRet = new Vector();
		for( int i = 0; i < vecList.size(); i++ ) {
			PerceptionResponseResultData objList = (PerceptionResponseResultData)vecList.get(i);
				// 対象アセスメントの「結果一覧」情報の場合、リストに加える
				if(strAssessmentID.equals(objList.getAssessmentID())){
					vecRet.add(objList);
				}
		}
		return vecRet;
	}
	/**
	 * アセスメントリストをアセスメントIDでフィルタリングし、作成日付順にソートします。<BR>
	 * フィルタリング・ソート済みアセスメントデータオブジェクトのリストを返却します。
	 * @param vecList フィルタリング・ソート前アセスメントデータオブジェクトのリスト
	 * @return Vector フィルタリング・ソート後アセスメントデータオブジェクトのリスト
	 */
	private Vector AssessmentSort(Vector vecList)
		throws LOException
	{
		Vector vecRet = new Vector();	// フィルタリング・ソート済みデータ格納用
		try{
			// 配列の長さを保持します。
			int intLen = vecList.size();
			// ソート用の配列の作成
			PerceptionResponseAssessmentData[] objSortList = new PerceptionResponseAssessmentData[intLen];
			vecList.copyInto(objSortList);
			// 一時保存用のオブジェクト
			PerceptionResponseAssessmentData objTemp = null;

			// 日付変換オブジェクトのインスタンス化
			SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd");

			// 日付順にバブルソートを行います。
			for (int i = intLen; --i>=0; ) {
				boolean swapped = false;
				for (int j = 0; j<i; j++) {
					// 比較する日付を取り出す
					String strCreateDate1 = objSortList[j].getCreatedDate();
					Date dtSortDate1 = formatter.parse(strCreateDate1);
					String strCreateDate2 = objSortList[j+1].getCreatedDate();
					Date dtSortDate2 = formatter.parse(strCreateDate2);

					if (dtSortDate1.after(dtSortDate2)) {
						objTemp = objSortList[j];
						objSortList[j] = objSortList[j+1];
						objSortList[j+1] = objTemp;
						swapped = true;
					}
				}

				if (!swapped) {
					break;
				}
			}

			// ソート済み配列をVectorに格納して返します.
				for( int i = 0; i < intLen; i++ ) {
					vecRet.add(objSortList[i]);
				}
		}
		catch( ParseException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			throw new LOException(e.getMessage());
		}

		return vecRet;
	}

	/**
	 * 「結果一覧」リストをアセスメントIDでフィルタリングし、開始日付順にソートします。<BR>
	 * フィルタリング・ソート済み「結果一覧」データオブジェクトのリストを返却します。
	 * @param vecList フィルタリング・ソート前「結果一覧」データオブジェクトのリスト
	 * @return Vector フィルタリング・ソート後「結果一覧」データオブジェクトのリスト
	 */
	private Vector ResultSort(Vector vecList)
		throws LOException
	{
		Vector vecRet = new Vector();	// フィルタリング・ソート済みデータ格納用

		try{
			// 配列の長さを保持します。
			int intLen = vecList.size();
			// ソート用の配列の作成
			PerceptionResponseResultData[] objSortList = new PerceptionResponseResultData[intLen];
			vecList.copyInto(objSortList);
			// 一時保存用のオブジェクト
			PerceptionResponseResultData objTemp = null;

			// 日付変換オブジェクトのインスタンス化
			SimpleDateFormat formatter = new SimpleDateFormat ("yyyy/MM/dd HH:mm:ss");


			// 日付順にバブルソートを行います。
			for (int i = intLen; --i>=0; ) {
				boolean swapped = false;
				for (int j = 0; j<i; j++) {
					// 比較する日付を取り出す
					String strCreateDate1 = objSortList[j].getWhenStarted();
					Date dtSortDate1 = formatter.parse(strCreateDate1);
					String strCreateDate2 = objSortList[j+1].getWhenStarted();
					Date dtSortDate2 = formatter.parse(strCreateDate2);

					if (dtSortDate1.before(dtSortDate2)) {
						objTemp = objSortList[j];
						objSortList[j] = objSortList[j+1];
						objSortList[j+1] = objTemp;
						swapped = true;
					}
				}

				if (!swapped) {
					break;
				}
			}

			// ソート済み配列をVectorに格納して返します.
			for( int i = 0; i < intLen; i++ ) {
				vecRet.add(objSortList[i]);
			}
		}
		catch( ParseException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			throw new LOException(e.getMessage());
		}

		return vecRet;
	}

}