Interaction avec les workflows par programmation

Lors de la personnalisation et de l’extension de vos workflows, vous pouvez accéder aux objets de workflow en procédant comme suit :

Utilisation de l’API Java Workflow

L’API Java Workflow se compose du module com.adobe.granite.workflow et de plusieurs sous-modules. Le membre le plus important de l’API est la classe com.adobe.granite.workflow.WorkflowSession. La classe WorkflowSession permet d’accéder aux objets de workflow au moment de la conception et de l’exécution :

  • Modèles de workflow
  • Éléments de travail
  • Instances de workflow
  • Données de workflow
  • Éléments de la boîte de réception

La classe fournit également plusieurs méthodes d’intervention dans les cycles de vie du workflow.

Le tableau suivant fournit des liens vers la documentation de référence de plusieurs objets Java clés à utiliser pour interagir avec des workflows par programmation. Les exemples suivants montrent comment obtenir et utiliser les objets de classe dans le code.

Fonctionnalités Objets
Accès à un workflow WorkflowSession
Exécution et interrogation d’une instance de workflow Workflow
WorkItem
WorkflowData
Gestion d’un modèle de workflow WorkflowModel
WorkflowNode
WorkflowTransition
Informations relatives à un noeud qui se trouve dans le processus (ou non) WorkflowStatus

Obtention d’objets de workflow dans des scripts ECMA

Comme indiqué à la section Recherche du script, AEM (via Apache Sling) fournit un moteur de script ECMA qui exécute des scripts ECMA côté serveur. La classe org.apache.sling.scripting.core.ScriptHelper est mise immédiatement à la disposition de vos scripts en tant que variable sling.

La classe ScriptHelper permet d’accéder à l’objet SlingHttpServletRequest que vous pouvez utiliser pour obtenir finalement l’objet WorkflowSession ; par exemple :

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

Utilisation de l’API REST Workflow

La console de flux de travaux utilise fortement l'API REST ; cette page décrit donc l’API REST pour les workflows.

Remarque

L’outil de ligne de commande curl vous permet d’utiliser l’API REST de Workflow pour accéder aux objets de workflow et gérer les cycles de vie des instances. Les exemples figurant sur cette page illustrent l’utilisation de l’API REST au moyen de l’outil de ligne de commande curl.

Les actions suivantes sont prises en charge par l’API REST :

Remarque

Firebug, une extension Firefox destinée au développement web, permet de suivre le trafic HTTP lorsque la console est utilisée. Vous pouvez, par exemple, vérifier les paramètres et les valeurs envoyés au serveur AEM avec une requête POST.

In this page it is assumed that AEM runs on localhost at port 4502 and that the installation context is " /" (root). Si ce n’est pas le cas de votre installation, les URI auxquelles les requêtes HTTP s’appliquent doivent être adaptées en conséquence.

Le rendu pris en charge pour les requêtes GET est de type JSON. The URLs for GET should have the .json extension, for example:

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

Gestion des instances de workflow

Les méthodes de requête HTTP suivantes s’appliquent à :

http://localhost:4502/etc/workflow/instances

Méthode de requête HTTP Actions
GET Liste les instances de processus disponibles.
POST

Crée une instance de processus. The parameters are:
- model: the ID (URI) of the respective workflow model
- payloadType: containing the type of the payload (for example JCR_PATH or URL).
La charge utile est envoyée en tant que paramètre payload. A 201 (CREATED) response is sent back with a location header containing the URL of the new workflow instance resource.

Gestion d’une instance de workflow en fonction de son état

Les méthodes de requête HTTP suivantes s’appliquent à :

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

Méthode de requête HTTP Actions
GET Liste les instances de processus disponibles et leurs états ( RUNNING, SUSPENDED, ABORTED ou COMPLETED)

Gestion d’une instance de workflow en fonction de son ID

Les méthodes de requête HTTP suivantes s’appliquent à :

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

Méthode de requête HTTP Actions
GET Récupère les données d’instances (définition et métadonnées), y compris le lien vers le modèle de processus correspondant.
POST Modifie l’état de l’instance. Le nouvel état est envoyé en tant que paramètre state et doit avoir l’une des valeurs suivantes : RUNNING, SUSPENDEDou ABORTED.
Si le nouvel état n'est pas accessible (par exemple lors de la suspension d'une instance terminée), une 409 réponse (CONFLICT) est renvoyée au client.

Gestion de modèles de workflow

Les méthodes de requête HTTP suivantes s’appliquent à :

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

