/**
  * @param Workflow $workflow
  * @param string $currentStepName
  * @return WorkflowItem
  */
 protected function createWorkflowItem(Workflow $workflow, $currentStepName = null)
 {
     $result = new WorkflowItem();
     $result->setCurrentStepName($currentStepName);
     $result->setWorkflowName($workflow->getName());
     return $result;
 }
 /**
  * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
  * @expectedExceptionMessage Managed entities for workflow item not found
  */
 public function testValidateManagedEntitiesNotFound()
 {
     $workflowItem = new WorkflowItem();
     $workflowItem->setWorkflowName('test_workflow');
     $this->workflowManager->expects($this->once())->method('isAllManagedEntitiesSpecified')->with($workflowItem)->will($this->returnValue(false));
     $this->validator->validate($workflowItem);
 }
 /**
  * Updates WorkflowItem with WorkflowDefinition
  *
  * @param EntityManager $em
  * @param WorkflowItem $workflowItem
  * @throws WorkflowException
  */
 protected function updateWorkflowDefinition(EntityManager $em, WorkflowItem $workflowItem)
 {
     $workflowDefinition = $em->find('OroWorkflowBundle:WorkflowDefinition', $workflowItem->getWorkflowName());
     if (!$workflowDefinition) {
         throw new WorkflowException(sprintf('Cannot find workflow definition "%s"', $workflowItem->getWorkflowName()));
     }
     $workflowItem->setDefinition($workflowDefinition);
 }
 public function testExecute()
 {
     $workflowItem = new WorkflowItem();
     $this->assertFalse($workflowItem->isClosed());
     $action = new CloseWorkflow();
     $action->execute($workflowItem);
     $this->assertTrue($workflowItem->isClosed());
 }
 /**
  * @expectedException \Oro\Bundle\WorkflowBundle\Exception\WorkflowException
  * @expectedExceptionMessage Cannot find workflow definition "test_workflow"
  */
 public function testPrePersistFails()
 {
     $entity = new WorkflowItem();
     $entity->setWorkflowName('test_workflow');
     $workflowDefinition = new WorkflowDefinition();
     $workflowDefinition->setName('test_workflow');
     $em = $this->getMockBuilder('Doctrine\\ORM\\EntityManager')->setMethods(array('find'))->disableOriginalConstructor()->getMock();
     $em->expects($this->once())->method('find')->with('OroWorkflowBundle:WorkflowDefinition', 'test_workflow')->will($this->returnValue(null));
     $this->subscriber->prePersist(new LifecycleEventArgs($entity, $em));
 }
 /**
  * Bind entities to workflow item
  *
  * @param WorkflowItem $workflowItem
  * @return bool Returns true if new entities were bound
  */
 public function bindEntities(WorkflowItem $workflowItem)
 {
     $workflowData = $workflowItem->getData();
     if (!$workflowData->isModified()) {
         return false;
     }
     $workflow = $this->workflowRegistry->getWorkflow($workflowItem->getWorkflowName());
     $bindAttributeNames = $workflow->getAttributeManager()->getBindEntityAttributeNames();
     $entitiesToBind = $workflowData->getValues($bindAttributeNames);
     return $workflowItem->syncBindEntities($this->createBindEntities($entitiesToBind));
 }
Example #7
0
 /**
  * @expectedException \Oro\Bundle\WorkflowBundle\Exception\WorkflowException
  * @expectedExceptionMessage Value of attribute "attribute" must be an object
  */
 public function testUpdateAclIdentitiesNotAnObjectException()
 {
     $workflowName = 'test_workflow';
     $step = new WorkflowStep();
     $step->setName('step');
     $attribute = new Attribute();
     $attribute->setName('attribute')->setOption('class', 'TestEntity');
     $entityAcl = new WorkflowEntityAcl();
     $entityAcl->setStep($step)->setAttribute($attribute->getName());
     $definition = new WorkflowDefinition();
     $definition->setName($workflowName)->setSteps(array($step))->setEntityAcls(array($entityAcl));
     $this->setWorkflow($workflowName, array($attribute));
     $workflowItem = new WorkflowItem();
     $workflowItem->setWorkflowName($workflowName)->setDefinition($definition)->setCurrentStep($step);
     $workflowItem->getData()->set($attribute->getName(), 'not_an_object');
     $this->manager->updateAclIdentities($workflowItem);
 }
