/*
このファイルの中身は、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) ______________________________________.
*/

package jp.co.ntt.lms.xms.logsumup;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import java.util.ArrayList;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;

/**
 * @author user
 *
 * To change this generated comment edit the template variable "typecomment":
 * Window>Preferences>Java>Templates.
 * To enable and disable the creation of type comments go to
 * Window>Preferences>Java>Code Generation.
 */
public class LoLogCommon_inc extends LoLogConstant{


	///////////////////////////////////////////////////
	// 共通関数の定義
	///////////////////////////////////////////////////

	/**
	 * IDを元にグループかユーザーかのチェックを行います。
	 *
	 * @param id ID
	 * @return true:グループ false:ユーザー
	 */
	public boolean isGroup(String id){

		boolean ret = false;

		if((id!=null) && (id.substring(0,2).equals("GR"))){
			ret = true;
		}else{
			ret = false;
		}

		return ret;
	}

	/**
	 * IDを元にグループかユーザーかのチェックを行います。
	 *
	 * @param strLoType_o ＬＯタイプ
	 * @return true:コンテナ false:教材
	 */
	public boolean isContainer(String loType){

		boolean ret = false;

		if((loType!=null) && (loType.equals("0"))){
			ret = true;
		}else{
			ret = false;
		}

		return ret;
	}

	/**
	 * 合格状況フィルタ処理。
	 *
	 * @param passType 合格状況表示種別
	 * @param passCondition 合格状況
	 * @return true:表示対象 false:表示対象外
	 */
	public boolean checkPass(int passType, String passCondition){

		// 検索条件対象外はすべてOK
		if(passType == DEF_PASS_OTHER_o){
			return true;
		}

		// 合格のみOK
		if(passType == DEF_PASS_PASS_o){
			if(passCondition!=null && passCondition.equals(DEF_PASS_PASS_RES_o)){
				return true;
			}else{
				return false;
			}
		}

		// 不合格のみOK
		if(passType == DEF_PASS_FAIL_o){
			if(passCondition!=null && passCondition.equals(DEF_PASS_FAIL_RES_o)){
				return true;
			}else{
				return false;
			}
		}

		return false;
	}

	/**
	 * 数値変換処理。
	 *
	 * @param learnTime 数字文字列
	 * @return 数値(引数がnullの場合0を返す。)
	 */
	public long parseLong(String num){
		if( num == null ) {
			return 0;
		}
		String strTemp = "";
		DecimalFormat objFormat = new DecimalFormat( "#" );
		try{
			strTemp = objFormat.format(Double.parseDouble( num ) );
		}catch(Exception e ){
			strTemp = num;
		}
		long ltmp;

		try{
			ltmp = Long.parseLong(strTemp);
		}catch(Exception e){
			ltmp = 0;
		}

		return ltmp;
	}

	/**
	 * 数値変換処理。
	 *
	 * @param num 数字文字列
	 * @return 数値(引数がnullの場合0を返す。)
	 */
	public double parseDouble(String num){
		if( num == null ) {
			return 0d;
		}
		double ltmp = 0d;

		try{
			ltmp = Double.parseDouble(num);
		}catch(Exception e){
			ltmp = 0d;
		}

		return ltmp;
	}

	/**
	 * 割り算を行います。
	 * 0で割ろうとした場合は"---"文字を返します。
	 * @param double 分子
	 * @param int 分母
	 * @param intDecimal 小数点数
	 * @param strAdd 戻りに付与する文字列
	 * @return String 結果
	 */
	public String divideToString( double dblNum, double intNum, int intDecimal,  String strAdd ) {
		if( intNum == 0 ) {
			return STR_EMPTY_FIELD;
		}
		try {
			String strDecimal = "##0";
			StringBuffer sbDecimal = new StringBuffer();
			for( int i = 0; i < intDecimal; i++ ) {
				sbDecimal.append( "0" );
			}
			if( sbDecimal.length() > 0 ) {
				strDecimal += "." + new String( sbDecimal );
			}

			DecimalFormat objFormat = new DecimalFormat( strDecimal );
			return objFormat.format( (dblNum / intNum) ) + strAdd;

		}
		catch( ArithmeticException ae ) {
			return STR_EMPTY_FIELD;
		}
	}

