Adding SubProcess support for Bpmn->Workflow adapter

This commit is contained in:
Erik Amaru Ortiz
2014-03-26 12:20:58 -04:00
parent 60496398aa
commit 16d861c225
13 changed files with 165 additions and 92 deletions

View File

@@ -4555,6 +4555,7 @@ class processMap
{
try {
$oTask = new Task();
$oNewTask = new StdClass();
$oNewTask->label = G::LoadTranslation('ID_SUBPROCESS');
$oNewTask->uid = $oTask->create(array('PRO_UID' => $sProcessUID, 'TAS_TITLE' => $oNewTask->label, 'TAS_POSX' => $iX, 'TAS_POSY' => $iY, 'TAS_TYPE' => 'SUBPROCESS' ));
//$oJSON = new Services_JSON();

View File

@@ -112,7 +112,7 @@ class BpmnActivity extends BaseBpmnActivity
$this->setBoundDefaults();
if ($this->bound->getBouUid() == "") {
$this->bound->setBouUid(\ProcessMaker\Util\Hash::generateUID());
$this->bound->setBouUid(\ProcessMaker\Util\Common::generateUID());
}
$this->bound->save($con);
@@ -142,7 +142,7 @@ class BpmnActivity extends BaseBpmnActivity
$this->bound = $bound;
} else {
$this->bound = new BpmnBound();
$this->bound->setBouUid(ProcessMaker\Util\Hash::generateUID());
$this->bound->setBouUid(ProcessMaker\Util\Common::generateUID());
}
$this->bound->fromArray($data, BasePeer::TYPE_FIELDNAME);

View File

@@ -112,7 +112,7 @@ class BpmnEvent extends BaseBpmnEvent
$this->setBoundDefaults();
if ($this->bound->getBouUid() == "") {
$this->bound->setBouUid(\ProcessMaker\Util\Hash::generateUID());
$this->bound->setBouUid(\ProcessMaker\Util\Common::generateUID());
}
$this->bound->save($con);
@@ -142,7 +142,7 @@ class BpmnEvent extends BaseBpmnEvent
$this->bound = $bound;
} else {
$this->bound = new BpmnBound();
$this->bound->setBouUid(ProcessMaker\Util\Hash::generateUID());
$this->bound->setBouUid(ProcessMaker\Util\Common::generateUID());
}
$this->bound->fromArray($data, BasePeer::TYPE_FIELDNAME);

View File

@@ -117,7 +117,7 @@ class BpmnGateway extends BaseBpmnGateway
$this->setBoundDefaults();
if ($this->bound->getBouUid() == "") {
$this->bound->setBouUid(\ProcessMaker\Util\Hash::generateUID());
$this->bound->setBouUid(\ProcessMaker\Util\Common::generateUID());
}
$this->bound->save($con);
@@ -147,7 +147,7 @@ class BpmnGateway extends BaseBpmnGateway
$this->bound = $bound;
} else {
$this->bound = new BpmnBound();
$this->bound->setBouUid(ProcessMaker\Util\Hash::generateUID());
$this->bound->setBouUid(ProcessMaker\Util\Common::generateUID());
}
$this->bound->fromArray($data, BasePeer::TYPE_FIELDNAME);

View File

@@ -148,5 +148,14 @@ class SubProcess extends BaseSubProcess
throw ($oError);
}
}
public static function findByParents($proParent, $tasParent)
{
$criteria = new Criteria('workflow');
$criteria->add(SubProcessPeer::PRO_PARENT, $proParent);
$criteria->add(SubProcessPeer::TAS_PARENT, $tasParent);
return SubProcessPeer::doSelectOne($criteria);
}
}

View File

