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

//
//	ステータス更新関連テーブル操作ユーティリティクラスです。
//			変更履歴
//				2004.01.08	新規作成	二條　智文


package jp.co.ntt.lms.lo.util;

import java.sql.SQLException;
import java.util.Hashtable;

import jp.co.ntt.lms.lo.*;
import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.util.*;
import jp.co.ntt.lms.Common.status.conclusion.*;

/**
 * ステータス更新関連テーブル操作ユーティリティクラスです。<BR>
 * @author T.Nijou
 * @version 0.0.0.1 2004/01/08
 */
public class PropagateUtil
	implements LoPropertyDef
{

	/**
	 * ステータス更新関連テーブルへ登録処理を行うかを自動的に判断し、
	 * 登録する必要がある場合は登録処理を行います。
	 * @param htbData
	 * @exception SQLException DBエラー
	 */
	public static void setPropagateRelation( Hashtable htbData, DataAccess objDataAccess )
		throws SQLException
	{
		// 完結要件を取得する
		String strConclusion = (String)htbData.get( CONCLUSION );
		// LOIDを取得
		String strLoID = (String)htbData.get(LOID);
		if( strConclusion != null && !strConclusion.equals( "" ) ) {
			// 完結要件が設定されている場合はステータス更新関連テーブルに情報を追加

			Conclusion objConclusion = new Conclusion(strConclusion);
			String[] strLoIDList = null;
			try {
				// パース
				objConclusion.parse();
				// パース結果からLOIDリストを取得する
				strLoIDList = objConclusion.getLoIDList();
			}
			catch( ConclusionParseException cpe ) {
				throw new SQLException( cpe.getMessage() );
			}
			catch( ConclusionException ce ) {
				throw new SQLException( ce.getMessage() );
			}
			// ステータス更新関連テーブルに情報を追加
			PropagateRelationDataAccess objPropagate = new PropagateRelationDataAccess();
			objPropagate.insert( strLoIDList, strLoID, objDataAccess );
		}
		else {

			// 完結要件が設定されていない場合は関連テーブルを削除
			PropagateRelationDataAccess objPropagate = new PropagateRelationDataAccess();
			objPropagate.deleteLOID( strLoID, objDataAccess );
		}
	}

	/**
	 * ステータス更新関連テーブルへ削除処理を行うかを自動的に判断し、
	 * 削除する必要がある場合は削除処理を行います。
	 * @param htbData
	 * @exception SQLException DBエラー
	 */
	public static void deletePropagateRelation( Hashtable htbData, DataAccess objDataAccess )
		throws SQLException
	{
		// LOIDを取得する
		String strLoID = (String)htbData.get( LOID );

		// 削除処理
		PropagateRelationDataAccess objPropagate = new PropagateRelationDataAccess();
		objPropagate.deleteAll( strLoID, objDataAccess );
	}

	/**
	 * 必要なデータをハッシュテーブルに設定し、
	 * ステータス更新関連テーブルの更新処理を呼び出します。
	 * 
	 * @param strLOID 更新対象LOID
	 * @param strConclusion 完結条件式
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception SQLException DBエラー
	 */
	public static void editPropagate(String strLOID, String strConclusion, DataAccess objDataAccess)
		throws SQLException {
		Hashtable htbData = new Hashtable();
		// 更新に必要な条件をハッシュに追加
		putData(htbData, LOID, strLOID);
		putData(htbData, CONCLUSION, strConclusion);
		// PROPAGATERELATIONテーブル更新処理
		setPropagateRelation(htbData, objDataAccess);
	}

	/**
	 * 安全にHashtableに追加するメソッドです。
	 * 
	 * @param htbData 更新データ
	 * @param strKey 更新データのキー
	 * @param strValue 更新データの値
	 */
	private static void putData( Hashtable htbData, String strKey, String strValue ) {
		if( strValue != null && !strValue.equals( "" ) ) {
			htbData.put( strKey, strValue );
		}
	}
}