	/**
	 * 割り算を行います。
	 * 0で割ろうとした場合は0dを返します。
	 * @param String 分子
	 * @param String 分母
	 * @return double 結果
	 */
	public double divideToDouble( String strNumerator, String strDenominator) {
		
		double dblNumerator = parseDouble(strNumerator);
		double dblDenominator = parseDouble(strDenominator);
		
		if( dblDenominator == 0d ) {
			return dblDenominator;
		}
		try {

			return dblNumerator / dblDenominator;

		}
		catch( ArithmeticException ae ) {
			return 0d;
		}
	}


	/**
	 * 空フィールド("---")を空文字に変換します
	 * @param str 変換文字列
	 * @return String 変換後文字列("---"以外の文字列は何もしません。)
	 */
	public String changeEmptyStr( String str ) {
		if( str == null ) {
			return null;
		}

		if( str.equals( STR_EMPTY_FIELD ) || str.equals( STR_BLANK_o ) ) {
			return "";
		}
		return str;
	}

	/**
	 * 時間計算処理。
	 *
	 * @param learnTime 時間（ミリ秒）文字列
	 * @return 時間（ｈ）
	 */
	public long timeToHour(String learnTime){

		double dtmp;

		try{
			dtmp = Double.parseDouble(learnTime);
		}catch(Exception e){
			dtmp = 0;
		}

		long ltmp = (long)(dtmp / 1000 / 60 / 60);

		return ltmp;
	}

	/**
	 * コンテナに存在する教材数を取得する。
	 *
	 * @param cid コンテナID
	 * @return 教材数
	 */
	public int getLOCount(String cid) throws Exception{

		// 配下のLOを検索
		LoRelationClient objLr = new LoRelationClient();
		objLr.setWhereParentID(cid);
		if(!objLr.select()) {
			// 検索がうまくいかなかった場合
			if(objLr.isErr()){
				// エラーの場合
				throw new Exception();
			}else{
				throw new Exception(objLr.getMessage());
			}
		}
		int ret = 0;
		while(objLr.next() == true){
			ret++;
		}

		return ret;
	}

	/**
	 * 数値を桁数で四捨五入した値を返す。
	 *
	 * @param dblNumber		数値
	 * @param intLength		桁数(0 or 1)
	 * @return パーセンテージ
	 */
	public String round(double dblNumber, int intLength)
		throws ArithmeticException
	{
		double dblLength = (double)(10 ^ intLength);
		double dblReturn = (double)(Math.round( dblNumber * dblLength ) / dblLength);

		DecimalFormat objFormat = new DecimalFormat( "0.#" );
		return objFormat.format( dblReturn );
	}

	/**
	 * 引数がnullなら「---」に変換して返す。
	 *
	 * @param strValue
	 * @return
	 */
	public String null2hyphen( String strValue ) {
		if( strValue == null || strValue.equals( "" ) ) {
			return STR_EMPTY_FIELD;
		}
		else {
			return strValue;
		}
	}
	/**
	 * 引数がnullなら「0」に変換して返す。
	 *
	 * @param strValue
	 * @return
	 */
	public String null2zero( String strValue ) {
		if( strValue == null || strValue.equals( "" ) ) {
			return "0";
		}
		else {
			return strValue;
		}
	}

	/**
	 * 分子を分母で割りパーセンテージで返す。
	 *
	 * @param strNumerator		分子
	 * @param strDenominator	分母
	 * @return パーセンテージ  nn
	 */
	public String getPercent(String strNumerator, String strDenominator )
		throws Exception
	{
		DecimalFormat objFormat = new DecimalFormat( "##0" );
		objFormat.setMultiplier( 100 );
		objFormat.setPositivePrefix( "" );
		objFormat.setPositiveSuffix( "" );

		return objFormat.format( Double.parseDouble( strNumerator ) / Double.parseDouble( strDenominator ) );
	}

