Oracle® Fusion Middleware Oracle Business Process Composerによるビジネス・プロセスの開発 12c (12.2.1.2.0) E82843-01 |
|
![]() 前へ |
この付録では、Microsoft VisioやXPDL (プロセス定義言語)をサポートするツールで作成されたプロセス・モデルのインポート結果を向上させる方法について説明します。
この付録の内容は次のとおりです。
Visioファイルは、Business Process Composerに直接インポートできます。Business Process Composerでは、VisioMasterMap.xmlとVisioUserMap.xmlというマッピング・ファイルを使用して、Visioの要素をBusiness Process Model and Notation (BPMN)のフロー・オブジェクトにマッピングします。
ただし、Visioのマッピングを変更できるのは、Oracle JDeveloper内のBusiness Process Management (BPM) Studioを使用した場合のみです。
この項では、BPM Studioに対するマッピングをカスタマイズする方法について説明します。モデルをBPM Studioにインポートした後、プロジェクトをエクスポートしてBusiness Process Composerにインポートすることにより、モデルをBusiness Process Composerに移動できます。
マッピング・ファイルでは、Visioの各要素に対応するBPMNフロー・オブジェクトが定義されています。これらのファイルは、Fusion Middlewareホーム・ディレクトリ内の次のディレクトリに保存されています。
.../soa/plugins/jdeveloper/extensions/oracle.bpm.converter.
注意:
ファイルVisioMasterMap.xmlはアップグレード中に上書きされる可能性があるため、直接編集しないでください。このファイル内のマッピングをオーバーライドするには、VisioUserMap.xmlという別のファイルを作成して編集します。
VisioMasterMap.xmlで定義されているデフォルトのマッピングを変更するには:
Microsoft Visioは、あらゆる種類の図を描画できる作図ツールです。ただし、Business Process Composerにインポートできるのはプロセス・モデルのみです。Visioには各種のプロセス・モデリング・テンプレートやステンシルが含まれており、サード・パーティからも多数提供されているため、コンバータではVisioの各図形オブジェクト(四角形、線、多角形など) から対応するBPMNシンボルへのマッピングを試みます。これには、VisioMasterMap.xmlファイルとVisioUserMap.xmlファイルが使用されます。
ステンシルからVisioの図面ページに追加された各図形には、その作成元となったマスター・オブジェクトの名前がタグ付けされています。たとえば、VisioのユーザーがTaskという名前の複数の四角形の図形をステンシルからページ上にドラッグし、名前を変更しても、各図形にはTaskというマスター名が関連付けられています。これをVisioで確認するには、メニューから「Format」→「Special」を選択します。
注意:
メニュー・アイテムの「Format」→「Special」が表示されない場合は、「Tools」→「Options」→「Advanced」を選択し、「Run in developer mode」チェック・ボックスを選択します。このオプションがある場所は、ご使用のVisioのバージョンによって異なることがあります。
図形にマスターがない場合(「Drawing」ツールバーから直接描画された単純な四角形や円などのオブジェクトがこれに該当)、コンバータは図形の「Name」フィールドを参照します。このフィールドも「Format」→「Special」ダイアログで確認できます。
その後、Oracle Business Process Composerは、VisioUserMap.xmlとVisioMasterMap.xmlで図形のマスター名と一致するエントリを検索します。たとえば、図形のマスターがTaskならば、コンバータは次のマップ・エントリを探します。
<Master Name="task"> <BPMNObject>Task</BPMNObject> </Master>
このエントリは、マスターがTaskの図形をすべてBPMNのTaskシンボルとしてインポートするようコンバータに指示しています。
注意:
マスター名は大文字と小文字が区別されません。したがって、taskはVisioのtask、TaskおよびTASKマスターと一致します。
マスター・マップ・エントリでは、追加のBPMNプロパティも定義できます。次のエントリは、VisioのgatewayというマスターをBPMNのGatewayシンボルにマッピングしていますが、BPMN属性値もいくつか設定しています。
<Master Name="gateway"> <BPMNObject>Gateway</BPMNObject> <Attributes> <Attribute Name="ExclusiveType" Value="Data"/> <Attribute Name="GatewayType" Value="Exclusive"/> <Attribute Name="MarkerVisible" Value="false"/> </Attributes> </Master>
属性は、BPMN標準の要件に基づいてテキスト、数値、またはブール値(true/false)に設定できます。
属性値を、Visio図形自体で定義されているプロパティから導出することも可能です。Visio 2010 BPMNステンシルのタスク図形に対する次のマスター・マップ・エントリでは、BPMN属性のTaskTypeとImplementationを対応する図形プロパティから設定しています。
<Master Name="Vis2010 Task" Extends="Vis2010 Activity"> <BPMNObject>Task</BPMNObject> <Attributes> <Attribute Name="TaskType" Value="Prop.BpmnTaskType" SrcType="visio" /> <Attribute Name="Implementation" Value="Prop.BpmnImplementation" SrcType="visio" /> </Attributes> </Master>
XML属性の「srcType」は、属性値の解釈の仕方をコンバータに指示します。srcTypeをvisioに設定すると、値がVisioオブジェクトの「シェイプシート」で定義されていることを示します。Visio図形のシェイプシートを表示するには、図形を選択し、「Window」→「Show ShapeSheet」を選択します。最もよく使用されるプロパティは、「Custom Properties」と「User-defined Cells」のセクションで定義されています。これらは、接頭辞のPropとUserにそれぞれ対応しています。プロパティ名は、*.vdx形式で保存したVisioファイルのXMLタグ階層から導出することもできます。
マスター・マップ・ファイルは、条件付きマッピングもサポートしています。これが有効なのは、2つの異なるVisioステンシルで同じマスター名を使用しながらも、異なるVisioプロパティを使用してBPMN属性値を格納する場合です。たとえば、次のエントリでは、TrisoTech BPMNステンシルのIntermediate Event図形がThrowingイベントかCatchingイベントかを、条件を使用して調べています。
<Master Name="Intermediate Event" Extends="Triso Object"> <BPMNObject>IntermediateCatchEvent</BPMNObject> <Conditions> <Condition Name="Direction" Value="Prop.direction" SrcType="visio" Equals="Catching" /> </Conditions> <Attributes> <Attribute Name="Trigger" Value="Prop.IntermediateEvent_trigger" SrcType="visio" /> </Attributes> </Master>
NotNull (大文字/小文字は区別されません)という特殊な条件属性を使用すると、特定のVisioプロパティの有無を検査できます。次のマスター・マップ・エントリは、マスター名がStart Eventであり、Prop.StartEvent_Trigger
というプロパティが含まれている場合に一致します。
<Master Name="Start Event"> <BPMNObject>Event</BPMNObject> <Conditions> <!-- this condition confirms that this is from Trisotech stencil --> <Condition Name="Is Triso shape" Value="Prop.StartEvent_Trigger" SrcType="visio" Equals="NotNull" /> </Conditions> <Attributes> <Attribute Name="EventType" Value="Start" SrcType="bpmn" /> <Attribute Name="Trigger" Value="Prop.StartEvent_Trigger" SrcType="visio" /> <Attribute Name="isInterrupting" Value="Prop.StartEvent_Interrupting" SrcType="visio" /> </Attributes> </Master>
同名のマスター・マップ・エントリが複数ある場合は、最初に見つかった、条件がすべて真のエントリが使用されます。どの条件付きエントリも一致しない場合は、そのマスター名に対する最初の無条件マスター・マップ・エントリが使用されます。VisioUserMap.xmlファイルが先に処理されます。したがって、一致するマスター・マップ・エントリがこのファイルにあれば、VisioMasterMap.xmlにある同名の他のエントリはすべて無視されます。
「*」という特殊なマスター・マップ・エントリ名を使用すると、すべてのマスターに一致します。これは必ず条件と一緒に使用してください。これは、図形を図に追加した後でBPMNオブジェクト・タイプを(たとえば、タスクからサブプロセスへ)変更できるVisioテンプレートで便利です。このシナリオでは、図形が別のシンボルに見えるように変更されても、図形マスターは元のマスターに設定されています。たとえば、次のエントリでは「*」ワイルドカードを使用し、図形のプロパティ値にのみ基づいてエントリと一致させています。
<Master Name="*" Extends="Vis2010 Task"> <Conditions> <Condition Name="Activity Type" Value="Prop.BpmnActivityType" SrcType="visio" Equals="Task" /> </Conditions> </Master> <Master Name="*" Extends="Vis2010 Subprocess"> <Conditions> <Condition Name="Activity Type" Value="Prop.BpmnActivityType" SrcType="visio" Equals="Sub-Process" /> </Conditions> </Master>
Visioのマスター名または図形名がVisioUserMap.xmlまたはVisioMasterMap.xmlにあるどのエントリにも一致しない場合は、図形の属性を調べてBPMNオブジェクト・タイプが判断されます。基本ルールは次のとおりです。
図形がコネクタの場合(通常、他の図形の接続には線が使用されます)、SequenceFlow
としてインポートされます。
テキストを含む四角形の図形で、枠と塗りつぶしの色がないものは、テキスト注釈としてインポートされます。
円または楕円の図形はイベントとしてインポートされます。
他の図形を囲む四角形は、その図形の境界を横断するシーケンス・フローがなければ、拡張サブプロセスとしてインポートされます。
四角形の境界内の図形にシーケンス・フローがつながっている場合は、BPMNのGroupシンボルとして扱われますが、Oracle BPMではGroupシンボルがサポートされていないため無視されます。
前述のルールに一致しない図形はタスクとしてインポートされます。
注意:
Visioの「Group」コマンドを使用して図形を組み合せるときは注意が必要です。これはVisioで複数の図形を移動して並べ変えるときに便利な機能ですが、図形のグループはインポート時に単一のオブジェクトとして扱われ、マスターがないため、コンバータが混乱し、単一のタスクとしてインポートされる可能性が高くなります。
Visioファイルの作成時には次のヒントを考慮に入れてください。
適切なステンシルを使用する。
すべての図形がマスター図形に基づくようにする。
他の図形とのコネクタはすべて両端で接合させる。
短い線をつなぎ合わせてフローを作成しない。
フローごとに1本の連続したコネクタを使用する。
オブジェクトを手動でグループ化しない。
図形と線には、選択と入力によって必ずラベルを付ける。
独立したテキスト・ボックスを作成しない。
BPMNオブジェクトに正確に対応付けられない新しいシンボルを作成しない。
使用するすべてのマスターがVisioMasterMap.xmlまたはVisioUserMap.xmlで定義されていることを確認する。
オンページ・コネクタ、オフページ・コネクタ、リンク・イベントを使用しない。
これらはBPMでサポートされていません。
この項では、VisioファイルをBPMNプロセスにインポートする場合に考えられるシナリオについて説明します。
VisioUserMap.xmlを更新する手順は次のとおりです。
この例では、マスターがReportの図形が、元のVisioファイルに含まれており、これをSendタスクにマップします。Reportは現在VisioMasterMap.xmlでマッピングされていないため、この図形は抽象タスクとしてインポートされます。デフォルトでは、VisioMasterMap.xmlはこの図形をSendタスクにマップします。それを入力オブジェクトまたは出力オブジェクトとして厳密に使用すると、BPMNデータ・オブジェクトへのマップがより正確になります。
次に示すように、Extends属性を使用して、オブジェクトを追加の属性または異なる属性とともに既存のBPMNオブジェクトにマップできます。
<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>要素の有効な値は次のとおりです。
Task:
UserTask
ManualTask
ReceiveTask
SendTask
ServiceTask
ScriptTask
BusinessRuleTask
Subprocess:
AdHocSubprocess
CallActivity
Event:
StartEvent
EndEvent
IntermediateCatchEvent
IntermediateThrowEvent
BoundaryEvent
Gateway:
ExclusiveGateway
InclusiveGateway
ParallelGateway
ComplexGateway
EventBasedGateway
DataObject:
DataObjectReference
Group:
Annotation
TextAnnotation
Lane
Pool:
Participant
MessageFlow
SequenceFlow
Association
null
注意:
Null値をVisioの要素に割り当てると、BPMNフロー・オブジェクトは作成されません。
次の表は、BPMNフロー・オブジェクトの基本的なBPMNタイプに基づいた、BPMN属性の有効な値を示しています。
タスクの属性と値
表E-1はBPMNタスクの有効な属性と値を示しています。
表D-1 タスクの属性と値
属性 | 値 |
---|---|
TaskType |
None、Script、Reference、Service、User、Manual、Send、Receive |
LoopType |
Standard、MultiInstance |
isForCompensation |
true、false |
Implentation |
任意のテキスト |
OperationRef |
任意のテキスト |
サブプロセスの属性と値
表D-2はBPMNサブプロセスの有効な属性と値を示しています。
表D-2 サブプロセスの属性と値
属性 | 値 |
---|---|
isExpanded |
true、false |
isATransaction |
true、false |
LoopType |
Standard、MultiInstance |
isForCompensation |
true、false |
AdHoc |
true、false |
IsCollapsed |
true、false |
SubprocessType |
Embedded、Reusable、Reference |
ExpandedWidth |
数値 |
ExpandedHeight |
数値 |
ModelReference |
テキスト |
CalledElement |
テキスト |
TriggeredByEvent |
true、false |
LoopMaximum |
数値 |
LoopCounter |
数値 |
LoopCondition |
テキスト |
MultiInstanceCondition |
テキスト |
MultiInstanceIsSequential |
true、false |
イベントの属性と値
表D-3はBPMNイベントの有効な属性と値を示しています。
表D-3 イベントの属性と値
属性 | 値 |
---|---|
EventType |
Start、Intermediate、End |
Trigger |
Escalate、None、Message、Timer、Conditional、Signal、Multiple、Error、Cancel、Compensation、Link、Terminate |
EventDirection |
Throw、Catch |
IsInterrupting |
true、false |
CancelActivity |
true、false |
TimeCycle |
テキスト |
TimeDate |
テキスト |
ゲートウェイの属性と値
表D-4はBPMNゲートウェイの有効な属性と値を示しています。
表D-4 ゲートウェイの属性と値
属性 | 値 |
---|---|
GatewayType |
Parallel、Inclusive、Exclusive、Complex |
ExclusiveType |
Event、Data |
MarkerVisible |
true、false |
シーケンス・フローの属性と値
表D-5はBPMNシーケンス・フローの有効な属性と値を示しています。
表D-5 シーケンス・フローの属性と値
属性 | 値 |
---|---|
ConditionType |
None、Expression、Default |
ConditionExpression |
テキスト |
アソシエーションの属性と値
表D-6はBPMNデータ・オブジェクトの有効な属性と値を示しています。
表D-6 アソシエーションの属性と値
属性 | 値 |
---|---|
Direction |
None、One、Both |
AssociationDirection |
None、One、Both |
プールの属性と値
表D-7はBPMNプールの有効な属性と値を示しています。
表D-7 プールの属性と値
属性 | 値 |
---|---|
BoundaryVisible |
true、false |
IsHorizontal |
true、false |
レーンの属性と値
表D-8はBPMNレーンの有効な属性と値を示しています。
表D-8 レーンの属性と値
属性 | 値 |
---|---|
BoundaryVisible |
true、false |
IsHorizontal |
true、false |
Business Process Composerは、Visioファイルをインポートするとき、ソース・ファイルで見つかったプールごとに別々のプロセスを作成します。BPMNモデルでは可視のプール境界がないプロセスも表現できるため、Visioのプールやレーンの内側にない図形(凡例、タイトルなど)も個別のプロセスに追加されます。このため、プロセス・オブジェクトではない外部要素のみがBPMプロセスに格納される場合があります。このような図形が変換されないようにするには、該当する図形マスターをnullにマッピングするエントリをVisioUserMap.xml fileに追加します。これにより、コンバータに図形を無視させることが可能です。図形にマスターがない場合、コンバータはVisioの「Format Special」ダイアログで定義されている図形名と一致するエントリを探します。たとえば、VisioファイルにSheetNameという名前のオブジェクトが含まれている場合、その値をVisioUserMap.xmlでnullにマッピングすれば、インポート時に無視されます。
<Master Name="SheetName"> <BPMNObject>null</BpmnObject> </Master>
XPDLとは、Workflow Management Coalitionが策定した、ワークフロー自動化ツール間でプロセス・モデル情報を交換するための互換形式です。BPMでは、XPDLバージョン1.0、2.0、2.1および2.2のインポートをサポートしています。
現在、XPDLをサポートしているプロセス・モデリング・ツールは多数ありますが、すべてのツールでこの標準が同じように実装されているわけではありません。Oracle BPMでは、公式のXPDL仕様(http://www.xpdl.org
から入手可能)に厳密に準拠したXPDLファイルをサポートしており、非準拠の形式についてはExtensible Stylesheet Language Transformation (XSLT)を使用してBPMの所定の形式に変換します。XPDLインポータは様々な拡張属性も認識します。これにより、一般的な相違に応じた特別な変換ロジックがトリガーされるので、複雑なXSLTロジックは必要ありません。
最も一般的な変換内容は次のとおりです。
オブジェクトの座標を親コンテナに対する相対座標から図面ページの左上隅に対する相対座標に調整する。
オブジェクトの左上隅を表すようにオブジェクト座標を調整する。
シーケンス・フローのルーティングを再作成する。
欠けている要素と属性を作成する。
要素を削除する。
要素と属性の値をベンダー固有の名前空間からXPDL名前空間に移動する。
この項では、いくつかの一般的な要件を処理する手順について説明します。ここに示す例は、何か他の要件が発生した場合にそれを処理する独自の変換ルールを作成する際の参考になります。
BPM Studioを使用してXPDLファイルをインポートするとき、インポート・プロセスは次のフォルダにある特殊なファイルを使用します。
ORACLE_HOME>/soa/plugins/jdeveloper/extensions/oracle.bpm.converter
XSLFilePaths.xmlファイルは、各種のベンダー形式と変換用の適切なXSLファイルの間のマッピングとして機能します。次に、このファイルのエントリの例を示します。
<XSLFilePath Vendor="Bizagi Process Modeler">BizagiPatch.xsl</XSLFilePath>
Vendor属性は、ソース・ファイル内のXML要素/Package/PackageHeader/Vendorと一致する必要があります。次に、上の行に一致するBizagi XPDLファイルの断片を例示します。
<?xml version="1.0" encoding="utf-8"?><Package xmlns:xsd=http://www.w3.org/2001/XMLSchema
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
Id="bf8a25f5-275d-4546-8d07-dfa02666c51d" Name="Sample" xmlns="http://www.wfmc.org/2009/XPDL2.2"> <PackageHeader> <XPDLVersion>2.2</XPDLVersion> <Vendor>Bizagi Process Modeler</Vendor> <Created>2013-07-29T19:17:31.931003-07:00</Created> <ModificationDate>2013-07-29T19:18:53.207857-07:00</ModificationDate> <Description>Phases</Description> <Documentation /> </PackageHeader>
Vendor属性のかわりにCondition属性を指定して、有効なXPATH式を記述することもできます。ソース・ファイルの式の評価結果が真ならば、対応するXSLファイルが使用されます。次にCondition条件の使用例を示します。
<XSLFilePath Condition="substring(/Package/PackageHeader/Vendor/text(), 0, 22)='Metastorm ProVision 6'">ProvisionPatch.xsl</XSLFilePath>
この式では、Vendor属性の最初の22文字を文字列「Metastorm ProVision 6」と比較しています。この手法は、たとえばVendorとVersionの組合せを照合するときなどに利用できます。
特定のXSLファイルが識別されると、インポータはソース・ファイルに対してXSLT変換を適用してから、変換後のXMLをインポートします。ソース・ファイルと一致するVendorまたはConditionがない場合、インポータはpatch.xslファイルを使用します。
XPDLインポータは、XPDLの拡張性機能を使用して定義されたオプションの属性を検索します。これらの属性は、XSLTとしてのコーディングが困難な特殊ケースを処理するための、インポータに対する指示として機能します。これらの属性は、次のように/Package/ExtendedAttributesセクションに配置されている必要があります。
<Package> <Extended Attributes> <ExtendedAttribute Name="attribute name" Value="value" /> <Extended Attributes></Package>
表D-9 拡張属性と有効な値
属性名 | 有効な値 | デフォルト値 | 説明 |
---|---|---|---|
redrawConnections |
true、false |
false |
シーケンス・フローのパス属性を無視し、新しいパスをプログラムによって作成します。 |
activitiesObjectPin |
Upperleft Lowerleft 中央 |
Upperleft |
アクティビティ(フロー・ノード)のXY座標がシンボルの四角形の境界の左上角、左下角または中心のいずれに対応しているかを示します。 |
lanesRelativeToPools |
true、false |
false |
レーン・オブジェクトのXY座標がその親プールに対する相対座標であることを示します。 |
activitiesRelativeToLanes |
true、false |
false |
アクティビティのXY座標がその親レーンに対する相対座標であることを示します。 |
activitiesRelativeToPools |
true、false |
false |
アクティビティのXY座標がその親レーンに対する相対座標であることを示します。注意: activitiesRelativeToLanesとactivitiesRelativeToPoolsを両方ともtrueには設定できません。 |
subProcessChildPositionRelative |
true、false |
false |
サブプロセスの内側にあるアクティビティのXY座標がそのサブプロセスに対する相対座標であることを示します。 |
recalculatePoolsAndLanesPositions |
true、false |
false |
プールおよびレーンのXY座標を先行するプールおよびレーンの位置と高さに基づいて計算するようインポータに要求します。ソース・モデルにプールとレーンの位置座標が含まれていない場合は、この属性をtrueに設定する必要があります。 |
XPDL仕様書には、すべてのオブジェクト座標は、オブジェクトの境界を示す四角形の左上角を、ページの左上角を起点(0,0)とするページ座標系で指定すると明記されています。次の例では、図D-1のプール1の高さを100単位、プール2の高さを200単位、プール2内の各レーンの高さを100単位とします。
図D-1 BPMNプロセスの例
XPDL仕様のグローバル座標系を使用すると、図中の各オブジェクトのXY座標は次のようになります。
すべての座標がページの左上角を基準としているので、これらの座標を指定しているソース・ファイルは、変換の必要なく正しくBPMにインポートされます。
XPDLに保存されるオブジェクト座標がその親プールおよびレーンに対する相対座標であるツールについて考えてみましょう。この場合、各座標は次のように表されます。
プール2の中のレーン1のY座標が0であることに注目してください。このツールではレーンの位置を親プールに対する相対座標として保存するため、0という値はレーンの上端がプールの上端と一致することを示しています。同様にレーン2のY座標は100ですが、これはプールの上端から100単位下に位置することを示しています。
また、各タスクのY座標は15ですが、これは左上角がそれぞれのレーンの上端より15単位下にあることを示しています。
この図を正しくOracle BPMにインポートするには、次の拡張属性値を設定する必要があります。
D-10 拡張属性値
属性名 | 値 |
---|---|
lanesRelativeToPools |
true |
activitiesRelativeToLanes |
true |
これらの属性をXPDLに追加するXSLTコードは次のとおりです。
<xsl:template match="Package/ExtendedAttributes"> <xsl:copy> <xsl:copy-of select="@*"/> <ExtendedAttribute Name="lanesRelativeToPools" Value="true"/> <ExtendedAttribute Name="activitiesRelativeToLanes" Value="true"/> <xsl:apply-templates/> </xsl:copy> </xsl:template>
少し異なるバリエーションとして、レーンは親プールに対する相対座標であるが、アクティビティは親レーンではなく親プールに対する相対座標である場合が考えられます。この場合、オブジェクト座標は次のようになります。
プール 1 - (0, 0)
タスク3のY座標が15でなく115である点のみが異なります。この場合は、拡張属性を次のように設定する必要があります。
表D-11 拡張属性と値
属性名 | 値 |
---|---|
lanesRelativeToPools |
true |
activitiesRelativeToPools |
true |
XPDL仕様では、アクティビティの位置は、ページ座標系上の境界を示す四角形の左上隅の位置であると規定されています。しかし、ツールの中には、オブジェクトの中心をページ上の位置とするものもあります。これはオブジェクトのローカル座標系と呼ばれます。
これを理解する最も簡単は方法として、絵はがきをコルク版に画鋲で留めるところを想像してみてください。画鋲がコルク版に開ける穴がコルク版上のはがきの位置を表します。コルク版の左端から画鋲までの距離を測るとX座標が得られ、コルク版の上端から画鋲までの距離を測るとY座標が得られます。ただし、画鋲をはがきに刺す位置そのものも、はがきの正確な位置決めに影響してきます。画鋲をはがきの左上角に刺した場合と、はがきの中心に刺した場合とでは、位置が異なるでしょう。
図D-1のBPMNの例で言えば、アクティビティの中心をローカルの画鋲位置とするXPDLツールでは、タスクの座標が次のようになります。
X座標が右へ45単位シフトしており (タスクの枠の幅は90単位)、Y座標は各レーンの縦方向の中心に位置しています(高さは00単位)。
インポータではすべての座標は左上隅の位置を示すと想定しているため、XPDLツールがアクティビティのページ上の位置基準をアクティビティの中心としている場合、BPMへのインポート後に、アクティビティはその幅の半分右へ、高さの半分下へシフトされます。この補正を行うには、次の属性を設定する必要があります。
activitiesObjectPin CENTER
このためのXSLTコードは次のとおりです。
<xsl:template match="Package/ExtendedAttributes"> <xsl:copy> <xsl:copy-of select="@*"/> <ExtendedAttribute Name="activitiesObjectPin" Value="CENTER"/> <xsl:apply-templates/> </xsl:copy> </xsl:template>
Oracle BPMでは、ソースXPDLファイルのすべてのグラフィカル要素は、その可視性がfalseに設定されている場合でも表示要素とみなされます。したがって、次に示すアクティビティ要素のように、以前は非表示になっていた要素が変換後のBPMNプロセスでは表示されるという違いが見つかることがあります。
<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にインポートすると、このアクティビティが表示されます。非表示要素を削除するには、それらを削除するためのテンプレートをスタイルシートに追加してください。
<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ツールの中には、標準のXPDL名前空間のほかに独自の名前空間を使用するものもあります。これは多くの場合、ツールの特殊な機能や属性をサポートするためのものですが、XPDL名前空間に保存されるべき情報が独自の名前空間に保存されることがあります。
次のXPDLファイル・ヘッダーでは複数の名前空間を定義しています。
<?xml version="1.0" encoding="UTF-8"?> <Package Id="1" xsi:schemaLocation="http://www.wfmc.org/2004/XPDL2.0alpha http://www.wfmc.org/standards/docs/TC-1025_bpmnxpdl_24.xsd" xmlns="http://www.wfmc.org/2004/XPDL2.0alpha" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xpdl="http://www.wfmc.org/2004/XPDL2.0alpha" xmlns:ix="http://www.igrafx.com/2007/igrafx-document" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:igxpdl="http://www.igrafx.com/2008/igrafx-xpdl2">
XMLドキュメントの本文では、標準XPDL要素のデフォルトの名前空間を使用していますが、ドキュメント・ページの定義にigxpdl
という名前空間を使用しています。
<igxpdl:Page Name="Update Spreadsheet" ID="Page1" IgnorePools="true"> <PageLayout xmlns:i="http://www.igrafx.com/2007/igxmldoc" xmlns="http://www.igrafx.com/2007/igrafx-document"> <Page UseDocumentSettings="false" Orientation="Landscape" Width="16837" Height="11905"> <FitTo PagesWide="1" PagesTall="1" /> </Page> </PageLayout> </igxpdl:Page> <igxpdl:Page Name="Submit Instructions" ID="Page2" IgnorePools="true"> <PageLayout xmlns:i="http://www.igrafx.com/2007/igxmldoc" xmlns="http://www.igrafx.com/2007/igrafx-document"> <Page UseDocumentSettings="false" Orientation="Landscape" Width="16837" Height="11905"> <FitTo PagesWide="1" PagesTall="1" /> </Page> </PageLayout> </igxpdl:Page> </igxpdl:Pages>
XPDLインポータは、XPDL名前空間以外の名前空間を認識せず、その名前空間にPages要素が存在することを要求します。この要件に対応するには、独自の名前空間の要素から情報をコピーしてXPDLのPages要素を作成するXSLTテンプレートを作成します。
<xsl:template match="//xpdl21:Package"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:if test="child::igxpdl:Pages"> <xsl:element name="Pages"> <xsl:for-each select="//igxpdl:Pages/igxpdl:Page"> <xsl:element name="Page"> <xsl:attribute name="Id"> <xsl:value-of select="./@ID"/> </xsl:attribute> <xsl:attribute name="Name"> <xsl:value-of select="./@Name"/> </xsl:attribute> </xsl:element> </xsl:for-each> </xsl:element> </xsl:if> <xsl:apply-templates/> </xsl:copy> </xsl:template>
結果として、デフォルトの名前空間に次のような新しいセクションが追加されます。
<Pages> <Page Id="Page1" Name="Update Spreadsheet" /> <Page Id="Page2" Name="Submit Instructions" /></Pages>
新バージョンのXPDLをサポートするためにアップグレードしたツールを使用している場合、様々なXPDL形式で保存したモデルが混在することがあります。複数のXPDLバージョンに対応したXSLTテンプレートを作成するには、場合によっては名前空間ごとにルールを組み込む必要があります。
たとえば、あるツールでファイルをXPDL 2.1形式で保存した後、XPDL 2.2形式で保存したとします。名前空間には、それぞれxpdl21
、xpdl22
という異なる値が使用されています。XSLTファイルでは、両方の名前空間を定義する必要があります。これらの名前空間は、ツールのXPDLファイルに出現するものと一致していることが必要です。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xpdl21="http://www.wfmc.org/2008/XPDL2.1" xmlns:xpdl22="http://www.wfmc.org/2009/XPDL2.2">
その後、名前空間ごとに別々のテンプレートを定義します。次に例を示します。
<!-- Set extended Attribute for xpdl 2.1 --> <xsl:template match="xpdl21:Package/xpdl21:ExtendedAttributes"> <xsl:copy> <xsl:copy-of select="@*"/> <xpdl21:ExtendedAttribute Name="subProcessChildPositionRelative" Value="true"/> <xpdl21:ExtendedAttribute Name="activitiesObjectPin" Value="CENTER"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> <!-- Set extended Attribute for xpdl 2.2 --> <xsl:template match="xpdl22:Package/xpdl22:ExtendedAttributes"> <xsl:copy> <xsl:copy-of select="@*"/> <xpdl22:ExtendedAttribute Name="redrawConnections" Value="true"/> <xpdl22:ExtendedAttribute Name="subProcessChildPositionRelative" Value="true"/> <xpdl22:ExtendedAttribute Name="activitiesObjectPin" Value="CENTER"/> <xsl:apply-templates/> </xsl:copy> </xsl:template>
各XPDL形式のロジックは、要件次第で同じであっても違っていてもかまいません
XSLTの検証や対話型実行をサポートするOracle JDeveloperなどのプログラミングIDE (Interactive Development Environment)を使用してカスタムXSLTを作成し、テストすることを強くお薦めします。これにより、出力されたXPDLを確認しながら、簡単に問題を解決できます。Oracle JDeveloperでのXSLTの編集およびデバッグ方法を説明したデモを視聴するには、ブラウザで次のリンク先を参照してください。
http://www.oracle.com/technetwork/developer-tools/jdev/xml-viewlet-swf-089240.htmlhttp://www.oracle.com/technetwork/developer-tools/jdev/xml-viewlet-swf-089240.html