+
+ /**
+ * Private getter for file IO instance
+ *
+ * @return $fileIoInstance An instance to the file I/O sub-system
+ */
+ protected final function getFileIoInstance () {
+ return $this->fileIoInstance;
+ }
+
+ /**
+ * Setter for file I/O instance
+ *
+ * @param $fileIoInstance An instance to the file I/O sub-system
+ * @return void
+ */
+ public final function setFileIoInstance (FileIoHandler $fileIoInstance) {
+ $this->fileIoInstance = $fileIoInstance;
+ }
+
+ /**
+ * Prepare the template engine (WebTemplateEngine by default) for a given
+ * application helper instance (ApplicationHelper by default).
+ *
+ * @param $appInstance An application helper instance or
+ * null if we shall use the default
+ * @return $tplEngine The template engine instance
+ * @throws NullPointerException If the template engine could not
+ * be initialized
+ * @throws UnsupportedTemplateEngineException If $tplEngine is an
+ * unsupported template engine
+ * @throws MissingLanguageHandlerException If the language sub-system
+ * is not yet initialized
+ * @throws NullPointerException If the discovered application
+ * instance is still null
+ */
+ protected function prepareTemplateEngine (BaseFrameworkSystem $appInstance=null) {
+ // Is the application instance set?
+ if (is_null($appInstance)) {
+ // Get the current instance
+ $appInstance = $this->getApplicationInstance();
+
+ // Still null?
+ if (is_null($appInstance)) {
+ // Thrown an exception
+ throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
+ }
+ }
+
+ // Generate FQFN for all application templates
+ $fqfn = sprintf("%s%s/%s/%s",
+ PATH,
+ $this->getConfigInstance()->readConfig('application_path'),
+ strtolower($appInstance->getAppShortName()),
+ $this->getConfigInstance()->readConfig('tpl_base_path')
+ );
+
+ // Are both instances set?
+ if ($appInstance->getLanguageInstance() === null) {
+ // Invalid language instance
+ throw new MissingLanguageHandlerException($appInstance, self::EXCEPTION_MISSING_LANGUAGE_HANDLER);
+ } elseif ($appInstance->getFileIoInstance() === null) {
+ // Invalid language instance
+ throw new MissingFileIoHandlerException($appInstance, self::EXCEPTION_MISSING_FILE_IO_HANDLER);
+ }
+
+ // Initialize the template engine
+ $tplEngine = ObjectFactory::createObjectByConfiguredName('template_class', array($fqfn, $appInstance->getLanguageInstance(), $appInstance->getFileIoInstance()));
+
+ // Return the prepared instance
+ return $tplEngine;
+ }
+
+ /**
+ * Debugs this instance by putting out it's full content
+ *
+ * @return void
+ */
+ public final function debugInstance () {
+ // Generate the output
+ $content = sprintf("<pre>%s</pre>",
+ trim(print_r($this, true))
+ );
+
+ // Output it
+ ApplicationEntryPoint::app_die(sprintf("<strong>%s debug output:</strong><div id=\"debug_content\">%s</div>Loaded includes: <div id=\"debug_include_list\">%s</div>",
+ $this->__toString(),
+ $content,
+ ClassLoader::getInstance()->getPrintableIncludeList()
+ ));
+ }
+
+ /**
+ * Output a partial stub message for the caller method
+ *
+ * @param $message An optional message to display
+ * @return void
+ */
+ protected function partialStub ($message = "") {
+ // Get the backtrace
+ $backtrace = debug_backtrace();
+
+ // Generate the class::method string
+ $methodName = "UnknownClass->unknownMethod";
+ if ((isset($backtrace[1]['class'])) && (isset($backtrace[1]['function']))) {
+ $methodName = $backtrace[1]['class']."->".$backtrace[1]['function'];
+ }
+
+ // Construct the full message
+ $stubMessage = sprintf("[%s:] Partial stub!",
+ $methodName
+ );
+
+ // Is the extra message given?
+ if (!empty($message)) {
+ // Then add it as well
+ $stubMessage .= sprintf(" Message: <span id=\"stub_message\">%s</span>", $message);
+ }
+
+ // Debug instance is there?
+ if (!is_null($this->getDebugInstance())) {
+ // Output stub message
+ $this->getDebugInstance()->output($stubMessage);
+ } else {
+ // Trigger an error
+ trigger_error($stubMessage."<br />\n");
+ }
+ }
+
+ /**
+ * Outputs a debug backtrace and stops further script execution
+ *
+ * @return void
+ */
+ public function debugBackTrace () {
+ // Sorry, there is no other way getting this nice backtrace
+ print "<pre>\n";
+ debug_print_backtrace();
+ print "</pre>";
+ exit;
+ }
+
+ /**
+ * Outputs a debug message wether to debug instance (should be set!) or dies with or pints the message
+ *
+ * @param $message Message we shall send out...
+ * @param $doPrint Wether we shall print or die here which last is the default
+ * @return void
+ */
+ public function debugOutput ($message, $doPrint = false) {
+ // Get debug instance
+ $debugInstance = $this->getDebugInstance();
+
+ // Is the debug instance there?
+ if (is_object($debugInstance)) {
+ // Use debug output handler
+ $debugInstance->output($message);
+ if (!$doPrint) die(); // Die here if not printed
+ } else {
+ // Put directly out
+ // DO NOT REWRITE THIS TO app_die() !!!
+ if ($doPrint) {
+ print($message);
+ } else {
+ die($message);
+ }
+ }
+ }
+
+ /**
+ * Converts e.g. a command from URL to a valid class by keeping out bad characters
+ *
+ * @param $str The string, what ever it is needs to be converted
+ * @return $className Generated class name
+ */
+ public function convertToClassName ($str) {
+ // Init class name
+ $className = "";
+
+ // Convert all dashes in underscores
+ $str = str_replace("-", "_", $str);
+
+ // Now use that underscores to get classname parts for hungarian style
+ foreach (explode("_", $str) as $strPart) {
+ // Make the class name part lower case and first upper case
+ $className .= ucfirst(strtolower($strPart));
+ } // END - foreach
+
+ // Return class name
+ return $className;
+ }
+
+ /**
+ * Marks up the code by adding e.g. line numbers
+ *
+ * @param $phpCode Unmarked PHP code
+ * @return $markedCode Marked PHP code
+ */
+ public function markupCode ($phpCode) {
+ // Get last error
+ $errorArray = error_get_last();
+
+ // Init the code with error message
+ $markedCode = "";
+ if (is_array($errorArray)) {
+ // Get error infos
+ $markedCode = sprintf("<div id=\"error_header\">File: <span id=\"error_data\">%s</span>, Line: <span id=\"error_data\">%s</span>, Message: <span id=\"error_data\">%s</span>, Type: <span id=\"error_data\">%s</span></div>",
+ basename($errorArray['file']),
+ $errorArray['line'],
+ $errorArray['message'],
+ $errorArray['type']
+ );
+ } // END - if
+
+ // Add line number to the code
+ foreach (explode("\n", $phpCode) as $lineNo=>$code) {
+ // Add line numbers
+ $markedCode .= sprintf("<span id=\"code_line\">%s</span>: %s\n",
+ ($lineNo+1),
+ htmlentities($code, ENT_QUOTES)
+ );
+ } // END - foreach
+
+ // Return the code
+ return $markedCode;
+ }
+
+ /**
+ * Filter a given timestamp to make it look more beatifull for web-based
+ * front-ends. If null is given a message id null_timestamp will be
+ * resolved and returned.
+ *
+ * @param $timestamp Timestamp to prepare (filter) for display
+ * @return $readable A readable timestamp
+ */
+ public function doFilterFormatTimestamp ($timestamp) {
+ // Default value to return
+ $readable = "???";
+
+ // Is the timestamp null?
+ if (is_null($timestamp)) {
+ // Get a message string
+ $readable = $this->getLanguageInstance()->getMessage('null_timestamp');
+ } else {
+ $this->partialStub("Do further analysis on timestamp {$timestamp}.");
+ }
+
+ // Return the stamp
+ return $readable;
+ }