11 juin 2025, 16:24:22 Clara Florac

Créer un module de workflow

Table des matières

Introduction

Le plugin-workflow de Lutèce permet de réaliser une suite de tâches. Chaque module de workflow implémente une tâche particulière du workflow.

Info Ce tutoriel ne concerne que les modules du plugin workflow à partir de la version 3.0.0.

Développement du module de workflow

Dépendance dans le POM

Le module de workflow doit dépendre du plugin-workflow. Ajouter la dépendance dans le fichier pom.xml du module de workflow :

<dependency>
    <groupId>fr.paris.lutece.plugins</groupId>
    <artifactId>plugin-workflow</artifactId>
    <version>[3.0.0,)</version>
    <type>lutece-plugin</type>
</dependency>

Création des classes Java

Création de la tâche de workflow

  • Créer une classe au niveau de la couche service (fr.paris.lutece.plugins.workflow.modules.mymodule.service.MyTask).
  • La nouvelle classe doit étendre la classe abstraite Task définie dans la library-workflow-core :
public class MyTask extends Task
{
    ...
}

La library-workflow-core offre une autre classe abstraite SimpleTask implémentant les divers méthodes. Cette classe permet aux implémentations dans les modules de se passer de l’implémentation de certaines méthodes inutiles dans leur cas de figure.

Création d’une configuration pour la tâche de workflow

Il est parfois nécessaire qu’une tâche de workflow ait besoin d’une configuration particulière, comme par exemple le nom du destinataire pour une tâche de notification. Pour cela, suivre les étapes suivantes :

  • Créer une classe au niveau de la couche business (fr.paris.lutece.plugins.workflow.modules.mymodule.business.MyTaskConfig).
  • La nouvelle classe doit étendre la classe abstraite TaskConfig définie dans la library-workflow-core :
public class MyTaskConfig extends TaskConfig
{
    ...
} 

La classe abstraite possède l’attribut ID task qui correspond à l’identifiant de la tâche.

  • Créer le DAO pour les accès en base de données de la configuration au niveau de la couche business (fr.paris.lutece.plugins.workflow.modules.mymodule.business.MyTaskConfigDAO).
  • La nouvelle classe doit implémenter l’interface ITaskConfigDAO :
public class MyTaskConfigDAO implements ITaskConfigDAO<MyTaskConfig>
{
    ...
}

Création de la vue de la tâche

  • Créer une classe au niveau de la couche web (fr.paris.lutece.plugins.workflow.modules.mymodule.web.MyTaskTaskComponent).
  • La nouvelle classe doit étendre la classe abstraite TaskComponent définie dans le plugin-workflow :
public class MyTaskTaskComponent extends TaskComponent
{
    ...
}
  • La library-workflow-core offre deux classes abstraites :
    • TaskComponent utilise BeanUtils pour remplir les configurations de façon automatique.
    • SimpleTaskComponent permettant d’éviter d’implémenter le formulaire intermédiaire et la configuration.
  • Le plugin-workflow offre trois autres classes abstraites :
    • AbstractTaskComponent implémente une méthode pour valider les beans utilisant les annotations JSR303.
    • NoFormTaskComponent permettant à votre implémentation d’éviter d’implémenter les méthodes concernant le formulaire intermédiaire.
    • NoConfigTaskComponent permettant à votre implémentation d’éviter d’implémenter les méthodes concernant la configuration de la tâche.

Configuration du fichier de context du module

Plusieurs beans doivent être ajoutés dans le fichier de contexte du module (fichier /WEB-INF/conf/plugins/workflow-mytask_context.xml) :

  • définir la tâche et son type :
<bean id="workflow-mytask.taskTypeMyTask" class="fr.paris.lutece.plugins.workflowcore.business.task.TaskType"
      p:key="taskMyTask" 
      p:titleI18nKey="module.workflow.mytask.task_title" 
      p:beanName="workflow-mytask.taskMyTask"
      p:configBeanName="workflow-mytask.taskMyTaskConfig"
      p:configRequired="true"
      p:formTaskRequired="true"
      p:taskForAutomaticAction="true" />
<bean id="workflow-mytask.taskMyTask" class="fr.paris.lutece.plugins.workflow.modules.mytask.service.MyTask" scope="prototype" />

Le type de la tâche doit comporter les attributs suivants :

NomDescriptionExemple
keyLa clé technique de la tâche (doit être unique)taskMyTask
titleI18nKeyLa clé i18n de la tâchemodule.workflow.mytask.task_title
beanNameLe nom du bean de la tâche (doit être identique à l’ID du bean définissant la tâche)workflow-mytask.taskMyTask
configBeanNameLe nom du bean de la configuration de la tâche (doit être identique à l’ID du bean définissant la configuration de la tâche). Ne le définir que si la tâche de workflow a besoin d’une configurationworkflow-mytask.taskMyTaskConfig
configRequiredAttribut permettant de savoir si la tâche a besoin d’une configuration de l’administrateur technique ou non. Attribut optionnel si la tâche n’a pas besoin de configuration.true
formTaskRequiredAttribut permettant de savoir si la tâche a besoin d’un formulaire intermédiaire lors de l’exécution de l’action. Attribut optionnel si la tâche n’a pas besoin de formulaire intermédiaire.true
taskForAutomaticActionAttribut permettant de savoir si la tâche peut être assignée à une action automatique. Attribut optionnel si la tâche ne peut pas être assignée à une action automatique.true

