* @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 BaseMessageHandler extends BaseHandler { /** * Array with search criteria elements */ private $searchData = array(); /** * Array with all data XML nodes (which hold the actual data) and their values */ protected $messageDataElements = array(); /** * Protected constructor * * @param $className Name of the class * @return void */ 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 ); } /** * Registers an other node with this node by given message data. The * following data must always be present: * * - session-id (for finding the node's record together with below data) * - external-ip (hostname or IP number) * - tcp-port (TCP port for inbound connections) * * @param $messageArray An array with all minimum message data * @return void */ protected function registerNodeByMessageData (array $messageData) { // Get a wrapper instance $wrapperInstance = ObjectFactory::createObjectByConfiguredName('node_list_db_wrapper_class'); // Get a search criteria class $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_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]); } // END - foreach // Only one entry is fine $searchInstance->setLimit(1); // Run the query $resultInstance = $wrapperInstance->doSelectByCriteria($searchInstance); // Is there already an entry? if ($resultInstance->next()) { // Entry found $resultInstance->debugBackTrace('Entry found!'); } else { // Nothing found, so register it $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] ?>