	/**
	 * 分子を分母で割りパーセンテージで返す。
	 *
	 * @param strNumerator		分子
	 * @param strDenominator	分母
	 * @return パーセンテージ  nn.n
	 */
	public String getPercent1(String strNumerator, String strDenominator )
		throws Exception
	{
		DecimalFormat objFormat = new DecimalFormat("##0.0");
		objFormat.setMultiplier(100);
		objFormat.setPositivePrefix("");
		objFormat.setPositiveSuffix("");

		return objFormat.format( Double.parseDouble( strNumerator ) / Double.parseDouble( strDenominator ) );
	}

	/**
	 * ミリ秒から分単位に変換します。<br>
	 * 四捨五入した値を指定した小数点桁数で返す。
	 *
	 * @param longMilli ミリ秒
	 * @param intLength 桁数(0 or 1)
	 * @return minute 分
	 */
	public String milliToMinute(long longMilli, int intLength) {

		double doubleMilli = 0.0;

		// ミリ秒をデート型に変換
		Date dateMilli = new Date(longMilli);
		// カレンダークラスのインスタンスを生成
		Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

        // Calendarの時刻を、指定されたDate にします
        cal.setTime(dateMilli);

		// 日を取得
        int day = cal.get(Calendar.DATE);			// 1..31
		// 時を取得
        int hour = cal.get(Calendar.HOUR_OF_DAY);	// 0..23
		// 分を取得
        int min = cal.get(Calendar.MINUTE);		// 0..59
        // 秒を取得
        int sec = cal.get(Calendar.SECOND); 		// 0..59
        // ミリ秒を取得
        int ms = cal.get(Calendar.MILLISECOND);	// 0..999

		// 分単位に変換します。
		doubleMilli += ms / 60000.0;
		doubleMilli += sec / 60.0;
		doubleMilli += min;
		doubleMilli += hour * 60;
		doubleMilli += (day - 1) * 24 * 60;

		// 分単位に変換したものを四捨五入し、
		// 指定した桁数のString型で返却します。
		return round(intLength, doubleMilli);
	}

	/**
	 * 四捨五入した値を指定した小数点桁数で返す。
	 *
	 * @param dblNumber		数値
	 * @param intLength		小数点桁数
	 * @return 四捨五入された値
	 */
	public String round(int intLength, double dblNumber)
		throws ArithmeticException
	{
		
		String strDecimal = "0";
		StringBuffer sbDecimal = new StringBuffer();
		for( int i = 0; i < intLength; i++ ) {
			sbDecimal.append( "0" );
		}
		if( sbDecimal.length() > 0 ) {
			strDecimal += "." + new String( sbDecimal );
		}

		DecimalFormat objFormat = new DecimalFormat( strDecimal );

		return objFormat.format( dblNumber );
	}



