From 77a23e77144e29a06f55eaf29fe7d5e51e1ef187 Mon Sep 17 00:00:00 2001 From: Erik Amaru Ortiz Date: Mon, 3 Feb 2014 19:37:50 -0400 Subject: [PATCH] Refactoring Bpmn/Workflow handling layer (3rd commit) --- gulliver/bin/gulliver | 2 +- gulliver/system/class.bootstrap.php | 1 + .../engine/classes/model/BpmnActivity.php | 28 +- workflow/engine/classes/model/BpmnDiagram.php | 16 +- workflow/engine/classes/model/BpmnProcess.php | 17 +- workflow/engine/classes/model/BpmnProject.php | 10 +- .../model/map/BpmnProjectMapBuilder.php | 2 + .../classes/model/om/BaseBpmnProject.php | 156 +++++-- .../classes/model/om/BaseBpmnProjectPeer.php | 23 +- workflow/engine/config/schema.xml | 1 + workflow/engine/data/mysql/schema.sql | 1 + .../Project/Adapter/BpmnProject.php | 9 - .../Project/Adapter/WorkflowBpmnProject.php | 4 +- .../src/ProcessMaker/Project/BpmnProject.php | 421 ++++++++++++++++++ .../Project/{Adapter => }/WorkflowProject.php | 2 +- ...ctTest.php => BpmnWorkflowProjectTest.php} | 0 .../Tests/ProcessMaker/BpmnProjectTest.php | 112 +++++ .../ProcessMaker/WorkflowProjectTest.php | 257 +++++++++++ 18 files changed, 976 insertions(+), 86 deletions(-) delete mode 100644 workflow/engine/src/ProcessMaker/Project/Adapter/BpmnProject.php create mode 100644 workflow/engine/src/ProcessMaker/Project/BpmnProject.php rename workflow/engine/src/ProcessMaker/Project/{Adapter => }/WorkflowProject.php (99%) rename workflow/engine/src/Tests/ProcessMaker/Adapter/{WorkflowProjectTest.php => BpmnWorkflowProjectTest.php} (100%) create mode 100644 workflow/engine/src/Tests/ProcessMaker/BpmnProjectTest.php create mode 100644 workflow/engine/src/Tests/ProcessMaker/WorkflowProjectTest.php diff --git a/gulliver/bin/gulliver b/gulliver/bin/gulliver index 2aca4ed46..d690916a2 100755 --- a/gulliver/bin/gulliver +++ b/gulliver/bin/gulliver @@ -1,4 +1,4 @@ -#!/usr/bin/php +#!/usr/bin/env php addSelectColumn("BPMN_ACTIVITY.*"); $c->addSelectColumn("BPMN_BOUND.*"); @@ -107,6 +101,8 @@ class BpmnActivity extends BaseBpmnActivity } $returnType = ($returnType != 'array' && $returnType != 'object') ? 'array' : $returnType; + $activities = array(); + switch ($returnType) { case 'object': @@ -122,13 +118,13 @@ class BpmnActivity extends BaseBpmnActivity break; } - + return $activities; } - public function fromArray($data) + public function fromArray($data, $type = BasePeer::TYPE_FIELDNAME) { - parent::fromArray($data, BasePeer::TYPE_FIELDNAME); + parent::fromArray($data, $type); $bound = BpmnBound::findByElement('Activity', $this->getActUid()); @@ -142,12 +138,18 @@ class BpmnActivity extends BaseBpmnActivity $this->bound->fromArray($data, BasePeer::TYPE_FIELDNAME); } - public function toArray($keyType = BasePeer::TYPE_PHPNAME) + public function toArray($type = BasePeer::TYPE_FIELDNAME) { - $data = parent::toArray($keyType); + $data = parent::toArray($type); + $bouUid = $this->bound->getBouUid(); - if (is_object($this->bound) && get_class($this->bound) == 'BpmnBound') { - $data = array_merge($data, $this->bound->toArray($keyType)); + if (empty($bouUid)) { + $bound = BpmnBound::findByElement('Activity', $this->getActUid()); + + if (is_object($bound)) { + $this->bound = $bound; + $data = array_merge($data, $this->bound->toArray($type)); + } } return $data; diff --git a/workflow/engine/classes/model/BpmnDiagram.php b/workflow/engine/classes/model/BpmnDiagram.php index dac466de0..38a90440e 100644 --- a/workflow/engine/classes/model/BpmnDiagram.php +++ b/workflow/engine/classes/model/BpmnDiagram.php @@ -14,6 +14,20 @@ require_once 'classes/model/om/BaseBpmnDiagram.php'; * * @package classes.model */ -class BpmnDiagram extends BaseBpmnDiagram { +class BpmnDiagram extends BaseBpmnDiagram +{ + public static function findAllByProUid($prjUid) + { + $c = new Criteria("workflow"); + $c->add(BpmnDiagramPeer::PRJ_UID, $prjUid); + return BpmnDiagramPeer::doSelect($c); + } + + // Overrides + + public function toArray($type = BasePeer::TYPE_FIELDNAME) + { + return parent::toArray($type); + } } // BpmnDiagram diff --git a/workflow/engine/classes/model/BpmnProcess.php b/workflow/engine/classes/model/BpmnProcess.php index 575155419..2b0c54646 100644 --- a/workflow/engine/classes/model/BpmnProcess.php +++ b/workflow/engine/classes/model/BpmnProcess.php @@ -14,6 +14,21 @@ require_once 'classes/model/om/BaseBpmnProcess.php'; * * @package classes.model */ -class BpmnProcess extends BaseBpmnProcess { +class BpmnProcess extends BaseBpmnProcess +{ + public static function findAllByProUid($prjUid) + { + $c = new Criteria("workflow"); + $c->add(BpmnProcessPeer::PRJ_UID, $prjUid); + return BpmnProcessPeer::doSelect($c); + } + + + // Overrides + + public function toArray($type = BasePeer::TYPE_FIELDNAME) + { + return parent::toArray($type); + } } // BpmnProcess diff --git a/workflow/engine/classes/model/BpmnProject.php b/workflow/engine/classes/model/BpmnProject.php index d714ded97..75f95a38d 100644 --- a/workflow/engine/classes/model/BpmnProject.php +++ b/workflow/engine/classes/model/BpmnProject.php @@ -14,6 +14,14 @@ require_once 'classes/model/om/BaseBpmnProject.php'; * * @package classes.model */ -class BpmnProject extends BaseBpmnProject { +class BpmnProject extends BaseBpmnProject +{ + + // Overrides + + public function toArray($type = BasePeer::TYPE_FIELDNAME) + { + return parent::toArray($type); + } } // BpmnProject diff --git a/workflow/engine/classes/model/map/BpmnProjectMapBuilder.php b/workflow/engine/classes/model/map/BpmnProjectMapBuilder.php index 4951dfb6a..c643dbf70 100644 --- a/workflow/engine/classes/model/map/BpmnProjectMapBuilder.php +++ b/workflow/engine/classes/model/map/BpmnProjectMapBuilder.php @@ -69,6 +69,8 @@ class BpmnProjectMapBuilder $tMap->addColumn('PRJ_NAME', 'PrjName', 'string', CreoleTypes::VARCHAR, true, 255); + $tMap->addColumn('PRJ_DESCRIPTION', 'PrjDescription', 'string', CreoleTypes::VARCHAR, false, 512); + $tMap->addColumn('PRJ_TARGET_NAMESPACE', 'PrjTargetNamespace', 'string', CreoleTypes::LONGVARCHAR, true, null); $tMap->addColumn('PRJ_EXPRESION_LANGUAGE', 'PrjExpresionLanguage', 'string', CreoleTypes::LONGVARCHAR, false, null); diff --git a/workflow/engine/classes/model/om/BaseBpmnProject.php b/workflow/engine/classes/model/om/BaseBpmnProject.php index c33580ee1..c3af936dd 100644 --- a/workflow/engine/classes/model/om/BaseBpmnProject.php +++ b/workflow/engine/classes/model/om/BaseBpmnProject.php @@ -39,6 +39,12 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent */ protected $prj_name = ''; + /** + * The value for the prj_description field. + * @var string + */ + protected $prj_description; + /** * The value for the prj_target_namespace field. * @var string @@ -303,6 +309,17 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent return $this->prj_name; } + /** + * Get the [prj_description] column value. + * + * @return string + */ + public function getPrjDescription() + { + + return $this->prj_description; + } + /** * Get the [prj_target_namespace] column value. * @@ -499,6 +516,28 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent } // setPrjName() + /** + * Set the value of [prj_description] column. + * + * @param string $v new value + * @return void + */ + public function setPrjDescription($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->prj_description !== $v) { + $this->prj_description = $v; + $this->modifiedColumns[] = BpmnProjectPeer::PRJ_DESCRIPTION; + } + + } // setPrjDescription() + /** * Set the value of [prj_target_namespace] column. * @@ -746,32 +785,34 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent $this->prj_name = $rs->getString($startcol + 1); - $this->prj_target_namespace = $rs->getString($startcol + 2); + $this->prj_description = $rs->getString($startcol + 2); - $this->prj_expresion_language = $rs->getString($startcol + 3); + $this->prj_target_namespace = $rs->getString($startcol + 3); - $this->prj_type_language = $rs->getString($startcol + 4); + $this->prj_expresion_language = $rs->getString($startcol + 4); - $this->prj_exporter = $rs->getString($startcol + 5); + $this->prj_type_language = $rs->getString($startcol + 5); - $this->prj_exporter_version = $rs->getString($startcol + 6); + $this->prj_exporter = $rs->getString($startcol + 6); - $this->prj_create_date = $rs->getTimestamp($startcol + 7, null); + $this->prj_exporter_version = $rs->getString($startcol + 7); - $this->prj_update_date = $rs->getTimestamp($startcol + 8, null); + $this->prj_create_date = $rs->getTimestamp($startcol + 8, null); - $this->prj_author = $rs->getString($startcol + 9); + $this->prj_update_date = $rs->getTimestamp($startcol + 9, null); - $this->prj_author_version = $rs->getString($startcol + 10); + $this->prj_author = $rs->getString($startcol + 10); - $this->prj_original_source = $rs->getString($startcol + 11); + $this->prj_author_version = $rs->getString($startcol + 11); + + $this->prj_original_source = $rs->getString($startcol + 12); $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 12; // 12 = BpmnProjectPeer::NUM_COLUMNS - BpmnProjectPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 13; // 13 = BpmnProjectPeer::NUM_COLUMNS - BpmnProjectPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating BpmnProject object", $e); @@ -1206,33 +1247,36 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent return $this->getPrjName(); break; case 2: - return $this->getPrjTargetNamespace(); + return $this->getPrjDescription(); break; case 3: - return $this->getPrjExpresionLanguage(); + return $this->getPrjTargetNamespace(); break; case 4: - return $this->getPrjTypeLanguage(); + return $this->getPrjExpresionLanguage(); break; case 5: - return $this->getPrjExporter(); + return $this->getPrjTypeLanguage(); break; case 6: - return $this->getPrjExporterVersion(); + return $this->getPrjExporter(); break; case 7: - return $this->getPrjCreateDate(); + return $this->getPrjExporterVersion(); break; case 8: - return $this->getPrjUpdateDate(); + return $this->getPrjCreateDate(); break; case 9: - return $this->getPrjAuthor(); + return $this->getPrjUpdateDate(); break; case 10: - return $this->getPrjAuthorVersion(); + return $this->getPrjAuthor(); break; case 11: + return $this->getPrjAuthorVersion(); + break; + case 12: return $this->getPrjOriginalSource(); break; default: @@ -1257,16 +1301,17 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent $result = array( $keys[0] => $this->getPrjUid(), $keys[1] => $this->getPrjName(), - $keys[2] => $this->getPrjTargetNamespace(), - $keys[3] => $this->getPrjExpresionLanguage(), - $keys[4] => $this->getPrjTypeLanguage(), - $keys[5] => $this->getPrjExporter(), - $keys[6] => $this->getPrjExporterVersion(), - $keys[7] => $this->getPrjCreateDate(), - $keys[8] => $this->getPrjUpdateDate(), - $keys[9] => $this->getPrjAuthor(), - $keys[10] => $this->getPrjAuthorVersion(), - $keys[11] => $this->getPrjOriginalSource(), + $keys[2] => $this->getPrjDescription(), + $keys[3] => $this->getPrjTargetNamespace(), + $keys[4] => $this->getPrjExpresionLanguage(), + $keys[5] => $this->getPrjTypeLanguage(), + $keys[6] => $this->getPrjExporter(), + $keys[7] => $this->getPrjExporterVersion(), + $keys[8] => $this->getPrjCreateDate(), + $keys[9] => $this->getPrjUpdateDate(), + $keys[10] => $this->getPrjAuthor(), + $keys[11] => $this->getPrjAuthorVersion(), + $keys[12] => $this->getPrjOriginalSource(), ); return $result; } @@ -1305,33 +1350,36 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent $this->setPrjName($value); break; case 2: - $this->setPrjTargetNamespace($value); + $this->setPrjDescription($value); break; case 3: - $this->setPrjExpresionLanguage($value); + $this->setPrjTargetNamespace($value); break; case 4: - $this->setPrjTypeLanguage($value); + $this->setPrjExpresionLanguage($value); break; case 5: - $this->setPrjExporter($value); + $this->setPrjTypeLanguage($value); break; case 6: - $this->setPrjExporterVersion($value); + $this->setPrjExporter($value); break; case 7: - $this->setPrjCreateDate($value); + $this->setPrjExporterVersion($value); break; case 8: - $this->setPrjUpdateDate($value); + $this->setPrjCreateDate($value); break; case 9: - $this->setPrjAuthor($value); + $this->setPrjUpdateDate($value); break; case 10: - $this->setPrjAuthorVersion($value); + $this->setPrjAuthor($value); break; case 11: + $this->setPrjAuthorVersion($value); + break; + case 12: $this->setPrjOriginalSource($value); break; } // switch() @@ -1366,43 +1414,47 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent } if (array_key_exists($keys[2], $arr)) { - $this->setPrjTargetNamespace($arr[$keys[2]]); + $this->setPrjDescription($arr[$keys[2]]); } if (array_key_exists($keys[3], $arr)) { - $this->setPrjExpresionLanguage($arr[$keys[3]]); + $this->setPrjTargetNamespace($arr[$keys[3]]); } if (array_key_exists($keys[4], $arr)) { - $this->setPrjTypeLanguage($arr[$keys[4]]); + $this->setPrjExpresionLanguage($arr[$keys[4]]); } if (array_key_exists($keys[5], $arr)) { - $this->setPrjExporter($arr[$keys[5]]); + $this->setPrjTypeLanguage($arr[$keys[5]]); } if (array_key_exists($keys[6], $arr)) { - $this->setPrjExporterVersion($arr[$keys[6]]); + $this->setPrjExporter($arr[$keys[6]]); } if (array_key_exists($keys[7], $arr)) { - $this->setPrjCreateDate($arr[$keys[7]]); + $this->setPrjExporterVersion($arr[$keys[7]]); } if (array_key_exists($keys[8], $arr)) { - $this->setPrjUpdateDate($arr[$keys[8]]); + $this->setPrjCreateDate($arr[$keys[8]]); } if (array_key_exists($keys[9], $arr)) { - $this->setPrjAuthor($arr[$keys[9]]); + $this->setPrjUpdateDate($arr[$keys[9]]); } if (array_key_exists($keys[10], $arr)) { - $this->setPrjAuthorVersion($arr[$keys[10]]); + $this->setPrjAuthor($arr[$keys[10]]); } if (array_key_exists($keys[11], $arr)) { - $this->setPrjOriginalSource($arr[$keys[11]]); + $this->setPrjAuthorVersion($arr[$keys[11]]); + } + + if (array_key_exists($keys[12], $arr)) { + $this->setPrjOriginalSource($arr[$keys[12]]); } } @@ -1424,6 +1476,10 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent $criteria->add(BpmnProjectPeer::PRJ_NAME, $this->prj_name); } + if ($this->isColumnModified(BpmnProjectPeer::PRJ_DESCRIPTION)) { + $criteria->add(BpmnProjectPeer::PRJ_DESCRIPTION, $this->prj_description); + } + if ($this->isColumnModified(BpmnProjectPeer::PRJ_TARGET_NAMESPACE)) { $criteria->add(BpmnProjectPeer::PRJ_TARGET_NAMESPACE, $this->prj_target_namespace); } @@ -1520,6 +1576,8 @@ abstract class BaseBpmnProject extends BaseObject implements Persistent $copyObj->setPrjName($this->prj_name); + $copyObj->setPrjDescription($this->prj_description); + $copyObj->setPrjTargetNamespace($this->prj_target_namespace); $copyObj->setPrjExpresionLanguage($this->prj_expresion_language); diff --git a/workflow/engine/classes/model/om/BaseBpmnProjectPeer.php b/workflow/engine/classes/model/om/BaseBpmnProjectPeer.php index a6af6d495..fca48fad4 100644 --- a/workflow/engine/classes/model/om/BaseBpmnProjectPeer.php +++ b/workflow/engine/classes/model/om/BaseBpmnProjectPeer.php @@ -25,7 +25,7 @@ abstract class BaseBpmnProjectPeer const CLASS_DEFAULT = 'classes.model.BpmnProject'; /** The total number of columns. */ - const NUM_COLUMNS = 12; + const NUM_COLUMNS = 13; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -37,6 +37,9 @@ abstract class BaseBpmnProjectPeer /** the column name for the PRJ_NAME field */ const PRJ_NAME = 'BPMN_PROJECT.PRJ_NAME'; + /** the column name for the PRJ_DESCRIPTION field */ + const PRJ_DESCRIPTION = 'BPMN_PROJECT.PRJ_DESCRIPTION'; + /** the column name for the PRJ_TARGET_NAMESPACE field */ const PRJ_TARGET_NAMESPACE = 'BPMN_PROJECT.PRJ_TARGET_NAMESPACE'; @@ -78,10 +81,10 @@ abstract class BaseBpmnProjectPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('PrjUid', 'PrjName', 'PrjTargetNamespace', 'PrjExpresionLanguage', 'PrjTypeLanguage', 'PrjExporter', 'PrjExporterVersion', 'PrjCreateDate', 'PrjUpdateDate', 'PrjAuthor', 'PrjAuthorVersion', 'PrjOriginalSource', ), - BasePeer::TYPE_COLNAME => array (BpmnProjectPeer::PRJ_UID, BpmnProjectPeer::PRJ_NAME, BpmnProjectPeer::PRJ_TARGET_NAMESPACE, BpmnProjectPeer::PRJ_EXPRESION_LANGUAGE, BpmnProjectPeer::PRJ_TYPE_LANGUAGE, BpmnProjectPeer::PRJ_EXPORTER, BpmnProjectPeer::PRJ_EXPORTER_VERSION, BpmnProjectPeer::PRJ_CREATE_DATE, BpmnProjectPeer::PRJ_UPDATE_DATE, BpmnProjectPeer::PRJ_AUTHOR, BpmnProjectPeer::PRJ_AUTHOR_VERSION, BpmnProjectPeer::PRJ_ORIGINAL_SOURCE, ), - BasePeer::TYPE_FIELDNAME => array ('PRJ_UID', 'PRJ_NAME', 'PRJ_TARGET_NAMESPACE', 'PRJ_EXPRESION_LANGUAGE', 'PRJ_TYPE_LANGUAGE', 'PRJ_EXPORTER', 'PRJ_EXPORTER_VERSION', 'PRJ_CREATE_DATE', 'PRJ_UPDATE_DATE', 'PRJ_AUTHOR', 'PRJ_AUTHOR_VERSION', 'PRJ_ORIGINAL_SOURCE', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) + BasePeer::TYPE_PHPNAME => array ('PrjUid', 'PrjName', 'PrjDescription', 'PrjTargetNamespace', 'PrjExpresionLanguage', 'PrjTypeLanguage', 'PrjExporter', 'PrjExporterVersion', 'PrjCreateDate', 'PrjUpdateDate', 'PrjAuthor', 'PrjAuthorVersion', 'PrjOriginalSource', ), + BasePeer::TYPE_COLNAME => array (BpmnProjectPeer::PRJ_UID, BpmnProjectPeer::PRJ_NAME, BpmnProjectPeer::PRJ_DESCRIPTION, BpmnProjectPeer::PRJ_TARGET_NAMESPACE, BpmnProjectPeer::PRJ_EXPRESION_LANGUAGE, BpmnProjectPeer::PRJ_TYPE_LANGUAGE, BpmnProjectPeer::PRJ_EXPORTER, BpmnProjectPeer::PRJ_EXPORTER_VERSION, BpmnProjectPeer::PRJ_CREATE_DATE, BpmnProjectPeer::PRJ_UPDATE_DATE, BpmnProjectPeer::PRJ_AUTHOR, BpmnProjectPeer::PRJ_AUTHOR_VERSION, BpmnProjectPeer::PRJ_ORIGINAL_SOURCE, ), + BasePeer::TYPE_FIELDNAME => array ('PRJ_UID', 'PRJ_NAME', 'PRJ_DESCRIPTION', 'PRJ_TARGET_NAMESPACE', 'PRJ_EXPRESION_LANGUAGE', 'PRJ_TYPE_LANGUAGE', 'PRJ_EXPORTER', 'PRJ_EXPORTER_VERSION', 'PRJ_CREATE_DATE', 'PRJ_UPDATE_DATE', 'PRJ_AUTHOR', 'PRJ_AUTHOR_VERSION', 'PRJ_ORIGINAL_SOURCE', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) ); /** @@ -91,10 +94,10 @@ abstract class BaseBpmnProjectPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('PrjUid' => 0, 'PrjName' => 1, 'PrjTargetNamespace' => 2, 'PrjExpresionLanguage' => 3, 'PrjTypeLanguage' => 4, 'PrjExporter' => 5, 'PrjExporterVersion' => 6, 'PrjCreateDate' => 7, 'PrjUpdateDate' => 8, 'PrjAuthor' => 9, 'PrjAuthorVersion' => 10, 'PrjOriginalSource' => 11, ), - BasePeer::TYPE_COLNAME => array (BpmnProjectPeer::PRJ_UID => 0, BpmnProjectPeer::PRJ_NAME => 1, BpmnProjectPeer::PRJ_TARGET_NAMESPACE => 2, BpmnProjectPeer::PRJ_EXPRESION_LANGUAGE => 3, BpmnProjectPeer::PRJ_TYPE_LANGUAGE => 4, BpmnProjectPeer::PRJ_EXPORTER => 5, BpmnProjectPeer::PRJ_EXPORTER_VERSION => 6, BpmnProjectPeer::PRJ_CREATE_DATE => 7, BpmnProjectPeer::PRJ_UPDATE_DATE => 8, BpmnProjectPeer::PRJ_AUTHOR => 9, BpmnProjectPeer::PRJ_AUTHOR_VERSION => 10, BpmnProjectPeer::PRJ_ORIGINAL_SOURCE => 11, ), - BasePeer::TYPE_FIELDNAME => array ('PRJ_UID' => 0, 'PRJ_NAME' => 1, 'PRJ_TARGET_NAMESPACE' => 2, 'PRJ_EXPRESION_LANGUAGE' => 3, 'PRJ_TYPE_LANGUAGE' => 4, 'PRJ_EXPORTER' => 5, 'PRJ_EXPORTER_VERSION' => 6, 'PRJ_CREATE_DATE' => 7, 'PRJ_UPDATE_DATE' => 8, 'PRJ_AUTHOR' => 9, 'PRJ_AUTHOR_VERSION' => 10, 'PRJ_ORIGINAL_SOURCE' => 11, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) + BasePeer::TYPE_PHPNAME => array ('PrjUid' => 0, 'PrjName' => 1, 'PrjDescription' => 2, 'PrjTargetNamespace' => 3, 'PrjExpresionLanguage' => 4, 'PrjTypeLanguage' => 5, 'PrjExporter' => 6, 'PrjExporterVersion' => 7, 'PrjCreateDate' => 8, 'PrjUpdateDate' => 9, 'PrjAuthor' => 10, 'PrjAuthorVersion' => 11, 'PrjOriginalSource' => 12, ), + BasePeer::TYPE_COLNAME => array (BpmnProjectPeer::PRJ_UID => 0, BpmnProjectPeer::PRJ_NAME => 1, BpmnProjectPeer::PRJ_DESCRIPTION => 2, BpmnProjectPeer::PRJ_TARGET_NAMESPACE => 3, BpmnProjectPeer::PRJ_EXPRESION_LANGUAGE => 4, BpmnProjectPeer::PRJ_TYPE_LANGUAGE => 5, BpmnProjectPeer::PRJ_EXPORTER => 6, BpmnProjectPeer::PRJ_EXPORTER_VERSION => 7, BpmnProjectPeer::PRJ_CREATE_DATE => 8, BpmnProjectPeer::PRJ_UPDATE_DATE => 9, BpmnProjectPeer::PRJ_AUTHOR => 10, BpmnProjectPeer::PRJ_AUTHOR_VERSION => 11, BpmnProjectPeer::PRJ_ORIGINAL_SOURCE => 12, ), + BasePeer::TYPE_FIELDNAME => array ('PRJ_UID' => 0, 'PRJ_NAME' => 1, 'PRJ_DESCRIPTION' => 2, 'PRJ_TARGET_NAMESPACE' => 3, 'PRJ_EXPRESION_LANGUAGE' => 4, 'PRJ_TYPE_LANGUAGE' => 5, 'PRJ_EXPORTER' => 6, 'PRJ_EXPORTER_VERSION' => 7, 'PRJ_CREATE_DATE' => 8, 'PRJ_UPDATE_DATE' => 9, 'PRJ_AUTHOR' => 10, 'PRJ_AUTHOR_VERSION' => 11, 'PRJ_ORIGINAL_SOURCE' => 12, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) ); /** @@ -199,6 +202,8 @@ abstract class BaseBpmnProjectPeer $criteria->addSelectColumn(BpmnProjectPeer::PRJ_NAME); + $criteria->addSelectColumn(BpmnProjectPeer::PRJ_DESCRIPTION); + $criteria->addSelectColumn(BpmnProjectPeer::PRJ_TARGET_NAMESPACE); $criteria->addSelectColumn(BpmnProjectPeer::PRJ_EXPRESION_LANGUAGE); diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index ab6d508ef..3870eae6a 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -3099,6 +3099,7 @@ + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 69a522a65..38ddd068d 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -1600,6 +1600,7 @@ CREATE TABLE `BPMN_PROJECT` ( `PRJ_UID` VARCHAR(32) default '' NOT NULL, `PRJ_NAME` VARCHAR(255) default '' NOT NULL, + `PRJ_DESCRIPTION` VARCHAR(512), `PRJ_TARGET_NAMESPACE` MEDIUMTEXT NOT NULL, `PRJ_EXPRESION_LANGUAGE` MEDIUMTEXT, `PRJ_TYPE_LANGUAGE` MEDIUMTEXT, diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnProject.php b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnProject.php deleted file mode 100644 index 78afbece3..000000000 --- a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnProject.php +++ /dev/null @@ -1,9 +0,0 @@ - 'act_uid', + 'events' => 'evn_uid', + 'flows' => 'flo_uid', + 'artifacts' => 'art_uid', + 'laneset' => 'lns_uid', + 'lanes' => 'lan_uid' + ); + + /** + * @var \BpmnProject + */ + protected $project; + + /** + * @var \BpmnProcess + */ + protected $process; + + /** + * @var \BpmnDiagram + */ + protected $diagram; + + /** + * @var array of \BpmnActivities objects + */ + protected $activities = array(); + + /** + * @var array of \BpmnEvents objects + */ + protected $events = array(); + + /** + * @var array on \BpmnFlow objects + */ + protected $flows = array(); + + /** + * @var array of \BpmnArtifact objects + */ + protected $artifacts = array(); + + /** + * @var array of \BpmnLaneset objects + */ + protected $laneset = array(); + + /** + * @var array of \BpmnLanes objects + */ + protected $lanes = array(); + + + public function __construct($data = null) + { + if (! is_null($data)) { + $this->create($data); + } + } + + public static function load($prjUid) + { + $me = new BpmnProject(); + $me->project = ProjectPeer::retrieveByPK($prjUid); + + return $me; + } + + /** + * @param array|null $data optional array attributes to create and initialize a BpmnProject + */ + public function create($data) + { + // setting defaults + $data['PRJ_UID'] = array_key_exists('PRJ_UID', $data) ? $data['PRJ_UID'] : Hash::generateUID(); + + $this->project = new Project(); + $this->project->fromArray($data, BasePeer::TYPE_FIELDNAME); + $this->project->setPrjCreateDate(date("Y-m-d H:i:s")); + $this->project->save(); + } + + public function addDiagram($data = array()) + { + if (empty($this->project)) { + throw new \Exception("Error: There is not an initialized project."); + } + + // setting defaults + $data['DIA_UID'] = array_key_exists('DIA_UID', $data) ? $data['DIA_UID'] : Hash::generateUID(); + $data['DIA_NAME'] = array_key_exists('DIA_NAME', $data) ? $data['DIA_NAME'] : $this->project->getPrjName(); + + $this->diagram = new Diagram(); + $this->diagram->fromArray($data, BasePeer::TYPE_FIELDNAME); + $this->diagram->setPrjUid($this->project->getPrjUid()); + $this->diagram->save(); + } + + public function addProcess($data = array()) + { + if (empty($this->diagram)) { + throw new \Exception("Error: There is not an initialized diagram."); + } + + // setting defaults + $data['PRO_UID'] = array_key_exists('PRO_UID', $data) ? $data['PRO_UID'] : Hash::generateUID();; + $data['PRO_NAME'] = array_key_exists('PRO_NAME', $data) ? $data['PRO_NAME'] : $this->diagram->getDiaName(); + + $this->process = new Process(); + $this->process->fromArray($data, BasePeer::TYPE_FIELDNAME); + $this->process->setPrjUid($this->project->getPrjUid()); + $this->process->setDiaUid($this->getDiagram("object")->getDiaUid()); + $this->process->save(); + } + + public function addActivity($data) + { + if (empty($this->diagram)) { + throw new \Exception("Error: There is not an initialized diagram."); + } + + // setting defaults + $data['ACT_UID'] = array_key_exists('ACT_UID', $data) ? $data['ACT_UID'] : Hash::generateUID();; + + $activity = new Activity(); + $activity->fromArray($data); + $activity->setPrjUid($this->project->getPrjUid()); + $activity->setProUid($this->getProcess("object")->getProUid()); + $activity->save(); + + $this->activities[$activity->getActUid()] = $activity; + } + + public function getActivity($actUid) + { + if (empty($this->activities) || ! array_key_exists($actUid, $this->activities)) { + $activity = ActivityPeer::retrieveByPK($actUid); + + if (! is_object($activity)) { + return null; + } + + $this->activities[$actUid] = $activity; + } + + return $this->activities[$actUid]; + } + + public function getActivities() + { + if (empty($this->activities)) { + $this->activities = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object'); + } + + $activitiesList = array(); + + foreach ($this->activities as $activity) { + $activitiesList[] = $activity->toArray(); + } + + return $activitiesList; + } + + public function addEvent($data) + { + // setting defaults + $data['EVN_UID'] = array_key_exists('EVN_UID', $data) ? $data['EVN_UID'] : Hash::generateUID();; + + $event = new Event(); + $event->fromArray($data); + $event->setPrjUid($this->project->getPrjUid()); + $event->setProUid($this->getProcess("object")->getProUid()); + $event->save(); + + $this->events[$event->getEvnUid()] = $event; + } + + public function getEvent($evnUid) + { + if (empty($this->events) || ! array_key_exists($evnUid, $this->activities)) { + $event = EventPeer::retrieveByPK($evnUid); + + if (! is_object($event)) { + return null; + } + + $this->events[$evnUid] = $event; + } + + return $this->events[$evnUid]; + } + + public function getEvents() + { + if (empty($this->events)) { + $this->events = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object'); + } + + $eventsList = array(); + + foreach ($this->events as $event) { + $eventsList[] = $event->toArray(); + } + + return $eventsList; + } + + public function addGateway($data) + { + // setting defaults + $data['GAT_UID'] = array_key_exists('GAT_UID', $data) ? $data['GAT_UID'] : Hash::generateUID();; + + $gateway = new Gateway(); + $gateway->fromArray($data); + $gateway->setPrjUid($this->project->getPrjUid()); + $gateway->setProUid($this->getProcess("object")->getProUid()); + $gateway->save(); + + $this->gateways[$gateway->getGatUid()] = $gateway; + } + + public function getGateway($gatUid) + { + if (empty($this->gateways) || ! array_key_exists($gatUid, $this->gateways)) { + $gateway = GatewayPeer::retrieveByPK($gatUid); + + if (! is_object($gateway)) { + return null; + } + + $this->gateways[$gatUid] = $gateway; + } + + return $this->gateways[$gatUid]; + } + + public function getGateways() + { + if (empty($this->gateways)) { + $this->gateways = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object'); + } + + $gatewaysList = array(); + + foreach ($this->gateways as $gateway) { + $gatewaysList[] = $gateway->toArray(); + } + + return $gatewaysList; + } + + public function addFlow($data) + { + // setting defaults + $data['GAT_UID'] = array_key_exists('GAT_UID', $data) ? $data['GAT_UID'] : Hash::generateUID();; + $data['FLO_STATE'] = json_encode($data['FLO_STATE']); + + $flow = new Flow(); + $flow->fromArray($data, BasePeer::TYPE_FIELDNAME); + $flow->setPrjUid($this->project->getPrjUid()); + $flow->setDiaUid($this->getDiagram("object")->getDiaUid()); + $flow->save(); + } + + public function getFlow($floUid) + { + if (empty($this->flows) || ! array_key_exists($floUid, $this->flows)) { + $flow = GatewayPeer::retrieveByPK($floUid); + + if (! is_object($flow)) { + return null; + } + + $this->flows[$floUid] = $flow; + } + + return $this->flows[$floUid]; + } + + public function getFlows() + { + if (empty($this->flows)) { + $this->flows = Activity::getAll($this->project->getPrjUid(), null, null, '', 'object'); + } + + $flowsList = array(); + + foreach ($this->flows as $flow) { + $flowsList[] = $flow->toArray(); + } + + return $flowsList; + } + + public function addArtifact($data) + { + // TODO: Implement update() method. + } + + public function getArtifact($artUid) + { + // TODO: Implement update() method. + } + + public function getArtifacts() + { + // TODO: Implement update() method. + } + + public function addLane($data) + { + // TODO: Implement update() method. + } + + public function getLane($lanUid) + { + // TODO: Implement update() method. + } + + public function getLanes() + { + // TODO: Implement update() method. + } + + public function addLaneset($data) + { + // TODO: Implement update() method. + } + + public function getLaneset($lnsUid) + { + // TODO: Implement update() method. + } + + public function getLanesets() + { + // TODO: Implement update() method. + } + + + + // getters + + public function getUid() + { + if (empty($this->project)) { + throw new \Exception("Error: There is not an initialized project."); + } + + return $this->project->getPrjUid(); + } + + public function getProject($retType = "array") + { + return $retType == "array" ? $this->project->toArray() : $this->project; + } + + public function getDiagram($retType = "array") + { + if (empty($this->diagram)) { + $diagrams = Diagram::findAllByProUid($this->getUid()); + + if (! empty($diagrams)) { + //NOTICE for ProcessMaker we're just handling a "one to one" relationship between project and process + $this->diagram = $diagrams[0]; + } + } + + return $retType == "array" ? $this->diagram->toArray() : $this->diagram; + } + + public function getProcess($retType = "array") + { + if (empty($this->process)) { + $processes = Process::findAllByProUid($this->getUid()); + + if (! empty($processes)) { + //NOTICE for ProcessMaker we're just handling a "one to one" relationship between project and process + $this->process = $processes[0]; + } + } + + return $retType == "array" ? $this->process->toArray() : $this->process; + } +} \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowProject.php b/workflow/engine/src/ProcessMaker/Project/WorkflowProject.php similarity index 99% rename from workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowProject.php rename to workflow/engine/src/ProcessMaker/Project/WorkflowProject.php index c2a143d5f..6d3cad07f 100644 --- a/workflow/engine/src/ProcessMaker/Project/Adapter/WorkflowProject.php +++ b/workflow/engine/src/ProcessMaker/Project/WorkflowProject.php @@ -1,5 +1,5 @@ "Test BPMN Project #1", + "PRJ_DESCRIPTION" => "Description for - Test BPMN Project #1", + "PRJ_AUTHOR" => "00000000000000000000000000000001" + ); + + // Create a new BpmnProject and save to DB + $bp = new BpmnProject($data); + $projectData = $bp->getProject(); + + foreach ($data as $key => $value) { + $this->assertEquals($value, $projectData[$key]); + } + + return $bp; + } + + /** + * @depends testCreate + * @var $bp \ProcessMaker\Project\BpmnProject + */ + public function testAddDiagram($bp) + { + $data = array( + "DIA_NAME" => "Sample Diagram #1" + ); + + // Save to DB + $bp->addDiagram($data); + + // Load from DB + $bpLoaded = BpmnProject::load($bp->getUid()); + $diagramData = $bpLoaded->getDiagram(); + + $this->assertEquals($data["DIA_NAME"], $diagramData["DIA_NAME"]); + $this->assertEquals($bp->getUid(), $diagramData["PRJ_UID"]); + } + + /** + * @depends testCreate + * @var $bp \ProcessMaker\Project\BpmnProject + */ + public function testAddProcess($bp) + { + $data = array( + "PRO_NAME" => "Sample Process #1" + ); + + $diagramData = $bp->getDiagram(); + + // Save to DB + $bp->addProcess($data); + + // Load from DB + $bpLoaded = BpmnProject::load($bp->getUid()); + $processData = $bpLoaded->getProcess(); + + + $this->assertEquals($data["PRO_NAME"], $processData["PRO_NAME"]); + $this->assertEquals($bp->getUid(), $processData["PRJ_UID"]); + $this->assertEquals($diagramData['DIA_UID'], $processData["DIA_UID"]); + } + + /** + * @depends testCreate + * @var $bp \ProcessMaker\Project\BpmnProject + */ + public function testAddActivity($bp) + { + $data = array( + "ACT_NAME" => "Activity #1", + "BOU_X" => "50", + "BOU_Y" => "50" + ); + + $processData = $bp->getProcess(); + + + // Save to DB + $bp->addActivity($data); + + // Load from DB + $bpLoaded = BpmnProject::load($bp->getUid()); + $activities = $bpLoaded->getActivities(); + + $this->assertCount(1, $activities); + + $activityData = $activities[0]; + + foreach ($data as $key => $value) { + $this->assertEquals($value, $activityData[$key]); + } + + $this->assertEquals($bpLoaded->getUid(), $activityData["PRJ_UID"]); + $this->assertEquals($processData["PRO_UID"], $activityData["PRO_UID"]); + } +} + diff --git a/workflow/engine/src/Tests/ProcessMaker/WorkflowProjectTest.php b/workflow/engine/src/Tests/ProcessMaker/WorkflowProjectTest.php new file mode 100644 index 000000000..a3a5a12cd --- /dev/null +++ b/workflow/engine/src/Tests/ProcessMaker/WorkflowProjectTest.php @@ -0,0 +1,257 @@ +workflowProject = new WorkflowProject(); + } + + public function testCreate() + { + $data = array( + "PRO_TITLE" => "Test Project #1", + "PRO_DESCRIPTION" => "Description for - Test Project #1", + "PRO_CATEGORY" => "", + "PRO_CREATE_USER" => "00000000000000000000000000000001" + ); + + $wp = new WorkflowProject($data); + + $processData = $wp->getProperties(); + + foreach ($data as $key => $value) { + $this->assertEquals($data[$key], $processData[$key]); + } + + return $wp; + } + + /** + * @depends testCreate + */ + public function testAddTask($wp) + { + $data = array( + "TAS_TITLE" => "task #1", + "TAS_DESCRIPTION" => "Description for task #1", + "TAS_POSX" => "50", + "TAS_POSY" => "50", + "TAS_WIDTH" => "100", + "TAS_HEIGHT" => "25" + ); + + $tasUid = $wp->addTask($data); + + $taskData = $wp->getTask($tasUid); + + foreach ($data as $key => $value) { + $this->assertEquals($data[$key], $taskData[$key]); + } + } + + /** + * @depends testCreate + */ + public function testUpdateTask($wp) + { + $data = array( + "TAS_TITLE" => "task #1 (updated)", + "TAS_POSX" => "150", + "TAS_POSY" => "250" + ); + + // at this time, there is only one task + $tasks = $wp->getTasks(); + $this->assertInternalType('array', $tasks); + $this->assertCount(1, $tasks); + + $wp->updateTask($tasks[0]['TAS_UID'], $data); + $taskData = $wp->getTask($tasks[0]['TAS_UID']); + + foreach ($data as $key => $value) { + $this->assertEquals($data[$key], $taskData[$key]); + } + } + + /** + * @depends testCreate + */ + public function testRemoveTask($wp) + { + $tasUid = $wp->addTask(array( + "TAS_TITLE" => "task #2", + "TAS_POSX" => "150", + "TAS_POSY" => "250" + )); + + $tasks = $wp->getTasks(); + $this->assertInternalType('array', $tasks); + $this->assertCount(2, $tasks); + + $wp->removeTask($tasUid); + + $tasks = $wp->getTasks(); + $this->assertInternalType('array', $tasks); + $this->assertCount(1, $tasks); + } + + /** + * @depends testCreate + */ + public function testGetTasks($wp) + { + $tasUid1 = $wp->addTask(array( + "TAS_TITLE" => "task #2", + "TAS_POSX" => "250", + "TAS_POSY" => "250" + )); + $tasUid2 = $wp->addTask(array( + "TAS_TITLE" => "task #3", + "TAS_POSX" => "350", + "TAS_POSY" => "350" + )); + + $tasks = $wp->getTasks(); + $this->assertInternalType('array', $tasks); + $this->assertCount(3, $tasks); + + $wp->removeTask($tasUid1); + + $tasks = $wp->getTasks(); + $this->assertInternalType('array', $tasks); + $this->assertCount(2, $tasks); + + $wp->removeTask($tasUid2); + + $tasks = $wp->getTasks(); + $this->assertInternalType('array', $tasks); + $this->assertCount(1, $tasks); + + $wp->removeTask($tasks[0]['TAS_UID']); + + $tasks = $wp->getTasks(); + $this->assertInternalType('array', $tasks); + $this->assertCount(0, $tasks); + } + + /** + * + */ + public function testAddRoute() + { + $wp = new WorkflowProject(array( + "PRO_TITLE" => "Test Project #2 (Sequential)", + "PRO_CREATE_USER" => "00000000000000000000000000000001" + )); + + $tasUid1 = $wp->addTask(array( + "TAS_TITLE" => "task #1", + "TAS_POSX" => "410", + "TAS_POSY" => "61" + )); + $tasUid2 = $wp->addTask(array( + "TAS_TITLE" => "task #2", + "TAS_POSX" => "159", + "TAS_POSY" => "370" + )); + + $rouUid = $wp->addRoute($tasUid1, $tasUid2, "SEQUENTIAL"); + + $routeSaved = $wp->getRoute($rouUid); + + $this->assertEquals($tasUid1, $routeSaved['TAS_UID']); + $this->assertEquals($tasUid2, $routeSaved['ROU_NEXT_TASK']); + $this->assertEquals("SEQUENTIAL", $routeSaved['ROU_TYPE']); + } + + public function testAddSelectRoute() + { + $wp = new WorkflowProject(array( + "PRO_TITLE" => "Test Project #3 (Select)", + "PRO_CREATE_USER" => "00000000000000000000000000000001" + )); + + $tasUid1 = $wp->addTask(array( + "TAS_TITLE" => "task #1", + "TAS_POSX" => "410", + "TAS_POSY" => "61" + )); + $tasUid2 = $wp->addTask(array( + "TAS_TITLE" => "task #2", + "TAS_POSX" => "159", + "TAS_POSY" => "370" + )); + $tasUid3 = $wp->addTask(array( + "TAS_TITLE" => "task #3", + "TAS_POSX" => "670", + "TAS_POSY" => "372" + )); + + $wp->addSelectRoute($tasUid1, array($tasUid2, $tasUid3)); + } + + public function testCompleteWorkflowProject() + { + $wp = new WorkflowProject(array( + "PRO_TITLE" => "Test Complete Project #4", + "PRO_CREATE_USER" => "00000000000000000000000000000001" + )); + + $tasUid1 = $wp->addTask(array( + "TAS_TITLE" => "task #1", + "TAS_POSX" => "406", + "TAS_POSY" => "71" + )); + $tasUid2 = $wp->addTask(array( + "TAS_TITLE" => "task #2", + "TAS_POSX" => "188", + "TAS_POSY" => "240" + )); + $tasUid3 = $wp->addTask(array( + "TAS_TITLE" => "task #3", + "TAS_POSX" => "406", + "TAS_POSY" => "239" + )); + $tasUid4 = $wp->addTask(array( + "TAS_TITLE" => "task #4", + "TAS_POSX" => "294", + "TAS_POSY" => "366" + )); + $tasUid5 = $wp->addTask(array( + "TAS_TITLE" => "task #5", + "TAS_POSX" => "640", + "TAS_POSY" => "240" + )); + $tasUid6 = $wp->addTask(array( + "TAS_TITLE" => "task #6", + "TAS_POSX" => "640", + "TAS_POSY" => "359" + )); + + + $wp->addRoute($tasUid1, $tasUid2, "PARALLEL"); + $wp->addRoute($tasUid1, $tasUid3, "PARALLEL"); + $wp->addRoute($tasUid1, $tasUid5, "PARALLEL"); + + $wp->addRoute($tasUid2, $tasUid4, "SEC-JOIN"); + $wp->addRoute($tasUid3, $tasUid4, "SEC-JOIN"); + + $wp->addRoute($tasUid5, $tasUid6, "EVALUATE"); + $wp->addRoute($tasUid5, "-1", "EVALUATE"); + + $wp->setStartTask($tasUid1); + + $wp->setEndTask($tasUid4); + $wp->setEndTask($tasUid6); + } +} \ No newline at end of file