@@ -354,7 +354,7 @@ class Task extends BaseTask
* create a new Task
*
* @param array $aData with new values
* @return void
* @return string
*/
public function create($aData, $generateUid = true)
{

View File

@@ -2,7 +2,7 @@
namespace ProcessMaker\Project\Adapter;
use ProcessMaker\Project;
use ProcessMaker\Util\Hash;
use ProcessMaker\Util\Common;
/**
* Class BpmnWorkflow
@@ -134,6 +134,13 @@ class BpmnWorkflow extends Project\Bpmn
if (array_key_exists("ACT_NAME", $data)) {
$taskData["TAS_POSY"] = $data["BOU_Y"];
}
if (array_key_exists("ACT_TYPE", $data)) {
if ($data["ACT_TYPE"] == "SUB_PROCESS") {
$taskData["TAS_TYPE"] = "SUBPROCESS";
} else {
$taskData["TAS_TYPE"] = "NORMAL";
}
}
$this->wp->addTask($taskData);
@@ -163,6 +170,7 @@ class BpmnWorkflow extends Project\Bpmn
{
parent::removeActivity($actUid);
$this->wp->removeTask($actUid);
}
public function removeGateway($gatUid)

View File

@@ -2,7 +2,7 @@
namespace ProcessMaker\Project\Adapter;
use ProcessMaker\Project;
use ProcessMaker\Util\Hash;
use ProcessMaker\Util\Common;
/**
* Class WorkflowBpmn

View File

@@ -27,7 +27,7 @@ use \BpmnArtifactPeer as ArtifactPeer;
use \BasePeer;
use ProcessMaker\Util\Hash;
use ProcessMaker\Util\Common;
use ProcessMaker\Exception;
/**
@@ -99,7 +99,7 @@ class Bpmn extends Handler
public function create($data)
{
// setting defaults
$data['PRJ_UID'] = array_key_exists('PRJ_UID', $data) ? $data['PRJ_UID'] : Hash::generateUID();
$data['PRJ_UID'] = array_key_exists('PRJ_UID', $data) ? $data['PRJ_UID'] : Common::generateUID();
self::log("Create Project with data: ", $data);
$this->project = new Project();
@@ -195,7 +195,7 @@ class Bpmn extends Handler
}
// setting defaults
$data['DIA_UID'] = array_key_exists('DIA_UID', $data) ? $data['DIA_UID'] : Hash::generateUID();
$data['DIA_UID'] = array_key_exists('DIA_UID', $data) ? $data['DIA_UID'] : Common::generateUID();
$data['DIA_NAME'] = array_key_exists('DIA_NAME', $data) ? $data['DIA_NAME'] : $this->project->getPrjName();
$this->diagram = new Diagram();
@@ -225,7 +225,7 @@ class Bpmn extends Handler
}
// 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'] : Common::generateUID();;
$data['PRO_NAME'] = array_key_exists('PRO_NAME', $data) ? $data['PRO_NAME'] : $this->diagram->getDiaName();
$this->process = new Process();
@@ -256,7 +256,7 @@ class Bpmn extends Handler
}
// setting defaults
$data['ACT_UID'] = array_key_exists('ACT_UID', $data) ? $data['ACT_UID'] : Hash::generateUID();;
$data['ACT_UID'] = array_key_exists('ACT_UID', $data) ? $data['ACT_UID'] : Common::generateUID();;
try {
self::log("Add Activity with data: ", $data);
@@ -342,7 +342,7 @@ class Bpmn extends Handler
public function addEvent($data)
{
// setting defaults
$data['EVN_UID'] = array_key_exists('EVN_UID', $data) ? $data['EVN_UID'] : Hash::generateUID();
$data['EVN_UID'] = array_key_exists('EVN_UID', $data) ? $data['EVN_UID'] : Common::generateUID();
try {
self::log("Add Event with data: ", $data);
@@ -432,7 +432,7 @@ class Bpmn extends Handler
public function addGateway($data)
{
// setting defaults
$data['GAT_UID'] = array_key_exists('GAT_UID', $data) ? $data['GAT_UID'] : Hash::generateUID();
$data['GAT_UID'] = array_key_exists('GAT_UID', $data) ? $data['GAT_UID'] : Common::generateUID();
try {
self::log("Add Gateway with data: ", $data);
@@ -517,7 +517,7 @@ class Bpmn extends Handler
self::log("Add Flow with data: ", $data);
// setting defaults
$data['FLO_UID'] = array_key_exists('FLO_UID', $data) ? $data['FLO_UID'] : Hash::generateUID();
$data['FLO_UID'] = array_key_exists('FLO_UID', $data) ? $data['FLO_UID'] : Common::generateUID();
if (array_key_exists('FLO_STATE', $data)) {
$data['FLO_STATE'] = is_array($data['FLO_STATE']) ? json_encode($data['FLO_STATE']) : $data['FLO_STATE'];
}

View File

@@ -10,8 +10,9 @@ use \Task;
use \Route;
use \RoutePeer;
use ProcessMaker\Util\Hash;
use ProcessMaker\Util\Common;
use ProcessMaker\Exception;
use ProcessMaker\Util;
/**
* Class Workflow
@@ -55,7 +56,7 @@ class Workflow extends Handler
public function create($data)
{
// 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'] : Common::generateUID();
$data['USR_UID'] = array_key_exists('PRO_CREATE_USER', $data) ? $data['PRO_CREATE_USER'] : null;
$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'] : "";
@@ -165,7 +166,7 @@ class Workflow extends Handler
public function addTask($taskData)
{
// Setting defaults
$taskData['TAS_UID'] = array_key_exists('TAS_UID', $taskData) ? $taskData['TAS_UID'] : Hash::generateUID();
$taskData['TAS_UID'] = array_key_exists('TAS_UID', $taskData) ? $taskData['TAS_UID'] : Common::generateUID();
$taskData['PRO_UID'] = $this->proUid;
try {
@@ -173,6 +174,12 @@ class Workflow extends Handler
$task = new Task();
$tasUid = $task->create($taskData, false);
self::log("Add Task Success!");
// SubProcess Handling
if ($task->getTasType() == "SUBPROCESS") {
$this->addSubProcess($this->proUid, $tasUid);
}
} catch (\Exception $e) {
self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString());
throw $e;
@@ -201,9 +208,17 @@ class Workflow extends Handler
{
try {
self::log("Remove Task: $tasUid");
$task = \TaskPeer::retrieveByPK($tasUid);
$tasType = $task->getTasType();
$task = new Tasks();
$task->deleteTask($tasUid);
self::log("Remove Task Success!");
if ($tasType == "SUBPROCESS") {
$this->removeSupProcess($this->proUid, $tasUid);
}
} catch (\Exception $e) {
self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString());
throw $e;
@@ -237,6 +252,53 @@ class Workflow extends Handler
return $tasks->getAllTasks($this->proUid);
}
public function addSubProcess($proUid = '', $tasUid)//$iX = 0, $iY = 0)
{
try {
$subProcess = new \SubProcess();
$data = array(
'SP_UID' => Util\Common::generateUID(),
'PRO_UID' => 0,
'TAS_UID' => 0,
'PRO_PARENT' => $proUid,
'TAS_PARENT' => $tasUid,
'SP_TYPE' => 'SIMPLE',
'SP_SYNCHRONOUS' => 0,
'SP_SYNCHRONOUS_TYPE' => 'ALL',
'SP_SYNCHRONOUS_WAIT' => 0,
'SP_VARIABLES_OUT' => '',
'SP_VARIABLES_IN' => '',
'SP_GRID_IN' => ''
);
self::log("Adding SubProcess with data: ", $data);
$spUid = $subProcess->create($data);
self::log("Adding SubProcess success!, created sp_uid: ", $spUid);
return $spUid;
} catch (\Exception $oError) {
throw ($oError);
}
}
public function removeSupProcess($proUid, $tasUid)
{
try {
$subProcess = \SubProcess::findByParents($proUid, $tasUid);
self::log("Remove SupProcess: ".$subProcess->getSpUid());
$subProcess->delete();
self::log("Remove SupProcess Success!");
} catch (\Exception $e) {
self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString());
throw $e;
}
}
public function updateSubProcess()
{
}
/**
* @param string $tasUid
* @param bool $value

View File

@@ -3,4 +3,65 @@ namespace ProcessMaker\Util;
class Common extends \Maveriks\Util\Common
{
/**
* Generate random number
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @return string
*/
public static function generateUID()
{
do {
$sUID = str_replace('.', '0', uniqid(rand(0, 999999999), true));
} while (strlen( $sUID ) != 32);
return $sUID;
}
/**
* Generate a numeric or alphanumeric code
*
* @author Julio Cesar Laura Avendaño <juliocesar@colosa.com>
* @access public
* @param int $iDigits
* @param string $sType
* @return string
*/
public function generateCode($iDigits = 4, $sType = 'NUMERIC')
{
if (($iDigits < 4) || ($iDigits > 50)) {
$iDigits = 4;
}
if (($sType != 'NUMERIC') && ($sType != 'ALPHA') && ($sType != 'ALPHANUMERIC')) {
$sType = 'NUMERIC';
}
$aValidCharacters = array(
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
);
switch ($sType) {
case 'NUMERIC':
$iMin = 0;
$iMax = 9;
break;
case 'ALPHA':
$iMin = 10;
$iMax = 35;
break;
case 'ALPHANUMERIC':
$iMin = 0;
$iMax = 35;
break;
}
$sCode = '';
for ($i = 0; $i < $iDigits; $i ++) {
$sCode .= $aValidCharacters[rand($iMin, $iMax)];
}
return $sCode;
}
}

