wiki : Documentation Technique > Coder avec les workflows
Coder avec les workflows
- Présentation
- Architecture de mise en œuvre des workflows
- Définir un type de ressource de Workflow
- Description de l'API
- Initialiser/obtenir l'état d'une ressource
- Obtenir les actions disponibles pour une ressource
- Exécuter une action sur une ressource
- Forcer l’exécution d'actions automatiques
- Afficher l'historique d'une ressource (HTML)
- Obtenir la liste de toutes les ressources avec un état donné
- Autres méthodes de WorkflowService
- Afficher l'état et les actions d'une ressource dans une page HTML avec freemarker
- Créer des tâches de workflow
- Créer des prérequis aux actions automatiques
Présentation
Un workflow dans un site Lutèce est un ensemble de traitements réalisées sur une ressource.
Le workflow est constitué d'un ensemble d'états de la ressource. Celle-ci passe d'un état de départ à un état d'arrivé par une action. Une action regroupe une liste de tâches. Chaque tâche constitue un traitement réalisé sur la ressource (modification, suppression, notification...) afin de la faire passer à l'état suivant.
Il existe deux types d'actions :
- Les actions classiques sont déclenchées par un appel explicite dans le code Java.
- Les actions automatiques sont déclenchées automatiquement lors de l'arrivée de la ressource dans l'état de départ si tous les prérequis sont statisfaits.
Architecture de mise en œuvre des workflows
Le fonctionnement des workflows fait intervenir les composants suivants :
Nom | Fonction | Code source |
---|---|---|
Lutece Core | Définit une interface IWorkflowProvider et un WorkflowService pour manipuler les workflows | lutece-core/src/java/fr/paris/lutece/portal/service/workflow/ |
Librairie Workflow Core | Définit les objets métiers du workflow et les services permettant de les manipuler | lutece-wf-library-workflow-core |
Plugin Workflow | Implémentation du Workflow Provider | lutece-wf-plugin-workflow |
Modules Workflow | Définissent des types de tâches du workflow |
Définir un type de ressource de Workflow
Pour définir un nouveau type de ressource de Workflow il faut que l'objet correspondant ait un identifiant unique entier.
Les types de ressources sont identifiés par une chaine de caractères. Par exemple, pour les ressources standard d'un directory lutece, la chaine est :
public static final String WORKFLOW_RESOURCE_TYPE = "DIRECTORY_RECORD";
L'identifiant unique d'une ressource dans le workflow est le couple (identifiant_metier, resource_type).
Description de l'API
L'API est la classe fr.paris.lutece.portal.service.workflow.WorkflowService de lutece-core
Initialiser/obtenir l'état d'une ressource
//Initialize the workflow, this creates the state for our resource WorkflowService.getInstance( ).getState( idResource, WORKFLOW_RESOURCE_TYPE, idWorkflow, -1 );
- On obtient l’id du workflow par exemple en regardant dans la base de donnée. On pourra pour simplifier définir une propriété qu'on pourra changer si le plugin doit coexister avec d'autres plugins utilisant des workflow différents dans un fichier <plugin-metier>.properties:
pluginmetier.idWorkflow=1
- Si l'état de la ressource n'existe pas, il est créé et prend la valeur initiale.
Obtenir les actions disponibles pour une ressource
WorkflowService.getInstance( ).getActions( idResource, RESOURCE_TYPE, idWorkflow, getUser( ) );
Utile pour afficher les actions disponibles pour une liste de ressources.
Exécuter une action sur une ressource
WorkflowService.getInstance( ).doProcessActionWithResult( idResource, WORKFLOW_RESOURCE_TYPE, idAction, -1, request, locale, isAutomatic );
- Pour obtenir l'id de l'action, on pourra pour simplifier utiliser le même mécanisme que pour l'id du workflow dans un fichier properties si le workflow ne change pas.
- Si isAutomatic vaut true, l'identifiant de l'utilisateur backoffice n'est pas vérifié.
- si la méthode renvoie False, ce sera l'état alternatif qui sera défini à l'issue de l'action pour la ressource, sinon l'état principal.
Forcer l’exécution d'actions automatiques
WorkflowService.getInstance( ).executeActionAutomatic( idResource, WORKFLOW_RESOURCE_TYPE, idWorkflow, -1 );
Si l'action automatique n'est pas forcée, un daemon cherche les ressources éligibles et exécute les actions régulièrement.
Afficher l'historique d'une ressource (HTML)
WorkflowService.getInstance( ).getDisplayDocumentHistory( idResource, WORKFLOW_RESOURCE_TYPE, idWorkflow, request, getLocale( ) );
Obtenir la liste de toutes les ressources avec un état donné
WorkflowService.getInstance( ).getResourceIdListByIdState( idState, WORKFLOW_RESOURCE_TYPE );
- Pour obtenir l'id de l'état, on pourra pour simplifier utiliser le même mécanisme que pour l'id du workflow dans un fichier properties si le workflow ne change pas.
Autres méthodes de WorkflowService
Vous pouvez regarder les autres méthodes de la classe fr.paris.lutece.portal.service.workflow.WorkflowService sur lutece-core/src/java/fr/paris/lutece/portal/service/workflow/WorkflowService.java
Afficher l'état et les actions d'une ressource dans une page HTML avec freemarker
Pour afficher le nom de l'état et des icônes correspondant aux actions en HTML avec freemarker, on peut s'inspirer de l'exemple suivant :
<td><#if workflow_state??>${workflow_state.name}<#else>workflow desactive</#if></td> <td> <#if workflow_state??><#list workflow_action_list as action > <a href="METIER_JSP_URL?id_action=${action.id}&id_resource=${id}"> <img src="image?resource_type=workflow_icon_img&id=${action.icon.id}" <#if action.icon.width!=-1> width="${action.icon.width}"</#if> <#if action.icon.height!=-1> height="${action.icon.height}"</#if> title="${action.name}" alt="${action.name}"/> </a> </#list></#if> </td>
- pour chaque element de la liste, le code java générant la liste ajoute le résultat de :
// Put these in the freemarker model with model.put(...) WorkflowService.getInstance( ).getActions( idResource, WORKFLOW_RESOURCE_TYPE, idWorkflow, getUser( ) ); WorkflowService.getInstance( ).getState( idResource, WORKFLOW_RESOURCE_TYPE, idWorkflow, -1 );
- METIER_JSP_URL doit parser les arguments et appeler doProcessAction
Créer des tâches de workflow
La création de tâches de workflow est décrite dans Créer un module de workflow
Créer des prérequis aux actions automatiques
La création de prérequis aux actions automatiques est décrite dans Créer un prérequis aux actions automatiques