/** * @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)); }
/** * @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); }
/** * @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); }
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()); }
/** * @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; }
/** * @param string $workflowName * @return WorkflowItem */ protected function createWorkflowItem($workflowName = self::TEST_WORKFLOW_NAME) { $workflowItem = new WorkflowItem(); $workflowItem->setWorkflowName($workflowName); return $workflowItem; }
/** * @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); }
/** * 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; }