Merge remote-tracking branch 'origin/feature/HOR-3559' into feature/HOR-3629

This commit is contained in:
Ronald Quenta
2017-08-10 21:36:31 -04:00
5 changed files with 461 additions and 105 deletions

View File

@@ -342,6 +342,22 @@ CLI::taskOpt("lang", "", "lLANG", "lang=LANG");
CLI::taskArg('workspace');
CLI::taskRun("cliListIds");
/**
*
*/
CLI::taskName('regenerate-pmtable-classes');
CLI::taskDescription(<<<EOT
Regenerate the class with incorrect reference
This method recursively finds all PHP files that reference the path PATH_DATA
incorrectly, which is caused by importing processes where the data directory
of ProcessMaker has different routes. Modified files are backed up with the
extension '.backup' in the same directory.
EOT
);
CLI::taskArg('workspace');
CLI::taskRun("regenerate_pmtable_classes");
/**
* Function run_info
* access public
@@ -1114,3 +1130,30 @@ function run_migrate_plugin($args, $opts) {
CLI::logging("<*> Migrating and populating data Singleton took " . ($stop - $start) . " seconds.\n");
}
}
/**
* This method recursively finds all PHP files that reference the path PATH_DATA
* incorrectly, which is caused by importing processes where the data directory
* of ProcessMaker has different routes. Modified files are backed up with the
* extension '.backup' in the same directory.
*
* @param array $args
* @param array $opts
* @throws Exception
* @return void
*/
function regenerate_pmtable_classes($args, $opts)
{
if (sizeof($args) > 0) {
$start = microtime(true);
CLI::logging("> Updating generated class files for PM Tables...\n");
Bootstrap::setConstantsRelatedWs($args[0]);
$workspaceTools = new workspaceTools($args[0]);
$workspaceTools->fixReferencePathFiles(PATH_DATA_SITE . "classes", PATH_DATA);
$stop = microtime(true);
CLI::logging("<*> Updating generated class files for PM Tables took " . ($stop - $start) . " seconds.\n");
} else {
throw new Exception("No workspace specified for updating generated class files.");
}
}

View File

