プログラムによるワークフローとのやり取り

ワークフローをカスタマイズおよび拡張する際は、以下の方法でワークフローオブジェクトにアクセスできます。

ワークフロー Java API の使用

ワークフロー Java API は、com.adobe.granite.workflow パッケージといくつかのサブパッケージで構成されます。この API の最も重要な構成要素は、com.adobe.granite.workflow.WorkflowSession クラスです。WorkflowSession クラスは、デザイン時と実行時に、次のワークフローオブジェクトへのアクセスを可能にします。

  • ワークフローモデル
  • 作業項目
  • ワークフローインスタンス
  • ワークフローデータ
  • インボックス項目

このクラスは、ワークフローのライフサイクルに介入するためのメソッドもいくつか提供します。

以下の表に、プログラムによってワークフローとやり取りする際に使用するいくつかの重要な Java オブジェクトの参照ドキュメントへのリンクを示します。以降の例では、コード内でクラスオブジェクトを取得および使用する方法を示します。

機能 オブジェクト
ワークフローへのアクセス WorkflowSession
ワークフローインスタンスの実行とクエリー Workflow
WorkItem
WorkflowData
ワークフローモデルの管理 WorkflowModel
WorkflowNode
WorkflowTransition
ワークフロー内(またはそれ以外)のノードの情報 WorkflowStatus

ECMA スクリプトでのワークフローオブジェクトの取得

スクリプトの設置で説明したように、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を大幅に使用します。したがって、このページでは、ワークフローの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

新しいワークフローインスタンスを作成します。パラメーターを以下に示します。
- model:各ワークフローモデルのID(URI)
- payloadType:ペイロードのタイプ(例えば、 JCR_PATH またはURL)を含む。
ペイロードはパラメーターとして送信されま payloadす。201(CREATED)応答が、新しいワークフローインスタンスリソースのURLを含むロケーションヘッダーと共に返されます。

状態によるワークフローインスタンスの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/etc/workflow/instances.{state}

HTTPリクエストメソッド アクション
GET 使用可能なワークフローインスタンスとその状態( RUNNINGSUSPENDEDABORTEDまたはCOMPLETED )をリストします。

ID によるワークフローインスタンスの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/etc/workflow/instances/{id}

HTTPリクエストメソッド アクション
GET それぞれのワークフローモデルへのリンクを含むインスタンスデータ(定義とメタデータ)を取得します。
POST インスタンスの状態を変更します。新しい状態はパラメーターstateとして送信され、次の値のいずれかにする必要があります。RUNNINGSUSPENDEDまたはABORTED
新しい状態にアクセスできない場合(終了したインスタンスを休止する場合など)は、 409 (CONFLICT)応答がクライアントに返されます。

ワークフローモデルの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/etc/workflow/models

HTTPリクエストメソッド アクション
GET 使用可能なワークフローモデルを一覧表示します。
POST 新しいワークフローモデルを作成します. パラメータtitleが送信されると、指定したタイトルで新しいモデルが作成されます。 JSONモデル定義をパラメーターmodelとして添付すると、指定された定義に従って新しいワークフローモデルが作成されます。
新しい 201 ワークフローモデルリソースのURLを含むロケーションヘッダーと共に、応答(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ヘッダーエントリを含むPOSTDELETEリクエストとして受け入れられます。

例:ブラウザーで、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またはbackrouteで定義される次のノードに、対応するワークフローインスタンスを進めます。
パラメーターが送 delegatee 信されると、パラメーターによって識別される作業項 item 目が、指定した参加者に委任されます。

WorkItem ID による(ユーザーの)インボックスの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/bin/workflow/inbox/{id}

HTTPリクエストメソッド アクション
GET IDで識別されるインボックスWorkItemのデータ(定義とメタデータ)を取得します。

実行中のすべてのワークフローとその ID のリストを取得する方法

実行中のすべてのワークフローのリストを取得するには、次の URL に対して GET を実行します。

http://localhost:4502/etc/workflow/instances.RUNNING.json

実行中のすべてのワークフローとその ID のリストを取得する方法 - curl を使用した REST

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 を使用した REST

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 を使用した REST

curl を使用した例:

curl -u admin:admin http://localhost:4502/etc/workflow/models.json
メモ

ワークフローモデルの管理も参照してください。

WorkflowSession オブジェクトの取得

com.adobe.granite.workflow.WorkflowSessionクラスは、javax.jcr.Sessionオブジェクトまたはorg.apache.sling.api.resource.ResourceResolverオブジェクトから適応可能です。

WorkflowSession オブジェクトの取得 - Java

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);
%>

