From f8fb89d6b4f9b4bfbd5498f784043542ea23ec88 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Thu, 17 May 2012 21:47:29 +0000 Subject: [PATCH] Added announcement answer XML, template engine and acceptance of announcements --- .gitattributes | 11 + application/hub/config.php | 22 +- .../hub/exceptions/announcement/.htaccess | 1 + ...class_AnnouncementNotAcceptedException.php | 52 ++++ application/hub/main/class_BaseHubSystem.php | 1 + .../console/class_HubConsoleMainCommand.php | 2 +- .../class_NodeMessageAnnouncementHandler.php | 15 +- .../hub/main/handler/message-types/class_ | 2 +- .../class_BaseMessageHandler.php | 24 ++ .../class_NodeMessageSelfConnectHandler.php | 2 +- .../hub/main/helper/hub/answer/.htaccess | 1 + .../helper/hub/answer/announcement/.htaccess | 1 + ...ss_NodeAnnouncementMessageAnswerHelper.php | 100 +++++++ .../hub/answer/class_BaseHubAnswerHelper.php | 61 ++++ .../hub/main/nodes/boot/class_HubBootNode.php | 3 + .../hub/main/nodes/class_BaseHubNode.php | 35 ++- .../main/nodes/master/class_HubMasterNode.php | 6 +- .../hub/main/package/class_NetworkPackage.php | 5 + .../class_XmlAnnouncementTemplateEngine.php | 2 +- .../hub/main/template/answer/.htaccess | 1 + .../template/answer/announcement/.htaccess | 1 + ...ss_XmlAnnouncementAnswerTemplateEngine.php | 280 ++++++++++++++++++ application/hub/main/template/class_ | 6 +- .../class_XmlSelfConnectTemplateEngine.php | 2 +- .../hub/templates/xml/answer/.htaccess | 1 + .../xml/answer/announcement/.htaccess | 1 + .../announcement/announcement_answer.xml | 26 ++ 27 files changed, 646 insertions(+), 18 deletions(-) create mode 100644 application/hub/exceptions/announcement/.htaccess create mode 100644 application/hub/exceptions/announcement/class_AnnouncementNotAcceptedException.php create mode 100644 application/hub/main/helper/hub/answer/.htaccess create mode 100644 application/hub/main/helper/hub/answer/announcement/.htaccess create mode 100644 application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php create mode 100644 application/hub/main/helper/hub/answer/class_BaseHubAnswerHelper.php create mode 100644 application/hub/main/template/answer/.htaccess create mode 100644 application/hub/main/template/answer/announcement/.htaccess create mode 100644 application/hub/main/template/answer/announcement/class_XmlAnnouncementAnswerTemplateEngine.php create mode 100644 application/hub/templates/xml/answer/.htaccess create mode 100644 application/hub/templates/xml/answer/announcement/.htaccess create mode 100644 application/hub/templates/xml/answer/announcement/announcement_answer.xml diff --git a/.gitattributes b/.gitattributes index 45c7020e0..efafc998d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/application/hub/config.php b/application/hub/config.php index 49bee6e90..a5712268d 100644 --- a/application/hub/config.php +++ b/application/hub/config.php @@ -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 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/exceptions/announcement/.htaccess @@ -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 index 000000000..40c9e5fe7 --- /dev/null +++ b/application/hub/exceptions/announcement/class_AnnouncementNotAcceptedException.php @@ -0,0 +1,52 @@ + + * @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 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] +?> diff --git a/application/hub/main/class_BaseHubSystem.php b/application/hub/main/class_BaseHubSystem.php index a147db437..9939c6bdd 100644 --- a/application/hub/main/class_BaseHubSystem.php +++ b/application/hub/main/class_BaseHubSystem.php @@ -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 diff --git a/application/hub/main/commands/console/class_HubConsoleMainCommand.php b/application/hub/main/commands/console/class_HubConsoleMainCommand.php index 76e456d6c..8c138e294 100644 --- a/application/hub/main/commands/console/class_HubConsoleMainCommand.php +++ b/application/hub/main/commands/console/class_HubConsoleMainCommand.php @@ -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 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 8b4195a95..adbd31554 100644 --- a/application/hub/main/handler/message-types/anouncement/class_NodeMessageAnnouncementHandler.php +++ b/application/hub/main/handler/message-types/anouncement/class_NodeMessageAnnouncementHandler.php @@ -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); diff --git a/application/hub/main/handler/message-types/class_ b/application/hub/main/handler/message-types/class_ index 47794405d..5da7f27ea 100644 --- a/application/hub/main/handler/message-types/class_ +++ b/application/hub/main/handler/message-types/class_ @@ -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( diff --git a/application/hub/main/handler/message-types/class_BaseMessageHandler.php b/application/hub/main/handler/message-types/class_BaseMessageHandler.php index 7b6763eee..5b9382856 100644 --- a/application/hub/main/handler/message-types/class_BaseMessageHandler.php +++ b/application/hub/main/handler/message-types/class_BaseMessageHandler.php @@ -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] diff --git a/application/hub/main/handler/message-types/self-connect/class_NodeMessageSelfConnectHandler.php b/application/hub/main/handler/message-types/self-connect/class_NodeMessageSelfConnectHandler.php index 00d1acbc1..642b07d99 100644 --- a/application/hub/main/handler/message-types/self-connect/class_NodeMessageSelfConnectHandler.php +++ b/application/hub/main/handler/message-types/self-connect/class_NodeMessageSelfConnectHandler.php @@ -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 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/main/helper/hub/answer/.htaccess @@ -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 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/main/helper/hub/answer/announcement/.htaccess @@ -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 index 000000000..9605ce5ce --- /dev/null +++ b/application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php @@ -0,0 +1,100 @@ + + * @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 . + */ +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 index 000000000..c5850d249 --- /dev/null +++ b/application/hub/main/helper/hub/answer/class_BaseHubAnswerHelper.php @@ -0,0 +1,61 @@ + + * @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 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] +?> diff --git a/application/hub/main/nodes/boot/class_HubBootNode.php b/application/hub/main/nodes/boot/class_HubBootNode.php index a73135183..cf4d4046d 100644 --- a/application/hub/main/nodes/boot/class_HubBootNode.php +++ b/application/hub/main/nodes/boot/class_HubBootNode.php @@ -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.'); } diff --git a/application/hub/main/nodes/class_BaseHubNode.php b/application/hub/main/nodes/class_BaseHubNode.php index 1ba56ca42..8a091325e 100644 --- a/application/hub/main/nodes/class_BaseHubNode.php +++ b/application/hub/main/nodes/class_BaseHubNode.php @@ -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 * diff --git a/application/hub/main/nodes/master/class_HubMasterNode.php b/application/hub/main/nodes/master/class_HubMasterNode.php index 19ec9b093..4b8963734 100644 --- a/application/hub/main/nodes/master/class_HubMasterNode.php +++ b/application/hub/main/nodes/master/class_HubMasterNode.php @@ -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!'); } /** diff --git a/application/hub/main/package/class_NetworkPackage.php b/application/hub/main/package/class_NetworkPackage.php index 866956451..f36ef3727 100644 --- a/application/hub/main/package/class_NetworkPackage.php +++ b/application/hub/main/package/class_NetworkPackage.php @@ -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 */ diff --git a/application/hub/main/template/announcement/class_XmlAnnouncementTemplateEngine.php b/application/hub/main/template/announcement/class_XmlAnnouncementTemplateEngine.php index 935ddb64f..fca8784ee 100644 --- a/application/hub/main/template/announcement/class_XmlAnnouncementTemplateEngine.php +++ b/application/hub/main/template/announcement/class_XmlAnnouncementTemplateEngine.php @@ -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 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/main/template/answer/.htaccess @@ -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 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/main/template/answer/announcement/.htaccess @@ -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 index 000000000..f24014b8e --- /dev/null +++ b/application/hub/main/template/answer/announcement/class_XmlAnnouncementAnswerTemplateEngine.php @@ -0,0 +1,280 @@ + + * @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 . + */ +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: >".$element."<
\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: >".$nodeName."<
\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."
\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] +?> diff --git a/application/hub/main/template/class_ b/application/hub/main/template/class_ index 40cbc1d7a..218e240a1 100644 --- a/application/hub/main/template/class_ +++ b/application/hub/main/template/class_ @@ -23,7 +23,7 @@ * along with this program. If not, see . */ 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')); diff --git a/application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php b/application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php index a80245dda..eb6353417 100644 --- a/application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php +++ b/application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php @@ -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 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/templates/xml/answer/.htaccess @@ -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 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/templates/xml/answer/announcement/.htaccess @@ -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 index 000000000..fbef1a408 --- /dev/null +++ b/application/hub/templates/xml/answer/announcement/announcement_answer.xml @@ -0,0 +1,26 @@ + + + + -- 2.39.5