Using the following workflow I:
1. create the workflow in memory
2. save the workflow to a database (Oracle) and to an XML file
3. I load the workflow back in from the database and/or the XML file
4. Create graphs of the workflow as initially built, the workflow as read from memory, and the workflow as read from the XML file.
5. Compare the graphs and they are different. The XML file will show the same condition for both paths out of Exclusive Choice node (created using the if - else form). The database version will frequently but not always have some of the output nodes from an exclusive choice node switched.
<?php
$workflow = new ezcWorkflow($name);
// Initial variables that are expected to be set by the calling workflow
$nodeInputStart = new ezcWorkflowNodeInput(array('start_date' => new ezcWorkflowConditionIsInteger,
'current_date' => new ezcWorkflowConditionIsInteger,
'node_id' => new ezcWorkflowConditionIsInteger,
'page_number_match' => new ezcWorkflowConditionIsString
)
);
// Terminate processing branch. Start: nodeTermMerge, End: nodeTermEnd
$nodeTermMerge = new ezcWorkflowNodeSimpleMerge();
$nodeTermAck = new ezcWorkflowNodeInput(array('rescan_batch' => new ezcWorkflowConditionIsString));
$nodeTermEnd = new ezcWorkflowNodeEnd();
$nodeTermMerge->addOutNode($nodeTermAck);
$nodeTermAck->addOutNode($nodeTermEnd);
// Page_number_match branch. Start: startNode, End: nodePageOKTrue
$nodePageOKDecide = new ezcWorkflowNodeExclusiveChoice();
$nodePageOKTrue = new ezcWorkflowNodeSimpleMerge();
$nodePageOKFalse = new ezcWorkflowNodeInput(array('pages_present' => new ezcWorkflowConditionIsInteger));
$nodeCRFMissing = new ezcWorkflowNodeInput(array('crfs_missing' => new ezcWorkflowConditionIsString));
// Connect the nodes
$workflow->startNode->addOutNode($nodeInputStart);
$nodeInputStart->addOutNode($nodePageOKDecide);
$nodePageOKDecide->addConditionalOutNode(new ezcWorkflowConditionVariable
( 'page_number_match',
new ezcWorkflowConditionIsEqual('Yes')
),
$nodePageOKTrue,
$nodePageOKFalse);
$nodePageOKFalse->addOutNode($nodeCRFMissing);
$nodeCRFMissing->addOutNode($nodePageOKTrue);
// Sufficient_contrast_branch. Start: nodeContrast, End: nodeContrastOKTrue
$nodeContrast = new ezcWorkflowNodeInput(array('sufficient_contrast' => new ezcWorkflowConditionIsString));
$nodeContrastOKDecide = new ezcWorkflowNodeExclusiveChoice();
$nodeContrastOKTrue = new ezcWorkflowNodeSimpleMerge();
$nodeContrastFailDecide = new ezcWorkflowNodeExclusiveChoice();
$nodeContrastMissing = new ezcWorkflowNodeInput(array('crfs_bad_contrast' => new ezcWorkflowConditionIsString));
// Connect the nodes
$nodePageOKTrue->addOutNode($nodeContrast);
$nodeContrast->addOutNode($nodeContrastOKDecide);
$nodeContrastOKDecide->addConditionalOutNode(new ezcWorkflowConditionVariable
( 'sufficient_contrast',
new ezcWorkflowConditionIsEqual('Yes')
),
$nodeContrastOKTrue,
$nodeContrastFailDecide );
$nodeContrastFailDecide->addConditionalOutNode(new ezcWorkflowConditionVariable
( 'page_number_match',
new ezcWorkflowConditionIsEqual('Yes')
),
$nodeContrastMissing,
$nodeTermMerge );
$nodeContrastMissing->addOutNode($nodeContrastOKTrue);
// Data present batch: Start: nodeData, End: nodeDataOKTrue
$nodeData = new ezcWorkflowNodeInput(array('sufficient_data' => new ezcWorkflowConditionIsString));
$nodeDataOKDecide = new ezcWorkflowNodeExclusiveChoice();
$nodeDataOKTrue = new ezcWorkflowNodeSimpleMerge();
$nodeDataFailDecideA = new ezcWorkflowNodeExclusiveChoice();
$nodeDataFailDecideB = new ezcWorkflowNodeExclusiveChoice();
$nodeDataMissing = new ezcWorkflowNodeInput(array('crfs_bad_data' => new ezcWorkflowConditionIsString));
// Connect the nodes
$nodeContrastOKTrue->addOutNode($nodeData);
$nodeData->addOutNode($nodeDataOKDecide);
$nodeDataOKDecide->addConditionalOutNode(new ezcWorkflowConditionVariable
( 'sufficient_data',
new ezcWorkflowConditionIsEqual('Yes')
),
$nodeDataOKTrue,
$nodeDataFailDecideA );
$nodeDataFailDecideA->addConditionalOutNode(new ezcWorkflowConditionVariable
( 'page_number_match',
new ezcWorkflowConditionIsEqual('Yes')
),
$nodeDataFailDecideB,
$nodeTermMerge );
$nodeDataFailDecideB->addConditionalOutNode(new ezcWorkflowConditionVariable
( 'sufficient_contrast',
new ezcWorkflowConditionIsEqual('Yes')
),
$nodeDataMissing,
$nodeTermMerge );
$nodeDataMissing->addOutNode($nodeDataOKTrue);
// Add in the final termination node
$nodeTermOK = new ezcWorkflowNodeEnd();
$nodeTermOK->addInNode($nodeDataOKTrue);
?>