]> git.mxchange.org Git - hub.git/commitdiff
Added missing config entry + unfinished class NodeMessageDhtBootstrapAnswerHandler
authorRoland Haeder <roland@mxchange.org>
Sun, 16 Mar 2014 20:47:11 +0000 (21:47 +0100)
committerRoland Haeder <roland@mxchange.org>
Sun, 16 Mar 2014 20:47:11 +0000 (21:47 +0100)
Signed-off-by: Roland Haeder <roland@mxchange.org>
application/hub/config.php
application/hub/exceptions/dht/class_NoDhtBootstrapAttemptedException.php
application/hub/main/class_BaseHubSystem.php
application/hub/main/handler/message-types/answer/class_NodeMessageDhtBootstrapAnswerHandler.php [new file with mode: 0644]

index ef088854f473e116fe8aa9da748cfed1081aad54..e47c5e0957595b7bc4a20b765dc5a4522c73b1c8 100644 (file)
@@ -219,6 +219,9 @@ $cfg->setConfigEntry('message_type_announcement_handler_class', 'NodeMessageAnno
 // CFG: MESSAGE-TYPE-ANNOUNCEMENT-ANSWER-HANDLER-CLASS
 $cfg->setConfigEntry('message_type_announcement_answer_handler_class', 'NodeMessageAnnouncementAnswerHandler');
 
+// CFG: MESSAGE-TYPE-DHT-BOOTSTRAP-ANSWER-HANDLER-CLASS
+$cfg->setConfigEntry('message_type_dht_bootstrap_answer_handler_class', 'NodeMessageDhtBootstrapAnswerHandler');
+
 // CFG: MESSAGE-TYPE-SELF-CONNECT-HANDLER-CLASS
 $cfg->setConfigEntry('message_type_self_connect_handler_class', 'NodeMessageSelfConnectHandler');
 
index 32b294678f367dbdb411b01ad2f14da79cc900ff..fed54274ef5ab99c2a449494aaab4d4f8136724e 100644 (file)
@@ -32,7 +32,7 @@ class NoDhtBootstrapAttemptedException extends FrameworkException {
         */
        public function __construct (array $messageArray, $code) {
                // Construct the message
-               $message = sprintf('[%s:%d] This node (%s) has not attempted to bootstrap its DHT, but got an answer from session-id=%s,ip=%s/%s,listen port=%s,status=%s.',
+               $message = sprintf('[%s:%d] This DHT (%s) has not attempted to bootstrap, but got an answer from session-id=%s,ip=%s/%s,listen port=%s,status=%s.',
                        $messageArray[0]->__toString(),
                        $this->getLine(),
                        $messageArray[1]->__toString(),
index 15b97beeedd447fd259e57e8daca85352cb0fbde..39ce33e30a9c963adf86be6828d62c7e2fb994c7 100644 (file)
@@ -33,6 +33,7 @@ class BaseHubSystem extends BaseFrameworkSystem {
        const EXCEPTION_REQUEST_NOT_ACCEPTED          = 0x907;
        const EXCEPTION_DHT_BOOTSTRAP_NOT_ACCEPTED    = 0x908;
        const EXCEPTION_MULTIPLE_MESSAGE_SENT         = 0x909;
+       const EXCEPTION_DHT_BOOTSTRAP_NOT_ATTEMPTED   = 0x90A;
 
        // Message status codes
        const MESSAGE_STATUS_CODE_OKAY = 'OKAY';
diff --git a/application/hub/main/handler/message-types/answer/class_NodeMessageDhtBootstrapAnswerHandler.php b/application/hub/main/handler/message-types/answer/class_NodeMessageDhtBootstrapAnswerHandler.php
new file mode 100644 (file)
index 0000000..23fc0f5
--- /dev/null
@@ -0,0 +1,163 @@
+<?php
+/**
+ * A NodeMessageDhtBootstrapAnswer handler
+ *
+ * @author             Roland Haeder <webmaster@shipsimu.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.shipsimu.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 NodeMessageDhtBootstrapAnswerHandler extends BaseMessageHandler implements HandleableMessage, Registerable {
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+
+               // Set handler name
+               $this->setHandlerName('message_announcement_answer');
+
+               // Init message data array
+               $this->messageDataElements = array(
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_EXTERNAL_IP,
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_INTERNAL_IP,
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_NODE_STATUS,
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_SESSION_ID,
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_LISTEN_PORT,
+                       BaseXmlAnswerTemplateEngine::ANSWER_STATUS,
+               );
+
+               // Init message-data->configuration translation array
+               $this->messageToConfig = array(
+               /*
+                       XmlDhtBootstrapTemplateEngine::DHT_BOOTSTRAP_DATA_EXTERNAL_IP => 'your_external_ip',
+                       XmlDhtBootstrapTemplateEngine::DHT_BOOTSTRAP_DATA_INTERNAL_IP => 'your_internal_ip',
+                       XmlDhtBootstrapTemplateEngine::DHT_BOOTSTRAP_DATA_SESSION_ID  => 'your_session_id'
+               */
+               );
+
+               // Init config-copy array
+               $this->configCopy = array(
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_EXTERNAL_IP => 'external_ip',
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_INTERNAL_IP => 'internal_ip',
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_NODE_STATUS => 'node_status',
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_SESSION_ID  => 'session_id',
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_LISTEN_PORT => 'node_listen_port',
+               );
+
+               // Init array
+               $this->searchData = array(
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_SESSION_ID,
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_EXTERNAL_IP,
+                       XmlDhtBootstrapAnswerTemplateEngine::DHT_BOOTSTRAP_DATA_LISTEN_PORT
+               );
+       }
+
+       /**
+        * Creates an instance of this class
+        *
+        * @return      $handlerInstance        An instance of a HandleableMessage class
+        */
+       public final static function createNodeMessageDhtBootstrapAnswerHandler () {
+               // Get new instance
+               $handlerInstance = new NodeMessageDhtBootstrapAnswerHandler();
+
+               // Return the prepared instance
+               return $handlerInstance;
+       }
+
+       /**
+        * Handles data array of the message
+        *
+        * @param       $messageData            An array with message data to handle
+        * @param       $packageInstance        An instance of a Receivable class
+        * @return      void
+        * @throws      NoDhtBootstrapAttemptedException        If this DHT has not attempted to bootstrap
+        * @todo        ~30% done
+        */
+       public function handleMessageData (array $messageData, Receivable $packageInstance) {
+               // Get DHT instance
+               $dhtInstance = DhtObjectFactory::createDhtObjectInstance('node');
+
+               // Has this DHT attempted to bootstrap?
+               if (!$dhtInstance->ifDhtIsBooting()) {
+                       /*
+                        * This DHT has never bootstrapped, so it doesn't expect
+                        * announcement answer messages.
+                        */
+                       throw new NoDhtBootstrapAttemptedException(array($this, $dhtInstance, $messageData), self::EXCEPTION_DHT_BOOTSTRAP_NOT_ATTEMPTED);
+               } // END - if
+
+               // Unfinished
+               $this->partialStub('UNHANDLED: messageData=' . print_r($messageData, TRUE));
+       }
+
+       /**
+        * Adds all required elements from given array into data set instance
+        *
+        * @param       $dataSetInstance        An instance of a StoreableCriteria class
+        * @param       $messageData            An array with all message data
+        * @return      void
+        */
+       public function addArrayToDataSet (StoreableCriteria $dataSetInstance, array $messageData) {
+               // Add generic first
+               parent::addArrayToDataSet($dataSetInstance, $messageData);
+
+               // Add all ements
+               foreach ($this->messageDataElements as $key) {
+                       // Is it there?
+                       assert(isset($messageData[$key]));
+
+                       /*
+                        * Add it, but remove any 'my-' prefixes as they are not used in
+                        * database layer.
+                        */
+                       $dataSetInstance->addCriteria(str_replace('my-', '', $key), $messageData[$key]);
+               } // END - foreach
+       }
+
+       /**
+        * Initializes configuration data from given message data array
+        *
+        * @param       $messageData    An array with all message data
+        * @return      void
+        * @throws      UnsupportedOperationException   If this method is called
+        */
+       protected function initMessageConfigurationData (array $messageData) {
+               // Please don't call this method
+               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+       }
+
+       /**
+        * Removes configuration data with given message data array from global
+        * configuration
+        *
+        * @param       $messageData    An array with all message data
+        * @return      void
+        * @throws      UnsupportedOperationException   If this method is called
+        */
+       protected function removeMessageConfigurationData (array $messageData) {
+               // Please don't call this method
+               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+       }
+}
+
+// [EOF]
+?>