| eZ Components - Workflow |
| ~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| .. contents:: Table of Contents |
| |
| Introduction |
| ============ |
| |
| Business enterprises need to reduce the cost of doing business and continually |
| develop new services and products. Enterprise Content Management helps with |
| storing business-critical content (customer data, documents, etc.) in a central |
| repository and in a unified way. Workflow Management provides the methodologies |
| and software that help with organizing the processes that operate on this |
| content inside an organization. |
| |
| The relationship between Enterprise Content Management and Workflow |
| Management is analogous to that of attributes (data) and methods (operations on |
| the data) that are encapsulated in a class in object-oriented programming. |
| |
| The Workflow component provides a virtual machine that executes workflows |
| represented through object graphs. These object graphs can be created |
| programmatically through the software component's Workflow Definition API. |
| Alternatively, a workflow definition can be loaded from an XML file. Object |
| graph and XML file are two different representations of a workflow definition |
| that uses a backend language built on the workflow patterns. |
| |
| More information on the theoretical background is available `here`__. |
| |
| __ Workflow_theoretical_background.html |
| |
| Class Overview |
| ============== |
| |
| This section gives you an overview of the main classes of the Workflow |
| component. |
| |
| ezcWorkflow |
| |
| An object of the ezcWorkflow class represents a workflow. |
| |
| Workflow Execution |
| ------------------ |
| |
| ezcWorkflowExecutionNonInteractive |
| |
| An object of the ezcWorkflowExecutionNonInteractive class can execute |
| non-interactive workflows, in other words workflows that contains no input |
| nodes and no sub-workflows. |
| |
| ezcWorkflowDatabaseExecution |
| |
| An object of the ezcWorkflowDatabaseExecution class can execute interactive |
| workflows. The persistence data is stored using a relational database. |
| |
| Workflow Definition |
| ------------------- |
| |
| ezcWorkflowDefinitionStorageXml |
| |
| The ezcWorkflowDefinitionStorageXml class provides the functionality to save |
| workflow definitions to and load workflow definitions from XML files. |
| |
| ezcWorkflowDatabaseDefinitionStorage |
| |
| The ezcWorkflowDatabaseDefinition Storageclass provides the functionality to |
| save workflow definitions to and load workflow definitions from a relational |
| database. |
| |
| Graph Node Classes |
| ------------------ |
| |
| Objects of the ezcWorkflowNode classes represent the nodes of a workflow. |
| |
| ezcWorkflowNode |
| |
| ezcWorkflowNode is the abstract base class for all graph node classes. |
| |
| ezcWorkflowNodeStart |
| |
| An object of the ezcWorkflowNodeStart class represents the one and only start |
| node of a workflow. The execution of the workflow starts here. |
| |
| Creating an object of the ezcWorkflow class automatically creates the start |
| node for this new workflow. It can be accessed through the startNode property. |
| |
| ezcWorkflowNodeEnd |
| |
| An object of the ezcWorkflowNodeEnd class represents an end node of a |
| workflow. A workflow must have at least one end node. The execution of the |
| workflow ends when an end node is reached. |
| |
| Creating an object of the ezcWorkflow class automatically creates a default |
| end node for this new workflow. It can be accessed through the endNode |
| property. |
| |
| ezcWorkflowNodeCancel |
| |
| As soon as a node of the ezcWorkflowNodeCancel type is activated, the complete |
| workflow instance is removed. This includes currently executing nodes, those |
| which may execute at some future time, and all parent and sub-workflows. The |
| workflow instance is recorded as having completed unsuccessfully. |
| |
| ezcWorkflowNodeFinally |
| |
| Start node of a sequence of final activities that is executed when a workflow |
| execution is cancelled. |
| |
| Creating an object of the ezcWorkflow class automatically creates the finally |
| node for this new workflow. It can be accessed through the finallyNode |
| property. |
| |
| ezcWorkflowNodeAction |
| |
| An object of the ezcWorkflowNodeAction class represents an activity node. When |
| the node is reached, the business logic that is implemented by the associated |
| service object is executed. |
| |
| ezcWorkflowNodeSubWorkflow |
| |
| An object of the ezcWorkflowNodeSubWorkflow class represents a sub-workflow. |
| When the node is reached, the specified sub-workflow is started. The workflow |
| is suspended until the sub-workflow has finished executing. |
| |
| ezcWorkflowNodeInput |
| |
| An object of the ezcWorkflowNodeInput class represents an input node. When the |
| node is reached, the workflow engine will suspend the workflow execution if |
| the specified input data is not available (first activation). While the |
| workflow is suspended, the application that embeds the workflow engine may |
| supply the input data and resume the workflow execution (second activation of |
| the input node). Input data is stored in a workflow variable. |
| |
| ezcWorkflowNodeVariableSet |
| |
| An object of the ezcWorkflowNodeVariableSet class sets a specified workflow |
| variable to a given value. |
| |
| ezcWorkflowNodeVariableUnset |
| |
| An object of the ezcWorkflowNodeVariableUnset class unsets a specified |
| workflow variable. |
| |
| ezcWorkflowNodeVariableAdd |
| |
| An object of the ezcWorkflowNodeVariableAdd class adds a given operand, either |
| a constant or the value of another workflow variable, to a specified workflow |
| variable. |
| |
| ezcWorkflowNodeVariableSub |
| |
| An object of the ezcWorkflowNodeVariableSub class subtracts a given operand, |
| either a constant or the value of another workflow variable, from a specified |
| workflow variable. |
| |
| ezcWorkflowNodeVariableMul |
| |
| An object of the ezcWorkflowNodeVariableMul class multiplies a specified |
| workflow variable with a given operand, either a constant or the value of |
| another workflow variable. |
| |
| ezcWorkflowNodeVariableDiv |
| |
| An object of the ezcWorkflowNodeVariableDiv class divides a specified workflow |
| variable by a given operand, either a constant or the value of another |
| workflow variable. |
| |
| ezcWorkflowNodeVariableIncrement |
| |
| An object of the ezcWorkflowNodeVariableIncrement class increments the value |
| of a specified workflow variable. |
| |
| ezcWorkflowNodeVariableDecrement |
| |
| An object of the ezcWorkflowNodeVariableDecrement class decrements the value |
| of a specified workflow variable. |
| |
| ezcWorkflowNodeParallelSplit |
| |
| The ezcWorkflowNodeParallelSplit class implements the Parallel Split workflow |
| pattern. |
| |
| The Parallel Split workflow pattern divides one thread of execution |
| unconditionally into multiple parallel threads of execution. |
| |
| Use Case Example: After the credit card specified by the customer has been |
| successfully charged, the activities of sending a confirmation email and |
| starting the shipping process can be executed in parallel. |
| |
| ezcWorkflowNodeSynchronization |
| |
| The ezcWorkflowNodeSynchronization class implements the Synchronization |
| workflow pattern. |
| |
| The Synchronization workflow pattern synchronizes multiple parallel threads of |
| execution into a single thread of execution. Workflow execution continues once |
| all threads of execution that are to be synchronized have finished executing |
| (exactly once). |
| |
| Use Case Example: After the confirmation email has been sent and the shipping |
| process has been completed, the order can be archived. |
| |
| ezcWorkflowNodeExclusiveChoice |
| |
| The ezcWorkflowNodeExclusiveChoice class implements the Exclusive Choice |
| workflow pattern. |
| |
| The Exclusive Choice workflow pattern defines multiple possible paths for the |
| workflow of which exactly one is chosen. |
| |
| Use Case Example: After an order has been received, the payment can be |
| performed by credit card or bank transfer. |
| |
| ezcWorkflowNodeSimpleMerge |
| |
| The ezcWorkflowNodeSimpleMerge class implements the Simple Merge workflow |
| pattern. |
| |
| The Simple Merge workflow pattern is to be used to merge the possible paths |
| that are defined by a preceding Exclusive Choice. It is assumed that of these |
| possible paths exactly one is taken and no synchronization takes place. |
| |
| Use Case Example: After the payment has been performed by either credit card |
| or bank transfer, the order can be processed further. |
| |
| ezcWorkflowNodeLoop |
| |
| The ezcWorkflowNodeLoop class is a specialization of the |
| ezcWorkflowNodeExclusiveChoice class and may be used to conveniently express |
| loops. |
| |
| ezcWorkflowNodeMultiChoice |
| |
| The ezcWorkflowNodeMultiChoice class implements the Multi Choice workflow |
| pattern. |
| |
| The Multi-Choice workflow pattern defines multiple possible paths for the |
| workflow of which one or more are chosen. It is a generalization of the |
| Parallel Split and Exclusive Choice workflow patterns. |
| |
| ezcWorkflowNodeSynchronizingMerge |
| |
| The ezcWorkflowNodeSynchronizingMerge class implements the Synchronizing |
| Merge workflow pattern. |
| |
| The Synchronizing Merge workflow pattern is to be used to synchronize multiple |
| parallel threads of execution that are activated by a preceding Multi-Choice. |
| |
| ezcWorkflowNodeDiscriminator |
| |
| The ezcWorkflowNodeDiscriminator class implements the Discriminator workflow |
| pattern. |
| |
| The Discriminator workflow pattern can be applied when the assumption we made |
| for the Simple Merge workflow pattern does not hold. It can deal with merge |
| situations where multiple incoming branches may run in parallel. It activates |
| its outgoing node after being activated by the first incoming branch and then |
| waits for all remaining branches to complete before it resets itself. After |
| the reset the Discriminator can be triggered again. |
| |
| Use Case Example: To improve response time, an action is delegated to several |
| distributed servers. The first response proceeds the flow, the other responses |
| are ignored. |
| |
| Condition Classes |
| ----------------- |
| |
| The ezcWorkflowCondition classes can be used to express branch conditions and |
| input validation. |
| |
| ezcWorkflowConditionVariable |
| |
| An object of the ezcWorkflowConditionVariable loads a workflow variable and |
| evaluates another ezcWorkflowCondition object for it. |
| |
| ezcWorkflowConditionNot |
| |
| An object of the ezcWorkflowConditionNot decorates an ezcWorkflowCondition |
| object and negates its expression. |
| |
| ezcWorkflowConditionAnd |
| |
| An object of the ezcWorkflowConditionAnd class represents a boolean AND |
| expression. It can hold an arbitrary number of ezcWorkflowCondition objects. |
| |
| ezcWorkflowConditionOr |
| |
| An object of the ezcWorkflowConditionOr class represents a boolean OR |
| expression. It can hold an arbitrary number of ezcWorkflowCondition objects. |
| |
| ezcWorkflowConditionXor |
| |
| An object of the ezcWorkflowConditionXor class represents a boolean XOR |
| expression. It can hold an arbitrary number of ezcWorkflowCondition objects. |
| |
| ezcWorkflowConditionIsTrue |
| |
| The condition represented by an ezcWorkflowConditionIsTrue object evaluates to |
| true when the associated workflow variable has the value true. |
| |
| ezcWorkflowConditionIsFalse |
| |
| The condition represented by an ezcWorkflowConditionIsFalse object evaluates |
| to true when the associated workflow variable has the value false. |
| |
| ezcWorkflowConditionIsEqual |
| |
| The condition represented by an ezcWorkflowConditionIsEqual object evaluates |
| to true when the associated workflow variable is equal to the comparison |
| value. |
| |
| ezcWorkflowConditionIsNotEqual |
| |
| The condition represented by an ezcWorkflowConditionIsNotEqual object |
| evaluates to true when the associated workflow variable is not equal to the |
| comparison value. |
| |
| ezcWorkflowConditionIsGreaterThan |
| |
| The condition represented by an ezcWorkflowConditionIsGreaterThan object |
| evaluates to true when the associated workflow variable is greater than the |
| comparison value. |
| |
| ezcWorkflowConditionIsEqualOrGreaterThan |
| |
| The condition represented by an ezcWorkflowConditionIsEqualOrGreaterThan |
| object evaluates to true when the associated workflow variable is equal to or |
| greater than the comparison value. |
| |
| ezcWorkflowConditionIsLessThan |
| |
| The condition represented by an ezcWorkflowConditionIsLessThan object |
| evaluates to true when the associated workflow variable is less than the |
| comparison value. |
| |
| ezcWorkflowConditionIsEqualOrLessThan |
| |
| The condition represented by an ezcWorkflowConditionIsEqualOrLessThan |
| object evaluates to true when the associated workflow variable is equal to or |
| less than the comparison value. |
| |
| ezcWorkflowConditionInArray |
| |
| The condition represented by an ezcWorkflowConditionInArray object evaluates |
| to true when the associated workflow variable is in the specified array. |
| |
| ezcWorkflowConditionIsAnything |
| |
| The condition represented by an ezcWorkflowConditionIsAnything object always |
| evaluates to true. |
| |
| ezcWorkflowConditionIsArray |
| |
| The condition represented by an ezcWorkflowConditionIsArray object evaluates |
| to true when the associated workflow variable is an array. |
| |
| ezcWorkflowConditionIsBool |
| |
| The condition represented by an ezcWorkflowConditionIsBool object evaluates to |
| true when the associated workflow variable is a boolean. |
| |
| ezcWorkflowConditionIsFloat |
| |
| The condition represented by an ezcWorkflowConditionIsFloat object evaluates |
| to true when the associated workflow variable is a float. |
| |
| ezcWorkflowConditionIsInteger |
| |
| The condition represented by an ezcWorkflowConditionIsInteger object evaluates |
| to true when the associated workflow variable is an integer. |
| |
| ezcWorkflowConditionIsObject |
| |
| The condition represented by an ezcWorkflowConditionIsObject object evaluates |
| to true when the associated workflow variable is an object. |
| |
| ezcWorkflowConditionIsString |
| |
| The condition represented by an ezcWorkflowConditionIsString object evaluates |
| to true when the associated workflow variable is a string. |
| |
| Workflow Definition Usage |
| ========================= |
| |
| This section gives a few basic examples on how to create, save and load |
| workflows. It also demonstrates how to make a graphical representation of your |
| workflow. |
| |
| Creating a simple workflow programmatically |
| ------------------------------------------- |
| |
| This example shows how to set up a fairly simple workflow that will execute |
| differently based on the variable 'choice'. |
| |
| .. include:: tutorial_example_01.php |
| :literal: |
| |
| Adding custom PHP code to your workflow and manipulating workflow variables |
| --------------------------------------------------------------------------- |
| |
| In the previous example the $trueNode and $falseNodes where action |
| objects. However, in order to make them work we must add service objects. The |
| following example replaces the lines where $trueNode and $falseNode are created. |
| |
| .. include:: tutorial_example_01a.php |
| :literal: |
| |
| When this action node is executed it will load the service object with the |
| parameters specified and run the execute() method. Our execute method will |
| print the message passed to the constructor and change the workflow variable |
| 'choice'. |
| |
| The execute() method of a service object may return false to indicate that it is |
| not finished yet. The workflow execution will then be suspended. The next time |
| the workflow execution is resumed the service object's execute() method will be |
| invoked again. |
| |
| Saving a workflow to an XML file |
| -------------------------------- |
| |
| Typically a workflow is built once and executed many times. It is also common |
| that workflows are interupted during execution and resumed later in another PHP |
| request. To accomodate this it is possible to save and load workflows to XML |
| files (or database through the WorkflowDatabaseTiein). |
| |
| This example shows you how to store a workflow to an XML file. The example |
| assumes the workflow can be found in the $workflow variable. |
| |
| .. include:: tutorial_example_02.php |
| :literal: |
| |
| Loading a workflow from an XML file |
| ----------------------------------- |
| |
| It is of course also possible to load a workflow that has been saved to disk. |
| |
| .. include:: tutorial_example_03.php |
| :literal: |
| |
| Visualizing a workflow using GraphViz |
| ------------------------------------- |
| |
| It is possible to write visitors that traverse the workflow graph. One example |
| of this is the GraphViz visitor that generates a viewable graph representation |
| of the workflow. The GraphViz visitor uses the __tostring methods on the nodes |
| to get names for the nodes. |
| |
| .. include:: tutorial_example_06.php |
| :literal: |
| |
| .. include:: tutorial_example_06.dot |
| :literal: |
| |
| .. figure:: img/tutorial_example_06.png |
| |
| Workflow Execution Usage |
| ======================== |
| |
| For examples on how to execute workflows see the `WorkflowDatabaseTiein`_ tutorial. |
| |
| .. _WorkflowDatabaseTiein: introduction_WorkflowDatabaseTiein.html |
| |
| Execution Plugins |
| ----------------- |
| |
| The workflow engine can be customized and extended through a plugin system. A |
| plugin is an object of a class that extends ezcWorkflowExecutionPlugin and that |
| is registered with the execution object using the addPlugin() method. |
| |
| The following methods are automatically invoked during the workflow execution |
| after the respective event has been handled: |
| |
| - afterExecutionStarted() |
| - afterExecutionSuspended() |
| - afterExecutionResumed() |
| - afterExecutionCancelled() |
| - afterExecutionEnded() |
| - afterNodeActivated() |
| - afterNodeExecuted() |
| - afterThreadStarted() |
| - afterThreadEnded() |
| - afterVariableSet() |
| - afterVariableUnset() |
| |
| The above methods only allow read access to the events that they handle and are |
| usually used to log workflow execution. |
| |
| The following methods are automatically invoked during the workflow execution |
| before the respective event is handled: |
| |
| - beforeNodeActivated() |
| - beforeVariableSet() |
| - beforeVariableUnset() |
| |
| The above methods allow both read and write access to the events that they |
| handle and may be used to change the behaviour of the workflow execution. |
| |
| The `WorkflowSignalSlotTiein` component allows you to hook into the workflow |
| execution into using the SignalSlot component. Details can be found in its |
| documentation. |
| |
| .. _WorkflowSignalSlotTiein: introduction_WorkflowSignalSlotTiein.html |
| |
| Execution Listeners |
| ------------------- |
| |
| Objects of classes that implement the ezcWorkflowExecutionListener interface can |
| be registered as listeners with an ezcWorkflowExecution object to receive |
| messages during the execution of a workflow. |
| |
| The ezcWorkflowEventLogListener class that is provided by the `WorkflowEventLogTiein`_ |
| component is the reference implementation of this interface. You can find an |
| example on how to register execution listeners in its documentation. |
| |
| .. _WorkflowEventLogTiein: introduction_WorkflowEventLogTiein.html |
| |
| .. |
| Local Variables: |
| mode: rst |
| fill-column: 79 |
| End: |
| vim: et syn=rst tw=79 |