基本的なカスタマイズ > ユーザーインタフェースのカスタマイズ > ウィザードの作成 > 単一オブジェクトを作成するウィザードの構築 > カスタマイズポイント
  
カスタマイズポイント
フォームプロセッサとフォームプロセッサ委任の作成
このセクションではウィザード処理に記載されている標準的なウィザード処理フレームワークに精通していることが前提とされています。
クラス com.ptc.core.components.forms.CreateObjectFormProcessor は、永続可能オブジェクトを作成するウィザードで、デフォルトのフォームプロセッサとして使用することができます。このクラスは、必要に応じて拡張することができます。
CreateObjectFormProcessor は以下のことを行います。
preprocess() method
属性テーブルに記載されているように、特別な名前属性を持つ ObjectBean フォームデータのすべてを抽出します。
新規オブジェクトの TypeInstance を作成し、フォームの属性値を新規オブジェクトに適用して、「タイプおよび属性の管理」ユーティリティで属性に定義した制約に対して値の検証を行います。
TypeInstance が Persistable に変換され、ObjectBean の object 属性として設定されます。
super.preProcess() を呼び出し、ウィザードに登録される FormProcessorDelegates の preprocess() メソッドを呼び出します。
doOperation() メソッド
super.doOperation() を呼び出し、ウィザードに登録される FormProcessorDelegates の doOperation() メソッドを呼び出します。
PersistenceHelper.manager.store() を呼び出し、データベースに Persistable を格納します。
getSuccessFeedbackMessage() メソッド (setResultNextAction() によって呼び出される)
このメソッドは、FormResult が SUCCESS の場合に呼び出され、FeedbackMessage を作成します。メッセージの内容の設定方法については、「インラインメッセージング」を参照してください。
UI では、このインラインメッセージは単一オブジェクトの作成時に次のように表示されます。
複数オブジェクトの場合は、次のように表示されます。
CreateObjectFormProcessor は postProcess() または postTransactionProcess() メソッドを実装しないため、それらのメソッドは DefaultObjectFormProcessor から継承します。詳細については、Javadoc を参照してください。
既存の Windchill ビジネスクラスを拡張する場合、CreateObjectFormProcessor の代わりに使用または拡張する必要のある、そのクラスに特有のプロセッサが存在します。以下の表でこれらのクラスを示します。これらのクラスの動作の詳細については、Javadoc を参照してください。
クラスによる拡張対象
使用するプロセッサクラス
WTPart
ワークスペースから起動するウィザードを作成する場合:
com.ptc.windchill.enterprise.part.forms.CreatePartFromW orkspaceFormProcessor
「構造を編集」クライアントから起動するウィザードを作成する場合:
com.ptc.windchill.enterprise.part.forms.CreatePartFromTa bularInputProcessor
その他すべての単一オブジェクトの作成ウィザードの場合:
com.ptc.windchill.enterprise.part.forms.CreatePartFormPro cessor
WTDocument
テンプレートからドキュメントを作成する場合:
com.ptc.windchill.enterprise.doc.forms.CreateDocFromTe mplateFormProcessor
ドキュメントテンプレートを作成する場合:
com.ptc.windchill.enterprise.doc.forms.CreateDocTemplat eFormProcessor
その他すべての単一オブジェクトの作成ウィザードの場合:
com.ptc.core.windchill.enterprise.doc.forms.CreateDocFor mProcessor
WTChangeIssues
com.ptc.windchill.enterprise.change2.forms.processors.Cre ateProblemReportFormProcessor
WTChangeRequest2
com.ptc.windchill.enterprise.change2.forms.processors.Cre ateChangeRequestFormProcessor
WTChangeOrder2
com.ptc.windchill.enterprise.change2.forms.processors.Cre ateChangeNoticeFormProcessor
WTChangeActivity2
com.ptc.windchill.enterprise.change2.forms.processors.Cre ateChangeTaskFormProcessor
WTVariance
com.ptc.windchill.enterprise.change2.forms.processors.Cre ateVarianceFormProcessor.
提供されているフォームプロセッサのいずれかの動作がニーズを満たしているのであれば、独自のプロセッサを作成する必要はありません。単に、ウィザード操作のコマンドサブタグのクラス属性値としてプロセッサを指定します。いずれの動作もニーズを満たさない場合は、ウィザードフォームデータを処理するためにプロセッサのサブクラスを作成する必要があります。単に属性を設定するために特別なコードを提供する場合は、独自のプロセッサを作成する必要はありません。その場合は、このタスクを処理するために FormProcessorDelegate を書き込むだけです。非表示フォームフィールドで FormProcessorDelegate を登録し、CreateObjectFormProcessor によって認識される特別な属性名が属性入力フィールドに指定されていないことを確認してください。詳細については、属性テーブルを参照してください。
単に属性を設定するために特別なコードを提供する場合は、独自のプロセッサを作成する必要はありません。その場合は、このタスクを処理するために FormProcessorDelegate を書き込むだけです。非表示フォームフィールドで FormProcessorDelegate を登録し、CreateObjectFormProcessor によって認識される特別な属性名が属性入力フィールドに指定されていないことを確認してください。
FormProcessorDelegate は DefaultObjectFormProcessorDelegate を継承する必要があります。NumberPropertyProcessor と KeepCheckedOutDelegate は、定義済みのカスタム FormProcessorDelegate の例です。FormProcessorDelegate のクラス構造を次に示します。
独自のプロセッサを作成する場合は、各ウィザードステップの後に、標準バリデータクラスによって preProcess() メソッドが呼び出されることに注意してください。このメソッドのデータベースを修正しないでください。
以下のより一般的な事例では、オーバーライドして処理を実行するために、独自の ObjectFormProcessor クラスとメソッドを作成する必要があります。
例 1: ウィザードの終了時に異なる操作を実行する必要がある。
たとえば、ウィザードの終了時に起動ページを再表示せずに新規のページをロードする場合です。あるいは、ウィザードを複数の位置から起動でき、起動ページを再表示する場合や、新規のページをロードする場合です。
ソリューション: 定義済みのプロセッサを部分的に分類し、setResultNextAction メソッドをオーバーライドします。NmCommand.getCompContext() メソッドから、ウィザードの起動コンテキストに関する情報を入手できます。以下にベースライン作成クライアントでこれを実行する例を示します。
String compContext = cb.getCompContext();
if (compContext != null) {
try {
NmContext compContextObj = NmContext.fromString(compContext);
Stack<NmContextItem> contextItems = compContextObj.getContextItems();
for (NmContextItem contextItem : contextItems) {
String action = contextItem.getAction();
if ("addToBaseline".equals(action) ||
"addToBaselineSingle".equals(action) ||
"addToBaselineStep".equals(action)) {

< set some next action >
}
}
.
.
.
テーブルからウィザードを起動し、ウィーザード操作で ajax="row" を指定した場合は、FormResult で refreshInfo 属性を設定し、システムに再表示する行を通知するようにします。通常、DynamicRefreshInfo オブジェクトの属性は以下のようになります。
action = NmCommandBean.DYNAMIC_ADD
oid = 作成したオブジェクトの NmOid。
location = 新規の行を含んでいるテーブルオブジェクトの NmOid。通常、これはフォルダです。
ajax 属性として "page" または "component" を使用した場合は、refreshInfo 属性を設定する必要はありません。
詳細については、Windchill JSP フレームワークを使用した HTML クライアントのカスタマイズの章のAjax による UI のカスタマイズのセクションと、FormResult および FormProcessingStatus クラスについての Javadoc を参照してください。
例 2: オブジェクトの永続化後にいくつかの後処理を実行する必要がある。
たとえば、変更管理オブジェクトウィザードには、作成後にユーザーがただちにオブジェクトをワークフローに送信できるダイアログがあります。この場合、オブジェクトの作成後に別の操作を実行する必要があります。このような条件は、入力フィールドで ObjectFormProcessorDelegate を作成し、そこでインフラストラクチャによって自動的に呼び出される postProcess() または postTransactionProcess() メソッドを実装することによって処理できる場合があります。ただし、それ以外の場合は、この処理を実行するためにフォームプロセッサを使用できます。たとえば、操作の順序が要件になっているとフォームプロセッサで操作を実行する必要があるため、FormProcessorDelegates を呼び出す順番を制御できません。
ソリューション: CreateObjectFormProcessor を部分的に分類し、postProcess() または postTransactionProcess() メソッド (DefaultObjectFormProcessor から継承) をオーバーライドして操作を実行します
(keepCheckedOutCheckbox.jspf ファイルを指定して「チェックアウト状態を維持」チェックボックスをウィザードに配置すると、KeepCheckedOutDelegate によって自動的に処理が行われます。この処理を実行する必要はありません)。
例 3: オブジェクトを永続化するのに特別な API を使用する必要がある。
たとえば、変更管理オブジェクトは、オブジェクトの永続化に加え、ライフサイクルおよびフォルダタスクを処理する StandardChangeService2 クラスで永続化します。
ソリューション: 定義済みのプロセッサを部分的に分類し、doOperation() メソッドをオーバーライドします。独自メソッドではスーパーメソッドを呼び出せませんが、登録済みの FormProcessorDelegates の doOperation() メソッドが呼び出されることを確認する必要があります。これは、DefaultObjectFormProcessor から継承される processDelegates() メソッドを呼び出すことによって実行できます。次に例を示します。
FormResult doOperationResult = new FormResult();
doOperationResult.setStatus(FormProcessingStatus.SUCCESS);
doOperationResult = processDelegates (DO_OPERATION, clientData,
objectBeanList);
if (!continueProcessing(doOperationResult)) {
return doOperationResult;
}
try
{
< persist the object >
}
catch(WTException e)
{
< do error handling >
}
return doOperationResult;
委任は、多くの処理フェーズでフォームプロセッサタスクの後に呼び出されますが、doOperation フェーズでは、フォームプロセッサがタスクを実行する前に委任が呼び出される必要があります。これによって、すべての属性が設定され、オブジェクトの永続化が行われる前に、委任が操作を実行できるようになります。
例 4: プログラムで新規オブジェクトに属性を設定する必要がある。
UI で公開されない属性の永続化が実行される前に、オブジェクトで設定しなければならない属性が存在する可能性があります。
ソリューション: この処理には別の方法がいくつかあります。
FormProcessorDelegate を作成し、その preProcess() メソッドを実装します。このメソッドで、ObjectBean のオブジェクトに属性値を設定します。委任の名前を指定するウィザード JSP に非表示フォームフィールドを追加します。このフィールドは、フレームワークによって自動的にインスタンス化が行われます。次に例を示します。
<input type="hidden" name="
${createBean.formProcessorDelegateConstant}" value=" <path name
of your delegate
> ">
定義済みのプロセッサを部分的に分類し、preProcess() メソッドをオーバーライドします。スーパークラスの createItemInstance() メソッドを呼び出して Persistable を作成し、この Persistable に目的の属性を設定することができます。次に例を示します。
FormResult preProcessResult = new
FormResult(FormProcessingStatus.SUCCESS);
for (ObjectBean objBean: objectBeans) {
FormResult objectResult =
new FormResult(FormProcessingStatus.SUCCESS);
objBean.setObject(createItemInstance(clientData,
objBean, objectResult));
preProcessResult =
mergeIntermediateResult(phaseResult, objectResult);
if (!continueProcessing(preProcessResult)) {
return preProcessResult;
}
Object newObj = objBean.getObject();
< set additional attributes on the new object here>
}
// Call processDelegates() which will call registered
processor delegates
delegatesResult = processDelegates(DO_OPERATION,
clientData, objectBeanList);
preProcessResult =
mergeIntermediateResult(preProcessResult, delegatesResult);
if (!continueProcessing(preProcessResult)) {
return preProcessResult;
}
前述の例は、複数のオブジェクトを作成するウィザードでプロセッサを使用できるように作成されています。
一般に、属性を設定する場合は、今後、CreateObjectFormProcessor preprocess() メソッドへの修正が回避されるように、サブクラスアプローチではなく委任アプローチが使用されます。