	/**
	 * 指定された２つの日付期間を計算する。
	 *
	 * @param dateFrom 日付(yyyy/mm/dd形式の文字列)
	 * @param dateTo   日付(yyyy/mm/dd形式の文字列)
	 * @param target   増減する対象(年=YEAR、月=MONTH、日=DAY)
	 * @return 指定された単位での期間
	 */
	public int dateDiff(String dateFrom, String dateTo, int target){
		int iYear;
		int iMonth;
		int iDay;

		// Fromカレンダーの生成
		// 年を取得
		iYear = Integer.parseInt(dateFrom.substring(0,4));
		// 月また週または日の場合、月-1を取得
		if((target==Calendar.MONTH) || (target==Calendar.DATE)) {
			iMonth = Integer.parseInt(dateFrom.substring(5,7)) - 1;
		// 年の場合、月は ｢1｣
		} else {
			iMonth = 1;
		}
		// 週または日の場合
		if(target == Calendar.DATE) {
			// 日を取得
			iDay = Integer.parseInt(dateFrom.substring(8));
		// 年または月の場合、日は ｢1｣
		} else {
			iDay = 1;
		}
		Calendar calFrom = Calendar.getInstance();
		// カレンダークラスにセット
		calFrom.set(iYear, iMonth, iDay);

		// Toカレンダーの生成
		// 年を取得
		iYear = Integer.parseInt(dateTo.substring(0,4));
		// 月また週または日の場合、月-1を取得
		if((target==Calendar.MONTH) || (target==Calendar.DATE)) {
			iMonth = Integer.parseInt(dateTo.substring(5,7)) - 1;
		// 年の場合、月は ｢1｣
		} else {
			iMonth = 1;
		}
		// 週または日の場合
		if(target == Calendar.DATE) {
			// 日を取得
			iDay = Integer.parseInt(dateTo.substring(8));
		// 年または月の場合、日は ｢1｣
		} else {
			iDay = 1;
		}
		Calendar calTo = Calendar.getInstance();
		// カレンダークラスにセット
		calTo.set(iYear, iMonth, iDay);

		int ret = 0;
		while(calFrom.equals(calTo) == false){
			// targetの単位に+1する。
			calFrom.add(target, 1);
			ret++;
		}

		return ret;
	}
	/**
	 * 指定された値で日付を増減する。
	 *
	 * @param date   日付(yyyy/mm/dd形式の文字列)
	 * @param target 増減する対象(年=YEAR、月=MONTH、日=DAY)
	 * @param amount 増減値
	 * @return 指定された値で増減した日付(yyyymmdd形式の文字列)
	 */
	public String addDate(String date, int target, int amount) {

		int iYear = Integer.parseInt(date.substring(0,4));
		int iMonth = Integer.parseInt(date.substring(5,7)) - 1;
		int iDay = Integer.parseInt(date.substring(8));

		Calendar cal = Calendar.getInstance();
		cal.set(iYear, iMonth, iDay);
		cal.add(target, amount);

		iYear  = cal.get(Calendar.YEAR);
		iMonth = cal.get(Calendar.MONTH) + 1;
		iDay   = cal.get(Calendar.DATE);

		// フォーマット
		String ret;
		NumberFormat nf = DecimalFormat.getNumberInstance();
		((DecimalFormat) nf).applyPattern("0000");
		ret = (nf.format(iYear)).toString();

		((DecimalFormat) nf).applyPattern("00");
		ret = ret + "/" + (nf.format(iMonth)).toString();
		ret = ret + "/" + (nf.format(iDay)).toString();

		return ret;
	}
	/**
	 * 指定された期間で切り捨てる。
	 *
	 * @param date 日付(yyyy/mm/dd形式の文字列)
	 * @param target   対象(年=YEAR、月=MONTH、日=DAY)
	 * @return 指定された単位で切り捨てられた文字列
	 */
	public String cutDate(String date, int target){

		String ret;

		if(target == Calendar.YEAR){
			// 年の場合
			ret = date.substring(0,4);
		}else if(target == Calendar.MONTH){
			// 月の場合
			ret = date.substring(0,7);
		}else{
			// 日の場合
			ret = date;
		}

		return ret;
	}

	/**
	 * 指定された文字列のエンコードを行います。
	 *
	 * @param str エンコード対象文字列
	 * @return エンコード後の文字列
	 */
	public String charEncode( String str ) throws Exception {
	
		if ( str == null ) {
			return str;
		}
		String rslt = new String( str.getBytes( "ISO-8859-1" ), "Windows-31J" );	
		return rslt;
	}
	