View File

@@ -1,68 +0,0 @@
<?php
namespace ProcessMaker\Util;
class Hash
{
/**
* Generate random number
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @return string
*/
public static function generateUID()
{
do {
$sUID = str_replace('.', '0', uniqid(rand(0, 999999999), true));
} while (strlen( $sUID ) != 32);
return $sUID;
}
/**
* Generate a numeric or alphanumeric code
*
* @author Julio Cesar Laura Avendaño <juliocesar@colosa.com>
* @access public
* @param int $iDigits
* @param string $sType
* @return string
*/
public function generateCode($iDigits = 4, $sType = 'NUMERIC')
{
if (($iDigits < 4) || ($iDigits > 50)) {
$iDigits = 4;
}
if (($sType != 'NUMERIC') && ($sType != 'ALPHA') && ($sType != 'ALPHANUMERIC')) {
$sType = 'NUMERIC';
}
$aValidCharacters = array(
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
);
switch ($sType) {
case 'NUMERIC':
$iMin = 0;
$iMax = 9;
break;
case 'ALPHA':
$iMin = 10;
$iMax = 35;
break;
case 'ALPHANUMERIC':
$iMin = 0;
$iMax = 35;
break;
}
$sCode = '';
for ($i = 0; $i < $iDigits; $i ++) {
$sCode .= $aValidCharacters[rand($iMin, $iMax)];
}
return $sCode;
}
}

