May 30, 2014 6:09:58 PM lutece lutece avatar   866    

Créer un module de workflow

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.

Configuration d'un module de workflow


Dépendance vers le plugin-workflow

Le module de workflow doit bien évidemment 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>

Info Ce tutoriel ne concerne que les modules de workflow ayant une dépendance vers une version 3.0.0 au minimum du plugin-workflow.

Développement du module de workflow


Création d'une tâche de workflow

Création de la classe JAVA

  • 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> { ... }

Configuration de la tâche au niveau de Spring

  • Définir la tâche, son type et sa configuration dans le fichier de contexte du module (fichier /WEB-INF/conf/plugins/workflow-mytask_context.xml) :
<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 :

Description des attributs de la tâche

Nom Description Exemple
key La clé technique de la tâche (doit être unique) taskMyTask
titleI18nKey La clé i18n de la tâche module.workflow.mytask.task_title
beanName Le nom du bean de la tâche (doit être identique à l'ID du bean définissant la tâche) workflow-mytask.taskMyTask
configBeanName Le 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 configuration workflow-mytask.taskMyTaskConfig
configRequired Attribut 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
formTaskRequired Attribut 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édiare. true
taskForAutomaticAction Attribut permettant de savoir si la tâche peut être assignée à une action automatique. Attribut optionnel si la tâche ne peux 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.

Si la tâche de workflow nécessite une configuration dynamique, alors définir la configuration de la tâche dans le fichier de contexte du module (fichier /WEB-INF/conf/plugins/workflow-mytask_context.xml) :

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

Création de la 'vue' de la tâche

Création de la classe JAVA

  • 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 de la 'vue' au niveau de Spring

  • Définir la 'vue' dans le fichier de contexte du module (fichier /WEB-INF/conf/plugins/workflow-mytask_context.xml) :
<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 context du module.
  • Créer un convertisseur qui convertit une donnée en une Map<String, Object> qui est à passé comme model 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 charge de ces implémentations.

Ajout de la library-workflow-notify

Ajouter en dépendance vers la library-workflow-notify dans le pom.xml du module :

<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

  • 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" />