	/**
	 * 分子/分母&lt;BR&gt;割った数値%の形で返却します
	 * 分子がnullまたは空文字列の場合は
	 * 0/分母数 (0%)を返却、分母がnullまたは空文字列の場合は0/0&lt;BR&gt;(0%)"を返却
	 * 
	 * @param  strNumerator 分子
	 * @param  strDenominator 分母
	 * 
	 */
	public String toHtmlFraction(String strNumerator, String strDenominator)throws Exception{
		String val = null;

		if(strDenominator == null || strDenominator.equals("") ||strDenominator.equals("0")){
			//---を返却
			return STR_EMPTY_FIELD;
		}else if(strDenominator.equals("0")){
			//---を返却
			val = "0/0 <BR>(0" + STR_PERCENT_o + ")";

		}else if(strNumerator == null || strNumerator.equals("")){
			//分子がnullまたは空文字列の場合
			val = "0/" + strDenominator + "<BR>" + "(0" + STR_PERCENT_o + ")";
		}else{
			String percent = getPercent(strNumerator,strDenominator );
	
			val = strNumerator + "/" + strDenominator + "<BR>" + "(" + percent + STR_PERCENT_o + ")";
		}

		return val;
	}

	/**
	 * 分子/分母割った数値%の形で返却します
	 * 分子がnullまたは空文字列の場合は
	 * 0/分母数 (0%)を返却、分母がnullまたは空文字列の場合は0/0(0%)"を返却
	 * 
	 * @param  strNumerator 分子
	 * @param  strDenominator 分母
	 * 
	 */
	public String toCSVFraction(String strNumerator, String strDenominator)throws Exception{
		String val = null;

		if(strDenominator == null || strDenominator.equals("") ||strDenominator.equals("0")){
			//---を返却
			return "";
		}else if(strDenominator.equals("0")){
			//---を返却
			val = "0/0(0" + STR_PERCENT_o + ")";

		}else if(strNumerator == null || strNumerator.equals("")){
			//分子がnullまたは空文字列の場合
			val = "0/" + strDenominator + "(0" + STR_PERCENT_o + ")";
		}else{
			String percent = getPercent(strNumerator,strDenominator );
	
			val = strNumerator + "/" + strDenominator  + "(" + percent + STR_PERCENT_o + ")";
		}

		return val;
	}

	/**
	 * 合格判定処理.
	 * 
	 * 合格 "1" の場合は合格を返却<br>
	 * それ以外は　---を返却
	 * 
	 * @param val 合否判定数字
	 * @return 合否をあらわす文列上記参照
	 * 
	 */
	public String getPassStr(String val){
		String str = null;
		if(val == null ||val.equals("")){
			str =STR_EMPTY_FIELD;
		}

		if(val.equals(String.valueOf(LoLogConstant.DEF_COMPLETE_PASS_o))){
			
			//合格
			str = LoLogConstant.STR_PASS_o;
		}
		
		if(val.equals(String.valueOf(LoLogConstant.DEF_COMPLETE_FAIL_o))){
			//未合格
			str = STR_EMPTY_FIELD;
		}
		return str;
	}

	/**
	 * 完了判定処理.
	 * 
	 * 完了 "1" の場合は完了を返却<br>
	 * それ以外は---
	 * 
	 * @param val 合否判定数字
	 * @return 合否をあらわす文列上記参照
	 * 
	 */
	public String getCompleteStr(String val){
		String str = null;
		if(val == null ||val.equals("")){
			str =STR_EMPTY_FIELD;
		}
		if(val.equals(String.valueOf(LoLogConstant.DEF_COMPLETE_PASS_o))){
			
			//完了
			str = LoLogConstant.STR_COMPLETE_o;
		}
		if(val.equals(String.valueOf(LoLogConstant.DEF_COMPLETE_FAIL_o))){
			//未完了
			str = STR_EMPTY_FIELD;
		}
		return str;
	}

	/**
	 * valがnullまたは空文字列なら０を返却する
	 * @param 変換する文字列
	 * @return valがnullまたは空文字列なら０を返却
	 */
	public String conversionZeo(String val){
		if(val == null || val.equals("")){
			return "0";
		}else{
			return val;
		}	
	}


	/**
	 * ＳＱＬ発行回数取得メソッド<BR>
	 * ＳＱＬ発行回数を取得します。<BR>
	 * lstが1000以上の場合、複数回のＳＱＬを発行となるので
	 * その為のＳＱＬ発行回数を取得します。
	 * 
	 * @param  lst 条件となるデータが格納されたリスト
	 * @return sqlCount  SQL発行回数
	 */
	public int getSqlCount(List lst) {

		int sqlCount = 0;

		// 1000以上のグループが配下にある場合、
		// 1000グループ毎に複数回のSQLを発行し、
		if (lst.size() / 1000 == 0) {
			sqlCount = lst.size() / 1000;
		}
		if (lst.size() % 1000 != 0) {
			sqlCount++;
		}
		return sqlCount;
	}