View File

@@ -119,7 +119,7 @@ class Project extends Api
$activity = $bwp->getActivity($activityData["ACT_UID"]);
if (is_null($activity)) {
$oldActUid = $activityData["ACT_UID"];
$activityData["ACT_UID"] = Util\Hash::generateUID();
$activityData["ACT_UID"] = Util\Common::generateUID();
$bwp->addActivity($activityData);
$result[] = array("object" => "activity", "new_uid" => $activityData["ACT_UID"], "old_uid" => $oldActUid);
} elseif (! $bwp->isEquals($activity, $activityData)) {
@@ -153,7 +153,7 @@ class Project extends Api
$gateway = $bwp->getGateway($gatewayData["GAT_UID"]);
if (is_null($gateway)) {
$oldActUid = $gatewayData["GAT_UID"];
$gatewayData["GAT_UID"] = Util\Hash::generateUID();
$gatewayData["GAT_UID"] = Util\Common::generateUID();
$bwp->addGateway($gatewayData);
$result[] = array("object" => "gateway", "new_uid" => $gatewayData["GAT_UID"], "old_uid" => $oldActUid);
} elseif (! $bwp->isEquals($gateway, $gatewayData)) {
@@ -192,7 +192,7 @@ class Project extends Api
$event = $bwp->getEvent($eventData["EVN_UID"]);
if (is_null($event)) {
$oldActUid = $eventData["EVN_UID"];
$eventData["EVN_UID"] = Util\Hash::generateUID();
$eventData["EVN_UID"] = Util\Common::generateUID();
$bwp->addEvent($eventData);
$result[] = array("object" => "event", "new_uid" => $eventData["EVN_UID"], "old_uid" => $oldActUid);
} elseif (! $bwp->isEquals($event, $eventData)) {
@@ -227,7 +227,7 @@ class Project extends Api
// if it is a new flow record
if (! \BpmnFlow::exists($flowData["FLO_UID"])) {
$oldFloUid = $flowData["FLO_UID"];
$flowData["FLO_UID"] = Util\Hash::generateUID();
$flowData["FLO_UID"] = Util\Common::generateUID();
$mappedUid = self::mapUid($flowData["FLO_ELEMENT_ORIGIN"], $result);
if ($mappedUid !== false) {