10 nov. 2023 15:05:46 seb leridon avatar

wiki : Documentation Technique > Coder avec les workflows

Coder avec les workflows

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