Workflow BPMN Validator
Validate the given Alfresco Activiti BPMN process definition (and companion workflow model, if present) against these rules.
BPMN Namespace Validation
- Root element must be
<definitions>with BPMN 2.0 namespace:xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" - REQUIRED:
xmlns:activiti="http://activiti.org/bpmn"— must be present; Alfresco Activiti extensions use this namespace - ERROR if present: Any
org.flowable.*class reference inclassattributes of<activiti:taskListener>,<activiti:executionListener>, or<serviceTask activiti:class="...">. ACS 26.1 uses Activiti 5.22.x; the Flowable API is not on the classpath.
Process Structure Validation
<process>element must have:idattribute (camelCase identifier)nameattribute (human-readable)isExecutable="true"
- WARNING if any
<startEvent>is missingactiviti:formKeyin a non-trivial process (more than one user task) - Every
<userTask>must have eitheractiviti:assigneeoractiviti:candidateGroups:- WARNING if a user task has neither — it will never be claimable
- WARNING if a user task that represents an approval step is missing
activiti:formKey
- Every
<exclusiveGateway>with multiple outgoing sequence flows must have<conditionExpression>on all but one outgoing flow:- ERROR if an outgoing flow from an exclusive gateway has no condition and is not marked as
default
- ERROR if an outgoing flow from an exclusive gateway has no condition and is not marked as
- Every
<serviceTask>must have eitheractiviti:classoractiviti:expressionoractiviti:delegateExpression:- WARNING for service tasks with none of these attributes (becomes a no-op)
Variable Naming Validation
- Scan all
<activiti:string>blocks inside<activiti:field name="script">elements and inside<conditionExpression>elements - ERROR if any call to
execution.setVariable(...)ortask.getVariableLocal(...)uses a variable name containing a colon (e.g.acme:outcome). The correct form uses underscore (acme_outcome). Alfresco maps content model properties{prefix}wf:{propName}→ process variable{prefix}wf_{propName}(colon → underscore). - ERROR if any
<conditionExpression>references a variable with a colon in the name (e.g.${acme:count == 2}). Use${acme_count == 2}.
Task Listener Validation
- Any
<activiti:taskListener>or<activiti:executionListener>using aclassattribute:- ERROR if the class is from
org.flowable.* - Allowed built-in classes:
org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener,org.alfresco.repo.workflow.activiti.listener.ScriptExecutionListener - INFO if the class is custom (not from
org.alfresco.*) — confirm it implementsorg.activiti.engine.delegate.TaskListener
- ERROR if the class is from
Timer Event Validation
- Every
<boundaryEvent>containing a<timerEventDefinition>must have:cancelActivityattribute explicitly set to"true"or"false"— WARNING if missing- Timer duration in ISO 8601 format inside
<timeDuration>:PT{N}S,PT{N}M,PT{N}H,P{N}D, or combinations — ERROR if the format does not match ISO 8601
Workflow Model Alignment
If a companion *-workflow-model.xml exists in the same module's model/ directory:
- Every
activiti:formKeyvalue in the BPMN must correspond to a<type name="...">declared in the workflow model:- ERROR if a formKey references a type not present in the workflow model
- The workflow model must import the
bpmnamespace:<import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm"/>- ERROR if this import is missing
- Every workflow task type must extend
bpm:startTask,bpm:activitiOutcomeTask, orbpm:workflowTask:- WARNING if a type in the workflow model has no recognized
bpm:parent
- WARNING if a type in the workflow model has no recognized
- ERROR if any property in the workflow model uses
<mandatory enforced="true">— the integrity checker fires beforeaddAspect()writes properties, causing a spuriousIntegrityException
Bootstrap Registration Check
If a bootstrap-context.xml exists in the module's context/ directory:
- WARNING if it contains a
<bean>withparent="dictionaryModelBootstrap"that lists a.bpmnfile in itsmodelsproperty — BPMN files must be registered viaparent="workflowDeployer", notdictionaryModelBootstrap - WARNING if the
workflowDeployerbean has<prop key="redeploy">true</prop>— this causes duplicate process definitions on every restart
Output
Report all violations with:
- File path and element ID (BPMN) or type name (workflow model)
- Rule violated
- Suggested fix
If no violations are found, confirm: "BPMN and workflow model are valid for ACS 26.1 / Activiti 5.x."