From a99602b6885c0c7a8018c406271fae9058280fd0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Sun, 20 May 2012 12:04:26 +0000 Subject: [PATCH] Message helper for receiving announcement answers added (not fully finished, the XML nodes are currently all dropped) --- .gitattributes | 2 + application/hub/config.php | 7 +- .../hub/main/filter/tags/answer/.htaccess | 1 + ...ass_PackageAnnouncementAnswerTagFilter.php | 142 ++++++++++++++++++ .../class_PackageAnnouncementTagFilter.php | 2 +- ...ss_NodeAnnouncementMessageAnswerHelper.php | 2 +- 6 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 application/hub/main/filter/tags/answer/.htaccess create mode 100644 application/hub/main/filter/tags/answer/class_PackageAnnouncementAnswerTagFilter.php diff --git a/.gitattributes b/.gitattributes index ffa130e51..8ae28acf3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -284,6 +284,8 @@ application/hub/main/filter/shutdown/node/class_NodeShutdownFlushNodeListFilter. application/hub/main/filter/shutdown/node/class_NodeShutdownNodeFilter.php svneol=native#text/plain application/hub/main/filter/shutdown/node/class_NodeShutdownTaskHandlerFilter.php svneol=native#text/plain application/hub/main/filter/tags/.htaccess -text svneol=unset#text/plain +application/hub/main/filter/tags/answer/.htaccess -text svneol=unset#text/plain +application/hub/main/filter/tags/answer/class_PackageAnnouncementAnswerTagFilter.php svneol=native#text/plain application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php svneol=native#text/plain application/hub/main/filter/tags/class_PackageSelfConnectTagFilter.php svneol=native#text/plain application/hub/main/filter/task/.htaccess -text svneol=unset#text/plain diff --git a/application/hub/config.php b/application/hub/config.php index 2be81a813..1cf9c0b8d 100644 --- a/application/hub/config.php +++ b/application/hub/config.php @@ -201,6 +201,9 @@ $cfg->setConfigEntry('package_filter_chain_class', 'PackageFilterChain'); // CFG: PACKAGE-TAG-ANNOUNCEMENT-FILTER $cfg->setConfigEntry('package_tag_announcement_filter', 'PackageAnnouncementTagFilter'); +// CFG: PACKAGE-TAG-ANNOUNCEMENT-ANSWER-FILTER +$cfg->setConfigEntry('package_tag_announcement_answer_filter', 'PackageAnnouncementAnswerTagFilter'); + // CFG: PACKAGE-TAG-SELF-CONNECT-FILTER $cfg->setConfigEntry('package_tag_self_connect_filter', 'PackageSelfConnectTagFilter'); @@ -219,8 +222,8 @@ $cfg->setConfigEntry('news_reader_class', 'ConsoleNewsReader'); // CFG: NODE-ANNOUNCEMENT-TEMPLATE-CLASS $cfg->setConfigEntry('node_announcement_template_class', 'XmlAnnouncementTemplateEngine'); -// CFG: NODE-ANSWER-ANNOUNCEMENT-TEMPLATE-CLASS -$cfg->setConfigEntry('node_answer_announcement_template_class', 'XmlAnnouncementAnswerTemplateEngine'); +// CFG: NODE-ANNOUNCEMENT-ANSWER-TEMPLATE-CLASS +$cfg->setConfigEntry('node_announcement_answer_template_class', 'XmlAnnouncementAnswerTemplateEngine'); // CFG: NODE-MESSAGE-TEMPLATE-EXTENSION $cfg->setConfigEntry('node_message_template_extension', '.xml'); diff --git a/application/hub/main/filter/tags/answer/.htaccess b/application/hub/main/filter/tags/answer/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/main/filter/tags/answer/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/application/hub/main/filter/tags/answer/class_PackageAnnouncementAnswerTagFilter.php b/application/hub/main/filter/tags/answer/class_PackageAnnouncementAnswerTagFilter.php new file mode 100644 index 000000000..43d5df34b --- /dev/null +++ b/application/hub/main/filter/tags/answer/class_PackageAnnouncementAnswerTagFilter.php @@ -0,0 +1,142 @@ + + * @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 PackageAnnouncementAnswerTagFilter extends BaseFilter implements FilterablePackage { + /** + * Array with all data XML nodes (which hold the actual data) and their values + */ + private $dataXmlNodes = array(); + + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + + // Init array + $this->dataXmlNodes = array( + XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_EXTERNAL_IP => '', + XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_INTERNAL_IP => '', + XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_NODE_STATUS => '', + XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_SESSION_ID => '', + XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_TCP_PORT => 9060, + XmlAnnouncementTemplateEngine::ANNOUNCEMENT_DATA_UDP_PORT => 9060 + ); + } + + /** + * Creates an instance of this filter class + * + * @return $filterInstance An instance of this filter class + */ + public final static function createPackageAnnouncementAnswerTagFilter () { + // Get a new instance + $filterInstance = new PackageAnnouncementAnswerTagFilter(); + + // Return the instance + return $filterInstance; + } + + /** + * Executes the filter with given request and response objects + * + * @param $requestInstance An instance of a class with an Requestable interface + * @param $responseInstance An instance of a class with an Responseable interface + * @return void + * @throws UnsupportedOperationException If this method is called, please use processMessage() instead! + */ + public function execute (Requestable $requestInstance, Responseable $responseInstance) { + // Please don't call this method + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Processes the given raw message content. The method renderXmlContent + * may throw (not the method itself) several exceptions: + * + * InvalidXmlNodeException - If an invalid XML node has been found (e.g. + * wrong/out-dated template used) + * XmlNodeMismatchException - Again might be caused by invalid XML node + * usage + * XmlParserException - If the XML message is damaged or not + * well-formed + * + * @param $messageContent Raw message content + * @param $packageInstance An instance of a Receivable class + * @return void + * @todo Exceptions from renderXmlContent() are currently unhandled + */ + public function processMessage ($messageContent, Receivable $packageInstance) { + // Get a template instance from the factory + $templateInstance = XmlTemplateEngineFactory::createXmlTemplateEngineInstance('node_announcement_answer_template_class'); + + // And render the XML content (aka message) + $templateInstance->renderXmlContent($messageContent); + + /* + * The template system now stores all required data as 'general' + * variables, so simply get them. If there is an invalid XML node + * inside the message, the above method call will cause exceptions. + */ + foreach ($this->dataXmlNodes as $key => $dummy) { + // Get the variable from template engine + $value = $templateInstance->readAnnouncementAnswerData($key); + + /* + * If value is NULL, a variable hasn't been found. This could mean + * that *this* node is running an out-dated software or the other + * peer is using an out-dated announcement_answer.xml template. + */ + if (is_null($value)) { + // Output a warning + $this->debugOutput('ANNOUNCEMENT-ANSWER-TAG: Found not fully supported variable ' . $key . ' - skipping.'); + + // Skip this part, don't write NULLs to the array + continue; + } // END - if + + // Debug message + /* NOISY-DEBUG: */ $this->debugOutput('ANNOUNCEMENT-TAG-ANSWER: key=' . $key . ',value=' . $value); + + // Set it now + $this->dataXmlNodes[$key] = $value; + } // END - foreach + + // Construct an array for pushing it on next stack + $messageArray = array( + // Message data itself + NetworkPackage::MESSAGE_ARRAY_DATA => $this->dataXmlNodes, + // Message type (which is 'announcement') + NetworkPackage::MESSAGE_ARRAY_TYPE => 'announcement_answer' + ); + + // Push the processed message back on stack + $packageInstance->getStackerInstance()->pushNamed(NetworkPackage::STACKER_NAME_PROCESSED_MESSAGE, $messageArray); + } +} + +// [EOF] +?> diff --git a/application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php b/application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php index 426664dc5..eb9e5337e 100644 --- a/application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php +++ b/application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php @@ -119,7 +119,7 @@ class PackageAnnouncementTagFilter extends BaseFilter implements FilterablePacka } // END - if // Debug message - $this->debugOutput('ANNOUNCEMENT-TAG: key=' . $key . ',value=' . $value); + /* NOISY-DEBUG: */ $this->debugOutput('ANNOUNCEMENT-TAG: key=' . $key . ',value=' . $value); // Set it now $this->dataXmlNodes[$key] = $value; diff --git a/application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php b/application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php index e174be152..a02daae18 100644 --- a/application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php +++ b/application/hub/main/helper/hub/answer/announcement/class_NodeAnnouncementMessageAnswerHelper.php @@ -66,7 +66,7 @@ class NodeAnnouncementMessageAnswerHelper extends BaseHubAnswerHelper implements $this->debugOutput('HELPER: Attempting to answer an announcement...'); // Get a XML template instance - $templateInstance = XmlTemplateEngineFactory::createXmlTemplateEngineInstance('node_answer_announcement_template_class'); + $templateInstance = XmlTemplateEngineFactory::createXmlTemplateEngineInstance('node_announcement_answer_template_class'); // Set it for later use $this->setTemplateInstance($templateInstance); -- 2.39.2