diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php index fb8dba522..6c08d3c7d 100644 --- a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php @@ -4,7 +4,10 @@ namespace ProcessMaker\Project\Adapter; use ProcessMaker\Project; use ProcessMaker\Util\Hash; - +/** + * Class BpmnWorkflow + * @package ProcessMaker\Project\Adapter + */ class BpmnWorkflow extends Project\Bpmn { /** diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowBpmn.php b/workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowBpmn.php index 9e6ecf111..7b2812283 100644 --- a/workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowBpmn.php +++ b/workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowBpmn.php @@ -35,8 +35,12 @@ class WorkflowBpmn extends Project\Workflow $bpData["PRJ_AUTHOR"] = $data["USR_UID"]; } - $wp = new Project\Bpmn(); - $wp->create($bpData); + $bp = new Project\Bpmn(); + $bp->create($bpData); + + // At this time we will add a default diagram and process + $bp->addDiagram(); + $bp->addProcess(); } catch (\Exception $e) { $prjUid = $this->getUid(); diff --git a/workflow/engine/src/ProcessMaker/Project/Bpmn.php b/workflow/engine/src/ProcessMaker/Project/Bpmn.php index ed226951e..3bf5e7653 100644 --- a/workflow/engine/src/ProcessMaker/Project/Bpmn.php +++ b/workflow/engine/src/ProcessMaker/Project/Bpmn.php @@ -170,7 +170,7 @@ class Bpmn extends Handler } } - return $retType == "array" ? $this->diagram->toArray() : $this->diagram; + return ($retType == "array" && is_object($this->diagram)) ? $this->diagram->toArray() : $this->diagram; } public function addProcess($data = array()) @@ -233,9 +233,13 @@ class Bpmn extends Handler return $activity; } - public function getActivities() + public function getActivities($start = null, $limit = null, $filter = '', $changeCaseTo = CASE_UPPER) { - return Activity::getAll($this->getUid()); + if (is_array($start)) { + extract($start); + } + + return Activity::getAll($this->getUid(), $start, $limit, $filter, $changeCaseTo); } public function updateActivity($actUid, $data) @@ -285,9 +289,10 @@ class Bpmn extends Handler return $this->events[$evnUid]; } - public function getEvents($retType) + public function getEvents($retType = "array") { - return Event::getAll($this->project->getPrjUid(), null, null, '', 'object'); + //return Event::getAll($this->project->getPrjUid(), null, null, '', 'object'); + return array(); } public function addGateway($data) @@ -321,7 +326,8 @@ class Bpmn extends Handler public function getGateways($retType = 'array') { - return Activity::getAll($this->project->getPrjUid(), null, null, '', $retType); + //return Activity::getAll($this->project->getPrjUid(), null, null, '', $retType); + return array(); } public function addFlow($data) @@ -354,7 +360,8 @@ class Bpmn extends Handler public function getFlows($retType = 'array') { - return Activity::getAll($this->project->getPrjUid(), null, null, '', $retType); + //return Activity::getAll($this->project->getPrjUid(), null, null, '', $retType); + return array(); } public function addArtifact($data) @@ -370,6 +377,7 @@ class Bpmn extends Handler public function getArtifacts() { // TODO: Implement update() method. + return array(); } public function addLane($data) @@ -385,6 +393,7 @@ class Bpmn extends Handler public function getLanes() { // TODO: Implement update() method. + return array(); } public function addLaneset($data) @@ -400,5 +409,107 @@ class Bpmn extends Handler public function getLanesets() { // TODO: Implement update() method. + return array(); + } + + /* + * Others functions/methods + */ + + public static function getDiffFromProjects($updatedProject) + { + // preparing target project + $diagramElements = array( + 'act_uid' => 'activities', + 'evn_uid' => 'events', + 'flo_uid' => 'flows', + 'art_uid' => 'artifacts', + 'lns_uid' => 'laneset', + 'lan_uid' => 'lanes' + ); + + // Getting Differences + $newRecords = array(); + $newRecordsUids = array(); + $deletedRecords = array(); + $updatedRecords = array(); + + // Get new records + foreach ($diagramElements as $key => $element) { + if (! array_key_exists($element, $updatedProject['diagrams'][0])) { + continue; + } + + /*print_r($savedProject['diagrams'][0][$element]); + print_r($updatedProject['diagrams'][0][$element]); + var_dump($key);*/ + + $arrayDiff = self::arrayDiff( + $savedProject['diagrams'][0][$element], + $updatedProject['diagrams'][0][$element], + $key + ); + + if (! empty($arrayDiff)) { + $newRecordsUids[$element] = $arrayDiff; + + foreach ($updatedProject['diagrams'][0][$element] as $item) { + if (in_array($item[$key], $newRecordsUids[$element])) { + $newRecords[$element][] = $item; + } + } + } + } + + // Get deleted records + foreach ($diagramElements as $key => $element) { + if (! array_key_exists($element, $updatedProject['diagrams'][0])) { + continue; + } + + $arrayDiff = self::arrayDiff( + $updatedProject['diagrams'][0][$element], + $savedProject['diagrams'][0][$element], + $key + ); + + if (! empty($arrayDiff)) { + $deletedRecords[$element] = $arrayDiff; + } + } + + // Get updated records + $checksum = array(); + foreach ($diagramElements as $key => $element) { + $checksum[$element] = self::getArrayChecksum($savedProject['diagrams'][0][$element], $key); + } + + + foreach ($diagramElements as $key => $element) { + if (! array_key_exists($element, $updatedProject['diagrams'][0])) { + continue; + } + + foreach ($updatedProject['diagrams'][0][$element] as $item) { + if ((array_key_exists($element, $newRecordsUids) && in_array($item[$key], $newRecordsUids[$element])) || + (array_key_exists($element, $deletedRecords) && in_array($item[$key], $deletedRecords[$element])) + ) { + // skip new or deleted records + continue; + } + + if (self::getChecksum($item) !== $checksum[$element][$item[$key]]) { + $updatedRecords[$element][] = $item; + } + } + } + + $diff = array( + 'new' => $newRecords, + 'deleted' => $deletedRecords, + 'updated' => $updatedRecords + ); + + return $diff; } } \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Project/Handler.php b/workflow/engine/src/ProcessMaker/Project/Handler.php index 3d402aff4..a8eddaff4 100644 --- a/workflow/engine/src/ProcessMaker/Project/Handler.php +++ b/workflow/engine/src/ProcessMaker/Project/Handler.php @@ -15,6 +15,26 @@ abstract class Handler //public abstract function update(); public abstract function remove(); + protected static function diffArrayByKey($key, $list, $targetList) + { + $uid = array(); + $diff = array(); + + foreach ($list as $item) { + if (array_key_exists($key, $item)) { + $uid[] = $item[$key]; + } + } + + foreach ($targetList as $item) { + if (! in_array($item[$key], $uid)) { + $diff[] = $item[$key]; + } + } + + return $diff; + } + /** * Log in ProcessMaker Standard Output if debug mode is enabled. * diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project.php b/workflow/engine/src/Services/Api/ProcessMaker/Project.php index 5a2a9810e..345651e49 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project.php @@ -34,9 +34,24 @@ class Project extends Api public function get($prjUid) { try { - $projects = new \StdClass(); //TODO + $bwp = \ProcessMaker\Project\Adapter\BpmnWorkflow::load($prjUid); - return $projects; + $project = array_change_key_case($bwp->getProject(), CASE_LOWER); + $diagram = $bwp->getDiagram(); + + if (! is_null($diagram)) { + $diagram = array_change_key_case($diagram, CASE_LOWER); + $diagram["activities"] = $bwp->getActivities(array("changeCaseTo" => CASE_LOWER)); + $diagram["events"] = $bwp->getEvents(); + $diagram["flows"] = $bwp->getFlows(); + $diagram["artifacts"] = $bwp->getArtifacts(); + $diagram["laneset"] = $bwp->getLanesets(); + $diagram["lanes"] = $bwp->getLanes(); + + $project["diagrams"][] = $diagram; + } + + return $project; } catch (\Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } @@ -48,27 +63,28 @@ class Project extends Api public function post($request_data) { try { - $config = array(); - $config['project'] = array('replace_uids' => true); +// NEED REFACTOR +// $config = array(); +// $config['project'] = array('replace_uids' => true); +// +// $bpmnModel = new BpmnModel(); +// $result = $bpmnModel->createProject($request_data, $config['project']['replace_uids']); +// +// if (array_key_exists('prj_uid', $result)) { +// $prjUid = $result['prj_uid']; +// } else { +// $prjUid = $result[0]['new_uid']; +// } +// +// $wfProcess = Workflow::loadFromBpmnProject($prjUid); +// +// $process = new \BusinessModel\Process(); +// $userUid = $this->getUserId(); +// $data = array('process' => $wfProcess); +// +// $process->createProcess($userUid, $data); - $bpmnModel = new BpmnModel(); - $result = $bpmnModel->createProject($request_data, $config['project']['replace_uids']); - - if (array_key_exists('prj_uid', $result)) { - $prjUid = $result['prj_uid']; - } else { - $prjUid = $result[0]['new_uid']; - } - - $wfProcess = Workflow::loadFromBpmnProject($prjUid); - - $process = new \BusinessModel\Process(); - $userUid = $this->getUserId(); - $data = array('process' => $wfProcess); - - $process->createProcess($userUid, $data); - - return $result; +// return $result; } catch (\Exception $e) { // TODO in case that $process->createProcess($userUid, $data); fails maybe the BPMN project was created successfully // so, we need remove it or change the creation order. @@ -81,7 +97,8 @@ class Project extends Api { try { - $result = BpmnModel::updateProject($prjUid, $request_data); + //$result = BpmnModel::updateProject($prjUid, $request_data); + return $result; } catch (\Exception $e) { diff --git a/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php index db8489c9a..89073a990 100644 --- a/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php +++ b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php @@ -69,5 +69,21 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase $this->assertEquals($project["PRJ_NAME"], $process["PRO_TITLE"]); $this->assertEquals($project["PRJ_DESCRIPTION"], $process["PRO_DESCRIPTION"]); $this->assertEquals($project["PRJ_AUTHOR"], $process["PRO_CREATE_USER"]); + + $bwap->addDiagram(); + $bwap->addProcess(); + + // Save to DB + $bwap->addActivity(array( + "ACT_NAME" => "Activity #1", + "BOU_X" => "50", + "BOU_Y" => "50" + )); + + $bwap->addActivity(array( + "ACT_NAME" => "Activity #2", + "BOU_X" => "250", + "BOU_Y" => "250" + )); } } \ No newline at end of file