@@ -113,6 +113,17 @@ class PmTable
}
}
/**
*
*
* @param string $adapter
* @return void
*/
public function setDbConfigAdapter($adapter)
{
$this->dbConfig->adapter = $adapter;
}
/**
* Backward compatibility function
* Resolve a propel data source

View File

@@ -213,9 +213,40 @@ class ConsolidatedCases
return $oReportTable->getRepTabUid();
}
public function createReportVariables($RepTabUid, $ProUid, $formFields)
/**
* Create a record to 'ReportVar', this function uses the fields generated by
* the function 'buildReportVariables'.
*
* @param string $repTabUid
* @param string $proUid
* @param array $formFields
* @return array
*/
public function createReportVariables($repTabUid, $proUid, $formFields)
{
list($fieldsClass, $fields) = $this->buildReportVariables($formFields, function ($repVarName, $repVarType) use ($repTabUid, $proUid) {
$reportVar = new ReportVar();
$reportVar->create(array(
'REP_TAB_UID' => $repTabUid,
'PRO_UID' => $proUid,
'REP_VAR_NAME' => $repVarName,
'REP_VAR_TYPE' => $repVarType)
);
});
return array($fieldsClass, $fields);
}
/**
* Generates the fields for 'Report Tables', the second parameter is a 'callback'
* that receives as arguments the name and type of the field.
*
* @param array $formFields
* @param function $callbackFunction
* @return array
*/
public function buildReportVariables($formFields, $callbackFunction = null)
{
$oReportVar = new ReportVar();
$fieldsClass = array();
$fields = array();
$i = 1;
@@ -235,22 +266,22 @@ class ConsolidatedCases
$fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR';
$fieldsClass[$i]['FLD_SIZE'] = 255;
foreach ($formFields as $sField) {
$aField = explode('-', $sField);
if ($aField[1] == 'title' || $aField[1] == 'submit') {
foreach ($formFields as $field) {
$fieldProperty = explode('-', $field);
if ($fieldProperty[1] == 'title' || $fieldProperty[1] == 'submit') {
continue;
}
$i++;
$fieldsClass[$i]['FLD_NAME'] = $aField[0];
$fieldsClass[$i]['FLD_NAME'] = $fieldProperty[0];
$fieldsClass[$i]['FLD_NULL'] = 'off';
$fieldsClass[$i]['FLD_KEY'] = 'off';
$fieldsClass[$i]['FLD_AUTO_INCREMENT'] = 'off';
$fieldsClass[$i]['FLD_DESCRIPTION'] = '';
switch ($aField[1]) {
switch ($fieldProperty[1]) {
case 'currency':
case 'percentage':
$sType = 'number';
$type = 'number';
$fieldsClass[$i]['FLD_TYPE'] = 'FLOAT';
$fieldsClass[$i]['FLD_SIZE'] = 255;
break;
@@ -262,34 +293,32 @@ class ConsolidatedCases
case 'radiogroup':
case 'hidden':
case "link":
$sType = 'char';
$type = 'char';
$fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR';
$fieldsClass[$i]['FLD_SIZE'] = 255;
break;
case 'textarea':
$sType = 'text';
$type = 'text';
$fieldsClass[$i]['FLD_TYPE'] = 'TEXT';
$fieldsClass[$i]['FLD_SIZE'] = '';
break;
case 'date':
$sType = 'date';
$type = 'date';
$fieldsClass[$i]['FLD_TYPE'] = 'DATE';
$fieldsClass[$i]['FLD_SIZE'] = '';
break;
default:
$sType = 'char';
$type = 'char';
$fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR';
$fieldsClass[$i]['FLD_SIZE'] = 255;
break;
}
$oReportVar->create(array(
'REP_TAB_UID' => $RepTabUid,
'PRO_UID' => $ProUid,
'REP_VAR_NAME' => $aField[0],
'REP_VAR_TYPE' => $sType)
);
$fields[] = array('sFieldName' => $aField[0], 'sType' => $sType);
if (!empty($callbackFunction) && is_callable($callbackFunction)) {
$callbackFunction($fieldProperty[0], $type);
}
$fields[] = array('sFieldName' => $fieldProperty[0], 'sType' => $type);
}
return array($fieldsClass, $fields);
}

View File

@@ -1,15 +1,12 @@
<?php
/**
* Utility functions to manage a workspace.
*
* @author Alexandre Rosenfeld
*/
use ProcessMaker\Util\FixReferencePath;
use ProcessMaker\Plugins\Adapters\PluginAdapter;
/**
* class workspaceTools
* class workspaceTools.
*
* Utility functions to manage a workspace.
*
* @package workflow.engine.classes
*/
@@ -712,7 +709,7 @@ class workspaceTools
$res = $appCache->fillAppCacheView($lang);
}
//set status in config table
$confParams = Array('LANG' => $lang, 'STATUS' => 'active');
$confParams = array('LANG' => $lang, 'STATUS' => 'active');
$oConf->aConfig = $confParams;
$oConf->saveConfig('APP_CACHE_VIEW_ENGINE', '', '', '');
@@ -1142,7 +1139,6 @@ class workspaceTools
$Fields['WORKSPACE_NAME'] = $this->name;
if (isset($this->dbHost)) {
$dbNetView = new NET($this->dbHost);
$dbNetView->loginDbServer($this->dbUser, $this->dbPass);
try {
@@ -1296,9 +1292,8 @@ class workspaceTools
* @param string $filename the backup filename
* @param bool $compress wheter to compress or not
*/
static public function createBackup($filename, $compress = true)
public static function createBackup($filename, $compress = true)
{
if (!file_exists(dirname($filename))) {
mkdir(dirname($filename));
}
@@ -1546,14 +1541,13 @@ class workspaceTools
return true;
}
static public function restoreLegacy($directory)
public static function restoreLegacy($directory)
{
throw new Exception("Use gulliver to restore backups from old versions");
}
static public function getBackupInfo($filename)
public static function getBackupInfo($filename)
{
$backup = new Archive_Tar($filename);
//Get a temporary directory in the upgrade directory
$tempDirectory = PATH_DATA . "upgrade/" . basename(tempnam(__FILE__, ''));
@@ -1581,7 +1575,7 @@ class workspaceTools
G::rm_dir($tempDirectory);
}
static public function dirPerms($filename, $owner, $group, $perms)
public static function dirPerms($filename, $owner, $group, $perms)
{
$chown = @chown($filename, $owner);
$chgrp = @chgrp($filename, $group);
@@ -1617,9 +1611,8 @@ class workspaceTools
* @param string $lang for define the language
* @param string $port of database if is empty take 3306
*/
static public function restore($filename, $srcWorkspace, $dstWorkspace = null, $overwrite = true, $lang = 'en', $port = '')
public static function restore($filename, $srcWorkspace, $dstWorkspace = null, $overwrite = true, $lang = 'en', $port = '')
{
$backup = new Archive_Tar($filename);
//Get a temporary directory in the upgrade directory
$tempDirectory = PATH_DATA . "upgrade/" . basename(tempnam(__FILE__, ''));
@@ -1854,6 +1847,12 @@ class workspaceTools
$stop = microtime(true);
CLI::logging("<*> Migrating an populating indexing for APP_CACHE_VIEW process took " . ($stop - $start) . " seconds.\n");
$start = microtime(true);
CLI::logging("> Updating generated class files for PM Tables...\n");
self::fixReferencePathFiles(PATH_DATA_SITE . "classes", PATH_DATA);
$stop = microtime(true);
CLI::logging("<*> Updating generated class files for PM Tables took " . ($stop - $start) . " seconds.\n");
mysql_close($link);
}
@@ -1928,7 +1927,8 @@ class workspaceTools
}
}
public function checkMafeRequirements ($workspace,$lang) {
public function checkMafeRequirements($workspace, $lang)
{
$this->initPropel(true);
$pmRestClient = OauthClientsPeer::retrieveByPK('x-pm-local-client');
if (empty($pmRestClient)) {
@@ -2227,7 +2227,8 @@ class workspaceTools
CLI::logging("> Completed table LIST_CANCELED\n");
}
public function regenerateListCompleted($lang = 'en'){
public function regenerateListCompleted($lang = 'en')
{
$this->initPropel(true);
$query = 'INSERT INTO '.$this->dbName.'.LIST_COMPLETED
(APP_UID,
@@ -2289,7 +2290,8 @@ class workspaceTools
CLI::logging("> Completed table LIST_COMPLETED\n");
}
public function regenerateListMyInbox(){
public function regenerateListMyInbox()
{
$this->initPropel(true);
$query = 'INSERT INTO '.$this->dbName.'.LIST_MY_INBOX
(APP_UID,
@@ -2358,7 +2360,8 @@ class workspaceTools
CLI::logging("> Completed table LIST_MY_INBOX\n");
}
public function regenerateListInbox(){
public function regenerateListInbox()
{
$this->initPropel(true);
$query = 'INSERT INTO '.$this->dbName.'.LIST_INBOX
(APP_UID,
@@ -2415,7 +2418,8 @@ class workspaceTools
CLI::logging("> Completed table LIST_INBOX\n");
}
public function regenerateListParticipatedHistory(){
public function regenerateListParticipatedHistory()
{
$this->initPropel(true);
$query = 'INSERT INTO '.$this->dbName.'.LIST_PARTICIPATED_HISTORY
(APP_UID,
@@ -2589,7 +2593,8 @@ class workspaceTools
* For the labels we use the tables user, process, task and application
* @return void
*/
public function regenerateListPaused(){
public function regenerateListPaused()
{
$this->initPropel(true);
$query = 'INSERT INTO '.$this->dbName.'.LIST_PAUSED
(
@@ -2672,7 +2677,8 @@ class workspaceTools
}
/*----------------------------------********---------------------------------*/
public function regenerateListUnassigned(){
public function regenerateListUnassigned()
{
$this->initPropel(true);
$truncate = 'TRUNCATE '.$this->dbName.'.LIST_UNASSIGNED';
//This executeQuery is very fast than Propel
@@ -2731,7 +2737,8 @@ class workspaceTools
*
* return boolean value
*/
public function listFirstExecution ($action, $list='all'){
public function listFirstExecution($action, $list='all')
{
$this->initPropel(true);
switch ($action) {
case 'insert':
@@ -2840,7 +2847,8 @@ class workspaceTools
*
* return void
*/
public static function registerSystemTables($aSquema){
public static function registerSystemTables($aSquema)
{
//Register all tables
$sListTables = '';
foreach ($aSquema as $key => $value) {
@@ -2857,7 +2865,8 @@ class workspaceTools
/**
*return void
*/
public function checkRbacPermissions(){
public function checkRbacPermissions()
{
CLI::logging("-> Verifying roles permissions in RBAC \n");
//Update table RBAC permissions
$RBAC = &RBAC::getSingleton();
@@ -3129,7 +3138,6 @@ class workspaceTools
PATH_DATA."/post-missing-inbox-".$this->name.".txt",
"[".$item['APP_UID']."] has not been found"
);
}
CLI::logging("> Number of missing inbox cases for workspace " . CLI::info($this->name) . ": " . CLI::info($counter) . "\n");
@@ -3508,7 +3516,8 @@ class workspaceTools
CLI::logging("|--> Clean data in table " . OauthRefreshTokensPeer::TABLE_NAME . " rows ".$refreshToken."\n");
}
public function migrateIteeToDummytask($workspaceName){
public function migrateIteeToDummytask($workspaceName)
{
$this->initPropel(true);
$arraySystemConfiguration = PmSystem::getSystemConfiguration('', '', $workspaceName);
$conf = new Configurations();
@@ -3568,7 +3577,8 @@ class workspaceTools
$conf->saveConfig('SKIN_CRON', '');
}
public function upgradeAuditLog($workspace){
public function upgradeAuditLog($workspace)
{
$conf = new Configurations();
if (!$conf->exists('AUDIT_LOG', 'log')) {
CLI::logging("> Updating Auditlog Config \n");
@@ -3579,7 +3589,8 @@ class workspaceTools
}
}
public function migrateSelfServiceRecordsRun($workspace) {
public function migrateSelfServiceRecordsRun($workspace)
{
// Initializing
$this->initPropel(true);
@@ -3625,7 +3636,8 @@ class workspaceTools
CLI::logging(" Migrating Self-Service by Value Cases Done \n");
}
public function migratePopulateIndexingACV($workspace) {
public function migratePopulateIndexingACV($workspace)
{
// Migrating and populating new indexes
CLI::logging("-> Migrating an populating indexing for avoiding the use of table APP_CACHE_VIEW Start \n");
@@ -3895,4 +3907,24 @@ class workspaceTools
$conf->create($data);
}
}
/**
* This method finds all recursively PHP files that have the path PATH_DATA,
* poorly referenced, this is caused by the import of processes where the data
* directory of ProcessMaker has different routes. Modified files are backed
* up with the extension '.backup' in the same directory.
*
* @return void
*/
public function fixReferencePathFiles($pathClasses, $pathData)
{
try {
$this->initPropel(true);
$fixReferencePath = new FixReferencePath();
$fixReferencePath->runProcess($pathClasses, $pathData);
CLI::logging($fixReferencePath->getResumeDebug());
} catch (Exception $e) {
CLI::logging(CLI::error("Error:" . "Error updating generated class files for PM Tables, proceed to regenerate manually: " . $e));
}
}
}

View File

@@ -0,0 +1,241 @@
<?php
namespace ProcessMaker\Util;
use Configurations;
use Criteria;
use ResultSet;
use FieldsPeer;
use ReportTablePeer;
use CaseConsolidatedCorePeer;
use ConsolidatedCases;
use AdditionalTablesPeer;
use PmTable;
use ReportVarPeer;
use AdditionalTables;
use stdClass;
/**
* This class regenerates the 'Propel' classes that are necessary for the
* administration of a 'Report Table', this is caused by the import of processes
* where the data directory of ProcessMaker has different routes.
*/
class FixReferencePath
{
private $modeDebug = false;
private $resumeDebug = "";
/**
* Get property modeDebug.
*
* @return boolean
*/
public function getModeDebug()
{
return $this->modeDebug;
}
/**
* Set property modeDebug.
*
* @param boolean $modeDebug
*/
public function setModeDebug($modeDebug)
{
$this->modeDebug = $modeDebug;
}
/**
* Get property resumeDebug.
*
* @return string
*/
public function getResumeDebug()
{
return $this->resumeDebug;
}
/**
* Set property resumeDebug.
*
* @param string $resumeDebug
*/
public function setResumeDebug($resumeDebug)
{
$this->resumeDebug = $resumeDebug;
}
/**
* Find all PHP type files recursively.
* The '$pathData' argument is the path to be replaced with the path found
* as incorrect.
*
* @param string $directory
* @param string $pathData
* @return void
*/
public function runProcess($directory, $pathData)
{
try {
//This variable is not defined and does not involve its value in this
//task, it is removed at the end of the method.
$_SERVER["REQUEST_URI"] = "";
if (!defined("SYS_SKIN")) {
$conf = new Configurations();
define("SYS_SKIN", $conf->getConfiguration('SKIN_CRON', ''));
}
$criteria = new Criteria("workflow");
$criteria->addSelectColumn(ReportTablePeer::REP_TAB_UID);
$criteria->addSelectColumn(CaseConsolidatedCorePeer::TAS_UID);
$criteria->addSelectColumn(ReportTablePeer::REP_TAB_NAME);
$criteria->addJoin(ReportTablePeer::REP_TAB_UID, CaseConsolidatedCorePeer::REP_TAB_UID, Criteria::JOIN);
$criteria->add(CaseConsolidatedCorePeer::CON_STATUS, "ACTIVE", Criteria::EQUAL);
$doSelect = ReportTablePeer::doSelectRS($criteria);
$doSelect->setFetchmode(ResultSet::FETCHMODE_ASSOC);
$consolidatedCases = new ConsolidatedCases();
while ($doSelect->next()) {
$row = $doSelect->getRow();
$fields = $this->getReportTableFields($row["REP_TAB_UID"]);
list($fields, $outFields) = $consolidatedCases->buildReportVariables($fields);
try {
$this->regeneratePropelClasses($row["REP_TAB_NAME"], $row["REP_TAB_NAME"], $fields, $row["TAS_UID"]);
$this->outVerboseln("* Regenerate classes for table: " . $row["REP_TAB_NAME"]);
} catch (Exception $e) {
CLI::logging(CLI::error("Error:" . "Error in regenerate classes for table: " . $row["REP_TAB_NAME"] . ". " . $e));
}
}
$criteria = new Criteria("workflow");
$criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_UID);
$criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_NAME);
$criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_CLASS_NAME);
$criteria->addSelectColumn(AdditionalTablesPeer::DBS_UID);
$doSelect = AdditionalTablesPeer::doSelectRS($criteria);
$doSelect->setFetchmode(ResultSet::FETCHMODE_ASSOC);
while ($doSelect->next()) {
$row = $doSelect->getRow();
$fields = $this->getAdditionalTablesFields($row["ADD_TAB_UID"]);
try {
$pmTable = new PmTable($row["ADD_TAB_NAME"]);
$pmTable->setDbConfigAdapter("mysql");
$pmTable->setColumns($fields);
$pmTable->prepare();
$pmTable->preparePropelIniFile();
$pmTable->buildSchema();
$pmTable->phingbuildModel();
$this->outVerboseln("* Regenerate classes for table: " . $row["ADD_TAB_NAME"]);
} catch (Exception $e) {
CLI::logging(CLI::error("Error:" . "Error in regenerate classes for table: " . $row["ADD_TAB_NAME"] . ". " . $e));
}
}
unset($_SERVER["REQUEST_URI"]);
} catch (Exception $e) {
CLI::logging(CLI::error("Error:" . "Error in regenerate classes files, proceed to regenerate manually: " . $e));
}
}
/**
* Gets the fields of the 'Report Table'.
*
* @param string $repTabUid
* @return array
*/
public function getReportTableFields($repTabUid)
{
$fields = array();
$criteria = new Criteria("workflow");
$criteria->addSelectColumn(ReportVarPeer::REP_VAR_NAME);
$criteria->addSelectColumn(ReportVarPeer::REP_VAR_TYPE);
$criteria->add(ReportVarPeer::REP_TAB_UID, $repTabUid, Criteria::EQUAL);
$doSelect = ReportVarPeer::doSelectRS($criteria);
$doSelect->setFetchmode(ResultSet::FETCHMODE_ASSOC);
while ($doSelect->next()) {
$row = $doSelect->getRow();
$fields[] = $row['REP_VAR_NAME'] . '-' . $row['REP_VAR_TYPE'];
}
return $fields;
}
/**
* Gets the fields of the 'Additional Table'.
*
* @param string $addTabUid
* @return object
*/
public function getAdditionalTablesFields($addTabUid)
{
$fields = array();
$criteria = new Criteria("workflow");
$criteria->add(FieldsPeer::ADD_TAB_UID, $addTabUid);
$doSelect = FieldsPeer::doSelectRS($criteria);
$doSelect->setFetchmode(ResultSet::FETCHMODE_ASSOC);
while ($doSelect->next()) {
$row = $doSelect->getRow();
$object = new stdClass();
$object->field_index = $row["FLD_INDEX"];
$object->field_name = $row["FLD_NAME"];
$object->field_description = $row["FLD_DESCRIPTION"];
$object->field_type = $row["FLD_TYPE"];
$object->field_size = $row["FLD_SIZE"];
$object->field_null = $row["FLD_NULL"];
$object->field_autoincrement = $row["FLD_AUTO_INCREMENT"];
$object->field_key = $row["FLD_KEY"];
$fields[] = $object;
}
return $fields;
}
/**
* Regenerate 'Propel' classes for 'Report Tables'. The name of the 'Report Table',
* the fields and the related task are required.
*
* @param string $repTabName
* @param array $fields
* @param string $guid
* @return void
*/
public function regeneratePropelClasses($repTabName, $className, $fields, $guid)
{
$sourcePath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
@unlink($sourcePath . $className . '.php');
@unlink($sourcePath . $className . 'Peer.php');
@unlink($sourcePath . PATH_SEP . 'map' . PATH_SEP . $className . 'MapBuilder.php');
@unlink($sourcePath . PATH_SEP . 'om' . PATH_SEP . 'Base' . $className . '.php');
@unlink($sourcePath . PATH_SEP . 'om' . PATH_SEP . 'Base' . $className . 'Peer.php');
$additionalTables = new AdditionalTables();
$additionalTables->createPropelClasses($repTabName, $className, $fields, $guid);
}
/**
* Display the output found, the message is not displayed if the value of the
* 'modeVerbose' property is false.
*
* @param string $message
* @return void
*/
private function outVerbose($message)
{
$this->resumeDebug = $this->resumeDebug . $message;
if ($this->modeDebug === true) {
echo $message;
}
}
/**
* Shows on the screen the output found with line break.
*
* @param string $message
* @return void
*/
private function outVerboseln($message)
{
$this->outVerbose($message . "\n");
}
}