]> git.mxchange.org Git - lfdb2.git/commitdiff
Continued:
authorRoland Häder <roland@mxchange.org>
Sat, 17 Sep 2022 03:28:30 +0000 (05:28 +0200)
committerRoland Häder <roland@mxchange.org>
Sat, 17 Sep 2022 03:28:30 +0000 (05:28 +0200)
- prepared for update

application/lfdb2/class_ApplicationHelper.php
index.php

index d580401c9ce02fcd2df1862f83864ae0924b9bf1..8680157e41e60c7a647146995a847d6048545cc7 100644 (file)
@@ -1,4 +1,19 @@
 <?php
+// Must be this namespace, else the launcher cannot find the class.
+namespace Org\Mxchange\CoreFramework\Helper\Application;
+
+// Import application-specific sutff
+use Org\Shipsimu\Hub\Tools\HubTools;
+
+// Import framework stuff
+use Org\Mxchange\CoreFramework\Application\BaseApplication;
+use Org\Mxchange\CoreFramework\Bootstrap\FrameworkBootstrap;
+use Org\Mxchange\CoreFramework\Factory\Object\ObjectFactory;
+use Org\Mxchange\CoreFramework\Loader\ClassLoader;
+use Org\Mxchange\CoreFramework\Manager\ManageableApplication;
+use Org\Mxchange\CoreFramework\Registry\Registerable;
+use Org\Mxchange\CoreFramework\Template\CompileableTemplate;
+
 /**
  * A class holding general data about the application and some methods for
  * the management including the entry point.
@@ -22,7 +37,7 @@
  *
  * @author             Roland Haeder <webmaster@shipsimu.org>
  * @version            0.0
- * @copyright  Copyright (c) 2013 LFDB2 Developer Team
+ * @copyright  Copyright (c) 2007 - 2008 Roland Haeder, 2009 - 2022 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  *
  * This program is free software: you can redistribute it and/or modify
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-class ApplicationHelper extends BaseFrameworkSystem implements ManageableApplication, Registerable {
-       /**
-        * The version number of this application
-        */
-       private $appVersion = '';
-
-       /**
-        * The human-readable name for this application
-        */
-       private $appName = '';
-
-       /**
-        * The short uni*-like name for this application
-        */
-       private $shortName = '';
-
-       /**
-        * An instance of this class
-        */
-       private static $selfInstance = NULL;
-
+class ApplicationHelper extends BaseApplication implements ManageableApplication, Registerable {
        /**
         * Private constructor
         *
         * @return      void
         */
-       protected function __construct () {
+       private function __construct () {
                // Call parent constructor
                parent::__construct(__CLASS__);
        }
@@ -76,121 +71,57 @@ class ApplicationHelper extends BaseFrameworkSystem implements ManageableApplica
         */
        public static final function getSelfInstance () {
                // Is the instance there?
-               if (is_null(self::$selfInstance)) {
-                       self::$selfInstance = new ApplicationHelper();
-               } // END - if
+               if (is_null(self::getApplicationInstance())) {
+                       self::setApplicationInstance(new ApplicationHelper());
+               }
 
                // Return the instance
-               return self::$selfInstance;
+               return self::getApplicationInstance();
        }
 
        /**
-        * Getter for the version number
+        * 1) Setups application data
         *
-        * @return      $appVersion     The application's version number
-        */
-       public final function getAppVersion () {
-               return $this->appVersion;
-       }
-       /**
-        * Setter for the version number
-        *
-        * @param       $appVersion     The application's version number
         * @return      void
         */
-       public final function setAppVersion ($appVersion) {
-               // Cast and set it
-               $this->appVersion = (string) $appVersion;
-       }
-
-       /**
-        * Getter for human-readable name
-        *
-        * @return      $appName        The application's human-readable name
-        */
-       public final function getAppName () {
-               return $this->appName;
+       public function setupApplicationData () {
+               // Set all application data
+               $this->setAppName('Generic Object Sharing Hub');
+               $this->setAppVersion('0.0.0');
+               $this->setAppShortName('hub');
        }
 
        /**
-        * Setter for human-readable name
+        * 2) Does initial stuff before starting the application
         *
-        * @param       $appName        The application's human-readable name
         * @return      void
         */
-       public final function setAppName ($appName) {
-               // Cast and set it
-               $this->appName = (string) $appName;;
-       }
+       public function initApplication () {
+               // Get config instance
+               $cfg = FrameworkBootstrap::getConfigurationInstance();
 
-       /**
-        * Getter for short uni*-like name
-        *
-        * @return      $shortName      The application's short uni*-like name
-        */
-       public final function getAppShortName () {
-               return $this->shortName;
-       }
+               // Initialize output system
+               ApplicationHelper::createDebugInstance('ApplicationHelper');
 
-       /**
-        * Setter for short uni*-like name
-        *
-        * @param       $shortName      The application's short uni*-like name
-        * @return      void
-        */
-       public final function setAppShortName ($shortName) {
-               // Cast and set it
-               $this->shortName = (string) $shortName;
-       }
+               /*
+                * This application needs a database connection then simply call init
+                * method.
+                */
+               FrameworkBootstrap::initDatabaseInstance();
 
-       /**
-        * Assigns extra application-depending data
-        *
-        * @param       $templateInstance       An instance of a CompileableTemplate
-        * @return      void
-        * @todo        Nothing to add?
-        */
-       public function assignExtraTemplateData (CompileableTemplate $templateInstance) {
+               // Get own internal address and set it in config
+               $cfg->setConfigEntry('internal_address', HubTools::determineOwnInternalAddress());
        }
 
        /**
-        * Launches the LFDB2 system
+        * 3) Launches the application
         *
         * @return      void
         */
-       public final function entryPoint () {
-               // Set this application in registry
-               Registry::getRegistry()->addInstance('app', $this);
-
-               // Is no external IP set?
-               if ($this->getConfigInstance()->getConfigEntry('external_ip') == '') {
-                       // Determine external IP
-                       $this->getConfigInstance()->setConfigEntry('external_ip', ConsoleTools::determineExternalAddress());
-               } // END - if
-
-               // Default response is console
-               $response = self::getResponseTypeFromSystem();
-               $responseType = self::getResponseTypeFromSystem();
-
-               // Create a new request object
-               $requestInstance = ObjectFactory::createObjectByName(self::convertToClassName($response) . 'Request');
-
-               // Remember request instance here
-               $this->setRequestInstance($requestInstance);
-
-               // Do we have another response?
-               if ($requestInstance->isRequestElementSet('request')) {
-                       // Then use it
-                       $response = strtolower($requestInstance->getRequestElement('request'));
-                       $responseType = $response;
-               } // END - if
-
-               // ... and a new response object
-               $responseClass = sprintf('%sResponse', self::convertToClassName($response));
-               $responseInstance = ObjectFactory::createObjectByName($responseClass, array($this));
-
-               // Remember response instance here
-               $this->setResponseInstance($responseInstance);
+       public function launchApplication () {
+               // Get request/response instances
+               $requestInstance  = FrameworkBootstrap::getRequestInstance();
+               $responseInstance = FrameworkBootstrap::getResponseInstance();
 
                // Get the parameter from the request
                $commandName = $requestInstance->getRequestElement('command');
@@ -200,25 +131,59 @@ class ApplicationHelper extends BaseFrameworkSystem implements ManageableApplica
                        // Get default command
                        $commandName = $responseInstance->determineDefaultCommand();
 
+                       // Debug message
+                       self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('commandName[%s]=%s', gettype($commandName), $commandName));
+
                        // Set it in request
                        $requestInstance->setRequestElement('command', $commandName);
-               } // END - if
+               }
+
+               // Is the request type 'html' ?
+               if (FrameworkBootstrap::getRequestTypeFromSystem() == 'html') {
+                       // The language system is needed for this
+                       $languageInstance = ObjectFactory::createObjectByConfiguredName('language_system_class');
+
+                       // And set it here
+                       $this->setLanguageInstance($languageInstance);
+               }
 
-               // Get a controller resolver
-               $resolverClass = self::convertToClassName($this->getAppShortName() . '_' . $responseType . '_controller_resolver');
-               $resolverInstance = ObjectFactory::createObjectByName($resolverClass, array($commandName, $this));
+               // Configuration entry key
+               $configEntry = sprintf(
+                       '%s_%s_controller_resolver_class',
+                       $this->getAppShortName(),
+                       FrameworkBootstrap::getRequestTypeFromSystem()
+               );
+
+               // Get a controller resolver instance
+               $resolverInstance = ObjectFactory::createObjectByConfiguredName($configEntry, [
+                       $commandName,
+               ]);
 
                // Get a controller instance as well
                $this->setControllerInstance($resolverInstance->resolveController());
 
-               // Launch the LFDB2 main routine here
+               // Launch the test suite here
                $this->getControllerInstance()->handleRequest($requestInstance, $responseInstance);
 
-               // -------------------------- Shutdown phase --------------------------
-               // Shutting down the LFDB2
-               self::createDebugInstance(__CLASS__)->debugOutput('MAIN: Shutdown in progress, main loop exited.');
-               $this->getControllerInstance()->executeShutdownFilters($requestInstance, $responseInstance);
-               self::createDebugInstance(__CLASS__)->debugOutput('MAIN: Shutdown completed. (This is the last line.)');
+               // Only for console requests as this is the actual daemon
+               if ($requestType == 'console') {
+                       // -------------------------- Shutdown phase --------------------------
+                       // Shutting down the hub by saying "good bye" to all connected peers
+                       // and other hubs, flushing all queues and caches.
+                       self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('MAIN: Shutdown in progress, main loop exited.');
+                       $this->getControllerInstance()->executeShutdownFilters($requestInstance, $responseInstance);
+                       self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('MAIN: Shutdown completed. (This is the last line.)');
+               }
+       }
+
+       /**
+        * Assigns extra application-depending data
+        *
+        * @param       $templateInstance       An instance of a CompileableTemplate class
+        * @return      void
+        * @todo        Nothing to add?
+        */
+       public function assignExtraTemplateData (CompileableTemplate $templateInstance) {
        }
 
        /**
@@ -232,7 +197,7 @@ class ApplicationHelper extends BaseFrameworkSystem implements ManageableApplica
                // Walk through all messages
                foreach ($messageList as $message) {
                        exit(__METHOD__ . ':MSG:' . $message);
-               } // END - foreach
+               }
        }
 
        /**
@@ -241,9 +206,6 @@ class ApplicationHelper extends BaseFrameworkSystem implements ManageableApplica
         * @return      $masterTemplateName             Name of the master template
         */
        public function buildMasterTemplateName () {
-               return 'lfdb2_main';
+               return 'node_daemon';
        }
 }
-
-// [EOF]
-?>
index 51eb50ef9341ef86cdff5c5f4a9b4023502e5024..51a9f4758ec3a2fbdf28195223f7046ea98c1062 100644 (file)
--- a/index.php
+++ b/index.php
@@ -1,4 +1,20 @@
 <?php
+// Own namespace (watch out: core)
+namespace Org\Mxchange\CoreFramework\EntryPoint;
+
+// Import framework stuff
+use Org\Mxchange\CoreFramework\Bootstrap\FrameworkBootstrap;
+use Org\Mxchange\CoreFramework\Factory\Object\ObjectFactory;
+use Org\Mxchange\CoreFramework\Filesystem\FileNotFoundException;
+use Org\Mxchange\CoreFramework\Helper\Application\ApplicationHelper;
+use Org\Mxchange\CoreFramework\Localization\LanguageSystem;
+use Org\Mxchange\CoreFramework\Localization\ManageableLanguage;
+use Org\Mxchange\CoreFramework\Loader\ClassLoader;
+use Org\Mxchange\CoreFramework\Generic\FrameworkException;
+
+// Import SPL stuff
+use \Exception;
+
 /**
  * The main class with the entry point to the whole application. This class
  * "emulates" Java's entry point call. Additionally it covers local
@@ -9,7 +25,7 @@
  *
  * @author             Roland Haeder <webmaster@shipsimu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2015 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2021 Core Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.shipsimu.org
  *
@@ -28,9 +44,9 @@
  */
 final class ApplicationEntryPoint {
        /**
-        * Core path
+        * Framework path
         */
-       private static $corePath = '';
+       private static $frameworkPath = '';
 
        /**
         * The application's emergency exit
@@ -42,99 +58,104 @@ final class ApplicationEntryPoint {
         * @return      void
         * @todo        This method is old code and needs heavy rewrite and should be moved to ApplicationHelper
         */
-       public static final function app_exit ($message = '', $code = FALSE, $extraData = '', $silentMode = FALSE) {
+       public static final function exitApplication (string $message = '', int $code = -1, string $extraData = '', bool $silentMode = false) {
                // Is this method already called?
                if (isset($GLOBALS['app_die_called'])) {
                        // Then output the text directly
                        exit($message);
-               } // END - if
+               }
 
                // This method shall not be called twice
-               $GLOBALS['app_die_called'] = TRUE;
+               $GLOBALS['app_die_called'] = true;
 
                // Is a message set?
                if (empty($message)) {
                        // No message provided
                        $message = 'No message provided.';
-               } // END - if
+               }
 
                // Get config instance
-               $configInstance = FrameworkConfiguration::getSelfInstance();
+               $configInstance = FrameworkBootstrap::getConfigurationInstance();
 
                // Do we have debug installation?
-               if (($configInstance->getConfigEntry('product_install_mode') == 'productive') || ($silentMode === TRUE)) {
+               if (($configInstance->getConfigEntry('product_install_mode') == 'productive') || ($silentMode === true)) {
                        // Abort here
-                       exit();
-               } // END - if
+                       exit;
+               }
 
                // Get some instances
-               $tpl = FrameworkConfiguration::getSelfInstance()->getConfigEntry('html_template_class');
+               $templateClassName = $configInstance->getConfigEntry('html_template_class');
                $languageInstance = LanguageSystem::getSelfInstance();
 
                // Initialize template instance here to avoid warnings in IDE
                $templateInstance = NULL;
 
                // Get response instance
-               $responseInstance = ApplicationHelper::getSelfInstance()->getResponseInstance();
+               $responseInstance = FrameworkBootstrap::getResponseInstance();
 
                // Is the template engine loaded?
-               if ((class_exists($tpl)) && (is_object($languageInstance))) {
+               if ((class_exists($templateClassName)) && ($languageInstance instanceof ManageableLanguage)) {
                        // Use the template engine for putting out (nicer look) the message
                        try {
                                // Get the template instance from our object factory
-                               $templateInstance = ObjectFactory::createObjectByName($tpl);
+                               $templateInstance = ObjectFactory::createObjectByName($templateClassName);
                        } catch (FrameworkException $e) {
-                               exit(sprintf("[Main:] Could not initialize template engine for reason: <span class=\"exception_reason\">%s</span>",
+                               exit(sprintf('[Main:] Could not initialize template engine for reason: <span class="exception_reason">%s</span>',
                                        $e->getMessage()
                                ));
                        }
 
                        // Get and prepare backtrace for output
-                       $backtraceArray = debug_backtrace();
                        $backtrace = '';
-                       foreach ($backtraceArray as $key => $trace) {
+                       foreach (debug_backtrace() as $key => $trace) {
                                // Set missing array elements
                                if (!isset($trace['file'])) {
                                        $trace['file'] = __FILE__;
-                               } // END - if
+                               }
                                if (!isset($trace['line'])) {
                                        $trace['line'] = __LINE__;
-                               } // END - if
+                               }
                                if (!isset($trace['args'])) {
                                        $trace['args'] = array();
-                               } // END - if
+                               }
 
                                // Add the traceback path to the final output
-                               $backtrace .= sprintf("<span class=\"backtrace_file\">%s</span>:%d, <span class=\"backtrace_function\">%s(%d)</span><br />\n",
+                               $backtrace .= sprintf('<span class="backtrace_file">%s</span>:%d, <span class="backtrace_function">%s(%d)</span><br />' . PHP_EOL,
                                        basename($trace['file']),
                                        $trace['line'],
                                        $trace['function'],
                                        count($trace['args'])
                                );
-                       } // END - foreach
+                       }
 
                        // Init application instance
                        $applicationInstance = NULL;
 
-                       // Is the class there?
-                       if (class_exists('ApplicationHelper')) {
+                       /*
+                        * The following class may NOT be loaded at all times. For example,
+                        * it might be the (rare) case that an error has happened BEFORE
+                        * that class had been loaded and cannot be loaded or else an
+                        * infinte loop in invoking this method will take place resulting in
+                        * a stack-overflow error.
+                        */
+                       if (class_exists('Org\Mxchange\CoreFramework\Helper\Application\ApplicationHelper')) {
                                // Get application instance
                                $applicationInstance = ApplicationHelper::getSelfInstance();
 
                                // Assign application data
-                               $templateInstance->assignApplicationData($applicationInstance);
-                       } // END - if
+                               $templateInstance->assignApplicationData();
+                       }
 
                        // We only try this
                        try {
                                // Assign variables
-                               $templateInstance->assignVariable('message', $message);
-                               $templateInstance->assignVariable('code', $code);
-                               $templateInstance->assignVariable('extra', $extraData);
-                               $templateInstance->assignVariable('backtrace', $backtrace);
+                               $templateInstance->assignVariable('message'       , $message);
+                               $templateInstance->assignVariable('code'          , $code);
+                               $templateInstance->assignVariable('extra'         , $extraData);
+                               $templateInstance->assignVariable('backtrace'     , $backtrace);
                                $templateInstance->assignVariable('total_includes', ClassLoader::getSelfInstance()->getTotal());
-                               $templateInstance->assignVariable('total_objects', ObjectFactory::getTotal());
-                               $templateInstance->assignVariable('title', $languageInstance->getMessage('emergency_exit_title'));
+                               $templateInstance->assignVariable('total_objects' , ObjectFactory::getTotal());
+                               $templateInstance->assignVariable('title'         , $languageInstance->getMessage('emergency_exit_title'));
 
                                // Load the template
                                $templateInstance->loadCodeTemplate('emergency_exit');
@@ -150,68 +171,115 @@ final class ApplicationEntryPoint {
 
                                // Flush the response
                                $responseInstance->flushBuffer();
-                       } catch (FileIoException $e) {
+                       } catch (FileNotFoundException $e) {
                                // Even the template 'emergency_exit' wasn't found so output both message
                                exit($message . ', exception: ' . $e->getMessage());
                        }
 
                        // Good bye...
-                       exit();
+                       exit;
                } else {
                        // Output message and die
-                       exit(sprintf('[Main:] Emergency exit reached: <span class="emergency_span">%s</span>',
+                       die(sprintf('[Main:] Emergency exit reached: <span class="emergency_span">%s</span>',
                                $message
                        ));
                }
        }
 
        /**
-        * Determines the correct absolute path for all includes only once per run.
-        * Other calls of this method are being "cached".
+        * Determines the correct absolute path for the framework. A set of common
+        * paths is being tested (first most common for applications, second when
+        * core tests are being executed and third/forth if the framework has been
+        * cloned there).
         *
-        * @return      $corePath       Base path (core) for all includes
+        * @return      $frameworkPath  Path for framework
         */
-       protected static final function detectCorePath () {
+       public static final function detectFrameworkPath () {
                // Is it not set?
-               if (empty(self::$corePath)) {
-                       // Auto-detect our core path
-                       self::$corePath = str_replace("\\", '/', dirname(__FILE__));
-               } // END - if
+               if (empty(self::$frameworkPath)) {
+                       // Auto-detect core path (first application-common)
+                       foreach (array('core', __DIR__, '/usr/local/share/php/core', '/usr/share/php/core') as $possiblePath) {
+                               // Create full path for testing
+                               $realPath = realpath($possiblePath);
+
+                               // Is it false?
+                               //* NOISY-DEBUG: */ printf('[%s:%d]: realPath[%s]=%s' . PHP_EOL, __METHOD__, __LINE__, gettype($realPath), $realPath);
+                               if ($realPath === false) {
+                                       // Then, not found.
+                                       continue;
+                               }
+
+                               // Append framework path
+                               $frameworkPath = sprintf('%s%sframework%s', $realPath, DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR);
+
+                               // First create full-qualified file name (FQFN) to framework/config-global.php
+                               $configFile = $frameworkPath . 'config-global.php';
+
+                               // Is it readable?
+                               //* NOISY-DEBUG: */ printf('[%s:%d]: configFile=%s' . PHP_EOL, __METHOD__, __LINE__, $configFile);
+                               if (is_readable($configFile)) {
+                                       // Found one
+                                       self::$frameworkPath = $frameworkPath;
+
+                                       // Abort here
+                                       break;
+                               }
+                       }
+
+                       // Able to find?
+                       if (!is_dir(self::$frameworkPath)) {
+                               // Is no directory
+                               throw new Exception('Cannot find framework.');
+                       }
+               }
 
                // Return it
-               return self::$corePath;
+               return self::$frameworkPath;
+       }
+
+       /**
+        * Getter for root path
+        *
+        * @return      $rootPath       Root path
+        */
+       public static function getRootPath () {
+               // Get __DIR__, really simple and no detection
+               return __DIR__;
        }
 
        /**
-        * The application's main entry point. This class isolates some local
+        * The framework's main entry point. This class isolates some local
         * variables which shall not become visible to outside because of security
-        * concerns. We are doing this here to "emulate" the well-known entry
-        * point in Java.
+        * concerns. This is done here to "emulate" the well-known entry point in
+        * Java.
         *
         * @return      void
         */
        public static final function main () {
-               // Load config file
-               require(self::detectCorePath() . '/inc/config.php');
+               // Load bootstrap file
+               require sprintf('%sbootstrap%sbootstrap.inc.php', self::detectFrameworkPath(), DIRECTORY_SEPARATOR);
 
-               // Load all include files
-               require($cfg->getConfigEntry('base_path') . 'inc/includes.php');
+               /*
+                * Initial bootstrap is done, continue with initialization of
+                * framework.
+                */
+               FrameworkBootstrap::initFramework();
 
-               // Include the application selector
-               require($cfg->getConfigEntry('base_path') . 'inc/selector.php');
-       } // END - main()
-} // END - class
+               // Next initialize the detected application
+               FrameworkBootstrap::prepareApplication();
 
-// Developer mode active? Comment out if no dev!
-define('DEVELOPER', TRUE);
+               /*
+                * Last step is to start the application, this will also initialize and
+                * register the application instance in registry.
+                */
+               FrameworkBootstrap::startApplication();
+       }
+}
 
 // Log all exceptions (only debug! This option can create large error logs)
-//define('LOG_EXCEPTIONS', TRUE);
+//define('LOG_EXCEPTIONS', true);
 
 //xdebug_start_trace();
 
-// Do not remove the following line:
+// Call above main() method
 ApplicationEntryPoint::main();
-
-// [EOF]
-?>