]> git.mxchange.org Git - hub.git/commitdiff
Added announcement answer XML, template engine and acceptance of announcements
authorRoland Häder <roland@mxchange.org>
Thu, 17 May 2012 21:47:29 +0000 (21:47 +0000)
committerRoland Häder <roland@mxchange.org>
Thu, 17 May 2012 21:47:29 +0000 (21:47 +0000)
27 files changed:
.gitattributes
application/hub/config.php
application/hub/exceptions/announcement/.htaccess [new file with mode: 0644]
application/hub/exceptions/announcement/class_AnnouncementNotAcceptedException.php [new file with mode: 0644]
application/hub/main/class_BaseHubSystem.php
application/hub/main/commands/console/class_HubConsoleMainCommand.php
application/hub/main/handler/message-types/anouncement/class_NodeMessageAnnouncementHandler.php
application/hub/main/handler/message-types/class_
application/hub/main/handler/message-types/class_BaseMessageHandler.php
application/hub/main/handler/message-types/self-connect/class_NodeMessageSelfConnectHandler.php
application/hub/main/helper/hub/answer/.htaccess [new file with mode: 0644]
application/hub/main/helper/hub/answer/announcement/.htaccess [new file with mode: 0644]
application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php [new file with mode: 0644]
application/hub/main/helper/hub/answer/class_BaseHubAnswerHelper.php [new file with mode: 0644]
application/hub/main/nodes/boot/class_HubBootNode.php
application/hub/main/nodes/class_BaseHubNode.php
application/hub/main/nodes/master/class_HubMasterNode.php
application/hub/main/package/class_NetworkPackage.php
application/hub/main/template/announcement/class_XmlAnnouncementTemplateEngine.php
application/hub/main/template/answer/.htaccess [new file with mode: 0644]
application/hub/main/template/answer/announcement/.htaccess [new file with mode: 0644]
application/hub/main/template/answer/announcement/class_XmlAnnouncementAnswerTemplateEngine.php [new file with mode: 0644]
application/hub/main/template/class_
application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php
application/hub/templates/xml/answer/.htaccess [new file with mode: 0644]
application/hub/templates/xml/answer/announcement/.htaccess [new file with mode: 0644]
application/hub/templates/xml/answer/announcement/announcement_answer.xml [new file with mode: 0644]

index 45c7020e07ac85b00301af9d1348014678c2e768..efafc998dd1218f0a116eaacee529913514cee27 100644 (file)
@@ -8,6 +8,8 @@ application/hub/data.php svneol=native#text/plain
 application/hub/debug.php svneol=native#text/plain
 application/hub/exceptions.php svneol=native#text/plain
 application/hub/exceptions/.htaccess -text svneol=unset#text/plain
+application/hub/exceptions/announcement/.htaccess -text svneol=unset#text/plain
+application/hub/exceptions/announcement/class_AnnouncementNotAcceptedException.php svneol=native#text/plain
 application/hub/exceptions/hub/.htaccess -text svneol=unset#text/plain
 application/hub/exceptions/hub/class_HubAlreadyAnnouncedException.php svneol=native#text/plain
 application/hub/exceptions/ids/.htaccess -text svneol=unset#text/plain
@@ -323,6 +325,10 @@ application/hub/main/helper/hub/.htaccess -text svneol=unset#text/plain
 application/hub/main/helper/hub/announcement/.htaccess -text svneol=unset#text/plain
 application/hub/main/helper/hub/announcement/class_HubAnnouncementHelper.php svneol=native#text/plain
 application/hub/main/helper/hub/announcement/class_HubDescriptorHelper.php svneol=native#text/plain
+application/hub/main/helper/hub/answer/.htaccess -text svneol=unset#text/plain
+application/hub/main/helper/hub/answer/announcement/.htaccess -text svneol=unset#text/plain
+application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php svneol=native#text/plain
+application/hub/main/helper/hub/answer/class_BaseHubAnswerHelper.php svneol=native#text/plain
 application/hub/main/helper/hub/class_ svneol=native#text/plain
 application/hub/main/helper/hub/class_BaseHubHelper.php svneol=native#text/plain
 application/hub/main/helper/hub/connection/.htaccess -text svneol=unset#text/plain
