diff --git a/composer.json b/composer.json index d2507dcb6..31269cc51 100644 --- a/composer.json +++ b/composer.json @@ -96,7 +96,6 @@ "thirdparty/pear", "thirdparty/phing", "thirdparty/pake", - "thirdparty/wizard", "rbac/engine/classes/" ], "files": [ diff --git a/tests/resources/ContentPHPSourceCode.txt b/tests/resources/ContentPHPSourceCode.txt new file mode 100644 index 000000000..14f7165eb --- /dev/null +++ b/tests/resources/ContentPHPSourceCode.txt @@ -0,0 +1,274 @@ + $b) { + echo "a is bigger than b"; + } elseif ($a == $b) { + echo $a . " is equal to " . $b[0]; + } else { + $result = getText($this->property1, $this->property2); + } + $result = $a < $b ? $a : $b; + } + + /** + * test + */ + public function forExample() + { + for ($i = 1; $i <= 10; $i++) { + echo 'Item: '; + echo $i; + } + } + + /** + * Test + */ + public function foreachEample() + { + $arr = array(1, 2, 3, 4, "b" => 5, "a" => 6); + foreach ($arr as &$value) { + $value = (int) $value * 2; + } + } + + /** + * Test + */ + public function whileExample() + { + $i = 1; + while ($i <= 10) { + echo $i++; + } + } + + /** + * Test + * @param type $i + */ + public function doWhileExample($i) + { + do { + echo $i--; + } while ($i > 0); + } + + /** + * Test + */ + public function switchExample() + { + switch ($i) { + case 0: + echo "i equals 0"; + break; + case 1: + echo "i equals 1"; + break; + } + } + + /** + * Test + */ + public function matchExample() + { + $result = match ($i) { + 1, 2, 3 => "1, 2, or 3", + 4, 5, => "4 or 5", + default => $this->getDefaultValue(), + }; + } + + /** + * Test + * @return int + */ + public function getDefaultValue(): int + { + return 10; + } + + /** + * Test + */ + public function tryExample() + { + try { + echo inverse(5) . "\n"; + } catch (Exception $e) { + echo 'Caught exception: ' . $e->getMessage() . "\n"; + } finally { + echo "Finally block"; + } + } + + /** + * Test + * @param type $arg + * @return \ExampleNamespace\#anon#ContentPHPSourceCode_php#1 + */ + public function anonymousClassExample($arg) + { + $instance = new class($arg) extends Anonymous + { + + public function __construct($arg) + { + + } + + public function anon() + { + echo "anonymous"; + } + }; + return $instance; + } + + /** + * Test + * @param type $arg1 + * @param type $arg2 + * @param type $arg3 + * @param type $arg4 + * @param type $arg5 + */ + public function alignParamsExample($arg1, $arg2, $arg3, $arg4, $arg5) + { + + } + + /** + * Test + * @param Class1|Class2|null $object + * @return int|float|null + */ + public function unionTypesExample(Class1|Class2|null $object): int|float|null + { + return null; + } + + /** + * Test + * @param ClassA&ClassB $object + * @return ClassA&ClassB + */ + public function intersectionTypesExample(ClassA&ClassB $object): ClassA&ClassB + { + return $object; + } + + /** + * Test + * @param object $object + */ + public function nullsafeOperatorExample(object $object) + { + $object?->nullsafe(); + } + +} + +enum EnumExample: string +{ + + case FOO = 'F'; + case BAR = 'B'; + + public function example(): string + { + return match ($this) { + static::FOO => 'Foo', + static::BAR => 'Bar', + }; + } + +} + +$anonymousFunc = function ($arg) use ($param): int { + return 1; +}; + +// Wrapping: Method Call Arguments must be set +(new Example())->alignParamsExample('one', 'two', 'three', 'four', 'five'); + +/** + * Test + * @param type $a + * @param type $b + */ +function namedArguments($a, $b) +{ + +} + +/** + * ProcessMaker has made a number of its PHP functions available be used in triggers and conditions. + * Most of these functions are wrappers for internal functions used in Gulliver, which is the development framework + * used by ProcessMaker. + * @class pmFunctions + * + * @name ProcessMaker Functions + * @icon /images/pm.gif + * @className class.pmFunctions.php + */ + +/** + * @method + * + * Create a new user + * + * @name PMFNewUser + * @label PMF New User + * + * @param string | $test + * + * @return array | $response | Response + */ +function testAnnotation($test){ + return []; +} + +namedArguments(a: 1, b: 2); + +$shortName = 10; +$veryLooongName = 20; +$data = [ + 'short_key' => 10, + 'very_looong_key' => 100, +]; + diff --git a/tests/unit/workflow/engine/src/ProcessMaker/PHPReflectionClass/ClassStructureTest.php b/tests/unit/workflow/engine/src/ProcessMaker/PHPReflectionClass/ClassStructureTest.php new file mode 100644 index 000000000..973f83c80 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/PHPReflectionClass/ClassStructureTest.php @@ -0,0 +1,102 @@ +object = new ClassStructure(); + } + + /** + * This test the method deleteInfo. + * @covers ProcessMaker\PHPReflectionClass\ClassStructure::deleteInfo + * @test + */ + public function testDeleteInfo() + { + //assert false + $result1 = $this->object->deleteInfo("test1"); + $this->assertFalse($result1); + + //assert true + $this->object->info["test2"] = []; + $result2 = $this->object->deleteInfo("test2"); + $this->assertTrue($result2); + } + + /** + * This test the method getInfo. + * @covers ProcessMaker\PHPReflectionClass\ClassStructure::getInfo + * @test + */ + public function testGetInfo() + { + //assert false + $result1 = $this->object->getInfo("test1"); + $this->assertFalse($result1); + + //assert true + $this->object->info["test2"] = []; + $result2 = $this->object->getInfo("test2"); + $this->assertEquals([], $result2); + } + + /** + * This test the method parseFromFile. + * @covers ProcessMaker\PHPReflectionClass\ClassStructure::parseFromFile + * @test + */ + public function testParseFromFile() + { + //assert false + $result1 = $this->object->parseFromFile("invalidPath"); + $this->assertFalse($result1); + + $filename = PATH_TRUNK . "tests/resources/ContentPHPSourceCode.txt"; + $result2 = $this->object->parseFromFile($filename); + $this->assertTrue($result2); + } + + /** + * This test the method setInfo. + * @covers ProcessMaker\PHPReflectionClass\ClassStructure::setInfo + * @test + */ + public function testSetInfo() + { + $this->object->setInfo("test1", "testing"); + $this->assertEquals($this->object->info["test1"], "testing"); + } + + /** + * This test the method setMethod. + * @covers ProcessMaker\PHPReflectionClass\ClassStructure::setMethod + * @test + */ + public function testSetMethod() + { + //assert false + $result1 = $this->object->setMethod(null); + $this->assertFalse($result1); + + //assert true + $method = new MethodStructure("testing"); + $result2 = $this->object->setMethod($method); + $this->assertTrue($result2); + } +} diff --git a/tests/unit/workflow/engine/src/ProcessMaker/PHPReflectionClass/MethodStructureTest.php b/tests/unit/workflow/engine/src/ProcessMaker/PHPReflectionClass/MethodStructureTest.php new file mode 100644 index 000000000..caf487f35 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/PHPReflectionClass/MethodStructureTest.php @@ -0,0 +1,62 @@ +object = new MethodStructure("test"); + } + + /** + * This test the method getInfo. + * @covers ProcessMaker\PHPReflectionClass\MethodStructure::getInfo + * @test + */ + public function testGetInfo() + { + //assert false + $result1 = $this->object->getInfo("test"); + $this->assertFalse($result1); + + //assert true + $this->object->info["test2"] = []; + $result2 = $this->object->getInfo("test2"); + $this->assertEquals([], $result2); + } + + /** + * This test the method setInfo. + * @covers ProcessMaker\PHPReflectionClass\MethodStructure::setInfo + * @test + */ + public function testSetInfo() + { + $this->object->setInfo("test1", "test1"); + $this->assertEquals("test1", $this->object->info["test1"]); + } + + /** + * This test the method setParam. + * @covers ProcessMaker\PHPReflectionClass\MethodStructure::setParam + * @test + */ + public function testSetParam() + { + $this->object->setParam("test2", "test2"); + $this->assertEquals("test2", $this->object->params["test2"]); + } +} diff --git a/thirdparty/wizard/include.php b/thirdparty/wizard/include.php deleted file mode 100644 index 0dccd53ff..000000000 --- a/thirdparty/wizard/include.php +++ /dev/null @@ -1,39 +0,0 @@ - diff --git a/thirdparty/wizard/org/active-link/doc/DocHTML.php b/thirdparty/wizard/org/active-link/doc/DocHTML.php deleted file mode 100644 index eb33d0071..000000000 --- a/thirdparty/wizard/org/active-link/doc/DocHTML.php +++ /dev/null @@ -1,242 +0,0 @@ -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 deleted file mode 100644 index 171f49338..000000000 --- a/thirdparty/wizard/org/active-link/doc/Method.php +++ /dev/null @@ -1,83 +0,0 @@ -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 deleted file mode 100644 index efaff865f..000000000 --- a/thirdparty/wizard/org/active-link/doc/PHPClass.php +++ /dev/null @@ -1,195 +0,0 @@ -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/classes/TriggerLibrary.php b/workflow/engine/classes/TriggerLibrary.php
index 5694c4d75..94ab6362b 100644
--- a/workflow/engine/classes/TriggerLibrary.php
+++ b/workflow/engine/classes/TriggerLibrary.php
@@ -1,4 +1,6 @@
parseFromFile($file);
-
return $parsedLibrary;
}
diff --git a/workflow/engine/src/ProcessMaker/PHPReflectionClass/ClassStructure.php b/workflow/engine/src/ProcessMaker/PHPReflectionClass/ClassStructure.php
new file mode 100644
index 000000000..ee917fc5e
--- /dev/null
+++ b/workflow/engine/src/ProcessMaker/PHPReflectionClass/ClassStructure.php
@@ -0,0 +1,172 @@
+methods = [];
+ $this->properties = [];
+ $this->info = [];
+ if ($filename != "") {
+ $this->parseFromFile($filename);
+ }
+ }
+
+ /**
+ * Remove a property by name.
+ * @param string $name
+ * @return boolean
+ */
+ public function deleteInfo(string $name): bool
+ {
+ if (array_key_exists($name, $this->info)) {
+ unset($this->info[$name]);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Get a property value by name.
+ * @param string $name
+ * @return mixed
+ */
+ public function getInfo(string $name)
+ {
+ if (array_key_exists($name, $this->info)) {
+ return $this->info[$name];
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Sets a property by name.
+ * @param string $name
+ * @param string $value
+ * @return void
+ */
+ public function setInfo(string $name, string $value): void
+ {
+ $this->info[$name] = $value;
+ }
+
+ /**
+ * Adds a method to the class definition.
+ * @param type $method
+ * @return bool
+ */
+ public function setMethod($method): bool
+ {
+ if (is_object($method) && (new ReflectionClass($method))->getShortName() == "MethodStructure") {
+ $this->methods[$method->getInfo("name")] = $method;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Parses a source code, require a filename.
+ * @param string $filename
+ * @return bool
+ */
+ public function parseFromFile(string $filename): bool
+ {
+ if (file_exists($filename) && is_readable($filename)) {
+ $arrContents = file($filename);
+ $parsing = false;
+ $parsingBlocks = [];
+ $tempBlock = [];
+ foreach ($arrContents as $line) {
+ if (trim($line) == "/**") {
+ $parsing = true;
+ $blockstart = true;
+ } elseif ($parsing && trim($line) == "*/") {
+ $parsing = false;
+ $parsingBlocks[] = $tempBlock;
+ $tempBlock = [];
+ } else {
+ if ($parsing) {
+ if ($blockstart) {
+ $tempBlock[] = $line;
+ $blockstart = false;
+ } else {
+ $tempBlock[] = $line;
+ }
+ }
+ }
+ }
+ foreach ($parsingBlocks as $blockLines) {
+ $block = [];
+ 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;
+ }
+ if (array_key_exists("method", $block)) {
+ $tempMethod = new MethodStructure($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);
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/workflow/engine/src/ProcessMaker/PHPReflectionClass/MethodStructure.php b/workflow/engine/src/ProcessMaker/PHPReflectionClass/MethodStructure.php
new file mode 100644
index 000000000..172adb22c
--- /dev/null
+++ b/workflow/engine/src/ProcessMaker/PHPReflectionClass/MethodStructure.php
@@ -0,0 +1,69 @@
+info = [];
+ $this->params = [];
+ $this->setInfo("name", $name);
+ }
+
+ /**
+ * Get value of a property by name.
+ * @param string $name
+ * @return mixed
+ */
+ public function getInfo(string $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.
+ * @param string $name
+ * @param string $value
+ * @return void
+ */
+ public function setInfo(string $name, string $value): void
+ {
+ $this->info[$name] = $value;
+ }
+
+ /**
+ * Sets a parameter with supplied name and value.
+ * @param string $name
+ * @param string $value
+ * @return void
+ */
+ public function setParam(string $name, string $value): void
+ {
+ $this->params[$name] = $value;
+ }
+}