diff --git a/composer.json b/composer.json index 3a67c882f..3e840153f 100644 --- a/composer.json +++ b/composer.json @@ -2,34 +2,52 @@ "name": "processmaker/processmaker", "description": "BPM PHP Software", "keywords": ["php bpm processmaker"], - "homepage": "http://www.processmaker.com", - "license": "AGPL-3.0", + "homepage": "http://processmaker.com", + "license": "GNU Affero General Public License version 3", "repositories": [ { - "packagist": false + "type": "package", + "package": { + "name": "jquery/jquery", + "version": "1.10.2", + "dist": { + "url": "http://code.jquery.com/jquery-1.10.2.min.js", + "type": "file" + } + } }, { - "type": "composer", - "url": "http://composer-public.colosa.net/" + "type": "package", + "package": { + "name": "underscore/underscore", + "version": "1.5.2", + "dist": { + "url": "http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js", + "type": "file" + } + } }, { - "type": "composer", - "url": "http://composer.colosa.net/" + "type": "vcs", + "url": "git@bitbucket.org:colosa/pmUI.git" + }, + { + "type": "vcs", + "url": "git@bitbucket.org:colosa/MichelangeloFE.git" } ], + "require": { - "php":">=5.3.3", - "underscore/underscore": "1.5.2", - "jquery/jquery": "1.10.2", "luracast/restler" : "v3.0.0", "bshaffer/oauth2-server-php": "v1.0", - "colosa/restclient": "0.1.7", + "jquery/jquery": "1.10.2", + "underscore/underscore": "1.5.2", "colosa/pmUI": "dev-master", "colosa/MichelangeloFE": "dev-master" }, "require-dev":{ "guzzle/guzzle":"~3.1.1", - "behat/behat":"2.4.6@stable" + "behat/behat":"2.4.*@stable" } } diff --git a/workflow/engine/classes/model/BpmnFlow.php b/workflow/engine/classes/model/BpmnFlow.php index f7e95f39c..9e1858dc4 100644 --- a/workflow/engine/classes/model/BpmnFlow.php +++ b/workflow/engine/classes/model/BpmnFlow.php @@ -16,6 +16,21 @@ require_once 'classes/model/om/BaseBpmnFlow.php'; */ class BpmnFlow extends BaseBpmnFlow { + public static function findOneBy($field, $value) + { + $rows = self::findAllBy($field, $value); + + return empty($rows) ? null : $rows[0]; + } + + public static function findAllBy($field, $value) + { + $c = new Criteria('workflow'); + $c->add($field, $value, Criteria::EQUAL); + + return BpmnFlowPeer::doSelect($c); + } + public static function getAll($prjUid = null, $start = null, $limit = null, $filter = '', $changeCaseTo = CASE_UPPER) { //TODO implement $start, $limit and $filter diff --git a/workflow/engine/classes/model/BpmnGateway.php b/workflow/engine/classes/model/BpmnGateway.php index 5844feabb..ef6ea1995 100644 --- a/workflow/engine/classes/model/BpmnGateway.php +++ b/workflow/engine/classes/model/BpmnGateway.php @@ -21,42 +21,107 @@ class BpmnGateway extends BaseBpmnGateway public function __construct($generateUid = true) { $this->bound = new BpmnBound(); + $this->setBoundDefaults(); + } + + public function getBound() + { + return $this->bound; + } + + private function setBoundDefaults() + { $this->bound->setBouElementType(lcfirst(str_replace(__NAMESPACE__, '', __CLASS__))); $this->bound->setBouElement('pm_canvas'); $this->bound->setBouContainer('bpmnDiagram'); + + $this->bound->setPrjUid($this->getPrjUid()); + $this->bound->setElementUid($this->getGatUid()); + + $process = BpmnProcessPeer::retrieveByPK($this->getProUid()); + + if (is_object($process)) { + $this->bound->setDiaUid($process->getDiaUid()); + } + } + + public static function findOneBy($field, $value) + { + $rows = self::findAllBy($field, $value); + + return empty($rows) ? null : $rows[0]; + } + + public static function findAllBy($field, $value) + { + $c = new Criteria('workflow'); + $c->add($field, $value, Criteria::EQUAL); + + return BpmnGatewayPeer::doSelect($c); + } + + public static function getAll($prjUid = null, $start = null, $limit = null, $filter = '', $changeCaseTo = CASE_UPPER) + { + $c = new Criteria('workflow'); + $c->addSelectColumn("BPMN_GATEWAY.*"); + $c->addSelectColumn("BPMN_BOUND.*"); + $c->addJoin(BpmnGatewayPeer::GAT_UID, BpmnBoundPeer::ELEMENT_UID, Criteria::LEFT_JOIN); + + if (! is_null($prjUid)) { + $c->add(BpmnGatewayPeer::PRJ_UID, $prjUid, Criteria::EQUAL); + } + + $rs = BpmnGatewayPeer::doSelectRS($c); + $rs->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + $activities = array(); + + while ($rs->next()) { + $activities[] = $changeCaseTo !== CASE_UPPER ? array_change_key_case($rs->getRow(), CASE_LOWER) : $rs->getRow(); + } + + return $activities; } // OVERRIDES - public function fromArray($data) + public function setActUid($actUid) { - parent::fromArray($data, BasePeer::TYPE_FIELDNAME); + parent::setActUid($actUid); + $this->bound->setElementUid($this->getActUid()); + } - // try resolve the related bound - if (array_key_exists('BOU_UID', $data)) { - $bound = BpmnBoundPeer::retrieveByPK($data['BOU_UID']); + public function setPrjUid($prjUid) + { + parent::setPrjUid($prjUid); + $this->bound->setPrjUid($this->getPrjUid()); + } - if (is_object($bound)) { - $this->bound = $bound; - } - } + public function setProUid($proUid) + { + parent::setProUid($proUid); - $this->bound->fromArray($data, BasePeer::TYPE_FIELDNAME); + $process = BpmnProcessPeer::retrieveByPK($this->getProUid()); + $this->bound->setDiaUid($process->getDiaUid()); } public function save($con = null) { parent::save($con); - if (is_object($this->bound) && get_class($this->bound) == 'BpmnBound') { - $this->bound->save($con); + $this->setBoundDefaults(); + + if ($this->bound->getBouUid() == "") { + $this->bound->setBouUid(\ProcessMaker\Util\Hash::generateUID()); } + + $this->bound->save($con); } public function delete($con = null) { // first, delete the related bound object - if (! is_object($this->bound)) { + if (! is_object($this->bound) || $this->bound->getBouUid() == "") { $this->bound = BpmnBound::findByElement('Gateway', $this->getActUid()); } @@ -67,14 +132,37 @@ class BpmnGateway extends BaseBpmnGateway parent::delete($con); } - public function toArray($keyType = BasePeer::TYPE_PHPNAME) + public function fromArray($data, $type = BasePeer::TYPE_FIELDNAME) { - $data = parent::toArray($keyType); + parent::fromArray($data, $type); - if (is_object($this->bound) && get_class($this->bound) == 'BpmnBound') { - $data = array_merge($data, $this->bound->toArray($keyType)); + $bound = BpmnBound::findByElement('Gateway', $this->getGatUid()); + + if (is_object($bound)) { + $this->bound = $bound; + } else { + $this->bound = new BpmnBound(); + $this->bound->setBouUid(ProcessMaker\Util\Hash::generateUID()); } + $this->bound->fromArray($data, BasePeer::TYPE_FIELDNAME); + } + + public function toArray($type = BasePeer::TYPE_FIELDNAME) + { + $data = parent::toArray($type); + $bouUid = $this->bound->getBouUid(); + + if (empty($bouUid)) { + $bound = BpmnBound::findByElement('Gateway', $this->getGatUid()); + + if (is_object($bound)) { + $this->bound = $bound; + } + } + + $data = array_merge($data, $this->bound->toArray($type)); + return $data; } diff --git a/workflow/engine/classes/model/map/BpmnGatewayMapBuilder.php b/workflow/engine/classes/model/map/BpmnGatewayMapBuilder.php index 2b09fda52..17610e55d 100644 --- a/workflow/engine/classes/model/map/BpmnGatewayMapBuilder.php +++ b/workflow/engine/classes/model/map/BpmnGatewayMapBuilder.php @@ -75,7 +75,7 @@ class BpmnGatewayMapBuilder $tMap->addColumn('GAT_TYPE', 'GatType', 'string', CreoleTypes::VARCHAR, true, 30); - $tMap->addColumn('GAT_DIRECTION', 'GatDirection', 'string', CreoleTypes::VARCHAR, true, 30); + $tMap->addColumn('GAT_DIRECTION', 'GatDirection', 'string', CreoleTypes::VARCHAR, false, 30); $tMap->addColumn('GAT_INSTANTIATE', 'GatInstantiate', 'int', CreoleTypes::TINYINT, false, null); diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 3870eae6a..d53a79de7 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -3367,7 +3367,7 @@ - + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 38ddd068d..96646e1c1 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -1894,7 +1894,7 @@ CREATE TABLE `BPMN_GATEWAY` `PRO_UID` VARCHAR(32) default '', `GAT_NAME` VARCHAR(255), `GAT_TYPE` VARCHAR(30) default '' NOT NULL, - `GAT_DIRECTION` VARCHAR(30) default 'UNSPECIFIED' NOT NULL, + `GAT_DIRECTION` VARCHAR(30) default 'UNSPECIFIED', `GAT_INSTANTIATE` TINYINT default 0, `GAT_EVENT_GATEWAT_TYPE` VARCHAR(20) default 'NONE', `GAT_ACTIVATION_COUNT` INTEGER default 0, diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php index 58a96f851..2747370b8 100644 --- a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php @@ -142,10 +142,15 @@ class BpmnWorkflow extends Project\Bpmn $this->wp->removeTask($actUid); } - public function addFlow($data) + public function addFlow($data, $flows, $gateways, $events) { parent::addFlow($data); + $routeData = self::mapBpmnFlowsToWorkflowRoute($data, $flows, $gateways, $events); + $this->wp->addRoute($routeData["from"], $routeData["to"], $routeData["type"]); + + return; + $fromUid = $data['FLO_ELEMENT_ORIGIN']; if ($data['FLO_TYPE'] != 'SEQUENCE') { @@ -170,13 +175,17 @@ class BpmnWorkflow extends Project\Bpmn 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); + //$gatFlows = BpmnModel::getBpmnCollectionBy('Flow', \BpmnFlowPeer::FLO_ELEMENT_ORIGIN, $gatUid); + $gatFlow = \BpmnFlow::findOneBy(\BpmnFlowPeer::FLO_ELEMENT_ORIGIN, $gatUid)->toArray();; + self::log("=================================>", $gatFlow); - foreach ($gatFlows as $gatFlow) { + //foreach ($gatFlows as $gatFlow) { switch ($gatFlow['FLO_ELEMENT_DEST_TYPE']) { case 'bpmnActivity': // getting gateway properties - $gateway = BpmnModel::getBpmnObjectBy('Gateway', \BpmnGatewayPeer::GAT_UID, $gatUid); + //$gateway = BpmnModel::getBpmnObjectBy('Gateway', \BpmnGatewayPeer::GAT_UID, $gatUid); + $gateway = \BpmnGateway::findOneBy(\BpmnGatewayPeer::GAT_UID, $gatUid)->toArray(); + switch ($gateway['GAT_TYPE']) { case 'SELECTION': @@ -198,14 +207,15 @@ class BpmnWorkflow extends Project\Bpmn throw new \LogicException(sprintf("Unsupported Gateway type: %s", $gateway['GAT_TYPE'])); } - $routes[] = array( + /*$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' - ); + 'ROU_TYPE' => $routeType + );*/ + + $this->wp->addRoute($fromUid, $gatFlow['FLO_ELEMENT_DEST'], $routeType); break; default: // for processmaker is only allowed flows between "gateway -> activity" @@ -215,7 +225,7 @@ class BpmnWorkflow extends Project\Bpmn "Given: bpmnGateway -> " . $gatFlow['FLO_ELEMENT_DEST_TYPE'] )); } - } + //} break; case 'bpmnEvent': $evnUid = $data['FLO_ELEMENT_DEST']; @@ -242,4 +252,122 @@ class BpmnWorkflow extends Project\Bpmn } + + + public static function mapBpmnFlowsToWorkflowRoute($flow, $flows, $gateways, $events) + { + $fromUid = $flow['FLO_ELEMENT_ORIGIN']; + + if ($flow['FLO_TYPE'] != 'SEQUENCE') { + throw new \LogicException(sprintf( + "Unsupported flow type: %s, ProcessMaker only support type '', Given: '%s'", + 'SEQUENCE', $flow['FLO_TYPE'] + )); + } + + switch ($flow['FLO_ELEMENT_DEST_TYPE']) { + case 'bpmnActivity': + // the most easy case, when the flow is connecting a activity with another activity + $result = array("from" => $fromUid, "to" => $flow['FLO_ELEMENT_DEST'], "type" => 'SEQUENTIAL'); + break; + case 'bpmnGateway': + $gatUid = $flow['FLO_ELEMENT_DEST']; + // if it is a gateway it can fork one or more routes + //$gatFlows = BpmnModel::getBpmnCollectionBy('Flow', \BpmnFlowPeer::FLO_ELEMENT_ORIGIN, $gatUid); + $gatFlow = self::findInArray($gatUid, "FLO_ELEMENT_ORIGIN", $flows); + self::log($gatUid, "FLO_ELEMENT_ORIGIN", $flows); + self::log("==============111===================>", $gatFlow); + + //foreach ($gatFlows as $gatFlow) { + switch ($gatFlow['FLO_ELEMENT_DEST_TYPE']) { + case 'bpmnActivity': + // getting gateway properties + //$gateway = BpmnModel::getBpmnObjectBy('Gateway', \BpmnGatewayPeer::GAT_UID, $gatUid); + $gateway = self::findInArray($gatUid, "GAT_UID", $gateways); + self::log("==============222===================>", $gateway); + + 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 + );*/ + + //$this->wp->addRoute($fromUid, $gatFlow['FLO_ELEMENT_DEST'], $routeType); + $result = array("from" => $fromUid, "to" => $gatFlow['FLO_ELEMENT_DEST'], "type" => $routeType); + 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 = $flow['FLO_ELEMENT_DEST']; + //$event = BpmnModel::getBpmnObjectBy('Event', \BpmnEventPeer::EVN_UID, $evnUid); + $event = self::findInArray($evnUid, "EVN_UID", $events); + + 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' + );*/ + $result = array("from" => $fromUid, "to" => "-1", "type" => $routeType); + break; + default: + throw new \LogicException("Invalid connection to Event object type"); + } + + break; + } + + return $result; + + } + + protected static function findInArray($value, $key, $list) + { + foreach ($list as $item) { + if (! array_key_exists($key, $item)) { + throw new \Exception("Error: key: $key does not exist in array: " . print_r($item, true)); + } + if ($item[$key] == $value) { + return $item; + } + } + + return null; + } + } \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Project/Bpmn.php b/workflow/engine/src/ProcessMaker/Project/Bpmn.php index 77d43e776..9fb6f67f8 100644 --- a/workflow/engine/src/ProcessMaker/Project/Bpmn.php +++ b/workflow/engine/src/ProcessMaker/Project/Bpmn.php @@ -210,12 +210,12 @@ class Bpmn extends Handler throw new \Exception(sprintf("Error: There is not an initialized diagram for Project with prj_uid: %s.", $this->getUid())); } + // setting defaults + $data['ACT_UID'] = array_key_exists('ACT_UID', $data) ? $data['ACT_UID'] : Hash::generateUID();; + try { self::log("Add Activity with data: ", $data); - // setting defaults - $data['ACT_UID'] = array_key_exists('ACT_UID', $data) ? $data['ACT_UID'] : Hash::generateUID();; - $activity = new Activity(); $activity->fromArray($data); $activity->setPrjUid($this->getUid()); @@ -327,34 +327,37 @@ class Bpmn extends Handler // setting defaults $data['GAT_UID'] = array_key_exists('GAT_UID', $data) ? $data['GAT_UID'] : Hash::generateUID(); - $gateway = new Gateway(); - $gateway->fromArray($data); - $gateway->setPrjUid($this->project->getPrjUid()); - $gateway->setProUid($this->getProcess("object")->getProUid()); - $gateway->save(); + try { + self::log("Add Gateway with data: ", $data); + $gateway = new Gateway(); + $gateway->fromArray($data); + $gateway->setPrjUid($this->getUid()); + $gateway->setProUid($this->getProcess("object")->getProUid()); + $gateway->save(); - $this->gateways[$gateway->getGatUid()] = $gateway; - } - - public function getGateway($gatUid) - { - if (empty($this->gateways) || ! array_key_exists($gatUid, $this->gateways)) { - $gateway = GatewayPeer::retrieveByPK($gatUid); - - if (! is_object($gateway)) { - return null; - } - - $this->gateways[$gatUid] = $gateway; + self::log("Add Gateway Success!"); + } catch (\Exception $e) { + self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString()); + throw $e; } - return $this->gateways[$gatUid]; + return $gateway->getGatUid(); + } + + public function getGateway($gatUid, $retType = 'array') + { + $gateway = GatewayPeer::retrieveByPK($gatUid); + + if ($retType != "object" && ! empty($gateway)) { + $gateway = $gateway->toArray(); + } + + return $gateway; } public function getGateways($retType = 'array') { - //return Activity::getAll($this->project->getPrjUid(), null, null, '', $retType); - return array(); + return Gateway::getAll($this->getUid(), null, null, '', $retType); } public function addFlow($data) diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project.php b/workflow/engine/src/Services/Api/ProcessMaker/Project.php index c250123fb..08f37180c 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project.php @@ -5,6 +5,7 @@ use Luracast\Restler\RestException; use ProcessMaker\Services\Api; use ProcessMaker\Adapter\Bpmn\Model as BpmnModel; use ProcessMaker\Util\Hash; +use ProcessMaker\Util\Logger; /** * Class Project @@ -110,21 +111,12 @@ class Project extends Api $result = array(); - $diagramElements = array( - 'activities' => 'act_uid', - 'events' => 'evn_uid', - 'flows' => 'flo_uid', - 'artifacts' => 'art_uid', - 'laneset' => 'lns_uid', - 'lanes' => 'lan_uid' - ); - /* * Diagram's Activities Handling */ $whiteList = array(); - foreach ($diagram["activities"] as $activityData) { - $activityData = array_change_key_case($activityData, CASE_UPPER); + foreach ($diagram["activities"] as $i => $activityData) { + $diagram["activities"][$i] = $activityData = array_change_key_case($activityData, CASE_UPPER); // activity exists ? if ($activity = $bwp->getActivity($activityData["ACT_UID"])) { @@ -135,12 +127,13 @@ class Project extends Api } else { // if not exists then create it $oldActUid = $activityData["ACT_UID"]; - $actUid = Hash::generateUID(); - $activityData["ACT_UID"] = $actUid; + $activityData["ACT_UID"] = Hash::generateUID(); + $diagram["activities"][$i]["ACT_UID"] = $activityData["ACT_UID"]; + $bwp->addActivity($activityData); - $result[] = array("object" => "activity", "new_uid" => $actUid, "old_uid" => $oldActUid); - $whiteList[] = $actUid; + $result[] = array("object" => "activity", "new_uid" => $activityData["ACT_UID"], "old_uid" => $oldActUid); + $whiteList[] = $activityData["ACT_UID"]; } } @@ -155,26 +148,75 @@ class Project extends Api } /* - * Diagram's Flows Handling + * Diagram's Gateways Handling */ $whiteList = array(); - foreach ($diagram["flows"] as $flowData) { - $flowData = array_change_key_case($flowData, CASE_UPPER); + foreach ($diagram["gateways"] as $i => $gatewayData) { + $diagram["activities"][$i] = $gatewayData = array_change_key_case($gatewayData, CASE_UPPER); - // activity exists ? - if ($activity = $bwp->getFlow($flowData["FLO_UID"])) { + // gateway exists ? + if ($gateway = $bwp->getGateway($gatewayData["GAT_UID"])) { + // then update activity + $bwp->updateGateway($gatewayData["GAT_UID"], $gatewayData); + + $whiteList[] = $gatewayData["GAT_UID"]; + } else { + // if not exists then create it + $oldActUid = $gatewayData["GAT_UID"]; + $gatewayData["GAT_UID"] = Hash::generateUID(); + $diagram["activities"][$i]["ACT_UID"] = $gatewayData["GAT_UID"]; + + $bwp->addGateway($gatewayData); + + $result[] = array("object" => "gateway", "new_uid" => $gatewayData["GAT_UID"], "old_uid" => $oldActUid); + $whiteList[] = $gatewayData["GAT_UID"]; + } + } + + $activities = $bwp->getActivities(); + + // looking for removed elements + foreach ($activities as $activityData) { + if (! in_array($activityData["ACT_UID"], $whiteList)) { + // If it is not in the white list so, then remove them + $bwp->removeActivity($activityData["ACT_UID"]); + } + } + + + + /* + * Diagram's Flows Handling + */ + + + $whiteList = array(); + foreach ($diagram["flows"] as $i => $flowData) { + //TODO, for test, assuming that all flows are new + $diagram["flows"][$i] = $flowData = array_change_key_case($flowData, CASE_UPPER); + $oldFloUid = $diagram["flows"][$i]["FLO_UID"]; + $diagram["flows"][$i]["FLO_UID"] = Hash::generateUID(); + Logger::log($flowData["FLO_ELEMENT_ORIGIN"], $result); + $diagram["flows"][$i]["FLO_ELEMENT_ORIGIN"] = self::mapUid($flowData["FLO_ELEMENT_ORIGIN"], $result); + $diagram["flows"][$i]["FLO_ELEMENT_DEST"] = self::mapUid($flowData["FLO_ELEMENT_DEST"], $result); + + $whiteList[] = $diagram["flows"][$i]["FLO_UID"]; + $result[] = array("object" => "flow", "new_uid" => $diagram["flows"][$i]["FLO_UID"], "old_uid" => $oldFloUid); + } + foreach ($diagram["flows"] as $flowData) { + + // flow exists ? + if ($flow = $bwp->getFlow($flowData["FLO_UID"])) { // then update activity //$bwp->updateFlow($activityData["FLO_UID"], $flowData); //$whiteList[] = $activityData["FLO_UID"]; } else { // if not exists then create it - $oldFloUid = $flowData["FLO_UID"]; - $flowData["FLO_UID"] = Hash::generateUID(); - $bwp->addFlow($flowData); - $result[] = array("object" => "flow", "new_uid" => $flowData["FLO_UID"], "old_uid" => $oldFloUid); - $whiteList[] = $flowData["FLO_UID"]; + + //$bwp->addFlow($flowData); + $bwp->addFlow($flowData, $diagram["flows"], $diagram["gateways"], $diagram["events"]); } } @@ -291,5 +333,16 @@ class Project extends Api throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } + + protected static function mapUid($oldUid, $list) + { + foreach ($list as $item) { + if ($item["old_uid"] == $oldUid) { + return $item["new_uid"]; + } + } + + return null; + } }