63 ワークフローのカスタマイズ
WebCenter Sitesのワークフロー・プロセスは、アセットがパブリッシュの過程で通過する一連の状態です。アセットはワークフロー・ステップを進み、ある状態から次の状態へ移行します。ワークフロー・ステップの条件エレメントを作成し、アセットが次の状態へ移行するために満たす必要のある条件を指定する必要があります。また、アセットがある状態から次の状態へ移行するときに、様々なアクションを行う、ワークフロー・アクションのエレメントを作成する必要があります。
トピック:
ワークフロー・ステップ条件
ワークフロー・プロセスは、1つ以上のワークフロー状態で構成されます。ワークフロー・ステップにより、アセットはあるワークフロー状態から次の状態へ移行します。アセットの各ワークフロー・ステップは、アセットが割り当てられるときに、電子メールをユーザーに送信するなど、時間指定アクションに関連付けたり、ワークフロー・ステップ条件に関連付けて、一定の条件が満たされていない場合、アセットが次のステップへ進むのを防いだりすることができます。場合によっては、アセットが次のワークフロー状態に移行しないようにする条件があります。アセットが次の状態に移行しないようにする条件(複数可)を定義したエレメントを作成する必要があります。
このエレメントは、コールされると次のデータを受信します。
-
Object
というIWorkflowable
オブジェクト: 状態が変更されているアセットを表します。 -
Step
というIWorkflowStep
オブジェクト: 現在のワークフロー・ステップを表します。 -
StepUser
変数: ステップを進めようとするユーザーのIDを格納します。 -
WebCenter Sitesのユーザー・インタフェースに
StepCondition
が定義されている場合、変数は名前と値のペアとして指定されます。『Oracle Fusion Middleware Oracle WebCenter Sitesの管理』のアクションと条件の設定に関する項を参照してください。
ワークフロー・ステップ条件のエレメントは、条件をチェックし、ブール値を返します。値がfalseの場合は、次のステップへ進みません。
次の例は、ワークフロー・ステップ条件エレメントのサンプルから抜粋したものです。
<?xml version="1.0" ?>
<!DOCTYPE FTCS SYSTEM "futuretense_cs.dtd">
<FTCS Version="1.1">
<!-- OpenMarket/Xcelerate/Actions/Workflow/StepConditions/ExampleStepCondition
-
- INPUT
-
- OUTPUT
-
-->
<csvar NAME="This step condition will check if step can be taken"/><br/>
次の例の1行目では、空のReturnVal
変数を設定しています。
<setvar NAME="ReturnVal" VALUE="Variables.empty"/>
<!--change the value of ReturnVal to a non-empty string later on, if you want to stop the step --> <!-- most of the stuff below are debugging statements and also show you some items available to you to set up a condition for stopping the step-->
次の例の2行目では、WORKFLOWABLEASSET.GETDISPLAYABLENAME
タグを使用してワークフロー内のアセットの名前を取得します。
<!-- get asset -->
<WORKFLOWABLEOBJECT.GETDISPLAYABLENAME OBJECT="Object" VARNAME="assetdisplayablename"/>
Object:<csvar NAME="Variables.assetdisplayablename"/><br/>
次の例の2行目では、StepUser
という変数を作成し、ステップを進めようとするユーザーのIDを格納します。3行目では、USERMANAGER.GETUSER
タグを使用して、ユーザーのIDをStepUser
変数にロードします。4行目では、CCUSER.GETNAME
タグを使用して、判読可能なユーザー名を取得し、5行目では、csvar
タグを使用して、そのユーザー名を表示します。
<!-- get userid -->
Userid: <csvar NAME="Variables.StepUser"/><br/>
<USERMANAGER.GETUSER OBJVARNAME="myUserObj" USER="Variables.StepUser"/>
<CCUSER.GETNAME NAME="myUserObj" VARNAME="uname"/>
Username: <csvar NAME="Variables.uname"/><br/>
次の例の2行目では、WORKFLOWSTEP
.GETID
タグを使用して現在のワークフロー・ステップのIDを取得します。4行目で使用されているWORKFLOWSTEP.GETNAME
タグにより、指定された名前のステップがロードされます。
<!-- getstep -->
<WORKFLOWSTEP.GETID NAME="Step" VARNAME="sid"/>
Stepid: <csvar NAME="Variables.sid "/>
<WORKFLOWSTEP.GETNAME NAME="Step" VARNAME="sname"/>
Stepname: <csvar NAME="Variables.sname"/><br/><br/>
次の例では、ステップの変更を停止する条件を定義します。forcestop
変数およびnotalloweduser
変数は条件チェックであり、WebCenter Sitesのインタフェースに、サンプルのステップ条件が定義された場合は、引数として設定されます。実際のステップ条件では、ここで任意の条件をテストします。たとえば、関連付けられたイメージが記事アセットにないか確認します。
<!-- This is the actual condition to stop the step. The following is just an example. -->
<if COND="Variables.forcestop=true">
<then>
<setvar NAME="ReturnVal" VALUE="You can not take this step because forcestop=true"/>
</then>
<else>
<if COND="Variables.uname=Variables.notalloweduser">
<then>
<setvar NAME="ReturnVal" VALUE="You are not allowed to take this step"/>
</then>
</if>
</else>
</if>
</FTCS>
ワークフロー・アクション
アセットはワークフロー間を移動するときに、ワークフロー・アクションをトリガーできます。ワークフロー・アクションでは、電子メールの送信から、指定された時間の経過後に、デッドロックの解除を評価する必要がある新しいアセットがあるというユーザーへの警告まで、あらゆるアクションが可能です。
ワークフロー・アクションには、次の5つの種類があります。
-
ステップ・アクション。ワークフロー状態間の遷移の一部として実行されます。
-
時間指定アクション。アセットが特定の状態になると、期限によりトリガーされます。たとえば、アセットが固有の割当てに関連付けられます。
-
デッドロック・アクション。次の状態に移行するために、アセットが全員一致の票決を要する場合に実行されますが、アセットがどのステップに進むかによって投票者が異なります。デッドロック・アクションは、アセットの移行先として、ユーザーが別々のステップを選択した場合に実行されます。
-
グループ・デッドロック時のアクション。次の状態に移行するために、ワークフロー・グループ内のアセットが全員一致の票決を要する場合に実行されますが、投票者が別々のステップを選択した場合、デッドロックが発生します。
-
委任アクション。アセットが委任された場合に実行されます。委任済のアセットは現在のワークフロー状態のままですが、新しいユーザーに割り当てられます。
最初に、ワークフローの管理者が、WebCenter Sitesのユーザー・インタフェースを使用して、ワークフロー・アクションを定義する必要があります。その後、これらのワークフロー・アクションを実行するエレメントを作成する必要があります。WebCenter Sitesでは、参照用に複数のワークフロー・アクション定義のサンプルが提供されています。『Oracle Fusion Middleware Oracle WebCenter Sitesの管理』のアクションと条件の設定に関する項を参照してください。
次の各トピックでは、ワークフロー・アクションのサンプル・エレメントについて説明します。
ステップ・アクションのエレメント
ステップ・アクションのエレメントは、コールされると次のデータを受信します。
-
WorkflowEngine
というWorkflowEngine
オブジェクト。 -
ObjectTotal
変数: 状態が変更されているアセットの総数を表します。 -
Objectnnn
というIWorkflowable
オブジェクト: 状態が変更されているアセットを表し、nnnは、0 (ゼロ)とObjectTotal -1の間の数です。 -
Step
というIWorkflowStep
オブジェクト: 検討対象になっているワークフロー・ステップを表します。 -
StepTargetUser
変数: ステップのターゲット・ユーザーのカンマ区切りリストです。 -
StepUser
変数: ステップを進めようとするユーザーのIDを格納します。 -
Group
変数: アセットの所属先ワークフロー・グループのIDを格納します(ワークフロー・グループを使用している場合)。 -
ワークフローの管理者がこのステップ・アクションの定義中に作成した任意の変数。
次の例では、ステップ・アクションのエレメントにより、アセットのパブリッシュが承認され、その他のほとんどのステップ・アクションのエレメントは、割当て先に電子メールを送信するものです。
<?xml version="1.0" ?>
<!DOCTYPE FTCS SYSTEM "futuretense_cs.dtd">
<FTCS Version="1.1">
<!-- OpenMarket/Xcelerate/Actions/Workflow/StepActions/ApproveForPublish
-
- INPUT
- Variables.ObjectTotal - number of loaded workflowasset objects
- Object[n] - loaded workflowasset objects, where n = 0 - Variables.ObjectTotal
-targets - one or more comma separated names of PubTargets for which to approve the asset
-
- OUTPUT
-
-->
<!-- This is an action element called by step actions ApproveForPublish-->
This step action element will approve an asset for publish.<br/>
次の例の2行目では、SETCOUNTER
タグを使用して、承認するアセットの数を記録するカウンタを作成します。3行目から9行目では、LOOP
タグを使用し、アセット間をループしてアセット・タイプとIDを取得します。
<!-- get the id and assettype of the asset(s) to approve -->
<SETCOUNTER NAME="count" VALUE="0"/>
<LOOP COUNT="Variables.ObjectTotal">
<WORKFLOWASSET.GETASSETTYPE OBJECT="ObjectCounters.count" VARNAME="assettype"/>
<WORKFLOWASSET.GETASSETID OBJECT="ObjectCounters.count" VARNAME="assetid"/>
<SETVAR NAME="idCounters.count" VALUE="Variables.assetid"/>
<SETVAR NAME="typeCounters.count" VALUE="Variables.assettype"/>
<INCCOUNTER NAME="count" VALUE="1"/>
</LOOP>
次の例では、STRINGLIST
タグを使用して、パブリッシュ・ターゲット名のカンマ区切りリストを作成します。PUBTARGET.LOAD
タグとPUBTARGET.GET
タグは、パブリッシュ・ターゲットに関する情報をPubTarget表からロードするのに使用されます。この情報および承認されるアセットに関する情報は、ApprovePost
エレメントに渡され、さらに処理されます。
<!-- approve for each destination -->
<STRINGLIST NAME="publishTargets" STR="Variables.targets" DELIM=","/>
<if COND="IsList.publishTargets=true">
<then>
<LOOP LIST="publishTargets">
<PUBTARGET.LOAD NAME="pubtgt" FIELD="name" VALUE="publishTargets.ITEM"/>
<if COND="IsError.Variables.errno=false">
<then>
Approving for publish to <CSVAR NAME="publishTargets.ITEM"/><br/>
<PUBTARGET.GET NAME="pubtgt" FIELD="id" OUTPUT="pubtgt:id"/>
<CALLELEMENT NAME="OpenMarket/Xcelerate/PrologActions/ApprovePost">
<ARGUMENT NAME="targetid" VALUE="Variables.pubtgt:id"/>
<ARGUMENT NAME="assetTotal" VALUE="Counters.count"/>
</CALLELEMENT>
</then>
<else>
Cannot approve for publish to destination: <CSVAR NAME="publishTargets.ITEM"/>, Error: <CSVAR NAME="Variables.errno"/>
</else>
</if>
</LOOP>
</then>
<else>
Cannot approve for publish. This step action requires a targets argument with one or more comma separated publishing destination names.
</else>
</if>
</FTCS>
時間指定アクションのエレメント
時間指定アクションのエレメントは、コールされると次のデータを受信します。
-
WorkflowEngineというWorkflowEngineオブジェクト。
-
WorkflowAssignmentTotal変数: このアクションが適用される割当ての総数を格納します。
-
WorkflowAssignmentnnnというIWorkflowAssignmentオブジェクト: アクションの適用先の割当てを表します。nnnは、0(ゼロ)より大きい数です。
-
オプションのGroup変数: アセットの所属先ワークフロー・グループのIDを格納します(ワークフロー・グループを使用している場合)。
-
ワークフローの管理者がこの時間指定アクションの定義中に作成した任意の変数。
電子メールを送信する、時間指定アクション・エレメントの一部を次に示します。この電子メールの件名および本文のテキストは、「ワークフロー電子メール」フォームに設定され、このフォームには、Adminインタフェースにある「管理」ノードからアクセスします。本文テキストに予想される変数は次のとおりです。
-
Variables.assetname
: 現在のアセットの名前を格納します。 -
Variables.assigner
: ワークフロー・プロセス内で1つ前の状態を完了したユーザーの名前。 -
Variables.instruction
: 割当て者が割当ての完了時に、「実行するアクション」テキスト・ボックスに入力するテキスト。
次の例では、電子メール・オブジェクトの変数であるsubject
およびbody
が、その値に置換されます。
<!-- translate subject -->
<EMAIL.TRANSLATESUBJECT NAME="emailobject" PARAMS="assetname=Variables.assetname" VARNAME="subject"/>
<!-- translate body -->
<EMAIL.TRANSLATEBODY NAME="emailobject" PARAMS="assetname=Variables.assetname&time=Variables.time" VARNAME="body"/>
<!-- send mail -->
<sendmail TO="Variables.EmailAddress" SUBJECT="Variables.subject" BODY="Variables.body"/>
</THEN>
<ELSE>
Email address: None<br/>
</ELSE>
</IF>
<inccounter NAME="COUNT" VALUE="1"/>
</loop>
</then>
</if>
</FTCS>
デッドロック・アクションのエレメント
デッドロック・アクションのエレメントは、コールされると次のデータを受信します。
-
WorkflowEngine
オブジェクト。 -
ObjectTotal
変数: デッドロック済アセットの総数を表します。 -
Objectnnn
というIWorkflowable
オブジェクト: デッドロック済アセットを表します。 -
Step
というIWorkflowStep
オブジェクト: ワークフロー・ステップを表します。 -
StepTotal
変数: 個々のユーザーによって選択されたステップの数を格納します。 -
StepUser
変数: ステップを進めようとするユーザーのIDを格納します。 -
オプションの
Group
変数: アセットの所属先ワークフロー・グループのIDを格納します(ワークフロー・グループを使用している場合)。 -
ワークフローの管理者がこのデッドロック・アクションの定義中に作成した任意の変数。
次のデッドロック・アクション・エレメントは、アセットを承認するユーザーに電子メールを送信します。
この電子メールの件名および本文のテキストは、管理ユーザー・インタフェースにある「ワークフロー電子メール」フォームに設定されています。本文テキストに予想される変数は次のとおりです。
<?xml version="1.0" ?>
<!DOCTYPE FTCS SYSTEM "futuretense_cs.dtd">
<FTCS Version="1.1">
<!-- OpenMarket/Xcelerate/Actions/Workflow/DeadlockActions/SendEmailToAssignees
-
- INPUT
-
- OUTPUT
-
-->
<!-- This is an action element called by step actions SendAssignmentEmail and SendRejectionEmail-->
<csvar NAME="This deadlock action element will send emails"/><br/>
次の例の2行目では、EMAILMANAGER.LOAD
タグを使用して、電子メール・オブジェクトをロードします。
<!-- load email object -->
<EMAILMANAGER.LOAD NAME="Variables.emailname" OBJVARNAME="emailobject"/>
次の例の1行目から9行目では、NumOfSteps
変数を作成し、この変数には、委任されているアセットの総数または0 (ゼロ)のいずれかが格納されます。
<!-- get total steps -->
<if COND="IsVariable.StepTotal=true">
<then>
<setvar NAME="NumOfSteps" VALUE="Variables.StepTotal"/>
</then>
<else>
<setvar NAME="NumOfSteps" VALUE="0"/>
</else>
</if>
<removevar NAME="Step"/>
<setvar NAME="Header" VALUE="The following users have chosen the corresponding steps that has resulted in a deadlock. Please take appropriate actions to resolve deadlock:"/>
<setvar NAME="Message" VALUE="Variables.empty"/>
次の3つの例のコードでは、アセットをデッドロック状態にしたユーザーのリスト内をループして、ユーザーごとに電子メールを作成します。次に示すコードの10行目では、USERMANAGER.GETUSER
タグを使用して、IDで指定されたユーザーのユーザー情報をロードします。11行目と12行目では、CCUSER
タグを使用して、ユーザーの名前と電子メール・アドレスを取得します。
<!-- For each assignment object, get asignee -->
<setcounter NAME="COUNT" VALUE="0"/>
<if COND="Variables.NumOfSteps!=0">
<then>
<loop FROM="0" COUNT="Variables.NumOfSteps">
<!-- get assigner -->
<setvar NAME="userid" VALUE="Variables.StepUserCounters.COUNT"/>
<!-- get email address --->
<USERMANAGER.GETUSER USER="Variables.userid" OBJVARNAME="userobj"/>
<CCUSER.GETNAME NAME="userobj" VARNAME="user_name"/>
<CCUSER.GETEMAIL NAME="userobj" VARNAME="EmailAddress"/>
次の例の1行目から6行目では、WORKFLOWSTEP
タグとWORKFLOWSTATE
タグを使用して、アセットの開始および終了のステップと状態を取得します。
<WORKFLOWSTEP.GETNAME NAME="StepCounters.COUNT" VARNAME="stepname"/>
<WORKFLOWSTEP.GETSTARTSTATE NAME="StepCounters.COUNT" VARNAME="startstate"/>
<WORKFLOWSTEP.GETENDSTATE NAME="StepCounters.COUNT" VARNAME="endstate"/>
<WORKFLOWSTATE.GETSTATENAME NAME="Variables.startstate" VARNAME="startstatename"/>
<WORKFLOWSTATE.GETSTATENAME NAME="Variables.endstate" VARNAME="endstatename"/>
<setvar NAME="Message" VALUE="Variables.Message Variables.user_name: Variables.stepname - "/>
<!--
user:<csvar NAME="Variables.user_name"/><br/>
step name:<csvar NAME="Variables.stepname"/><br/>
startstate name:<csvar NAME="Variables.startstate"/><br/>
endstate name:<csvar NAME="Variables.endstate"/><br/>
-->
<!-- get asset -->
<WORKFLOWABLEOBJECT.GETDISPLAYABLENAME NAME="Variables.ObjectCounters.COUNT" VARNAME="assetname"/>
次の例の3行目と6行目では、電子メール・オブジェクトの変数であるsubject
およびbody
が、その値に置換されます。
<!-- translate subject -->
<SETVAR NAME="params" VALUE="username=Variables.user_name&header=Variables.Header&message=Variables.Message&assetname=Variables.assetname"/>
<EMAIL.TRANSLATESUBJECT NAME="emailobject" PARAMS="Variables.params" VARNAME="subject"/>
<!-- translate body -->
<EMAIL.TRANSLATEBODY NAME="emailobject" PARAMS="Variables.params" VARNAME="body"/>
<!-- send mail -->
<sendmail TO="Variables.EmailAddress" SUBJECT="Variables.subject" BODY="Variables.body"/>
<inccounter NAME="COUNT" VALUE="1"/>
</loop>
</then>
</if>
email message:<csvar NAME="Variables.Header Variables.Message"/><br/>
</FTCS>
グループ・デッドロック時のアクションのエレメント
グループ・デッドロック時のアクションのエレメントは、コールされると次のデータを受信します。
-
WorkflowEngine
というWorkflowEngine
オブジェクト -
ObjectTotal
変数: デッドロック済アセットの総数を表します。 -
Object
nnnというIWorkflowable
オブジェクト: デッドロック済アセットを表します。nnnは、0(ゼロ)より大きい数です。 -
Step
というIWorkflowStep
オブジェクト: ワークフロー・ステップを表します。 -
StepTotal
変数: 個々のユーザーによって選択されたステップの数を格納します。 -
StepUser
変数: ステップを進めようとするユーザーのIDを格納します -
Group
変数: デッドロックされたワークフロー・グループのIDを格納します。 -
ワークフローの管理者がこのグループ・デッドロック時のアクションの定義中に作成した任意の変数。
次のグループ・デッドロック時のアクション・エレメントは、アセットを承認するユーザーに電子メールを送信します。
この電子メールの件名および本文のテキストは、管理ユーザー・インタフェースにある「ワークフロー電子メール」フォームに設定されています。本文テキストに予想される変数は次のとおりです。
<?xml version="1.0" ?>
<!DOCTYPE FTCS SYSTEM "futuretense_cs.dtd">
<FTCS Version="1.1">
<!-- OpenMarket/Xcelerate/Actions/Workflow/GroupActions/SendEmailToAssignees
-
- INPUT
-
- OUTPUT
-
-->
<!-- user code goes here -->
<csvar NAME="This group deadlock action element will send emails"/><br/>
<!-- load email object -->
<EMAILMANAGER.LOAD NAME="Variables.emailname" OBJVARNAME="emailobject"/>
<!-- get group -->
<WORKFLOWENGINE.GETGROUPID ID="Variables.Group" OBJVARNAME="grpobj"/>
<WORKFLOWGROUP.GETNAME NAME="grpobj" VARNAME="GroupName"/>
<!-- get total steps -->
<if COND="IsVariable.StepTotal=true">
<then>
<setvar NAME="NumOfSteps" VALUE="Variables.StepTotal"/>
</then>
<else>
<setvar NAME="NumOfSteps" VALUE="0"/>
</else>
</if>
<removevar NAME="Step"/>
<setvar NAME="Header" VALUE="The following users have chosen the corresponding steps that has resulted in a deadlock for the group: Variables.GroupName. Please take appropriate actions to resolve deadlock:"/>
<setvar NAME="Message" VALUE="Variables.empty"/>
<!-- For each assignment object, get asignee -->
<setcounter NAME="COUNT" VALUE="0"/>
<if COND="Variables.NumOfSteps!=0">
<then>
<loop FROM="0" COUNT="Variables.NumOfSteps">
<!-- get assigner -->
<setvar NAME="userid" VALUE="Variables.StepUserCounters.COUNT"/>
<!-- get email address --->
<USERMANAGER.GETUSER USER="Variables.userid" OBJVARNAME="userobj"/>
<CCUSER.GETNAME NAME="userobj" VARNAME="user_name"/>
<CCUSER.GETEMAIL NAME="userobj" VARNAME="EmailAddress"/>
<WORKFLOWSTEP.GETNAME NAME="StepCounters.COUNT" VARNAME="stepname"/>
<WORKFLOWSTEP.GETSTARTSTATE NAME="StepCounters.COUNT" VARNAME="startstate"/>
<WORKFLOWSTEP.GETENDSTATE NAME="StepCounters.COUNT" VARNAME="endstate"/>
<WORKFLOWSTATE.GETSTATENAME NAME="Variables.startstate" VARNAME="startstatename"/>
<WORKFLOWSTATE.GETSTATENAME NAME="Variables.endstate" VARNAME="endstatename"/>
<!-- get asset -->
<WORKFLOWABLEOBJECT.GETDISPLAYABLENAME NAME="Variables.ObjectCounters.COUNT" VARNAME="assetname"/>
<!-- set message -->
<setvar NAME="Message" VALUE="Variables.Message Asset: Variables.assetname, User: Variables.user_name, Step: Variables.stepname -- "/>
<!-- translate subject -->
<SETVAR NAME="params" VALUE="username=Variables.user_name&header=Variables.Header&message=Variables.Message&assetname=Variables.assetname"/>
<EMAIL.TRANSLATESUBJECT NAME="emailobject" PARAMS="Variables.params" VARNAME="subject"/>
<!-- translate body -->
<EMAIL.TRANSLATEBODY NAME="emailobject" PARAMS="Variables.params" VARNAME="body"/>
<!-- send mail -->
<sendmail TO="Variables.EmailAddress" SUBJECT="Variables.subject" BODY="Variables.body"/>
<inccounter NAME="COUNT" VALUE="1"/>
</loop>
</then>
</if>
email message:<csvar NAME="Variables.Header Variables.Message"/><br/>
</FTCS>
委任アクションのエレメント
委任アクションのエレメントは、コールされると次のデータを受信します。
-
WorkflowEngine
というWorkflowEngine
オブジェクト -
CurrentUser
変数: アセットを委任しているユーザーのIDを格納します。 -
オプションの
Group
変数: ワークフロー・グループのIDを格納します。委任されるオブジェクトはすべて、同一のワークフロー・グループに存在する必要があります。 -
DelegateUser
変数: アセットが委任されているユーザーのIDを格納します -
DelegateComment
変数:DelegateUser
変数に格納されているユーザーIDに送信されるコメントを格納します -
ObjectTotal
変数: 委任されているアセットの総数を表します。 -
Object
nnnというIWorkflowable
オブジェクト: 委任されているアセットを表します。nnnは、0(ゼロ)より大きい数を表します。
委任アクションのエレメントは、ワークフロー・アクションの他のエレメント同様のコーディングをする必要があります。