From eb38570a0c4f78aca0b7e3d862d646cc225c18ee Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Tue, 22 Dec 2009 08:51:40 +0000 Subject: [PATCH] Hub descriptor extended, template engine added: - New template engine AnnouncementTemplateEngine added which should parse hub announcement descriptors (XML) - Hub announcement descriptor extended with listener (ports) information - Some Missing config entries added (classes, file extensensions, etc.) - Other minor improvements - Copyright fixed (was 'Core', should be 'Hub') --- .gitattributes | 3 + application/hub/config.php | 12 + .../class_HubBootstrapAquireHubIdFilter.php | 2 +- .../class_HubBootstrapGenSessionIdFilter.php | 2 +- .../class_HubDescriptorHelper.php | 34 +- .../main/helper/hub/class_BaseHubHelper.php | 2 +- .../hub/main/nodes/class_BaseHubNode.php | 2 + application/hub/main/template/.htaccess | 1 + .../hub/main/template/announcement/.htaccess | 1 + .../class_AnnouncementTemplateEngine.php | 313 ++++++++++++++++++ .../xml/announcement/self_announcement.xml | 19 +- 11 files changed, 385 insertions(+), 6 deletions(-) create mode 100644 application/hub/main/template/.htaccess create mode 100644 application/hub/main/template/announcement/.htaccess create mode 100644 application/hub/main/template/announcement/class_AnnouncementTemplateEngine.php diff --git a/.gitattributes b/.gitattributes index 9f2020012..840120e22 100644 --- a/.gitattributes +++ b/.gitattributes @@ -252,6 +252,9 @@ application/hub/main/tasks/hub/update/.htaccess -text application/hub/main/tasks/hub/update/class_HubUpdateCheckTask.php -text application/hub/main/tasks/idle/.htaccess -text application/hub/main/tasks/idle/class_IdleLoopTask.php -text +application/hub/main/template/.htaccess -text +application/hub/main/template/announcement/.htaccess -text +application/hub/main/template/announcement/class_AnnouncementTemplateEngine.php -text application/hub/main/visitor/.htaccess -text application/hub/main/visitor/class_ -text application/hub/main/visitor/class_BaseVisitor.php -text diff --git a/application/hub/config.php b/application/hub/config.php index 00fe3d013..9da6c2bfd 100644 --- a/application/hub/config.php +++ b/application/hub/config.php @@ -177,6 +177,18 @@ $cfg->setConfigEntry('hub_shutdown_node_filter', 'HubShutdownNodeFilter'); // CFG: NEWS-READER-CLASS $cfg->setConfigEntry('news_reader_class', 'ConsoleNewsReader'); +// CFG: ANNOUNCEMENT-TEMPLATE-CLASS +$cfg->setConfigEntry('announcement_template_class', 'AnnouncementTemplateEngine'); + +// CFG: ANNOUNCEMENT-TEMPLATE-EXTENSION +$cfg->setConfigEntry('announcement_template_extension', '.xml'); + +// CFG: ANNOUNCEMENT-TEMPLATE-TYPE +$cfg->setConfigEntry('announcement_template_type', 'xml/announcement'); + +// CFG: ANNOUNCEMENT-STACKER-CLASS +$cfg->setConfigEntry('announcement_stacker_class', 'FiLoStacker'); + // CFG: NEWS-MAIN-LIMIT $cfg->setConfigEntry('news_main_limit', 5); diff --git a/application/hub/main/filter/bootstrap/class_HubBootstrapAquireHubIdFilter.php b/application/hub/main/filter/bootstrap/class_HubBootstrapAquireHubIdFilter.php index 8046882d7..0836c04b4 100755 --- a/application/hub/main/filter/bootstrap/class_HubBootstrapAquireHubIdFilter.php +++ b/application/hub/main/filter/bootstrap/class_HubBootstrapAquireHubIdFilter.php @@ -4,7 +4,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * diff --git a/application/hub/main/filter/bootstrap/class_HubBootstrapGenSessionIdFilter.php b/application/hub/main/filter/bootstrap/class_HubBootstrapGenSessionIdFilter.php index 62a8040b4..70fddac66 100755 --- a/application/hub/main/filter/bootstrap/class_HubBootstrapGenSessionIdFilter.php +++ b/application/hub/main/filter/bootstrap/class_HubBootstrapGenSessionIdFilter.php @@ -4,7 +4,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * diff --git a/application/hub/main/helper/hub/announcement/class_HubDescriptorHelper.php b/application/hub/main/helper/hub/announcement/class_HubDescriptorHelper.php index 3f3833a35..da244d405 100644 --- a/application/hub/main/helper/hub/announcement/class_HubDescriptorHelper.php +++ b/application/hub/main/helper/hub/announcement/class_HubDescriptorHelper.php @@ -4,7 +4,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * @@ -48,6 +48,38 @@ class HubDescriptorHelper extends BaseHubHelper { // Return the prepared instance return $helperInstance; } + + /** + * Loads the announcement descriptor for parsing + * + * @return void + */ + public function loadAnnouncementDescriptor () { + // Get the application instance + $appInstance = Registry::getRegistry()->getInstance('app'); + + // Get a XML template instance + $templateInstance = ObjectFactory::createObjectByConfiguredName('announcement_template_class', array($appInstance)); + + // Disable language support + $templateInstance->enableLanguageSupport(false); + + // Set it for later use + $this->setTemplateInstance($templateInstance); + + // Get an XML parser instance + $parserInstance = ObjectFactory::createObjectByConfiguredName('xml_parser_class', array($this->getTemplateInstance())); + + // Read the XML descriptor + $this->getTemplateInstance()->loadAnnouncementTemplate('self_announcement'); + + // Get the prepared content + $announcementContent = $this->getTemplateInstance()->getRawTemplateData(); + + // Render it here + $this->getTemplateInstance()->renderXmlContent($announcementContent); + die(__METHOD__."\n"); + } } // [EOF] diff --git a/application/hub/main/helper/hub/class_BaseHubHelper.php b/application/hub/main/helper/hub/class_BaseHubHelper.php index d3ae9e71f..ffec8f3b6 100644 --- a/application/hub/main/helper/hub/class_BaseHubHelper.php +++ b/application/hub/main/helper/hub/class_BaseHubHelper.php @@ -4,7 +4,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * diff --git a/application/hub/main/nodes/class_BaseHubNode.php b/application/hub/main/nodes/class_BaseHubNode.php index 6549a51af..6236d7be8 100644 --- a/application/hub/main/nodes/class_BaseHubNode.php +++ b/application/hub/main/nodes/class_BaseHubNode.php @@ -419,6 +419,8 @@ class BaseHubNode extends BaseHubSystem implements Updateable { // Get a helper instance $helperInstance = ObjectFactory::createObjectByConfiguredName('hub_descriptor_class', array($this)); + // Load the announcement descriptor + $helperInstance->loadAnnouncementDescriptor(); die("\n"); } diff --git a/application/hub/main/template/.htaccess b/application/hub/main/template/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/main/template/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/application/hub/main/template/announcement/.htaccess b/application/hub/main/template/announcement/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/main/template/announcement/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/application/hub/main/template/announcement/class_AnnouncementTemplateEngine.php b/application/hub/main/template/announcement/class_AnnouncementTemplateEngine.php new file mode 100644 index 000000000..f8b1e43d3 --- /dev/null +++ b/application/hub/main/template/announcement/class_AnnouncementTemplateEngine.php @@ -0,0 +1,313 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.ship-simu.org + * + * 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 AnnouncementTemplateEngine extends BaseTemplateEngine implements CompileableTemplate { + /** + * Main nodes in the XML tree ('menu' is ignored) + */ + private $mainNodes = array( + 'announcement', + 'annoucement-data' + ); + + /** + * Sub nodes in the XML tree + */ + private $subNodes = array( + 'node-id', + ); + + /** + * Current main node + */ + private $curr = array(); + + /** + * Content from dependency + */ + private $dependencyContent = array(); + + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Creates an instance of the class TemplateEngine and prepares it for usage + * + * @param $appInstance A manageable application + * @return $tplInstance An instance of TemplateEngine + * @throws BasePathIsEmptyException If the provided $templateBasePath is empty + * @throws InvalidBasePathStringException If $templateBasePath is no string + * @throws BasePathIsNoDirectoryException If $templateBasePath is no + * directory or not found + * @throws BasePathReadProtectedException If $templateBasePath is + * read-protected + */ + public final static function createAnnouncementTemplateEngine (ManageableApplication $appInstance) { + // Get a new instance + $tplInstance = new AnnouncementTemplateEngine(); + + // Get language and file I/O instances from application + $langInstance = $appInstance->getLanguageInstance(); + $ioInstance = $appInstance->getFileIoInstance(); + + // Determine base path + $templateBasePath = $tplInstance->getConfigInstance()->getConfigEntry('application_base_path') . $appInstance->getRequestInstance()->getRequestElement('app') . '/'; + + // Is the base path valid? + if (empty($templateBasePath)) { + // Base path is empty + throw new BasePathIsEmptyException($tplInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); + } elseif (!is_string($templateBasePath)) { + // Is not a string + throw new InvalidBasePathStringException(array($tplInstance, $templateBasePath), self::EXCEPTION_INVALID_STRING); + } elseif (!is_dir($templateBasePath)) { + // Is not a path + throw new BasePathIsNoDirectoryException(array($tplInstance, $templateBasePath), self::EXCEPTION_INVALID_PATH_NAME); + } elseif (!is_readable($templateBasePath)) { + // Is not readable + throw new BasePathReadProtectedException(array($tplInstance, $templateBasePath), self::EXCEPTION_READ_PROTECED_PATH); + } + + // Get configuration instance + $configInstance = FrameworkConfiguration::getInstance(); + + // Set the base path + $tplInstance->setTemplateBasePath($templateBasePath); + + // Set the language and IO instances + $tplInstance->setLanguageInstance($langInstance); + $tplInstance->setFileIoInstance($ioInstance); + + // Set template extensions + $tplInstance->setRawTemplateExtension($configInstance->getConfigEntry('raw_template_extension')); + $tplInstance->setCodeTemplateExtension($configInstance->getConfigEntry('announcement_template_extension')); + + // Absolute output path for compiled templates + $tplInstance->setCompileOutputPath($configInstance->getConfigEntry('base_path') . $configInstance->getConfigEntry('compile_output_path')); + + // Init a variable stacker + $stackerInstance = ObjectFactory::createObjectByConfiguredName('announcement_stacker_class'); + + // Set it + $tplInstance->setStackerInstance($stackerInstance); + + // Return the prepared instance + return $tplInstance; + } + + /** + * Load a specified announcement template into the engine + * + * @param $template The announcement template we shall load which is + * located in 'announcement' by default + * @return void + */ + public function loadAnnouncementTemplate ($template) { + // Set template type + $this->setTemplateType($this->getConfigInstance()->getConfigEntry('announcement_template_type')); + + // Load the special template + $this->loadTemplate($template); + } + + /** + * Getter for current main node + * + * @return $currMainNode Current main node + */ + public final function getCurrMainNode () { + return $this->curr['main_node']; + } + + /** + * Setter for current main node + * + * @param $element Element name to set as current main node + * @return $currMainNode Current main node + */ + private final function setCurrMainNode ($element) { + $this->curr['main_node'] = (string) $element; + } + + /** + * Getter for main node array + * + * @return $mainNodes Array with valid main node names + */ + public final function getMainNodes () { + return $this->mainNodes; + } + + /** + * Getter for sub node array + * + * @return $subNodes Array with valid sub node names + */ + public final function getSubNodes () { + return $this->subNodes; + } + + /** + * Handles the start element of an XML resource + * + * @param $resource XML parser resource (currently ignored) + * @param $element The element we shall handle + * @param $attributes All attributes + * @return void + * @throws InvalidXmlNodeException If an unknown/invalid XML node name was found + */ + public function startElement ($resource, $element, array $attributes) { + // Initial method name which will never be called... + $methodName = 'initMenu'; + + // Make the element name lower-case + $element = strtolower($element); + + // Is the element a main node? + //* DEBUG: */ echo "START: >".$element."<
\n"; + if (in_array($element, $this->getMainNodes())) { + // Okay, main node found! + $methodName = 'start' . $this->convertToClassName($element); + + // Set it + $this->setCurrMainNode($element); + } elseif (in_array($element, $this->getSubNodes())) { + // Sub node found + $methodName = 'start' . $this->convertToClassName($element); + } elseif ($element != 'menu') { + // Invalid node name found + throw new InvalidXmlNodeException(array($this, $element, $attributes), XmlParser::EXCEPTION_XML_NODE_UNKNOWN); + } + + // Call method + //* DEBUG: */ echo "call: ".$methodName."
\n"; + call_user_func_array(array($this, $methodName), $attributes); + } + + /** + * Ends the main or sub node by sending out the gathered data + * + * @param $resource An XML resource pointer (currently ignored) + * @param $nodeName Name of the node we want to finish + * @return void + * @throws XmlNodeMismatchException If current main node mismatches the closing one + */ + public function endElement ($resource, $nodeName) { + // Make all lower-case + $nodeName = strtolower($nodeName); + + // Does this match with current main node? + //* DEBUG: */ echo "END: >".$nodeName."<
\n"; + if (($nodeName != $this->getCurrMainNode()) && (in_array($nodeName, $this->getMainNodes()))) { + // Did not match! + throw new XmlNodeMismatchException (array($this, $nodeName, $this->getCurrMainNode()), XmlParser::EXCEPTION_XML_NODE_MISMATCH); + } // END - if + + // Construct method name + $methodName = 'finish' . $this->convertToClassName($nodeName); + + // Call the corresponding method + //* DEBUG: */ echo "call: ".$methodName."
\n"; + call_user_func_array(array($this, $methodName), array()); + } + + /** + * Currently not used + * + * @param $resource XML parser resource (currently ignored) + * @param $characters Characters to handle + * @return void + * @todo Find something useful with this! + */ + public function characterHandler ($resource, $characters) { + // Trim all spaces away + $characters = trim($characters); + + // Is this string empty? + if (empty($characters)) { + // Then skip it silently + return false; + } // END - if + + // Assign the found characters to variable and use the last entry from + // stack as the name + parent::assignVariable($this->getStackerInstance()->getNamed('current_node'), $characters); + } + + /** + * Handles the template dependency for given node + * + * @param $node The node we should load a dependency template + * @param $templateDependency A template to load to satisfy dependencies + * @return void + */ + private function handleTemplateDependency ($node, $templateDependency) { + // Is the template dependency set? + if ((!empty($templateDependency)) && (!isset($this->dependencyContent[$node]))) { + // Get a temporay menu template instance + $templateInstance = ObjectFactory::createObjectByConfiguredName('menu_template_class', array($this->getApplicationInstance(), $this->getMenuInstance())); + + // Then load it + $templateInstance->loadMenuTemplate($templateDependency); + + // Get an XmlParser instance + $templateInstance->renderXmlContent(); + + // Parse the template's content contents + $this->dependencyContent[$node] = $templateInstance->getRawTemplateData(); + } // END - if + } + + /** + * Getter for menu cache file (FQFN) + * + * @return $fqfn Full-qualified file name of the menu cache + */ + public function getMenuCacheFqfn () { + // Get the FQFN ready + $fqfn = sprintf("%s%s%s/%s.%s", + $this->getConfigInstance()->getConfigEntry('base_path'), + $this->getGenericBasePath(), + 'menus/_cache', + md5( + $this->getMenuInstance()->getMenuName() . ':' . + $this->__toString() . ':' . + $this->getMenuInstance()->__toString() + ), + $this->getMenuInstance()->getMenuType() + ); + + // Return it + return $fqfn; + } +} + +// [EOF] +?> diff --git a/application/hub/templates/xml/announcement/self_announcement.xml b/application/hub/templates/xml/announcement/self_announcement.xml index eaffd16ee..825a2caa8 100644 --- a/application/hub/templates/xml/announcement/self_announcement.xml +++ b/application/hub/templates/xml/announcement/self_announcement.xml @@ -1,6 +1,7 @@ {?node_status?} + + + + + {?hub_tcp_port?} + {?hub_udp_port?} + + + + {?client_tcp_port?} + {?client_udp_port?} + + {?session_id?} - + + {?object_type?} -- 2.39.5