adding flow -> task creation via BpmnWorkflow adapter

This commit is contained in:
Erik Amaru Ortiz
2014-02-06 21:26:06 -04:00
parent e869df7ad5
commit ca7fa0651d
5 changed files with 160 additions and 47 deletions

View File

@@ -33,7 +33,7 @@ class BpmnFlow extends BaseBpmnFlow
while ($rs->next()) { while ($rs->next()) {
$flow = $rs->getRow(); $flow = $rs->getRow();
$flow["FLO_STATE"] = @json_decode($flow["FLO_STATE"]); $flow["FLO_STATE"] = @json_decode($flow["FLO_STATE"]);
$flow["FLO_IS_INMEDIATE"] = $flow["FLO_IS_INMEDIATE"] == 1 ? true : false; //$flow["FLO_IS_INMEDIATE"] = $flow["FLO_IS_INMEDIATE"] == 1 ? true : false;
$flow = $changeCaseTo !== CASE_UPPER ? array_change_key_case($flow, CASE_LOWER) : $flow; $flow = $changeCaseTo !== CASE_UPPER ? array_change_key_case($flow, CASE_LOWER) : $flow;
$flows[] = $flow; $flows[] = $flow;

View File

@@ -392,8 +392,8 @@ class Model
$lanes = self::getBpmnCollectionBy('Lane', LanePeer::PRJ_UID, $prjUid, true); $lanes = self::getBpmnCollectionBy('Lane', LanePeer::PRJ_UID, $prjUid, true);
//$activities = self::getBpmnCollectionBy('Activity', ActivityPeer::PRJ_UID, $prjUid, true); //$activities = self::getBpmnCollectionBy('Activity', ActivityPeer::PRJ_UID, $prjUid, true);
//$activities = Activity::getAll($prjUid, null, null, null, 'object', CASE_LOWER); $activities = Activity::getAll($prjUid, null, null, null, 'object', CASE_LOWER);
$activities = Activity::getAll(array('prjUid' => $prjUid, 'changeCaseTo' => CASE_LOWER)); //$activities = Activity::getAll(array('prjUid' => $prjUid, 'changeCaseTo' => CASE_LOWER));
//print_r($activities); die; //print_r($activities); die;
$events = self::getBpmnCollectionBy('Event', EventPeer::PRJ_UID, $prjUid, true); $events = self::getBpmnCollectionBy('Event', EventPeer::PRJ_UID, $prjUid, true);

View File

@@ -141,4 +141,105 @@ class BpmnWorkflow extends Project\Bpmn
parent::removeActivity($actUid); parent::removeActivity($actUid);
$this->wp->removeTask($actUid); $this->wp->removeTask($actUid);
} }
public function addFlow($data)
{
parent::addFlow($data);
$fromUid = $data['FLO_ELEMENT_ORIGIN'];
if ($data['FLO_TYPE'] != 'SEQUENCE') {
throw new \LogicException(sprintf(
"Unsupported flow type: %s, ProcessMaker only support type '', Given: '%s'",
'SEQUENCE', $data['FLO_TYPE']
));
}
switch ($data['FLO_ELEMENT_DEST_TYPE']) {
case 'bpmnActivity':
// the most easy case, when the flow is connecting a activity with another activity
/*$data = array(
'ROU_UID' => $data['FLO_UID'], //Hash::generateUID(),
'PRO_UID' => $this->getUid(),
'TAS_UID' => $fromUid,
'ROU_NEXT_TASK' => $data['FLO_ELEMENT_DEST'],
'ROU_TYPE' => 'SEQUENTIAL'
);*/
$this->wp->addRoute($fromUid, $data['FLO_ELEMENT_DEST'], 'SEQUENTIAL');
break;
case 'bpmnGateway':
$gatUid = $data['FLO_ELEMENT_DEST'];
// if it is a gateway it can fork one or more routes
$gatFlows = BpmnModel::getBpmnCollectionBy('Flow', \BpmnFlowPeer::FLO_ELEMENT_ORIGIN, $gatUid);
foreach ($gatFlows as $gatFlow) {
switch ($gatFlow['FLO_ELEMENT_DEST_TYPE']) {
case 'bpmnActivity':
// getting gateway properties
$gateway = BpmnModel::getBpmnObjectBy('Gateway', \BpmnGatewayPeer::GAT_UID, $gatUid);
switch ($gateway['GAT_TYPE']) {
case 'SELECTION':
$routeType = 'SELECT';
break;
case 'EVALUATION':
$routeType = 'EVALUATE';
break;
case 'PARALLEL':
$routeType = 'PARALLEL';
break;
case 'PARALLEL_EVALUATION':
$routeType = 'PARALLEL-BY-EVALUATION';
break;
case 'PARALLEL_JOIN':
$routeType = 'SEC-JOIN';
break;
default:
throw new \LogicException(sprintf("Unsupported Gateway type: %s", $gateway['GAT_TYPE']));
}
$routes[] = array(
'ROU_UID' => $gatFlow['FLO_UID'], //Hash::generateUID(),
'PRO_UID' => $this->getUid(),
'TAS_UID' => $fromUid,
'ROU_NEXT_TASK' => $gatFlow['FLO_ELEMENT_DEST'],
'ROU_TYPE' => $routeType,
'_action' => 'CREATE'
);
break;
default:
// for processmaker is only allowed flows between "gateway -> activity"
// any another flow is considered invalid
throw new \LogicException(sprintf(
"For ProcessMaker is only allowed flows between \"gateway -> activity\" " . PHP_EOL .
"Given: bpmnGateway -> " . $gatFlow['FLO_ELEMENT_DEST_TYPE']
));
}
}
break;
case 'bpmnEvent':
$evnUid = $data['FLO_ELEMENT_DEST'];
$event = BpmnModel::getBpmnObjectBy('Event', \BpmnEventPeer::EVN_UID, $evnUid);
switch ($event['EVN_TYPE']) {
case 'END':
$routeType = 'SEQUENTIAL';
$routes[] = array(
'ROU_UID' => $data['FLO_UID'], //Hash::generateUID(),
'PRO_UID' => $this->getUid(),
'TAS_UID' => $fromUid,
'ROU_NEXT_TASK' => '-1',
'ROU_TYPE' => $routeType,
'_action' => 'CREATE'
);
break;
default:
throw new \LogicException("Invalid connection to Event object type");
}
break;
}
}
} }

