/**
  * @param Task $previousTask
  * @param MessageHandler $previousMessageHandler
  * @param MessageHandler $nextMessageHandler
  * @throws \RuntimeException
  * @internal param \Prooph\Link\ProcessManager\Model\Workflow\Message $lastAnswer
  * @return Task[]
  */
 public function determineNextTasks(Task $previousTask, MessageHandler $previousMessageHandler, MessageHandler $nextMessageHandler)
 {
     $tasks = [];
     $taskMetadata = ProcessingMetadata::noData();
     $lastAnswer = $previousMessageHandler->emulateAnswerMessage($previousTask);
     //@TODO: Implement sub process set up
     if (!$this->processingNodeName()->equals($nextMessageHandler->processingNodeName())) {
         throw new \RuntimeException("Running message handler on different nodes is not supported yet!");
     }
     $task = $this->scheduleTaskFor($nextMessageHandler, $taskMetadata, $lastAnswer);
     $nextMessage = $task->emulateWorkflowMessage();
     $processType = $this->determineProcessType($nextMessage, $nextMessageHandler);
     $previousTaskProcess = $this->getProcessOfTask($previousTask);
     if (is_null($previousTaskProcess)) {
         throw TaskProcessNotFound::of($previousTask, $this);
     }
     if (!$previousTaskProcess->type()->isLinearMessaging() || !$processType->isLinearMessaging()) {
         //@TODO: Implement sub process handling
         throw new \RuntimeException("Handling follow up tasks with a process type other than linear messaging is not supported yet!");
     }
     $this->recordThat(TaskWasAddedToProcess::record($this->workflowId(), $previousTaskProcess, $task));
     $tasks[] = $task;
     return $tasks;
 }
 /**
  * @param MessageHandler $messageHandler
  */
 private function syncMessageHandler(MessageHandler $messageHandler)
 {
     $additionalData = $messageHandler->additionalData();
     if ($messageHandler->preferredProcessingType()) {
         $additionalData['preferred_type'] = $messageHandler->preferredProcessingType()->of();
     }
     $additionalData['node_name'] = $messageHandler->processingNodeName()->toString();
     $additionalData['icon'] = $messageHandler->icon();
     $additionalData['icon_type'] = $messageHandler->iconType();
     $additionalData['metadata'] = $messageHandler->processingMetadata()->toArray();
     $additionalData['ui_metadata_riot_tag'] = $messageHandler->metadataRiotTag();
     $allowedTypes = $messageHandler->supportedProcessingTypes()->areAllTypesSupported() ? MessageHandler\ProcessingTypes::SUPPORT_ALL : $messageHandler->supportedProcessingTypes()->typeList();
     if ($messageHandler->isKnownInProcessingSystem()) {
         $this->commandBus->dispatch(ChangeConnectorConfig::ofConnector($messageHandler->processingId()->toString(), array_merge(['name' => $messageHandler->name(), 'allowed_messages' => $this->determineAllowedMessages($messageHandler), 'allowed_types' => $allowedTypes], $additionalData), $this->processingConfigLocation));
     } else {
         $this->commandBus->dispatch(AddConnectorToConfig::fromDefinition($messageHandler->processingId()->toString(), $messageHandler->name(), $this->determineAllowedMessages($messageHandler), $allowedTypes, $this->processingConfigLocation, $additionalData));
     }
 }