Méthode de requête HTTP Actions
GET Liste les modèles de processus disponibles.
POST Crée un nouveau modèle de processus. If the parameter title is sent, a new model is created with the specified title. Attaching a JSON model definition as parameter model creates a new workflow model according to the provided definition.
Une 201 réponse (CREATED) est renvoyée avec un en-tête d'emplacement contenant l'URL de la nouvelle ressource de modèle de processus.
Il en va de même lorsqu'une définition de modèle est jointe en tant que paramètre de fichier appelé modelfile.
Dans les deux cas des paramètres model et modelfile , un paramètre supplémentaire appelé type est nécessaire pour définir le format de sérialisation. De nouveaux formats de sérialisation peuvent être intégrés à l’aide de l’API OSGI. Un sérialiseur JSON standard est fourni avec le moteur de workflow. Il est de type JSON. Vous trouverez, ci-dessous, un exemple de ce format.

Example: in the browser, a request to http://localhost:4502/etc/workflow/models.json generates a json response similar to the following:

[
    {"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"}
]

Gestion d’un modèle de workflow spécifique

Les méthodes de requête HTTP suivantes s’appliquent à :

http://localhost:4502*{uri}*

Where *{uri}* is the path to the model node in the repository.

Méthode de requête HTTP Actions
GET Obtient la HEAD version du modèle (définition et métadonnées).
PUT Met à jour la HEAD version du modèle (crée une nouvelle version).
La définition complète du modèle pour la nouvelle version du modèle doit être ajoutée en tant que paramètre appelé model. Additionally a type parameter is needed as when creating new models and needs to have the value JSON.
POST Même comportement qu'avec le PUT. Needed because AEM widgets do not support PUT operations.
DELETE Supprime le modèle. Afin de résoudre les problèmes de pare-feu/proxy, un POST qui contient une entrée X-HTTP-Method-Override d'en-tête avec une valeur DELETE sera également accepté comme DELETE demande.

Example: in the browser, a request to http://localhost:4502/var/workflow/models/publish_example.json returns a json response that is similar to the following code:

{
  "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":
    {
    }
  }
]}

Gestion d’un modèle de workflow en fonction de sa version

Les méthodes de requête HTTP suivantes s’appliquent à :

http://localhost:4502/etc/workflow/models/{id}.{version}

Méthode de requête HTTP Actions
GET Récupère les données du modèle dans la version donnée (le cas échéant).

Gestion de boîtes de réception (utilisateur)

Les méthodes de requête HTTP suivantes s’appliquent à :

http://localhost:4502/bin/workflow/inbox

Méthode de requête HTTP Actions
GET Liste les tâches qui se trouvent dans la boîte de réception de l’utilisateur, qui est identifié par les en-têtes d’authentification HTTP.
POST Termine l’élément de travail dont l’URI est envoyé en tant que paramètre item et avance l’instance de flux de travail appropriée sur le ou les noeuds suivants, qui est défini par le paramètre route ou backroute en cas de retour en arrière.
Si le paramètre delegatee est envoyé, la tâche identifiée par le paramètre item est déléguée au participant spécifié.

Gestion d’une boîte de réception (utilisateur) en fonction de l’ID d’élément de travail

Les méthodes de requête HTTP suivantes s’appliquent à :

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

Méthode de requête HTTP Actions
GET Récupère les données (définition et métadonnées) de la boîte de réception WorkItem identifiée par son identifiant.

Exemples

Comment obtenir la liste de tous les workflows actifs avec leurs ID

Pour obtenir la liste de tous les workflow actifs, adressez une requête GET à :

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

Comment obtenir la liste de tous les workflows actifs avec leurs ID – REST avec curl

Exemple d’utilisation de curl :

curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json

The uri displayed in the results can be used as the instance id in other commands; for example:

[
    {"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]
Remarque

This curl command can be used with any workflow status in place of RUNNING.

Comment modifier le titre du workflow

Pour modifier le Titre du workflow affiché dans l’onglet Instances de la console Workflow, envoyez une commande POST :

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

  • avec les paramètres suivants :

    • action: sa valeur doit être : UPDATE
    • workflowTitle: titre du processus

Comment modifier le titre du workflow – REST avec curl

Exemple d’utilisation de 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

Comment répertorier tous les modèles de workflow

Pour obtenir la liste de tous les modèles de workflow disponibles, adressez une requête GET à :

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

Comment répertorier tous les modèles de workflow – REST avec curl

Exemple d’utilisation de curl :

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

Obtention d’un objet WorkflowSession

The com.adobe.granite.workflow.WorkflowSession class is adaptable from a javax.jcr.Session object or a org.apache.sling.api.resource.ResourceResolver object.

Obtention d’un objet WorkflowSession – Java

Dans un script JSP (ou un code Java pour une classe servlet), utilisez l’objet de requête HTTP pour obtenir un objet SlingHttpServletRequest qui permet d’accéder à un objet ResourceResolver. Adaptez l’ ResourceResolver objet à 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);
%>

Obtention d’un objet WorkflowSession – Script ECMA

Use the sling variable to obtain the SlingHttpServletRequest object that you use to obtain a ResourceResolver object. Adapt the ResourceResolver object to the WorkflowSession object.

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

Création, lecture ou suppression de modèles de workflow

Les exemples suivants montrent comment accéder à des modèles de workflow :

  • Le code pour un script ECMA et Java utilise la méthode WorkflowSession.createNewModel.
  • La commande curl accède directement au modèle à l’aide de son URL.

Les exemples utilisés :

  1. Créez un modèle (avec l’ID /var/workflow/models/mymodel/jcr:content/model).
  2. suppriment le modèle.
Remarque

Deleting the model sets the deleted property of the model's metaData child node to true.

Cette opération ne supprime pas le nœud de modèle.

Lors de la création d’un modèle :

  • L’éditeur de modèle de workflow exige que les modèles utilisent une structure de nœud spécifique sous /var/workflow/models. The parent node of the model must be of the type cq:Page having a jcr:content node with the following property values:

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

    Lorsque vous créez un modèle, vous devez d’abord créer ce nœud cq:Page et utiliser son nœud jcr:content comme parent du nœud de modèle.

  • The id argument that some methods require for identifying the model is the absolute path of the model node in the repository:

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

Création, lecture ou suppression de modèles de workflow – 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);
%>