Attention ! Ne pas oublier le scope prototype dans la définition du bean de la tâche.

Attention ! Si un formulaire d’exécution de tâche est utilisé, la tâche ne peut pas être automatique. De ce fait :

Si taskForAutomaticAction = //True// , formTaskRequired est obligatoirement à //False//.

Si taskForAutomaticAction = //False//, formTaskRequired peut être à //True// si un formulaire d’exécution est nécessaire, ou à //False// sinon. Dans le cas où les deux options sont mises à True par erreur, le formulaire d’exécution sera ignoré et la tâche traitée comme une tâche automatique.

  • définir la configuration si la tâche en nécessite :
<bean id="workflow-mytask.taskMyTaskConfig" class="fr.paris.lutece.plugins.workflow.modules.mytask.business.MyTaskConfig" scope="prototype" />

<bean id="workflow-mytask.taskMyTaskConfigService" class="fr.paris.lutece.plugins.workflow.modules.mytask.service.TaskMyTaskConfigService"
      p:taskConfigDAO-ref="workflow-mytask.taskMyTaskConfigDAO" />

Attention ! Ne pas oublier le scope prototype dans la définition du bean de la configuration de la tâche.

  • définir la vue :
<bean id="workflow-mytask.myTaskTaskComponent" class="fr.paris.lutece.plugins.workflow.modules.mytask.web.MyTaskTaskComponent"
      p:taskType-ref="workflow-mytask.taskTypeMyTask"
      p:taskConfigService-ref="workflow-mytask.taskMyTaskConfigService" />

Info Si la tâche de workflow ne nécessite pas de configuration dynamique, il n’est pas nécessaire de définir l’attribut taskConfigService.

Attention ! Bien définir le nom du bean du type de la tâche dans l’attribut taskType.

Développement d’une tâche de notification

Les outils présentés à la suite sont des outils permettant de réaliser une tâche de notification de façon simple. Le développeur est libre d’utiliser ou non ces outils. L’outil en question est la library-workflow-notify. Pour utiliser cette outil, il faut :

  • Ajouter l’implémentation de la tâche de workflow (TaskNotify) dans le fichier de contexte du module.
  • Créer un convertisseur qui convertit une donnée en une Map<String, Object> qui sera passée comme modèle dans le message de la notification.
  • Créer un service de notification pour l’envoi des messages.

Info En utilisant cet outil, il n’est pas nécessaire d’implémenter une tâche qui implémente ITask ni le service permettant de récupérer les informations des configurations de la tâche de notification. La library-workflow-notify et la library-workflow-core se chargent de ces implémentations.

Dépendances dans le POM

Le module de workflow doit dépendre du plugin-workflow et de la library-workflow-notify. Ajouter ces dépendances dans le fichier pom.xml du module de workflow :

<dependency>
    <groupId>fr.paris.lutece.plugins</groupId>
    <artifactId>plugin-workflow</artifactId>
    <version>[3.0.0,)</version>
    <type>lutece-plugin</type>
</dependency>
<dependency>
    <groupId>fr.paris.lutece.plugins</groupId>
    <artifactId>library-workflow-notify</artifactId>
    <version>[0.0.1,)</version>
    <type>jar</type>
</dependency>

Création des classes Java

Création de la classe MessageConverter

Créer une classe qui implémente l’interface IMessageConverter de la library-workflow-notify :

public class MessageConverter implements IMessageConverter
{
    ...
}

Cette classe permet de convertir une instance de MessageData en une Map<String, Object>.

Création de la classe de notification

Créer une classe qui implémente l’interface INotifyService de la library-workflow-notify :

public class NotifyService implements INotifyService
{
    ...
}

Configuration du fichier de context du module de notification

Plusieurs beans doivent être ajoutés dans le fichier de contexte du module (fichier /WEB-INF/conf/plugins/workflow-mytask_context.xml) :

  • Créer le bean correspondant au convertisseur créé précédemment :
<bean id="workflow-mytask.messageConverter" class="fr.paris.lutece.plugins.workflow.modules.mytask.service.convert.MessageConverter" />
  • Créer le bean correspondant au service de notification :
<bean id="workflow-mytask.notifyService" class="fr.paris.lutece.plugins.workflow.modules.mytask.service.notification.NotifyService" />
  • Créer un bean ayant la classe TaskNotify en spécifiant le convertisseur et le service de notification utilisés :
<bean id="workflow-notifycrm.taskNotifyCRM" class="fr.paris.lutece.plugins.workflownotify.service.TaskNotify" scope="prototype"
      p:converter-ref="workflow-notifycrm.messageConverter"
      p:taskConfigService-ref="workflow-notifycrm.taskNotifyCRMConfigService"
      p:notifyService-ref="workflow-notifycrm.notifyService" />