/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JSCWebCommon
*   ソースファイル名：JSCWebCommon.java
*   作成者          ：富士通
*   日付            ：2011年07月28日
*＜機能概要＞
*   サービス制御管理システムの共通処理クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/28   FJ          新規作成
*
**********************************************************************/
package eo.web.webview.common;

import java.util.HashSet;
import java.util.Set;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.util.JSCCommonUtil;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;

/**
 * サービス制御管理システム共通処理
 * @author FJ
 */
public class JSCWebCommon
{
	
	/**
	 * サービスフォームビーンからkeyで指定されたデータを取得します。
	 * @param logic ロジックオブジェクト
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static String getData(JCCWebBusinessLogic logic, String...keies)
	{
		return getData(getParentBean(logic, keies), keies[keies.length - 1]);
	}

	/**
	 * サービスフォームビーンからkeyで指定されたデータを取得します。
	 * @param bean データビーン
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static String getData(X31SDataBeanAccess bean, String...keies)
	{
		return getParentBean(bean, keies).sendMessageString(keies[keies.length - 1], X31CWebConst.DATABEAN_GET_VALUE);
	}
	
	/**
	 * サービスフォームビーンからkeyで指定されたデータを取得します。
	 * @param logic ロジックオブジェクト
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static Long getDataL(JCCWebBusinessLogic logic, String...keies)
	{
		return getDataL(getParentBean(logic, keies), keies[keies.length - 1]);
	}

	/**
	 * サービスフォームビーンからkeyで指定されたデータを取得します。
	 * @param bean データビーン
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static Long getDataL(X31SDataBeanAccess bean, String...keies)
	{
		return getParentBean(bean, keies).sendMessageLong(keies[keies.length - 1], X31CWebConst.DATABEAN_GET_VALUE);
	}
	
	/**
	 * サービスフォームビーンからkeyで指定されたデータを取得します。
	 * @param logic ロジックオブジェクト
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static Boolean getDataB(JCCWebBusinessLogic logic, String...keies)
	{
		return getDataB(getParentBean(logic, keies), keies[keies.length - 1]);
	}

	/**
	 * サービスフォームビーンからkeyで指定されたデータを取得します。
	 * @param bean データビーン
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static Boolean getDataB(X31SDataBeanAccess bean, String...keies)
	{
		return getParentBean(bean, keies).sendMessageBoolean(keies[keies.length - 1], X31CWebConst.DATABEAN_GET_VALUE);
	}

	/**
	 * サービスフォームビーンのkeyで指定された変数にvalueを設定します。
	 * @param logic ロジックオブジェクト
	 * @param value 設定したい値
	 * @param keies キー
	 */
	public static void setData(JCCWebBusinessLogic logic, String value, String...keies)
	{
		setData(getParentBean(logic, keies), value, keies[keies.length - 1]);
	}

	/**
	 * サービスフォームビーンのkeyで指定された変数にvalueを設定します。
	 * @param bean データビーン
	 * @param value 設定したい値
	 * @param keies キー
	 */
	public static void setData(X31SDataBeanAccess bean, String value, String...keies)
	{
		X31SDataBeanAccess subBean = getParentBean(bean, keies);
		subBean.sendMessageString(keies[keies.length - 1], X31CWebConst.DATABEAN_SET_VALUE, value);
	}
	
	/**
	 * サービスフォームビーンのkeyで指定された変数にvalueを設定します。
	 * @param logic ロジックオブジェクト
	 * @param value 設定したい値
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static void setData(JCCWebBusinessLogic logic, Long value, String...keies)
	{
		setData(getParentBean(logic, keies), value, keies[keies.length - 1]);
	}

	/**
	 * サービスフォームビーンのkeyで指定された変数にvalueを設定します。
	 * @param bean データビーン
	 * @param value 設定したい値
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static void setData(X31SDataBeanAccess bean, Long value, String...keies)
	{
		X31SDataBeanAccess subBean = getParentBean(bean, keies);
		subBean.sendMessageLong(keies[keies.length - 1], X31CWebConst.DATABEAN_SET_VALUE, value);
	}
	
	/**
	 * サービスフォームビーンのkeyで指定された変数にvalueを設定します。
	 * @param logic ロジックオブジェクト
	 * @param value 設定したい値
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static void setData(JCCWebBusinessLogic logic, Boolean value, String...keies)
	{
		setData(getParentBean(logic, keies), value, keies[keies.length - 1]);
	}
	
	/**
	 * サービスフォームビーンのkeyで指定された変数にvalueを設定します。
	 * @param bean データビーン
	 * @param value 設定したい値
	 * @param keies キー
	 * @return 設定されているデータ
	 */
	public static void setData(X31SDataBeanAccess bean, Boolean value, String...keies)
	{
		X31SDataBeanAccess subBean = getParentBean(bean, keies);
		subBean.sendMessageBoolean(keies[keies.length - 1], X31CWebConst.DATABEAN_SET_VALUE, value);
	}