Création, lecture ou suppression de modèles de workflow – Script 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);

Suppression d’un modèle de workflow – REST avec curl

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

En raison du niveau de détail requis, curl n’est pas considérée comme une commande pratique pour créer et/ou lire un modèle.

Filtrage des workflows système lors de la vérification de l’état du workflow

You can use the WorkflowStatus API to retrieve information about the workflow status of a node.

Plusieurs méthodes sont associées au paramètre :

excludeSystemWorkflows

Ce paramètre peut être défini sur true pour indiquer que les workflows système doivent être exclus des résultats.

You can update the OSGi configuration Adobe Granite Workflow PayloadMapCache that specifies the workflow Models to be considered as system workflows. Les modèles de workflow (exécution) par défaut sont les suivants :

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

Avance automatique de l’étape de participant après un dépassement de délai

Si vous devez avancer automatiquement une étape Participant qui n’a pas été accomplie dans un délai prédéfini, vous pouvez effectuer les opérations suivantes :

  1. Implémentez un détecteur d’événements OSGI pour réaliser une écoute lors de la création et de la modification de tâches.

  2. Spécifiez un délai d’expiration (échéance), puis créez une tâche sling planifiée pour qu’elle se déclenche à ce moment-là.

  3. Écrivez un gestionnaire de tâches qui est averti lors du dépassement du délai et qui déclenche la tâche.

    Ce gestionnaire exécutera l’action requise sur la tâche si cette dernière n’est pas encore terminée.

Remarque

L’action à exécuter doit être clairement définie pour qu’il soit possible d’utiliser cette méthode.

Interaction avec des instances de workflow

Vous trouverez, ci-dessous, des exemples d’interaction de base (par programmation) avec des instances de workflow.

Interaction avec des instances de workflow –·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);

Interaction avec des instances de workflow –·Script 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);

Interaction avec des instances de workflow –·REST avec curl

  • Démarrage d’un 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/jcr:content/model&payloadType=JCR_PATH&payload=/content/we-retail/us/en/products" http://localhost:4502/etc/workflow/instances
    
  • Liste des instances

    # listing the instances
    curl -u admin:admin http://localhost:4502/etc/workflow/instances.json
    

    Toutes les instances vont être répertoriées. Par exemple :

    [
        {"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_1"}
        ,{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_2"}
    ]
    
    Remarque

    See How to get a List of all Running Workflows with their IDs for listing instances with a specific status.

  • Interruption d’un workflow

    # 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
    
  • Reprise d’un workflow

    # 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
    
  • Arrêt d’une instance de workflow

    # 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
    

Interaction avec des éléments de travail

Vous trouverez, ci-dessous, des exemples d’interaction de base (par programmation) avec des éléments de travail.

Interaction avec des éléments de travail – 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));

Interaction avec des éléments de travail – Script 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));

Interaction avec des éléments de travail – REST avec curl

  • Affichage de la liste des éléments de travail à partir de la boîte de réception

    # listing the work items
    curl -u admin:admin http://localhost:4502/bin/workflow/inbox
    

    Les détails des éléments de travail qui se trouvent actuellement dans la boîte de réception sont répertoriés. Par exemple :

    [{
        "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"
      }
    
  • Délégation des éléments de travail

    # 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
    
    Remarque

    The delegatee must be a valid option for the workflow step.

  • Finalisation ou avance d’éléments de travail jusqu’à l’étape suivante

    # 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
    

Écoute des événements de workflow

Utilisez la structure d’événement OSGi pour écouter les événements définis par la classe com.adobe.granite.workflow.event.WorkflowEvent. Cette classe propose également plusieurs méthodes utiles pour obtenir des informations sur le sujet de l’événement. La méthode getWorkItem, par exemple, renvoie l’objet WorkItem de l’élément de travail qui est impliqué dans l’événement.

L’exemple de code suivant définit un service qui écoute les événements de workflow et exécute les tâches selon le type d’événement.

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

Sur cette page