* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2023 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.shipsimu.org * @deprecated See LoggerFactory for a more flexible approach * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ class DebugMiddleware extends BaseMiddleware implements Registerable, Logger { /** * An instance of this class */ private static $selfInstance = NULL; /** * Protected constructor * * @return void */ private function __construct () { // Call parent constructor //* NOISY-DEBUG: */ printf('[%s:%d]: CONSTRUCTED!' . PHP_EOL, __METHOD__, __LINE__); parent::__construct(__CLASS__); // Trace message //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } /** * Create a new debug output system. * If no output is given this class is currently being used for back-fall. * This fall-back mechanism will become deprecated very soon. * * @param $outputClass The class name which we shall use for * registering the *real* debug output * @param $className Class where a output should be created and * configured for * @return $debugInstance An instance of this middleware class * @throws InvalidArgumentException If a parameter has an invalid value */ public static final function createDebugMiddleware (string $outputClass, string $className) { // Check parameter //* NOISY-DEBUG: */ printf('[%s:%d]: outputClass=%s,className=%s - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $outputClass, $className); if (empty($outputClass)) { // Throw IAE throw new InvalidArgumentException('Parameter "outputClass" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } elseif (empty($className)) { // Throw IAE throw new InvalidArgumentException('Parameter "className" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } // Is a static instance there? //* NOISY-DEBUG: */ printf('[%s:%d]: self::selfInstance[]=%s' . PHP_EOL, __METHOD__, __LINE__, gettype(self::$selfInstance)); if (is_null(self::$selfInstance)) { // Create an instance if this middleware self::$selfInstance = new DebugMiddleware(); } // Is there a valid output instance provided? //* NOISY-DEBUG: */ printf('[%s:%d]: outputClass=%s' . PHP_EOL, __METHOD__, __LINE__, $outputClass); if (class_exists($outputClass) && is_null(self::$selfInstance->getOutputInstance())) { // A name for a debug output class has been provided so we try to get it //* NOISY-DEBUG: */ printf('[%s:%d]: Initializing outputClass=%s ...' . PHP_EOL, __METHOD__, __LINE__, $outputClass); $outputInstance = ObjectFactory::createObjectByName($outputClass); // Set this as output class //* NOISY-DEBUG: */ printf('[%s:%d]: outputInstance=%s' . PHP_EOL, __METHOD__, __LINE__, $outputInstance->__toString()); self::$selfInstance->setOutputInstance($outputInstance); } // Is the output class loadable and an output instance is set? if (class_exists($outputClass) && !is_null(self::$selfInstance->getOutputInstance())) { // Then set class name //* NOISY-DEBUG: */ printf('[%s:%d]: Setting className=%s as logger class ...' . PHP_EOL, __METHOD__, __LINE__, $className); self::$selfInstance->getOutputInstance()->setLoggerClassName($className); } // Return instance //* NOISY-DEBUG: */ printf('[%s:%d]: debugInstance=%s - EXIT!' . PHP_EOL, __METHOD__, __LINE__, self::$selfInstance->__toString()); return self::$selfInstance; } /** * This method shall send debug output which can be HTML code for the * browser or debug lines for a log file, etc. to the registered debug * output instance. * * @param $message Data we shall 'stream' out to the world * @param $stripTags Whether HTML tags shall be stripped out * @return void * @throws NullPointerException If this->outputInstance is NULL */ private function outputMessage (string $logLevel, string $message, bool $stripTags = false) { // Get backtrace //* NOISY-DEBUG: */ printf('[%s:%d]: logLevel=%s,message=%s,stripTags=%d - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $logLevel, $message, intval($stripTags)); $backtrace = debug_backtrace(!DEBUG_BACKTRACE_PROVIDE_OBJECT); // Is the deprecated debugOutput() or partialStub() invoked before? if (isset($backtrace[4]) && $backtrace[3]['function'] == 'partialStub') { // Prepend class::function:line from 2nd element //* NOISY-DEBUG: */ printf('[%s:%d]: partialStub() was invoked ...' . PHP_EOL, __METHOD__, __LINE__); $message = sprintf('[%s] [%s::%s:%d]: %s', $logLevel, $backtrace[4]['class'], $backtrace[4]['function'], (isset($backtrace[4]['line']) ? $backtrace[4]['line'] : '0'), $message ); } elseif (isset($backtrace[3]) && $backtrace[2]['function'] == 'debugOutput') { // Prepend class::function:line from 2nd element //* NOISY-DEBUG: */ printf('[%s:%d]: debugOutput() was invoked ...' . PHP_EOL, __METHOD__, __LINE__); $message = sprintf('[%s] [%s::%s:%d]: %s', $logLevel, $backtrace[3]['class'], $backtrace[3]['function'], (isset($backtrace[3]['line']) ? $backtrace[3]['line'] : '0'), $message ); } else { // Prepend class::function:line from 2nd element //* NOISY-DEBUG: */ printf('[%s:%d]: Ordinary invocation ...' . PHP_EOL, __METHOD__, __LINE__); $message = sprintf('[%s] [%s::%s:%d]: %s', $logLevel, $backtrace[2]['class'], $backtrace[2]['function'], (isset($backtrace[2]['line']) ? $backtrace[2]['line'] : '0'), $message ); } // Use the output instance $this->getOutputInstance()->outputStream($message, $stripTags); // Trace message //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } /** * Getter for an instance of this class * * @return $selfInstance An instance of this class */ public static final function getSelfInstance() { return self::$selfInstance; } /** * Outputs a trace message whether to debug instance (should be set!) or * dies with or ptints the message. Do NEVER EVER rewrite the exit() call to * ApplicationEntryPoint::app_exit(), this would cause an endless loop. * * @param $message Message we shall send out... * @param $doPrint Whether print or die here (default: print) * @paran $stripTags Whether to strip tags (default: false) * @return void * @throws InvalidArgumentException If a parameter has an invalid value * @throws NullPointerException If this->outputInstance is NULL * @todo Remove $doPrint parameter */ public function traceMessage (string $message, bool $doPrint = true, bool $stripTags = false) { // Check parameter //* NOISY-DEBUG: */ printf('[%s:%d]: message=%s,doPrint=%d,stripTags=%d - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $message, intval($doPrint), intval($stripTags)); if (empty($message)) { // Throw IAE throw new InvalidArgumentException('Parameter "message" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } elseif (is_null($this->getOutputInstance())) { // Should not be NULL throw new NullPointerException($this, FrameworkInterface::EXCEPTION_IS_NULL_POINTER); } // Use debug output handler //* NOISY-DEBUG: */ printf('[%s:%d]: Invoking this->outputMessage(%s,%s,%d) ...' . PHP_EOL, __METHOD__, __LINE__, Logger::LOGGER_LEVEL_TRACE, $message, intval($stripTags)); $this->outputMessage(Logger::LOGGER_LEVEL_TRACE, $message, $stripTags); // Trace message //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } /** * Outputs a debug message whether to debug instance (should be set!) or * dies with or ptints the message. Do NEVER EVER rewrite the exit() call to * ApplicationEntryPoint::app_exit(), this would cause an endless loop. * * @param $message Message we shall send out... * @param $doPrint Whether print or die here (default: print) * @paran $stripTags Whether to strip tags (default: false) * @return void * @throws InvalidArgumentException If a parameter has an invalid value * @throws NullPointerException If this->outputInstance is NULL * @todo Remove $doPrint parameter */ public function debugMessage (string $message, bool $doPrint = true, bool $stripTags = false) { // Check parameter //* NOISY-DEBUG: */ printf('[%s:%d]: message=%s,doPrint=%d,stripTags=%d - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $message, intval($doPrint), intval($stripTags)); if (empty($message)) { // Throw IAE throw new InvalidArgumentException('Parameter "message" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } elseif (is_null($this->getOutputInstance())) { // Should not be NULL throw new NullPointerException($this, FrameworkInterface::EXCEPTION_IS_NULL_POINTER); } // Use debug output handler //* NOISY-DEBUG: */ printf('[%s:%d]: Invoking this->outputMessage(%s,%s,%d) ...' . PHP_EOL, __METHOD__, __LINE__, $message, intval($stripTags)); $this->outputMessage(Logger::LOGGER_LEVEL_DEBUG, $message, $stripTags); // Trace message //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } /** * Outputs an informational message whether to debug instance (should be set!) or * dies with or ptints the message. Do NEVER EVER rewrite the exit() call to * ApplicationEntryPoint::app_exit(), this would cause an endless loop. * * @param $message Message we shall send out... * @param $doPrint Whether print or die here (default: print) * @paran $stripTags Whether to strip tags (default: false) * @return void * @throws InvalidArgumentException If a parameter has an invalid value * @throws NullPointerException If this->outputInstance is NULL * @todo Remove $doPrint parameter */ public function infoMessage (string $message, bool $doPrint = true, bool $stripTags = false) { // Check parameter //* NOISY-DEBUG: */ printf('[%s:%d]: message=%s,doPrint=%d,stripTags=%d - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $message, intval($doPrint), intval($stripTags)); if (empty($message)) { // Throw IAE throw new InvalidArgumentException('Parameter "message" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } elseif (is_null($this->getOutputInstance())) { // Should not be NULL throw new NullPointerException($this, FrameworkInterface::EXCEPTION_IS_NULL_POINTER); } // Use debug output handler //* NOISY-DEBUG: */ printf('[%s:%d]: Invoking this->outputMessage(%s,%s,%d) ...' . PHP_EOL, __METHOD__, __LINE__, Logger::LOGGER_LEVEL_INFO, $message, intval($stripTags)); $this->outputMessage(Logger::LOGGER_LEVEL_INFO, $message, $stripTags); // Trace message //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } /** * Outputs a warning message whether to debug instance (should be set!) or * dies with or ptints the message. Do NEVER EVER rewrite the exit() call to * ApplicationEntryPoint::app_exit(), this would cause an endless loop. * * @param $message Message we shall send out... * @param $doPrint Whether print or die here (default: print) * @paran $stripTags Whether to strip tags (default: false) * @return void * @throws InvalidArgumentException If a parameter has an invalid value * @throws NullPointerException If this->outputInstance is NULL * @todo Remove $doPrint parameter */ public function warningMessage (string $message, bool $doPrint = true, bool $stripTags = false) { // Check parameter //* NOISY-DEBUG: */ printf('[%s:%d]: message=%s,doPrint=%d,stripTags=%d - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $message, intval($doPrint), intval($stripTags)); if (empty($message)) { // Throw IAE throw new InvalidArgumentException('Parameter "message" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } elseif (is_null($this->getOutputInstance())) { // Should not be NULL throw new NullPointerException($this, FrameworkInterface::EXCEPTION_IS_NULL_POINTER); } // Use debug output handler //* NOISY-DEBUG: */ printf('[%s:%d]: Invoking this->outputMessage(%s,%s,%d) ...' . PHP_EOL, __METHOD__, __LINE__, Logger::LOGGER_LEVEL_WARNING, $message, intval($stripTags)); $this->outputMessage(Logger::LOGGER_LEVEL_WARNING, $message, $stripTags); // Trace message //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } /** * Output a partial stub message for the caller method * * @param $message An optional message to display * @return void */ public function partialStub (string $message = '') { // Init variable //* NOISY-DEBUG: */ printf('[%s:%d]: message=%s - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $message); $stubMessage = 'Partial stub!'; // Is an extra message given? if (!empty($message)) { // Then add it as well $stubMessage .= ' Message: ' . $message; } // Output stub message //* NOISY-DEBUG: */ printf('[%s:%d]: Invoking this->outputMessage(%s,%s) ...' . PHP_EOL, __METHOD__, __LINE__, Logger::LOGGER_LEVEL_WARNING, $subMessage); $this->outputMessage(Logger::LOGGER_LEVEL_WARNING, $stubMessage); // Trace message //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } /** * Outputs a deprecated message whether to debug instance (should be set!) or * dies with or ptints the message. Do NEVER EVER rewrite the exit() call to * ApplicationEntryPoint::app_exit(), this would cause an endless loop. * * @param $message Message we shall send out... * @param $doPrint Whether print or die here (default: print) * @paran $stripTags Whether to strip tags (default: false) * @return void * @throws InvalidArgumentException If a parameter has an invalid value * @throws NullPointerException If this->outputInstance is NULL * @todo Remove $doPrint parameter * @todo When all old method invocations are fixed, renamed this do deprecatedMessage */ public function debugOutput (string $message, bool $doPrint = true, bool $stripTags = false) { // Check parameter //* NOISY-DEBUG: */ printf('[%s:%d]: message=%s,doPrint=%d,stripTags=%d - CALLED!' . PHP_EOL, __METHOD__, __LINE__, $message, intval($doPrint), intval($stripTags)); if (empty($message)) { // Throw IAE throw new InvalidArgumentException('Parameter "message" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } elseif (is_null($this->getOutputInstance())) { // Should not be NULL throw new NullPointerException($this, FrameworkInterface::EXCEPTION_IS_NULL_POINTER); } // Invoke Inner method //* NOISY-DEBUG: */ printf('[%s:%d]: Invoking this->outputMessage(%s,%s) ...' . PHP_EOL, __METHOD__, __LINE__, Logger::LOGGER_LEVEL_DEPRECATED, $subMessage); $this->outputMessage(Logger::LOGGER_LEVEL_DEPRECATED, $message, $doPrint, $stripTags); // Trace message //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__); } }