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
--- /dev/null
+<?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]
+?>
* @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]
*/
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';
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
+ );
}
/**
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
);
}
* @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);
}
/**
* @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
}
/**
/**
* 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
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
- );
}
/**
* @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');
// 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
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
*
// 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]