@@ -542,6 +548,8 @@ application/hub/main/tasks/network/class_NetworkPackageWriterTask.php svneol=nat
 application/hub/main/template/.htaccess -text svneol=unset#text/plain
 application/hub/main/template/announcement/.htaccess -text svneol=unset#text/plain
 application/hub/main/template/announcement/class_XmlAnnouncementTemplateEngine.php svneol=native#text/plain
+application/hub/main/template/answer/.htaccess -text svneol=unset#text/plain
+application/hub/main/template/answer/announcement/.htaccess -text svneol=unset#text/plain
 application/hub/main/template/connect/.htaccess -text svneol=unset#text/plain
 application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php svneol=native#text/plain
 application/hub/main/template/objects/.htaccess -text svneol=unset#text/plain
@@ -573,6 +581,9 @@ application/hub/templates/xml/.htaccess -text svneol=unset#text/plain
 application/hub/templates/xml/.xml svneol=native#text/plain
 application/hub/templates/xml/announcement/.htaccess -text svneol=unset#text/plain
 application/hub/templates/xml/announcement/self_announcement.xml svneol=native#text/plain
+application/hub/templates/xml/answer/.htaccess -text svneol=unset#text/plain
+application/hub/templates/xml/answer/announcement/.htaccess -text svneol=unset#text/plain
+application/hub/templates/xml/answer/announcement/announcement_answer.xml svneol=native#text/plain
 application/hub/templates/xml/cruncher/.htaccess svneol=native#text/plain
 application/hub/templates/xml/cruncher/producer/.htaccess svneol=native#text/plain
 application/hub/templates/xml/cruncher/producer/test_unit.xml svneol=native#text/plain