	/**
	 * グループパス取得メソッド<BR>
	 * 指定したグループIDまでのパスを取得します(但しrootを除く)。<BR>
	 * パスはグループ名称でのパス表示となります。
	 * 例./グループ名称/指定したグループ名称
	 * 
	 * @param  strId 条件となるグループID
	 * @return グループパス(グループ名)
	 * @exception XmsException
	 */
	public String getGroupNamePath(String strId) throws XmsException {

		String strGroupNamePath = null;

		try {

			GroupAndPeopleClient GapClient = new GroupAndPeopleClient();
		
			// 選択されたグループまでのパスを検索します。
			if (!GapClient.searchPath(strId)) {
				// パス検索がうまくいかなかった場合
				if (GapClient.isErr()) {
					//エラーの場合
					throw new XmsSystemException(GapClient.getMessage());
				} else {					//警告の場合
					throw new XmsWarningException(GapClient.getMessage());
				}
			}
			// パスの取得がうまくいった場合
			if (GapClient.next()) {
				// パス検索の結果を取得
				String[] aryPath = GapClient.getPath();
				// グループIDをキーとしたグループ名をHashMapに設定します
				Map hmPath = getHmGroupNamePath(aryPath);
				// グループ名表示のパスを生成します。
				for (int j = 1; j < aryPath.length; j++) {
		
					if (strGroupNamePath == null) {
						strGroupNamePath = (String) hmPath.get(aryPath[j]);
					} else {
						strGroupNamePath += "/"
							+ (String) hmPath.get(aryPath[j]);
					}
				}
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		return strGroupNamePath;
	}

	/**
	 * グループパス取得メソッド<BR>
	 * 指定したグループIDよりrootからのパスを取得します。<BR>
	 * パスはグループ名称でのパス表示となります。
	 * 例.root/グループ名称1/グループ名称2
	 * 
	 * @param  strId 条件となるグループID
	 * @return グループパス(グループ名)
	 * @exception XmsException
	 */
	public String getGroupNamePathFromRoot(String strId) throws XmsException {

		String strGroupNamePath = null;

		try {

			GroupAndPeopleClient GapClient = new GroupAndPeopleClient();
		
			// 選択されたグループまでのパスを検索します。
			if (!GapClient.searchPath(strId)) {
				// パス検索がうまくいかなかった場合
				if (GapClient.isErr()) {
					//エラーの場合
					throw new XmsSystemException(GapClient.getMessage());
				} else {					//警告の場合
					throw new XmsWarningException(GapClient.getMessage());
				}
			}
			// パスの取得がうまくいった場合
			if (GapClient.next()) {
				// パス検索の結果を取得
				String[] aryPath = GapClient.getPath();
				// グループIDをキーとしたグループ名をHashMapに設定します
				Map hmPath = getHmGroupNamePath(aryPath);
				// グループ名表示のパスを生成します。
				for (int j = 0; j < aryPath.length; j++) {
		
					if (strGroupNamePath == null) {
						strGroupNamePath = (String) hmPath.get(aryPath[j]);
					} else {
						strGroupNamePath += "/"
							+ (String) hmPath.get(aryPath[j]);
					}
				}
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		return strGroupNamePath;
	}

	/**
	 * グループ名称取得メソッド。<BR>
	 * グループIDをキー、グループ名を値とした<BR>
	 * ハッシュを取得します。
	 * 
	 * @param  aryGroupId グループIDでのパスが格納されている
	 * @return グループIDをキー、グループ名を値としたハッシュ
	 * @exception XmsException
	 */
	public Map getHmGroupNamePath(String[] aryGroupId) 
		throws XmsException {

		// 返却値となるグループ名
		Map hmGroupName = new HashMap();

		try {
			GroupsClient client = new GroupsClient();

			for (int i = 0; i < aryGroupId.length; i++) {

				client.setWhereGroupID(aryGroupId[i]);
				if (!client.select()) {
					//検索がうまくいかなかった
					if (client.isErr()) {
						//エラーの場合
						throw new XmsSystemException(client.getMessage());
					} else {
						//警告の場合
						throw new XmsWarningException(client.getMessage());
					}
				}
				//グループデータの取得
				if (client.next()) {
					// グループIDをキーにグループ名を設定する。
					hmGroupName.put(aryGroupId[i],client.getGroupName());
				}
				client.clear();
			}
			client = null;

		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		return hmGroupName;
	}

	/**
	 * グループ情報取得メソッド。<BR>
	 * 指定されたグループIDより外部IDおよびグループ名を取得します。<BR>
	 * 
	 * @param  groupId      グループID
	 * @return strGroups    グループ名とグループ外部ID
	 * @exception XmsException
	 */
	public String[] getGroupDetails(String groupId) 
		throws XmsException {

		// 返却値となるグループ名
		String[] strGroups = new String[2];

		try {
			GroupsClient client = new GroupsClient();
			//検索条件を設定
			client.setWhereGroupID(groupId);

			if (client.select() == false) {
				//検索がうまくいかなかった
				if (client.isErr()) {
					//エラーの場合
					throw new XmsSystemException(client.getMessage());
				} else {
					//警告の場合
					throw new XmsWarningException(client.getMessage());
				}
			}

			//グループデータの取得
			if (client.next()) {
				// グループ名を取得
				strGroups[0] = client.getGroupName();
				// グループ外部IDを取得
				strGroups[1] = client.getForeignID();
			}
			client = null;

		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		return strGroups;
	}

	/**
	 * 数値をカンマ区切りした値を返す。
	 *
	 * @param dblNumber		数値
	 * @param intLength		桁数(0 or 1)
	 * @return カンマ区切り
	 */
	public String commaPause(double dblNumber, int intLength)
		throws ArithmeticException
	{
		double dblLength = (double)(10 ^ intLength);
		double dblReturn = (double)(Math.round( dblNumber * dblLength ) / dblLength);

		DecimalFormat objFormat = new DecimalFormat( "#,##0.0" );
		return objFormat.format( dblReturn );
	}

	/**
	 * 数値をカンマ区切りした値を返す。
	 *
	 * @param dblNumber		数値文字列
	 * @return カンマ区切り
	 */
	public String commaPause(String strNumber)
		throws ArithmeticException
	{
		double dblNumber = Double.parseDouble(strNumber);
		DecimalFormat objFormat = new DecimalFormat( "#,##0.0" );
		return objFormat.format( dblNumber );
	}


	/***
	 * グループリストを1000で区切ってIN句にしリストにしてかえします.
	 *  LIST0番目IN('GR0001','GR0002''GR0003''GR0004''GR0005''GR0006'.................1000)<br>
	 *  LIST１番目IN('GR0007','GR0008''GR0009''GR0001''GR0001''GR0001'.....)<br>
	 *
	 * @param groupIdList IN句になるグループIDリスト
	 * @return List 各要素の中は1000グループずつでかこったIN句
	 * @exceptionXmsException
	 */
	public List getGroupInSql(List groupIdList)throws Exception {
		int sqlCount = getSqlCount(groupIdList);

		List list = new ArrayList();
		for (int j = 0; j < sqlCount; j++) {
			StringBuffer sql = new StringBuffer();
			sql.append("IN (");
			for (int i = (j * 1000);
				(i < ((i + 1) * 1000)) && i < groupIdList.size();
				i++) {
				if (i != 0) {
					sql.append(",");
				}
				sql.append("'");
				sql.append(StringEscapeUtils.escapeSql((String)groupIdList.get(i)));
				sql.append("'");
			}
			sql.append(")");
			list.add(sql.toString());
		}
		return list;

	}

}
