ワークフローをカスタマイズおよび拡張する際は、以下の方法でワークフローオブジェクトにアクセスできます。
ワークフロー Java API は、com.adobe.granite.workflow
パッケージといくつかのサブパッケージで構成されます。この API の最も重要な構成要素は、com.adobe.granite.workflow.WorkflowSession
クラスです。WorkflowSession
クラスは、デザイン時と実行時に、次のワークフローオブジェクトへのアクセスを可能にします。
このクラスは、ワークフローのライフサイクルに介入するためのメソッドもいくつか提供します。
以下の表に、プログラムによってワークフローとやり取りする際に使用するいくつかの重要な Java オブジェクトの参照ドキュメントへのリンクを示します。以降の例では、コード内でクラスオブジェクトを取得および使用する方法を示します。
機能 | オブジェクト |
---|---|
ワークフローへのアクセス | WorkflowSession |
ワークフローインスタンスの実行とクエリ | Workflow WorkItem WorkflowData |
ワークフローモデルの管理 | WorkflowModel WorkflowNode WorkflowTransition |
ワークフロー内(または外)のノードに関する情報 | WorkflowStatus |
スクリプトの設置で説明したように、AEM は、サーバーサイドの ECMA スクリプトを実行する ECMA スクリプトエンジンを(Apache Sling を通じて)提供します。org.apache.sling.scripting.core.ScriptHelper
クラスは、sling
変数としてスクリプトで直ちに使用できます。
ScriptHelper
クラスは、SlingHttpServletRequest
へのアクセスを可能にします。これを使用することによって、最終的に WorkflowSession
オブジェクトを取得できます。以下に例を示します。
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
ワークフローコンソールでは REST API がよく使用されるので、ここでは、ワークフロー用の REST API について説明します。
curl コマンドラインツールでは、ワークフロー REST API を使用して、ワークフローオブジェクトにアクセスし、インスタンスのライフサイクルを管理できます。このページの例では、curl コマンドラインツールから REST API を使用する方法を示します。
REST API では、次のアクションがサポートされています。
Web 開発用の Firefox の拡張機能である Firebug を使用すると、コンソールの操作時に HTTP トラフィックを追跡できます。例えば、POST
リクエストで AEM サーバーに送信されたパラメーターと値を確認できます。
このページでは、AEM がローカルホストのポート 4502
で動作しており、インストールコンテキストが「/
」(ルート)であると想定しています。実際のインストール状況が異なる場合は、HTTP リクエストが適用される URI を実際の状況に合わせて変更してください。
GET
リクエストに対応するレンダリングは JSON レンダリングです。GET
の URL の拡張子は、次のように .json
となる必要があります。
http://localhost:4502/etc/workflow.json
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/etc/workflow/instances
HTTP リクエストメソッド | アクション |
GET |
使用可能なワークフローインスタンスをリストします。 |
POST |
新しいワークフローインスタンスを作成します。パラメーターを以下に示します。 |
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/etc/workflow/instances.{state}
HTTP リクエストメソッド | アクション |
---|---|
GET |
使用可能なワークフローインスタンスとその状態(RUNNING 、SUSPENDED 、ABORTED 、COMPLETED のいずれか)をリストします。 |
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/etc/workflow/instances/{id}
HTTP リクエストメソッド | アクション |
GET |
それぞれのワークフローモデルへのリンクを含むインスタンスデータ(定義とメタデータ)を取得します。 |
POST |
インスタンスの状態を変更します。新しい状態がパラメーター state として送信されます。状態は RUNNING 、SUSPENDED 、ABORTED のいずれかの値でなければなりません。新しい状態にアクセスできない場合(強制終了したインスタンスを休止にするなど)は、 409 (CONFLICT )の応答がクライアントに返されます。 |
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/etc/workflow/models
HTTP リクエストメソッド | アクション |
GET |
使用可能なワークフローモデルを一覧表示します。 |
POST |
新しいワークフローモデルを作成します.パラメーター title を送信すると、指定されたタイトルで新しいモデルが作成されます。JSON モデル定義をパラメーター model として付加すると、指定された定義に応じて新しいワークフローモデルが作成されます。新しいワークフローモデルリソースの URL を格納したロケーションヘッダーを持つ 201 の応答(CREATED )が返されます。モデル定義を modelfile というファイルパラメーターとして付加した場合も同じことが起こります。model パラメーターと modelfile パラメーターのどちらの場合も、シリアル化フォーマットを定義するには、type という追加パラメーターが必要です。新しいシリアル化フォーマットは、OSGI API を使用して統合できます。標準の JSON シリアライザーは、ワークフローエンジンに付属しています。そのタイプは JSON です。フォーマットの例は、以下を参照してください。 |
例:ブラウザーで http://localhost:4502/etc/workflow/models.json
へのリクエストをおこなうと、次のような JSON 応答が生成されます。
[
{"uri":"/var/workflow/models/activationmodel"}
,{"uri":"/var/workflow/models/dam/adddamsize"}
,{"uri":"/var/workflow/models/cloudconfigs/dtm-reactor/library-download"}
,{"uri":"/var/workflow/models/ac-newsletter-workflow-simple"}
,{"uri":"/var/workflow/models/dam/dam-create-language-copy"}
,{"uri":"/var/workflow/models/dam/dam-create-and-translate-language-copy"}
,{"uri":"/var/workflow/models/dam-indesign-proxy"}
,{"uri":"/var/workflow/models/dam-xmp-writeback"}
,{"uri":"/var/workflow/models/dam-parse-word-documents"}
,{"uri":"/var/workflow/models/dam/process_subasset"}
,{"uri":"/var/workflow/models/dam/dam_set_last_modified"}
,{"uri":"/var/workflow/models/dam/dam-autotag-assets"}
,{"uri":"/var/workflow/models/dam/update_asset"}
,{"uri":"/var/workflow/models/dam/update_asset_offloading"}
,{"uri":"/var/workflow/models/dam/dam-update-language-copy"}
,{"uri":"/var/workflow/models/dam/update_from_lightbox"}
,{"uri":"/var/workflow/models/cloudservices/DTM_bundle_download"}
,{"uri":"/var/workflow/models/dam/dam_download_asset"}
,{"uri":"/var/workflow/models/dam/dynamic-media-encode-video"}
,{"uri":"/var/workflow/models/dam/dynamic-media-video-thumbnail-replacement"}
,{"uri":"/var/workflow/models/dam/dynamic-media-video-user-uploaded-thumbnail"}
,{"uri":"/var/workflow/models/newsletter_bounce_check"}
,{"uri":"/var/workflow/models/projects/photo_shoot_submission"}
,{"uri":"/var/workflow/models/projects/product_photo_shoot"}
,{"uri":"/var/workflow/models/projects/approval_workflow"}
,{"uri":"/var/workflow/models/prototype-01"}
,{"uri":"/var/workflow/models/publish_example"}
,{"uri":"/var/workflow/models/publish_to_campaign"}
,{"uri":"/var/workflow/models/screens/publish_to_author_bin"}
,{"uri":"/var/workflow/models/s7dam/request_to_publish_to_youtube"}
,{"uri":"/var/workflow/models/projects/request_copy"}
,{"uri":"/var/workflow/models/projects/request_email"}
,{"uri":"/var/workflow/models/projects/request_landing_page"}
,{"uri":"/var/workflow/models/projects/request_launch"}
,{"uri":"/var/workflow/models/request_for_activation"}
,{"uri":"/var/workflow/models/request_for_deactivation"}
,{"uri":"/var/workflow/models/request_for_deletion"}
,{"uri":"/var/workflow/models/request_for_deletion_without_deactivation"}
,{"uri":"/var/workflow/models/request_to_complete_move_operation"}
,{"uri":"/var/workflow/models/reverse_replication"}
,{"uri":"/var/workflow/models/salesforce-com-export"}
,{"uri":"/var/workflow/models/scene7"}
,{"uri":"/var/workflow/models/scheduled_activation"}
,{"uri":"/var/workflow/models/scheduled_deactivation"}
,{"uri":"/var/workflow/models/screens/screens-update-asset"}
,{"uri":"/var/workflow/models/translation"}
,{"uri":"/var/workflow/models/s7dam/request_to_remove_from_youtube"}
,{"uri":"/var/workflow/models/wcm-translation/create_language_copy"}
,{"uri":"/var/workflow/models/wcm-translation/prepare_translation_project"}
,{"uri":"/var/workflow/models/wcm-translation/translate-i18n-dictionary"}
,{"uri":"/var/workflow/models/wcm-translation/sync_translation_job"}
,{"uri":"/var/workflow/models/wcm-translation/translate-language-copy"}
,{"uri":"/var/workflow/models/wcm-translation/update_language_copy"}
]
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502*{uri}*
ここで、*{uri}*
はリポジトリ内のモデルノードへのパスです。
HTTP リクエストメソッド | アクション |
GET |
モデル(定義とメタデータ)の HEAD バージョンを取得します。 |
PUT |
モデルの HEAD バージョンを更新します(新しいバージョンを作成します)。モデルの新しいバージョンのすべてのモデル定義を model というパラメーターとして追加する必要があります。さらに、新しいモデルの作成時には type パラメーターが必要で、値は JSON にする必要があります。 |
POST |
PUT の場合と同じ動作です。AEM ウィジェットは PUT 操作をサポートしていないので、これが必要になります。 |
DELETE |
モデルを削除します。ファイアウォールやプロキシの問題を解決するために、値 DELETE の X-HTTP-Method-Override ヘッダーエントリを含む POST も DELETE リクエストとして受け入れられます。 |
例:ブラウザーで http://localhost:4502/var/workflow/models/publish_example.json
へのリクエストをおこなうと、次のコードのような json
応答が返されます。
{
"id":"/var/workflow/models/publish_example",
"title":"Publish Example",
"version":"1.0",
"description":"This example shows a simple review and publish process.",
"metaData":
{
"multiResourceSupport":"true",
"tags":"wcm,publish"
},
"nodes":
[{
"id":"node0",
"type":"START",
"title":"Start",
"description":"The start node of the workflow.",
"metaData":
{
}
},
{
"id":"node1",
"type":"PARTICIPANT",
"title":"Validate Content",
"description":"Validate the modified content.",
"metaData":
{
"PARTICIPANT":"admin"
}
},
{
"id":"node2",
"type":"PROCESS",
"title":"Publish Content",
"description":"Publish the modified content.",
"metaData":
{
"PROCESS_AUTO_ADVANCE":"true",
"PROCESS":"com.day.cq.wcm.workflow.process.ActivatePageProcess"
}
},
{
"id":"node3",
"type":"END",
"title":"End",
"description":"The end node of the workflow.",
"metaData":
{
}
}],
"transitions":
[{
"from":"node0",
"to":"node1",
"metaData":
{
}
},
{
"from":"node1",
"to":"node2",
"metaData":
{
}
},
{
"from":"node2",
"to":"node3",
"metaData":
{
}
}
]}
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/etc/workflow/models/{id}.{version}
HTTP リクエストメソッド | アクション |
---|---|
GET |
指定されたバージョンのモデルのデータを取得します(存在する場合)。 |
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/bin/workflow/inbox
HTTP リクエストメソッド | アクション |
GET |
ユーザーのインボックスにある作業項目を一覧表示します。ユーザーは、HTTP 認証ヘッダーによって識別されます。 |
POST |
URI がパラメーター item として送信される作業項目を完了し、一致するワークフローインスタンスを次のノードに進めます。次のノードは、パラメーター route (1 ステップ戻る場合はパラメーター「backroute 」)によって定義されます。パラメーター delegatee を送信した場合は、パラメーター item によって識別される作業項目が、指定された参加者に委任されます。 |
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/bin/workflow/inbox/{id}
HTTP リクエストメソッド | アクション |
---|---|
GET |
ID によって識別されるインボックスの WorkItem のデータ(定義とメタデータ)を取得します。 |
実行中のすべてのワークフローのリストを取得するには、次の URL に対して GET を実行します。
http://localhost:4502/etc/workflow/instances.RUNNING.json
curl を使用した例:
curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json
結果に表示される uri
は、他のコマンドでインスタンス id
として使用することができます。その例を以下に示します。
[
{"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]
この curl
コマンドは、RUNNING
の代わりに任意の ワークフローステータス と使用することができます。
ワークフローコンソールのインスタンスタブに表示されているワークフローのタイトルを変更するには、次のように POST
コマンドを送信してください。
送信先:http://localhost:4502/etc/workflow/instances/{id}
使用するパラメーター:
action
:値は必ずUPDATE
にします。workflowTitle
:ワークフローのタイトルcurl を使用した例:
curl -u admin:admin -d "action=UPDATE&workflowTitle=myWorkflowTitle" http://localhost:4502/etc/workflow/instances/{id}
# for example
curl -u admin:admin -d "action=UPDATE&workflowTitle=myWorkflowTitle" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
使用可能なすべてのワークフローモデルのリストを取得するには、次の URL に対して GET を実行します。
http://localhost:4502/etc/workflow/models.json
curl を使用した例:
curl -u admin:admin http://localhost:4502/etc/workflow/models.json
ワークフローモデルの管理も参照してください。
com.adobe.granite.workflow.WorkflowSession
クラスは、javax.jcr.Session
オブジェクトまたは org.apache.sling.api.resource.ResourceResolver
オブジェクトから適応させることができます。
JSP スクリプト(またはサーブレットクラスの Java コード)で、HTTP リクエストオブジェクトを使用して SlingHttpServletRequest
オブジェクトを取得します。これにより、ResourceResolver
オブジェクトへのアクセスが可能になります。ResourceResolver
オブジェクトを WorkflowSession
に適応させます。
<%
%><%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false"
import="com.adobe.granite.workflow.WorkflowSession,
org.apache.sling.api.SlingHttpServletRequest"%><%
SlingHttpServletRequest slingReq = (SlingHttpServletRequest)request;
WorkflowSession wfSession = slingReq.getResourceResolver().adaptTo(WorkflowSession.class);
%>
sling
変数を使用して、ResourceResolver
オブジェクトの取得に使用する SlingHttpServletRequest
オブジェクトを取得します。ResourceResolver
オブジェクトを WorkflowSession
オブジェクトに適応させます。
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
以下の例では、ワークフローモデルにアクセスする方法を説明しています。
WorkflowSession.createNewModel
メソッドを使用します。例では以下を実行します。
/var/workflow/models/mymodel/jcr:content/model
ID を持つモデルを作成します。モデルを削除するには、モデルの metaData
子ノードの deleted
プロパティを true
に設定します。
モデルを削除しても、モデルノードは削除されません。
新しいモデルを作成する場合:
ワークフローモデルエディターでは、モデルが /var/workflow/models
の下で特定のノード構造を使用している必要があります。モデルの親ノードは、以下のプロパティ値の jcr:content
ノードを持つ cq:Page
タイプである必要があります。
sling:resourceType
:cq/workflow/components/pages/model
cq:template
:/libs/cq/workflow/templates/model
モデルを作成する際は、まずこの cq:Page
ノードを作成し、その jcr:content
ノードを model ノードの親として使用する必要があります。
一部のメソッドがモデルの識別に必要とする id
引数は、リポジトリ内の model ノードの絶対パスです。
/var/workflow/models/<*model_name>*/jcr:content/model
すべてのワークフローモデルをリストする方法を参照してください。
<%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false" import="com.adobe.granite.workflow.WorkflowSession,
com.adobe.granite.workflow.model.WorkflowModel,
org.apache.sling.api.SlingHttpServletRequest"%><%
SlingHttpServletRequest slingReq = (SlingHttpServletRequest)request;
WorkflowSession wfSession = slingReq.getResourceResolver().adaptTo(WorkflowSession.class);
/* Create the parent page */
String modelRepo = new String("/var/workflow/models");
String modelTemplate = new String ("/libs/cq/workflow/templates/model");
String modelName = new String("mymodel");
Page modelParent = pageManager.create(modelRepo, modelName, modelTemplate, "My workflow model");
/* create the model */
String modelId = new String(modelParent.getPath()+"/jcr:content/model")
WorkflowModel model = wfSession.createNewModel("Made using Java",modelId);
/* delete the model */
wfSession.deleteModel(modelId);
%>
var resolver = sling.getRequest().getResource().getResourceResolver();
var wfSession = resolver.adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
var pageManager = resolver.adaptTo(Packages.com.day.cq.wcm.api.PageManager);
//create the parent page node
var workflowPage = pageManager.create("/var/workflow/models", "mymodel", "/libs/cq/workflow/templates/model", "Created via ECMA Script");
var modelId = workflowPage.getPath()+ "/jcr:content/model";
//create the model
var model = wfSession.createNewModel("My Model", modelId);
//delete the model
var model = wfSession.deleteModel(modelId);
# deleting the model by its id
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}
必要な詳細のレベルを考慮した結果、curl はモデルの作成や読み取りに使用できないと見なされています。
WorkflowStatus API を使用して、ノードのワークフローステータスに関する情報を取得できます。
各種メソッドには以下のパラメーターがあります。
excludeSystemWorkflows
このパラメーターを true
に設定すると、関連する結果からシステムワークフローを除外することができます。
Models
ワークフローがシステムワークフローであると見なされるように指定する、Adobe Granite Workflow PayloadMapCache という OSGi 設定を更新できます。デフォルト(実行時)のワークフローモデルを以下に示します。
/var/workflow/models/scheduled_activation/jcr:content/model
/var/workflow/models/scheduled_deactivation/jcr:content/model
事前定義した時間内に終了しなかった参加者ステップを自動的に進める必要がある場合は、以下の手順を実行します。
OSGI イベントリスナーを実装して、タスクの作成と変更をリスンします。
タイムアウト(期限)を指定し、その時点で実行されるようにスケジュールされた sling ジョブを作成します。
タイムアウトになり、ジョブが実行されるときに通知されるジョブハンドラーを作成します。
このハンドラーは、タスクがまだ完了していない場合に、タスクに対して必要なアクションを実行します。
実行するアクションは、この手法を使用できるよう明確に定義されている必要があります。
(プログラムによって)ワークフローインスタンスとやり取りする方法について、以下に基本的な例を示します。
// starting a workflow
WorkflowModel model = wfSession.getModel(workflowId);
WorkflowData wfData = wfSession.newWorkflowData("JCR_PATH", repoPath);
wfSession.startWorkflow(model, wfData);
// querying and managing a workflow
Workflow[] workflows workflows = wfSession.getAllWorkflows();
Workflow workflow= wfSession.getWorkflow(id);
wfSession.suspendWorkflow(workflow);
wfSession.resumeWorkflow(workflow);
wfSession.terminateWorkflow(workflow);
// starting a workflow
var model = wfSession.getModel(workflowId);
var wfData = wfSession.newWorkflowData("JCR_PATH", repoPath);
wfSession.startWorkflow(model, wfData);
// querying and managing a workflow
var workflows = wfSession.getWorkflows(“RUNNING“);
var workflow= wfSession.getWorkflow(id);
wfSession.suspendWorkflow(workflow);
wfSession.resumeWorkflow(workflow);
wfSession.terminateWorkflow(workflow);
ワークフローの開始
# starting a workflow
curl -d "model={id}&payloadType={type}&payload={payload}" http://localhost:4502/etc/workflow/instances
# for example:
curl -u admin:admin -d "model=/var/workflow/models/request_for_activation&payloadType=JCR_PATH&payload=/content/we-retail/us/en/products" http://localhost:4502/etc/workflow/instances
インスタンスの一覧表示
# listing the instances
curl -u admin:admin http://localhost:4502/etc/workflow/instances.json
これにより、すべてのインスタンスが一覧表示されます。以下に例を示します。
[
{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_1"}
,{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_2"}
]
特定のステータスのインスタンスを一覧表示する方法については、実行中のすべてのワークフローとその ID のリストを取得する方法を参照してください。
ワークフローの休止
# suspending a workflow
curl -d "state=SUSPENDED" http://localhost:4502/etc/workflow/instances/{id}
# for example:
curl -u admin:admin -d "state=SUSPENDED" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
ワークフローの再開
# resuming a workflow
curl -d "state=RUNNING" http://localhost:4502/etc/workflow/instances/{id}
# for example:
curl -u admin:admin -d "state=RUNNING" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
ワークフローインスタンスの終了
# terminating a workflow
curl -d "state=ABORTED" http://localhost:4502/etc/workflow/instances/{id}
# for example:
curl -u admin:admin -d "state=ABORTED" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
(プログラムによって)作業項目とやり取りする方法について、以下に基本的な例を示します。
// querying work items
WorkItem[] workItems = wfSession.getActiveWorkItems();
WorkItem workItem = wfSession.getWorkItem(id);
// getting routes
List<Route> routes = wfSession.getRoutes(workItem);
// delegating
Iterator<Participant> delegatees = wfSession.getDelegatees(workItem);
wfSession.delegateWorkItem(workItem, delegatees.get(0));
// completing or advancing to the next step
wfSession.complete(workItem, routes.get(0));
// querying work items
var workItems = wfSession.getActiveWorkItems();
var workItem = wfSession.getWorkItem(id);
// getting routes
var routes = wfSession.getRoutes(workItem);
// delegating
var delegatees = wfSession.getDelegatees(workItem);
wfSession.delegateWorkItem(workItem, delegatees.get(0));
// completing or advancing to the next step
wfSession.complete(workItem, routes.get(0));
インボックスの作業項目の一覧表示
# listing the work items
curl -u admin:admin http://localhost:4502/bin/workflow/inbox
現在インボックス内にある作業項目の詳細が一覧表示されます。以下に例を示します。
[{
"uri_xss": "/var/workflow/instances/server0/2018-02-26/prototype-01_2/workItems/node2_var_workflow_instances_server0_2018-02-26_prototype-01_2",
"uri": "/var/workflow/instances/server0/2018-02-26/prototype-01_2/workItems/node2_var_workflow_instances_server0_2018-02-26_prototype-01_2",
"currentAssignee_xss": "workflow-administrators",
"currentAssignee": "workflow-administrators",
"startTime": 1519656289274,
"payloadType_xss": "JCR_PATH",
"payloadType": "JCR_PATH",
"payload_xss": "/content/we-retail/es/es",
"payload": "/content/we-retail/es/es",
"comment_xss": "Process resource is null",
"comment": "Process resource is null",
"type_xss": "WorkItem",
"type": "WorkItem"
},{
"uri_xss": "configuration/configure_analyticstargeting",
"uri": "configuration/configure_analyticstargeting",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
},{
"uri_xss": "configuration/securitychecklist",
"uri": "configuration/securitychecklist",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
},{
"uri_xss": "configuration/enable_collectionofanonymoususagedata",
"uri": "configuration/enable_collectionofanonymoususagedata",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
},{
"uri_xss": "configuration/configuressl",
"uri": "configuration/configuressl",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
}
作業項目の委任
# delegating
curl -d "item={item}&delegatee={delegatee}" http://localhost:4502/bin/workflow/inbox
# for example:
curl -u admin:admin -d "item=/etc/workflow/instances/server0/2017-03-08/request_for_activation_1/workItems/node1_etc_workflow_instances_server0_2017-03-08_request_for_act_1&delegatee=administrators" http://localhost:4502/bin/workflow/inbox
delegatee
は、ワークフローステップに有効なオプションである必要があります。
作業項目を完了する、または次のステップに進める
# retrieve the list of routes; the results will be similar to {"results":1,"routes":[{"rid":"233123169","label":"End","label_xss":"End"}]}
http://localhost:4502/etc/workflow/instances/<path-to-the-workitem>.routes.json
# completing or advancing to the next step; use the appropriate route ID (rid value) from the above list
curl -d "item={item}&route={route}" http://localhost:4502/bin/workflow/inbox
# for example:
curl -u admin:admin -d "item=/etc/workflow/instances/server0/2017-03-08/request_for_activation_1/workItems/node1_etc_workflow_instances_server0_2017-03-08_request_for_activation_1&route=233123169" http://localhost:4502/bin/workflow/inbox
OSGi イベントフレームワークを使用して、com.adobe.granite.workflow.event.WorkflowEvent
クラスが定義するイベントをリッスンします。このクラスは、イベントの対象に関する情報を取得するのに役立ついくつかのメソッドも提供します。例えば、getWorkItem
メソッドは、イベントに関与する作業項目の WorkItem
オブジェクトを返します。
以下のサンプルコードでは、ワークフローイベントをリッスンし、イベントのタイプに応じてタスクを実行するサービスを定義しています。
package com.adobe.example.workflow.listeners;
import org.apache.sling.event.jobs.JobProcessor;
import org.apache.sling.event.jobs.JobUtil;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import com.adobe.granite.workflow.event.WorkflowEvent;
import com.adobe.granite.workflow.exec.WorkItem;
/**
* The <code>WorkflowEventCatcher</code> class listens to workflow events.
*/
@Component(metatype=false, immediate=true)
@Service(value=org.osgi.service.event.EventHandler.class)
public class WorkflowEventCatcher implements EventHandler, JobProcessor {
@Property(value=com.adobe.granite.workflow.event.WorkflowEvent.EVENT_TOPIC)
static final String EVENT_TOPICS = "event.topics";
private static final Logger logger = LoggerFactory.getLogger(WorkflowEventCatcher.class);
public void handleEvent(Event event) {
JobUtil.processJob(event, this);
}
public boolean process(Event event) {
logger.info("Received event of topic: " + event.getTopic());
String topic = event.getTopic();
try {
if (topic.equals(WorkflowEvent.EVENT_TOPIC)) {
WorkflowEvent wfevent = (WorkflowEvent)event;
String eventType = wfevent.getEventType();
String instanceId = wfevent.getWorkflowInstanceId();
if (instanceId != null) {
//workflow instance events
if (eventType.equals(WorkflowEvent.WORKFLOW_STARTED_EVENT) ||
eventType.equals(WorkflowEvent.WORKFLOW_RESUMED_EVENT) ||
eventType.equals(WorkflowEvent.WORKFLOW_SUSPENDED_EVENT)) {
// your code comes here...
} else if (
eventType.equals(WorkflowEvent.WORKFLOW_ABORTED_EVENT) ||
eventType.equals(WorkflowEvent.WORKFLOW_COMPLETED_EVENT)) {
// your code comes here...
}
// workflow node event
if (eventType.equals(WorkflowEvent.NODE_TRANSITION_EVENT)) {
WorkItem currentItem = (WorkItem) event.getProperty(WorkflowEvent.WORK_ITEM);
// your code comes here...
}
}
}
} catch(Exception e){
logger.debug(e.getMessage());
e.printStackTrace();
}
return true;
}
}