From: Roland Häder Date: Tue, 17 Jul 2012 18:10:50 +0000 (+0000) Subject: The announcement answer is now half handled, registration (more update) of the node... X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=c398e32345a4b8a025682e4cc9c215079b3da24c;p=hub.git The announcement answer is now half handled, registration (more update) of the node is implement, handling the answer status is not yet finished --- diff --git a/.gitattributes b/.gitattributes index e50089001..a9033d5e4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 index 000000000..fa8fdf59b --- /dev/null +++ b/application/hub/exceptions/announcement/class_NoAnnouncementAttemptedException.php @@ -0,0 +1,53 @@ + + * @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 . + */ +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] +?> diff --git a/application/hub/interfaces/nodes/class_NodeHelper.php b/application/hub/interfaces/nodes/class_NodeHelper.php index 80addaf81..1f279bbbf 100644 --- a/application/hub/interfaces/nodes/class_NodeHelper.php +++ b/application/hub/interfaces/nodes/class_NodeHelper.php @@ -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] diff --git a/application/hub/main/class_BaseHubSystem.php b/application/hub/main/class_BaseHubSystem.php index 11155907a..75ce417ac 100644 --- a/application/hub/main/class_BaseHubSystem.php +++ b/application/hub/main/class_BaseHubSystem.php @@ -23,10 +23,11 @@ */ 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'; diff --git a/application/hub/main/handler/message-types/anouncement/class_NodeMessageAnnouncementHandler.php b/application/hub/main/handler/message-types/anouncement/class_NodeMessageAnnouncementHandler.php index 3a0a30265..6d567a21f 100644 --- a/application/hub/main/handler/message-types/anouncement/class_NodeMessageAnnouncementHandler.php +++ b/application/hub/main/handler/message-types/anouncement/class_NodeMessageAnnouncementHandler.php @@ -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 + ); } /** diff --git a/application/hub/main/handler/message-types/answer/class_NodeMessageAnnouncementAnswerHandler.php b/application/hub/main/handler/message-types/answer/class_NodeMessageAnnouncementAnswerHandler.php index 540f5279b..df124db2f 100644 --- a/application/hub/main/handler/message-types/answer/class_NodeMessageAnnouncementAnswerHandler.php +++ b/application/hub/main/handler/message-types/answer/class_NodeMessageAnnouncementAnswerHandler.php @@ -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 } /** diff --git a/application/hub/main/handler/message-types/class_BaseMessageHandler.php b/application/hub/main/handler/message-types/class_BaseMessageHandler.php index d4adb4a58..a9ec5e79d 100644 --- a/application/hub/main/handler/message-types/class_BaseMessageHandler.php +++ b/application/hub/main/handler/message-types/class_BaseMessageHandler.php @@ -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 diff --git a/application/hub/main/nodes/class_BaseHubNode.php b/application/hub/main/nodes/class_BaseHubNode.php index 6f015010c..ad392e8f2 100644 --- a/application/hub/main/nodes/class_BaseHubNode.php +++ b/application/hub/main/nodes/class_BaseHubNode.php @@ -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]