]> git.mxchange.org Git - hub.git/commitdiff
The announcement answer is now half handled, registration (more update) of the node...
authorRoland Häder <roland@mxchange.org>
Tue, 17 Jul 2012 18:10:50 +0000 (18:10 +0000)
committerRoland Häder <roland@mxchange.org>
Tue, 17 Jul 2012 18:10:50 +0000 (18:10 +0000)
.gitattributes
application/hub/exceptions/announcement/class_NoAnnouncementAttemptedException.php [new file with mode: 0644]
application/hub/interfaces/nodes/class_NodeHelper.php
application/hub/main/class_BaseHubSystem.php
application/hub/main/handler/message-types/anouncement/class_NodeMessageAnnouncementHandler.php
application/hub/main/handler/message-types/answer/class_NodeMessageAnnouncementAnswerHandler.php
application/hub/main/handler/message-types/class_BaseMessageHandler.php
application/hub/main/nodes/class_BaseHubNode.php

index e50089001f37dc2c2b61b36f7144e2d0784288d5..a9033d5e440f69801da9d85ff3da3936ed3b8393 100644 (file)
@@ -10,6 +10,7 @@ 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/announcement/class_NoAnnouncementAttemptedException.php -text
 application/hub/exceptions/connection/.htaccess -text svneol=unset#text/plain
 application/hub/exceptions/connection/class_InvalidConnectionTypeException.php svneol=native#text/plain
 application/hub/exceptions/hub/.htaccess -text svneol=unset#text/plain
diff --git a/application/hub/exceptions/announcement/class_NoAnnouncementAttemptedException.php b/application/hub/exceptions/announcement/class_NoAnnouncementAttemptedException.php
new file mode 100644 (file)
index 0000000..fa8fdf5
--- /dev/null
@@ -0,0 +1,53 @@
+<?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 NoAnnouncementAttemptedException 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) has not attempted to announce itself, but got an answer from session-id=%s,ip=%s/%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_INTERNAL_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 80addaf8144a865b3af0ef82970ee9e410cfd527..1f279bbbfb67d6453e823fc095dd4f81c5f46e06 100644 (file)
@@ -145,6 +145,28 @@ interface NodeHelper extends FrameworkInterface {
         * @return      void
         */
        function updateNodeData ();
+
+       /**
+        * Checks whether this node accepts announcements
+        *
+        * @return      $acceptAnnouncements    Whether this node accepts announcements
+        */
+       function isAcceptingAnnouncements ();
+
+       /**
+        * Checks whether this node has attempted to announce itself
+        *
+        * @return      $hasAnnounced   Whether this node has attempted to announce itself
+        */
+       function ifNodeHasAnnounced ();
+
+       /**
+        * Handles message answer by given data array
+        *
+        * @param       $messageData    A valid answer message data array
+        * @return      void
+        */
+       function handleAnswerStatusByMessageData (array $messageData);
 }
 
 // [EOF]
index 11155907a23fc76f31ba38eca5598fd5edf01eee..75ce417ac20c73e31ac9f13d4737280e2c73d5db 100644 (file)
  */
 class BaseHubSystem extends BaseFrameworkSystem {
        // Exception codes
-       const EXCEPTION_UNSUPPORTED_ERROR_HANDLER = 0x900;
-       const EXCEPTION_CHUNK_ALREADY_ASSEMBLED   = 0x901;
-       const EXCEPTION_ANNOUNCEMENT_NOT_ACCEPTED = 0x902;
-       const EXCEPTION_INVALID_CONNECTION_TYPE   = 0x903;
+       const EXCEPTION_UNSUPPORTED_ERROR_HANDLER  = 0x900;
+       const EXCEPTION_CHUNK_ALREADY_ASSEMBLED    = 0x901;
+       const EXCEPTION_ANNOUNCEMENT_NOT_ACCEPTED  = 0x902;
+       const EXCEPTION_INVALID_CONNECTION_TYPE    = 0x903;
+       const EXCEPTION_ANNOUNCEMENT_NOT_ATTEMPTED = 0x904;
 
        // Message status codes
        const MESSAGE_STATUS_CODE_OKAY = 'OKAY';
index 3a0a302656cbe87e2cf8fe1d38d4d631a8981910..6d567a21f366aa383c031a0ae64f1abd7ec84562 100644 (file)
@@ -60,6 +60,13 @@ class NodeMessageAnnouncementHandler extends BaseMessageHandler implements Handl
                        XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_TCP_PORT    => 'node_tcp_listen_port',
                        XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_UDP_PORT    => 'node_udp_listen_port'
                );
+
+               // Init array
+               $this->searchData = array(
+                       XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_SESSION_ID,
+                       XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_EXTERNAL_IP,
+                       XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_TCP_PORT
+               );
        }
 
        /**
index 540f5279be32aed26e8d4259a68bd5cfae8f2b38..df124db2f978bb994076d41a6d10b407d77002ce 100644 (file)
@@ -32,14 +32,42 @@ class NodeMessageAnnouncementAnswerHandler extends BaseMessageHandler implements
                parent::__construct(__CLASS__);
 
                // Set handler name
-               $this->setHandlerName('message_announcement');
+               $this->setHandlerName('message_announcement_answer');
 
                // Init message data array
                $this->messageDataElements = array(
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_EXTERNAL_IP,
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_INTERNAL_IP,
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_NODE_STATUS,
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_SESSION_ID,
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_TCP_PORT,
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_UDP_PORT
                );
 
                // Init message-data->configuration translation array
                $this->messageToConfig = array(
+               /*
+                       XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_EXTERNAL_IP => 'your_external_ip',
+                       XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_INTERNAL_IP => 'your_internal_ip',
+                       XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_SESSION_ID  => 'your_session_id'
+               */
+               );
+
+               // Init config-copy array
+               $this->configCopy = array(
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_EXTERNAL_IP => 'external_ip',
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_INTERNAL_IP => 'internal_ip',
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_NODE_STATUS => 'node_status',
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_SESSION_ID  => 'session_id',
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_TCP_PORT    => 'node_tcp_listen_port',
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_UDP_PORT    => 'node_udp_listen_port'
+               );
+
+               // Init array
+               $this->searchData = array(
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_SESSION_ID,
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_EXTERNAL_IP,
+                       XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_TCP_PORT
                );
        }
 
