public function build() { $model = $this->builder->build(); $linkCatch = []; $linkThrow = []; foreach ($model->findNodes() as $node) { $behavior = $node->getBehavior(); if ($behavior instanceof IntermediateLinkCatchBehavior) { $linkCatch[$behavior->getLink()] = $node->getId(); } if ($behavior instanceof IntermediateLinkThrowBehavior) { $linkThrow[$node->getId()] = $behavior->getLink(); } } if (!empty($linkCatch)) { foreach ($linkThrow as $nodeId => $link) { if (empty($linkCatch[$link])) { throw new \RuntimeException(sprintf('No link catch event defined for link "%s" thrown by node %s', $link, $nodeId)); } // This does the trick: insert a new transition directly connecting the link events. $trans = new Transition('link-' . UUID::createRandom(), $nodeId); $trans->to($linkCatch[$link]); $model->addItem($trans); } } return $model; }
/** * Compute current sync data from execution state. * * @return array */ public function collectSyncData() { $data = ['id' => $this->id, 'parentId' => $this->parentExecution === NULL ? NULL : $this->parentExecution->getId(), 'processId' => $this->getRootExecution()->getId(), 'modelId' => $this->model->getId(), 'state' => $this->state, 'depth' => $this->getExecutionDepth(), 'timestamp' => $this->timestamp, 'variables' => $this->variables, 'transition' => $this->transition === NULL ? NULL : (string) $this->transition->getId(), 'node' => $this->node === NULL ? NULL : (string) $this->node->getId()]; return $data; }
/** * Have the execution transition into the next node. * * @param Execution $execution * @param Transition $transition */ public function __construct(Execution $execution, Transition $transition = NULL) { $this->executionId = $execution->getId(); $this->transitionId = $transition === NULL ? NULL : (string) $transition->getId(); }