personalizzazione ed estensione dei flussi di lavoro è possibile accedere agli oggetti del flusso di lavoro:
L'API Java del flusso di lavoro è costituita dal pacchetto com.adobe.granite.workflow
e da diversi pacchetti secondari. Il membro più significativo dell'API è la classe com.adobe.granite.workflow.WorkflowSession
. La classe WorkflowSession
consente di accedere sia agli oggetti del flusso di lavoro in fase di progettazione che di runtime:
La classe fornisce inoltre diversi metodi per intervenire nei cicli di vita del flusso di lavoro.
La tabella seguente contiene collegamenti alla documentazione di riferimento di diversi oggetti Java chiave da utilizzare per interagire in modo programmatico con i flussi di lavoro. Gli esempi seguenti illustrano come ottenere e utilizzare gli oggetti classe nel codice.
Funzioni | Oggetti |
---|---|
Accesso a un flusso di lavoro | WorkflowSession |
Esecuzione e query di un'istanza del flusso di lavoro | Workflow WorkItem WorkflowData |
Gestione di un modello di workflow | WorkflowModel WorkflowNode WorkflowTransition |
Informazioni per un nodo che si trova o meno nel flusso di lavoro | WorkflowStatus |
Come descritto in Individuazione dello script, AEM (tramite Apache Sling) fornisce un motore di script ECMA che esegue script ECMA sul lato server. La classe org.apache.sling.scripting.core.ScriptHelper
è immediatamente disponibile per gli script come variabile sling
.
La classe ScriptHelper
fornisce l'accesso all'oggetto SlingHttpServletRequest
che è possibile utilizzare per ottenere l'oggetto WorkflowSession
; ad esempio:
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
La console Flusso di lavoro utilizza in modo significativo l’API REST; in questa pagina vengono descritte le API REST per i flussi di lavoro.
Lo strumento della riga di comando curl consente di utilizzare l'API REST del flusso di lavoro per accedere agli oggetti del flusso di lavoro e gestire i cicli di vita delle istanze. Gli esempi presenti in questa pagina dimostrano l'utilizzo dell'API REST tramite lo strumento della riga di comando curl.
Le azioni seguenti sono supportate con REST API:
Utilizzando Firebug, un'estensione Firefox per lo sviluppo Web, è possibile seguire il traffico HTTP quando la console è attiva. Ad esempio, è possibile controllare i parametri e i valori inviati al server AEM con una richiesta POST
.
In questa pagina si presume che AEM eseguito su localhost alla porta 4502
e che il contesto di installazione sia " /
" (root). In caso contrario, gli URI ai quali si applicano le richieste HTTP devono essere adattati di conseguenza.
Il rendering supportato per le richieste GET
è il rendering JSON. Gli URL di GET
devono avere l'estensione .json
, ad esempio:
http://localhost:4502/etc/workflow.json
Si applicano i seguenti metodi di richiesta HTTP:
http://localhost:4502/etc/workflow/instances
Metodo di richiesta HTTP | Azioni |
GET |
Elenca le istanze del flusso di lavoro disponibili. |
POST |
Crea una nuova istanza del flusso di lavoro. I parametri sono: |
Si applicano i seguenti metodi di richiesta HTTP:
http://localhost:4502/etc/workflow/instances.{state}
Metodo di richiesta HTTP | Azioni |
---|---|
GET |
Elenca le istanze del flusso di lavoro disponibili e i relativi stati ( RUNNING , SUSPENDED , ABORTED o COMPLETED ) |
Si applicano i seguenti metodi di richiesta HTTP:
http://localhost:4502/etc/workflow/instances/{id}
Metodo di richiesta HTTP | Azioni |
GET |
Ottiene i dati delle istanze (definizione e metadati) incluso il collegamento al rispettivo modello di flusso di lavoro. |
POST |
Modifica lo stato dell’istanza. Il nuovo stato viene inviato come parametro state e deve avere uno dei seguenti valori: RUNNING , SUSPENDED o ABORTED .Se il nuovo stato non è raggiungibile (ad esempio durante la sospensione di un'istanza terminata), una 409 (CONFLICT ) risposta viene restituita al client. |
Si applicano i seguenti metodi di richiesta HTTP:
http://localhost:4502/etc/workflow/models
Metodo di richiesta HTTP | Azioni |
GET |
Elenca i modelli di flusso di lavoro disponibili. |
POST |
Crea un nuovo modello flusso di lavoro. Se viene inviato il parametro title , viene creato un nuovo modello con il titolo specificato. Associando una definizione del modello JSON come parametro model viene creato un nuovo modello di workflow in base alla definizione fornita.Una 201 risposta (CREATED ) viene restituita con un'intestazione di posizione contenente l'URL della nuova risorsa del modello di workflow.Lo stesso accade quando una definizione del modello viene associata a un parametro di file denominato modelfile .Sia nel caso dei model parametri che in quello dei modelfile parametri, per definire il formato di serializzazione type è necessario un parametro aggiuntivo chiamato. I nuovi formati di serializzazione possono essere integrati utilizzando l'API OSGI. Viene fornito un serializzatore JSON standard con il motore del flusso di lavoro. Il suo tipo è JSON. Per un esempio del formato, vedere di seguito. |
Esempio: nel browser, una richiesta a http://localhost:4502/etc/workflow/models.json
genera una risposta json simile alla seguente:
[
{"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"}
]
Si applicano i seguenti metodi di richiesta HTTP:
http://localhost:4502*{uri}*
Dove *{uri}*
è il percorso del nodo del modello nella directory archivio.
Metodo di richiesta HTTP | Azioni |
GET |
Ottiene la versione HEAD del modello (definizione e metadati). |
PUT |
Aggiorna la versione HEAD del modello (crea una nuova versione).La definizione completa del modello per la nuova versione del modello deve essere aggiunta come parametro denominato model . Inoltre, è necessario un parametro type come per la creazione di nuovi modelli e deve avere il valore JSON . |
POST |
Stesso comportamento del PUT. Necessario perché AEM widget non supportano le operazioni PUT . |
DELETE |
Elimina il modello. Per risolvere problemi relativi a firewall/proxy, una POST contenente una voce di intestazione X-HTTP-Method-Override con valore DELETE verrà accettata anche come richiesta DELETE . |
Esempio: nel browser, una richiesta a http://localhost:4502/var/workflow/models/publish_example.json
restituisce una risposta json
simile al seguente codice:
{
"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":
{
}
}
]}
Si applicano i seguenti metodi di richiesta HTTP:
http://localhost:4502/etc/workflow/models/{id}.{version}
Metodo di richiesta HTTP | Azioni |
---|---|
GET |
Ottiene i dati del modello nella versione specificata (se presente). |
Si applicano i seguenti metodi di richiesta HTTP:
http://localhost:4502/bin/workflow/inbox
Metodo di richiesta HTTP | Azioni |
GET |
Elenca gli elementi di lavoro che si trovano nella inbox dell'utente, identificati dalle intestazioni di autenticazione HTTP. |
POST |
Completa l'elemento di lavoro il cui URI viene inviato come parametro item e avanza l'istanza del flusso di lavoro in base ai nodi successivi, che è definito dal parametro route o backroute in caso di ritorno a un passo precedente.Se il parametro delegatee viene inviato, l'elemento di lavoro identificato dal parametro item viene delegato al partecipante specificato. |
Si applicano i seguenti metodi di richiesta HTTP:
http://localhost:4502/bin/workflow/inbox/{id}
Metodo di richiesta HTTP | Azioni |
---|---|
GET |
Ottiene i dati (definizione e metadati) della inbox WorkItem identificata dal relativo ID. |
Per ottenere un elenco di tutti i flussi di lavoro in esecuzione, effettuate un GET per:
http://localhost:4502/etc/workflow/instances.RUNNING.json
Esempio con curl:
curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json
La uri
visualizzata nei risultati può essere utilizzata come istanza id
in altri comandi; ad esempio:
[
{"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]
Questo comando curl
può essere utilizzato con qualsiasi stato del flusso di lavoro al posto di RUNNING
.
Per modificare il titolo del flusso di lavoro visualizzato nella scheda Istanze della console del flusso di lavoro, inviare un comando POST
:
a: http://localhost:4502/etc/workflow/instances/{id}
con i seguenti parametri:
action
: il valore deve essere: UPDATE
workflowTitle
: titolo del flusso di lavoroEsempio con 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
Per ottenere un elenco di tutti i modelli di workflow disponibili, effettuate un GET per:
http://localhost:4502/etc/workflow/models.json
Esempio con curl:
curl -u admin:admin http://localhost:4502/etc/workflow/models.json
Vedere anche Gestione dei modelli di flussi di lavoro.
La classe com.adobe.granite.workflow.WorkflowSession
è adattabile da un oggetto javax.jcr.Session
o da un oggetto org.apache.sling.api.resource.ResourceResolver
.
In uno script JSP (o codice Java per una classe servlet), utilizzare l'oggetto richiesta HTTP per ottenere un oggetto SlingHttpServletRequest
che fornisce l'accesso a un oggetto ResourceResolver
. Adattare l'oggetto ResourceResolver
a 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);
%>
Utilizzare la variabile sling
per ottenere l'oggetto SlingHttpServletRequest
utilizzato per ottenere un oggetto ResourceResolver
. Adattare l'oggetto ResourceResolver
all'oggetto WorkflowSession
.
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
Gli esempi seguenti mostrano come accedere ai modelli di workflow:
WorkflowSession.createNewModel
.Gli esempi utilizzati:
/var/workflow/models/mymodel/jcr:content/model
).L'eliminazione del modello imposta la proprietà deleted
del nodo secondario metaData
del modello su true
.
L'eliminazione non rimuove il nodo del modello.
Durante la creazione di un nuovo modello:
L'editor del modello di workflow richiede che i modelli utilizzino una specifica struttura di nodi sotto /var/workflow/models
. Il nodo padre del modello deve essere di tipo cq:Page
con un nodo jcr:content
con i seguenti valori di proprietà:
sling:resourceType
: cq/workflow/components/pages/model
cq:template
: /libs/cq/workflow/templates/model
Quando si crea un modello, è innanzitutto necessario creare questo nodo cq:Page
e utilizzare il nodo jcr:content
come elemento padre del nodo del modello.
L'argomento id
che alcuni metodi richiedono per identificare il modello è il percorso assoluto del nodo del modello nell'archivio:
/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}
A causa del livello di dettaglio richiesto, il curl non è considerato pratico per creare e/o leggere un modello.
È possibile utilizzare l' WorkflowStatus API per recuperare informazioni sullo stato del flusso di lavoro di un nodo.
I diversi metodi hanno il parametro:
excludeSystemWorkflows
Questo parametro può essere impostato su true
per indicare che i flussi di lavoro di sistema devono essere esclusi dai risultati rilevanti.
è possibile aggiornare la configurazione OSGi Adobe PayloadMapCache del flusso di lavoro Granite che specifica il flusso di lavoro Models
da considerare come flussi di lavoro di sistema. I modelli di flusso di lavoro predefiniti (runtime) sono:
/var/workflow/models/scheduled_activation/jcr:content/model
/var/workflow/models/scheduled_deactivation/jcr:content/model
Se è necessario avanzare automaticamente un passaggio Partecipante che non è stato completato entro un tempo predefinito, è possibile:
Implementare un listener di eventi OSGI per ascoltare la creazione e la modifica delle attività.
Specificate un timeout (scadenza), quindi create un processo di sling pianificato da attivare in quel momento.
Scrivete un gestore di processi a cui verrà notificato il momento della scadenza del timeout e che attiva il processo.
Se l'attività non è ancora stata completata, il gestore eseguirà l'azione richiesta.
Le azioni da intraprendere devono essere chiaramente definite per poter utilizzare tale approccio.
Di seguito sono riportati alcuni esempi di base su come interagire (in modo progammatico) con le istanze del flusso di lavoro.
// 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);
Avvio di un flusso di lavoro
# 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
Elenco delle istanze
# listing the instances
curl -u admin:admin http://localhost:4502/etc/workflow/instances.json
Vengono elencate tutte le istanze; ad esempio:
[
{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_1"}
,{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_2"}
]
Vedere Come ottenere un elenco di tutti i flussi di lavoro in esecuzione con i relativi ID per elencare le istanze con uno stato specifico.
Sospensione di un flusso di lavoro
# 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
Ripresa di un flusso di lavoro
# 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
Terminazione di un'istanza del flusso di lavoro
# 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
Di seguito sono riportati alcuni esempi di base su come interagire (in modo progammatico) con gli elementi di lavoro.
// 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));
Elenco degli elementi di lavoro dalla casella in entrata
# listing the work items
curl -u admin:admin http://localhost:4502/bin/workflow/inbox
Vengono elencati i dettagli relativi agli elementi di lavoro attualmente presenti nella casella in entrata; ad esempio:
[{
"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"
}
Delega di elementi di lavoro
# 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
deve essere un'opzione valida per il passaggio del flusso di lavoro.
Completamento o avanzamento degli elementi di lavoro al passaggio successivo
# 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
Utilizzate il framework di eventi OSGi per ascoltare gli eventi definiti dalla classe com.adobe.granite.workflow.event.WorkflowEvent
. Questa classe fornisce anche diversi metodi utili per ottenere informazioni sull'oggetto dell'evento. Ad esempio, il metodo getWorkItem
restituisce l'oggetto WorkItem
per l'elemento di lavoro coinvolto nell'evento.
Il codice di esempio seguente definisce un servizio che ascolta gli eventi del flusso di lavoro ed esegue le attività in base al tipo di evento.
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;
}
}