/**
  * @param TaskId $taskId
  * @param TaskType $taskType
  * @param MessageHandler $messageHandler
  * @param Prototype $processingType
  * @param ProcessingMetadata $metadata
  * @return TaskWasSetUp
  */
 public static function with(TaskId $taskId, TaskType $taskType, MessageHandler $messageHandler, Prototype $processingType, ProcessingMetadata $metadata)
 {
     $event = self::occur($taskId->toString(), ['task_type' => $taskType->toString(), 'message_handler_id' => $messageHandler->messageHandlerId()->toString(), 'processing_type' => $processingType->of(), 'task_metadata' => $metadata->toArray()]);
     $event->taskId = $taskId;
     $event->taskType = $taskType;
     $event->messageHandlerId = $messageHandler->messageHandlerId();
     $event->processingType = $processingType;
     $event->taskMetadata = $metadata;
     return $event;
 }
 /**
  * Creates a new task for given message handler and workflow message
  *
  * @param MessageHandler $messageHandler
  * @param ProcessingMetadata $taskMetadata
  * @param Workflow\Message $workflowMessage
  * @return \Prooph\Link\ProcessManager\Model\Task
  * @throws \RuntimeException
  */
 private function scheduleTaskFor(MessageHandler $messageHandler, ProcessingMetadata $taskMetadata, Message $workflowMessage)
 {
     if ($workflowMessage->messageType()->isCollectDataMessage()) {
         $taskType = TaskType::collectData();
     } elseif ($workflowMessage->messageType()->isDataCollectedMessage() || $workflowMessage->messageType()->isDataProcessedMessage()) {
         $taskType = TaskType::processData();
     } else {
         throw new \RuntimeException(sprintf("Failed to determine a task type which can handle a %s message", $workflowMessage->messageType()->toString()));
     }
     if (!empty($messageHandler->processingMetadata()->toArray())) {
         $taskMetadata = $taskMetadata->merge($messageHandler->processingMetadata());
     }
     return Task::setUp($messageHandler, $taskType, $workflowMessage->processingType(), $taskMetadata);
 }
 /**
  * @param MessageHandlerId $messageHandlerId
  * @param $messageHandlerName
  * @param MessageHandler\HandlerType $handlerType
  * @param MessageHandler\DataDirection $dataDirection
  * @param MessageHandler\ProcessingTypes $supportedProcessingTypes
  * @param ProcessingMetadata $processingMetadata
  * @param string $metadataRiotTag
  * @param string $icon
  * @param string $iconType
  * @param null|Prototype $preferredProcessingType
  * @param null|MessageHandler\ProcessingId $processingId
  * @param array $additionalData
  * @return MessageHandler
  */
 public function installMessageHandler(MessageHandlerId $messageHandlerId, $messageHandlerName, HandlerType $handlerType, DataDirection $dataDirection, ProcessingTypes $supportedProcessingTypes, ProcessingMetadata $processingMetadata, $metadataRiotTag, $icon, $iconType, Prototype $preferredProcessingType = null, ProcessingId $processingId = null, array $additionalData = [])
 {
     return MessageHandler::fromDefinition($messageHandlerId, $messageHandlerName, $this->nodeName(), $handlerType, $dataDirection, $supportedProcessingTypes, $processingMetadata, $metadataRiotTag, $icon, $iconType, $preferredProcessingType, $processingId, $additionalData);
 }
 /**
  * @param MessageHandler $messageHandler
  * @param Message $message
  * @return MessageIsNotManageable
  */
 public static function byMessageHandler(MessageHandler $messageHandler, Message $message)
 {
     $message = sprintf("Message %s -> %s is not manageable by message handler %s: %s", $message->messageType()->toString(), $message->processingType()->typeDescription()->label(), $messageHandler->name(), $messageHandler->lastValidationError());
     return new self($message);
 }
 /**
  * @param bool $singleItemMode
  * @return MessageHandler
  */
 protected function getArticleImporterMessageHandler($singleItemMode = false)
 {
     $supportedProcessingType = $singleItemMode ? Article::prototype() : ArticleCollection::prototype();
     return MessageHandler::fromDefinition(MessageHandlerId::generate(), 'Article Importer', NodeName::defaultName(), MessageHandler\HandlerType::connector(), MessageHandler\DataDirection::target(), MessageHandler\ProcessingTypes::support([$supportedProcessingType]), ProcessingMetadata::fromArray(['chunk_support' => true]), 'sqlconnector-pm-metadata', 'glyphicon-hdd', 'glyphicon');
 }
 /**
  * @param $dataDirection
  * @param null|string $handlerType
  * @param null|array $metadata
  * @return MessageHandler
  */
 private function getMessageHandler($dataDirection, $handlerType = null, array $metadata = null)
 {
     if (!is_null($handlerType)) {
         $handlerType = MessageHandler\HandlerType::fromString($handlerType);
     } else {
         $handlerType = MessageHandler\HandlerType::connector();
     }
     if (!is_null($metadata)) {
         $metadata = ProcessingMetadata::fromArray($metadata);
     } else {
         $metadata = ProcessingMetadata::noData();
     }
     return MessageHandler::fromDefinition(MessageHandlerId::generate(), 'Article Export', NodeName::defaultName(), $handlerType, MessageHandler\DataDirection::fromString($dataDirection), MessageHandler\ProcessingTypes::support([ArticleCollection::prototype(), Article::prototype()]), $metadata, 'sqlconnector-pm-metadata', 'glyphicon-hdd', 'glyphicon', Article::prototype(), MessageHandler\ProcessingId::fromString('sqlconnector:::example'));
 }
 /**
  * @param MessageHandler $messageHandler
  * @return array
  */
 private function determineAllowedMessages(MessageHandler $messageHandler)
 {
     $allowedMessages = [];
     if ($messageHandler->dataDirection()->isSource()) {
         $allowedMessages[] = MessageNameUtils::COLLECT_DATA;
     }
     if ($messageHandler->dataDirection()->isTarget()) {
         $allowedMessages[] = MessageNameUtils::PROCESS_DATA;
     }
     if ($messageHandler->handlerType()->isCallback()) {
         $allowedMessages[] = MessageNameUtils::DATA_COLLECTED;
         $allowedMessages[] = MessageNameUtils::DATA_PROCESSED;
     }
     return $allowedMessages;
 }