	/**
	 * サービスフォームビーンからデータビーンオブジェクトを取得します。
	 * @param logic ロジックオブジェクト
	 * @param keies キー
	 * @return 設定されているデータビーン
	 */
	public static X31SDataBeanAccess getParentBean(JCCWebBusinessLogic logic, String...keies)
	{
		return getParentBean(logic.getServiceFormBean(), keies);
	}

	/**
	 * サービスフォームビーンからサブデータビーンオブジェクトを取得します。
	 * @param bean データビーン
	 * @param keies キー
	 * @return 設定されているデータビーン
	 */
	public static X31SDataBeanAccess getParentBean(X31SDataBeanAccess bean, String...keies)
	{
		if (keies.length == 1)
		{
			return bean;
		}
		X31SDataBeanAccess tempolary = bean;
		int length = keies.length;
		for (int i = 0 ; i < length - 1 ; i++)
		{
			tempolary = tempolary.getDataBeanArray(keies[i]).getDataBean(0);
		}
		return tempolary;
	}
	
	/**
	 * サービスフォームビーンからデータビーンオブジェクトを取得します。
	 * @param logic ロジックオブジェクト
	 * @param keies キー
	 * @return 設定されているデータビーン
	 */
	public static X31SDataBeanAccess getBean(JCCWebBusinessLogic logic, String...keies)
	{
		return getBean(logic.getServiceFormBean(), keies);
	}

	/**
	 * サービスフォームビーンからサブデータビーンオブジェクトを取得します。
	 * @param bean データビーン
	 * @param keies キー
	 * @return 設定されているデータビーン
	 */
	public static X31SDataBeanAccess getBean(X31SDataBeanAccess bean, String...keies)
	{
		return getParentBean(bean, keies).getDataBeanArray(keies[keies.length - 1]).getDataBean(0);
	}
	
	
	/**
	 * プルダウンの名称にインデックスを付加します。
	 * @param bean
	 * @param dataLabel
	 */
	public static void appendPrefix(X31SDataBeanAccess bean, String dataLabel)
	{
		int dataCount = (Integer)bean.sendMessage(dataLabel, X31CWebConst.DATABEAN_GET_COUNT);
		int fillLevel = Integer.toString(dataCount).length();
		for (int i = 0;i < dataCount;i++) 
		{
			String value = bean.sendMessageString(dataLabel, X31CWebConst.DATABEAN_GET_VALUE, i);

			String filledIndex = JPCUtilCommon.fillZero(Integer.toString(i + 1), fillLevel, false);
			bean.sendMessageString(dataLabel, X31CWebConst.DATABEAN_SET_VALUE, i, String.format("%s.%s", filledIndex, value));
		}
	}
	