View File

@@ -225,7 +225,8 @@ class Workflow extends Handler
public function addRoute($fromTasUid, $toTasUid, $type, $delete = null) public function addRoute($fromTasUid, $toTasUid, $type, $delete = null)
{ {
try {
self::log("Add Route from task: $fromTasUid -> to task: $toTasUid ($type)");
/*switch ($type) { /*switch ($type) {
case 0: case 0:
$sType = 'SEQUENTIAL'; $sType = 'SEQUENTIAL';
@@ -274,7 +275,13 @@ class Workflow extends Handler
$oTasks->deleteAllRoutesOfTask($this->proUid, $fromTasUid); $oTasks->deleteAllRoutesOfTask($this->proUid, $fromTasUid);
//$oTasks->deleteAllGatewayOfTask($this->proUid, $fromTasUid); //$oTasks->deleteAllGatewayOfTask($this->proUid, $fromTasUid);
} }
return $this->saveNewPattern($this->proUid, $fromTasUid, $toTasUid, $type, $delete); return $this->saveNewPattern($this->proUid, $fromTasUid, $toTasUid, $type, $delete);
} catch (\Exception $e) {
self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString());
throw $e;
}
} }
public function updateRoute($rouUid, $routeData) public function updateRoute($rouUid, $routeData)

View File

@@ -35,15 +35,20 @@ class Project extends Api
public function get($prjUid) public function get($prjUid)
{ {
try { try {
//return \ProcessMaker\Adapter\Bpmn\Model::loadProject($prjUid);
$bwp = \ProcessMaker\Project\Adapter\BpmnWorkflow::load($prjUid); $bwp = \ProcessMaker\Project\Adapter\BpmnWorkflow::load($prjUid);
$project = array_change_key_case($bwp->getProject(), CASE_LOWER); $project = array_change_key_case($bwp->getProject(), CASE_LOWER);
$diagram = $bwp->getDiagram(); $diagram = $bwp->getDiagram();
$process = $bwp->getProcess();
$diagram["pro_uid"] = $process["PRO_UID"];
if (! is_null($diagram)) { if (! is_null($diagram)) {
$diagram = array_change_key_case($diagram, CASE_LOWER); $diagram = array_change_key_case($diagram, CASE_LOWER);
$diagram["activities"] = $bwp->getActivities(array("changeCaseTo" => CASE_LOWER)); $diagram["activities"] = $bwp->getActivities(array("changeCaseTo" => CASE_LOWER));
$diagram["events"] = $bwp->getEvents(); $diagram["events"] = $bwp->getEvents();
$diagram["gateways"] = $bwp->getGateways();
$diagram["flows"] = $bwp->getFlows(); $diagram["flows"] = $bwp->getFlows();
$diagram["artifacts"] = $bwp->getArtifacts(); $diagram["artifacts"] = $bwp->getArtifacts();
$diagram["laneset"] = $bwp->getLanesets(); $diagram["laneset"] = $bwp->getLanesets();