Mar 8, 2018 2:04:08 PM seb leridon avatar   1492

Create a workflow module

Introduction


The Lut├Ęce plugin-workflow allows to carry out a series of tasks. Each workflow module implements a particular workflow task.

Configuring a workflow module


Dependency on the plugin-workflow

The workflow module must of course depend on the plugin-workflow. Add the dependency in the pom.xml file of the workflow module:

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

Info This tutorial only applies to workflow modules with a dependency on a version 3.0.0 of the plugin-workflow.

Development of the workflow module


Creating a workflow task

Creation of the JAVA class

  • Create a class at the service layer (fr.paris.lutece.plugins.workflow.modules.mymodule.service.MyTask).
  • The new class must extend the Task abstract class defined in the library-workflow-core :
public class MyTask extends Task
{
   ...
}

The library-workflow-core offers another abstract class SimpleTask implementing the various methods. This class allows the implementations in the modules to do without the implementation of certain useless methods in their case.

Creating a configuration for the workflow task

It is sometimes necessary for a workflow task to require a particular configuration, such as the recipient name for a notification task. To do this, follow the following steps:

  • Create a class at the business layer (fr.paris.lutece.plugins.workflow.modules.mymodule.business.MyTaskConfig).
  • The new class must extend the abstract class TaskConfig defined in the library-workflow-core:
public class MyTaskConfig extends TaskConfig
{
   ...
}

The abstract class has the ID task attribute that corresponds to the task ID.

  • Create the CAD for database access of the business layer configuration (fr.paris.lutece.plugins.workflow.modules.mymodule.business.MyTaskConfigDAO).
  • The new class must implement the ITaskConfigDAO interface:

public class MyTaskConfigDAO implements ITaskConfigDAO <MyTaskConfig> { ... }

Configuring the task at Spring

  • Define the task, its type and its configuration in the context file of the module (file / 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" />

The type of the task must have the following attributes:

Description of the attributes of the task

Name Description Example
key The technical key of the task (must be unique) taskMyTask
titleI18nKey The i18n key of the task module.workflow.mytask.task_title
beanName The name of the task's bean (must be identical to the ID of the bean defining the task) workflow-mytask.taskMyTask
configBeanName The name of the task configuration bean (must be the same as the Bean ID defining the task configuration). Only define it if the workflow task needs a configuration workflow-mytask.taskMyTaskConfig
configRequired Attribute to know if the task needs a configuration of the technical administrator or not. Optional attribute if the task does not need configuration. true
formTaskRequired Attribute to know if the task needs an intermediate form when performing the action. Optional attribute if the task does not need an intermediate form. true
taskForAutomaticAction Attribute to know if the task can be assigned to an automatic action. Optional attribute if the task can not be assigned to an automatic action. true

Warning ! Do not forget the scope prototype in the definition of the task bean.

If the workflow task requires a dynamic configuration, then define the configuration of the task in the context file of the module (file / 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" />

Warning ! Do not forget the scope prototype in the bean definition of the task configuration.

Creating the 'view' of the task

Creation of the JAVA class

  • Create a class at the web layer (fr.paris.lutece.plugins.workflow.modules.mymodule.web.MyTaskTaskComponent). The new class must extend the abstract class TaskComponent defined in the plugin-workflow:
public class MyTaskTaskComponent extends TaskComponent
{
   ...
}
  • The library-workflow-core offers two abstract classes:
    • TaskComponent uses BeanUtils to populate configurations automatically.
    • SimpleTaskComponent to avoid implementing the intermediate form and configuration.
  • The plugin-workflow offers three other abstract classes:
    • AbstractTaskComponent implements a method to validate beans using JSR303 annotations.
    • NoFormTaskComponent allowing your implementation to avoid implementing methods for the intermediate form.
    • NoConfigTaskComponent allowing your implementation to avoid implementing the methods for configuring the task.

Configuring the 'view' in Spring

  • Define the 'view' in the context file of the module (file /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 If the workflow task does not require a dynamic configuration, it is not necessary to set the taskConfigService attribute.

Warning ! Define the name of the task type bean in the taskType attribute

Development of a notification task


The tools presented below are tools for performing a notification task in a simple way. The developer is free to use or not these tools. The tool in question is the library-workflow-notify. To use this tool, you must:

  • Add the implementation of the workflow task (TaskNotify) in the context file of the module.
  • Create a converter that converts data into a Map <String, Object> that is passed as a model in the notification message.
  • Create a notification service for sending messages.

Info

Using this tool, it is not necessary to implement a task that implements ITask nor the service that retrieves information about the notification task's configurations. The library-workflow-notify and the library-workflow-core take care of these implementations.

Added the library-workflow-notify

Add dependency to the library-workflow-notify in the pom.xml of the module:

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

Creating JAVA classes

Creating the MessageConverter class

Create a class that implements the IMessageConverter interface of the library-workflow-notify:

public class MessageConverter implements IMessageConverter
{
  ...
}

This class converts an instance of MessageData into a Map <String, Object>

Creating the notification class

Create a class that implements the INotifyService interface of the library-workflow-notify:

public class NotifyService implements INotifyService
{
  ...
}

Configuration of the context file of the notification module

  • Create the bean corresponding to the converter created previously:
<bean id = "workflow-mytask.messageConverter"
class = "en.paris.lutece.plugins.workflow.modules.mytask.service.convert.MessageConverter" />
  • Create the bean corresponding to the notification service:
<bean id = "workflow-mytask.notifyService"
class = "en.paris.lutece.plugins.workflow.modules.mytask.service.notification.NotifyService" />
  • Create a bean having the TaskNotify class by specifying the converter and notification service used:
<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" />