	/**
	 * プルダウンの選択値を設定します。<br>
	 * このメソッドで対応しているプルダウンのデータビーン形式は以下の通り<br>
	 * &nbsp;pullDownLabel プルダウンの変数名<br>
	 * &nbsp;&nbsp;selectLabel(Long) 選択インデックス。selectタグのvalueにマッピングされる。<br>
	 * &nbsp;&nbsp;codeLabel(String) 選択された値のコード値を保持する。<br>
	 * &nbsp;&nbsp;nameLabel(String) 選択された値の名称を保持する。<br>
	 * &nbsp;&nbsp;codeListLabel(String*) プルダウンで使用するコードの一覧<br>
	 * &nbsp;&nbsp;nameListLabel(String*) プルダウンに表示する名称の一覧<br>
	 * @param logic ロジッククラスインスタンス
	 * @param pullDownLabel プルダウンをまとめてる変数名
	 * @param selectLabel 選択値が格納される変数名
	 * @param codeLabel 選択したコード
	 * @param nameLabel 選択した名称
	 * @param codeListLabel コードの一覧
	 * @param nameListLabel 名称の一覧
	 */
	public static void storePullDown(JCCWebBusinessLogic logic, String pullDownLabel,
										String selectLabel,
										String codeLabel, String nameLabel, 
										String codeListLabel, String nameListLabel)
	{
		Long selectedIndex = getDataL(logic, pullDownLabel, selectLabel);

		X31SDataBeanAccess pulldown = logic.getServiceFormBean().getDataBeanArray(pullDownLabel).getDataBean(0);
		String selectedCode = pulldown.sendMessageString(codeListLabel,
														X31CWebConst.DATABEAN_GET_VALUE,
														selectedIndex.intValue());
		String selectedName = pulldown.sendMessageString(nameListLabel,
														X31CWebConst.DATABEAN_GET_VALUE,
														selectedIndex.intValue());
		
		selectedName = getFollowOf(selectedName, ".");

		setData(logic, selectedCode, pullDownLabel, codeLabel);
		setData(logic, selectedName, pullDownLabel, nameLabel);
	}
	/**
	 * プルダウンを初期化します。<br>
	 * 対応しているプルダウンのデータ形式はstorePullDownを参照すること。
	 * @param logic ロジッククラスインスタンス
	 * @param pullDownLabel プルダウンをまとめてる変数名
	 * @param selectLabel 選択値が格納される変数名
	 * @param codeLabel 選択したコード
	 * @param nameLabel 選択した名称
	 * @param codeListLabel コードの一覧
	 * @param nameListLabel 名称の一覧
	 */
	public static void clearPullDown(JCCWebBusinessLogic logic, String pullDownLabel,
										String selectLabel,
										String codeLabel, String nameLabel, 
										String codeListLabel, String nameListLabel)
	{
		X31SDataBeanAccess pullDown = logic.getServiceFormBean().getDataBeanArray(pullDownLabel).getDataBean(0);
		
		pullDown.sendMessage(codeListLabel, X31CWebConst.DATABEAN_CLEAR);
		pullDown.sendMessage(nameListLabel, X31CWebConst.DATABEAN_CLEAR);
		pullDown.sendMessage(selectLabel, X31CWebConst.DATABEAN_CLEAR);
		pullDown.sendMessage(codeLabel, X31CWebConst.DATABEAN_CLEAR);
		pullDown.sendMessage(nameLabel, X31CWebConst.DATABEAN_CLEAR);
	}
	
	
	/**
	 * strの中からseparateに続く文字列を切り出して返す。<br>
	 * もしstrにseparateが含まれていなかった場合は、strを無加工で返す。<br>
	 * @param str 切り出される文字列
	 * @param separate 切り出しポイント
	 * @return 切り出された文字列
	 */
	public static String getFollowOf(String str, String separate)
	{
		if (JSCCommonUtil.isNull(str))
		{
			return str;
		}
		
		int index = str.indexOf(separate);
		if (index == -1 )
		{
			return str;
		}
		
		return str.substring(index + 1, str.length());
	}
	
	
	/**
	 * 文字列からサブ文字列を切り出します。指定のインデックスが不正だった場合でも例外を発生させません。
	 * @param org 元の文字列
	 * @param start 切り出し開始インデックス
	 * @param end 切り出し終了インデックス
	 * @return 切り出された文字列
	 */
	public static String substr(String org, int start, int end)
	{
		int intStart = start;
		int intEnd   = end;
		
		if (org == null)
		{
			return "";
		}
		
		int length = org.length();
		
		if (length < intEnd)
		{
			intEnd = length;
		}
		
		if (intEnd < intStart)
		{
			return "";
		}
		
		if (intStart < 0)
		{
			intStart = 0;
		}
		
		return org.substring(intStart, intEnd);
	}
	

	/**
	 * 同じ構造のデータビーンタイプにデータをコピーします。
	 * @param src データの移送元
	 * @param dest データの移送先
	 * @param excepts 
	 */
	public static void copyStructure(X31SDataBeanAccess src, X31SDataBeanAccess dest, String...excepts)
	{
		Set<String> exceptSet = new HashSet<String>();
		if (excepts != null)
		{
			for (String except : excepts)
			{
				exceptSet.add(except);
			}
		}
		for (String itemName : src.getItemNameList())
		{
			if (exceptSet.contains(itemName))
			{
				continue;
			}
			setData(dest, getData(src, itemName), itemName);
		}
	}
}