index 49bee6e908cc197ef87144c67b4887a336793001..a5712268d5985c2c915f6eb1e05e3ea7b475d520 100644 (file)
@@ -210,14 +210,23 @@ $cfg->setConfigEntry('message_type_announcement_handler_class', 'NodeMessageAnno
 // CFG: MESSAGE-TYPE-SELF-CONNECT-HANDLER-CLASS
 $cfg->setConfigEntry('message_type_self_connect_handler_class', 'NodeMessageSelfConnectHandler');
 
+// CFG: NODE-ANSWER-MESSAGE-ANNOUNCEMENT-HELPER-CLASS
+$cfg->setConfigEntry('node_answer_message_announcement_helper_class', 'NodeAnnouncementMessageAnswerHelper');
+
 // CFG: NEWS-READER-CLASS
 $cfg->setConfigEntry('news_reader_class', 'ConsoleNewsReader');
 
 // CFG: NODE-ANNOUNCEMENT-TEMPLATE-CLASS
 $cfg->setConfigEntry('node_announcement_template_class', 'XmlAnnouncementTemplateEngine');
 
-// CFG: NODE-ANNOUNCEMENT-TEMPLATE-EXTENSION
-$cfg->setConfigEntry('node_announcement_template_extension', '.xml');
+// CFG: NODE-ANSWER-ANNOUNCEMENT-TEMPLATE-CLASS
+$cfg->setConfigEntry('node_answer_announcement_template_class', 'XmlAnnouncementAnswerTemplateEngine');
+
+// CFG: NODE-MESSAGE-TEMPLATE-EXTENSION
+$cfg->setConfigEntry('node_message_template_extension', '.xml');
+
+// CFG: NODE-ANSWER-TEMPLATE-EXTENSION
+$cfg->setConfigEntry('node_answer_template_extension', '.xml');
 
 // CFG: NODE-ANNOUNCEMENT-TEMPLATE-TYPE
 $cfg->setConfigEntry('node_announcement_template_type', 'xml/announcement');
@@ -225,12 +234,15 @@ $cfg->setConfigEntry('node_announcement_template_type', 'xml/announcement');
 // CFG: NODE-ANNOUNCEMENT-STACKER-CLASS
 $cfg->setConfigEntry('node_announcement_stacker_class', 'FiLoStacker');
 
+// CFG: NODE-ANNOUNCEMENT-ANSWER-STACKER-CLASS
+$cfg->setConfigEntry('node_announcement_answer_stacker_class', 'FiLoStacker');
+
+// CFG: NODE-ANNOUNCEMENT-ANSWER-TEMPLATE-TYPE
+$cfg->setConfigEntry('node_announcement_answer_template_type', 'xml/answer/announcement');
+
 // CFG: NODE-SELF-CONNECT-TEMPLATE-CLASS
 $cfg->setConfigEntry('node_self_connect_template_class', 'XmlSelfConnectTemplateEngine');
 
-// CFG: NODE-SELF-CONNECT-TEMPLATE-EXTENSION
-$cfg->setConfigEntry('node_self_connect_template_extension', '.xml');
-
 // CFG: NODE-SELF-CONNECT-TEMPLATE-TYPE
 $cfg->setConfigEntry('node_self_connect_template_type', 'xml/self_connect');
 
diff --git a/application/hub/exceptions/announcement/.htaccess b/application/hub/exceptions/announcement/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/application/hub/exceptions/announcement/class_AnnouncementNotAcceptedException.php b/application/hub/exceptions/announcement/class_AnnouncementNotAcceptedException.php
new file mode 100644 (file)
index 0000000..40c9e5f
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * This exception is thrown when an announcement from other nodes was received
+ * but this node doesn't accept announcements.
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Hub 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 AnnouncementNotAcceptedException extends FrameworkException {
+       /**
+        * The super constructor for all exceptions
+        *
+        * @param       $messageArray   Error message array
+        * @param       $code                   Error code
+        * @return      void
+        */
+       public function __construct (array $messageArray, $code) {
+               // Construct the message
+               $message = sprintf("[%s:%d] This node (%s) is not accepting announcements, but got one from session-id=%s,ip=%s,tcp.port=%s,udp.port=%s,status=%s.",
+                       $messageArray[0]->__toString(),
+                       $this->getLine(),
+                       $messageArray[1]->__toString(),
+                       $messageArray[2][XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_SESSION_ID],
+                       $messageArray[2][XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_EXTERNAL_IP],
+                       $messageArray[2][XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_TCP_PORT],
+                       $messageArray[2][XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_UDP_PORT],
+                       $messageArray[2][XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_NODE_STATUS]
+               );
+
+               // Call parent exception constructor
+               parent::__construct($message, $code);
+       }
+}
+
+// [EOF]
+?>
index a147db4370dac946fd666aeda250e394e49b84a8..9939c6bdd884e32da7b1f21999c0dfe71cc78550 100644 (file)
@@ -25,6 +25,7 @@ class BaseHubSystem extends BaseFrameworkSystem {
        // Exception codes
        const EXCEPTION_UNSUPPORTED_ERROR_HANDLER = 0x900;
        const EXCEPTION_CHUNK_ALREADY_ASSEMBLED   = 0x901;
+       const EXCEPTION_ANNOUNCEMENT_NOT_ACCEPTED = 0x902;
 
        /**
         * Separator for all bootstrap node entries
index 76e456d6c084c673ee526673b7156eed885a6d62..8c138e2942211cdc5f25b221fab2a3d6c8cf5787 100644 (file)
@@ -96,7 +96,7 @@ class HubConsoleMainCommand extends BaseCommand implements Commandable {
                 * so the whole application runs on nice speed. This while-loop goes
                 * until the hub is no longer active or all tasks are killed.
                 */
-               while (($nodeInstance->getIsActive()) && ($handlerInstance->hasTasksLeft())) {
+               while (($nodeInstance->isNodeActive()()) && ($handlerInstance->hasTasksLeft())) {
                        // Handle all tasks here
                        $handlerInstance->handleTasks();
                } // END - while
index 8b4195a954d7aef29a65b98da8930964ba32718e..adbd315549372b068e24015def4b71a4839c207c 100644 (file)
@@ -32,7 +32,7 @@ class NodeMessageAnnouncementHandler extends BaseMessageHandler implements Handl
                parent::__construct(__CLASS__);
 
                // Set handler name
-               $this->setHandlerName('message_type_announcement');
+               $this->setHandlerName('message_announcement');
 
                // Init message data array
                $this->messageDataElements = array(
@@ -63,8 +63,21 @@ class NodeMessageAnnouncementHandler extends BaseMessageHandler implements Handl
         * @param       $messageData            An array with message data to handle
         * @param       $packageInstance        An instance of a Receivable class
         * @return      void
+        * @throws      AnnouncementNotAcceptedException        If this node does not accept announcements
         */
        public function handleMessageData (array $messageData, Receivable $packageInstance) {
+               // Get node instance
+               $nodeInstance = Registry::getRegistry()->getInstance('node');
+
+               // Is this node accepting announcements?
+               if (!$nodeInstance->isAcceptingAnnouncements()) {
+                       /*
+                        * This node is not accepting announcements, then someone wants to
+                        * announce his node to a non-bootstrap and non-master node.
+                        */
+                       throw new AnnouncementNotAcceptedException(array($this, $nodeInstance, $messageData), self::EXCEPTION_ANNOUNCEMENT_NOT_ACCEPTED);
+               } // END - if
+
                // Register the announcing node with this node
                $this->registerNodeByMessageData($messageData);
 
index 47794405d73e200f46718aa74309a14c8d704ae7..5da7f27eaf61b9dfcdbc39fec30a142f5d75efc0 100644 (file)
@@ -32,7 +32,7 @@ class NodeMessage???Handler extends BaseMessageHandler implements HandleableMess
                parent::__construct(__CLASS__);
 
                // Set handler name
-               $this->setHandlerName('message_type_===');
+               $this->setHandlerName('message_===');
 
                // Init message data array
                $this->messageDataElements = array(
index 7b6763eeee2c9b9489855dce300385c0a1b30a60..5b93828568b600de49b132fe88579a7b5f615b70 100644 (file)
@@ -89,6 +89,30 @@ class BaseMessageHandler extends BaseHandler {
                        $wrapperInstance->registerNodeByMessageData($messageData, $this);
                }
        }
+
+       /**
+        * Prepares a message as answer for given message data for delivery.
+        *
+        * @param       $messageData            An array with all message data
+        * @param       $packageInstance        An instance of a Deliverable instance
+        * @return      void
+        */
+       protected function prepareAnswerMessage (array $messageData, Deliverable $packageInstance) {
+               // Get a helper instance based on this handler's name
+               $helperInstance = ObjectFactory::createObjectByConfiguredName('node_answer_' . $this->getHandlerName() . '_helper_class', array($messageData));
+
+               // Load descriptor XML
+               $helperInstance->loadDescriptorXml();
+
+               // Compile any configuration variables
+               $helperInstance->getTemplateInstance()->compileConfigInVariables();
+
+               // Get node instance
+               $nodeInstance = Registry::getRegistry()->getInstance('node');
+
+               // Deliver the package
+               $helperInstance->sendPackage($nodeInstance);
+       }
 }
 
 // [EOF]
index 00d1acbc11725204045ace3f58b02f8a38352464..642b07d99b6b442e785d82c975fa625d607c4366 100644 (file)
@@ -32,7 +32,7 @@ class NodeMessageSelfConnectHandler extends BaseMessageHandler implements Handle
                parent::__construct(__CLASS__);
 
                // Set handler name
-               $this->setHandlerName('message_type_self_connect');
+               $this->setHandlerName('message_self_connect');
        }
 
        /**
diff --git a/application/hub/main/helper/hub/answer/.htaccess b/application/hub/main/helper/hub/answer/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/application/hub/main/helper/hub/answer/announcement/.htaccess b/application/hub/main/helper/hub/answer/announcement/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php b/application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php
new file mode 100644 (file)
index 0000000..9605ce5
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+/**
+ * A ??? hub helper class
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ * @todo               Find an interface for hub helper
+ *
+ * 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 NodeAnnouncementMessageAnswerHelper extends BaseHubAnswerHelper implements HelpableHub {
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+
+               // Set recipient type to 'other'
+               $this->setRecipientType(NetworkPackage::NETWORK_TARGET_OTHER);
+       }
+
+       /**
+        * Creates the helper class
+        *
+        * @param       $messageData            An array with all message data
+        * @return      $helperInstance         A prepared instance of this helper
+        */
+       public final static function createNodeAnnouncementMessageAnswerHelper (array $messageData) {
+               // Get new instance
+               $helperInstance = new NodeAnnouncementMessageAnswerHelper();
+
+               // Set message data
+               $helperInstance->setMessageData($messageData);
+
+               // Return the prepared instance
+               return $helperInstance;
+       }
+
+       /**
+        * Loads the descriptor XML file
+        *
+        * @return      void
+        */
+       public function loadDescriptorXml () {
+               // Debug message
+               $this->debugOutput('HELPER: Attempting to answer an announcement...');
+
+               // Get a XML template instance
+               $templateInstance = XmlTemplateEngineFactory::createXmlTemplateEngineInstance('node_answer_announcement_template_class');
+
+               // Set it for later use
+               $this->setTemplateInstance($templateInstance);
+
+               // Read the XML descriptor
+               $this->getTemplateInstance()->loadAnnouncementAnswerTemplate();
+
+               // Render the XML content
+               $this->getTemplateInstance()->renderXmlContent();
+       }
+
+       /**
+        * Do the helped attempt by delivering a package to ourselfs
+        *
+        * @param       $nodeInstance   An instance of a NodeHelper class
+        * @return      void
+        */
+       public function sendPackage (NodeHelper $nodeInstance) {
+               // Sanity check: Is the node in the approx. state? (active)
+               $nodeInstance->getStateInstance()->validateNodeStateIsActive();
+
+               // Compile the template, this inserts the loaded node data into the gaps.
+               $this->getTemplateInstance()->compileTemplate();
+
+               // Get a singleton network package instance
+               $packageInstance = NetworkPackageFactory::createNetworkPackageInstance();
+
+               // Next, feed the content in. The network package class is a pipe-through class.
+               $packageInstance->enqueueRawDataFromTemplate($this);
+       }
+}
+
+// [EOF]
+?>
diff --git a/application/hub/main/helper/hub/answer/class_BaseHubAnswerHelper.php b/application/hub/main/helper/hub/answer/class_BaseHubAnswerHelper.php
new file mode 100644 (file)
index 0000000..c5850d2
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * A general hub message answer helper class
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Hub 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 BaseHubAnswerHelper extends BaseHubHelper {
+       /**
+        * Message data array
+        */
+       private $messageData = array();
+
+       /**
+        * Protected constructor
+        *
+        * @param       $className      Name of the concrete class
+        * @return      void
+        */
+       protected function __construct ($className) {
+               // Call parent constructor
+               parent::__construct($className);
+       }
+
+       /**
+        * Setter for message data
+        *
+        * @return      $messageData    An array with message data
+        */
+       protected final function setMessageData (array $messageData) {
+               $this->messageData = $messageData;
+       }
+
+       /**
+        * Getter for message data
+        *
+        * @return      $messageData    An array with message data
+        */
+       public final function getMessageData () {
+               return $this->messageData;
+       }
+}
+
+// [EOF]
+?>
index a73135183782ea51995a88bdc25c940ee4b99440..cf4d4046d726013c01ec9dbafd220b48e6d82d1d 100644 (file)
@@ -88,6 +88,9 @@ class HubBootNode extends BaseHubNode implements NodeHelper, Registerable {
                        $this->debugOutput('BOOTSTRAP: WARNING: Our IP ' . $this->getConfigInstance()->detectServerAddress() . ' does not match any known bootstrap-nodes.');
                }
 
+               // Enable acceptance of announcements
+               $this->enableAcceptingAnnouncements();
+
                // This might not be all...
                $this->partialStub('Please implement more bootsrapping steps.');
        }
index 1ba56ca42e3dacb73d502a9cba8c16ac0de41776..8a091325e91c7ab85a4ef569f78462620f3d1279 100644 (file)
@@ -55,10 +55,15 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
        private $hubIsAnnounced = false;
 
        /**
-        * Whether this hub is active
+        * Whether this hub is active (default: false)
         */
        private $isActive = false;
 
+       /**
+        * Whether this node accepts announcements (default: false)
+        */
+       private $acceptAnnouncements = false;
+
        /**
         * Protected constructor
         *
@@ -454,7 +459,7 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
        public function activateNode (Requestable $requestInstance, Responseable $responseInstance) {
                // Checks whether a listener is still active and shuts it down if one
                // is still listening.
-               if (($this->determineIfListenerIsActive()) && ($this->getIsActive())) {
+               if (($this->determineIfListenerIsActive()) && ($this->isNodeActive()())) {
                        // Shutdown them down before they can hurt anything
                        $this->shutdownListenerPool();
                } // END - if
@@ -584,7 +589,7 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
         *
         * @return      $isActive       Whether the hub is active
         */
-       public final function getIsActive () {
+       public final function isNodeActive() () {
                return $this->isActive;
        }
 
@@ -598,6 +603,30 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                $this->isActive = (bool) $isActive;
        }
 
+       /**
+        * Checks whether this node accepts announcements
+        *
+        * @return      $acceptsAnnouncements   Whether this node accepts announcements
+        */
+       public final function isAcceptingAnnouncements () {
+               // Check it (this node must be active and not shutdown!)
+               $acceptsAnnouncements = (($this->acceptsAnnouncements === true) && ($this->isNodeActive()());
+
+               // Return it
+               return $acceptsAnnouncements;
+       }
+
+       /**
+        * Enables whether this node accepts announcements
+        *
+        * @param       $acceptsAnnouncements   Whether this node accepts announcements (default: true)
+        * @return      void
+        */
+       protected final function enableAcceptingAnnouncements ($acceptsAnnouncements = true) {
+               $this->acceptAnnouncements = $acceptsAnnouncements;
+       }
+       
+       
        /**
         * "Getter for address:port combination
         *
index 19ec9b0938e7df65b5c45ab0708100803b0a58b1..4b89637348ca3e10d213a8614b3caf84c498fcbf 100644 (file)
@@ -58,7 +58,11 @@ class HubMasterNode extends BaseHubNode implements NodeHelper, Registerable {
         * @todo        Implement this method
         */
        public function doBootstrapping () {
-               $this->partialStub();
+               // Enable acceptance of announcements
+               $this->enableAcceptingAnnouncements();
+
+               // Do more steps
+               $this->partialStub('Please implement more boot-strapping steps!');
        }
 
        /**
index 86695645194b674c86832df08a80c0e369d1d435..f36ef37279eea3b488773bab843373c6add5e859 100644 (file)
@@ -135,6 +135,11 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
         */
        const NETWORK_TARGET_SELF = 'self';
 
+       /**
+        * Network target (alias): 'other'
+        */
+       const NETWORK_TARGET_OTHER = 'other';
+
        /**
         * TCP package size in bytes
         */
index 935ddb64ff4a029c508f437211c000c3823bfc5a..fca8784ee40c09920f8da263c2c1136c69ac3df7 100644 (file)
@@ -117,7 +117,7 @@ class XmlAnnouncementTemplateEngine extends BaseTemplateEngine implements Compil
 
                // Set template extensions
                $templateInstance->setRawTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('raw_template_extension'));
-               $templateInstance->setCodeTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('node_announcement_template_extension'));
+               $templateInstance->setCodeTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('node_message_template_extension'));
 
                // Absolute output path for compiled templates
                $templateInstance->setCompileOutputPath($templateInstance->getConfigInstance()->getConfigEntry('base_path') . $templateInstance->getConfigInstance()->getConfigEntry('compile_output_path'));
