From a99602b6885c0c7a8018c406271fae9058280fd0 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Roland=20H=C3=A4der?= <roland@mxchange.org>
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 @@
+<?php
+/**
+ * A AnnouncementAnswerTag filter for Package
+ *
+ * @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 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.5