<?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.
*
* @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__);
}
*/
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');
// 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) {
}
/**
// Walk through all messages
foreach ($messageList as $message) {
exit(__METHOD__ . ':MSG:' . $message);
- } // END - foreach
+ }
}
/**
* @return $masterTemplateName Name of the master template
*/
public function buildMasterTemplateName () {
- return 'lfdb2_main';
+ return 'node_daemon';
}
}
-
-// [EOF]
-?>
<?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
*
* @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
*
*/
final class ApplicationEntryPoint {
/**
- * Core path
+ * Framework path
*/
- private static $corePath = '';
+ private static $frameworkPath = '';
/**
* The application's emergency exit
* @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');
// 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]
-?>