/** * Visits the node, checks contraints and calls verify on each node. * * Returns true if the node was verified. False if it was already * verified. * * @param ezcWorkflowVisitable $visitable * @throws ezcWorkflowInvalidWorkflowException * @return boolean */ public function visit(ezcWorkflowVisitable $visitable) { if ($visitable instanceof ezcWorkflow) { foreach ($visitable->nodes as $node) { if ($node instanceof ezcWorkflowNodeStart && !$node instanceof ezcWorkflowNodeFinally) { $this->numStartNodes++; if ($this->numStartNodes > 1) { throw new ezcWorkflowInvalidWorkflowException('A workflow may have only one start node.'); } } if ($node instanceof ezcWorkflowNodeFinally) { $this->numFinallyNodes++; if ($this->numFinallyNodes > 1) { throw new ezcWorkflowInvalidWorkflowException('A workflow may have only one finally node.'); } } } } if ($visitable instanceof ezcWorkflowNode) { $id = $visitable->getId(); if (isset($this->visited[$id])) { return false; } $this->visited[$id] = true; $visitable->verify(); } return true; }
/** * Perform the visit. * * @param ezcWorkflowVisitable $visitable */ protected function doVisit(ezcWorkflowVisitable $visitable) { if ($visitable instanceof ezcWorkflow) { foreach ($visitable->nodes as $node) { if ($node instanceof ezcWorkflowNodeStart && !$node instanceof ezcWorkflowNodeFinally) { $this->numStartNodes++; if ($this->numStartNodes > 1) { throw new ezcWorkflowInvalidWorkflowException('A workflow may have only one start node.'); } } if ($node instanceof ezcWorkflowNodeFinally) { $this->numFinallyNodes++; if ($this->numFinallyNodes > 1) { throw new ezcWorkflowInvalidWorkflowException('A workflow may have only one finally node.'); } } } } if ($visitable instanceof ezcWorkflowNode) { $visitable->verify(); } }