Adding adapters for Workflow->Bpmn and Bpmn->Workflow projects, and more updates & fixes
This commit is contained in:
@@ -383,6 +383,7 @@ class Bootstrap
|
|||||||
self::registerClass("Users", PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "model" . PATH_SEP . "Users.php");
|
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("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("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");
|
self::registerClass("Xml_Node", PATH_GULLIVER . "class.xmlDocument.php");
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
* @package workflow.engine.classes
|
* @package workflow.engine.classes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
require_once 'class.plugin.php';
|
||||||
|
|
||||||
class pluginDetail
|
class pluginDetail
|
||||||
{
|
{
|
||||||
public $sNamespace;
|
public $sNamespace;
|
||||||
@@ -129,7 +131,7 @@ class PMPluginRegistry
|
|||||||
*
|
*
|
||||||
* @return object
|
* @return object
|
||||||
*/
|
*/
|
||||||
public function &getSingleton ()
|
public static function getSingleton ()
|
||||||
{
|
{
|
||||||
if (self::$instance == null) {
|
if (self::$instance == null) {
|
||||||
self::$instance = new PMPluginRegistry();
|
self::$instance = new PMPluginRegistry();
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ G::LoadClass( 'pmFunctions' );
|
|||||||
//call plugin
|
//call plugin
|
||||||
if (class_exists( 'folderData' )) {
|
if (class_exists( 'folderData' )) {
|
||||||
//$folderData = new folderData($sProUid, $proFields['PRO_TITLE'], $sAppUid, $Fields['APP_TITLE'], $sUsrUid);
|
//$folderData = new folderData($sProUid, $proFields['PRO_TITLE'], $sAppUid, $Fields['APP_TITLE'], $sUsrUid);
|
||||||
$oPluginRegistry = &PMPluginRegistry::getSingleton();
|
$oPluginRegistry = PMPluginRegistry::getSingleton();
|
||||||
$aAvailablePmFunctions = $oPluginRegistry->getPmFunctions();
|
$aAvailablePmFunctions = $oPluginRegistry->getPmFunctions();
|
||||||
foreach ($aAvailablePmFunctions as $key => $class) {
|
foreach ($aAvailablePmFunctions as $key => $class) {
|
||||||
$filePlugin = PATH_PLUGINS . $class . PATH_SEP . 'classes' . PATH_SEP . 'class.pmFunctions.php';
|
$filePlugin = PATH_PLUGINS . $class . PATH_SEP . 'classes' . PATH_SEP . 'class.pmFunctions.php';
|
||||||
|
|||||||
@@ -567,7 +567,7 @@ class Process extends BaseProcess
|
|||||||
return (is_object( $oPro ) && get_class( $oPro ) == 'Process');
|
return (is_object( $oPro ) && get_class( $oPro ) == 'Process');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function existsByProTitle ($PRO_TITLE)
|
public static function existsByProTitle ($PRO_TITLE)
|
||||||
{
|
{
|
||||||
$oCriteria = new Criteria( 'workflow' );
|
$oCriteria = new Criteria( 'workflow' );
|
||||||
$oCriteria->addSelectColumn( 'COUNT(*) AS PROCESS' );
|
$oCriteria->addSelectColumn( 'COUNT(*) AS PROCESS' );
|
||||||
|
|||||||
@@ -39,64 +39,63 @@ class ProcessProxy extends HttpProxyController
|
|||||||
{
|
{
|
||||||
$projectType = empty($_GET['type']) ? 'classicProject' : $_GET['type'];
|
$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 {
|
try {
|
||||||
if (! isset( $httpData->PRO_UID )) {
|
$data = (array) $httpData;
|
||||||
if (Process::existsByProTitle( $httpData->PRO_TITLE )) {
|
$data['PRO_CREATE_USER'] = $_SESSION['USER_LOGGED'];
|
||||||
$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 );
|
|
||||||
|
|
||||||
|
if ($projectType == "classicProject") {
|
||||||
|
$project = new ProcessMaker\Project\Workflow($data);
|
||||||
} else {
|
} else {
|
||||||
//$oProcessMap->updateProcess($_POST['form']);
|
$project = new ProcessMaker\Project\Adapter\WorkflowBpmn($data);
|
||||||
$sProUid = $httpData->PRO_UID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Save Calendar ID for this process
|
$sProUid = $project->getUid();
|
||||||
if (isset( $httpData->PRO_CALENDAR )) {
|
|
||||||
G::LoadClass( "calendar" );
|
|
||||||
$calendarObj = new Calendar();
|
|
||||||
$calendarObj->assignCalendarTo( $sProUid, $httpData->PRO_CALENDAR, 'PROCESS' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Creating BPMN Project Layer
|
|
||||||
if ($projectType == 'bpmnProject') {
|
|
||||||
$bpmnModel = new ProcessMaker\Adapter\Bpmn\Model();
|
|
||||||
$replaceUids = false;
|
|
||||||
|
|
||||||
$data = array(
|
// require_once 'classes/model/Task.php';
|
||||||
'PRJ_UID' => $sProUid,
|
// G::LoadClass( 'processMap' );
|
||||||
'PRJ_NAME' => $httpData->PRO_TITLE,
|
// $oProcessMap = new ProcessMap();
|
||||||
'PRJ_DESCRIPTION' => $httpData->PRO_DESCRIPTION,
|
//
|
||||||
'PRJ_CATEGORY' => $httpData->PRO_CATEGORY
|
// $httpData->PRO_TITLE = trim( $httpData->PRO_TITLE );
|
||||||
);
|
//
|
||||||
|
// try {
|
||||||
$result = $bpmnModel->createProject($data, $replaceUids);
|
// 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->success = true;
|
||||||
$this->PRO_UID = $sProUid;
|
$this->PRO_UID = $sProUid;
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
namespace ProcessMaker\Exception;
|
||||||
|
|
||||||
|
use ProcessMaker\Project;
|
||||||
|
|
||||||
|
class ProjectAlreadyExists extends \RuntimeException
|
||||||
|
{
|
||||||
|
const EXCEPTION_CODE = 21;
|
||||||
|
|
||||||
|
public function __construct(Project\Handler $obj, $name, $message = "", \Exception $previous = null) {
|
||||||
|
$message = empty($message) ? sprintf("Project \"%s\" with name: %s, already exists.", get_class($obj), $name) : $message;
|
||||||
|
|
||||||
|
parent::__construct($message, self::EXCEPTION_CODE, $previous);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __toString()
|
||||||
|
{
|
||||||
|
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
namespace ProcessMaker\Project\Adapter;
|
||||||
|
|
||||||
|
use ProcessMaker\Project;
|
||||||
|
use ProcessMaker\Util\Hash;
|
||||||
|
|
||||||
|
|
||||||
|
class WorkflowBpmn extends Project\Workflow
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* OVERRIDES
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function create($data)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
parent::create($data);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
throw new \RuntimeException(sprintf("Can't create Workflow Project." . PHP_EOL . $e->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
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -49,15 +49,37 @@ class Workflow extends Handler
|
|||||||
public function create($data)
|
public function create($data)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// setting defaults
|
// setting defaults
|
||||||
$data['PRO_UID'] = array_key_exists('PRO_UID', $data) ? $data['PRO_UID'] : Hash::generateUID();
|
$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['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
|
// Create project
|
||||||
$process = new Process();
|
$process = new Process();
|
||||||
$this->proUid = $process->create($data, false);
|
$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) {
|
} catch (Exception $e) {
|
||||||
throw new \RuntimeException($e);
|
throw new \RuntimeException($e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
|
|||||||
function testNew()
|
function testNew()
|
||||||
{
|
{
|
||||||
$data = array(
|
$data = array(
|
||||||
"PRJ_NAME" => "Test BPMN Project #1",
|
"PRJ_NAME" => "Test Bpmn/Workflow Project #1",
|
||||||
"PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1",
|
"PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1",
|
||||||
"PRJ_AUTHOR" => "00000000000000000000000000000001"
|
"PRJ_AUTHOR" => "00000000000000000000000000000001"
|
||||||
);
|
);
|
||||||
@@ -43,7 +43,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase
|
|||||||
function testCreate()
|
function testCreate()
|
||||||
{
|
{
|
||||||
$data = array(
|
$data = array(
|
||||||
"PRJ_NAME" => "Test BPMN Project #2",
|
"PRJ_NAME" => "Test Bpmn/Workflow Project #2",
|
||||||
"PRJ_DESCRIPTION" => "Description for - Test BPMN Project #2",
|
"PRJ_DESCRIPTION" => "Description for - Test BPMN Project #2",
|
||||||
"PRJ_AUTHOR" => "00000000000000000000000000000001"
|
"PRJ_AUTHOR" => "00000000000000000000000000000001"
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
<?php
|
||||||
|
namespace Tests\ProcessMaker\Project\Adapter;
|
||||||
|
|
||||||
|
use \ProcessMaker\Project;
|
||||||
|
|
||||||
|
if (! class_exists("Propel")) {
|
||||||
|
include_once __DIR__ . "/../../../bootstrap.php";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class WorkflowBpmnTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
function testNew()
|
||||||
|
{
|
||||||
|
$data = array(
|
||||||
|
"PRO_TITLE" => "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"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -267,7 +267,7 @@ class WorkflowTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @depends testCompleteWorkflowProject
|
* @depends testCompleteWorkflowProject
|
||||||
* @param $wp \ProcessMaker\Project\WorkflowProject
|
* @param $wp \ProcessMaker\Project\Workflow
|
||||||
* @expectedException \ProcessMaker\Exception\ProjectNotFound
|
* @expectedException \ProcessMaker\Exception\ProjectNotFound
|
||||||
* @expectedExceptionCode 20
|
* @expectedExceptionCode 20
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user