Introduction to Advanced Workflows!
Gavin Cornwell, Development Manager, Services Team, Alfresco!
Agenda!
•  UI
•  Process Definition
•  Task Definition
•  Deployment
•  Configuration
• UI!
• Form!
• Engine!
•  Demo
•  Q & A
UI!
My Tasks!
Edit Task!
Workflows Iʼve Started!
Workflow Details!
Admin Console!
Workflow Console!
Process Definition!
Example Process Definition!
Start Task!
<process id="presentationReview” name="DevCon Presentation Review">
<startEvent id="start”
activiti:formKey="dcwkflw:submitPresentationReviewTask" />
<sequenceFlow id='flow1' sourceRef='start' targetRef='reviewTask' />
Review Task!
<userTask id="reviewTask" name="Review Presentation" activiti:formKey="dcwkflw:presentationReviewTask">
<extensionElements>
<activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
…
</activiti:taskListener>
<activiti:taskListener event="complete" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
<activiti:field name="script">
<activiti:string>
execution.setVariable('dcwkflw_reviewOutcome', task.getVariable('dcwkflw_reviewOutcome'));
</activiti:string>
</activiti:field>
</activiti:taskListener>
</extensionElements>
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>${bpm_assignee.properties.userName}</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>
Decision!
<sequenceFlow id='flow2' sourceRef='reviewTask' targetRef='reviewDecision' />
<exclusiveGateway id="reviewDecision" name="Review Decision" />
<sequenceFlow id='flow3' sourceRef='reviewDecision' targetRef='approved' >
<conditionExpression xsi:type="tFormalExpression">
${dcwkflw_reviewOutcome == 'Publish'}
</conditionExpression>
</sequenceFlow>
<sequenceFlow id='flow4' sourceRef='reviewDecision' targetRef='rejected' />
Approved Task!
<userTask id="approved" name="Presentation Approved"
activiti:formKey="wf:approvedTask" >
<extensionElements>
<activiti:taskListener event="create”
class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
…
</activiti:taskListener>
</extensionElements>
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>${initiator.properties.userName}</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>
Rejected Task!
<userTask id=”rejected" name="Presentation Rejected"
activiti:formKey="wf:rejectedTask" >
<extensionElements>
<activiti:taskListener event="create”
class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
…
</activiti:taskListener>
</extensionElements>
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>${initiator.properties.userName}</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>
Task Definition!
Based on Alfresco Content Modelling!
• bpmModel.xml
• bpm:task!
• bpm:workflowTask!
• bpm:startTask!
• bpm:activitiStartTask!
• bpm:activitiOutcomeTask!
• workflowModel.xml
• wf:submitAdhocTask!
• wf:reviewTask!
• wf:activitiReviewTask!
• wf:approvedTask!
Start Task!
<type name="dcwkflw:submitPresentationReviewTask">
<parent>wf:submitReviewTask</parent>
<mandatory-aspects>
<aspect>dcwkflw:details</aspect>
</mandatory-aspects>
</type>
Task Definition – Start Task cont.!
<aspect name="dcwkflw:details">!
<properties>!
<property name="dcwkflw:abstract">!
<type>d:text</type>!
</property>!
<property name="dcwkflw:duration">!
<type>d:int</type>!
</property>!
</properties>!
<associations>!
<association name="dcwkflw:presenter”>!
<source>…</source>!
<target>!
<class>cm:person</class>!
<mandatory>true</mandatory>!
<many>false</many>!
</target>!
</association>!
</associations>!
</aspect>!
Task Definition – Review Task!
<type name="dcwkflw:presentationReviewTask">
<parent>bpm:activitiOutcomeTask</parent>
<properties>
<property name="dcwkflw:reviewOutcome">
<type>d:text</type>
<default>Reject</default>
<constraints>
<constraint ref="dcwkflw:choices" />
</constraints>
</property>
</properties>
<overrides>
<property name="bpm:outcomePropertyName">
<default>
{http://www.alfresco.org/model/dcworkflow/1.0}reviewOutcome
</default>
</property>
</overrides>
<mandatory-aspects><aspect>dcwkflw:details</aspect></mandatory-
aspects>
</type>
Task Definition – Review Task cont.!
<constraint name="dcwkflw:choices" type="LIST">
<parameter name="allowedValues">
<list>
<value>Publish</value>
<value>Reject</value>
</list>
</parameter>
</constraint>
Deployment!
Spring: your-context.xml!
<bean id="devconWorkflowBootstrap" parent="workflowDeployer">
<property name="workflowDefinitions">
<list>
<props>
<prop key="engineId">activiti</prop>
<prop key="location">alfresco/extension/devcon-workflow.bpmn20.xml</prop>
<prop key="mimetype">text/xml</prop>
<prop key="redeploy">false</prop>
</props>
</list>
</property>
<property name="models">
<list><value>alfresco/extension/devcon-workflow-model.xml</value></list>
</property>
<property name="labels">
<list><value>alfresco/extension/devcon-workflow-model</value></list>
</property>
</bean>
Workflow Console!
Configuration!
UI – Hiding Workflows!
<config evaluator="string-compare" condition="Workflow">
<hidden-workflows>
<!-- Hide all WCM related workflows -->
<workflow name="jbpm$wcmwf:*"/>
<workflow name="jbpm$wf:articleapproval"/>
</hidden-workflows>
</config>
UI – Hiding Tasks!
<config evaluator="string-compare" condition="Workflow">
<hidden-tasks>
<!-- Hide all WCM related tasks -->
<task type="wcmwf:*"/>
</hidden-tasks>
</config>
Start Workflow Form!
<config evaluator="string-compare" condition="activiti$presentationReview">
<forms>
<form>
<field-visibility>
<show id="bpm:workflowDescription" />
<show id="bpm:workflowDueDate" />
<show id="bpm:workflowPriority" />
<show id="bpm:assignee" />
<show id="dcwkflw:abstract" />
<show id="dcwkflw:duration" />
<show id="dcwkflw:presenter" />
<show id="packageItems" />
<show id="bpm:sendEMailNotifications" />
</field-visibility>
<appearance>…</appearance>
</form>
</forms>
</config>
Task Form!
<config evaluator="task-type" condition="dcwkflw:presentationReviewTask">
<forms>
<form>
<field-visibility>
…
<show id="dcwkflw:abstract" />
<show id="dcwkflw:duration" />
<show id="dcwkflw:presenter" />
<show id="dcwkflw:reviewOutcome" />
</field-visibility>
<appearance>
…
<field id="dcwkflw:reviewOutcome”>
<control template="/org/.../workflow/activiti-transitions.ftl" />
</field>
…
</appearance>
</form>
</forms>
</config>
Workflow Details Form!
Workflow Details Form!
<config evaluator="task-type”
condition="dcwkflw:submitPresentationReviewTask">
<forms>
<form id="workflow-details">
<field-visibility>
<show id="bpm:sendEMailNotifications" />
<show id="dcwkflw:abstract" />
<show id="dcwkflw:duration" />
<show id="dcwkflw:presenter" />
<show id="packageItems" />
</field-visibility>
<appearance>…</appearance>
</form>
</forms>
</config>
Engine!
• Disabling
• system.workflow.engine.jbpm.enabled=true!
• system.workflow.engine.activiti.enabled=true!
• Definition Visibility
• system.workflow.engine.jbpm.definitions.visible=false!
• system.workflow.engine.activiti.definitions.visible=true!
• Override in alfresco-global.properties
• Values shown in Admin Console or JMX Dump
Demo!
•  Start ‘DevCon Presentation Review’ Workflow
•  Manage Task
•  Monitor Progress
• Workflow Details!
• Workflow Console!
Questions ?!
Learn More!
http://wiki.alfresco.com/wiki/Workflow
http://wiki.alfresco.com/wiki/Forms
http://www.activiti.org

Introduction to advanced workflow

  • 1.
    Introduction to AdvancedWorkflows! Gavin Cornwell, Development Manager, Services Team, Alfresco!
  • 2.
    Agenda! •  UI •  ProcessDefinition •  Task Definition •  Deployment •  Configuration • UI! • Form! • Engine! •  Demo •  Q & A
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
    Start Task! <process id="presentationReview”name="DevCon Presentation Review"> <startEvent id="start” activiti:formKey="dcwkflw:submitPresentationReviewTask" /> <sequenceFlow id='flow1' sourceRef='start' targetRef='reviewTask' />
  • 13.
    Review Task! <userTask id="reviewTask"name="Review Presentation" activiti:formKey="dcwkflw:presentationReviewTask"> <extensionElements> <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> … </activiti:taskListener> <activiti:taskListener event="complete" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> <activiti:field name="script"> <activiti:string> execution.setVariable('dcwkflw_reviewOutcome', task.getVariable('dcwkflw_reviewOutcome')); </activiti:string> </activiti:field> </activiti:taskListener> </extensionElements> <humanPerformer> <resourceAssignmentExpression> <formalExpression>${bpm_assignee.properties.userName}</formalExpression> </resourceAssignmentExpression> </humanPerformer> </userTask>
  • 14.
    Decision! <sequenceFlow id='flow2' sourceRef='reviewTask'targetRef='reviewDecision' /> <exclusiveGateway id="reviewDecision" name="Review Decision" /> <sequenceFlow id='flow3' sourceRef='reviewDecision' targetRef='approved' > <conditionExpression xsi:type="tFormalExpression"> ${dcwkflw_reviewOutcome == 'Publish'} </conditionExpression> </sequenceFlow> <sequenceFlow id='flow4' sourceRef='reviewDecision' targetRef='rejected' />
  • 15.
    Approved Task! <userTask id="approved"name="Presentation Approved" activiti:formKey="wf:approvedTask" > <extensionElements> <activiti:taskListener event="create” class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> … </activiti:taskListener> </extensionElements> <humanPerformer> <resourceAssignmentExpression> <formalExpression>${initiator.properties.userName}</formalExpression> </resourceAssignmentExpression> </humanPerformer> </userTask>
  • 16.
    Rejected Task! <userTask id=”rejected"name="Presentation Rejected" activiti:formKey="wf:rejectedTask" > <extensionElements> <activiti:taskListener event="create” class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> … </activiti:taskListener> </extensionElements> <humanPerformer> <resourceAssignmentExpression> <formalExpression>${initiator.properties.userName}</formalExpression> </resourceAssignmentExpression> </humanPerformer> </userTask>
  • 17.
  • 18.
    Based on AlfrescoContent Modelling! • bpmModel.xml • bpm:task! • bpm:workflowTask! • bpm:startTask! • bpm:activitiStartTask! • bpm:activitiOutcomeTask! • workflowModel.xml • wf:submitAdhocTask! • wf:reviewTask! • wf:activitiReviewTask! • wf:approvedTask!
  • 19.
  • 20.
    Task Definition –Start Task cont.! <aspect name="dcwkflw:details">! <properties>! <property name="dcwkflw:abstract">! <type>d:text</type>! </property>! <property name="dcwkflw:duration">! <type>d:int</type>! </property>! </properties>! <associations>! <association name="dcwkflw:presenter”>! <source>…</source>! <target>! <class>cm:person</class>! <mandatory>true</mandatory>! <many>false</many>! </target>! </association>! </associations>! </aspect>!
  • 21.
    Task Definition –Review Task! <type name="dcwkflw:presentationReviewTask"> <parent>bpm:activitiOutcomeTask</parent> <properties> <property name="dcwkflw:reviewOutcome"> <type>d:text</type> <default>Reject</default> <constraints> <constraint ref="dcwkflw:choices" /> </constraints> </property> </properties> <overrides> <property name="bpm:outcomePropertyName"> <default> {http://www.alfresco.org/model/dcworkflow/1.0}reviewOutcome </default> </property> </overrides> <mandatory-aspects><aspect>dcwkflw:details</aspect></mandatory- aspects> </type>
  • 22.
    Task Definition –Review Task cont.! <constraint name="dcwkflw:choices" type="LIST"> <parameter name="allowedValues"> <list> <value>Publish</value> <value>Reject</value> </list> </parameter> </constraint>
  • 23.
  • 24.
    Spring: your-context.xml! <bean id="devconWorkflowBootstrap"parent="workflowDeployer"> <property name="workflowDefinitions"> <list> <props> <prop key="engineId">activiti</prop> <prop key="location">alfresco/extension/devcon-workflow.bpmn20.xml</prop> <prop key="mimetype">text/xml</prop> <prop key="redeploy">false</prop> </props> </list> </property> <property name="models"> <list><value>alfresco/extension/devcon-workflow-model.xml</value></list> </property> <property name="labels"> <list><value>alfresco/extension/devcon-workflow-model</value></list> </property> </bean>
  • 25.
  • 26.
  • 27.
    UI – HidingWorkflows! <config evaluator="string-compare" condition="Workflow"> <hidden-workflows> <!-- Hide all WCM related workflows --> <workflow name="jbpm$wcmwf:*"/> <workflow name="jbpm$wf:articleapproval"/> </hidden-workflows> </config>
  • 28.
    UI – HidingTasks! <config evaluator="string-compare" condition="Workflow"> <hidden-tasks> <!-- Hide all WCM related tasks --> <task type="wcmwf:*"/> </hidden-tasks> </config>
  • 29.
    Start Workflow Form! <configevaluator="string-compare" condition="activiti$presentationReview"> <forms> <form> <field-visibility> <show id="bpm:workflowDescription" /> <show id="bpm:workflowDueDate" /> <show id="bpm:workflowPriority" /> <show id="bpm:assignee" /> <show id="dcwkflw:abstract" /> <show id="dcwkflw:duration" /> <show id="dcwkflw:presenter" /> <show id="packageItems" /> <show id="bpm:sendEMailNotifications" /> </field-visibility> <appearance>…</appearance> </form> </forms> </config>
  • 30.
    Task Form! <config evaluator="task-type"condition="dcwkflw:presentationReviewTask"> <forms> <form> <field-visibility> … <show id="dcwkflw:abstract" /> <show id="dcwkflw:duration" /> <show id="dcwkflw:presenter" /> <show id="dcwkflw:reviewOutcome" /> </field-visibility> <appearance> … <field id="dcwkflw:reviewOutcome”> <control template="/org/.../workflow/activiti-transitions.ftl" /> </field> … </appearance> </form> </forms> </config>
  • 31.
  • 32.
    Workflow Details Form! <configevaluator="task-type” condition="dcwkflw:submitPresentationReviewTask"> <forms> <form id="workflow-details"> <field-visibility> <show id="bpm:sendEMailNotifications" /> <show id="dcwkflw:abstract" /> <show id="dcwkflw:duration" /> <show id="dcwkflw:presenter" /> <show id="packageItems" /> </field-visibility> <appearance>…</appearance> </form> </forms> </config>
  • 33.
  • 34.
    Demo! •  Start ‘DevConPresentation Review’ Workflow •  Manage Task •  Monitor Progress • Workflow Details! • Workflow Console!
  • 35.
  • 36.