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

//
//	Groups 管理XMO クライアントクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo.Groups;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.XMOBasicClient;
import jp.co.ntt.lms.xmo.util.SqlEscape;
import jp.co.ntt.lms.xmo.Environment;

/**
 * Groups 管理XMO クライアントクラスです。<BR>
 * このクラスはGroups XMO サーバクラスとの接続および、
 * 登録、更新、削除、検索処理に必要なパラメータの設定、検索後の
 * 検索結果の取得メソッドを提供します。<BR>
 * <p>
 * <table border="1">
 * 	<tr>
 *   <td rowspan="7">登録</td>
 *   <td>GroupsClientインスタンスを生成する</td>
 *   <td>GroupsClient client = new GroupsClient()</td>
 *  </tr>
 * 	<tr>
 *   <td rowspan="4">登録するデータの各項目の値を設定する</td>
 *   <td>client.setGroupName(String)</td>
 *  </tr>
 * 	<tr>
 *   <td>client.setParentID(String)</td>
 *  </tr>
 * 	<tr>
 *   <td>client.setForeignID(String)</td>
 *  </tr>
 * 	<tr>
 *   <td>client.setCustomMsgDir(String)</td>
 *  </tr>
 * 	<tr>
 *   <td>データ挿入（登録）を実行する</td>
 *   <td>boolean insertFlag = client.insert()</td>
 *  </tr>
 * 	<tr>
 *   <td>エラーとなった理由を取得する</td>
 *   <td>
 *     if (insertFlag == false ) {<br>
 *     &nbsp;&nbsp;&nbsp;&nbsp;String strMessage = client.getMessage();<br>
 *     }
 *   </td>
 *  </tr>
 * 	<tr>
 *   <td rowspan="5">削除</td>
 *   <td>GroupsClientインスタンスを生成する</td>
 *   <td>GroupsClient client = new GroupsClient()</td>
 *  </tr>
 * 	<tr>
 *   <td rowspan="2">削除対象の条件を設定する</td>
 *   <td>client.setDeleteSelectID(String)</td>
 *  </tr>
 * 	<tr>
 *   <td>client.setDeleteParentID(String)</td>
 *  </tr>
 * 	<tr>
 *   <td>データ削除を実行する</td>
 *   <td>boolean deleteFlag = client.delete()</td>
 *  </tr>
 * 	<tr>
 *   <td>エラーとなった理由を取得する</td>
 *   <td>
 *     if (deleteFlag == false ) {<br>
 *     &nbsp;&nbsp;&nbsp;&nbsp;String strMessage = client.getMessage();<br>
 *     }
 *   </td>
 *  </tr>
 * 
 * </table>
 * </p>
 * @author T.Nijou
 * @version 0.0.0.1 2004/01/08
 */
