diff --git a/workflow/engine/classes/class.processMap.php b/workflow/engine/classes/class.processMap.php index c3b679284..c5bb9dd50 100755 --- a/workflow/engine/classes/class.processMap.php +++ b/workflow/engine/classes/class.processMap.php @@ -1409,6 +1409,7 @@ class processMap } $oTask = new Task(); + $oNewTask = new StdClass(); $oNewTask->label = G::LoadTranslation('ID_TASK') . ' ' . $iTaskNumber; $oNewTask->uid = $oTask->create(array('PRO_UID' => $sProcessUID, 'TAS_TITLE' => $oNewTask->label, 'TAS_POSX' => $iX, 'TAS_POSY' => $iY, 'TAS_WIDTH' => $iWidth, 'TAS_HEIGHT' => $iHeight )); $oNewTask->statusIcons = array(); diff --git a/workflow/engine/classes/model/BpmnActivity.php b/workflow/engine/classes/model/BpmnActivity.php index 0787d165c..3e8af7ee2 100644 --- a/workflow/engine/classes/model/BpmnActivity.php +++ b/workflow/engine/classes/model/BpmnActivity.php @@ -166,4 +166,12 @@ class BpmnActivity extends BaseBpmnActivity return $data; } + public static function exists($actUid) + { + $c = new Criteria("workflow"); + $c->add(BpmnActivityPeer::ACT_UID, $actUid); + + return BpmnActivityPeer::doCount($c) > 0 ? true : false; + } + } // BpmnActivity diff --git a/workflow/engine/classes/model/BpmnFlow.php b/workflow/engine/classes/model/BpmnFlow.php index 40f2cb69e..b6e1ca984 100644 --- a/workflow/engine/classes/model/BpmnFlow.php +++ b/workflow/engine/classes/model/BpmnFlow.php @@ -52,7 +52,7 @@ class BpmnFlow extends BaseBpmnFlow while ($rs->next()) { $flow = $rs->getRow(); - $flow["FLO_STATE"] = @json_decode($flow["FLO_STATE"]); + $flow["FLO_STATE"] = @json_decode($flow["FLO_STATE"], true); //$flow["FLO_IS_INMEDIATE"] = $flow["FLO_IS_INMEDIATE"] == 1 ? true : false; $flow = $changeCaseTo !== CASE_UPPER ? array_change_key_case($flow, CASE_LOWER) : $flow; @@ -77,7 +77,10 @@ class BpmnFlow extends BaseBpmnFlow public function toArray($type = BasePeer::TYPE_FIELDNAME) { - return parent::toArray($type); + $flow = parent::toArray($type); + $flow["FLO_STATE"] = @json_decode($flow["FLO_STATE"], true); + + return $flow; } } // BpmnFlow diff --git a/workflow/engine/src/ProcessMaker/Adapter/Bpmn/Model.php b/workflow/engine/src/ProcessMaker/Adapter/Bpmn/Model.php index 76ddda987..e951e6ffe 100644 --- a/workflow/engine/src/ProcessMaker/Adapter/Bpmn/Model.php +++ b/workflow/engine/src/ProcessMaker/Adapter/Bpmn/Model.php @@ -907,7 +907,7 @@ class Model private static function getChecksum($data) { if (! is_string($data)) { - $data = var_export($data, true); + $data = ksort(var_export($data, true)); } return sha1($data); diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php index 9b71fb75e..4a3640308 100644 --- a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php @@ -116,6 +116,13 @@ class BpmnWorkflow extends Project\Bpmn public function updateActivity($actUid, $data) { + unset($data["BOU_ELEMENT_ID"]); + + if (! self::isModified("activity", $actUid, $data)) { + self::log("Update Activity: $actUid (No Changes)"); + return false; + } + parent::updateActivity($actUid, $data); $taskData = array(); @@ -175,6 +182,16 @@ class BpmnWorkflow extends Project\Bpmn } } + public function updateFlow($floUid, $data) + { + if (! self::isModified("flow", $floUid, $data)) { + self::log("Update Flow: $floUid (No Changes)"); + return false; + } + + parent::updateFlow($floUid, $data); + } + public function removeFlow($floUid) { $flow = \BpmnFlowPeer::retrieveByPK($floUid); @@ -364,8 +381,4 @@ class BpmnWorkflow extends Project\Bpmn $this->wp->remove(); } - public function hello($s) - { - echo "--->".$s; - } } \ 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 c41e1a03e..0b8325052 100644 --- a/workflow/engine/src/ProcessMaker/Project/Bpmn.php +++ b/workflow/engine/src/ProcessMaker/Project/Bpmn.php @@ -55,6 +55,14 @@ class Bpmn extends Handler */ protected $diagram; + protected static $excludeFields = array( + "activity" => array( + "PRJ_UID", "PRO_UID", "BOU_ELEMENT", "BOU_ELEMENT_TYPE", "BOU_REL_POSITION", + "BOU_SIZE_IDENTICAL", "DIA_UID", "BOU_UID", "ELEMENT_UID" + ), + "flow" => array("PRJ_UID", "DIA_UID", "FLO_ELEMENT_DEST_PORT", "FLO_ELEMENT_ORIGIN_PORT") + ); + public function __construct($data = null) { @@ -267,6 +275,7 @@ class Bpmn extends Handler if ($retType != "object" && ! empty($activity)) { $activity = $activity->toArray(); + $activity = self::filterArrayKeys($activity, self::$excludeFields["activity"]); } return $activity; @@ -278,20 +287,20 @@ class Bpmn extends Handler extract($start); } - return Activity::getAll($this->getUid(), $start, $limit, $filter, $changeCaseTo); + $filter = $changeCaseTo != CASE_UPPER ? array_map("strtolower", self::$excludeFields["activity"]) : self::$excludeFields["activity"]; + + return self::filterCollectionArrayKeys( + Activity::getAll($this->getUid(), $start, $limit, $filter, $changeCaseTo), + $filter + ); } public function updateActivity($actUid, $data) { try { - self::log("Update Activity: $actUid", "With data: ", $data); + self::log("Update Activity: $actUid, with data: ", $data); $activity = ActivityPeer::retrieveByPk($actUid); - - // fixing data - //$data['ELEMENT_UID'] = $data['BOU_ELEMENT_UID']; - //unset($data['BOU_ELEMENT_UID']); - $activity->fromArray($data); $activity->save(); @@ -317,6 +326,11 @@ class Bpmn extends Handler } } + public function activityExists($actUid) + { + return \BpmnActivity::exists($actUid); + } + public function addEvent($data) { // setting defaults @@ -511,8 +525,9 @@ class Bpmn extends Handler { $flow = FlowPeer::retrieveByPK($floUid); - if ($retType != "object" && ! empty($activity)) { + if ($retType != "object" && ! empty($flow)) { $flow = $flow->toArray(); + $flow = self::filterArrayKeys($flow, self::$excludeFields["flow"]); } return $flow; @@ -524,7 +539,12 @@ class Bpmn extends Handler extract($start); } - return Flow::getAll($this->getUid(), null, null, '', $changeCaseTo); + $filter = $changeCaseTo != CASE_UPPER ? array_map("strtolower", self::$excludeFields["flow"]) : self::$excludeFields["flow"]; + + return self::filterCollectionArrayKeys( + Flow::getAll($this->getUid(), $start, $limit, $filter, $changeCaseTo), + $filter + ); } public function removeFlow($floUid) @@ -542,6 +562,11 @@ class Bpmn extends Handler } } + public function flowExists($floUid) + { + return \BpmnFlow::exists($floUid); + } + public function addArtifact($data) { // TODO: Implement update() method. @@ -590,104 +615,18 @@ class Bpmn extends Handler return array(); } - /* - * Others functions/methods - */ - public static function getDiffFromProjects($updatedProject) + public function isModified($element, $uid, $newData) { - // preparing target project - $diagramElements = array( - 'act_uid' => 'activities', - 'evn_uid' => 'events', - 'flo_uid' => 'flows', - 'art_uid' => 'artifacts', - 'lns_uid' => 'laneset', - 'lan_uid' => 'lanes' - ); + $data = array(); - // 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; - } - } - } + switch ($element) { + case "activity": $data = $this->getActivity($uid); break; + case "gateway": $data = $this->getGateway($uid); break; + case "event": $data = $this->getEvent($uid); break; + case "flow": $data = $this->getFlow($uid); break; } - // 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; + return (self::getChecksum($data) !== self::getChecksum($newData)); } } \ 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 6ba1cf34c..9bf25f7e5 100644 --- a/workflow/engine/src/ProcessMaker/Project/Handler.php +++ b/workflow/engine/src/ProcessMaker/Project/Handler.php @@ -41,6 +41,55 @@ abstract class Handler return $diff; } + protected static function getArrayChecksum($list, $key = null) + { + $checksum = array(); + + foreach ($list as $k => $item) { + if (empty($key)) { + $checksum[$k] = self::getChecksum($item); + } else { + $checksum[$item[$key]] = self::getChecksum($item); + } + } + + return $checksum; + } + + protected static function getChecksum($data) + { + if (! is_string($data)) { + ksort($data); + $data = print_r($data, true); + } + + return sha1($data); + } + + public static function filterCollectionArrayKeys($data, $filter = array()) + { + $result = array(); + + foreach ($data as $row) { + $result[] = self::filterArrayKeys($row, $filter); + } + + return $result; + } + + public static function filterArrayKeys($data, $filter = array()) + { + $result = array(); + + foreach ($data as $key => $value) { + if (! in_array($key, $filter)) { + $result[$key] = $value; + } + } + + return $result; + } + /** * Log in ProcessMaker Standard Output if debug mode is enabled. * @@ -52,15 +101,25 @@ abstract class Handler * self::log("Method: ", __METHOD__, 'Returns: ', $result); * */ + public static function logstr($str) + { + if (\System::isDebugMode()) { + Logger::getInstance()->setLog($str); + } + } + + public static function logInline() + { + if (\System::isDebugMode()) { + call_user_func_array(array(Logger::getInstance(), 'setLogInline'), func_get_args()); + } + } + public static function log() { if (\System::isDebugMode()) { - - $me = Logger::getInstance(); - $args = func_get_args(); - //array_unshift($args, 'Class '.__CLASS__.' '); - - call_user_func_array(array($me, 'setLog'), $args); + $logger = Logger::getInstance(); + call_user_func_array(array($logger, 'setLogLine'), func_get_args()); } } } \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Project/Workflow.php b/workflow/engine/src/ProcessMaker/Project/Workflow.php index 2cf39990f..3dfd0e6f0 100644 --- a/workflow/engine/src/ProcessMaker/Project/Workflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Workflow.php @@ -61,7 +61,7 @@ class Workflow extends Handler $data['PRO_CATEGORY'] = array_key_exists('PRO_CATEGORY', $data) ? $data['PRO_CATEGORY'] : ""; try { - self::log("===> Executing -> ".__METHOD__, "Create Process with data:", $data); + self::log("Create Process with data:", $data); //validate if process with specified name already exists if (Process::existsByProTitle($data["PRO_TITLE"])) { @@ -102,7 +102,7 @@ class Workflow extends Handler public function remove() { try { - self::log("===> Executing -> ".__METHOD__, "Remove Process with uid: {$this->proUid}"); + self::log("Remove Process with uid: {$this->proUid}"); $this->deleteProcess($this->proUid); self::log("Remove Process Success!"); } catch (\Exception $e) { @@ -163,7 +163,7 @@ class Workflow extends Handler $taskData['PRO_UID'] = $this->proUid; try { - self::log("===> Executing -> ".__METHOD__, "Add Task with data: ", $taskData); + self::log("Add Task with data: ", $taskData); $task = new Task(); $tasUid = $task->create($taskData, false); self::log("Add Task Success!"); @@ -178,7 +178,7 @@ class Workflow extends Handler public function updateTask($tasUid, $taskData) { try { - self::log("===> Executing -> ".__METHOD__, "Update Task: $tasUid", "With data: ", $taskData); + self::log("Update Task: $tasUid", "With data: ", $taskData); $task = new Task(); $taskData['TAS_UID'] = $tasUid; $result = $task->update($taskData); @@ -194,7 +194,7 @@ class Workflow extends Handler public function removeTask($tasUid) { try { - self::log("===> Executing -> ".__METHOD__, "Remove Task: $tasUid"); + self::log("Remove Task: $tasUid"); $task = new Task(); $task->remove($tasUid); self::log("Remove Task Success!"); @@ -300,7 +300,7 @@ class Workflow extends Handler $routeData['ROU_UID'] = $rouUid; try { - self::log("===> Executing -> ".__METHOD__, "Update Route: $rouUid with data:", $routeData); + self::log("Update Route: $rouUid with data:", $routeData); $route = new Route(); $route->update($routeData); self::log("Update Route Success!"); @@ -313,7 +313,7 @@ class Workflow extends Handler public function removeRoute($rouUid) { try { - self::log("===> Executing -> ".__METHOD__, "Remove Route: $rouUid"); + self::log("Remove Route: $rouUid"); $route = new Route(); $result = $route->remove($rouUid); self::log("Remove Route Success!"); diff --git a/workflow/engine/src/ProcessMaker/Util/Logger.php b/workflow/engine/src/ProcessMaker/Util/Logger.php index ffae6b795..6818599fb 100644 --- a/workflow/engine/src/ProcessMaker/Util/Logger.php +++ b/workflow/engine/src/ProcessMaker/Util/Logger.php @@ -17,9 +17,10 @@ class Logger protected function __construct() { $this->logFile = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'processmaker.log'; - if (! file_exists($this->logFile)) { - file_put_contents($this->logFile, ""); + if (! touch($this->logFile)) { + error_log("ProcessMaker Log file can't be created!"); + } chmod($this->logFile, 0777); } @@ -35,19 +36,30 @@ class Logger return self::$instance; } - public function setLog() + public function setLogLine() { $args = func_get_args(); - foreach ($args as $arg) { - if (! is_string($arg)) { - $arg = print_r($arg, true); - } + $this->setLog(date('Y-m-d H:i:s') . " "); - fwrite($this->fp, "- " . date('Y-m-d H:i:s') . " " . $arg . PHP_EOL); + foreach ($args as $str) { + $this->setLog((is_string($str) ? $str : print_r($str, true)) . PHP_EOL); } - //if (count($args) > 1) - // fwrite($this->fp, PHP_EOL); + } + + public function setLogInline() + { + $args = func_get_args(); + $this->setLog(date('Y-m-d H:i:s') . " "); + + foreach ($args as $str) { + $this->setLog((is_string($str) ? $str : print_r($str, true)) . " "); + } + } + + public function setLog($str) + { + fwrite($this->fp, $str); } public static function log() @@ -55,7 +67,7 @@ class Logger $me = Logger::getInstance(); $args = func_get_args(); - call_user_func_array(array($me, 'setLog'), $args); + call_user_func_array(array($me, 'setLogLine'), $args); } } diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project.php b/workflow/engine/src/Services/Api/ProcessMaker/Project.php index 6901bdfa2..90e977dea 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project.php @@ -119,9 +119,10 @@ class Project extends Api $whiteList = array(); foreach ($diagram["activities"] as $i => $activityData) { $activityData = array_change_key_case($activityData, CASE_UPPER); + unset($activityData["_EXTENDED"]); // activity exists ? - if ($activity = $bwp->getActivity($activityData["ACT_UID"])) { + if ($bwp->activityExists($activityData["ACT_UID"])) { // then update activity $bwp->updateActivity($activityData["ACT_UID"], $activityData); } else { @@ -233,7 +234,7 @@ class Project extends Api $oldFloUid = $flowData["FLO_UID"]; $flowData["FLO_UID"] = Hash::generateUID(); - $mappedUid = self::mapUid($flowData["FLO_ELEMENT_ORIGIN"], $result) ; + $mappedUid = self::mapUid($flowData["FLO_ELEMENT_ORIGIN"], $result); if ($mappedUid !== false) { $flowData["FLO_ELEMENT_ORIGIN"] = $mappedUid; } @@ -252,7 +253,7 @@ class Project extends Api foreach ($diagram["flows"] as $flowData) { // flow exists ? - if (\BpmnFlow::exists($flowData["FLO_UID"])) { + if ($bwp->flowExists($flowData["FLO_UID"])) { // then update activity $bwp->updateFlow($flowData["FLO_UID"], $flowData); } else {