diff --git a/composer.json b/composer.json index 31269cc51..d2507dcb6 100644 --- a/composer.json +++ b/composer.json @@ -96,6 +96,7 @@ "thirdparty/pear", "thirdparty/phing", "thirdparty/pake", + "thirdparty/wizard", "rbac/engine/classes/" ], "files": [ diff --git a/thirdparty/wizard/include.php b/thirdparty/wizard/include.php new file mode 100644 index 000000000..0dccd53ff --- /dev/null +++ b/thirdparty/wizard/include.php @@ -0,0 +1,39 @@ + diff --git a/thirdparty/wizard/org/active-link/doc/DocHTML.php b/thirdparty/wizard/org/active-link/doc/DocHTML.php new file mode 100644 index 000000000..eb33d0071 --- /dev/null +++ b/thirdparty/wizard/org/active-link/doc/DocHTML.php @@ -0,0 +1,242 @@ +CSSStringDefault = " + body {background-color: white;} + a {font-family: monospace;} + ul {list-style-type: none;} + .classTitle {color: blue;} + .name {color: black;} + .version {color: black;} + .requires {color: red;} + .extends {color: black;} + .description {color: black;font-family: sans-serif;} + .author {color: blue;} + .methodsTitle {color: blue;} + .methodList {color: blue;} + .methodName {color: blue;font-weight: bold;} + .returns {color: black;} + .param {color: black;font-weight: bold;font-family: monospace;} + "; + } + + /** + * Returns class documentation as a string, formatted in HTML + * If argument is a filename, it parses the file for comments and generates documentation + * If argument is an object of type PHPClass, then documentation is generated from it + * @method getClassDoc + * @param mixed argument + * @returns string HTML-formatted documentation if successful, false otherwise + */ + function getClassDoc($argument) { + if(is_object($argument) && get_class($argument) == "phpclass") + return $this->getClassDocFromClass($argument); + elseif(is_string($argument)) + return $this->getClassDocFromFile($argument); + else + return false; + } + + /** + * Returns class documentation as a string, formatted in HTML + * @method getClassDocFromClass + * @param object objClass + * @returns string HTML-formatted documentation if successful, false otherwise + */ + function getClassDocFromClass($objClass) { + if(is_object($objClass) && get_class($objClass) == "phpclass") { + $classDocXML = new XML_("html"); + // ---------------------- HEAD ---------------------- // + $headXML = new XMLBranch("head"); + $headXML->setTagContent($objClass->getInfo("name"), "head/title"); + $headXML->setTagContent("", "head/meta"); + $headXML->setTagAttribute("http-equiv", "content-type", "head/meta"); + $headXML->setTagAttribute("content", "text/html; charset=ISO-8859-1", "head/meta"); + $headXML->setTagContent($this->CSSStringDefault, "head/style"); + $headXML->setTagAttribute("type", "text/css", "head/style"); + // ---------------------- BODY ---------------------- // + $bodyXML = new XMLBranch("body"); + $classTitleXML = new XMLBranch("h1"); + $classTitleXML->setTagAttribute("class", "classTitle"); + $classTitleXML->setTagContent($objClass->getInfo("name") . " Class"); + $bodyXML->addXMLBranch($classTitleXML); + foreach($objClass->info as $infoKey => $infoValue) { + $brXML = new XMLBranch("br"); + $bodyXML->addXMLBranch($brXML); + if(is_array($infoValue)) { + $spanXML = new XMLBranch("span"); + $spanXML->setTagAttribute("class", $infoKey); + $spanXML->setTagContent(ucfirst($infoKey) . ":"); + $ulXML = new XMLBranch("ul"); + $ulXML->setTagAttribute("class", $infoKey); + foreach($infoValue as $value) { + $liXML = new XMLBranch("li"); + $liXML->setTagContent($value); + $ulXML->addXMLBranch($liXML); + } + $bodyXML->addXMLBranch($spanXML); + $bodyXML->addXMLBranch($ulXML); + } + else { + $spanXML = new XMLBranch("span"); + $spanXML->setTagAttribute("class", $infoKey); + $spanXML->setTagContent(ucfirst($infoKey) . ": " . $infoValue); + $bodyXML->addXMLBranch($spanXML); + } + } + $hrXML = new XMLBranch("hr"); + $bodyXML->addXMLBranch($hrXML); + $h2XML = new XMLBranch("h2"); + $h2XML->setTagAttribute("class", "methodsTitle"); + $h2XML->setTagContent("All Methods"); + $bodyXML->addXMLBranch($h2XML); + $spanXML = new XMLBranch("span"); + $spanXML->setTagAttribute("class", "methodList"); + foreach($objClass->methods as $methodName => $method) { + $aMethodXML = new XMLBranch("a"); + $aMethodXML->setTagAttribute("href", "#" . $methodName); + $aMethodXML->setTagContent($methodName); + $brXML = new XMLBranch("br"); + $spanXML->addXMLBranch($aMethodXML); + $spanXML->addXMLBranch($brXML); + } + $bodyXML->addXMLBranch($spanXML); + foreach($objClass->methods as $methodName => $method) { + $hrXML = new XMLBranch("hr"); + $bodyXML->addXMLBranch($hrXML); + $pMethodXML = new XMLBranch("p"); + $aMethodXML = new XMLBranch("a"); + $aMethodXML->setTagAttribute("name", $methodName); + $spanXMLName = new XMLBranch("span"); + $spanXMLName->setTagAttribute("class", "methodName"); + $spanXMLName->setTagContent($methodName); + $spanXMLArgs = new XMLBranch("span"); + $tagContentArgs = " ( "; + if(is_array($method->params) && count($method->params) > 0) { + $paramCount = 0; + foreach($method->params as $key => $value) { + if($paramCount > 0) + $tagContentArgs .= ", "; + $tagContentArgs .= $key; + $paramCount ++; + } + } + $tagContentArgs .= " )"; + $spanXMLArgs->setTagContent($tagContentArgs); + $aMethodXML->addXMLBranch($spanXMLName); + $aMethodXML->addXMLBranch($spanXMLArgs); + $pMethodXML->addXMLBranch($aMethodXML); + $bodyXML->addXMLBranch($pMethodXML); + unset($method->info["name"]); + foreach($method->info as $infoKey => $infoValue) { + if(is_array($infoValue)) { + $pXML = new XMLBranch("p"); + $pXML->setTagAttribute("class", $infoKey); + $pXML->setTagContent(ucfirst($infoKey) . ":"); + $ulXML = new XMLBranch("ul"); + $ulXML->setTagAttribute("class", $infoKey); + foreach($infoValue as $value) { + $liXML = new XMLBranch("li"); + $liXML->setTagContent($value); + $ulXML->addXMLBranch($liXML); + } + $bodyXML->addXMLBranch($pXML); + $bodyXML->addXMLBranch($ulXML); + } + else { + $pXML = new XMLBranch("p"); + $pXML->setTagAttribute("class", $infoKey); + $pXML->setTagContent(ucfirst($infoKey) . ": " . $infoValue); + $bodyXML->addXMLBranch($pXML); + } + } + if(is_array($method->params) && count($method->params) > 0) { + $pParamXML = new XMLBranch("p"); + //$pParamXML->setTagAttribute("class", "param"); + $paramTitleXML = new XMLBranch("span"); + $paramTitleXML->setTagContent("Arguments:"); + $pParamXML->addXMLBranch($paramTitleXML); + $paramListXML = new XMLBranch("ul"); + foreach($method->params as $key => $value) { + $paramItemXML = new XMLBranch("li"); + $paramItemXML->setTagAttribute("class", "param"); + $paramItemXML->setTagContent($key); + $paramListXML->addXMLBranch($paramItemXML); + } + $pParamXML->addXMLBranch($paramListXML); + $bodyXML->addXMLBranch($pParamXML); + } + } + // ---------------------- END ---------------------- // + $classDocXML->addXMLBranch($headXML); + $classDocXML->addXMLBranch($bodyXML); + return $classDocXML->getXMLString(0); + } + else + return false; + } + + /** + * Returns class documentation as a string, formatted in HTML + * @method getClassDocFromFile + * @param string filename + * @returns string HTML-formatted documentation if successful, false otherwise + */ + function getClassDocFromFile($filename) { + if(is_string($filename) && file_exists($filename) && is_readable($filename)) { + $objClass = new PHPClass($filename); + return $this->getClassDocFromClass($objClass); + } + else + return false; + } + +} diff --git a/thirdparty/wizard/org/active-link/doc/Method.php b/thirdparty/wizard/org/active-link/doc/Method.php new file mode 100644 index 000000000..171f49338 --- /dev/null +++ b/thirdparty/wizard/org/active-link/doc/Method.php @@ -0,0 +1,83 @@ +info = array(); + $this->params = array(); + $this->setInfo("name", $name); + } + + /** + * Returns value of a property by name + * @method getInfo + * @param string name + * @returns string value of a property if found, false otherwise + */ + function getInfo($name) { + if(array_key_exists($name, $this->info)) + return $this->info[$name]; + else + return false; + } + + /** + * Sets a property with supplied name to a supplied value + * @method setInfo + * @param string name, string value + * @returns none + */ + function setInfo($name, $value) { + $this->info[$name] = $value; + } + + /** + * Sets a parameter with supplied name and value + * @method setParam + * @param string name, string value + * @returns none + */ + function setParam($name, $value) { + $this->params[$name] = $value; + } + +} diff --git a/thirdparty/wizard/org/active-link/doc/PHPClass.php b/thirdparty/wizard/org/active-link/doc/PHPClass.php new file mode 100644 index 000000000..efaff865f --- /dev/null +++ b/thirdparty/wizard/org/active-link/doc/PHPClass.php @@ -0,0 +1,195 @@ +methods = array(); + $this->properties = array(); + $this->info = array(); + if($filename != "") + $this->parseFromFile($filename); + } + + /** + * Deletes a property by name + * @method deleteInfo + * @param string name + * @returns true if successful, false otherwise + */ + function deleteInfo($name) { + $success = false; + if(array_key_exists($name, $this->info)) { + unset($this->info[$name]); + $success = true; + } + return $success; + } + + /** + * Returns a property value by name + * @method getInfo + * @param string name + * @returns string value if successful, false otherwise + */ + function getInfo($name) { + if(array_key_exists($name, $this->info)) + return $this->info[$name]; + else + return false; + } + + /** + * Parses a class from supplied filename + * @method parseFromFile + * @param string filename + * @returns true if successful, false otherwise + */ + function parseFromFile($filename) { + $success = false; + if(file_exists($filename) && is_readable($filename)) { + $arrContents = file($filename); + $parsing = false; + $parsingBlocks = array(); + $tempBlock = array(); + foreach($arrContents as $line) { + if(trim($line) == "/**") { + $parsing = true; + $blockstart = true; + } + elseif($parsing && trim($line) == "*/") { + $parsing = false; + $parsingBlocks[] = $tempBlock; + $tempBlock = array(); + } + else { + if($parsing) { + if($blockstart) { + $tempBlock[] = $line; + $blockstart = false; + } + else { + $tempBlock[] = $line; + } + } + } + } + foreach($parsingBlocks as $blockLines) { + $block = array(); + foreach($blockLines as $line) { + $str = strstr($line, "@"); + $str = substr($str, 1); + if($str !== false) { + $separatorPos = (strpos($str, " ") && strpos($str, "\t")) ? min(strpos($str, " "), strpos($str, "\t")) : (strpos($str, " ") ? strpos($str, " ") : (strpos($str, "\t") ? strpos($str, "\t") : strlen($str))); + $name = trim(substr($str, 0, $separatorPos)); + $value = trim(substr($str, $separatorPos)); + } + else { + $name = "description"; + $value = trim($line); + } + if($name == "param" || $name == "description") + $block[$name][] = $value; + else + $block[$name] = $value; + } + //print("
");
+ //print_r($block);
+ //print("");
+ if(array_key_exists("method", $block)) {
+ $tempMethod = new Method($block["method"]);
+ unset($block["method"]);
+ if(isset($block["param"]) && is_array($block["param"])) {
+ foreach($block["param"] as $param) {
+ $tempMethod->setParam($param, "");
+ }
+ }
+ unset($block["param"]);
+ foreach($block as $name => $value) {
+ $tempMethod->setInfo($name, $value);
+ }
+ $this->setMethod($tempMethod);
+ }
+ elseif(array_key_exists("class", $block)) {
+ $this->setInfo("name", $block["class"]);
+ unset($block["class"]);
+ foreach($block as $name => $value) {
+ $this->setInfo($name, $value);
+ }
+ }
+ }
+ $success = true;
+ }
+ return $success;
+ }
+
+ /**
+ * Sets a property by name
+ * @method setInfo
+ * @param string name, string value
+ * @returns none
+ */
+ function setInfo($name, $value) {
+ $this->info[$name] = $value;
+ }
+
+ /**
+ * Adds a method to the class definition
+ * @method setMethod
+ * @param object method
+ * @returns true if successful, false otherwise
+ */
+ function setMethod($method) {
+ $success = false;
+ if(is_object($method) && get_class($method) == "Method") {
+ $this->methods[$method->getInfo("name")] = $method;
+ $success = true;
+ }
+ return $success;
+ }
+
+}
+
+?>
diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/TriggerWizard.php b/workflow/engine/src/ProcessMaker/BusinessModel/TriggerWizard.php
index 6efcf6d02..cb016e231 100644
--- a/workflow/engine/src/ProcessMaker/BusinessModel/TriggerWizard.php
+++ b/workflow/engine/src/ProcessMaker/BusinessModel/TriggerWizard.php
@@ -353,7 +353,10 @@ class TriggerWizard
$library = $this->library->getLibraryDefinition($this->libraryGetLibraryName($libraryName));
$method = $library->methods[$methodName];
- $arrayParameter = array_keys($method->params);
+ $arrayParameter = [];
+ if (isset($method->params)) {
+ $arrayParameter = array_keys($method->params);
+ }
foreach ($arrayParameter as $key => $value) {
$strParam = $value;
@@ -796,7 +799,7 @@ class TriggerWizard
public function getMethod($libraryName, $methodName)
{
try {
- $arrayMethod = array();
+ $arrayMethod = [];
//Verify data
$arrayMethodInputParam = $this->methodGetInputParams($libraryName, $methodName);
@@ -805,10 +808,9 @@ class TriggerWizard
//Get data
$library = $this->library->getLibraryDefinition($this->libraryGetLibraryName($libraryName));
$method = $library->methods[$methodName];
-
- $arrayMethod[$this->getFieldNameByFormatFieldName("FN_NAME")] = trim($method->info["name"]);
- $arrayMethod[$this->getFieldNameByFormatFieldName("FN_DESCRIPTION")] = trim(str_replace("*", "", implode("", $method->info["description"])));
- $arrayMethod[$this->getFieldNameByFormatFieldName("FN_LABEL")] = trim($method->info["label"]);
+ $arrayMethod[$this->getFieldNameByFormatFieldName("FN_NAME")] = isset($method->info["name"]) ? trim($method->info["name"]) : '';
+ $arrayMethod[$this->getFieldNameByFormatFieldName("FN_DESCRIPTION")] = isset($method->info["description"]) ? trim(str_replace("*", "", implode("", $method->info["description"]))) : '';
+ $arrayMethod[$this->getFieldNameByFormatFieldName("FN_LABEL")] = isset($method->info["label"]) ? trim($method->info["label"]) : '';
$arrayMethod[$this->getFieldNameByFormatFieldName("FN_LINK")] = (isset($method->info["link"]) && trim($method->info["link"]) != "")? trim($method->info["link"]) : "";
if ($this->formatFieldNameInUppercase) {
@@ -841,7 +843,7 @@ class TriggerWizard
public function getLibrary($libraryName)
{
try {
- $arrayLibrary = array();
+ $arrayLibrary = [];
//Verify data
$this->throwExceptionIfNotExistsLibrary($libraryName, $this->arrayFieldNameForException["libraryName"]);
@@ -850,12 +852,12 @@ class TriggerWizard
$library = $this->library->getLibraryDefinition($this->libraryGetLibraryName($libraryName));
$arrayLibrary[$this->getFieldNameByFormatFieldName("LIB_NAME")] = $libraryName;
- $arrayLibrary[$this->getFieldNameByFormatFieldName("LIB_TITLE")] = trim($library->info["name"]);
- $arrayLibrary[$this->getFieldNameByFormatFieldName("LIB_DESCRIPTION")] = trim(str_replace("*", "", implode("", $library->info["description"])));
+ $arrayLibrary[$this->getFieldNameByFormatFieldName("LIB_TITLE")] = isset($library->info["name"]) ? trim($library->info["name"]) : '';
+ $arrayLibrary[$this->getFieldNameByFormatFieldName("LIB_DESCRIPTION")] = isset($library->info["description"]) ? trim(str_replace("*", "", implode("", $library->info["description"]))) : '';
$arrayLibrary[$this->getFieldNameByFormatFieldName("LIB_ICON")] = (isset($library->info["icon"]) && trim($library->info["icon"]) != "")? trim($library->info["icon"]) : "/images/browse.gif";
$arrayLibrary[$this->getFieldNameByFormatFieldName("LIB_CLASS_NAME")] = trim($library->info["className"]);
- $arrayMethod = array();
+ $arrayMethod = [];
if (count($library->methods) > 0) {
ksort($library->methods, SORT_STRING);