進行状況と期限の計算に使用するカスタムハンドラのガイドライン
• カスタムハンドラは HealthStatus と Deadline のみを修正し、その他のアクティビティ属性を修正してはいけません。
• 可能な場合には必ず、マルチオブジェクト API (引数として個々のオブジェクトではなくコレクションをとる API) を使用します。これにより、API の呼び出しがループになることを回避できます。
たとえば、システムで実行中のすべての計画を取得するには、以下のような API を作成します。
public WTCollection getActivePlans(){
QuerySpec qs = new QuerySpec();
int idxPlan = qs.appendClassList(Rootable.class, true);
SearchCondition scForActivePlans = new SearchCondition (
Plan.class,
Plan.PLANNABLE_STATE,
SearchCondition.EQUAL,
PlannableState.INPROCESS);
qs.appendWhere(scForActivePlans, new int[] { idxPlan });
PlanResultProcessor resultProcessor = new PlanResultProcessor();
PersistenceServerHelper.manager.query((StatementSpec) qs, resultProcessor);
WTHashSet plans = new WTHashSet(PersistenceHelper.manager.find(qs));
return plans;
}
• カスタムハンドラは、以下の API を使用して、アクティビティのコレクションに対して更新操作を実行する前に、必ずそのオブジェクトを再表示する必要があります。
WTCollection summaryActivities = new WTArrayList(activitiesCollection);
leafActivities = CollectionsHelper.manager.refresh(leafActivities);
• カスタムハンドラは修正後に必ずアクティビティを保存する必要があります。
できれば、以下のマルチオブジェクト API を使用してください。
PersistenceHelper.manager.save(activities)
アクティビティを 1 つだけ保存する場合は、以下の API を使用します。
PersistenceHelper.manager.save(leafAct)
• カスタムイベントリスナーからカスタムアルゴリズムを呼び出すには、以下の API を LeafActivityHealthStatusHandlerFactory から呼び出します。
void calculateDeadlineAndHealthStatus(WTCollection activities, Object event) throws WTException, WTPropertyVetoException
冗長なオブジェクト処理の回避
特定の操作が実行された場合に複数のイベントが発生することがあります。たとえば、自動実行計画内のアクティビティに対して「作業を管理」操作を実行しているときにユーザーが「作業時間の達成率」を 100 に設定した場合、以下のイベントが発生します。
計画アクティビティの状態変化
EPP 進行状況変化
EPP 終了変化
このすべてのイベント間でカスタムアルゴリズムが 1 つだけ共有されている場合 (そのアルゴリズムがイベントベースでない場合など)、同じデータに対して同じカスタムアルゴリズムが 3 回呼び出されます。
アルゴリズムが繰り返し実行されるのを回避するため、MethodContext と ProcessedEvent を組み込むことができます。
MethodContext は、発生したイベントおよびそのイベントの対象となったオブジェクトに関する操作関連情報を提供します。この情報は以下のフォーマットで提供されます。
HashMap(<プロジェクト管理のイベント名>, <オブジェクトのリスト>)
1 つの操作が複数のイベントを分散して受信する場合には必ず、各イベントを処理した後、そのイベントと処理されたオブジェクトのエントリで HashMap が更新されます。
この後、ProcessedEvent キーを使用して HashMap オブジェクトを MethodContext から取得できます。
HashMap(String, WTArrayList) objMap = MethodContext.get(“ProcessedEvent”);
このマップ内で、ProjectManagementEvent のイベント名が key として提供され、そのイベントの一部として処理されるオブジェクトのリストが value として提供されます。
カスタムアルゴリズムはキーセットを反復処理してこれまでに処理されたオブジェクトを検出できます。
たとえば、アクティビティのコレクションが EPP_PERCENT_CHANGE と EPP_FINISH_CHANGE の 2 つのイベントを発生させるとします。
1. EPP_PERCENT_CHANGE イベントが先に発生します。
2. これが処理された後、HashMap が以下のように更新されます。
HashMap("ProcessedEvent", HashMap(EPP_PERCENT_CHANGE, <オブジェクトのリスト>));
3. EPP_FINISH_CHANGE が発生します。
アルゴリズムが EPP_FINISH_CHANGE イベントを受信する場合、HashMap を読み取って、EPP_PERCENT_CHANGE イベントによってすでに処理されたオブジェクトのコレクションをチェックできます。そこから、EPP_FINISH_CHANGE によって同じオブジェクトを処理するかどうかを判断できます。処理しない場合、このコレクションはスキップできます。