高度なカスタマイズ > Windchill アダプタ > カスタム Windchill アダプタ Webject > タイプベースの Webject 委任の例
  
タイプベースの Webject 委任の例
"Hello, World!" の例は、Webject 委任がターゲットオブジェクトに対して操作を実行したり照会したりしないので、Webject 委任照会以外のターゲットオブジェクトのクラスまたはタイプは関係しませんでした。
この例は、Windchill タイプ wt.part.WTPart に特有のタイプベース Webject 委任を作成する方法を示しています。
Fetch-PartRelations Webject の基本的な操作は、wt.part.WTPart のインスタンスのサーチまたはフェッチです。また、その部品とほかの部品およびドキュメントの直接的な関係を解決し、ネストされた Info*Engine 要素として関連オブジェクトとともに部品を返します。
ステップ 1: 新規 Webject 代理の作成
Fetch-PartRelations Webject は、Query-Objects のような Webject と同じ多くの基本的な機能に基づいているので、この Webject は com.ptc.core.adapter.server.impl.ObjectWebject を拡張します。
ObjectWebject を拡張すると、Fetch-PartRelations Webject は多くのコアの OBJ Webject パラメータを自動的に継承します (たとえば、TYPE/WHERE、OBJECT_REF、REFERENCE_DELIMITER、CONTAINER_REF など)。Webject で実際に使用されるこれらのパラメータは、呼び出される便利な共有メソッドに基づいています。
最初に Webject が実行するのは、preset(Task) メソッドを呼び出すことです。このメソッドは親クラスに受信した Webject を検証させ、共通パラメータを収集させます。
Webject は getTargetTypeInstances() メソッドを後で使用して、基本的な検索および呼び出しを実行します (提供された TYPE/WHERE と OBJECT_REF およびほかのパラメータごとに適切に)。
結果として、サーチの実行と関連付けられたパラメータの多くを使用します。また、Webject がこれらのパラメータを使用するという事実にかかわらず、親クラスに処理されるので、パラメータの検証を明示的に実行する必要はありません。
Webject ソースには、どのように動作するのかを明確にするための多くの説明コメントが記載されています。Webject ソースは以下のディレクトリにあります。
<Windchill>/prog_examples/adapter/windchill/customwebjects/src
* 
Webject は adapterLogger と呼ばれる継承されたインスタンス変数を使用します。このインスタンス変数は、Windchill アダプタ Webject で使用する log4j ロガーの参照です。
継承された log4j ロガーを再使用することで、アダプタ Webject は、独自のログ作成メカニズムを作成する必要がなく、既存の log4j Windchill アダプタ構成を継承できます。ほかのロガーが、Windchill アダプタ基本クラスを拡張するために明示的な使用が可能であることを確認するには、AbstractWebject の javadoc を参照してください。
ステップ 2: 新規 Webject の Windchill アダプタへの通知
新規 Webject 委任を Windchill アダプタが認識できるようにするには、wt.adapter.delegates.properties に登録する必要があります。以下の行を追加します。
FETCHPARTRELATIONS.WCTYPE|
wt.part.WTPart=ext.example.FetchPartRelationsWebjectDelegate
このエントリによって次の機能が実行されます。
新規 Webject 委任の名前 FETCHPARTRELATIONS を指定します。
この Webject が wt.part.WTPart というクラスまたはタイプのターゲットオブジェクトに対して有効であることを指定します。
実行する必要のある invoke() メソッドがどのクラスに含まれているかを示します。
プロパティ定義は、java.lang.Object などの包括的なクラスではなく、wt.part.WTPart に直接この Webject 委任を添付します。これが実行されるのは、この Webject が wt.part.WTPart のインスタンスに固有であり、ほかのタイプに対して呼び出すことができないためです。
wt.part.WTPart (またはいずれかのサブクラス) 以外のタイプでこの Webject を呼び出そうとすると、アダプタは Webject 代理の検索に失敗し、該当する例外が発生します。Webject 代理を wt.part.WTPart クラスに添付すると、部品対象のロジックをほかのビジネスオブジェクトタイプに適用しようとすることで生じるあいまいなエラーを明示的に避けることができます。
この変更内容を認識するには、メソッドサーバーを再起動する必要があります。
ステップ 3: XML タスクの作成
次に、Fetch-PartRelations Webject が含まれている XML タスクドキュメントを作成します。タスクは、使用する Windchill サーバー用に設定したタスクディレクトリ内に作成する必要があります。以下に Fetch-PartRelations.xml の例を示します。
* 
タスクソースは、<Windchill>/prog_examples/adapter/windchill/customwebjects/tasks にあります。
<%@page language="java"%>
<%@taglib uri="http://www.ptc.com/infoengine/taglib/core"
prefix="ie"%>
<!--com.infoengine.soap.rpc.def
入力からのリクエストに従って、ベース部品をフェッチまたはサーチし、関連オブジェクトへの参照を拡張します。
@param string[] object_ref One or more object references of
parts to fetch.
@param string type The base type
(must be wt.part.WTPart or a subclass).
@param string where If searching for parts the where clause
used to select part/s.
@param string[] what What relations to return
(PARENTS,CHILDREN,DOCS or ALL).
@param string[] attribute What attributes to
fetch on base parts.
@param string[] part_atts What attributes to
fetch on related parts.
@param string[] partmaster_atts What attributes to fetch on
related part masters.
@param string[] doc_atts What attributes to
fetch on related documents.
@return INFOENGINE_GROUP ${partRelations}
-->
<ie:webject name="Fetch-PartRelations" type="OBJ">
<ie:param name="INSTANCE" data="$(@FORM[]supporting-adapter[*])"
delim="!" valueSeparator="!"
default="<%=com.infoengine.au.NamingService.getVMName()%>"/>
<ie:param name="OBJECT_REF" data="${@FORM[]object_ref[*]}"
valueSeparator="!" delim="!" />
   <ie:param name="TYPE" data="${@FORM[]type[0]}"