public class GroupsClient extends XMOBasicClient
	implements GroupsTable
{

	private static final String CLASS_NAME = "jp.co.ntt.lms.xmo.Groups.Groups";

	/**
	 * コンストラクタです。<BR>
	 * 親クラスのコンストラクタを呼び出し、接続先サーバクラス名を
	 * 設定します。
	 */
	public GroupsClient() throws Exception {
		super( CLASS_NAME );
	}

	/**
	 * パラメータにグループIDをセットします
	 */
	public void setGroupID( String strGroupID ) {
		putData( GROUP_ID, strGroupID );
	}

	/**
	 * 検索結果の現在のインデックスのグループIDを取得します
	 */
	public String getGroupID() {
		GroupsData objData = (GroupsData)getResult();
		return objData.getGroupID();
	}

	/**
	 * 追加・更新するグループのグループ名称を設定します。<br>
	 * 引数で渡された文字列は、内部で文字コードを変換してからデータとして格納されます。
	 * 変換は、setEncodeメソッドを呼んだ場合は、指定した文字コードから、
	 * 呼んでいない場合は&quot;8859-1&quot;から&quot;Shift_JIS&quot;への変換になります。
	 * @param strGroupName 追加・更新するグループのグループ名称。
	 * @see XMOBasicClient#setEncode(String)
	 */
	public void setGroupName( String strGroupName ) {
		putData( GROUP_NAME, strGroupName );
	}

	/**
	 * 検索結果から現在のインデックスのグループ名を取得します
	 */
	public String getGroupName() {
		GroupsData objData = (GroupsData)getResult();
		return objData.getGroupName();
	}

	/**
	 * 追加・更新するグループのグループタイプを設定します。<br>
	 * 通常、固定値&quot;1&quot;である指定をします。
	 * 引数で渡された文字列は、内部で文字コードを変換してからデータとして格納されます。
	 * 変換は、setEncodeメソッドを呼んだ場合は、指定した文字コードから、
	 * 呼んでいない場合は&quot;8859-1&quot;から&quot;Shift_JIS&quot;への変換になります。
	 * @param strGroupType 追加・更新するグループのグループタイプ。
	 * @see XMOBasicClient#setEncode(String)
	 */
	public void setGroupType( String strGroupType ) {
		putData( GROUP_TYPE, strGroupType );
	}

	/**
	 * 検索結果から現在のインデックスのグループタイプを取得します
	 */
	public String getGroupType() {
		GroupsData objData = (GroupsData)getResult();
		return objData.getGroupType();
	}

	/**
	 * 追加・更新するグループの削除フラグを設定します。<br>
	 * 通常、有効データに対して処理しますので、削除フラグ無効を表す&quot;0&quot;である指定をします。
	 * 引数で渡された文字列は、内部で文字コードを変換してからデータとして格納されます。
	 * 変換は、setEncodeメソッドを呼んだ場合は、指定した文字コードから、
	 * 呼んでいない場合は&quot;8859-1&quot;から&quot;Shift_JIS&quot;への変換になります。
	 * @param strDeleteFlag 追加・更新するグループの削除フラグ。
	 * @see XMOBasicClient#setEncode(String)
	 */
	public void setDeleteFlag( String strDeleteFlag ) {
		putData( DELETE_FLAG, strDeleteFlag );
	}

	/**
	 * 検索結果から現在のインデックスの削除フラグを取得します
	 */
	public String getDeleteFlag() {
		GroupsData objData = (GroupsData)getResult();
		return objData.getDeleteFlag();
	}

	/**
	 * 追加・更新するグループの外部IDを設定します。<br>
	 * 引数で渡された文字列は、内部で文字コードを変換してからデータとして格納されます。
	 * 変換は、setEncodeメソッドを呼んだ場合は、指定した文字コードから、
	 * 呼んでいない場合は&quot;8859-1&quot;から&quot;Shift_JIS&quot;への変換になります。
	 * @param strForeignID 追加・更新するグループの外部ID。
	 * @see XMOBasicClient#setEncode(String)
	 */
     public void setForeignID( String strForeignID ) {
		putData( FOREIGN_ID, strForeignID );
	}

	/**
	 * 検索結果の現在のインデックスの外部キーを取得します
	 */
	public String getForeignID() {
		GroupsData objData = (GroupsData)getResult();
		return objData.getForeignID();
	}

	/**
	 * 追加・更新するグループのコメントを設定します。<br>
	 * 引数で渡された文字列は、内部で文字コードを変換してからデータとして格納されます。
	 * 変換は、setEncodeメソッドを呼んだ場合は、指定した文字コードから、
	 * 呼んでいない場合は&quot;8859-1&quot;から&quot;Shift_JIS&quot;への変換になります。
	 * @param strCustomMsgDir 追加・更新するグループのコメント。
	 * @see XMOBasicClient#setEncode(String)
	 */
	public void setCustomMsgDir( String strCustomMsgDir ) {
		putData( CUSTOM_MSG_DIR, strCustomMsgDir );
	}

	/**
	 * 検索結果から現在のインデックスのコメントを取得します
	 */
	public String getCustomMsgDir() {
		GroupsData objData = (GroupsData)getResult();
		return objData.getCustomMsgDir();
	}

	/**
	 * パラメータにオブジェクトIDをセットします
	 */
	public void setOid( String strOid ) {
		putData( OID, strOid );
	}

	/**
	 * 検索結果から現在のインデックスのオブジェクトIDを取得します
	 */
	public String getOid() {
		GroupsData objData = (GroupsData)getResult();
		return objData.getOid();
	}

	/**
	 * パラメータにＡＤ識別名をセットします
	 */
	public void setAdDn( String strAdDn ) {
		putData( AD_DN, strAdDn );
	}

	/**
	 * 検索結果から現在のインデックスのＡＤ識別名を取得します
	 */
	public String getAdDn() {
		GroupsData objData = (GroupsData)getResult();
		return objData.getAdDn();
	}

	/**
	 * 追加・更新するグループの親グループIDを設定します。<br>
	 * 引数で渡された文字列は、内部で文字コードを変換してからデータとして格納されます。
	 * 変換は、setEncodeメソッドを呼んだ場合は、指定した文字コードから、
	 * 呼んでいない場合は&quot;8859-1&quot;から&quot;Shift_JIS&quot;への変換になります。
	 * @param strParentID 追加・更新するグループの親グループID。
	 * @see XMOBasicClient#setEncode(String)
	 */
	public void setParentID( String strParentID ) {
		putData( PARENT_ID, strParentID );
	}

	/**
	 * グループデータを取得します
	 */
	public GroupsData getGroupsData() {
		return (GroupsData)getResult();
	}

	/**
	 * グループIDを検索条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strGroupID	グループID
	 */
	public void setWhereGroupID( String strGroupID ) {
		String strCondition = GROUP_ID + SEARCH_EQUALS + "'" + StringEscapeUtils.escapeSql(strGroupID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * グループIDを検索条件に付与します
	 * @param strGroupID	グループID
	 * @param strSearchCondition 検索条件
	 */
	public void setWhereGroupID( String strGroupID, String strSearchCondition ) {
		String strCondition = GROUP_ID + strSearchCondition + "'" + StringEscapeUtils.escapeSql(strGroupID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * グループ名を検索条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strGroupName	グループ名
	 */
	public void setWhereGroupName( String strGroupName ) {
		String strCondition = GROUP_NAME + SEARCH_EQUALS + "'" + SqlEscape.escape(strGroupName) + "' ";

		setCondition( strCondition );
	}

	/**
	 * グループ名を検索条件に付与します
	 * @param strGroupName	グループ名
	 * @param strSearchCondition 検索条件
	 */
	public void setWhereGroupName( String strGroupName, String strSearchCondition ) {
		String strCondition = GROUP_NAME + strSearchCondition + "'" + SqlEscape.escape(strGroupName) + "' ";
		setCondition( strCondition );
	}

	/**
	 * 外部IDを検索条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strForeignID	外部ID
	 */
	public void setWhereForeignID( String strForeignID ) {
		String strCondition = FOREIGN_ID + SEARCH_EQUALS + "'" + SqlEscape.escape(strForeignID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * 外部IDを検索条件に付与します
	 * @param strForeignID	外部ID
	 * @param strSearchCondition 検索条件
	 */
	public void setWhereForeignID( String strForeignID, String strSearchCondition ) {
		String strCondition = FOREIGN_ID + strSearchCondition + "'" + SqlEscape.escape(strForeignID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * オブジェクトIDを検索条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strOid	オブジェクトID
	 */
	public void setWhereOid( String strOid ) {
		
		try {
			Environment objEnv = new Environment();
	
			String strCondition = OID + SEARCH_EQUALS + "'" + SqlEscape.escape(strOid) + "' ";		
			//PostgreSQLの場合
			if (objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				strCondition = "\"" + OID.toUpperCase() + "\"" + SEARCH_EQUALS + "'" + SqlEscape.escape(strOid) + "' ";
			}
			setCondition( strCondition );
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}

	/**
	 * オブジェクトIDを検索条件に付与します
	 * @param strOid	オブジェクトID
	 * @param strSearchCondition 検索条件
	 */
	public void setWhereOid( String strOid, String strSearchCondition ) {
		
		try {
			Environment objEnv = new Environment();
			String strCondition = OID + strSearchCondition + "'" + SqlEscape.escape(strOid) + "' ";
			//PostgreSQLの場合
			if (objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				strCondition = "\"" + OID.toUpperCase() + "\"" + strSearchCondition + "'" + SqlEscape.escape(strOid) + "' ";
			}
			setCondition( strCondition );
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}

	/**
	 * ＡＤ識別名を検索条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strAdDn	ＡＤ識別名
	 */
	public void setWhereAdDn( String strAdDn ) {
		String strCondition = AD_DN + SEARCH_EQUALS + "'" + SqlEscape.escape(strAdDn) + "' ";
		setCondition( strCondition );
	}

	/**
	 * ＡＤ識別名を検索条件に付与します
	 * @param strAdDn	ＡＤ識別名
	 * @param strSearchCondition 検索条件
	 */
	public void setWhereAdDn( String strAdDn, String strSearchCondition ) {
		String strCondition = AD_DN + strSearchCondition + "'" + SqlEscape.escape(strAdDn) + "' ";
		setCondition( strCondition );
	}

	/**
	 * グループタイプを検索条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strGroupType	グループタイプ
	 */
	public void setWhereGroupType( String strGroupType ) {
		String strCondition = GROUP_TYPE + SEARCH_EQUALS + "'" + SqlEscape.escape(strGroupType) + "' ";
		setCondition( strCondition );
	}

	/**
	 * グループタイプを検索条件に付与します
	 * @param strGroupType	グループタイプ
	 * @param strSearchCondition 検索条件
	 */
	public void setWhereGroupType( String strGroupType, String strSearchCondition ) {
		String strCondition = GROUP_TYPE + strSearchCondition + "'" + SqlEscape.escape(strGroupType) + "' ";
		setCondition( strCondition );
	}

	/**
	 * 削除対象グループのグループIDを設定します。<BR>
	 * グループの削除を実行するdeleteメソッドを呼び出すと、
	 * このメソッドで指定したグループID、setDeleteParentIDメソッドで指定した親グループIDを
	 * 条件にしてグループの削除を実施します。
	 * 
	 * @param strID 削除対象グループのグループID。
	 * @see #setDeleteParentID(String)
	 * @see XMOBasicClient#delete()
	 */
	public void setDeleteSelectID( String strID ) {
		putData( DELETE_GROUP_ID, strID );
	}

	/**
	 * 削除対象グループの親グループのグループIDを設定します。<BR>
	 * グループの削除を実行するdeleteメソッドを呼び出すと、
	 * このメソッドで指定した親グループID、setDeleteSelectIDメソッドで指定したグループIDを
	 * 条件にしてグループの削除を実施します。
	 * 
	 * @param strID 削除対象グループのグループID。
	 * @see #setDeleteSelectID(String)
	 * @see XMOBasicClient#delete()
	 */
	public void setDeleteParentID( String strID ) {
		putData( DELETE_PARENTID, strID );
	}

	/**
	 * 検索画面用の検索条件を設定します。
	 * @param strKey	検索キーワード
	 * @param strTopCnt 取得TOP件数
	 * @param strLimitGid 境界グループID
	 */
	public void setWhereSearchCondition( String strKey ) {

		//XMS.iniファイルロードクラスのインスタンス		
		String strKeyCondition = "(";
		try {
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv = new Environment();

			//PostgreSQLの場合
			if (objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				strKeyCondition = strKeyCondition +
				GROUP_NAME + SEARCH_LIKE  + "'%" + SqlEscape.escapeSearch(strKey) + "%' ESCAPE('\\\\') OR " +
				FOREIGN_ID + SEARCH_LIKE  + "'%" + SqlEscape.escapeSearch(strKey) + "%' ESCAPE('\\\\') OR " +
				CUSTOM_MSG_DIR + SEARCH_LIKE + "'%" + SqlEscape.escapeSearch(strKey) + "%' ESCAPE('\\\\') )";
			//SQLServerの場合 or Oracleの場合
			} else if (objEnv.getDBType().equals( objEnv.DB_SQLSERVER ) || objEnv.getDBType().equals( objEnv.DB_ORACLE )){		
				strKeyCondition = strKeyCondition +
				GROUP_NAME + SEARCH_LIKE  + "'%" + SqlEscape.escapeSearch(strKey) + "%' ESCAPE('\\') OR " +
				FOREIGN_ID + SEARCH_LIKE  + "'%" + SqlEscape.escapeSearch(strKey) + "%' ESCAPE('\\') OR " +
				CUSTOM_MSG_DIR + SEARCH_LIKE + "'%" + SqlEscape.escapeSearch(strKey) + "%' ESCAPE('\\') )";
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
		String strGidCondition = " ORDER BY " + GROUP_ID;

		setCondition( strKeyCondition+strGidCondition );

	}

}

