diff --git a/workflow/engine/classes/class.cli.php b/workflow/engine/classes/class.cli.php index b452de2cd..0ab097300 100755 --- a/workflow/engine/classes/class.cli.php +++ b/workflow/engine/classes/class.cli.php @@ -1,7 +1,9 @@ . + * along with this program. If not, see . * * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. @@ -26,297 +28,313 @@ */ /** - * @package workflow.engine.classes + * + * @package workflow.engine.classes */ -class CLI { - public static $tasks = array(); - public static $currentTask = NULL; +class CLI +{ + public static $tasks = array (); + public static $currentTask = NULL; - /** - * Adds a new task defined by it's name. All other task functions will - * remember the current task defined here. - * - * @param string $name name of the task, used in the command-line - */ - public static function taskName($name) { - self::$currentTask = $name; - self::$tasks[$name] = array( - 'name' => $name, - 'description' => NULL, - 'args' => array(), - 'function' => NULL, - 'opt' => array('short' => '', 'long' => array(), 'descriptions' => array()) - ); - } + /** + * Adds a new task defined by it's name. + * All other task functions will + * remember the current task defined here. + * + * @param string $name name of the task, used in the command-line + */ + public static function taskName ($name) + { + self::$currentTask = $name; + self::$tasks[$name] = array ('name' => $name,'description' => NULL,'args' => array (),'function' => NULL,'opt' => array ('short' => '','long' => array (),'descriptions' => array () + ) + ); + } - /** - * Adds a description to the current task. The description should contain a - * one-line description of the command and a few lines of text with more - * information. - * - * @param string $description task description - */ - public static function taskDescription($description) { - assert(self::$currentTask !== NULL); - self::$tasks[self::$currentTask]["description"] = $description; - } + /** + * Adds a description to the current task. + * The description should contain a + * one-line description of the command and a few lines of text with more + * information. + * + * @param string $description task description + */ + public static function taskDescription ($description) + { + assert( self::$currentTask !== NULL ); + self::$tasks[self::$currentTask]["description"] = $description; + } - /** - * Adds an argument to the current task. The options will affect how it is - * displayed in the help command. Optional will put [] in the argument and - * multiple will put ... in the end. Arguments are displayed together with - * the task name in the help command. - * - * @param string $name argument name - */ - public static function taskArg($name, $optional = true, $multiple = false) { - assert(self::$currentTask !== NULL); - self::$tasks[self::$currentTask]["args"][$name] = array( - 'optional' => $optional, - 'multiple' => $multiple - ); - } + /** + * Adds an argument to the current task. + * The options will affect how it is + * displayed in the help command. Optional will put [] in the argument and + * multiple will put ... in the end. Arguments are displayed together with + * the task name in the help command. + * + * @param string $name argument name + */ + public static function taskArg ($name, $optional = true, $multiple = false) + { + assert( self::$currentTask !== NULL ); + self::$tasks[self::$currentTask]["args"][$name] = array ('optional' => $optional,'multiple' => $multiple + ); + } - /** - * Defines short and long options as used by getopt to the current task. - * - * @param string $short short options - * @param array $long long options - */ - public static function taskOpt($name, $description, $short, $long = NULL) { - assert(self::$currentTask !== NULL); - $opts = self::$tasks[self::$currentTask]["opt"]; - if ($short) - $opts['short'] .= $short; - if ($long) - $opts['long'][] = $long; - $opts['descriptions'][$name] = array('short' => $short, 'long' => $long, - 'description' => $description); - self::$tasks[self::$currentTask]["opt"] = $opts; - } + /** + * Defines short and long options as used by getopt to the current task. + * + * @param string $short short options + * @param array $long long options + */ + public static function taskOpt ($name, $description, $short, $long = NULL) + { + assert( self::$currentTask !== NULL ); + $opts = self::$tasks[self::$currentTask]["opt"]; + if ($short) + $opts['short'] .= $short; + if ($long) + $opts['long'][] = $long; + $opts['descriptions'][$name] = array ('short' => $short,'long' => $long,'description' => $description + ); + self::$tasks[self::$currentTask]["opt"] = $opts; + } - /** - * Defines the function to run for the current task. - * - * @param callback $function function to run - */ - public static function taskRun($function) { - assert(self::$currentTask !== NULL); - self::$tasks[self::$currentTask]["function"] = $function; - } + /** + * Defines the function to run for the current task. + * + * @param callback $function function to run + */ + public static function taskRun ($function) + { + assert( self::$currentTask !== NULL ); + self::$tasks[self::$currentTask]["function"] = $function; + } - /** - * Displays the help instructions. - * - * @param array $args if defined, the task name should be argument 0 - * @param array $opts options as returned by getopt - */ - public static function help($args, $opts = NULL) { - global $argv; - $scriptName = $argv[0]; - if (is_array($args)) - $taskName = $args[0]; - else - $taskName = $args; + /** + * Displays the help instructions. + * + * @param array $args if defined, the task name should be argument 0 + * @param array $opts options as returned by getopt + */ + public static function help ($args, $opts = NULL) + { + global $argv; + $scriptName = $argv[0]; + if (is_array( $args )) + $taskName = $args[0]; + else + $taskName = $args; - if (!$taskName) { - echo "usage: $scriptName [options] [args]\n"; - echo "Type '$scriptName help ' for help on a specific task\n"; - echo "\nAvailable tasks:\n"; - $tasks = array(); - ksort(self::$tasks); - foreach (self::$tasks as $name => $data) { - $description = explode("\n", $data['description']); - $tasks[] = " $name"; - } - $tasks = join("\n", $tasks); - echo $tasks . "\n\n"; - } else { - $valid_args = array(); - foreach(self::$tasks[$taskName]['args'] as $arg => $data) { - $arg = strtoupper($arg); - if ($data['multiple']) - $arg = "$arg..."; - if ($data['optional']) - $arg = "[$arg]"; - $valid_args[] = $arg; - } - $valid_args = join(" ", $valid_args); - $description = explode("\n", self::$tasks[$taskName]['description']); - $taskDescription = trim(array_shift($description)); - $description = trim(implode("\n", $description)); - $message = <<< EOT + if (! $taskName) { + echo "usage: $scriptName [options] [args]\n"; + echo "Type '$scriptName help ' for help on a specific task\n"; + echo "\nAvailable tasks:\n"; + $tasks = array (); + ksort( self::$tasks ); + foreach (self::$tasks as $name => $data) { + $description = explode( "\n", $data['description'] ); + $tasks[] = " $name"; + } + $tasks = join( "\n", $tasks ); + echo $tasks . "\n\n"; + } else { + $valid_args = array (); + foreach (self::$tasks[$taskName]['args'] as $arg => $data) { + $arg = strtoupper( $arg ); + if ($data['multiple']) + $arg = "$arg..."; + if ($data['optional']) + $arg = "[$arg]"; + $valid_args[] = $arg; + } + $valid_args = join( " ", $valid_args ); + $description = explode( "\n", self::$tasks[$taskName]['description'] ); + $taskDescription = trim( array_shift( $description ) ); + $description = trim( implode( "\n", $description ) ); + $message = <<< EOT $taskName: {$taskDescription} Usage: $scriptName $taskName $valid_args $description EOT; - $valid_options = array(); - foreach(self::$tasks[$taskName]['opt']['descriptions'] as $opt => $data) { - $optString = array(); - if ($data['short']) - $optString[] = "-{$data['short']}"; - if ($data['long']) - $optString[] = "--{$data['long']}"; - $valid_options[] = " " . join(", ", $optString) . "\n\t" . wordwrap($data['description'], 70, "\n\t"); - } - $valid_options = join("\n", $valid_options); - if ($valid_options) { - $message .= <<< EOT + $valid_options = array (); + foreach (self::$tasks[$taskName]['opt']['descriptions'] as $opt => $data) { + $optString = array (); + if ($data['short']) + $optString[] = "-{$data['short']}"; + if ($data['long']) + $optString[] = "--{$data['long']}"; + $valid_options[] = " " . join( ", ", $optString ) . "\n\t" . wordwrap( $data['description'], 70, "\n\t" ); + } + $valid_options = join( "\n", $valid_options ); + if ($valid_options) { + $message .= <<< EOT Options: - + $valid_options EOT; - } - echo $message . "\n"; - } - } - - /** - * Run the CLI task, which will check which command is specified and run it. - */ - public static function run() { - CLI::taskName("help"); - CLI::taskRun(array('self', 'help')); - global $argv; - $args = $argv; - $cliname = array_shift($args); - $taskName = array_shift($args); - while ($taskName{0} == '-') - $taskName = array_shift($args); - if (!$taskName) { - echo self::error("Specify a task from the list below.") . "\n\n"; - self::help(NULL, NULL); - return; - } - $taskData = NULL; - foreach (self::$tasks as $name => $data) { - if (strcasecmp($name, $taskName) === 0) { - $taskData = $data; - break; - } - } - if (!$taskData) { - echo self::error("Command not found: '$taskName'") . "\n\n"; - self::help(NULL, NULL); - return; - } - G::LoadThirdParty('pear/Console', 'Getopt'); - $short = "h" . $taskData['opt']['short']; - $long = array_merge(array("help"), $taskData['opt']['long']); - $getopt = Console_GetOpt::getopt2($args, $short, $long); - if (!is_array($getopt)) { - echo self::error("Invalid options (" . $getopt->getMessage() . ")") . "\n\n"; - self::help($taskName); - return; - } - list($options, $arguments) = $getopt; - foreach ($taskData['opt']['descriptions'] as $optName => $optDescription) { - $short = str_replace(":", "", $optDescription['short']); - $long = str_replace("=", "", $optDescription['long']); - $validOpts[$short] = $optName; - $validOpts[$long] = $optName; - } - $taskOpts = array(); - try { - foreach ($options as $opt) { - list($optName, $optArg) = $opt; - if ($optName === "h" || $optName === "--help") { - self::help($taskName); - return; + } + echo $message . "\n"; } - if (strpos($optName, '--') === 0) - $optName = substr($optName, 2); - if (!array_key_exists($optName, $validOpts)) - throw new Exception("option not found: $optName"); - if (array_key_exists($validOpts[$optName], $taskOpts)) - throw new Exception("'$optName' specified more then once"); - $taskOpts[$validOpts[$optName]] = $optArg; - } - } catch (Exception $e) { - echo self::error("Invalid options: " . $e->getMessage()) . "\n\n"; - self::help($taskName); - return; } - try { - call_user_func($taskData['function'], $arguments, $taskOpts); - } catch (Exception $e) { - echo self::error("\n Error executing '$taskName':\n\n {$e->getMessage()}\n") . "\n"; + + /** + * Run the CLI task, which will check which command is specified and run it. + */ + public static function run () + { + CLI::taskName( "help" ); + CLI::taskRun( array ('self','help' + ) ); + global $argv; + $args = $argv; + $cliname = array_shift( $args ); + $taskName = array_shift( $args ); + while ($taskName{0} == '-') + $taskName = array_shift( $args ); + if (! $taskName) { + echo self::error( "Specify a task from the list below." ) . "\n\n"; + self::help( NULL, NULL ); + return; + } + $taskData = NULL; + foreach (self::$tasks as $name => $data) { + if (strcasecmp( $name, $taskName ) === 0) { + $taskData = $data; + break; + } + } + if (! $taskData) { + echo self::error( "Command not found: '$taskName'" ) . "\n\n"; + self::help( NULL, NULL ); + return; + } + G::LoadThirdParty( 'pear/Console', 'Getopt' ); + $short = "h" . $taskData['opt']['short']; + $long = array_merge( array ("help" + ), $taskData['opt']['long'] ); + $getopt = Console_GetOpt::getopt2( $args, $short, $long ); + if (! is_array( $getopt )) { + echo self::error( "Invalid options (" . $getopt->getMessage() . ")" ) . "\n\n"; + self::help( $taskName ); + return; + } + list ($options, $arguments) = $getopt; + foreach ($taskData['opt']['descriptions'] as $optName => $optDescription) { + $short = str_replace( ":", "", $optDescription['short'] ); + $long = str_replace( "=", "", $optDescription['long'] ); + $validOpts[$short] = $optName; + $validOpts[$long] = $optName; + } + $taskOpts = array (); + try { + foreach ($options as $opt) { + list ($optName, $optArg) = $opt; + if ($optName === "h" || $optName === "--help") { + self::help( $taskName ); + return; + } + if (strpos( $optName, '--' ) === 0) + $optName = substr( $optName, 2 ); + if (! array_key_exists( $optName, $validOpts )) + throw new Exception( "option not found: $optName" ); + if (array_key_exists( $validOpts[$optName], $taskOpts )) + throw new Exception( "'$optName' specified more then once" ); + $taskOpts[$validOpts[$optName]] = $optArg; + } + } catch (Exception $e) { + echo self::error( "Invalid options: " . $e->getMessage() ) . "\n\n"; + self::help( $taskName ); + return; + } + try { + call_user_func( $taskData['function'], $arguments, $taskOpts ); + } catch (Exception $e) { + echo self::error( "\n Error executing '$taskName':\n\n {$e->getMessage()}\n" ) . "\n"; + } } - } - /** - * Returns an information colorized version of the message. - * - * @param string $message the message to colorize - */ - public static function info($message) { - return pakeColor::colorize($message, "INFO"); - } - - /** - * Returns a warning colorized version of the message. - * - * @param string $message the message to colorize - */ - public static function warning($message) { - return pakeColor::colorize($message, "COMMENT"); - } - - /** - * Returns an error colorized version of the message. - * - * @param string $message the message to colorize - */ - public static function error($message) { - return pakeColor::colorize($message, "ERROR"); - } - - /** - * Prompt the user for information. - * - * @param string $message the message to display - * @return string the text typed by the user - */ - public static function prompt($message) { - echo "$message"; - $handle = fopen ("php://stdin","r"); - $line = fgets($handle); - return $line; - } - - /** - * Ask a question of yes or no. - * - * @param string $message the message to display - * @return bool true if the user choosed no, false otherwise - */ - public static function question($message) { - $input = strtolower(self::prompt("$message [Y/n] ")); - return (array_search(trim($input), array("y", "")) !== false); - } - - /** - * Display a message to the user. If filename is specified, it will setup - * a logging file where all messages will be recorded. - * - * @param string $message the message to display - * @param string $filename the log file to write messages - */ - public static function logging($message, $filename = NULL) { - static $log_file = NULL; - if (isset($filename)) { - $log_file = fopen($filename, "a"); - fwrite($log_file, " -- " . date("c") . " " . $message . " --\n"); - } else { - if (isset($log_file)) - fwrite($log_file, $message); - echo $message; + /** + * Returns an information colorized version of the message. + * + * @param string $message the message to colorize + */ + public static function info ($message) + { + return pakeColor::colorize( $message, "INFO" ); + } + + /** + * Returns a warning colorized version of the message. + * + * @param string $message the message to colorize + */ + public static function warning ($message) + { + return pakeColor::colorize( $message, "COMMENT" ); + } + + /** + * Returns an error colorized version of the message. + * + * @param string $message the message to colorize + */ + public static function error ($message) + { + return pakeColor::colorize( $message, "ERROR" ); + } + + /** + * Prompt the user for information. + * + * @param string $message the message to display + * @return string the text typed by the user + */ + public static function prompt ($message) + { + echo "$message"; + $handle = fopen( "php://stdin", "r" ); + $line = fgets( $handle ); + return $line; + } + + /** + * Ask a question of yes or no. + * + * @param string $message the message to display + * @return bool true if the user choosed no, false otherwise + */ + public static function question ($message) + { + $input = strtolower( self::prompt( "$message [Y/n] " ) ); + return (array_search( trim( $input ), array ("y","" + ) ) !== false); + } + + /** + * Display a message to the user. + * If filename is specified, it will setup + * a logging file where all messages will be recorded. + * + * @param string $message the message to display + * @param string $filename the log file to write messages + */ + public static function logging ($message, $filename = NULL) + { + static $log_file = NULL; + if (isset( $filename )) { + $log_file = fopen( $filename, "a" ); + fwrite( $log_file, " -- " . date( "c" ) . " " . $message . " --\n" ); + } else { + if (isset( $log_file )) + fwrite( $log_file, $message ); + echo $message; + } } - } } ?> \ No newline at end of file