/** * Short description of method getConditionalConnectorNewActivities * * @access protected * @author Somsack Sipasseuth, <*****@*****.**> * @param Resource processExecution * @param Resource activityExecution * @param Resource conditionalConnector * @return array */ protected function getConditionalConnectorNewActivities(core_kernel_classes_Resource $processExecution, core_kernel_classes_Resource $activityExecution, core_kernel_classes_Resource $conditionalConnector) { $returnValue = array(); $activityService = wfEngine_models_classes_ActivityService::singleton(); $connectorService = wfEngine_models_classes_ConnectorService::singleton(); $transitionRuleService = wfEngine_models_classes_TransitionRuleService::singleton(); $transitionRule = $connectorService->getTransitionRule($conditionalConnector); if (is_null($transitionRule)) { return $returnValue; } $evaluationResult = $transitionRuleService->getExpression($transitionRule)->evaluate(array(VAR_PROCESS_INSTANCE => $activityExecution->getUri())); // var_dump('transition rule '.$transitionRule->getLabel(), $evaluationResult); if ($evaluationResult) { // next activities = THEN $thenActivity = $transitionRuleService->getThenActivity($transitionRule); if (!is_null($thenActivity)) { if ($activityService->isActivity($thenActivity)) { $thenActivity->getLabel(); $returnValue[] = $thenActivity; } else { if ($activityService->isConnector($thenActivity)) { $returnValue = $this->getNewActivities($processExecution, $activityExecution, $thenActivity); } } } else { throw new wfEngine_models_classes_ProcessDefinitonException('no "then" activity found for the transition rule ' . $transitionRule->getUri()); } // var_dump('then', $returnValue); } else { // next activities = ELSE $elseActivity = $transitionRuleService->getElseActivity($transitionRule); if (!is_null($elseActivity)) { if ($activityService->isActivity($elseActivity)) { $elseActivity->getLabel(); $returnValue[] = $elseActivity; } else { $returnValue = $this->getNewActivities($processExecution, $activityExecution, $elseActivity); } } else { throw new wfEngine_models_classes_ProcessDefinitonException('no "else" activity found for the transition rule ' . $transitionRule->getUri()); } // var_dump('else', $returnValue); } return (array) $returnValue; }
/** * Short description of method trigger * * @access public * @author Somsack Sipasseuth, <*****@*****.**> * @param Resource connector * @param Resource activityExecution * @param Resource processExecution * @return int */ public function trigger(core_kernel_classes_Resource $connector, core_kernel_classes_Resource $activityExecution, core_kernel_classes_Resource $processExecution = null) { $returnValue = (int) 0; if (!is_null($connector) && !is_null($activityExecution)) { //initialize properties $connectorUserNotifiedProp = new core_kernel_classes_Property(PROPERTY_CONNECTORS_USER_NOTIFIED); $connectorRoleNotifiedProp = new core_kernel_classes_Property(PROPERTY_CONNECTORS_ROLE_NOTIFIED); $connectorNextActivitiesProp = new core_kernel_classes_Property(PROPERTY_STEP_NEXT); $activityExecutionUserProp = new core_kernel_classes_Property(PROPERTY_ACTIVITY_EXECUTION_CURRENT_USER); $activityAclModeProp = new core_kernel_classes_Property(PROPERTY_ACTIVITIES_ACL_MODE); $activityAclUserProp = new core_kernel_classes_Property(PROPERTY_ACTIVITIES_RESTRICTED_USER); $activityAclRoleProp = new core_kernel_classes_Property(PROPERTY_ACTIVITIES_RESTRICTED_ROLE); $connectorService = wfEngine_models_classes_ConnectorService::singleton(); $transitionRuleService = wfEngine_models_classes_TransitionRuleService::singleton(); $roleService = wfEngine_models_classes_RoleService::singleton(); $activityExecutionService = wfEngine_models_classes_ActivityExecutionService::singleton(); $processExecutionService = wfEngine_models_classes_ProcessExecutionService::singleton(); if (is_null($processExecution)) { $processExecution = $activityExecutionService->getRelatedProcessExecution($activityExecution); } $users = array(); //get the notifications mode defined for that connector $notifyModes = $connector->getPropertyValuesCollection(new core_kernel_classes_Property(PROPERTY_CONNECTORS_NOTIFY)); foreach ($notifyModes->getIterator() as $notify) { $nextActivities = array(); //get the users regarding the notification mode switch ($notify->getUri()) { //users directly defined case INSTANCE_NOTIFY_USER: foreach ($connector->getPropertyValues($connectorUserNotifiedProp) as $userUri) { if (!in_array($userUri, $users)) { $users[] = $userUri; } } break; //users from roles directly defined //users from roles directly defined case INSTANCE_NOTIFY_ROLE: foreach ($connector->getPropertyValues($connectorRoleNotifiedProp) as $roleUri) { foreach ($roleService->getUsers(new core_kernel_classes_Resource($roleUri)) as $userUri) { if (!in_array($userUri, $users)) { $users[] = $userUri; } } } break; //get the users who have executed the previous activity //get the users who have executed the previous activity case INSTANCE_NOTIFY_PREVIOUS: $previousActivities = array(); $cardinalityService = wfEngine_models_classes_ActivityCardinalityService::singleton(); foreach ($connectorService->getPreviousActivities($connector) as $prevActivity) { if ($cardinalityService->isCardinality($prevActivity)) { $previousActivities[] = $cardinalityService->getSource($prevActivity)->getUri(); } else { $previousActivities[] = $prevActivity->getUri(); } } $activity = $activityExecutionService->getExecutionOf($activityExecution); //check activity execution against connector if (in_array($activity->getUri(), $previousActivities)) { $activityExecutionUser = $activityExecutionService->getActivityExecutionUser($activityExecution); if (!is_null($activityExecutionUser)) { if (!in_array($activityExecutionUser->getUri(), $users)) { $users[] = $activityExecutionUser->getUri(); } } } break; //get the users //get the users case INSTANCE_NOTIFY_THEN: if ($connectorService->getType($connector)->getUri() == INSTANCE_TYPEOFCONNECTORS_CONDITIONAL) { $transitionRule = $connectorService->getTransitionRule($connector); if ($transitionRule instanceof core_kernel_classes_Resource) { $then = $transitionRuleService->getThenActivity($transitionRule); if ($then instanceof core_kernel_classes_Resource) { $nextActivities[] = $then->getUri(); } } } else { //wrong connector type! break; } //do not break, continue to the INSTANCE_NOTIFY_NEXT case case INSTANCE_NOTIFY_ELSE: if (empty($nextActivities)) { if ($connectorService->getType($connector)->getUri() == INSTANCE_TYPEOFCONNECTORS_CONDITIONAL) { $transitionRule = $connectorService->getTransitionRule($connector); if ($transitionRule instanceof core_kernel_classes_Resource) { $else = $transitionRuleService->getElseActivity($transitionRule); if ($else instanceof core_kernel_classes_Resource) { $nextActivities[] = $else->getUri(); } } } else { //wrong connector type! break; } } //do not break, continue to the INSTANCE_NOTIFY_NEXT case case INSTANCE_NOTIFY_NEXT: if (empty($nextActivities)) { $cardinalityService = wfEngine_models_classes_ActivityCardinalityService::singleton(); foreach ($connectorService->getNextActivities($connector) as $nextActivity) { if ($cardinalityService->isCardinality($nextActivity)) { $nextActivities[] = $cardinalityService->getDestination($nextActivity)->getUri(); } else { $nextActivities[] = $nextActivity->getUri(); } } } $nextActivityExecutions = $activityExecutionService->getFollowing($activityExecution); foreach ($nextActivityExecutions as $activityExec) { $activity = $activityExecutionService->getExecutionOf($activityExec); if (!in_array($activity->getUri(), $nextActivities)) { //invalid activity exec continue; } //check if it is among the next activity of the connector: $mode = $activityExecutionService->getAclMode($activityExec); if ($mode instanceof core_kernel_classes_Resource) { switch ($mode->getUri()) { case INSTANCE_ACL_USER: $restrictedUser = $activityExecutionService->getRestrictedUser($activityExec); //@TODO: implemente multiple restricted users? if (!is_null($restrictedUser)) { if (!in_array($restrictedUser->getUri(), $users)) { $users[] = $restrictedUser->getUri(); } } break; case INSTANCE_ACL_ROLE: case INSTANCE_ACL_ROLE_RESTRICTED_USER: case INSTANCE_ACL_ROLE_RESTRICTED_USER_INHERITED: $restrictedRole = $activityExecutionService->getRestrictedRole($activityExec); //@TODO: implemente multiple restricted roles? if (!is_null($restrictedRole)) { foreach ($roleService->getUsers($restrictedRole) as $userUri) { if (!in_array($userUri, $users)) { $users[] = $userUri; } } } break; } } } break; } } //build notification message for every user here: foreach ($users as $userUri) { if ($this->createNotification($connector, new core_kernel_classes_Resource($userUri), $activityExecution, $processExecution)) { //get message from connector: //replace SPX in message bodies $returnValue++; } } } return (int) $returnValue; }