/** * Builds Project Data Structure * * @return array */ protected function buildData() { $data = array(); $data["metadata"] = $this->getMetadata(); $data["metadata"]["workspace"] = defined("SYS_SYS") ? SYS_SYS : "Unknown"; $data["metadata"]["name"] = $this->getProjectName(); $data["metadata"]["uid"] = $this->getProjectUid(); $bpmnStruct["ACTIVITY"] = \BpmnActivity::getAll($this->prjUid); $bpmnStruct["ARTIFACT"] = \BpmnArtifact::getAll($this->prjUid); $bpmnStruct["BOUND"] = \BpmnBound::getAll($this->prjUid); $bpmnStruct["DATA"] = \BpmnData::getAll($this->prjUid); $bpmnStruct["DIAGRAM"] = \BpmnDiagram::getAll($this->prjUid); $bpmnStruct["DOCUMENTATION"] = array(); $bpmnStruct["EVENT"] = \BpmnEvent::getAll($this->prjUid); $bpmnStruct["EXTENSION"] = array(); $bpmnStruct["FLOW"] = \BpmnFlow::getAll($this->prjUid, null, null, "", CASE_UPPER, false); $bpmnStruct["GATEWAY"] = \BpmnGateway::getAll($this->prjUid); $bpmnStruct["LANE"] = \BpmnLane::getAll($this->prjUid); $bpmnStruct["LANESET"] = \BpmnLaneset::getAll($this->prjUid); $bpmnStruct["PARTICIPANT"] = \BpmnParticipant::getAll($this->prjUid); $bpmnStruct["PROCESS"] = \BpmnProcess::getAll($this->prjUid); $bpmnStruct["PROJECT"] = array(\BpmnProjectPeer::retrieveByPK($this->prjUid)->toArray()); $workflow = new \ProcessMaker\Project\Workflow(); list($workflowData, $workflowFile) = $workflow->getData($this->prjUid); $data["bpmn-definition"] = $bpmnStruct; $data["workflow-definition"] = $workflowData; $data["workflow-files"] = $workflowFile; return $data; }
/** * Method called to associate a BpmnGateway object to this object * through the BpmnGateway foreign key attribute * * @param BpmnGateway $l BpmnGateway * @return void * @throws PropelException */ public function addBpmnGateway(BpmnGateway $l) { $this->collBpmnGateways[] = $l; $l->setBpmnProject($this); }
public function mapBpmnGatewayToWorkflowRoutes($activityUid, $gatewayUid) { try { $arrayGatewayData = \BpmnGateway::findOneBy(\BpmnGatewayPeer::GAT_UID, $gatewayUid)->toArray(); switch ($arrayGatewayData["GAT_TYPE"]) { //case "SELECTION": case self::BPMN_GATEWAY_COMPLEX: $routeType = "SELECT"; break; //case "EVALUATION": case self::BPMN_GATEWAY_EXCLUSIVE: $routeType = "EVALUATE"; break; //case "PARALLEL": case self::BPMN_GATEWAY_PARALLEL: if ($arrayGatewayData["GAT_DIRECTION"] == "DIVERGING") { $routeType = "PARALLEL"; } else { if ($arrayGatewayData["GAT_DIRECTION"] == "CONVERGING") { $routeType = "SEC-JOIN"; } else { throw new \LogicException( "Invalid Gateway direction, accepted values: [DIVERGING|CONVERGING], given: " . $arrayGatewayData["GAT_DIRECTION"] ); } } break; //case "PARALLEL_EVALUATION": case self::BPMN_GATEWAY_INCLUSIVE: if ($arrayGatewayData["GAT_DIRECTION"] == "DIVERGING") { $routeType = "PARALLEL-BY-EVALUATION"; } else { if ($arrayGatewayData["GAT_DIRECTION"] == "CONVERGING") { $routeType = "SEC-JOIN"; } else { throw new \LogicException( "Invalid Gateway direction, accepted values: [DIVERGING|CONVERGING], given: " . $arrayGatewayData["GAT_DIRECTION"] ); } } break; //case "TO_DO": case self::BPMN_GATEWAY_EVENTBASED: $routeType = "EVALUATE"; break; //default default: throw new \LogicException("Unsupported Gateway type: " . $arrayGatewayData["GAT_TYPE"]); break; } //Flows $arrayFlow = \BpmnFlow::findAllBy(array( \BpmnFlowPeer::FLO_TYPE => array("MESSAGE", \Criteria::NOT_EQUAL), \BpmnFlowPeer::FLO_ELEMENT_ORIGIN => $gatewayUid, \BpmnFlowPeer::FLO_ELEMENT_ORIGIN_TYPE => "bpmnGateway" )); //if ($arrayFlow > 0) { // $this->wp->resetTaskRoutes($activityUid); //} foreach ($arrayFlow as $value) { $arrayFlowData = $value->toArray(); $routeDefault = (array_key_exists("FLO_TYPE", $arrayFlowData) && $arrayFlowData["FLO_TYPE"] == "DEFAULT")? 1 : 0; $routeCondition = (array_key_exists("FLO_CONDITION", $arrayFlowData))? $arrayFlowData["FLO_CONDITION"] : ""; switch ($arrayFlowData["FLO_ELEMENT_DEST_TYPE"]) { case "bpmnActivity": //Gateway ----> Activity $result = $this->wp->addRoute($activityUid, $arrayFlowData["FLO_ELEMENT_DEST"], $routeType, $routeCondition, $routeDefault); break; case "bpmnGateway": //Gateway ----> Gateway $taskUid = $this->createTaskByElement( $gatewayUid, "bpmnGateway", "gateway-to-gateway" ); $result = $this->wp->addRoute($activityUid, $taskUid, $routeType, $routeCondition, $routeDefault); $this->mapBpmnGatewayToWorkflowRoutes($taskUid, $arrayFlowData["FLO_ELEMENT_DEST"]); break; case "bpmnEvent": //Gateway ----> Event $event = \BpmnEventPeer::retrieveByPK($arrayFlowData["FLO_ELEMENT_DEST"]); if (!is_null($event)) { switch ($event->getEvnType()) { case "START": throw new \LogicException("Incorrect design" . PHP_EOL . "Given: bpmnGateway -> " . $arrayFlowData["FLO_ELEMENT_DEST_TYPE"]); break; case "END": //$event->getEvnMarker(): EMPTY or MESSAGETHROW switch ($event->getEvnMarker()) { case "MESSAGETHROW": $taskUid = $this->createTaskByElement( $event->getEvnUid(), "bpmnEvent", "end-message-event" ); $result = $this->wp->addRoute($activityUid, $taskUid, $routeType, $routeCondition, $routeDefault); $result = $this->wp->addRoute($taskUid, -1, "SEQUENTIAL"); break; case "EMAIL": $taskUid = $this->createTaskByElement( $event->getEvnUid(), "bpmnEvent", "end-email-event" ); $result = $this->wp->addRoute($activityUid, $taskUid, $routeType, $routeCondition, $routeDefault); $result = $this->wp->addRoute($taskUid, -1, "SEQUENTIAL"); break; default: //EMPTY //and others types $result = $this->wp->addRoute($activityUid, -1, $routeType, $routeCondition, $routeDefault); break; } break; default: //INTERMEDIATE //and others types $this->mapBpmnEventToWorkflowRoutes($activityUid, $arrayFlowData["FLO_ELEMENT_DEST"], $routeType, $routeCondition, $routeDefault); break; } } break; default: //For ProcessMaker is only allowed flows between: "gateway -> activity", "gateway -> gateway", "gateway -> event" //any another flow is considered invalid throw new \LogicException( "For ProcessMaker is only allowed flows between: \"gateway -> activity\", \"gateway -> gateway\", \"gateway -> event\"" . PHP_EOL . "Given: bpmnGateway -> " . $arrayFlowData["FLO_ELEMENT_DEST_TYPE"] ); } } } catch (\Exception $e) { throw $e; } }
public function getGateways($start = null, $limit = null, $filter = '', $changeCaseTo = CASE_UPPER) { if (is_array($start)) { extract($start); } //return Gateway::getAll($this->getUid(), $start, $limit, $filter, $changeCaseTo); $filter = $changeCaseTo != CASE_UPPER ? array_map("strtolower", self::$excludeFields["gateway"]) : self::$excludeFields["gateway"]; return self::filterCollectionArrayKeys( Gateway::getAll($this->getUid(), $start, $limit, $filter, $changeCaseTo), $filter ); }