Oracle® Fusion Middleware Oracle Business Process Management Business Process Composerユーザーズ・ガイド 11gリリース1 (11.1.1.9) B61410-09 |
|
![]() 前 |
![]() 次 |
この付録では、Microsoft VisioおよびXPDLプロセスを変更してBPMNに変換しやすくする方法について説明します。
この付録には次の項が含まれます:
VisioファイルをBusiness Process Composerにインポートできます。Business Process Composerは、VisioMasterMap.xmlというマップファイルを使用して、Visioの要素をBPMNフロー・オブジェクトにマップします。
このマップ・ファイルでは、Visioの各要素がBPMNフロー・オブジェクトにどのようにマップされるかを定義します。このマップ・ファイルは、Oracle JDeveloperホーム・ディレクトリの次のディレクトリにあります。
.../jdeveloper/jdev/extensions/tutor/xml.
注意: このファイルは編集しないでください。このファイル内のマッピングをオーバーライドするには、VisioUserMap.xmlというファイルを作成して編集します。 |
ユーザー・マップは、マスター・マップを拡張したりオーバーライドするために使用します。VisioMasterMap.xmlの解析後、Business Process ComposerはVisioUserMap.xmlが存在するかどうかを調べます。その後、ルールを適宜変更します。
Visioインポート・モジュールは、拡張性を提供できるように設計されています。別のVisioステンシルをサポートするXMLファイルを追加して、追加のVisioマスター・シェイプとBPMNオブジェクトのマッピングを指定できます。このファイルはVisioUserMap.xmlという名前で、VisioMasterMap.xmlファイルと同じディレクトリに置く必要があります。
このファイルには、VisioMasterMap.xmlファイルで定義されているデフォルトと同じルート要素(VisioMasterMap.xsdへの参照など)が含まれている必要があります。VisioUserMap.xmlは、参照用として使用可能なマスター・マップと同じ形式である必要があります。
ユーザー・マップに追加されたエントリでは、新規マッピングを追加したり、メイン・マップの既存エントリのオーバーライドを行います。VisioUserMap.xmlには、拡張されるエントリまたはオーバーライドされるエントリのみが含まれている必要があり、元のすべてのエントリを繰り返すことはできません。
例E-1 VisioUserMap.xmlへのサンプル・エントリ
<?xml version = '1.0' encoding = 'UTF-8'?> <Masters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oracle.com/oracle/tutor/visio/masterMapElements VisioMasterMap.xsd" xmlns="http://www.oracle.com/oracle/tutor/visio/masterMapElements"> <!— custom <Master/> elements go here -- > </Masters>
この項では、VisioファイルをBPMNプロセスにインポートする場合に考えられるシナリオについて説明します。
VisioUserMap.xmlを更新するには:
この例では、元のVisioファイルには「Report」という名前の形状が含まれており、この形状をデータ・オブジェクトにマップします。デフォルトでは、VisioMasterMap.xmlは、この形状を送信タスクにマップします。それを入力オブジェクトまたは出力オブジェクトとして厳密に使用すると、それをより正確にデータ・オブジェクトにマップできます。
VisioMasterMap.xmlファイルで、次のように表示されるDataObjectのマスター定義を検索します。
<Master Name="data object"> <BPMNObject>DataObject</BPMNObject> </Master>
この定義の後に、Like属性を使用して最初の定義をクローニングし追加のVisioオブジェクトをマップする、一連の追加のマスター要素が続きます。
<Master Name="sequential data" Like="data object"/> <Master Name="data" Like="data object"/>
VisioのReport要素のマッピングを追加または変更するには、VisioUserMap.xmlファイルに次のコードを追加します。
<Master Name=”Report” Like=”data object”/>
例E-2は、Extends属性を使用して、追加または異なる属性とともに既存のBPMNオブジェクトにオブジェクトがどのようにマップされるかを示しています。
例E-2 Extends属性を使用したBPMNオブジェクトへのVisioオブジェクトのマッピング
<Master Name="flow"> <BPMNObject>SequenceFlow</BPMNObject> </Master> <Master Name="conditional flow" Extends="flow"> <Attributes> <Attribute Name="ConditionType" Value="Expression"/> </Attributes> </Master>
上の例では、Visioオブジェクトのconditional flowがBPMNフロー・オブジェクトのSequenceFlowにマップされますが、属性ConditionTypeが値Expressionで追加されています。
<BPMNObject>要素の有効な値は次のとおりです。
タスク
サブプロセス
イベント
ゲートウェイ
DataObject
グループ
注釈
レーン
プール
MessageFlow
SequenceFlow
アソシエーション
Null
注意: Null値をVisioの要素に割り当てると、BPMNフロー・オブジェクトは作成されません。 |
次の表は、BPMNフロー・オブジェクトの基本的なBPMNタイプに基づいた、BPMN属性の有効な値を示しています。
タスクの属性と値
表E-1はBPMNタスクの有効な属性と値を示しています。
表E-1 タスクの属性と値
属性 | 値 |
---|---|
TaskType |
None、Script、Reference、Service、User、Manual、Send、Receive |
LoopType |
Standard、MultiInstance |
isForCompensation |
true、false |
サブプロセスの属性と値
表E-2はBPMNサブプロセスの有効な属性と値を示しています。
表E-2 サブプロセスの属性と値
属性 | 値 |
---|---|
isExpanded |
true、false |
isATransaction |
true、false |
LoopType |
Standard、MultiInstance |
isForCompensation |
true、false |
AdHoc |
true、false |
イベントの属性と値
表E-3はBPMNイベントの有効な属性と値を示しています。
表E-3 イベントの属性と値
属性 | 値 |
---|---|
EventType |
Start、Intermediate、End |
Trigger |
Trigger None、Message、Timer、Conditional、Signal、Multiple、Error、Cancel、Compensation、Link、Terminate |
ゲートウェイの属性と値
表E-4はBPMNゲートウェイの有効な属性と値を示しています。
表E-4 ゲートウェイの属性と値
属性 | 値 |
---|---|
GatewayType |
Parallel、Inclusive、Exclusive、Complex |
ExclusiveType |
Event、Data |
MarkerVisible |
true、false |
シーケンス・フローの属性と値
表E-5はBPMNシーケンス・フローの有効な属性と値を示しています。
アソシエーションの属性と値
表E-6はBPMNデータ・オブジェクトの有効な属性と値を示しています。
プールの属性と値
表E-7はBPMNプールの有効な属性と値を示しています。
多くの場合、ソースからターゲットへのモデルの変換は一般的な変換ルールに従い、ガイドラインと制約があります。XPDL文書をインポートして望ましくない結果が生じた場合、Business Process Composerが期待している形式とXPDL文書の形式が一致していない可能性があります。このような場合は、XSLT変換を使用すると元のXPDLダイアグラムと変換後のBPMNプロセスの間の一致を向上させることができます。
次の項では、Oracle BPM変換の出力を変更するためのXSLスタイルシートを組み込む場合に推奨される手順について説明します。Oracle BPMには、XSLT開発者への例として役立ついくつかのXSLTファイルが同梱されています。
XSL文書を使用してXPDLのインポートをカスタマイズするには:
Business Process Composerでは、データがBPMNに渡される前に、XSLT変換を使用してXPDLファイルを解析し、一致する形式を生成します。この変換を行うとき、Business Process ComposerはXPDLドキュメントに関連する変換ファイルを検索します。
通常、XPDLファイルにはベンダー名を提供する<Vendor/>要素が含まれています。ベンダーの名前とXSLファイルへのパスをXSLFilePaths.xmlに追加することで、ベンダー名が検索され、関連する変換ファイルのパスが特定されます。
ファイル・パスが索引ファイルから取得され、Business Process ComposerはXSLT変換をXPDLファイルに適用します。
カスタムのXSLTファイルを作成します。
XMLエディタを使用して、新しいXSLTファイルを作成します。XSLTファイルは、XSLFilePaths.xmlを含むXMLディレクトリに置く必要があります。
インポートしているXPDLを開き、<PackageHeader/>要素の下で<Vendor/>要素を探して、その値を書き留めます。
たとえば、XPDLが次のような場合:
<Package xmlns="http://www.wfmc.org/2004/XPDL2.0alpha" Id="6" Name="Untitled Document 6"> <PackageHeader> <Vendor>Global 360</Vendor> … </PackageHeader> … </Package>
Vendor要素の値はGlobal 360になります。
XSLFilePaths.xmlファイルを探します。
このファイルは、JDeveloperインストール・ディレクトリの下で次のようにネストされているXMLという名前のフォルダにあります。
<JDeveloper_Home>\jdeveloper\jdev\extensions\tutor\xml
新しい<XSLFilePath/>要素と、ベンダーの名前を含むVendor属性を追加し、XSLTファイルの相対パスを次の例のように指定します。
<XSLFilePaths xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="filesPaths PatchFilesPaths.xsd" xmlns="filesPaths"> … <XSLFilePath Vendor=”Global 360”>Global360Patch.xsl</XSLFilePath> </XSLFilePaths>
注意: この例では、ファイル名のGlobal360Patch.xslに追加のパス情報がありません。Business Process Composerは、XSLFilePaths.xmlファイルが含まれるフォルダと同じフォルダ内でこのファイルを検索します。追加のパス情報がある場合には、Business Process Composerは\xmlフォルダからの相対パスでファイルを検索します。 |
XPDLファイルをOracle BPMにインポートします。ファイルはカスタムXSLTファイルで指定したルールに従って変換および処理されます。
インポートしているXDPLファイルがXPDL 2.1に準拠していなかったりOracle BPMで必要とされる要素が欠落している可能性がある場合は、XSLTを使用して変換をカスタマイズできます。カスタムXSLTを組み込んで最適な結果を得る方法については、E.1項「BPMNプロセスとしてインポートするためのVisioファイルの準備」を参照してください。
この項では、XPDLファイルをインポートするときに発生する一般的な状況に対処するための様々なXSLTテンプレートのサンプルを示します。
この付録で説明しているファイルは、Oracle Tutorインストール・ディレクトリのXMLという名前のディレクトリにあります。これらは、JDeveloperインストール・ディレクトリの次の場所にあります。
<Jdeveloper_Home>/jdeveloper/jdev/extensions/tutor/xml.
ビジネス・プロセスをOracle BPMにインポートするときに適用する要件を次に示します。
Oracle BPMで、XPDL 2.1ファイルのインポートがサポートされている。次のネームスペースがXPDLソース・ドキュメントのルート要素にデフォルト・ネームスペースとして存在する必要があります。
http://www.wfmc.org/2008/XPDL2.1
インポートの対象となるXPDLソース・ファイルがXPDL 2.1に準拠していない場合は、XSLT変換を実行してOracle BPMにインポートするための正しいXPDL形式を生成する必要があります。次の項で、これらの変換を作成するための情報について説明します。
XPDLをインポートするときは、XSLTにおけるネームスペースの処理について理解している必要があります。Oracle BPMで使用されるデフォルト・ネームスペースは次のとおりです。
http://www.wfmc.org/2008/XPDL2.1
場合によっては、ソース・ファイルがXPDL 2.1に準拠していても、Oracle BPMが必要とする要素が欠落している場合があります。この場合、XSLTを使用してそうした要素を追加することができます。
XPDLドキュメントに異なるデフォルト・ネームスペースが含まれている場合、インポート時に要素と属性はXPLD 2.1に準拠しているものとして扱われます。これでは不十分な結果となる可能性が高くなります。XPDL 2.1に準拠しないXPDLソース・ドキュメントは、XSLを介して有効なXPDL 2.1形式に変換する必要があります。
次のようなシナリオが考えられます:
ソースXPDLの要素はデフォルト・ネームスペースを使用し、XPDL 2.1に準拠しています。
ソースXPDLの要素はデフォルト・ネームスペースに存在しますが、XPDL 2.1に準拠していません。
ソースXPDLの要素はデフォルト・ネームスペースに存在せず、XPDL 2.1に準拠していない。
ソースXPDLの要素はデフォルト・ネームスペースに存在しませんが、XPDL 2.1に準拠しています。
例E-3は、ソース文書のローカル・ネームスペースを使用して記述された要素を、結果文書のデフォルト・ネームスペースにコピーするXSLを示しています。
注意: ローカル・ネームスペースはスタイルシートのルート要素に追加されています。ソースXPDL文書の要素と一致する場合は、ローカル・ネームスペースの接頭辞が一致している必要があります。この例ではANY_LOCAL_NAMESPACEを使用しています。 |
例E-3 ローカル・ネームスペースの要素のデフォルト・ネームスペースへのコピー
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:ANY_LOCAL_NAMESPACE = "http://www.someURI" > <xsl:output method = "xml" indent = "yes"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match = ”ANY_LOCAL_NAMESPACE:Activity”> ………… </xsl:template> </xsl:stylesheet>
XPDL文書には、相対または絶対として定義されるオブジェクト座標が含まれる場合があります。絶対座標を使用したXPDL文書では、すべての座標が絶対座標としてインポートされます。
相関座標を使用してXPDL文書をOracle BPMにインポートする場合、次の条件に注意する必要があります。
プール座標は絶対座標である
レーン座標は親プールに対する相対座標である
サブプロセスに含まれないノード座標は、絶対座標である
埋込みサブプロセス(拡張または縮小)に含まれるノード座標は、サブプロセスの左上隅に対する相対座標である
サブプロセスに含まれるノードを接続するシーケンス・フロー・パス座標は、サブプロセスの左上隅に対する相対座標である
その他すべてのフローは絶対座標である
相関座標を含むXPDL文書は、上述の条件を満たすために変換する必要があります。次の情報は、必要に応じて座標を相関から絶対に、またはその逆に変換する場合に役立ちます。
プール座標
プール座標は絶対座標である必要があります。プールに指定された座標が相対座標の場合、Business Process Composerはそれぞれ互いに重複するすべてのプールをレンダリングします。Business Process Composerは、プールが絶対座標で構成されるものと想定します。これをオーバーライドするには、プール座標を絶対座標に変換します。
レーン座標
レーン座標は親プールに対する相対座標である必要があります。場合によっては、レーンに絶対座標が含まれていて、モデルには相対座標が含まれていることがあります。この場合、レーン座標は次のように変換することができます。レーンのX座標は、レーンのX座標と親プールのX座標との差異とみなされます。同じロジックがY座標にも適用されます。
次のXSLの例は、この変換の実行方法について示しています。
<xsl:template match = "xpdl2:Lane/xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates"> <xsl:copy> <xsl:copy-of select = "@*[name() != 'XCoordinate' and name() != 'YCoordinate']"/> <xsl:attribute name = "XCoordinate"> <xsl:value-of select = ”ancestor::xpdl2:Pool/xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates/@XCoordinate - @XCoordinate"/> </xsl:attribute> <xsl:attribute name = "YCoordinate"> <xsl:value-of select = "ancestor::xpdl2:Pool/xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates/@YCoordinate - @YCoordinate"/> </xsl:attribute> <xsl:apply-templates/> </xsl:copy> </xsl:template>
サブプロセスに含まれないノード座標
サブプロセスに含まれないノード座標は、絶対座標である必要があります。ノード座標が親レーンまたはプールを基準とした相対座標である場合は、これらのノード座標を絶対座標に変換します。親プールを基準とした相対座標であるアクティビティの座標は、そのプール座標をアクティビティ座標に追加することによって絶対座標に変換できます。親レーンを基準とした相対座標であり、親プールを基準とした相対座標であるアクティビティの座標は、アクティビティ、親レーンおよび親プールの座標の合計をアクティビティ座標に割り当てることによって、絶対座標に変換できます。
次の例は、アクティビティ座標が親レーンに対する相対座標で、レーン座標が、プール座標が絶対座標である親プールに対する相対座標である場合の、アクティビティ座標の計算方法について示しています。
<xsl:template match="xpdl2:Activity/xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates"> <xsl:copy> <xsl:copy-of select="@*[name()!='YCoordinate' and name()!='XCoordinate']"/> <xsl:variable name="LaneId"> <xsl:value-of select="ancestor::xpdl2:NodeGraphicsInfo/@LaneId"/> </xsl:variable> <xsl:variable name="PoolId"> <xsl:value-of select="//xpdl2:Lane[@Id=$LaneId]/ancestor::xpdl2:Pool/@Id"/> </xsl:variable> <xsl:attribute name="YCoordinate"> <xsl:value-of select="//xpdl2:Pool[@Id=$PoolId]/xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates/@YCoordinate + //xpdl2:Lane[@Id=$LaneId]//xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates/@YCoordinate + @YCoordinate"/> </xsl:attribute> <xsl:attribute name="XCoordinate"> <xsl:value-of select="//xpdl2:Pool[@Id=$PoolId]/xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates/@XCoordinate + //xpdl2:Lane[@Id=$LaneId]//xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates/@XCoordinate + @XCoordinate"/> </xsl:attribute> </xsl:copy> </xsl:template>
埋込みサブプロセスに含まれるノード座標
(拡張または縮小する)埋込みサブプロセス内のノード座標は、そのサブプロセスの左上隅を基準とした相対座標である必要があります。サブプロセスの子ノードでは、座標は親サブプロセスを基準とした相対座標です。サブプロセスの子ノードの座標が親サブプロセスを基準とした相対座標でない場合は、座標が親レーンを基準とした相対座標なのか、それとも親プールを基準とした相対座標なのか特定する必要があります。ノード座標をサブプロセスを基準とした相対座標にするには、適切なサブプロセス座標をノード座標から減算して、結果となる値をノード座標に割り当てます。サブプロセスの子ノードの座標を計算するサンプルのスタイルシート・テンプレートを下に示します。このテンプレートは、子ノード座標がサブプロセスを基準とした相対座標ではない場合に機能します。
<xsl:template match = "xpdl2:ActivitySet/xpdl2:Activities/xpdl2:Activity/xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates"> <xsl:variable name = "ActivitySetId"> <xsl:value-of select = "ancestor::xpdl2:ActivitySet/@Id"/> </xsl:variable> <xsl:copy> <xsl:copy-of select = "@*[name() != 'XCoordinate' and name() != 'YCoordinate']"/> <xsl:attribute name = "XCoordinate"> <xsl:value-of select = "@XCoordinate – //xpdl2:Activity[@Id = $ActivitySetId]/xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates/@XCoordinate"/> </xsl:attribute> <xsl:attribute name = "YCoordinate"> <xsl:value-of select = "@YCoordinate – //xpdl2:Activity[@Id = $ActivitySetId]/xpdl2:NodeGraphicsInfos/xpdl2:NodeGraphicsInfo/xpdl2:Coordinates/@YCoordinate"/> </xsl:attribute> </xsl:copy> </xsl:template>
シーケンス・フロー・パス座標
サブプロセスに含まれるノードを接続するシーケンス・フロー・パス座標は、サブプロセスの左上隅に対する相対座標である必要があります。
XSL変換では、シーケンス・フロー・パス座標がサブプロセスを基準とした相対座標であるかどうかを調べる必要があります。そうでない場合は、サブプロセスの左上隅に対する相対座標に変換します。
単純なプログラム論理を使用して、相対座標に変換することができます。このようなロジックは、シーケンス・フロー・パス座標からサブプロセス座標を減算します。その他すべてのフローは絶対座標である必要があります。
またXSLコードで、座標が相対座標であるか絶対座標であるかを確認する必要があります。絶対座標でない場合には、変換します。変換するには、親プール座標をフロー座標に追加するロジックを含んでおり、これらの値をフロー座標に割り当てるスタイルシートのテンプレートをインクルードします。座標が親プールまたは親レーンを基準とした相対座標である場合は、次について注意することが重要です。
シーケンス・フローが親プールに対する相対座標である場合は、プール座標をフロー座標に追加します。
シーケンス・フローが親レーンを基準とした相対座標である場合は、親プール座標と親レーン座標をフロー座標に追加します。
XPDLファイルを解析するために、Business Process Composerによって2つの拡張属性が使用されます。これらの拡張属性はオプションですが、フローに相対座標が使用されているXPDLドキュメントを操作する場合に非常に役立ちます。それらの属性は次のとおりです。
redrawConnections
isRelativeObjectCoordinates
これらの拡張属性は標準のXPDL要素ではありませんが、フロー座標を相対座標から絶対座標に、または絶対座標から相対座標に変換するのに必要な作業量を軽減するために使用することができます。<ExtendedAttributes>要素はXPDL文書の多くの要素内で見つかりますが、Oracle BPMは<Package/>要素の下で検索します。<ExtendedAttributes>要素は、Oracle BPMによって見つけられるように、<Package/>要素の下に配置してください。
この属性をtrueに設定すると、Oracle BPMは元の座標を使用するかわりにフロー接続を再描画できます。これは、フローの座標を相対座標または絶対座標に変換する必要がある場合に便利です。フローの座標を相対座標または絶対座標に変換することが難しい場合は、この属性をtrueに設定すると、Oracle BPMはフローの座標を再作成できます。
この属性がtrueに設定されていると、座標を絶対座標または相対座標に変換する必要がありません。Oracle BPMはフローの元の座標を考慮せず、フローに最適な座標を作成します。
ExtendedAttributeがXPDLファイルに含まれていない場合、またはfalseに設定されている場合には、Oracle BPMは元の座標を使用します。
したがって、この属性の使用は、元のモデルのレイアウトの保持が開発時間の短縮よりも重要でない場合に検討する必要があります。
例E-4はこの属性の設定方法について示しています。
例E-4 redrawConnectionsを処理する場合のExtendedAttributeの設定
<xsl:template match="xpdl:Package/xpdl:ExtendedAttributes"> <xsl:copy> <xsl:copy-of select="@*"/> <xpdl:ExtendedAttribute Name="redrawConnections" Value="true"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="xpdl:Package"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:if test="not(child::xpdl:ExtendedAttributes)"> <xpdl:ExtendedAttributes> <xpdl:ExtendedAttribute Name="redrawConnections" Value="true"/> </xpdl:ExtendedAttributes> </xsl:if> <xsl:apply-templates/> </xsl:copy> </xsl:template>
上のテンプレートでは、redrawConnectionsというExtendedAttributeが<ExtendedAttributes/>要素に< Package/>の子として追加されています。
拡張属性isRelativeObjectCoordinatesは、XPDLファイルのオブジェクト座標が相対座標であるか絶対座標であるかをOracle BPMに通知するために使用されます。
ソースXPDLファイルですべてのオブジェクト座標が絶対形式で示されている場合、すべての座標がダイアグラムの左上隅の(0,0)地点から測定されます。この属性を使用する必要があり、値はfalseに設定されます。
この拡張属性をtrueに設定すると、ソースXPDLファイルのすべての座標は相対座標であり、前述したOracle BPMの相対座標のルールに従っていることがOracle BPMに通知されます。
デフォルトでは、Oracle BPMは、入力ドキュメントのすべての座標が前述したOracle BPMの相対座標のルールに従っているものとみなします。この属性をtrueに設定したり省略する場合は、すべての座標が相対座標のルールを満たしていることを確認してください。それ以外の場合は、テンプレートをスタイルシートにインクルードして相対座標のルールに従うようにする必要があります。
例E-5は、次に示される<Package/>要素の子である<ExtendedAttributes/>要素に<ExtendedAttribute/>要素を含める方法について示しています。
例E-5 ExtendedAttributes要素にExtendedAttributeを含める
<xsl:template match="xpdl21:Package/xpdl21:ExtendedAttributes"> <xsl:copy> <xsl:copy-of select="@*"/> <xpdl21:ExtendedAttribute Name="isRelativeObjectCoordinates" Value="false"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="xpdl21:Package"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:if test="not(child::xpdl21:ExtendedAttributes)"> <xpdl21:ExtendedAttributes> <xpdl21:ExtendedAttribute Name="isRelativeObjectCoordinates" Value="false"/> </xpdl21:ExtendedAttributes> </xsl:if> <xsl:apply-templates/> </xsl:copy> </xsl:template>
Oracle BPMでは、ソースXPDLファイルのすべてのグラフィカル要素は、その可視性がfalseに設定されている場合でも表示要素とみなされます。したがって、以前は非表示になっていた要素が変換後のBPMNプロセスでは表示されているという違いが見つかることがあります。
この問題を解決するには、これらの要素をXPDLから、例E-6で示すように、XSLスタイルシート・テンプレートを使用して削除する必要があります。
例E-6 非表示要素の削除
<xpdl:Activity Name="ProcessGroup" Id="ProcessGroup"> <xpdl:NodeGraphicsInfos> <xpdl:NodeGraphicsInfo ToolId="XYZ" LaneId="PMCoE" IsVisible="false"> <xpdl:Coordinates XCoordinate="7740.0" YCoordinate="80.0"/> </xpdl:NodeGraphicsInfo> </xpdl:NodeGraphicsInfos> ………………….. </xpdl:Activity>
この例では、アクティビティの可視性をfalseに設定しても、このモデルをOracle BPMにインポートすると、このアクティビティは依然として表示されます。非表示要素を削除するには、それらを削除するためのテンプレートをスタイルシートに追加してください。
例E-7は非表示アクティビティの削除方法について示しています。
例E-7 非表示アクティビティの削除
<xsl:template match="xpdl:Activity"> <xsl:variable name="isVisible"> <xsl:choose> <xsl:when test="xpdl:NodeGraphicsInfos/xpdl:NodeGraphicsInfo/@IsVisible = 'false'"> <xsl:text>false</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>true</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="$isVisible = 'true'"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:if> </xsl:template>
方向は多くのXPDL文書で見つかる属性で、モデルの方向を指定します。この属性にはHORIZONTALまたはVERTICALの値を指定する必要があります。一部のツールで生成されたXPDL文書には、モデルが実際には垂直方向または水平方向であっても水平方向とみなす座標が含まれている場合があります。
モデルの方向に関して、モデルに適切な座標が含まれていることを確認してください。モデルに不適切な座標が含まれている場合には、座標を入れ替えるためのテンプレートをスタイルシートに追加してください。
モデルの方向属性は、Oracle BPMがプールやレーンのディメンションを計算する(このドキュメントの後半で説明)ためにも重要です。方向属性は、プール要素内で見つかることがあります。この属性がXPDLドキュメントに見つからない場合、Oracle BPMでは、モデルは水平方向であるとみなされます。
方向属性がツール固有のネームスペースに存在する場合は、方向属性をプール要素に作成して、それらの値をツール固有のネームスペースにある属性に設定することによって、Oracle BPMで利用できるようにする必要があります。
例E-8はプールの方向の設定方法について示しています。このテンプレートではプールの方向を見つけようとしています。見つからない場合は、方向属性はHORIZONTALに設定されます。
例E-8 プールの方向の設定
<xsl:template match="xpdl:Pool"> <xsl:variable name="orientation"> <xsl:choose> <xsl:when test="not(@Orientation)"> <xsl:text>HORIZONTAL</xsl:text> </xsl:when> <xsl:otherwise> <xsl:value-of select="@Orientation"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:attribute name="Orientation"> <xsl:value-of select="$orientation"/> </xsl:attribute> <xsl:apply-templates/> </xsl:copy> </xsl:template>
<BlockActivity/>要素および<Subflow/>要素のビュー属性は、サブプロセスが拡張サブプロセスか縮小サブプロセスかを指定します。Oracle BPMでは、サブプロセス要素のデフォルト・ビュー・タイプをCOLLAPSEDと想定しています。したがって、モデルに拡張サブプロセス要素が含まれていても、XPDLファイルでビュー・タイプが指定されていない場合には、Oracle BPMはこの要素を縮小サブプロセス要素とみなします。
注意: XPDLファイルのサブフロー要素は子要素も一緒にOracle BPMにレンダリングすることはできないため、サブフロー要素のみがインポートされたモデルで見つかります。サブプロセスはビュー・タイプによって識別することができます。サブフローが拡張サブフローの場合には、Oracle BPMはこの要素を拡張サブフロー要素とみなします。 |
次の例では、ビュー・タイプが指定されていない<BlockActivity/>要素と<Subflow/>要素が示されています。Oracle BPMによる対応する解釈の結果、縮小サブプロセスとなります。
<xpdl2:BlockActivity ActivitySetId="_gJ5DQeE3Ed6tmt0cZVxmlA"/> <xpdl2:SubFlow Id="_swKUEGyzEd6oxIP3ZfQL-g" PackageRef="ProcessPackage"/>
ビュー属性が<BlockActivity>要素に見つからない場合は、ツール固有のネームスペースに存在している可能性があります。その場合には、<BlockActivity>要素または<Subflow>要素にビュー属性を作成するためのテンプレートをXSLに含めてください。
例E-9は、ビュー属性を<Subflow>要素に追加するのに使用するスタイルシートを示しています。
例E-9 サブフロー要素へのビュー属性の追加
<xsl:template match="xpdl21:SubFlow"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:attribute name="View"> <xsl:choose> <xsl:when test="ancestor::xpdl21:Activity/xpdl21:NodeGraphicsInfos/xpdl21:NodeGraphicsInfo/@Expanded='false'"> <xsl:text>COLLAPSED</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>EXPANDED</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:copy> </xsl:template>
例E-10は、ビュー属性を<BlockActivity>要素に追加するスタイルシートのサンプル・テンプレートを示しています。このテンプレートは、Oracle Business Process Management Studioで生成されたXPDLファイルで機能します。また、このテンプレートでは、ツール固有のネームスペースからビュー属性の値にアクセスして、<BlockActivity>要素にビュー属性を作成する方法も示しています。
例E-10 BlockActivity要素へのビュー属性の追加
<xsl:template match="xpdl:Activity/xpdl:BlockActivity"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="ancestor::xpdl:Activity/xpdl:Extensions/albpm:ALBPMExtensions/albpm:FeatureSet/albpm:BooleanFeature[@ name='collapsed']/@value='true'"> <xsl:attribute name="View"> <xsl:text>COLLAPSED</xsl:text> </xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:attribute name="View"> <xsl:text>EXPANDED</xsl:text> </xsl:attribute> </xsl:otherwise> </xsl:choose> <xsl:apply-templates/> </xsl:copy> </xsl:template>
一部のツールでは、アクティビティに提供される座標がアクティビティ・オブジェクトの左上隅に指定されているのに対し、他のツールでは、座標がアクティビティ・オブジェクトの中心に基づいています。これらの座標はオブジェクト・ピンとして機能します。
アクティビティの中心にオブジェクト・ピンを含むXPDL文書をOracle BPMにインポートする場合、期待する位置と異なる位置でアクティビティが発生する可能性があります。これは、アクティビティのオブジェクト・ピンが中心にあるのに対し、Oracle BPMではオブジェクト・ピンが左上隅にあることを期待しているためです。この矛盾を解決するには、アクティビティ座標を再計算する必要があります。
このような座標の計算は、アクティビティの幅の半分をX座標から減算し、アクティビティの高さの半分をY座標から減算するなどの単純な論理を使用して行うことができます。
例E-11は、この再計算を行うスタイルシートのテンプレートを示しています。このテンプレートは、アクティビティに幅、高さ、X座標およびY座標が指定されている場合にのみ有効であることに注意してください。
例E-11 オブジェクト・ピンの位置の再計算
<xsl:template match = "xpdl:Activity/xpdl:NodeGraphicsInfos/xpdl:NodeGraphicsInfo/xpdl:Coordinates"> <xsl:copy> <xsl:copy-of select = "@*[name() != 'XCoordinate' and name() != 'YCoordinate']"/> <xsl:attribute name = "XCoordinate"> <xsl:value-of select = "@XCoordinate - ancestor::xpdl:NodeGraphicsInfo/@Width div 2 "/> </xsl:attribute> <xsl:attribute name="YCoordinate"> <xsl:value-of select = "@YCoordinate - ancestor::xpdl:NodeGraphicsInfo/@Height div 2"/> </xsl:attribute> <xsl:apply-templates/> </xsl:copy> </xsl:template>
ツールの中には、XPDLファイルにアクティビティの高さと幅が提供されていないものがあります。ただし、XPDLファイルをOracle BPMにインポートするには、アクティビティの座標とディメンションが必要です。したがって、アクティビティおよびレーンの高さと幅を設定するテンプレートをXSLスタイルシートに追加してください。XPDLファイルにアクティビティの高さと幅が含まれていない場合は、いくつかのデフォルト・ディメンションを設定します。たとえば、タスクと縮小サブプロセスには幅が80で高さが40、イベントとゲートウェイには幅が30で高さが30を設定します。
<BlockActivity>拡張要素にも別の<BlockActivity>拡張要素が含まれている場合があるため、<BlockActivity>および<Subflow>拡張要素に高さと幅を設定することが特に難しいことがあります。ここで、最も内側のBlockActivityの高さと幅を最初に計算してから、親BlockActivityの計算を行う必要があります。この再帰は、最上位の<BlockActivity>までバブル・アップする必要があります。この再帰プロセスをXSLでコーディングすることは難しい場合があります。このため、Oracle BPMは拡張サブプロセスの高さと幅を計算する機能を備えています。この機能を使用するには、XSLテンプレートを使用して、<BlockActivities>の高さと幅をそれぞれ0と0に設定してください。
例E-12は、高さと幅が定義されていないイベント要素です。
例E-12 高さと幅が定義されていないイベント要素
<xpdl:Activity Name="Begin" Id="Begin"> <xpdl:Event> <xpdl:StartEvent Trigger="None"/> </xpdl:Event> …………………………….. <xpdl:NodeGraphicsInfos> <xpdl:NodeGraphicsInfo LaneId="Accounting" IsVisible="true"> <xpdl:Coordinates XCoordinate="36.0" YCoordinate="110.0"/> </xpdl:NodeGraphicsInfo> </xpdl:NodeGraphicsInfos> </xpdl:Activity>
例E-13は、アクティビティの高さと幅を設定するのに使用するスタイルシートのサンプル・テンプレートを示しています。このテンプレートは、XPDL文書でアクティビティの高さと幅が指定されていない場合に使用できます。この例では、タスク要素と縮小BlockActivityにディメンション80(幅) x 40(高さ)、ルートとゲートウェイにディメンション30 x 30、拡張BlockActivityにディメンション0 x 0が設定され、Oracle BPMはこれらのBlockActivity拡張要素のディメンションを計算できるようになります。このテンプレートは、Oracle BPM Studio XPDLファイルの場合に機能します。
例E-13 アクティビティの高さと幅の設定
<xsl:template match = "xpdl:Activity/xpdl:NodeGraphicsInfos/xpdl:NodeGraphicsInfo"> <xsl:variable name = "activityType"> <xsl:choose> <xsl:when test = "ancestor::xpdl:Activity/xpdl:Implementation/xpdl:SubFlow"> <xsl:text>SubFlow</xsl:text> </xsl:when> <xsl:when test = "ancestor::xpdl:Activity/xpdl:Implementation"> <xsl:text>Task</xsl:text> </xsl:when> <xsl:when test = "ancestor::xpdl:Activity/xpdl:Event"> <xsl:text>Event</xsl:text> </xsl:when> <xsl:when test = "ancestor::xpdl:Activity/xpdl:Route"> <xsl:text>Route</xsl:text> </xsl:when> <xsl:when test = "ancestor::xpdl:Activity/xpdl:BlockActivity"> <xsl:choose> <xsl:when test = "ancestor::xpdl:Activity/xpdl:Extensions/albpm:ALBPMExtensions/albpm:FeatureSet/albpm:BooleanFeature[@ name = 'collapsed']/@value != 'true'"> <xsl:text>ExpandedBlockActivity</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>CollapsedBlockActivity</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:when> </xsl:choose> </xsl:variable> <xsl:copy> <xsl:copy-of select = "@*"/> <xsl:attribute name = "Width"> <xsl:choose> <xsl:when test = "$activityType = 'Task' or $activityType = 'CollapsedBlockActivity' or $activityType = ’SubFlow'"> <xsl:text>80</xsl:text> </xsl:when> <xsl:when test = "$activityType = 'Route' or $activityType = 'Event'"> <xsl:text>30</xsl:text> </xsl:when> <xsl:when test = "$activityType = 'ExpandedBlockActivity'"> <xsl:text>0</xsl:text> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:attribute name = "Height"> <xsl:choose> <xsl:when test = "$activityType = 'Task' or $activityType = 'CollapsedBlockActivity' or $activityType = ’SubFlow'"> <xsl:text>40</xsl:text> </xsl:when> <xsl:when test = "$activityType = 'Route' or $activityType = 'Event'"> <xsl:text>30</xsl:text> </xsl:when> <xsl:when test = "$activityType = 'ExpandedBlockActivity'"> <xsl:text>0</xsl:text> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:apply-templates/> </xsl:copy> </xsl:template>
多くのXPDL文書では、レーンのディメンション(高さや幅)は親プールの方向に応じて指定されます。たとえば、親プールの向きが水平方向の場合、XPDLドキュメントでレーンの幅は見つかっても、高さは見つからないことがあります。前述したように、Oracle BPMがグラフィカル要素のサイズを決定するには、レーンおよびアクティビティの高さと幅が必要です。XPDL文書にレーンの高さや幅が見つからない場合は、これらの属性が含まれているすべての要素を保持するのに十分な値に設定してください。
レーンの高さは指定されているが幅が指定されていない場合には、単純な論理を使用してレーンの幅を設定できます。X座標にアクティビティの幅を足した最大の合計を求め、この値をすべてのレーンの幅に設定します。レーンの幅がすべての要素を保持できる場合は、X座標と幅の最大合計を持つアクティビティの右境界線から引かれているレーン右境界線が見られることがあります。また、レーンをその他のオブジェクトのコンテナとして表示できるよう拡張するために、小さいパディング値を最大合計に追加することもできます。
上述の論理は、すべてのアクティビティに高さと幅の値が含まれている場合に有効です。ただし、アクティビティに高さと幅の値が含まれていない場合もあります。そのような場合、レーンの高さや幅を計算する前に各アクティビティの高さと幅を計算する必要があるため、上述の論理でXSLTを使用してレーンの幅を計算することは困難です。この問題を解決するために、Oracle BPMはレーンの高さや幅を設定する機能を備えています。
この機能を使用するには、XSLTを使用して欠落しているレーンのディメンションを0に設定してください。この機能では、レーンに1つのディメンションが指定されていると想定しています。
プールに高さと幅が指定されている場合、Oracle BPMはそれらのディメンションを使用します。これらの値が指定されていない場合は、Oracle BPMは計算を試みます。ディメンションが1つしか指定されていない場合でも、Oracle BPMは両方のディメンションを計算します。この機能を回避するには、ソースXPDL文書にプールの両方のディメンションが含まれている必要があります。
XPDLファイルで座標とディメンションが指定されている場合、Oracle BPMはそれらの値を操作せずに使用します。レーンのディメンションやサブプロセスのディメンションなど、一部のディメンションが欠落している場合は、Oracle BPMはそうしたディメンションの計算を試みます。ディメンションの計算プロセスで、Oracle BPMはモデルをより良くするためにディメンションにいくつかのパディングを追加しますが、アクティビティの周りにスペースがある場合には、このモデルは問題ありません。そうでない場合は、インポートされたモデルに、他のアクティビティまたはレーンの上部に引かれているアクティビティまたはレーンの境界線が含まれていることがあります。この問題を回避するには、アクティビティの周りにスペースを持たせるように配置してください。
複数のレーンまたはアクティビティに重複するIDを含むモデルをOracle BPMにインポートする際に、問題が発生することがあります。Oracle BPMは同じ名前で複数のレーンまたはアクティビティを作成することはできません。ソースから1つのみのレーンまたはアクティビティが作成され、その結果は元のモデルに正しく反映されません。
この問題を回避するには、一意のIDでモデル要素を作成してください。
XPDLソース文書に、Oracle BPMが適切に変換を行うのに必要な要素や属性が欠落している場合には、XSLTを使用してそうした要素や属性を追加します。
たとえば、XPDLに8つのタイプのタスクがあります。Oracle BPMがこれらのタスク・タイプを認識するためには、<Task>要素に、タスクがサービス・タスクであるか受信タスクであるかなどを指定する別の子要素が含まれている必要があります。これらの子要素が<Task>ソース要素に見つからない場合は、その<Task>要素はデフォルトの<Task>要素に変換されます。
たとえば、次に示す<Task>要素は<TaskUser>子要素を含んでいないユーザー・タスクです。したがって、Oracle BPMによってデフォルトのタスク要素とみなされます。
<Implementation> <Task /> </Implementation>
アクティビティがOracle BPMにユーザー・タスクとして識別されるには、次のように、<TaskUser>要素をタスク要素の下に追加する必要があります。
<Implementation> <Task> <TaskUser> .... </TaskUser> </Task> </Implementation>
前述のように、多くの属性がツール固有のネームスペースの下に指定されている可能性があります。タスク・タイプがXPDLネームスペースの下に見つからない場合は、ツール固有のネームスペースで検索して、それらの要素をタスク要素の下に含めるためのテンプレートをスタイルシートに追加してください。
例E-14では、自動タスク要素が検出された場合は常に、<TaskService>要素を<Task>要素の子として含める方法について説明しています。このテンプレートはOracle BPM Studioで生成されたXPDLソース・ファイルに役立ちます。
例E-14 TaskService要素をタスク要素の子として含める
<xsl:template match="xpdl:Activity/xpdl:Implementation/xpdl:Task"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:if test="ancestor::xpdl:Activity/xpdl:Extensions/albpm:ALBPMExtensions/albpm:FeatureSet/albpm:StringFeature[@name='type']/@value='AUTOMATIC' and not(child::xpdl:TaskService)"> <xpdl:TaskService/> </xsl:if> <xsl:apply-templates/> </xsl:copy> </xsl:template>
アクティビティをソース・ツールからXPDLとしてエクスポートする場合に、ソースXPDLにアクティビティを表す適切な要素が含まれていることを確認してください。たとえば、イベント・アクティビティが含まれているモデルをXPDLにエクスポートする際に、ツールがそのイベント・アクティビティに<Route>要素や<Task>要素を作成した場合、この要素を正確にイベント・アクティビティを表す要素で置き換える必要があります。
次に示すXPDL要素について考えます。アクティビティは開始イベントで、<Activity>要素の下にイベント要素ではなく<Route>要素が置かれています。このモデルをOracle BPMにインポートすると、このアクティビティはイベント・アクティビティとしてではなく、ルート・アクティビティに変換されます。
例E-15 アクティビティの正確性の確認
<xpdl:Activity Name="Group$Begin" Id="Group$Begin"> <xpdl:Route GatewayType="XOR" MarkerVisible="true"/> ………………….. </xpdl:Activitiy> The correct notation for the above element should be: <xpdl:Activity Name="Group$Begin" Id="Group$Begin"> <xpdl:Event> <xpdl:StartEvent Trigger="None"/> ………………….. </xpdl:Event> ………………………. </xpdl:Activity>
ソースXPDLでこの問題が見つかった場合は、不適切な要素を適切な要素で置き換えるためのテンプレートをスタイルシートに追加してください。