diff --git a/gulliver/system/class.g.php b/gulliver/system/class.g.php index 5788d95f2..2f1c3185a 100755 --- a/gulliver/system/class.g.php +++ b/gulliver/system/class.g.php @@ -2609,7 +2609,7 @@ class G * @param integer $permission * @return void */ - public static function uploadFile ($file, $path, $nameToSave, $permission = 0660) + public static function uploadFile ($file, $path, $nameToSave, $permission = 0755) { try { if ($file == '') { @@ -3618,7 +3618,7 @@ class G * @param $pattern pattern to filter some especified files * @return array containing the recursive glob results */ - public function rglob($pattern = '*', $flags = 0, $path = '') + public static function rglob($pattern = '*', $flags = 0, $path = '') { $paths = glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT); $files = glob($path.$pattern, $flags); diff --git a/workflow/engine/classes/class.processes.php b/workflow/engine/classes/class.processes.php index 93981cac5..490a19ee2 100755 --- a/workflow/engine/classes/class.processes.php +++ b/workflow/engine/classes/class.processes.php @@ -2584,8 +2584,14 @@ class Processes * @return boolean */ public function serializeProcess ($sProUid = '') + { + return serialize($this->getWorkflowData($sProUid)); + } + + public function getWorkflowData($sProUid = '') { $oProcess = new Process(); + $oData = new StdClass(); $oData->process = $this->getProcessRow( $sProUid, false ); $oData->tasks = $this->getTaskRows( $sProUid ); $oData->routes = $this->getRouteRows( $sProUid ); @@ -2619,7 +2625,7 @@ class Processes //$oJSON = new Services_JSON(); //krumo ( $oJSON->encode($oData) ); //return $oJSON->encode($oData); - return serialize( $oData ); + return $oData; } /** diff --git a/workflow/engine/classes/model/BpmnBound.php b/workflow/engine/classes/model/BpmnBound.php index 73ec071b2..1c89ae457 100644 --- a/workflow/engine/classes/model/BpmnBound.php +++ b/workflow/engine/classes/model/BpmnBound.php @@ -41,4 +41,25 @@ class BpmnBound extends BaseBpmnBound return BpmnBoundPeer::doSelectOne($c); } + + public static function getAll($prjUid = null, $start = null, $limit = null, $filter = '', $changeCaseTo = CASE_UPPER) + { + $c = new Criteria('workflow'); + $c->addSelectColumn("BPMN_BOUND.*"); + + if (! is_null($prjUid)) { + $c->add(BpmnBoundPeer::PRJ_UID, $prjUid, Criteria::EQUAL); + } + + $rs = BpmnBoundPeer::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; + } } // BpmnBound diff --git a/workflow/engine/classes/model/DbSource.php b/workflow/engine/classes/model/DbSource.php index dee1bb11a..2a550baed 100755 --- a/workflow/engine/classes/model/DbSource.php +++ b/workflow/engine/classes/model/DbSource.php @@ -114,7 +114,7 @@ class DbSource extends BaseDbSource return $aRow[0]; } - public function Exists($Uid, $ProUID) + public function Exists($Uid, $ProUID = "") { try { $oPro = DbSourcePeer::retrieveByPk($Uid, $ProUID); diff --git a/workflow/engine/src/ProcessMaker/Exporter/Exporter.php b/workflow/engine/src/ProcessMaker/Exporter/Exporter.php new file mode 100644 index 000000000..9cf92d175 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Exporter/Exporter.php @@ -0,0 +1,114 @@ +prjUid = $prjUid; + + $this->bpmnProject = Project\Bpmn::load($prjUid); + } + + public function buildData() + { + $data = array(); + $project = $this->bpmnProject->getProject(); + $data["METADATA"] = $this->getSystemInfo(); + $data["METADATA"]["project_name"] = $project["PRJ_NAME"]; + + + $bpmnStruct["ACTIVITY"] = \BpmnActivity::getAll($this->prjUid); + //$data["BPMN_STRUCTURE"]["BPMN_BOUND"] = $this->bwap->getBounds(); +// $data["bpmn_data"] = $this->bwap->getProject(); +// $data["bpmn_diagram"] = $this->bwap->getProject(); +// $data["bpmn_documentation"] = $this->bwap->getProject(); + $bpmnStruct["BPMN_EVENT"] = \BpmnEvent::getAll($this->prjUid); +// $data["bpmn_extension"] = $this->bwap->getProject(); +// $data["bpmn_flow"] = $this->bwap->getProject(); + $bpmnStruct["BPMN_GATEWAY"] = \BpmnGateway::getAll($this->prjUid); +// $data["bpmn_lane"] = $this->bwap->getProject(); +// $data["bpmn_laneset"] = $this->bwap->getProject(); +// $data["bpmn_participant"] = $this->bwap->getProject(); +// $data["bpmn_process"] = $this->bwap->getProject(); +// $data["bpmn_project"] = $this->bwap->getProject(); + + + \G::LoadClass( 'processes' ); + $oProcess = new \Processes(); + $workflowData = (array) $oProcess->getWorkflowData($this->prjUid); + $workflowData["process"] = array($workflowData["process"]); + $workflowData["processCategory"] = empty($workflowData["processCategory"]) ? array() : $workflowData["processCategory"]; + + + $data["BPMN_DATA"] = $bpmnStruct; + $data["WORKFLOW_DATA"] = $workflowData; + $data["WORKFLOW_FILES"] = array(); + + // getting dynaforms + $dynaforms = array(); + + foreach ($workflowData["dynaforms"] as $dynaform) { + $dynFile = PATH_DYNAFORM . $dynaform['DYN_FILENAME'] . '.xml'; + $dynaforms[] = array( + "filename" => $dynaform['DYN_TITLE'], + "filepath" => $dynaform['DYN_FILENAME'] . '.xml', + "file_content" => file_get_contents($dynFile) + ); + + $htmlFile = PATH_DYNAFORM . $dynaform['DYN_FILENAME'] . '.html'; + + if (file_exists($htmlFile)) { + $dynaforms[] = array( + "filename" => $dynaform['DYN_FILENAME'] . '.html', + "filepath" => $dynaform['DYN_FILENAME'] . '.html', + "file_content" => file_get_contents($htmlFile) + ); + } + } + + // getting templates files + $templates = array(); + $workspaceDir = PATH_DATA . 'sites' . PATH_SEP . SYS_SYS . PATH_SEP; + $templatesDir = $workspaceDir . 'mailTemplates' . PATH_SEP . $this->prjUid; + $templatesFiles = \G::rglob("*", 0, $templatesDir); + + foreach ($templatesFiles as $templatesFile) { + if (is_dir($templatesFile)) continue; + + $templates[] = array( + "filename" => basename($templatesFile), + "filepath" => str_replace($templatesDir, "", $templatesFile), + "file_content" => file_get_contents($templatesFile) + ); + } + + $data["WORKFLOW_FILES"]["DYNAFORMS"] = $dynaforms; + $data["WORKFLOW_FILES"]["TEMPLATES"] = $templates; + $data["WORKFLOW_FILES"]["PUBLIC"] = array(); + + return $data; + } + + public function getSystemInfo() + { + //$sysInfo = \System::getSysInfo(); + //print_r($sysInfo); die; + + return array( + "vendor" => "ProcessMaker", + "codename" => "Michelangelo", + "version" => \System::getVersion(), + "workspace" => defined("SYS_SYS") ? SYS_SYS : "Unknown", + ); + } +} \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Exporter/XmlExporter.php b/workflow/engine/src/ProcessMaker/Exporter/XmlExporter.php new file mode 100644 index 000000000..517feed05 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Exporter/XmlExporter.php @@ -0,0 +1,116 @@ +dom DomDocument */ + $this->dom = new \DOMDocument("1.0", "utf-8"); //\DOMImplementation::createDocument(null, 'project'); + $this->dom->formatOutput = true; + + $this->rootNode = $this->dom->createElement("PROJECT"); + $this->rootNode->setAttribute("version", "1.0"); + $this->dom->appendChild($this->rootNode); + + + } + + public function build() + { + $data = $this->buildData(); + + // metadata set up + $metadata = $data["METADATA"]; + $metadataNode = $this->dom->createElement("METADATA"); + + foreach ($metadata as $key => $value) { + $metaNode = $this->dom->createElement("META"); + $metaNode->setAttribute("key", $key); + $metaNode->setAttribute("value", $value); + $metadataNode->appendChild($metaNode); + } + + $this->rootNode->appendChild($metadataNode); + // end setting metadata + + // bpmn struct data set up + $dbData = array("BPMN_DATA" => $data["BPMN_DATA"], "WORKFLOW_DATA" => $data["WORKFLOW_DATA"]); + //file_put_contents("/home/erik/out.log", print_r($dbData, true)); die; + foreach ($dbData as $sectionName => $sectionData) { + $dataNode = $this->dom->createElement($sectionName); + + foreach ($sectionData as $elementName => $elementData) { + $elementNode = $this->dom->createElement(strtoupper($elementName)); + + foreach ($elementData as $recordData) { + $recordNode = $this->dom->createElement("ROW"); + + foreach ($recordData as $key => $value) { + $columnNode = $this->dom->createElement(strtoupper($key)); + + if (preg_match('/^[\w\s]+$/', $value, $match) || empty($value)) { + $textNode = $this->dom->createTextNode($value); + } else { + $textNode = $this->dom->createCDATASection($value); + } + + $columnNode->appendChild($textNode); + $recordNode->appendChild($columnNode); + } + + $elementNode->appendChild($recordNode); + } + + $dataNode->appendChild($elementNode); + } + + $this->rootNode->appendChild($dataNode); + } + + $workflowFilesNode = $this->dom->createElement("WORKFLOW_FILES"); + + // workflow dynaforms files + foreach ($data["WORKFLOW_FILES"] as $elementName => $elementData) { + //$wfFilesNode = $this->dom->createElement($elementName); + + foreach ($elementData as $fileData) { + $fileNode = $this->dom->createElement("FILE"); + $fileNode->setAttribute("target", strtolower($elementName)); + + $filenameNode = $this->dom->createElement("FILE_NAME"); + $filenameNode->appendChild($this->dom->createCDATASection($fileData["filename"])); + $fileNode->appendChild($filenameNode); + + $filepathNode = $this->dom->createElement("FILE_PATH"); + $filepathNode->appendChild($this->dom->createCDATASection($fileData["filepath"])); + $fileNode->appendChild($filepathNode); + + $fileContentNode = $this->dom->createElement("FILE_CONTENT"); + $fileContentNode->appendChild($this->dom->createCDATASection(base64_encode($fileData["file_content"]))); + $fileNode->appendChild($fileContentNode); + + $workflowFilesNode->appendChild($fileNode); + } + + //$workflowFilesNode->appendChild($wfFilesNode); + } + + $this->rootNode->appendChild($workflowFilesNode); + } + + public function save($outputFile) + { + file_put_contents($outputFile, $this->export()); + } + + public function export() + { + return $this->dom->saveXml(); + } +} \ 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 757c7a024..4c37c7341 100644 --- a/workflow/engine/src/ProcessMaker/Project/Workflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Workflow.php @@ -237,6 +237,10 @@ class Workflow extends Handler return $tasks->getAllTasks($this->proUid); } + /** + * @param string $tasUid + * @param bool $value + */ public function setStartTask($tasUid, $value = true) { $value = $value ? "TRUE" : "FALSE"; @@ -248,6 +252,10 @@ class Workflow extends Handler self::log("Setting Start Task -> $value, Success!"); } + /** + * @param string $tasUid + * @param bool $value + */ public function setEndTask($tasUid, $value = true) { self::log("Setting End Task with Uid: $tasUid: " . ($value ? "TRUE" : "FALSE")); diff --git a/workflow/engine/src/Tests/ProcessMaker/Exporter/XmlExporterTest.php b/workflow/engine/src/Tests/ProcessMaker/Exporter/XmlExporterTest.php new file mode 100644 index 000000000..b9358973d --- /dev/null +++ b/workflow/engine/src/Tests/ProcessMaker/Exporter/XmlExporterTest.php @@ -0,0 +1,25 @@ + + */ +class XmlExporterTest extends \PHPUnit_Framework_TestCase +{ + function testExport() + { + $exporter = new Exporter\XmlExporter("4857540205310b25f3d51a5020772457"); + $exporter->build(); + $exporter->save("/home/erik/out.xml"); + } +} \ No newline at end of file