Jun 3, 2015 12:27:19 PM Jon Harper avatar   789    

Prérequis

Pour utiliser le plugin-workflow avec des ressources métier, il faut d'abord:

  • s'assurer que le plugin-workflow est installé et activé (par exemple sur jsp/admin/system/ManagePlugins.jsp). Par example, la dépendance dans pom.xml
    <dependency>
            <groupId>fr.paris.lutece.plugins</groupId>
            <artifactId>plugin-workflow</artifactId>
            <version>[3.0.0,)</version>
            <type>lutece-plugin</type>
    </dependency>
  • créer un workflow, des états et des actions (jsp/admin/plugins/workflow/ManageWorkflow.jsp?plugin_name=workflow)
  • avoir un identifiant unique entier pour chaque ressource.

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

import fr.paris.lutece.portal.service.workflow.WorkflowService;
//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 example 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 coéxister avec d'autres plugins utilisant des workflow différents dans une 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

import fr.paris.lutece.portal.service.workflow.WorkflowService;
WorkflowService.getInstance(  ).getActions( idResource, RESOURCE_TYPE, idWorkflow, getUser(  ) );
  • Utile pour afficher les actions disponibles pour une liste de ressources.

Executer une action sur une ressource

import fr.paris.lutece.portal.service.workflow.WorkflowService;
WorkflowService.getInstance(  ).doProcessAction( 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é.

Forcer l'execution d'actions automatiques

import fr.paris.lutece.portal.service.workflow.WorkflowService;
WorkflowService.getInstance(  ).executeActionAutomatic( idResource, WORKFLOW_RESOURCE_TYPE, idWorkflow, -1 );
  • Si elle n'est pas forcée, un daemon cherche les ressources éligibles et execute les actions régulièrement.

Afficher l'historique d'une ressource (HTML)

import fr.paris.lutece.portal.service.workflow.WorkflowService;
WorkflowService.getInstance(  ).getDisplayDocumentHistory( idResource, WORKFLOW_RESOURCE_TYPE, idWorkflow, request, getLocale(  ) );

Obtenir la liste de toutes les resources avec un état donné

import fr.paris.lutece.portal.service.workflow.WorkflowService;
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.

Utilisation dans une liste HTML avec freemarker

Pour afficher le nom de l'état et des icones 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:
    import fr.paris.lutece.portal.service.workflow.WorkflowService;
    // 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

Utilisation avancée

  • Regarder les autres méthodes de la classe fr.paris.lutece.portal.service.workflow.WorkflowService définie dans lutece-core/src/java/fr/paris/lutece/portal/service/workflow/WorkflowService.java
  • Créer des taches de workflow Créer un module de workflow