default="wt.part.WTPart" />
   <ie:param name="WHERE" data="${@FORM[]where[0]}" />
   <ie:param name="FETCH_WHAT" data="${@FORM[]what[*]}"
default="ALL" delim="," />
   <ie:param name="ATTRIBUTE" data="${@FORM[]attribute[*]}"
default="name,number" delim="," />
   <ie:param name="PART_ATTRIBUTES" data="${@FORM[]part_atts[*]}"
default="name,number,masterReference" delim="," />
   <ie:param name="PARTMASTER_ATTRIBUTES"
data="${@FORM[]partmaster_atts[*]}" default="name,number"
delim="," />
  <ie:param name="DOCUMENT_ATTRIBUTES"
data="${@FORM[]doc_atts[*]}" default="name,number" delim=","
/>
<ie:param name="GROUP_OUT" data="partRelations" />
</ie:webject>
サーバー管理ユーティリティとメソッドサーバーを起動します。次に、前述の例と同様に URL を実行します。例:
http://host.company.com/Windchill/servlet/IE/tasks/ext/example/
Fetch-PartRelations.xml?where=name='ParentPart'
この場合、where パラメータを指定するだけで、タスクソースで定義されるほかのすべてのデフォルトを使用可能にしています。
URL からの出力は、以下のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<wc:COLLECTION xmlns:wc="http://www.ptc.com/infoengine/1.0">
<wt.part.WTPart NAME="partRelations" TYPE="Unknown" STATUS="0">
<wc:INSTANCE>
<obid>VR:wt.part.WTPart:36028:925175337-1180978871749-4365289-
98-8-253-132@host.company.com</obid>
<class>wt.part.WTPart</class>
<name>ParentPart</name>
<number>PARENTPART.0</number>
<parents>
<wc:INSTANCE>
<obid>VR:wt.part.WTPart:36089:925175337-1180978871749-
4365289-98-8-253-132@host.companny.com</obid>
<class>wt.part.WTPart</class>
<masterReference>OR:wt.part.WTPartMaster:36087:925175337-
1180978871749-4365289-98-8-253-
132@padams03l.ptcnet.ptc.com</masterReference>
<number>ROOTPART.0</number>
<name>RootPart</name>
</wc:INSTANCE>
</parents>
<children>
<wc:INSTANCE>
<obid>OR:wt.part.WTPartMaster:36051:925175337-
1180978871749-4365289-98-8-253-132@host.company.com</obid>
<class>wt.part.WTPartMaster</class>
<name>ChildPart</name>
<number>CHILDPART.0</number>
</wc:INSTANCE>
</children>
<children>
<wc:INSTANCE>
<obid>OR:wt.part.WTPartMaster:42041:925175337-1180978871749-
4365289-98-8-253-132@host.company.com</obid>
<class>wt.part.WTPartMaster</class>
<name>AnotherChild</name>
<number>ANOTHERCHILD.0</number>
</wc:INSTANCE>
</children>
<documents>
<wc:INSTANCE>
<obid>VR:wt.doc.WTDocument:32023:925175337-1180978871749-
4365289-98-8-253-132@host.company.com</obid>
<class>wt.doc.WTDocument</class>
<name>wcadapter.txt</name>
<number>WCADAPTER.TXT.0</number>
</wc:INSTANCE>
</documents>
</wc:INSTANCE>
</wt.part.WTPart>
</wc:COLLECTION>
FETCH_WHAT パラメータは列挙パラメータタイプです。このパラメータの有効な値は、コーディングされた列挙に基づいています。呼び出し元が FETCH_WHAT パラメータの無効な値を指定すると、以下と同じローカライズされたエラーメッセージを受信します。
<?xml version="1.0" encoding="UTF-8"?>
<wc:COLLECTION xmlns:wc="http://www.ptc.com/infoengine/1.0">
<exception NAME="exception" TYPE="Exception" STATUS="-1">
<wc:MESSAGE>wt.util.WTException: Fetch-PartRelations: Invalid value
&quot;NOTHING&quot; for parameter &quot;FETCH_WHAT&quot;. Must be
one of &quot;[PARENTS, CHILDREN, DOCS, ALL]&quot;.</wc:MESSAGE>
<wc:INSTANCE>
<hierarchy>com.infoengine.util.IEException</hierarchy>
<hierarchy>javax.servlet.jsp.JspException</hierarchy>
<hierarchy>java.lang.Exception</hierarchy>
<hierarchy>java.lang.Throwable</hierarchy>
<hierarchy>java.lang.Object</hierarchy>
</wc:INSTANCE>
</exception>
</wc:COLLECTION>