フォーム委任の作成 (ステップ 5)
ほとんどの変更管理ウィザードのステップでは、表示されるテーブルとステップ自体が 1:1 で対応しています。これに対して、「変更タスク」ウィザードには 2 つのテーブルが表示されます。各テーブルは、専用の一意のフォーム委任によって処理されます。次に、テーブルでサポートされるフォーム委任のリストを示します。
テーブル名/ステップ名
|
サポートされるクラス名
|
変更適用オブジェクト (変更タスク)
変更適用オブジェクト (問題レポート、変更リクエスト、一時許可)
|
ChangeTaskAffectedItemsFormDelegate
AffectedDataFormDelegate
|
影響を受ける最終品目
|
AffectedEndItemsFormDelegate
|
結果オブジェクト
|
ChangeTaskResultingItemsFormDelegate
|
関連変更
|
RelatedChangeItemFormDelegate
|
影響を受ける/結果オブジェクト
|
AffectedAndResultingItemsFormDelegate
|
テーブルごとに 1 つのフォーム委任を使用してください。これにより、ステップごとにテーブルの機能を分離できます。埋め込みオブジェクトがある場合は、複数のテーブルを使用するか、ステップのフォーム委任を使用して、これをテーブル/コンポーネントのサブフォーム委任に委任する別のシナリオを検討してください。
リンクのグローバル属性の処理
リンク変更のテーブルで属性 (グローバル属性またはモデル化属性) を処理するには、次の操作が必要です。
1. 既成のフォーム委任を拡張します。これにより、拡張と既存のすべての属性 (説明、承認された数量、処理方法など) の処理に、多数の API とプラグインポイントを使用できるようになります。
2. processLinkAttributes() をオーバーライドします。このメソッドは、次の処理の後に呼び出されます。
a. バイナリリンクの作成
b. リンクでのタイプ定義参照の設定
c. リンクと変更管理オブジェクトの保存
|
このメソッドの目的は、リンクで修正が必要な属性を検出し、これらの属性を更新して、修正されたすべてのリンクのコレクションを返すことです。これらのリンクは、以後コレクションとして保持されます。
|
|
属性の更新は、修正 (または解除) 済みとして検出された属性のみで行うことが重要です。
|
新しいオブジェクトの PersistableAdapter は、グローバル属性の処理に必要なコードを大きく削減します。次のコード例では、この API が使用されています。
ChangeLinkAttributeHelper と ChangeManagementClientHelper のいくつかのメソッドは、属性の処理と変更可能な参照を使用する FORM データの抽出に役立つことがわかります。
サンプルコード
public class DistributingResultingItemsFormDelegate extends
ChangeTaskResultingItemsFormDelegate {
/**
* This method is used to post-process attributes on the change activity
* and change records.
* Note: In the example below we are not checking whether the change
* record is of the type DistributingChangeRecord. This could be done
* by comparing the Type Definition reference of the change record.
* However since this demo is focused on attribute manipulation using the
* new code>LWCNormalzedObject we have left it out for brevity.
*/
@SuppressWarnings("unchecked")
@Override
protected WTCollection processLinkAttributes(ChangeItemIfc item,
WTCollection binaryLinks) throws WTException {
WTCollection modifiedLinks = super.processLinkAttributes(item,
binaryLinks);
if (binaryLinks != null && !binaryLinks.isEmpty() && item instanceof
WTChangeActivity2) {
// The link bean has knowledge of how of link attributes and supports
the JCA interfaces.
ChangeLinkAttributeBean linkBean = ChangeLinkAttributeHelper.
getChangeLinkAttributeBean();
linkBean.setFormData(getObjectBean());
for(Iterator<ChangeRecord2> iter = binaryLinks.persistableIterator(ChangeRecord2.class, true); iter.hasNext(); ) {
ChangeRecord2 record = iter.next();
// The getTableDataValue() will get the attribute from the FORM data
supporting any specific change table handlers
String value = ChangeLinkAttributeHelper.getTableDataValue
(DistributingChangeRecordConstants.DISTRIBUTION_ATTRIBUTE,
ChangeManagementClientHelper.getReference(record.getChangeable2()), linkBean);
// The new LWC API for getting and setting attributes.
PersistableAdapter lwc = new PersistableAdapter(record, null, null, new UpdateOperationIdentifier());
lwc.load(DistributingChangeRecordConstants.DISTRIBUTION_ATTRIBUTE);
Object currentValue = lwc.get(DistributingChangeRecordConstants.
DISTRIBUTION_ATTRIBUTE);
// Only set the attribute if it is different than the current value
if(( value != null && currentValue != null && !value.equals
(currentValue.toString())) || (value == null && currentValue != null) ) {
lwc.set(DistributingChangeRecordConstants.DISTRIBUTION_ATTRIBUTE, value);
lwc.apply();
// calling apply() will require verification, however since this form
delegate is setting the changes we can set it as verified.
try {
record.getPersistInfo().setVerified(true);
} catch (WTPropertyVetoException e) {
e.printStackTrace();
}
modifiedLinks.add(record);
}
}
}
return modifiedLinks;
}
}
ステップのフォーム委任のオーバーライド
ウィザードの「影響を受ける/結果オブジェクト」ステップのフォーム委任をオーバーライドするには、次の手順に従います。
1. クラス AffectedAndResultingItemsFormDelegate を拡張します。
2. メソッド getAffectedDataFormDelegate() または getResultingDataFormDelegate() をオーバーライドし、テーブルのカスタムフォーム委任を返します。
public class CustomAffectedAndResultingItemsFormDelegate extends
AffectedAndResultingItemsFormDelegate {
@Override
public ObjectFormProcessorDelegate getResultingDataFormDelegate() {
return new DistributingResultingItemsFormDelegate();
}
}