高度なカスタマイズ > Info*Engine ユーザーガイド > カスタムタグライブラリ > タスクベースのタグライブラリの実装
  
タスクベースのタグライブラリの実装
タグライブラリは、Info*Engine タスクを作成するときに使用するものと同様の規則と手順を使用して作成できます。それぞれのタスク (フェデレーションタイプ識別子を使用する場合はコマンド委任) は、単一のタグとして公開できます。タスクのタスクドキュメンテーションのコメントを使用してドキュメント化されているパラメータは、タグの属性として公開されます。各パラメータのメタデータを使用して、特定の属性が必要であるかどうか、および特定の属性で定義式を使用できるかどうかを制御できます。デフォルトでは、どの属性も必須ではなく、どの属性でも定義式を使用できます。デフォルトをオーバーライドするパラメータは以下のとおりです。
<!--com.infoengine.soap.rpc.def
This is the tag description.
@param boolean hardCoded No Expressions {rtexp:false}
@param string required Is required {required:true}
@return INFOENGINE_GROUP ${output}
-->
この例では、タスクのコメントのメタデータは波括弧 ({ }) で囲まれており、その名前はコロン (:) で値から区切られています。@return コメントは、タグ内で明示的に使用されることはありませんが、完全性を確保するため、およびタスクの実用性を高めるためにタグに含めるようにしてください。
INFOENGINE_GROUP タイプのパラメータを指定すると、親タスクの VDB からタグの VDB に 1 つのグループが提供されます。このような場合、タグは呼び出しタスクの VDB のコンテンツにアクセスできますが、明示的に必要とされている部分に限られます。配列入力は、複数の値をとるパラメータとして、タグの @FORM 入力に追加されます。入力時に、タグは呼び出しタスクの @SERVER および @AUTH-MAP のすべてのコンテキスト情報を継承しますが、@FORM のコンテキスト情報は継承しません。タグを呼び出したら、タグの VDB が呼び出しタスクの VDB にマージされます。
呼び出しタスクの入力および出力ストリームも、そのタスクが呼び出すタグに関連付けられるため、タスクベースのタグが入力を消費し、出力を生成することが可能です。
呼び出しタスクとそれが呼び出すタグは、タスクレットコンテキストを通じてほかの情報を共有できます。タスクレットコンテキストとは、データを含んでいる 1 対のマップのことです。それぞれのタスクには、変数データを保存するための独自のローカルマップが割り当てられます。このマップは、包括的なリクエストの IeContext オブジェクトによって支えられています。Info*Engine ベースのリクエストには、それぞれ独自の IeContext (com.infoengine.util.IeContext) のインスタンスがあり、これには特定のリクエストに固有のコンテキスト情報を保存できます。ただし、コンテキスト内のローカル範囲の変数は、それらが定義されているタスクでのみ認識されます。同じ範囲内のタスク間 (または場合によってはタグ間) で情報を共有するには、リクエスト範囲の変数が必要です。タスクレットコンテキストの詳細については、定義式言語のサポートを参照してください。
以下に例を示します。
<c:set var=“shared” value=“${value}” requestScope=“true” />
Info*Engine タスクを基盤とするタグは、同じプリフィックスを持ち、param という名前で、name および data 属性を持つ子タグを暗黙的にサポートします。このタグは、ドキュメント化されていないパラメータをタグに提供するために使用できます (たとえば、補助アダプタのパラメータを既存のアダプタベースの SOAP タスクに提供するなど)。この規則の例外として、タスクベースのタグライブラリに param というタグがすでに含まれている場合があります。この状況では、param タスクが優先され、ネストされている param タグをそのタグライブラリ内で使用することはできません。
タスクのルートにおけるタグライブラリの構成
タスクベースのタグライブラリを構成する主な方法には 2 つあります。1 つは、単にタスクのルート内にタグを格納するためのサブディレクトリを作成し、タグライブラリを使用するときに、そのディレクトリのパス (タスクのルートを基準とする相対パス) を URI 形式で指定する方法です。以下に例を示します。
<%@taglib uri="/ext/myorg/tags" prefix="my"%>
...
<my:myTag hardCoded="true" required="${expression}" />
...
サブディレクトリ内の各タグは独自のタグとして使用でき、そのパラメータはそれぞれその属性として公開されます。
フェデレーションタイプ識別子を使用したタグライブラリの構成
もう 1 つは、フェデレーションタイプ識別子を使用して Info*Engine タスクのタグライブラリを構成する方法です。この場合、タグが関連付けられているタイプ識別子を URI 属性の値として指定します。この構成方法には、タグでフェデレーションと階層クライミングを使用できるという利点があります。階層クライミングを使用する場合は、タスク委任で提供される入力に応じて、タグライブラリ内の特定のタグを複数のタスクにマッピングできます。このメカニズムを使用する場合は、すべてのタグで、暗黙的に、タスク委任を実行するために使用される入力グループを呼び出し元が指定できるようにする input 属性を使用できます (input 属性をすでに明示的に定義しているタグは例外)。入力グループの Unique Federation Identifier (UFID) とフェデレーションタイプ識別子の両方が明示的に指定されていなければ暗黙的に修飾されます。
必要に応じて、タスクのコンテキスト内でタイプ階層クライマの実装をオーバーライドできます。タスク委任の前に、フェデレーションタイプ識別子の ._ に置き換え、_climber (たとえば wt_fc_Persistable_climber) を追加し、クライマのクラス名をタスクレットコンテキストに配置することで、キーを作成できます。その結果、クライマの実装の新しい値がタスクレットコンテキストで検出され、タスク委任中に使用されます。デフォルトでは、Windchill のタイプ階層クライマが使用されます。これは、大半の使用状況に適しています。これの例については、Dispatch-Tasksを参照してください。
1 つの例として、wt.part.WTPart に関連付けられている create メソッドを作成したとすると、これは以下のように呼び出されます。
<%@taglib uri="wt.part.WTPart" uri="prt" %>
...
<prt:create name="myPart" />
...
ただし、前述のように、このメカニズムは、タイプ階層とともに使用されたほうが効果的であり、これによりタスクに適切な委任が動的に検出されるだけではなく、適切なシステムへのルーティングも行われます。以下に例を示します。
<%@page language="java"%>
<%@taglib uri="http://www.ptc.com/infoengine/taglib/core" prefix="ie"%>
<%@taglib uri="/org/myorg/util/" prefix="util"%>
<%@taglib uri="http://www.ptc.com/infoengine/taglib/log" prefix="log"%>
<%@taglib uri="/com/infoengine/tlds/iejstl.tld" prefix="c"%>
<%@taglib uri="WCTYPE|wt.fc.Persistable" prefix="obj"%>
...
<!-- create a document in two systems (assumed tag implementations) -->
<util:query type="wt.org.WTPrincipal"
where="uid='${@SERVER[0]auth-user[0]}'"
attribute="name,cabinetRef" groupOut="me" />
<!-- create the task delegate input -->
<ie:webject name="Create-Group" type="GRP">
<ie:param name="ELEMENT"
data="CLASS=wt.doc.WTDocument~name=${@FORM[]docName[]}~folderingInfo.cabinet=${me[0]cabinetRef[0]}"/>
<ie:param name="DELIMITER" data="~" />
<ie:param name="GROUP_OUT" data="doc"/>
</ie:webject>
<!-- create the document in this system -->
<log:debug message=”creating document ${doc[0]name[0]} locally” />
<obj:Create input=”${doc}” />
<!-- create the document in another system -->
<log:debug message=”creating document ${doc[0]name[0]} remotely” />
<c:set var=”${doc[0]obid}” value=”@otherdomain.myorg.org” />
<obj:Create input=”${doc}” />
...
* 
上述のタグのいくつかは、実際には存在せず、ここでは説明に使用することのみを目的としています。