]> git.mxchange.org Git - hub.git/commitdiff
Hub descriptor extended, template engine added:
authorRoland Häder <roland@mxchange.org>
Tue, 22 Dec 2009 08:51:40 +0000 (08:51 +0000)
committerRoland Häder <roland@mxchange.org>
Tue, 22 Dec 2009 08:51:40 +0000 (08:51 +0000)
- 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
application/hub/config.php
application/hub/main/filter/bootstrap/class_HubBootstrapAquireHubIdFilter.php
application/hub/main/filter/bootstrap/class_HubBootstrapGenSessionIdFilter.php
application/hub/main/helper/hub/announcement/class_HubDescriptorHelper.php
application/hub/main/helper/hub/class_BaseHubHelper.php
application/hub/main/nodes/class_BaseHubNode.php
application/hub/main/template/.htaccess [new file with mode: 0644]
application/hub/main/template/announcement/.htaccess [new file with mode: 0644]
application/hub/main/template/announcement/class_AnnouncementTemplateEngine.php [new file with mode: 0644]
application/hub/templates/xml/announcement/self_announcement.xml

index 9f20200125059953c25f3b693e9f8a73a23b3f42..840120e22c03c1a63b0a73b78a4e97bf35d46079 100644 (file)
@@ -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
index 00fe3d0134e39be6edc1908a1b503b6a50b9fff1..9da6c2bfdb70ea13489468b16a91f3b8cdfa0ff4 100644 (file)
@@ -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);
 
index 8046882d7e1927d221e781beccd6858ece45182e..0836c04b4ae05ae9b632ec7e4ae69606ca8a108a 100755 (executable)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @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
  *
index 62a8040b4ce132cb37ae8cbb991e629bef73d594..70fddac66319a892828f844b3a87fc2acdf58ca4 100755 (executable)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @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
  *
index 3f3833a35b22441f02287f1b9c440acd4bbfd9e1..da244d40553e7b5e8b89427ea30f60556eb90173 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @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]
index d3ae9e71f75575a3ba87bfe750969787742fe944..ffec8f3b6ed345b2dfd4d8bd7999417b57e88ce7 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @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
  *
index 6549a51af4f47e6eafc3d867bb99324581310dc7..6236d7be800f9c8fd396289253f728c3eee97727 100644 (file)
@@ -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 (file)
index 0000000..3a42882
--- /dev/null
@@ -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 (file)
index 0000000..3a42882
--- /dev/null
@@ -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 (file)
index 0000000..f8b1e43
--- /dev/null
@@ -0,0 +1,313 @@
+<?php
+/**
+ * A Announcement template engine class
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @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 <http://www.gnu.org/licenses/>.
+ */
+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: &gt;".$element."&lt;<br />\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."<br />\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: &gt;".$nodeName."&lt;<br />\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."<br />\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]
+?>
index eaffd16eee22163f4b065e2cfade8508f61801f4..825a2caa87058961741b9c1969d0e50ed33cd0c2 100644 (file)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!--
-A template for announcing itself to upper hubs.
+A template for announcing itself to upper hubs. Do not fill anything in here.
+Please use the config.php file at application/hub/ instead.
 
 @author                Roland Haeder <webmaster@ship-simu.org>
 @version       0.0.0
@@ -28,11 +29,25 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
                <node-id>{?node_id?}</node-id>
                <!-- Status of this node, see node_status.xml for details. //-->
                <node-status>{?node_status?}</node-status>
+               <!-- Data from our listeners (e.g. which port) //-->
+               <listener>
+                       <!-- Listener ports for hub connections //-->
+                       <hub-listener>
+                               <tcp-port>{?hub_tcp_port?}</tcp-port>
+                               <udp-port>{?hub_udp_port?}</udp-port>
+                       </hub-listener>
+                       <!-- Listener ports for client connections //-->
+                       <client-listener>
+                               <tcp-port>{?client_tcp_port?}</tcp-port>
+                               <udp-port>{?client_udp_port?}</udp-port>
+                       </client-listener>
+               </listener>
                <!-- The session id. This should be announced to all other hubs. //-->
                <session-id>{?session_id?}</session-id>
                <!-- A list of shared object types. //-->
                <object-type-list>
-                       <object-type type="{?object_type?}" />
+                       <!-- A single object type this hub shares. //-->
+                       <object-type>{?object_type?}</object-type>
                </object-type-list>
        </annoucement-data>
 </announcement>