* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core 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 BaseHubNode extends BaseFrameworkSystem implements Updateable { /** * Node id */ private $nodeId = ""; /** * Protected constructor * * @param $className Name of the class * @return void */ protected function __construct ($className) { // Call parent constructor parent::__construct($className); // Clean up a little $this->removeNumberFormaters(); $this->removeSystemArray(); } /** * Setter for node id * * @param $nodeId Our new node id * @return void */ private final function setNodeId ($nodeId) { $this->nodeId = (string) $nodeId; } /** * Getter for node id * * @return $nodeId Our new node id */ private final function getNodeId () { return $this->nodeId; } /** * Method to aquire a hub-id. On first run this generates a new one * based on many pseudo-random data. On any later run, unless the id * got not removed from database, it will be restored from the database. * * @param $requestInstance An instance of a Requestable class * @return void */ public function aquireHubId (Requestable $requestInstance) { // Get a wrapper instance $wrapperInstance = ObjectFactory::createObjectByConfiguredName('node_info_db_wrapper_class'); // Now get a search criteria instance $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); // Search for the node number zero which is hard-coded the default $searchInstance->addCriteria(NodeInformationDatabaseWrapper::DB_COLUMN_NODE_NR, 1); $searchInstance->addCriteria(NodeInformationDatabaseWrapper::DB_COLUMN_NODE_TYPE, $requestInstance->getRequestElement('mode')); $searchInstance->setLimit(1); // Get a result back $resultInstance = $wrapperInstance->doSelectByCriteria($searchInstance); // Is it valid? if ($resultInstance->next()) { // Save the result instance in this class $this->setResultInstance($resultInstance); // Get the node id from result and set it $this->setNodeId($this->getField(NodeInformationDatabaseWrapper::DB_COLUMN_NODE_ID)); // Output message $this->getDebugInstance()->output('Re-using found node-id: ' . $this->getNodeId() . ''); } else { // Get an RNG instance (Random Number Generator) $rngInstance = ObjectFactory::createObjectByConfiguredName('rng_class'); // Generate a pseudo-random string $randomString = $rngInstance->randomString(255) . ':' . $requestInstance->getRequestElement('mode'); // Get a crypto instance $cryptoInstance = ObjectFactory::createObjectByConfiguredName('crypto_class'); // Hash and encrypt the string so we become a "node id" aka Hub-Id $this->setNodeId($cryptoInstance->hashString($cryptoInstance->encryptString($randomString))); // Register the node id with our wrapper $wrapperInstance->registerNodeId($this, $requestInstance); // Output message $this->getDebugInstance()->output('Creating new node-id: ' . $this->getNodeId() . ''); } } /** * Adds registration elements to a given dataset instance * * @param $criteriaInstance An instance of a storeable criteria * @param $requestInstance An instance of a Requestable class * @return void */ public function addElementsToDataSet (StoreableCriteria $criteriaInstance, Requestable $requestInstance) { // Add node number and type $criteriaInstance->addCriteria(NodeInformationDatabaseWrapper::DB_COLUMN_NODE_NR, 1); $criteriaInstance->addCriteria(NodeInformationDatabaseWrapper::DB_COLUMN_NODE_TYPE, $requestInstance->getRequestElement('mode')); // Add the node id $criteriaInstance->addCriteria(NodeInformationDatabaseWrapper::DB_COLUMN_NODE_ID, $this->getNodeId()); } /** * Updates a given field with new value * * @param $fieldName Field to update * @param $fieldValue New value to store * @return void * @throws DatabaseUpdateSupportException If this class does not support database updates * @todo Try to make this method more generic so we can move it in BaseFrameworkSystem */ public function updateDatabaseField ($fieldName, $fieldValue) { // Unfinished $this->partialStub("Unfinished!"); return; // Get a critieria instance $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); // Add search criteria $searchInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName()); $searchInstance->setLimit(1); // Now get another criteria $updateInstance = ObjectFactory::createObjectByConfiguredName('update_criteria_class'); // Add criteria entry which we shall update $updateInstance->addCriteria($fieldName, $fieldValue); // Add the search criteria for searching for the right entry $updateInstance->setSearchInstance($searchInstance); // Set wrapper class name $updateInstance->setWrapperConfigEntry('user_db_wrapper_class'); // Remember the update in database result $this->getResultInstance()->add2UpdateQueue($updateInstance); } } // [EOF] ?>