WorkflowSession オブジェクトの取得 - ECMA スクリプト

sling SlingHttpServletRequest 変数を使用して、 オブジェクトの取得に使用する オブジェクトを取得します。ResourceResolver ResourceResolverオブジェクトをWorkflowSessionオブジェクトに適応させます。

var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);

ワークフローモデルの作成、読み取り、削除

以下の例では、ワークフローモデルにアクセスする方法を説明しています。

  • Java および ECMA スクリプトコードは、WorkflowSession.createNewModel メソッドを使用します。
  • curl コマンドは、モデルの URL を使用してモデルに直接アクセスします。

例では以下を実行します。

  1. (ID /var/workflow/models/mymodel/jcr:content/modelを持つ)モデルを作成します。
  2. モデルを削除します。
メモ

モデルを削除すると、モデルのmetaData子ノードのdeletedプロパティがtrueに設定されます。

モデルを削除しても、モデルノードは削除されません。

新しいモデルを作成する場合:

  • ワークフローモデルエディターでは、モデルが/var/workflow/modelsの下の特定のノード構造を使用する必要があります。 モデルの親ノードは、次のプロパティ値を持つcq:Pageノードの型でなければなりません。jcr:content

    • sling:resourceType: cq/workflow/components/pages/model
    • cq:template: /libs/cq/workflow/templates/model

    モデルを作成する際は、まずこの cq:Page ノードを作成し、その jcr:content ノードを model ノードの親として使用する必要があります。

  • 一部のメソッドでモデルを識別するために必要なid引数は、リポジトリ内のモデルノードの絶対パスです。

    /var/workflow/models/<*model_name>*/jcr:content/model

ワークフローモデルの作成、読み取り、削除 - Java

<%@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);
%>

ワークフローモデルの作成、読み取り、削除 - ECMA スクリプト

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);

ワークフローモデルの削除 - curl を使用した REST

# deleting the model by its id
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}
メモ

必要な詳細のレベルを考慮した結果、curl はモデルの作成や読み取りに使用できないと見なされています。

ワークフローの状態の確認時のシステムワークフローの除外

WorkflowStatus APIを使用して、ノードのワークフローステータスに関する情報を取得できます。

各種メソッドには次のパラメーターがあります。

excludeSystemWorkflows

このパラメーターをtrueに設定すると、関連する結果からシステムワークフローを除外する必要があります。

OSGi設定 AdobeGranite Workflow PayloadMapCache​を更新して、システムワークフローと見なすワークフローModelsを指定できます。 デフォルト(実行時)のワークフローモデルを以下に示します。

  • /var/workflow/models/scheduled_activation/jcr:content/model
  • /var/workflow/models/scheduled_deactivation/jcr:content/model

タイムアウト後に参加者ステップを自動的に進める

事前定義した時間内に終了しなかった​参加者​ステップを自動的に進める必要がある場合は、以下の手順を実行します。

  1. OSGI イベントリスナーを実装して、タスクの作成と変更をリスンします。

  2. タイムアウト(期限)を指定し、その時点で実行されるようにスケジュールされた sling ジョブを作成します。

  3. タイムアウトになり、ジョブが実行されるときに通知されるジョブハンドラーを作成します。

    このハンドラーは、タスクがまだ完了していない場合に、タスクに対して必要なアクションを実行します。

メモ

実行するアクションは、この手法を使用できるよう明確に定義されている必要があります。

ワークフローインスタンスとのやり取り

(プログラムによって)ワークフローインスタンスとやり取りする方法について、以下に基本的な例を示します。

ワークフローインスタンスとのやり取り - Java

// 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);

ワークフローインスタンスとのやり取り - ECMA スクリプト

// 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);

ワークフローインスタンスとのやり取り - curl を使用した REST

  • ワークフローの開始

    # 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
    

作業項目とのやり取り

(プログラムによって)作業項目とやり取りする方法について、以下に基本的な例を示します。

作業項目とのやり取り - Java

// 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));

作業項目とのやり取り - ECMA スクリプト

// 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));

作業項目とのやり取り - curl を使用した REST

  • インボックスの作業項目の一覧表示

    # 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;
 }
}

このページ