Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * 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();
     }
 }