diff --git a/application/hub/main/template/answer/.htaccess b/application/hub/main/template/answer/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/application/hub/main/template/answer/announcement/.htaccess b/application/hub/main/template/answer/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/answer/announcement/class_XmlAnnouncementAnswerTemplateEngine.php b/application/hub/main/template/answer/announcement/class_XmlAnnouncementAnswerTemplateEngine.php
new file mode 100644 (file)
index 0000000..f24014b
--- /dev/null
@@ -0,0 +1,280 @@
+<?php
+/**
+ * An ??? template engine class for XML templates
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.ship-simu.org
+ * @todo               This template engine does not make use of setTemplateType()
+ *
+ * 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 XmlAnnouncementAnswerTemplateEngine extends BaseTemplateEngine implements CompileableTemplate, Registerable {
+       /**
+        * Main nodes in the XML tree
+        */
+       private $mainNodes = array(
+               '|||'
+       );
+
+       /**
+        * Sub nodes in the XML tree
+        */
+       private $subNodes = array(
+       );
+
+       /**
+        * Current main node
+        */
+       private $curr = 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
+        *
+        * @return      $templateInstance               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 static final function createXmlAnnouncementAnswerTemplateEngine () {
+               // Get a new instance
+               $templateInstance = new XmlAnnouncementAnswerTemplateEngine();
+
+               // Get application instance from registry
+               $applicationInstance = Registry::getRegistry()->getInstance('app');
+
+               // Determine base path
+               $templateBasePath = $templateInstance->getConfigInstance()->getConfigEntry('application_base_path') . $applicationInstance->getRequestInstance()->getRequestElement('app') . '/';
+
+               // Is the base path valid?
+               if (empty($templateBasePath)) {
+                       // Base path is empty
+                       throw new BasePathIsEmptyException($templateInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
+               } elseif (!is_string($templateBasePath)) {
+                       // Is not a string
+                       throw new InvalidBasePathStringException(array($templateInstance, $templateBasePath), self::EXCEPTION_INVALID_STRING);
+               } elseif (!is_dir($templateBasePath)) {
+                       // Is not a path
+                       throw new BasePathIsNoDirectoryException(array($templateInstance, $templateBasePath), self::EXCEPTION_INVALID_PATH_NAME);
+               } elseif (!is_readable($templateBasePath)) {
+                       // Is not readable
+                       throw new BasePathReadProtectedException(array($templateInstance, $templateBasePath), self::EXCEPTION_READ_PROTECED_PATH);
+               }
+
+               // Set the base path
+               $templateInstance->setTemplateBasePath($templateBasePath);
+
+               // Set template extensions
+               $templateInstance->setRawTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('raw_template_extension'));
+               $templateInstance->setCodeTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('node_answer_template_extension'));
+
+               // Absolute output path for compiled templates
+               $templateInstance->setCompileOutputPath($templateInstance->getConfigInstance()->getConfigEntry('base_path') . $templateInstance->getConfigInstance()->getConfigEntry('compile_output_path'));
+
+               // Init a variable stacker
+               $stackerInstance = ObjectFactory::createObjectByConfiguredName('node_announcement_answer_stacker_class');
+
+               // Set it
+               $templateInstance->setStackerInstance($stackerInstance);
+
+               // Return the prepared instance
+               return $templateInstance;
+       }
+
+       /**
+        * Load a specified announcement-answer template into the engine
+        *
+        * @param       $template       The announcement-answer template we shall load which is
+        *                                              located in 'announcement-answer' by default
+        * @return      void
+        */
+       public function loadAnnouncementAnswerTemplate ($template = 'announcement_answer') {
+               // Set template type
+               $this->setTemplateType($this->getConfigInstance()->getConfigEntry('node_announcement_answer_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 = 'initAnnouncementAnswer';
+
+               // 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);
+               } else {
+                       // Invalid node name found
+                       throw new InvalidXmlNodeException(array($this, $element, $attributes), XmlParser::EXCEPTION_XML_NODE_UNKNOWN);
+               }
+
+               // Call method
+               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
+
+               // Get current XML node name as an array index
+               $nodeName = $this->getStackerInstance()->getNamed('announcement-answer');
+
+               $this->partialStub('TODO: Do something with the gathered data.');
+       }
+
+       /**
+        * Getter for cache file (FQFN)
+        *
+        * @return      $fqfn   Full-qualified file name of the menu cache
+        */
+       public function getAnnouncementAnswerCacheFqfn () {
+               $this->partialStub('Please implement this method.');
+       }
+
+       /**
+        * Starts the |||
+        *
+        * @return      void
+        */
+       private function startAnnouncementAnswer () {
+               // Push the node name on the stacker
+               $this->getStackerInstance()->pushNamed('announcement-answer', '|||');
+       }
+
+       /**
+        * Finishes the |||
+        *
+        * @return      void
+        */
+       private function finishAnnouncementAnswer () {
+               // Pop the last entry
+               $this->getStackerInstance()->popNamed('announcement-answer');
+       }
+}
+
+// [EOF]
+?>
index 40cbc1d7a078e012472aae6976812ea54c5b6145..218e240a1d83cbc00ac283fb54159bef6aa1510e 100644 (file)
@@ -23,7 +23,7 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 die('YOU NEED TO REPLACE ???, !!! AND ||| IN THIS CLASS BEFORE YOU CAN USE IT.');
-class Xml???TemplateEngine extends BaseTemplateEngine implements CompileableTemplate {
+class Xml???TemplateEngine extends BaseTemplateEngine implements CompileableTemplate, Registerable {
        /**
         * Main nodes in the XML tree
         */
@@ -63,7 +63,7 @@ class Xml???TemplateEngine extends BaseTemplateEngine implements CompileableTemp
         * @throws      BasePathReadProtectedException  If $templateBasePath is
         *                                                                                      read-protected
         */
-       public static final function createXml???TemplateEngine (ManageableApplication $applicationInstance) {
+       public static final function createXml???TemplateEngine () {
                // Get a new instance
                $templateInstance = new Xml???TemplateEngine();
 
@@ -93,7 +93,7 @@ class Xml???TemplateEngine extends BaseTemplateEngine implements CompileableTemp
 
                // Set template extensions
                $templateInstance->setRawTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('raw_template_extension'));
-               $templateInstance->setCodeTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('!!!_template_extension'));
+               $templateInstance->setCodeTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('node_message_template_extension'));
 
                // Absolute output path for compiled templates
                $templateInstance->setCompileOutputPath($templateInstance->getConfigInstance()->getConfigEntry('base_path') . $templateInstance->getConfigInstance()->getConfigEntry('compile_output_path'));
index a80245dda0c4a3c9de1220fc5708fafb81c58537..eb6353417069d3f494f0b1dbd43029f7ac27febb 100644 (file)
@@ -109,7 +109,7 @@ class XmlSelfConnectTemplateEngine extends BaseTemplateEngine implements Compile
 
                // Set template extensions
                $templateInstance->setRawTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('raw_template_extension'));
-               $templateInstance->setCodeTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('node_self_connect_template_extension'));
+               $templateInstance->setCodeTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('node_message_template_extension'));
 
                // Absolute output path for compiled templates
                $templateInstance->setCompileOutputPath($templateInstance->getConfigInstance()->getConfigEntry('base_path') . $templateInstance->getConfigInstance()->getConfigEntry('compile_output_path'));
diff --git a/application/hub/templates/xml/answer/.htaccess b/application/hub/templates/xml/answer/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/application/hub/templates/xml/answer/announcement/.htaccess b/application/hub/templates/xml/answer/announcement/.htaccess
new file mode 100644 (file)
index 0000000..3a42882
--- /dev/null
@@ -0,0 +1 @@
+Deny from all
diff --git a/application/hub/templates/xml/answer/announcement/announcement_answer.xml b/application/hub/templates/xml/answer/announcement/announcement_answer.xml
new file mode 100644 (file)
index 0000000..fbef1a4
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+An XML template for answering announcements from other nodes. This template may
+be used to indicate that this node does not want to receive announcements.
+
+@author                Roland Haeder <webmaster@ship-simu.org>
+@version       0.0.0
+@copyright     Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Hub 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/>
+//-->
+<announcement-answer>
+</announcement-answer>