Example #8
0
 /**
  * @param WorkflowItem $workflowItem
  * @return WorkflowItem
  * @throws WorkflowException
  */
 public function updateAclIdentities(WorkflowItem $workflowItem)
 {
     $workflow = $this->workflowRegistry->getWorkflow($workflowItem->getWorkflowName());
     $definition = $workflowItem->getDefinition();
     $currentStepName = $workflowItem->getCurrentStep()->getName();
     $aclIdentities = array();
     foreach ($definition->getEntityAcls() as $entityAcl) {
         if ($entityAcl->getStep()->getName() == $currentStepName) {
             $attributeName = $entityAcl->getAttribute();
             $attribute = $workflow->getAttributeManager()->getAttribute($attributeName);
             $entity = $workflowItem->getData()->get($attributeName);
             if (!$entity) {
                 continue;
             }
             if (!is_object($entity)) {
                 throw new WorkflowException(sprintf('Value of attribute "%s" must be an object', $attributeName));
             }
             $aclIdentity = new WorkflowEntityAclIdentity();
             $aclIdentity->setAcl($entityAcl)->setEntityClass($attribute->getOption('class'))->setEntityId($this->doctrineHelper->getSingleEntityIdentifier($entity));
             $aclIdentities[] = $aclIdentity;
         }
     }
     $workflowItem->setAclIdentities($aclIdentities);
     return $workflowItem;
 }
 public function testGetAddTransitionRecords()
 {
     $this->assertEmpty($this->workflowItem->getTransitionRecords()->getValues());
     $transitionRecord = new WorkflowTransitionRecord();
     $transitionRecord->setTransitionName('test_transition');
     $this->assertEquals($this->workflowItem, $this->workflowItem->addTransitionRecord($transitionRecord));
     $this->assertEquals(array($transitionRecord), $this->workflowItem->getTransitionRecords()->getValues());
     $this->assertEquals($this->workflowItem, $transitionRecord->getWorkflowItem());
 }
 protected function generateEntities(ObjectManager $manager, WorkflowDefinition $definition)
 {
     // load entities
     /** @var WorkflowAwareEntity[] $entities */
     $entities = array();
     for ($i = 1; $i <= self::COUNT; $i++) {
         $entity = new WorkflowAwareEntity();
         $entity->setName($definition->getName() . '_entity_' . $i);
         $entities[] = $entity;
         $manager->persist($entity);
     }
     $manager->flush();
     // create workflow item manually (to make it faster)
     foreach ($entities as $entity) {
         $workflowItem = new WorkflowItem();
         $workflowItem->setDefinition($definition)->setWorkflowName($definition->getName())->setEntity($entity)->setEntityId($entity->getId())->setCurrentStep($definition->getSteps()->first());
         $manager->persist($workflowItem);
         $entity->setWorkflowItem($workflowItem)->setWorkflowStep($workflowItem->getCurrentStep());
     }
     $manager->flush();
 }
 public function testOnFlush()
 {
     $entity1 = new WorkflowItem();
     $entity1->setWorkflowName('workflow_1');
     $entity1->setSerializedData('_old_serialized_data');
     $data1 = new WorkflowData();
     $data1->foo = 'foo';
     $entity1->setData($data1);
     $entity2 = new WorkflowItem();
     $entity2->setWorkflowName('workflow_2');
     $data2 = new WorkflowData();
     $data2->bar = 'bar';
     $entity2->setData($data2);
     $entity3 = new \stdClass();
     $entity4 = new WorkflowItem();
     $entity4->setWorkflowName('workflow_4');
     $data4 = new WorkflowData();
     $data4->foo = 'baz';
     $entity4->setData($data4);
     $entity5 = new WorkflowItem();
     $data5 = new WorkflowData();
     // Leave this data not modified
     $entity5->setData($data5);
     $entity6 = new \stdClass();
     $expectedSerializedData1 = 'serialized_data_1';
     $expectedSerializedData2 = 'serialized_data_2';
     $expectedSerializedData4 = 'serialized_data_4';
     $this->serializer->expects($this->never())->method('deserialize');
     $this->serializer->expects($this->at(0))->method('setWorkflowName')->with($entity1->getWorkflowName());
     $this->serializer->expects($this->at(1))->method('serialize')->with($data1, 'json')->will($this->returnValue($expectedSerializedData1));
     $this->serializer->expects($this->at(2))->method('setWorkflowName')->with($entity2->getWorkflowName());
     $this->serializer->expects($this->at(3))->method('serialize')->with($data2, 'json')->will($this->returnValue($expectedSerializedData2));
     $this->serializer->expects($this->at(4))->method('setWorkflowName')->with($entity4->getWorkflowName());
     $this->serializer->expects($this->at(5))->method('serialize')->with($data4, 'json')->will($this->returnValue($expectedSerializedData4));
     $this->subscriber->onFlush(new OnFlushEventArgs($this->getOnFlushEntityManagerMock(array(array('getScheduledEntityInsertions', array(), $this->returnValue(array($entity1, $entity2, $entity3))), array('propertyChanged', array($entity1, 'serializedData', $entity1->getSerializedData(), $expectedSerializedData1)), array('propertyChanged', array($entity2, 'serializedData', $entity2->getSerializedData(), $expectedSerializedData2)), array('getScheduledEntityUpdates', array(), $this->returnValue(array($entity4, $entity5, $entity6))), array('propertyChanged', array($entity4, 'serializedData', $entity4->getSerializedData(), $expectedSerializedData4))))));
     $this->assertAttributeEquals($expectedSerializedData1, 'serializedData', $entity1);
     $this->assertAttributeEquals($expectedSerializedData2, 'serializedData', $entity2);
     $this->assertAttributeEquals($expectedSerializedData4, 'serializedData', $entity4);
     $this->assertAttributeEquals(null, 'serializedData', $entity5);
 }
