Adding registry files for the trigger registration in the core

This commit is contained in:
Gustavo Cruz
2015-03-03 17:54:30 -04:00
parent c7208a6463
commit 441946f71c
6 changed files with 654 additions and 11 deletions

View File

@@ -225,6 +225,9 @@ class Bootstrap
self::registerClass("cronFile", PATH_CLASSES . "class.plugin.php");
self::registerClass("pluginDetail", PATH_CLASSES . "class.pluginRegistry.php");
self::registerClass("PMPluginRegistry", PATH_CLASSES . "class.pluginRegistry.php");
/*****feature-begins******/
self::registerClass("PMFeatureRegistry", PATH_CLASSES . "class.featureRegistry.php");
/*****feature-ends******/
self::registerClass("featuresDetail", PATH_CLASSES . "class.licensedFeatures.php");
self::registerClass("PMLicensedFeatures", PATH_CLASSES . "class.licensedFeatures.php");
self::registerClass("PMDashlet", PATH_CLASSES . "class.pmDashlet.php");

View File

@@ -1,30 +1,104 @@
<?php
namespace \Features\ActionsByEmail;
/**
* Description of ActionsByEmailFeature
*
*/
class ActionsByEmailFeature implements EnterpriseFeature
if (!class_exists('enterprisePlugin')) {
return;
}
// Load dependences
G::LoadClass('feature');
class ActionsByEmailFeature extends PMFeature
{
public function __construct($namespace, $filename = null)
{
$result = parent::__construct($namespace, $filename);
$this->sFriendlyName = 'Actions By Email';
$this->sDescription = 'Actions by Email using variables as multiple choice actions delivered by email';
$this->sFeatureFolder = 'ActionsByEmail';
$this->sSetupPage = '';
$this->iVersion = self::getFeatureVersion($namespace);
$this->aWorkspaces = null;
$this->aDependences = array(array('sClassName' => 'enterprise'), array('sClassName' => 'pmLicenseManager'));
$this->bPrivate = parent::registerEE($this->sFeatureFolder, $this->iVersion);
return $result;
}
public function setup()
{
try {
// Register the extended tab for the task properties
//$this->registerTaskExtendedProperty('actionsByEmail/configActionsByEmail', "Actions by Email");
//$this->registerTaskExtendedProperty('actionsByEmail/configActionsByEmail', 'Actions by Email');
//$this->registerMenu('setup', 'menusetup.php');
// Register the trigger for the hook PM_CREATE_NEW_DELEGATION
if (!defined('PM_CREATE_NEW_DELEGATION')) {
throw new Exception('It might be using a version of ProcessMaker which is not totally compatible with this plugin, the minimun required version is 2.0.37');
}
$this->registerTrigger(PM_CREATE_NEW_DELEGATION, 'sendActionsByEmail');
// Register the external step for the tracking form
//$this->registerStep('4939290144f0745f5ddb1d1019823738', 'externalStep', 'Actions by Email - Tracking Form'); // ToDo: For the next release
} catch (Exception $error) {
//G::SendMessageText($error->getMessage(), 'WARNING');
}
}
public function install()
{
$this->checkTables();
}
public function enable()
{
$this->checkTables();
}
public function disable()
{
// Nothing to do for now
}
/**
* This method get the version of this plugin, when the plugin is packaged in the tar.gz
* the file "version" in the plugin folder has this information for development purposes,
* we calculate the version using git commands, because the repository is in GIT
*
* @param String $namespace The namespace of the plugin
* @return String $version
*/
private static function getFeatureVersion($namespace)
{
return "2.0.20";
}
public function checkTables()
{
$con = Propel::getConnection('workflow');
$stmt = $con->createStatement();
// setting the path of the sql schema files
$filenameSql = PATH_PLUGINS . 'actionsByEmail/data/schema.sql';
// checking the existence of the schema file
if (!file_exists($filenameSql)) {
throw new Exception("File data/schema.sql doesn't exists");
}
// exploding the sql query in an array
$sql = explode(';', file_get_contents($filenameSql));
$stmt->executeQuery('SET FOREIGN_KEY_CHECKS = 0;');
// executing each query stored in the array
foreach ($sql as $sentence) {
if (trim($sentence) != '') {
$stmt->executeQuery($sentence);
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,179 @@
<?php
/**
* class.featureRegistry.php
*
* @package workflow.engine.classes
*
* ProcessMaker Open Source Edition
* Copyright (C) 2004 - 2011 Colosa Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
*/
class PMFeatureRegistry
{
private $features = array ();
private $triggers = array ();
private static $instance = null;
/**
* This function is the constructor of the PMPluginRegistry class
* param
*
* @return void
*/
private function __construct ()
{
}
/**
* This function is instancing to this class
* param
*
* @return object
*/
public static function getSingleton ()
{
if (self::$instance == null) {
self::$instance = new PMFeatureRegistry();
}
return self::$instance;
}
/**
* Register the feature in the singleton
*
* @param unknown_type $className
* @param unknown_type $featureName
* @param unknown_type $filename
*/
public function registerFeature ($featureName, $filename = null)
{
$className = $featureName . "Feature";
$feature = new $className( $featureName, $filename );
if (isset( $this->features[$featureName] )) {
$this->features[$featureName]->iVersion = $feature->iVersion;
return;
} else {
$this->features[$featureName] = $feature;
}
}
/**
* Enable the plugin in the singleton
*
* @param unknown_type $featureName
*/
public function enableFeature ($featureName)
{
$feature = $this->retrieveFeature($featureName);
if ($feature) {
$feature->enable();
}
throw new Exception( "Unable to enable feature '$featureName' (feature not found)" );
}
/**
* disable the plugin in the singleton
*
* @param unknown_type $featureName
*/
public function disableFeature ($featureName)
{
$feature = $this->retrieveFeature($featureName);
if ($feature) {
$feature->enable();
}
throw new Exception( "Unable to disable feature '$featureName' (feature not found)" );
}
/**
* install the plugin
*
* @param unknown_type $featureName
*/
public function installFeature ($featureName)
{
try {
$this->registerFeature($featureName);
$feature = $this->retrieveFeature($featureName);
if ($feature) {
$feature->install();
} else {
throw new Exception( "Unable to install feature '$featureName' (feature not found)" );
}
} catch (Exception $e) {
global $G_PUBLISH;
$aMessage['MESSAGE'] = $e->getMessage();
$G_PUBLISH = new Publisher();
$G_PUBLISH->AddContent( 'xmlform', 'xmlform', 'login/showMessage', '', $aMessage );
G::RenderPage( 'publish' );
die();
}
}
public function retrieveFeature($name)
{
foreach ($this->features as $featureName => $feature) {
if ($featureName === $name) {
return $feature;
}
}
return false;
}
/**
* execute all triggers related to a triggerId
*
* @param unknown_type $menuId
* @return object
*/
public function executeTriggers ($triggerId, $data)
{
foreach ($this->features as $feature) {
$feature->executeTrigger($triggerId, $data);
}
}
public function setupFeatures ()
{
return true;
$featureDirList = glob(PATH_FEATURES . "/*", GLOB_ONLYDIR);
foreach ($featureDirList as $directory) {
if ($directory == 'ViewContainers') {
continue;
}
$featureApiClassList = Util\Common::rglob($directory . DS . 'Services' . DS . 'Api' . "/*");
foreach ($featureApiClassList as $classFile) {
if (pathinfo($classFile, PATHINFO_EXTENSION) === 'php') {
$relClassPath = str_replace('.php', '', str_replace($servicesDir, '', $classFile));
$namespace = '\\ProcessMaker\\Services\\Api\\' . basename($classFile, '.php');
$namespace = strpos($namespace, "//") === false? $namespace: str_replace("//", '', $namespace);
require_once $classFile;
$this->rest->addAPIClass($namespace);
}
}
}
foreach ($this->features as $feature) {
$feature->setup();
}
}
}

View File

@@ -176,7 +176,9 @@ class AppDelegation extends BaseAppDelegation
$data->DEL_INDEX = $delIndex;
$data->USR_UID = $sUsrUid;
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$featureRegistry = &PMFeatureRegistry::getSingleton();
$oPluginRegistry->executeTriggers( PM_CREATE_NEW_DELEGATION, $data );
$featureRegistry->executeTriggers( PM_CREATE_NEW_DELEGATION, $data );
}
return $delIndex;

View File

@@ -196,6 +196,9 @@ define( 'PATH_METHODS', PATH_CORE . 'methods' . PATH_SEP );
define( 'PATH_XMLFORM', PATH_CORE . 'xmlform' . PATH_SEP );
define( 'PATH_CONFIG', PATH_CORE . 'config' . PATH_SEP );
define( 'PATH_PLUGINS', PATH_CORE . 'plugins' . PATH_SEP );
/*****features-begins******/
define( 'PATH_FEATURES', PATH_CORE . 'features' . PATH_SEP );
/*****features-ends******/
define( 'PATH_HTMLMAIL', PATH_CORE . 'html_templates' . PATH_SEP );
define( 'PATH_TPL', PATH_CORE . 'templates' . PATH_SEP );
define( 'PATH_TEST', PATH_CORE . 'test' . PATH_SEP );
@@ -627,7 +630,9 @@ if (file_exists( $sSerializedFile )) {
} else{
$oPluginRegistry = PMPluginRegistry::getSingleton();
}
/****features-begins****/
$featureRegistry =& PMFeatureRegistry::getSingleton();
/****features-ends****/
// setup propel definitions and logging
//changed to autoloader
//require_once ("propel/Propel.php");
@@ -692,6 +697,9 @@ if (SYS_LANG != 'en' && ! is_file( PATH_LANGUAGECONT . 'translation.' . SYS_LANG
// Setup plugins
$oPluginRegistry->setupPlugins(); //get and setup enabled plugins
/****features-begins****/
$featureRegistry->setupFeatures(); //get and setup enabled features
/****features-ends****/
$avoidChangedWorkspaceValidation = false;
// Load custom Classes and Model from Plugins.