Esempio n. 1
0
 public function testFinishTrigger()
 {
     $processTrigger = $this->getMock('Oro\\Bundle\\WorkflowBundle\\Entity\\ProcessTrigger');
     $processData = $this->getMockBuilder('Oro\\Bundle\\WorkflowBundle\\Model\\ProcessData')->disableOriginalConstructor()->getMock();
     $this->eventDispatcher->expects($this->once())->method('dispatch')->with(ProcessEvents::HANDLE_AFTER_FLUSH, $this->callback(function ($event) use($processTrigger, $processData) {
         $this->assertInstanceOf('Oro\\Bundle\\WorkflowBundle\\Event\\ProcessHandleEvent', $event);
         $this->assertAttributeSame($processTrigger, 'processTrigger', $event);
         $this->assertAttributeSame($processData, 'processData', $event);
         return true;
     }));
     $this->handler->finishTrigger($processTrigger, $processData);
 }
 /**
  * @param PostFlushEventArgs $args
  */
 public function postFlush(PostFlushEventArgs $args)
 {
     if (!$this->enabled) {
         return;
     }
     $entityManager = $args->getEntityManager();
     // handle processes
     $hasQueuedOrHandledProcesses = false;
     $handledProcesses = [];
     foreach ($this->scheduledProcesses as &$entityProcesses) {
         while ($entityProcess = array_shift($entityProcesses)) {
             /** @var ProcessTrigger $trigger */
             $trigger = $entityProcess['trigger'];
             /** @var ProcessData $data */
             $data = $entityProcess['data'];
             if (!$this->handler->isTriggerApplicable($trigger, $data)) {
                 $this->logger->debug('Process trigger is not applicable', $trigger, $data);
                 continue;
             }
             if ($trigger->isQueued() || $this->forceQueued) {
                 $processJob = $this->queueProcess($trigger, $data);
                 $entityManager->persist($processJob);
                 $this->queuedJobs[(int) $trigger->getTimeShift()][$trigger->getPriority()][] = $processJob;
             } else {
                 $this->logger->debug('Process handled', $trigger, $data);
                 $this->handler->handleTrigger($trigger, $data);
                 $handledProcesses[] = $entityProcess;
             }
             $hasQueuedOrHandledProcesses = true;
         }
     }
     // save both handled entities and queued process jobs
     if ($hasQueuedOrHandledProcesses) {
         $entityManager->flush();
         foreach ($handledProcesses as $entityProcess) {
             /** @var ProcessTrigger $trigger */
             $trigger = $entityProcess['trigger'];
             /** @var ProcessData $data */
             $data = $entityProcess['data'];
             $this->handler->finishTrigger($trigger, $data);
         }
     }
     // delete unused processes
     if ($this->removedEntityHashes) {
         $this->registry->getRepository('OroWorkflowBundle:ProcessJob')->deleteByHashes($this->removedEntityHashes);
         $this->removedEntityHashes = array();
     }
     // create queued JMS jobs
     $this->createJobs($entityManager);
 }