Example #12
0
 public function testSetGetAclIdentities()
 {
     $firstStep = new WorkflowStep();
     $firstStep->setName('first_step');
     $secondStep = new WorkflowStep();
     $secondStep->setName('second_step');
     $firstEntityAcl = new WorkflowEntityAcl();
     $firstEntityAcl->setStep($firstStep)->setAttribute('first_attribute');
     $secondEntityAcl = new WorkflowEntityAcl();
     $secondEntityAcl->setStep($secondStep)->setAttribute('second_attribute');
     $firstAclIdentity = new WorkflowEntityAclIdentity();
     $firstAclIdentity->setAcl($firstEntityAcl);
     $alternativeFirstAclIdentity = new WorkflowEntityAclIdentity();
     $alternativeFirstAclIdentity->setAcl($firstEntityAcl);
     $secondAclIdentity = new WorkflowEntityAclIdentity();
     $secondAclIdentity->setAcl($secondEntityAcl);
     // default
     $this->assertEmpty($this->workflowItem->getAclIdentities()->toArray());
     // adding
     $this->workflowItem->setAclIdentities(array($firstAclIdentity));
     $this->assertCount(1, $this->workflowItem->getAclIdentities());
     $this->assertEquals($firstAclIdentity, $this->workflowItem->getAclIdentities()->first());
     // merging
     $this->workflowItem->setAclIdentities(array($alternativeFirstAclIdentity, $secondAclIdentity));
     $this->assertCount(2, $this->workflowItem->getAclIdentities());
     $aclIdentities = array_values($this->workflowItem->getAclIdentities()->toArray());
     $this->assertEquals($firstAclIdentity, $aclIdentities[0]);
     $this->assertEquals($secondAclIdentity, $aclIdentities[1]);
     // removing
     $this->workflowItem->setAclIdentities(array($secondAclIdentity));
     $this->assertCount(1, $this->workflowItem->getAclIdentities());
     $this->assertEquals($secondAclIdentity, $this->workflowItem->getAclIdentities()->first());
     // resetting
     $this->workflowItem->setAclIdentities(array());
     $this->assertEmpty($this->workflowItem->getAclIdentities()->toArray());
 }
 /**
  * @expectedException \Oro\Bundle\WorkflowBundle\Exception\UnknownStepException
  * @expectedExceptionMessage Step "unknown_step" not found
  */
 public function testGetAllowedTransitionsUnknownStepException()
 {
     $workflowItem = new WorkflowItem();
     $workflowItem->setCurrentStepName('unknown_step');
     $workflow = $this->createWorkflow();
     $workflow->getTransitionsByWorkflowItem($workflowItem);
 }
 /**
  * Get transition form.
  *
  * @param WorkflowItem $workflowItem
  * @param Transition $transition
  * @return Form
  */
 protected function getTransitionForm(WorkflowItem $workflowItem, Transition $transition)
 {
     return $this->createForm($transition->getFormType(), $workflowItem->getData(), array_merge($transition->getFormOptions(), array('workflow_item' => $workflowItem, 'transition_name' => $transition->getName())));
 }
 /**
  * Deserialize data of WorkflowItem
  *
  * @param WorkflowItem $workflowItem
  */
 protected function deserialize(WorkflowItem $workflowItem)
 {
     // Pass serializer into $workflowItem to make lazy loading of workflow item data.
     $workflowItem->setSerializer($this->serializer, $this->format);
     // Set related entity
     $relatedEntity = $this->doctrineHelper->getEntityReference($workflowItem->getDefinition()->getRelatedEntity(), $workflowItem->getEntityId());
     $workflowItem->setEntity($relatedEntity);
 }
 /**
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 public function testOnFlushAndPostFlush()
 {
     $definition = $this->getMockBuilder('Oro\\Bundle\\WorkflowBundle\\Entity\\WorkflowDefinition')->disableOriginalConstructor()->getMock();
     $definition->expects($this->any())->method('getEntityAttributeName')->will($this->returnValue('entity'));
     $entity1 = new WorkflowItem();
     $entity1->setDefinition($definition);
     $entity1->setWorkflowName('workflow_1');
     $entity1->setSerializedData('_old_serialized_data');
     $data1 = new WorkflowData();
     $data1->foo = 'foo';
     $entity1->setData($data1);
     $entity2 = new WorkflowItem();
     $entity2->setDefinition($definition);
     $entity2->setWorkflowName('workflow_2');
     $data2 = new WorkflowData();
     $data2->bar = 'bar';
     $entity2->setData($data2);
     $entity3 = new \stdClass();
     $entity4 = new WorkflowItem();
     $entity4->setDefinition($definition);
     $entity4->setWorkflowName('workflow_4');
     $data4 = new WorkflowData();
     $data4->foo = 'baz';
     $entity4->setData($data4);
     $entity5 = new WorkflowItem();
     $entity5->setDefinition($definition);
     $data5 = new WorkflowData();
     // Leave this data not modified
     $entity5->setData($data5);
     $entity6 = new \stdClass();
     $expectedSerializedData1 = 'serialized_data_1';
     $expectedSerializedData2 = 'serialized_data_2';
     $expectedSerializedData4 = 'serialized_data_4';
     $this->serializer->expects($this->never())->method('deserialize');
     $this->serializer->expects($this->at(0))->method('setWorkflowName')->with($entity1->getWorkflowName());
     $this->serializer->expects($this->at(1))->method('serialize')->with($this->isInstanceOf('Oro\\Bundle\\WorkflowBundle\\Model\\WorkflowData'), 'json')->will($this->returnCallback(function ($data) use($data1, $expectedSerializedData1) {
         $this->assertEquals($data1, $data);
         return $expectedSerializedData1;
     }));
     $this->serializer->expects($this->at(2))->method('setWorkflowName')->with($entity2->getWorkflowName());
     $this->serializer->expects($this->at(3))->method('serialize')->with($this->isInstanceOf('Oro\\Bundle\\WorkflowBundle\\Model\\WorkflowData'), 'json')->will($this->returnCallback(function ($data) use($data2, $expectedSerializedData2) {
         $this->assertEquals($data2, $data);
         return $expectedSerializedData2;
     }));
     $this->serializer->expects($this->at(4))->method('setWorkflowName')->with($entity4->getWorkflowName());
     $this->serializer->expects($this->at(5))->method('serialize')->with($this->isInstanceOf('Oro\\Bundle\\WorkflowBundle\\Model\\WorkflowData'), 'json')->will($this->returnCallback(function ($data) use($data4, $expectedSerializedData4) {
         $this->assertEquals($data4, $data);
         return $expectedSerializedData4;
     }));
     $entityManager = $this->getPostFlushEntityManagerMock(array(array('getScheduledEntityInsertions', array(), $this->returnValue(array($entity1, $entity2, $entity3))), array('getScheduledEntityUpdates', array(), $this->returnValue(array($entity4, $entity5, $entity6)))));
     $this->listener->onFlush(new OnFlushEventArgs($entityManager));
     $this->listener->postFlush(new PostFlushEventArgs($entityManager));
     $this->assertAttributeEquals($expectedSerializedData1, 'serializedData', $entity1);
     $this->assertAttributeEquals($expectedSerializedData2, 'serializedData', $entity2);
     $this->assertAttributeEquals($expectedSerializedData4, 'serializedData', $entity4);
     $this->assertAttributeEquals(null, 'serializedData', $entity5);
     $this->assertFalse($entity1->getData()->isModified());
     $this->assertFalse($entity2->getData()->isModified());
     $this->assertFalse($entity4->getData()->isModified());
     $this->assertFalse($entity5->getData()->isModified());
 }
Example #17
0
 /**
  * @param string|Workflow|WorkflowItem|WorkflowDefinition $workflowIdentifier
  */
 public function activateWorkflow($workflowIdentifier)
 {
     if ($workflowIdentifier instanceof WorkflowDefinition) {
         $entityClass = $workflowIdentifier->getRelatedEntity();
         $workflowName = $workflowIdentifier->getName();
     } else {
         $workflow = $this->getWorkflow($workflowIdentifier);
         $entityClass = $workflow->getDefinition()->getRelatedEntity();
         $workflowName = $workflow->getName();
     }
     $this->setActiveWorkflow($entityClass, $workflowName);
 }
 /**
  * @return WorkflowItem
  */
 protected function createWorkflowItem()
 {
     $workflowItem = new WorkflowItem();
     $workflowItem->setId(1);
     return $workflowItem;
 }
