30 juin 2025, 12:16:28 Nicolas Jouanne

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_satified.

Architecture de mise en œuvre des workflows

Le fonctionnement des workflows fait intervenir les composants suivants :

NomFonctionCode source
Lutece CoreDéfinit une interface IWorkflowProvider et un WorkflowService pour manipuler les workflowslutece-core/src/java/fr/paris/lutece/portal/service/workflow/
Librairie Workflow CoreDéfinit les objets métiers du workflow et les services permettant de les manipulerlutece-wf-library-workflow-core
Plugin WorkflowImplémentation du Workflow Providerlutece-wf-plugin-workflow
Modules WorkflowDé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 chaîne de caractères. Par exemple, pour les ressources standard d’un directory lutèce, la chaîne 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 workflows 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>${workflow_state.name?exists ? workflow_state.name : 'workflow désactivé'}</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 élément 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 howto_workflow_task.

Créer des prérequis aux actions automatiques

La création de prérequis aux actions automatiques est décrite dans howto_workflow_prerequisite.