@@ -62,11 +90,26 @@ class NodeMessageAnnouncementAnswerHandler extends BaseMessageHandler implements
         * @param       $messageData            An array with message data to handle
         * @param       $packageInstance        An instance of a Receivable class
         * @return      void
+        * @throws      NoAnnouncementAttemptedException        If this node has not attempted to announce itself
         */
        public function handleMessageData (array $messageData, Receivable $packageInstance) {
-               die('messageData=' . print_r($messageData, true));
+               // Get node instance
+               $nodeInstance = Registry::getRegistry()->getInstance('node');
+
+               // Has this node attempted to announce itself?
+               if (!$nodeInstance->ifNodeHasAnnounced()) {
+                       /*
+                        * This node has never announced itself, so it doesn't expect
+                        * announcement answer messages.
+                        */
+                       throw new NoAnnouncementAttemptedException(array($this, $nodeInstance, $messageData), self::EXCEPTION_ANNOUNCEMENT_NOT_ATTEMPTED);
+               } // END - if
+
                // Register the announcing node with this node
                $this->registerNodeByMessageData($messageData);
+
+               // Handle the answer status element
+               $nodeInstance->handleAnswerStatusByMessageData($messageData);
        }
 
        /**
@@ -75,11 +118,16 @@ class NodeMessageAnnouncementAnswerHandler extends BaseMessageHandler implements
         * @param       $dataSetInstance        An instance of a StoreableCriteria class
         * @param       $messageData            An array with all message data
         * @return      void
-        * @throws      UnsupportedOperationException   If this method is called
         */
        public function addArrayToDataSet (StoreableCriteria $dataSetInstance, array $messageData) {
-               // Please don't call this method
-               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+               // Add all ements
+               foreach ($this->messageDataElements as $key) {
+                       // Is it there?
+                       assert(isset($messageData[$key]));
+
+                       // Add it
+                       $dataSetInstance->addCriteria('node_' . $key, $messageData[$key]);
+               } // END - foreach
        }
 
        /**
index d4adb4a58d27a18d59181784962b8966cfd008a3..a9ec5e79d898192b9a179b290ab2f3af61d6ddca 100644 (file)
@@ -26,7 +26,7 @@ abstract class BaseMessageHandler extends BaseHandler {
        /**
         * Array with search criteria elements
         */
-       private $searchData = array();
+       protected $searchData = array();
 
        /**
         * Array with all data XML nodes (which hold the actual data) and their values
@@ -58,13 +58,6 @@ abstract class BaseMessageHandler extends BaseHandler {
        protected function __construct ($className) {
                // Call parent constructor
                parent::__construct($className);
-
-               // Init array
-               $this->searchData = array(
-                       XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_SESSION_ID,
-                       XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_EXTERNAL_IP,
-                       XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_TCP_PORT
-               );
        }
 
        /**
@@ -108,6 +101,9 @@ abstract class BaseMessageHandler extends BaseHandler {
         * @todo        Add something more, e.g. spreading information over DHT
         */
        protected function registerNodeByMessageData (array $messageData) {
+               // Check if searchData has entries
+               assert(count($this->searchData) > 0);
+
                // Get a wrapper instance
                $wrapperInstance = ObjectFactory::createObjectByConfiguredName('node_list_db_wrapper_class');
 
@@ -117,7 +113,7 @@ abstract class BaseMessageHandler extends BaseHandler {
                // Search for the node's session id and external IP/hostname + TCP port
                foreach ($this->searchData as $key) {
                        // Add criteria
-                       $searchInstance->addCriteria('node_' . $key, $messageData[$key]);
+                       $searchInstance->addCriteria('node_' . str_replace('my-', '', $key), $messageData[$key]);
                } // END - foreach
 
                // Only one entry is fine
index 6f015010cb0711f7fee23c0683cd3d93654b60c7..ad392e8f2d5d934b89411132fc7d50139ba8e266 100644 (file)
@@ -707,6 +707,19 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                return $acceptAnnouncements;
        }
 
+       /**
+        * Checks whether this node has attempted to announce itself
+        *
+        * @return      $hasAnnounced   Whether this node has attempted to announce itself
+        */
+       public function ifNodeHasAnnounced () {
+               // Simply check the state of this node
+               $hasAnnounced = ($this->getStateInstance() instanceof NodeAnnouncedState);
+
+               // Return it
+               return $hasAnnounced;
+       }
+
        /**
         * Enables whether this node accepts announcements
         *
@@ -745,6 +758,16 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                // Set some dummy configuration entries, e.g. node_status
                $this->getConfigInstance()->setConfigEntry('node_status', $this->getStateInstance()->getStateName());
        }
+
+       /**
+        * Handles message answer by given data array
+        *
+        * @param       $messageData    A valid answer message data array
+        * @return      void
+        */
+       public function handleAnswerStatusByMessageData (array $messageData) {
+               die('messageData=' . print_r($messageData, true);
+       }
 }
 
 // [EOF]