Example #19
0
 /**
  * @param string $workflowName
  * @return WorkflowItem
  */
 protected function createWorkflowItem($workflowName = self::TEST_WORKFLOW_NAME)
 {
     $workflowItem = new WorkflowItem();
     $workflowItem->setWorkflowName($workflowName);
     return $workflowItem;
 }
Example #20
0
 /**
  * @param WorkflowManager $workflowManager
  * @param WorkflowItem    $workflowItem
  * @param string          $transition
  * @param array           $data
  */
 protected function transit($workflowManager, $workflowItem, $transition, array $data)
 {
     foreach ($data as $key => $value) {
         $workflowItem->getData()->set($key, $value);
     }
     $workflow = $workflowManager->getWorkflow($workflowItem);
     /** @var EntityManager $em */
     $workflow->transit($workflowItem, $transition);
     $workflowItem->setUpdated();
 }
 /**
  * Deserialize data of WorkflowItem
  *
  * @param WorkflowItem $workflowItem
  */
 protected function deserialize(WorkflowItem $workflowItem)
 {
     // Pass serializer into $workflowItem to make lazy loading of workflow item data.
     $workflowItem->setSerializer($this->serializer, $this->format);
 }
Example #22
0
 /**
  * Get passed latest steps from step with minimum order to step with maximum order.
  *
  * @param WorkflowItem $workflowItem
  * @return Collection|Step[]
  */
 public function getPassedStepsByWorkflowItem(WorkflowItem $workflowItem)
 {
     $transitionRecords = $workflowItem->getTransitionRecords();
     $passedSteps = array();
     if ($transitionRecords) {
         $minStepIdx = count($transitionRecords) - 1;
         $minStep = $this->stepManager->getStep($transitionRecords[$minStepIdx]->getStepTo()->getName());
         $steps = array($minStep);
         $minStepIdx--;
         while ($minStepIdx > -1) {
             $step = $this->stepManager->getStep($transitionRecords[$minStepIdx]->getStepTo()->getName());
             if ($step->getOrder() <= $minStep->getOrder() && $step->getName() != $minStep->getName()) {
                 $minStepIdx--;
                 $minStep = $step;
                 $steps[] = $step;
             } elseif ($step->getName() == $minStep->getName()) {
                 $minStepIdx--;
             } else {
                 break;
             }
         }
         $passedSteps = array_reverse($steps);
     }
     return new ArrayCollection($passedSteps);
 }
 /**
  * Get transitions for existing workflow item.
  *
  * @param WorkflowItem $workflowItem
  * @return Collection|Transition[]
  * @throws UnknownStepException
  */
 public function getTransitionsByWorkflowItem(WorkflowItem $workflowItem)
 {
     $currentStepName = $workflowItem->getCurrentStepName();
     $currentStep = $this->stepManager->getStep($currentStepName);
     if (!$currentStep) {
         throw new UnknownStepException($currentStepName);
     }
     $transitions = new ArrayCollection();
     $transitionNames = $currentStep->getAllowedTransitions();
     foreach ($transitionNames as $transitionName) {
         $transition = $this->transitionManager->extractTransition($transitionName);
         $transitions->add($transition);
     }
     return $transitions;
 }