diff --git a/gulliver/system/class.bootstrap.php b/gulliver/system/class.bootstrap.php index 3ecb98f08..5bee61115 100644 --- a/gulliver/system/class.bootstrap.php +++ b/gulliver/system/class.bootstrap.php @@ -383,6 +383,7 @@ class Bootstrap self::registerClass("Users", PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "model" . PATH_SEP . "Users.php"); self::registerClass("UsersPeer", PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "model" . PATH_SEP . "UsersPeer.php"); self::registerClass("ReportTables", PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.reportTables.php"); + self::registerClass("PMPluginRegistry", PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.pluginRegistry.php"); self::registerClass("Xml_Node", PATH_GULLIVER . "class.xmlDocument.php"); diff --git a/workflow/engine/classes/class.pluginRegistry.php b/workflow/engine/classes/class.pluginRegistry.php index 33a0669bd..1e3f3af87 100755 --- a/workflow/engine/classes/class.pluginRegistry.php +++ b/workflow/engine/classes/class.pluginRegistry.php @@ -30,6 +30,8 @@ * @package workflow.engine.classes */ +require_once 'class.plugin.php'; + class pluginDetail { public $sNamespace; @@ -129,7 +131,7 @@ class PMPluginRegistry * * @return object */ - public function &getSingleton () + public static function getSingleton () { if (self::$instance == null) { self::$instance = new PMPluginRegistry(); diff --git a/workflow/engine/classes/class.pmScript.php b/workflow/engine/classes/class.pmScript.php index 7cbd8f87b..8ba0fd43e 100644 --- a/workflow/engine/classes/class.pmScript.php +++ b/workflow/engine/classes/class.pmScript.php @@ -58,7 +58,7 @@ G::LoadClass( 'pmFunctions' ); //call plugin if (class_exists( 'folderData' )) { //$folderData = new folderData($sProUid, $proFields['PRO_TITLE'], $sAppUid, $Fields['APP_TITLE'], $sUsrUid); - $oPluginRegistry = &PMPluginRegistry::getSingleton(); + $oPluginRegistry = PMPluginRegistry::getSingleton(); $aAvailablePmFunctions = $oPluginRegistry->getPmFunctions(); foreach ($aAvailablePmFunctions as $key => $class) { $filePlugin = PATH_PLUGINS . $class . PATH_SEP . 'classes' . PATH_SEP . 'class.pmFunctions.php'; diff --git a/workflow/engine/classes/model/Process.php b/workflow/engine/classes/model/Process.php index 732ec9d01..c0ab06e26 100755 --- a/workflow/engine/classes/model/Process.php +++ b/workflow/engine/classes/model/Process.php @@ -567,7 +567,7 @@ class Process extends BaseProcess return (is_object( $oPro ) && get_class( $oPro ) == 'Process'); } - public function existsByProTitle ($PRO_TITLE) + public static function existsByProTitle ($PRO_TITLE) { $oCriteria = new Criteria( 'workflow' ); $oCriteria->addSelectColumn( 'COUNT(*) AS PROCESS' ); diff --git a/workflow/engine/controllers/processProxy.php b/workflow/engine/controllers/processProxy.php index d8b9e1fe2..fcae2c2b1 100755 --- a/workflow/engine/controllers/processProxy.php +++ b/workflow/engine/controllers/processProxy.php @@ -39,64 +39,63 @@ class ProcessProxy extends HttpProxyController { $projectType = empty($_GET['type']) ? 'classicProject' : $_GET['type']; - require_once 'classes/model/Task.php'; - G::LoadClass( 'processMap' ); - $oProcessMap = new ProcessMap(); - - $httpData->PRO_TITLE = trim( $httpData->PRO_TITLE ); - try { - if (! isset( $httpData->PRO_UID )) { - if (Process::existsByProTitle( $httpData->PRO_TITLE )) { - $result = array ('success' => false,'msg' => G::LoadTranslation( 'ID_SAVE_PROCESS_ERROR' ),'errors' => array ('PRO_TITLE' => G::LoadTranslation( 'ID_PROCESSTITLE_ALREADY_EXISTS', SYS_LANG, Array ('PRO_TITLE' => $httpData->PRO_TITLE - ) ) - ) - ); - print G::json_encode( $result ); - exit( 0 ); - } - - $processData['USR_UID'] = $_SESSION['USER_LOGGED']; - $processData['PRO_TITLE'] = $httpData->PRO_TITLE; - $processData['PRO_DESCRIPTION'] = $httpData->PRO_DESCRIPTION; - $processData['PRO_CATEGORY'] = $httpData->PRO_CATEGORY; - - $sProUid = $oProcessMap->createProcess( $processData ); - - //call pluginsx - $oData['PRO_UID'] = $sProUid; - $oData['PRO_TEMPLATE'] = isset( $httpData->PRO_TEMPLATE ) && $httpData->PRO_TEMPLATE != '' ? $httpData->PRO_TEMPLATE : ''; - $oData['PROCESSMAP'] = $oProcessMap; - - $oPluginRegistry = & PMPluginRegistry::getSingleton(); - $oPluginRegistry->executeTriggers( PM_NEW_PROCESS_SAVE, $oData ); + $data = (array) $httpData; + $data['PRO_CREATE_USER'] = $_SESSION['USER_LOGGED']; + if ($projectType == "classicProject") { + $project = new ProcessMaker\Project\Workflow($data); } else { - //$oProcessMap->updateProcess($_POST['form']); - $sProUid = $httpData->PRO_UID; + $project = new ProcessMaker\Project\Adapter\WorkflowBpmn($data); } - //Save Calendar ID for this process - if (isset( $httpData->PRO_CALENDAR )) { - G::LoadClass( "calendar" ); - $calendarObj = new Calendar(); - $calendarObj->assignCalendarTo( $sProUid, $httpData->PRO_CALENDAR, 'PROCESS' ); - } + $sProUid = $project->getUid(); - // Creating BPMN Project Layer - if ($projectType == 'bpmnProject') { - $bpmnModel = new ProcessMaker\Adapter\Bpmn\Model(); - $replaceUids = false; - $data = array( - 'PRJ_UID' => $sProUid, - 'PRJ_NAME' => $httpData->PRO_TITLE, - 'PRJ_DESCRIPTION' => $httpData->PRO_DESCRIPTION, - 'PRJ_CATEGORY' => $httpData->PRO_CATEGORY - ); - - $result = $bpmnModel->createProject($data, $replaceUids); - } +// require_once 'classes/model/Task.php'; +// G::LoadClass( 'processMap' ); +// $oProcessMap = new ProcessMap(); +// +// $httpData->PRO_TITLE = trim( $httpData->PRO_TITLE ); +// +// try { +// if (! isset( $httpData->PRO_UID )) { +// if (Process::existsByProTitle( $httpData->PRO_TITLE )) { +// $result = array ('success' => false,'msg' => G::LoadTranslation( 'ID_SAVE_PROCESS_ERROR' ),'errors' => array ('PRO_TITLE' => G::LoadTranslation( 'ID_PROCESSTITLE_ALREADY_EXISTS', SYS_LANG, Array ('PRO_TITLE' => $httpData->PRO_TITLE +// ) ) +// ) +// ); +// print G::json_encode( $result ); +// exit( 0 ); +// } +// +// $processData['USR_UID'] = $_SESSION['USER_LOGGED']; +// $processData['PRO_TITLE'] = $httpData->PRO_TITLE; +// $processData['PRO_DESCRIPTION'] = $httpData->PRO_DESCRIPTION; +// $processData['PRO_CATEGORY'] = $httpData->PRO_CATEGORY; +// +// $sProUid = $oProcessMap->createProcess( $processData ); +// +// //call pluginsx +// $oData['PRO_UID'] = $sProUid; +// $oData['PRO_TEMPLATE'] = isset( $httpData->PRO_TEMPLATE ) && $httpData->PRO_TEMPLATE != '' ? $httpData->PRO_TEMPLATE : ''; +// $oData['PROCESSMAP'] = $oProcessMap; +// +// $oPluginRegistry = & PMPluginRegistry::getSingleton(); +// $oPluginRegistry->executeTriggers( PM_NEW_PROCESS_SAVE, $oData ); +// +// } else { +// //$oProcessMap->updateProcess($_POST['form']); +// $sProUid = $httpData->PRO_UID; +// } +// +// //Save Calendar ID for this process +// if (isset( $httpData->PRO_CALENDAR )) { +// G::LoadClass( "calendar" ); +// $calendarObj = new Calendar(); +// $calendarObj->assignCalendarTo( $sProUid, $httpData->PRO_CALENDAR, 'PROCESS' ); +// } +// $this->success = true; $this->PRO_UID = $sProUid; diff --git a/workflow/engine/src/ProcessMaker/Exception/ProjectAlreadyExists.php b/workflow/engine/src/ProcessMaker/Exception/ProjectAlreadyExists.php new file mode 100644 index 000000000..52430d061 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Exception/ProjectAlreadyExists.php @@ -0,0 +1,20 @@ +code}]: {$this->message}\n"; + } +} \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowBpmn.php b/workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowBpmn.php new file mode 100644 index 000000000..9e6ecf111 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowBpmn.php @@ -0,0 +1,51 @@ +getMessage())); + } + + try { + $bpData = array(); + $bpData["PRJ_UID"] = $this->getUid(); + + if (array_key_exists("PRO_TITLE", $data)) { + $bpData["PRJ_NAME"] = $data["PRO_TITLE"]; + } + if (array_key_exists("PRO_DESCRIPTION", $data)) { + $bpData["PRJ_DESCRIPTION"] = $data["PRO_DESCRIPTION"]; + } + if (array_key_exists("PRO_CREATE_USER", $data)) { + $bpData["PRJ_AUTHOR"] = $data["PRO_CREATE_USER"]; + } elseif (array_key_exists("USR_UID", $data)) { + $bpData["PRJ_AUTHOR"] = $data["USR_UID"]; + } + + $wp = new Project\Bpmn(); + $wp->create($bpData); + + } catch (\Exception $e) { + $prjUid = $this->getUid(); + $this->remove(); + + throw new \RuntimeException(sprintf( + "Can't create Project with prj_uid: %s, workflow creation fails." . PHP_EOL . $e->getMessage() + , $prjUid + )); + } + } +} \ 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 0f9dba7da..da554b699 100644 --- a/workflow/engine/src/ProcessMaker/Project/Workflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Workflow.php @@ -49,15 +49,37 @@ class Workflow extends Handler public function create($data) { try { + // setting defaults $data['PRO_UID'] = array_key_exists('PRO_UID', $data) ? $data['PRO_UID'] : Hash::generateUID(); $data['USR_UID'] = array_key_exists('PRO_CREATE_USER', $data) ? $data['PRO_CREATE_USER'] : null; - $data['PRO_CATEGORY'] = array_key_exists('PRO_CATEGORY', $data) ? $data['PRO_CATEGORY'] : ''; + $data['PRO_TITLE'] = array_key_exists('PRO_TITLE', $data) ? trim($data['PRO_TITLE']) : ""; + $data['PRO_CATEGORY'] = array_key_exists('PRO_CATEGORY', $data) ? $data['PRO_CATEGORY'] : ""; + + //validate if process with specified name already exists + if (Process::existsByProTitle($data["PRO_TITLE"])) { + throw new Exception\ProjectAlreadyExists($this, $data["PRO_TITLE"]); + } // Create project $process = new Process(); $this->proUid = $process->create($data, false); + // Call Plugins + $pluginData['PRO_UID'] = $this->proUid; + $pluginData['PRO_TEMPLATE'] = empty($data["PRO_TEMPLATE"]) ? "" : $data["PRO_TEMPLATE"]; + $pluginData['PROCESSMAP'] = null; + + $pluginRegistry = \PMPluginRegistry::getSingleton(); + $pluginRegistry->executeTriggers(PM_NEW_PROCESS_SAVE, $pluginData); + + // Save Calendar ID for this process + if (! empty($data["PRO_CALENDAR"])) { + //G::LoadClass( "calendar" ); + $calendar = new \Calendar(); + $calendar->assignCalendarTo($this->proUid, $data["PRO_CALENDAR"], 'PROCESS'); + } + } catch (Exception $e) { throw new \RuntimeException($e); } diff --git a/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php index a6619c44c..db8489c9a 100644 --- a/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php +++ b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php @@ -13,7 +13,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase function testNew() { $data = array( - "PRJ_NAME" => "Test BPMN Project #1", + "PRJ_NAME" => "Test Bpmn/Workflow Project #1", "PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1", "PRJ_AUTHOR" => "00000000000000000000000000000001" ); @@ -43,7 +43,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase function testCreate() { $data = array( - "PRJ_NAME" => "Test BPMN Project #2", + "PRJ_NAME" => "Test Bpmn/Workflow Project #2", "PRJ_DESCRIPTION" => "Description for - Test BPMN Project #2", "PRJ_AUTHOR" => "00000000000000000000000000000001" ); diff --git a/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/WorkflowBpmnTest.php b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/WorkflowBpmnTest.php new file mode 100644 index 000000000..f251fda3c --- /dev/null +++ b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/WorkflowBpmnTest.php @@ -0,0 +1,72 @@ + "Test Workflow/Bpmn Project #1", + "PRO_DESCRIPTION" => "Description for - Test Project #1", + "PRO_CREATE_USER" => "00000000000000000000000000000001" + ); + + $wbap = new Project\Adapter\WorkflowBpmn($data); + + try { + $bp = Project\Bpmn::load($wbap->getUid()); + } catch (\Exception $e){die($e->getMessage());} + + try { + $wp = Project\Workflow::load($wbap->getUid()); + } catch (\Exception $e){} + + $this->assertNotNull($bp); + $this->assertNotNull($wp); + $this->assertEquals($bp->getUid(), $wp->getUid()); + + $project = $bp->getProject(); + $process = $wp->getProcess(); + + $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"]); + } + + function testCreate() + { + $data = array( + "PRO_TITLE" => "Test Workflow/Bpmn Project #2", + "PRO_DESCRIPTION" => "Description for - Test Project #2", + "PRO_CREATE_USER" => "00000000000000000000000000000001" + ); + $wbap = new Project\Adapter\WorkflowBpmn(); + $wbap->create($data); + + try { + $bp = Project\Bpmn::load($wbap->getUid()); + } catch (\Exception $e){} + + try { + $wp = Project\Workflow::load($wbap->getUid()); + } catch (\Exception $e){} + + $this->assertNotEmpty($bp); + $this->assertNotEmpty($wp); + $this->assertEquals($bp->getUid(), $wp->getUid()); + + $project = $bp->getProject(); + $process = $wp->getProcess(); + + $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"]); + } +} \ No newline at end of file diff --git a/workflow/engine/src/Tests/ProcessMaker/Project/WorkflowTest.php b/workflow/engine/src/Tests/ProcessMaker/Project/WorkflowTest.php index cced3ac4d..c6161e188 100644 --- a/workflow/engine/src/Tests/ProcessMaker/Project/WorkflowTest.php +++ b/workflow/engine/src/Tests/ProcessMaker/Project/WorkflowTest.php @@ -267,7 +267,7 @@ class WorkflowTest extends \PHPUnit_Framework_TestCase /** * @depends testCompleteWorkflowProject - * @param $wp \ProcessMaker\Project\WorkflowProject + * @param $wp \ProcessMaker\Project\Workflow * @expectedException \ProcessMaker\Exception\ProjectNotFound * @expectedExceptionCode 20 */