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

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

import java.rmi.RemoteException;
import java.util.*;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;

/**
 * LoRelation 管理XMO クライアントクラスです。<BR>
 * このクラスはLoRelation XMO サーバクラスとの接続および、
 * 登録、更新、削除、検索処理に必要なパラメータの設定、検索後の
 * 検索結果の取得メソッドを提供します。<BR>
 * @author T.Nijou
 * @version 0.0.0.1 2004/01/08
 */
public class LoRelationClient extends XMOBasicClient
	implements LoRelationTable
{

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

	/**
	 * LoRelationXMO独自のメソッドです。<BR>
	 * 指定されたIDのパスを検索します。
	 */
	private static final String METHOD_GETPATH = "getPath";

	/**
	 * LoRelationXMO独自のメソッドです。<BR>
	 * コピーします。
	 */
	private static final String METHOD_COPY = "copy";

	/**
	 * LORelationXMO独自のメソッドです。<BR>
	 * 移動します。
	 */
	private static final String METHOD_TRANSFER = "transfer";
	/**
	 * LOXMO独自のメソッドです。<BR>
	 * コンテナ配下のLOが前提条件加設定か被設定かフラグを返します。
	 * 加設定かつ被設定 = 1; 加設定 = 2; 被設定 = 3 をint型で返します。
	 */
	private static final String METHOD_CEHCK_PRERE = "checkUnderPrere";

	/**
	 * 配下LOの前提条件チェックフラグを保持します。
	 */
	private int mintPrereFlg;


	/**
	 *  コピー処理で作成されたLOのツリー構造を返します。
	 */
	private XMONode[] mobjCopiedNode;

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

	/**
	 * パラメータにコンポーネントIDをセットします
	 */
	public void setmaterialID( String strData ) {
		putData( MATERIAL_ID, strData );
	}

	/**
	 * コンポーネントIDを取得します
	 */
	public String getmaterialID() {
		LoRelationData objData = (LoRelationData)getResult();
		return objData.getMaterialID();
	}

	/**
	 * パラメータに親IDをセットします
	 */
	public void setParentID( String strData ) {
		putData( PARENT_ID, strData );
	}

	/**
	 * 親IDを取得します
	 */
	public String getParentID() {
		LoRelationData objData = (LoRelationData)getResult();
		return objData.getParentID();
	}

	/**
	 * パラメータに子IDをセットします
	 */
	public void setChildID( String strData ) {
		putData( CHILD_ID, strData );
	}

	/**
	 * 子IDを取得します
	 */
	public String getChildID() {
		LoRelationData objData = (LoRelationData)getResult();
		return objData.getChildID();
	}

	/**
	 * パラメータにソート番号をセットします
	 */
	public void setSortNO( String strSortNO ) {
		putData( SORT_NO, strSortNO );
	}

	/**
	 * パス検索の結果を取得します
	 * @return String[]
	 */
	public String[] getPath() {
		String[] strPath = (String[])getResult();
		return strPath;
	}

	/**
	 * 親IDを検索条件に付与します
	 * @param strParentID	LOID
	 * @param strSearchCondition 検索条件
	 */
	public void setWhereParentID( String strParentID, String strSearchCondition ) {
		String strCondition = PARENT_ID + strSearchCondition + "'" + StringEscapeUtils.escapeSql(strParentID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * 親IDを検索条件に付与します
	 * @param strParentID	LOID
	 */
	public void setWhereParentID( String strParentID ) {
		String strCondition = PARENT_ID + SEARCH_EQUALS + "'" + StringEscapeUtils.escapeSql(strParentID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * コンポーネントIDを検索条件に付与します
	 * @param strMaterialID	MaterialID
	 */
	public void setWhereMaterialID( String strMaterialID ) {
		String strCondition = MATERIAL_ID + SEARCH_EQUALS + "'" + StringEscapeUtils.escapeSql(strMaterialID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * 子IDを検索条件に付与します
	 * @param strChildID	LOID
	 */
	public void setWhereChildID( String strChildID ) {
		String strCondition = CHILD_ID + SEARCH_EQUALS + "'" + StringEscapeUtils.escapeSql(strChildID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * LoRelationXMOの独自のメソッドです。<BR>
	 * 指定されたIDのパスを取得します
	 * @param 検索ID
	 * @return boolean ture: 検索成功 false: 検索失敗
	 */
	public boolean searchPath( String strID )
		throws Exception
	{
		// ID設定
		setParentID( strID );

		// 検索実行
		Vector vecPathList = (Vector)super.execute( METHOD_GETPATH, htParams );

		// メッセージデータを取得します
		MessageData objMessage = (MessageData)vecPathList.get(0);
		mobjMessage = objMessage;
		if( isErr( objMessage ) ) {
			return false;
		}

		vecResults = vecPathList;

		return true;
	}

	/**
	 * 削除するselectID(Group_idまたはuser_id)を設定する。<BR>
	 * 共通処理管理 ログ削除処理で使用する。
	 *
	 * @param strID selectID
	 */
	public void setDeleteSelectID( String strID ) {
		putData( DELETE_SELECTID, strID );
	}

	/**
	 * 削除するparent_idを設定する。<BR>
	 * 共通処理管理 ログ削除処理で使用する。
	 *
	 * @param strID parent_id
	 */
	public void setDeleteParentID( String strID ) {
		putData( DELETE_PARENTID, strID );
	}

	/**
	 * 更新処理の際に、Assignmentsテーブルを更新しないフラグを設定する<BR>
	 */
	public void setDontUpdateAssignments() {
		putData( UPDATE_ASSIGNMENTS, UPDATE_ASSIGNMENTS );
	}

	/**
	 * LO削除処理から呼ばれた場合のフラグを設定します。
	 */
	public void setCallFromDelete() {
		putData(CALL_FROM_DELETE, "call_from_delete");
	}

	/**
	 * 単一LOの複製を行います。<BR>
	 * @param strSendRelationID 複製元リレーションID
	 * @param strReceiveRelationID 複製先リレーションID
	 * @param intType 複製処理区分(1: 上へ 2: 中へ 3: 下へ)
	 * @return boolean 正常時はtrue エラー時はfalse
	 * @exception Exception RMI通信エラー、内部エラー
	 */
	public boolean copy(String strSendRelationID, String strReceiveRelationID, int intType)
		throws Exception
	{
		String[] strSendRelationIDList = new String[1];
		strSendRelationIDList[0] = strSendRelationID;
		return copy(strSendRelationIDList, strReceiveRelationID, intType);
	}

	/**
	 * LOの複製を行います。<BR>
	 * 複数の複製処理に対応します。
	 * @param strSendRelationIDList 複製元リレーションIDリスト
	 * @param strReceiveRelationID 複製先リレーションID
	 * @param intType 複製処理区分(1: 上へ 2: 中へ 3: 下へ)
	 * @return boolean 正常時はtrue エラー時はfalse
	 * @exception Exception RMI通信エラー、内部エラー
	 */
	public boolean copy(String[] strSendRelationIDList, String strReceiveRelationID, int intType)
		throws Exception
	{
		// パラメータチェック
		if( strSendRelationIDList == null || strReceiveRelationID == null ) {
			XMOException xe = new XMOException("内部エラー: 複製処理でパラメータが不正です。");
			// ログ書き込み
			DebugLog.write( this.getClass(), xe, DebugLog.ROW );
			throw xe;
		}

		if( !(intType == UP_TYPE || intType == IN_TYPE || intType == DOWN_TYPE) ) {
			XMOException xe = new XMOException("内部エラー: 複製処理で処理タイプが不正です。");
			// ログ書き込み
			DebugLog.write( this.getClass(), xe, DebugLog.ROW );
			throw xe;
		}

		// パラメータをHashtableに格納します
		// 複製元IDリストの設定
		htParams.put(SEND_RELATIONID_LIST, strSendRelationIDList);
		// 複製先IDの設定
		htParams.put(RECEIVE_RELATIONID, strReceiveRelationID);
		// 処理タイプの設定
		htParams.put(PROCESS_TYPE, new Integer(intType));

		vecResults = (Vector)super.execute( METHOD_COPY, htParams );

		// メッセージデータを取得します
		MessageData objMessage = (MessageData)vecResults.get(0);
		mobjMessage = objMessage;

		if( isErr( objMessage ) || isWarning( objMessage )  ) {
			return false;
		}

		// エラーがない場合はコピーされたLOのツリー構造を取得します。
		mobjCopiedNode = (XMONode[])vecResults.get(1);

		return true;
	}

	/**
	 * コピー処理で作成されたLOのツリー構造を返します。
	 * コピー処理が行われていない場合またはコピー処理が正常に終了していない場合はnullを返します。
	 * @return XMONode[] コピーされたノードリスト
	 */
	public XMONode[] getCopiedNodeList() {
		return mobjCopiedNode;
	}

	/**
	 * 単一LOの移動を行います。<BR>
	 * @param strSendRelationID 移動元リレーションID
	 * @param strReceiveRelationID 移動先リレーションID
	 * @param intType 移動処理区分(1: 上へ 2: 中へ 3: 下へ)
	 * @return boolean 正常時はtrue エラー時はfalse
	 * @exception Exception RMI通信エラー、内部エラー
	 */
	public boolean transfer(String strSendRelationID, String strReceiveRelationID, int intType)
		throws Exception
	{
		String[] strSendRelationIDList = new String[1];
		strSendRelationIDList[0] = strSendRelationID;
		return transfer(strSendRelationIDList, strReceiveRelationID, intType);
	}

	/**
	 * LOの移動を行います。<BR>
	 * 複数の移動処理に対応します。
	 * @param strSendRelationIDList 移動元リレーションIDリスト
	 * @param strReceiveRelationID 移動先リレーションID
	 * @param intType 移動処理区分(1: 上へ 2: 中へ 3: 下へ)
	 * @return boolean 正常時はtrue エラー時はfalse
	 * @exception Exception RMI通信エラー、内部エラー
	 */
	public boolean transfer(String[] strSendRelationIDList, String strReceiveRelationID, int intType)
		throws Exception
	{
		// パラメータチェック
		if( strSendRelationIDList == null || strReceiveRelationID == null ) {
			XMOException xe = new XMOException("内部エラー: 移動処理でパラメータが不正です。");
			// ログ書き込み
			DebugLog.write( this.getClass(), xe, DebugLog.ROW );
			throw xe;
		}

		if( !(intType == UP_TYPE || intType == IN_TYPE || intType == DOWN_TYPE) ) {
			XMOException xe = new XMOException("内部エラー: 移動処理で処理タイプが不正です。");
			// ログ書き込み
			DebugLog.write( this.getClass(), xe, DebugLog.ROW );
			throw xe;
		}

		// パラメータをHashtableに格納します
		// 移動元IDリストの設定
		htParams.put(SEND_RELATIONID_LIST, strSendRelationIDList);
		// 移動先IDの設定
		htParams.put(RECEIVE_RELATIONID, strReceiveRelationID);
		// 処理タイプの設定
		htParams.put(PROCESS_TYPE, new Integer(intType));

		vecResults = (Vector)super.execute( METHOD_TRANSFER, htParams );
		// メッセージデータを取得します
		MessageData objMessage = (MessageData)vecResults.get(0);
		mobjMessage = objMessage;
		if( isErr( objMessage ) || isWarning( objMessage )  ) {
			return false;
		}
		return true;
	}

	/**
	 * コンテナ配下の前提条件チェックに使用します。
	 * @param strMaterialID		コンテナMaterialID
	 * @return boolean true: 検索成功 false: 検索失敗
	 */
	public boolean checkUnderPrere( String strMaterialID )
		throws Exception
	{
		// MaterialIDを設定します
		setmaterialID(strMaterialID);

		Vector vecResult = (Vector)super.execute( METHOD_CEHCK_PRERE, htParams );

		// メッセージデータを取得します
		mobjMessage = (MessageData)vecResult.get(0);
		if( isErr( mobjMessage ) || isWarning( mobjMessage ) ) {
			return false;
		}

		Integer intPrereFlg = (Integer)vecResult.get(1);
		mintPrereFlg = intPrereFlg.intValue();

		return true;
	}

	/**
	 * コンテナ配下の前提条件加設定チェックに使用します。
	 * @param strMaterialID		コンテナMaterialID
	 * @return boolean true: 検索成功 false: 検索失敗
	 */
	public boolean checkUnderActivePrere( String strMaterialID )
		throws Exception
	{
		// MaterialIDを設定します
		setmaterialID(strMaterialID);
		// 加設定フラグを設定します
		super.setValue("check_flg", "active");

		Vector vecResult = (Vector)super.execute( METHOD_CEHCK_PRERE, htParams );

		// メッセージデータを取得します
		mobjMessage = (MessageData)vecResult.get(0);
		if( isErr( mobjMessage ) || isWarning( mobjMessage ) ) {
			return false;
		}

		Integer intPrereFlg = (Integer)vecResult.get(1);
		mintPrereFlg = intPrereFlg.intValue();

		return true;
	}

	/**
	 * コンテナ配下の前提条件被設定チェックに使用します。
	 * @param strMaterialID		コンテナMaterialID
	 * @return boolean true: 検索成功 false: 検索失敗
	 */
	public boolean checkUnderPassivePrere( String strMaterialID )
		throws Exception
	{
		// MaterialIDを設定します
		setmaterialID(strMaterialID);
		// 被設定フラグを設定します
		super.setValue("check_flg", "passive");

		Vector vecResult = (Vector)super.execute( METHOD_CEHCK_PRERE, htParams );

		// メッセージデータを取得します
		mobjMessage = (MessageData)vecResult.get(0);
		if( isErr( mobjMessage ) || isWarning( mobjMessage ) ) {
			return false;
		}

		Integer intPrereFlg = (Integer)vecResult.get(1);
		mintPrereFlg = intPrereFlg.intValue();

		return true;
	}

	/**
	 * 前提条件フラグを返します。
	 * @return int 前提条件フラグ
	 */
	public int getCheckUnderPrere() {
		return mintPrereFlg;
	}


	/***
	 * LOリストを取得する.
	 * 
	 * @param loId LOID(コンテナのLOID)
	 * @Exception XmsException
	 * @return コンテナの直下にあるLOIDリスト
	 * 
	 */
	public List getLoIds(String loId) throws XmsException{
		ArrayList list = new ArrayList();
		try {
			LoRelationClient client = new LoRelationClient();
			client.setParentID(loId);

			if (client.select()) {
				while (client.next()) {
					list.add(client.getChildID());

				}
			} else {

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

			client = null;
		} catch (XmsException e) {
			throw e;

		} catch (Exception e) {
			throw new XmsSystemException(e);

		}		
		return list;
	}
	
	//	ADD 2005/04/22 START Koji Umehara [メソッド管理追加]
	/**
	 * パラメータにメソッドフラグをセットします.
	 * Insert,Update,Delete,copy,transferメソッドをメソッドツリーに対して
	 * 実行する場合には必ずtrueを設定します。
	 */
	public void setMethodFlag( boolean blnMethodFlag ) {
		htParams.put( METHOD_FLAG, new Boolean( blnMethodFlag ) );
	}
	//	ADD 2005/04/22 END Koji Umehara [メソッド管理追加]

}

