From d881b2f4a7fa73f602827188f5c83e8c9315b008 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Thu, 14 Feb 2013 21:58:55 +0000 Subject: [PATCH] Added very basic implementation of DHT bootstrapping (there are some configuration entries and classes missing) --- .gitattributes | 2 + application/hub/main/dht/class_BaseDht.php | 6 ++ .../hub/main/dht/node/class_NodeDhtFacade.php | 17 +++++ .../hub/main/factories/states/state/.htaccess | 1 + .../states/state/class_DhtStateFactory.php | 65 +++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 application/hub/main/factories/states/state/.htaccess create mode 100644 application/hub/main/factories/states/state/class_DhtStateFactory.php diff --git a/.gitattributes b/.gitattributes index a46eec82f..6a9d5e874 100644 --- a/.gitattributes +++ b/.gitattributes @@ -274,6 +274,8 @@ application/hub/main/factories/states/node/.htaccess svneol=native#text/plain application/hub/main/factories/states/node/class_NodeStateFactory.php svneol=native#text/plain application/hub/main/factories/states/peer/.htaccess -text svneol=unset#text/plain application/hub/main/factories/states/peer/class_PeerStateFactory.php svneol=native#text/plain +application/hub/main/factories/states/state/.htaccess -text svneol=unset#text/plain +application/hub/main/factories/states/state/class_DhtStateFactory.php svneol=native#text/plain application/hub/main/factories/tags/.htaccess -text svneol=unset#text/plain application/hub/main/factories/tags/class_PackageTagsFactory.php svneol=native#text/plain application/hub/main/filter/.htaccess -text svneol=unset#text/plain diff --git a/application/hub/main/dht/class_BaseDht.php b/application/hub/main/dht/class_BaseDht.php index f9dfa5fdf..a71c2f305 100644 --- a/application/hub/main/dht/class_BaseDht.php +++ b/application/hub/main/dht/class_BaseDht.php @@ -31,6 +31,12 @@ class BaseDht extends BaseHubSystem { protected function __construct ($className) { // Call parent constructor parent::__construct($className); + + /* + * Get the state factory and create the initial state, we don't need + * the state instance here + */ + DhtStateFactory::createDhtStateInstanceByName('init', $this); } } diff --git a/application/hub/main/dht/node/class_NodeDhtFacade.php b/application/hub/main/dht/node/class_NodeDhtFacade.php index 56c69efe2..804eb93d8 100644 --- a/application/hub/main/dht/node/class_NodeDhtFacade.php +++ b/application/hub/main/dht/node/class_NodeDhtFacade.php @@ -65,6 +65,9 @@ class NodeDhtFacade extends BaseDht implements Distributable, Registerable { // No, so register it $this->getWrapperInstance()->registerLocalNode(); } + + // Change state + $this->getStateInstance()->dhtHasInitialized(); } /** @@ -75,6 +78,20 @@ class NodeDhtFacade extends BaseDht implements Distributable, Registerable { * @return void */ public function bootstrapDht () { + // Get a helper instance + $helperInstance = ObjectFactory::createObjectByConfiguredName('dht_bootstrap_helper_class'); + + // Load the announcement descriptor + $helperInstance->loadDescriptorXml($this); + + // Compile all variables + $helperInstance->getTemplateInstance()->compileConfigInVariables(); + + // "Publish" the descriptor by sending it to the bootstrap/list nodes + $helperInstance->sendPackage($this); + + // Change state + $this->getStateInstance()->dhtHasBooted(); } /** diff --git a/application/hub/main/factories/states/state/.htaccess b/application/hub/main/factories/states/state/.htaccess new file mode 100644 index 000000000..3a4288278 --- /dev/null +++ b/application/hub/main/factories/states/state/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/application/hub/main/factories/states/state/class_DhtStateFactory.php b/application/hub/main/factories/states/state/class_DhtStateFactory.php new file mode 100644 index 000000000..1cc1a8dd8 --- /dev/null +++ b/application/hub/main/factories/states/state/class_DhtStateFactory.php @@ -0,0 +1,65 @@ + + * @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 DhtStateFactory extends ObjectFactory { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Creates an instance of a configurable DHT state and sets it in the + * given DHT instance. + * + * @param $stateName Name of the state + * @param $dhtInstance A Distributable class instance + * @return $stateInstance A Stateable class instance + */ + public static final function createDhtStateInstanceByName ($stateName, Distributable $dhtInstance) { + // Then construct the class' configuraton entry + $className = 'dht_' . $stateName . '_state_class'; + + // Get a class from that configuration entry + $stateInstance = self::createObjectByConfiguredName($className, array($dhtInstance)); + + // Debug message + self::createDebugInstance(__CLASS__)->debugOutput('DHT-STATE-FACTORY[' . __LINE__ . ']: DHT state has changed from ' . $dhtInstance->getPrintableState() . ' to ' . $stateInstance->getStateName() . '.'); + + // Once we have that state, set it in the DHT instance + $dhtInstance->setStateInstance($stateInstance); + + // Update DHT data + $dhtInstance->updateDhtData(); + + // For any purposes, return the state instance + return $stateInstance; + } +} + +// [EOF] +?> -- 2.39.2