protected function flattenProcessActivity(core_kernel_classes_Resource $activity) { $this->initCloningVariables(); $services = wfEngine_models_classes_ActivityService::singleton()->getInteractiveServices($activity); // only replace single-service activities, with the service process runner if (count($services) == 1) { $serviceCall = current($services); $serviceDefinition = $serviceCall->getUniquePropertyValue(new core_kernel_classes_Property(PROPERTY_CALLOFSERVICES_SERVICEDEFINITION)); if ($serviceDefinition->getUri() == INSTANCE_SERVICE_PROCESSRUNNER) { // found a wfEngine call, extract processDefnition $subProcess = $this->getSubProcess($serviceCall); if (empty($subProcess)) { throw new common_exception_InconsistentData('Missing process uri in service call ' . $serviceCall->getUri()); } // @todo test the process first // @todo clone sub process common_Logger::w('Should have cloned subprocess ' . $subProcess); $segment = $this->cloneProcessSegment($subProcess); $inActivity = $segment['in']; $firstout = current($segment['out']); //allow first acitvity only if the parent is if (!wfAuthoring_models_classes_ActivityService::singleton()->isInitial($activity)) { $inActivity->editPropertyValues(new core_kernel_classes_Property(PROPERTY_ACTIVITIES_ISINITIAL), GENERIS_FALSE); } $this->addClonedActivity($inActivity, $activity, $firstout); $propProcessActivities = new core_kernel_classes_Property(PROPERTY_PROCESS_ACTIVITIES); foreach ($this->getClonedActivities() as $activityClone) { $this->processDefinition->setPropertyValue($propProcessActivities, $activityClone->getUri()); } //get the previous connector if exists and clone it $allConnectors = wfAuthoring_models_classes_ProcessService::singleton()->getConnectorsByActivity($activity); $connectors = array_merge($allConnectors['next'], $allConnectors['prev']); foreach ($connectors as $connector) { //trick to reference previous and following connector: connector_prev -> activity_subprocess[activity1, activity2, etc.] -> connector_follow $this->addClonedConnector($connector, $connector); } //glue segment: $glue = array_merge(array($activity), $allConnectors['prev']); foreach ($glue as $fragment) { $this->linkClonedStep($fragment); } //delete all activity: $activity->delete(true); //recursive call: foreach ($this->getClonedActivities() as $activityClone) { $this->flattenProcessActivity($activityClone); } } } }
public function testCloneConditionnalProcess() { $this->processCloner->initCloningVariables(); $id = "P_condProc7_"; //for var_dump identification $this->processCloner->setCloneLabel("__Clone7"); $activity1 = $this->authoringService->createActivity($this->proc, "{$id}Activity_1"); $activity1->editPropertyValues(new core_kernel_classes_Property(PROPERTY_ACTIVITIES_ISINITIAL), GENERIS_TRUE); $connector1 = $this->authoringService->createConnector($activity1); $then1 = $this->authoringService->createConditionalActivity($connector1, 'then', null, "{$id}Activity_2"); //create "Activity_2" $else1 = $this->authoringService->createConditionalActivity($connector1, 'else', null, '', true); //create another connector // $else1 = $this->authoringService->createConditionalActivity($connector1, 'else'); $this->assertEquals($connector1->getUniquePropertyValue(new core_kernel_classes_Property(PROPERTY_CONNECTORS_TYPE))->getUri(), INSTANCE_TYPEOFCONNECTORS_CONDITIONAL); $this->assertTrue($this->activityService->isActivity($then1)); $this->assertTrue($this->connectorService->isConnector($else1)); $transitionRule = $connector1->getUniquePropertyValue(new core_kernel_classes_Property(PROPERTY_CONNECTORS_TRANSITIONRULE)); $this->assertEquals($then1->getUri(), $transitionRule->getUniquePropertyValue(new core_kernel_classes_Property(PROPERTY_TRANSITIONRULES_THEN))->getUri()); $this->assertEquals($else1->getUri(), $transitionRule->getUniquePropertyValue(new core_kernel_classes_Property(PROPERTY_TRANSITIONRULES_ELSE))->getUri()); //create a sequential a $connector2 = $this->authoringService->createConnector($then1); $lastActivity = $this->authoringService->createSequenceActivity($connector2, null, "{$id}Activity_3"); //connector "else1": connect the "then" to the activity "then1" and the "else" to $then2 = $this->authoringService->createConditionalActivity($else1, 'then', $connector2); //connect to the activity $then1 $else2 = $this->authoringService->createConditionalActivity($else1, 'else', $lastActivity); //connect to the connector of the activity $then1 $this->assertEquals($then2->getUri(), $connector2->getUri()); $this->assertEquals($else2->getUri(), $lastActivity->getUri()); //clone the process now! $processClone = $this->processCloner->cloneProcess($this->proc); $this->assertIsA($processClone, 'core_kernel_classes_Resource'); $this->assertEquals(count($this->processCloner->getClonedActivities()), 3); $this->assertEquals(count($this->processCloner->getClonedConnectors()), 3); //count the number of activities in the cloned process $activities = $this->authoringService->getActivitiesByProcess($processClone); $this->assertEquals(count($activities), 3); foreach ($activities as $activity) { $this->assertTrue($this->activityService->isActivity($activity)); } $this->authoringService->deleteProcess($processClone); }
protected function createLinearSuperProcess($processes) { $processDefinitionClass = new core_kernel_classes_Class(CLASS_PROCESS); $processDefinition = $processDefinitionClass->createInstance('process for ' . __CLASS__); $this->assertIsA($processDefinition, 'core_kernel_classes_Resource'); $activityService = wfAuthoring_models_classes_ActivityService::singleton(); $connectorService = wfAuthoring_models_classes_ConnectorService::singleton(); $processRunnerService = new core_kernel_classes_Resource(INSTANCE_SERVICE_PROCESSRUNNER); $processRunnerParam = new core_kernel_classes_Resource(INSTANCE_FORMALPARAM_PROCESSDEFINITION); $last = null; foreach ($processes as $subProcess) { $serviceCall = new tao_models_classes_service_ServiceCall($processRunnerService); $serviceCall->addInParameter(new tao_models_classes_service_ConstantParameter($processRunnerParam, $subProcess)); $current = $activityService->createActivity($processDefinition); $current->setPropertyValue(new core_kernel_classes_Property(PROPERTY_ACTIVITIES_INTERACTIVESERVICES), $serviceCall->toOntology()); if (is_null($last)) { $current->editPropertyValues(new core_kernel_classes_Property(PROPERTY_ACTIVITIES_ISINITIAL), GENERIS_TRUE); } else { $connectorService->createSequential($last, $current); } $last = $current; } return $processDefinition; }
/** * Short description of method deleteActivity * * @access public * @author Joel Bout, <*****@*****.**> * @param Resource activity * @return boolean */ public function deleteActivity(core_kernel_classes_Resource $activity) { $returnValue = (bool) false; $activityService = wfAuthoring_models_classes_ActivityService::singleton(); $returnValue = $activityService->delete($activity); return (bool) $returnValue; }
public function testSplitJoinVariable() { $process = wfAuthoring_models_classes_ProcessService::singleton()->createProcess('test process for ' . __FUNCTION__); $activityAuthoring = wfAuthoring_models_classes_ActivityService::singleton(); $webservice = new core_kernel_classes_Resource('http://www.tao.lu/Ontologies/TAODelivery.rdf#ServiceWebService'); $activity = array(); for ($i = 1; $i <= 3; $i++) { $activity[$i] = $activityAuthoring->createFromServiceDefinition($process, $webservice, array()); } wfAuthoring_models_classes_ProcessService::singleton()->setFirstActivity($process, $activity[1]); $c1 = $this->service->createSplit($activity[1], array($activity[2])); $c2 = $this->service->createJoin(array($activity[2]), $activity[3]); $this->service->setSplitCardinality($c1, array($activity[2]->getUri() => '3')); $this->service->setJoinCardinality($c2, array($activity[2]->getUri() => '3')); $this->runProcess($process, 5); wfAuthoring_models_classes_ProcessService::singleton()->deleteProcess($process); }