]> git.mxchange.org Git - hub.git/commitdiff
Mode-validation and IP detection added, mode classes added
authorRoland Häder <roland@mxchange.org>
Mon, 30 Mar 2009 05:36:24 +0000 (05:36 +0000)
committerRoland Häder <roland@mxchange.org>
Mon, 30 Mar 2009 05:36:24 +0000 (05:36 +0000)
15 files changed:
.gitattributes
application/hub/class_ApplicationHelper.php
application/hub/config.php
application/hub/debug.php
application/hub/exceptions.php
application/hub/init.php
application/hub/interfaces/nodes/class_NodeHelper.php
application/hub/loader.php
application/hub/main/database/wrapper/class_NodeInformationDatabaseWrapper.php
application/hub/main/nodes/boot/class_HubBootNode.php [new file with mode: 0644]
application/hub/main/nodes/class_
application/hub/main/nodes/class_BaseHubNode.php
application/hub/main/nodes/list/class_BootListNode.php [new file with mode: 0644]
application/hub/main/nodes/master/class_HubMasterNode.php [new file with mode: 0644]
application/hub/main/nodes/regular/class_HubRegularNode.php

index b58ad545d4dc13d3beda2487bdb67a279765f350..8d83ab097e8078123ac8331d78ef93dd61b3df61 100644 (file)
@@ -19,10 +19,13 @@ application/hub/main/database/wrapper/.htaccess -text
 application/hub/main/database/wrapper/class_NodeInformationDatabaseWrapper.php -text
 application/hub/main/nodes/.htaccess -text
 application/hub/main/nodes/boot/.htaccess -text
+application/hub/main/nodes/boot/class_HubBootNode.php -text
 application/hub/main/nodes/class_ -text
 application/hub/main/nodes/class_BaseHubNode.php -text
 application/hub/main/nodes/list/.htaccess -text
+application/hub/main/nodes/list/class_BootListNode.php -text
 application/hub/main/nodes/master/.htaccess -text
+application/hub/main/nodes/master/class_HubMasterNode.php -text
 application/hub/main/nodes/regular/.htaccess -text
 application/hub/main/nodes/regular/class_HubRegularNode.php -text
 application/hub/starter.php -text
index 7dc7f51d3c819c649cd2097e71dafa81cd23603d..e7f2bdfefe8d9f426b20679165bb5c94e5339d32 100644 (file)
@@ -22,7 +22,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0
- * @copyright  Copyright(c) 2007 - 2009 Roland Haeder, this is free software
+ * @copyright  Copyright(c) 2007 - 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  *
  * This program is free software: you can redistribute it and/or modify
@@ -38,7 +38,7 @@
  * 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 ApplicationHelper extends BaseFrameworkSystem implements ManageableApplication {
+class ApplicationHelper extends BaseFrameworkSystem implements ManageableApplication, Registerable {
        /**
         * The version number of this application
         */
@@ -173,7 +173,17 @@ class ApplicationHelper extends BaseFrameworkSystem implements ManageableApplica
                $className = 'Hub' . $this->convertToClassName($nodeMode) . 'Node';
 
                // And try to instance it
-               $nodeInstance = ObjectFactory::createObjectByName($className);
+               try {
+                       // Get an instance
+                       $nodeInstance = ObjectFactory::createObjectByName($className, array($requestInstance));
+
+                       // Set the app instance
+                       $nodeInstance->setApplicationInstance($this);
+               } catch (ClassNotFoundException $e) {
+                       // This means, the node mode is invalid!
+                       // @TODO Can we rewrite this to app_die() ?
+                       die('Node mode ' . $nodeMode . ' is invalid.' . "\n");
+               }
 
                // --------------------- Hub-id aquirement phase ---------------------
                // Aquire a hub-id. This step generates on first launch anew one and
index c589259df041eeef64220b2ccb6e4e9a8b6fa3bf..eb2da9ef985cd9c0953bd02b15716ba067ecab01 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0
- * @copyright  Copyright(c) 2007 - 2009 Roland Haeder, this is free software
+ * @copyright  Copyright(c) 2007 - 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  *
  * This program is free software: you can redistribute it and/or modify
index 2bf14db6bbd75f001a5f1580da736951cc0373b8..47325711b8df4e6581236cdec4609e48f2a8baf5 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0
- * @copyright  Copyright(c) 2007 - 2009 Roland Haeder, this is free software
+ * @copyright  Copyright(c) 2007 - 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  *
  * This program is free software: you can redistribute it and/or modify
index c8fcdcb275a09cc5b435f5d832bcdd0ccea58528..b30c9b5eeb394b776dbedbf7ecd4e7ddc0008807 100644 (file)
@@ -5,7 +5,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0
- * @copyright  Copyright(c) 2007 - 2009 Roland Haeder, this is free software
+ * @copyright  Copyright(c) 2007 - 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  *
  * This program is free software: you can redistribute it and/or modify
index 312d5aa40b62cf597b6fa0be22587d2f22251a8e..10980a4fcf6bbd368310ce8e6bab776e03643ab8 100644 (file)
@@ -15,7 +15,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0
- * @copyright  Copyright(c) 2007 - 2009 Roland Haeder, this is free software
+ * @copyright  Copyright(c) 2007 - 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  *
  * This program is free software: you can redistribute it and/or modify
index 75b45ee900000ee577962bfc52f46e325d807a6d..140f53a6ee0eb2108b787db079d7af1d85a7834c 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.ship-simu.org
  * @todo               We need to find a better name for this interface
index e2d153d88d1c9d8045a4ce49bcae31fec84f775f..b03ebb36b049468b5809cd08ef1124daf0501a90 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0
- * @copyright  Copyright(c) 2007 - 2009 Roland Haeder, this is free software
+ * @copyright  Copyright(c) 2007 - 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  *
  * This program is free software: you can redistribute it and/or modify
index 7dccdef85bb28b4b2db7a1ad9a4e63b816b45b2d..a9d279de7fd3ce9311f373de7999fde1781b71b8 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.ship-simu.org
  *
diff --git a/application/hub/main/nodes/boot/class_HubBootNode.php b/application/hub/main/nodes/boot/class_HubBootNode.php
new file mode 100644 (file)
index 0000000..e24aec2
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * A hub-node class for the 'Boot' mode
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 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 HubBootNode extends BaseHubNode implements NodeHelper {
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+       }
+
+       /**
+        * Creates an instance of this hub-node class
+        *
+        * @param       $requestInstance        An instance of a Requestable class
+        * @return      $nodeInstance           An instance of this hub-node class
+        */
+       public final static function createHubBootNode (Requestable $requestInstance) {
+               // Get a new instance
+               $nodeInstance = new HubBootNode();
+
+               // Set the request instance
+               $nodeInstance->setRequestInstance($requestInstance);
+
+               // Return the instance
+               return $nodeInstance;
+       }
+
+       /**
+        * Method to "bootstrap" the node. This step does also apply provided
+        * command-line arguments stored in the request instance. The regular node
+        * should communicate with the bootstrap-nodes at this point.
+        *
+        * @param       $requestInstance        An instance of a Requestable class
+        * @return      void
+        */
+       public function doBootstrapping (Requestable $requestInstance) {
+               // Call generic (parent) bootstrapping method
+               parent::doGenericBootstrapping();
+               $this->partialStub("Please implement this method.");
+       }
+}
+
+// [EOF]
+?>
index 90a9484502f69ae5150ed5b9f2c89a808d686f2e..17cb01b59ed22038e2c4834098e40ae6f0484ea9 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.ship-simu.org
  *
@@ -35,12 +35,16 @@ class Hub???Node extends BaseHubNode implements NodeHelper {
        /**
         * Creates an instance of this hub-node class
         *
-        * @return      $nodeInstance   An instance of this hub-node class
+        * @param       $requestInstance        An instance of a Requestable class
+        * @return      $nodeInstance           An instance of this hub-node class
         */
-       public final static function createHub???Node () {
+       public final static function createHub???Node (Requestable $requestInstance) {
                // Get a new instance
                $nodeInstance = new Hub???Node();
 
+               // Set the request instance
+               $nodeInstance->setRequestInstance($requestInstance);
+
                // Return the instance
                return $nodeInstance;
        }
@@ -54,19 +58,9 @@ class Hub???Node extends BaseHubNode implements NodeHelper {
         * @return      void
         */
        public function doBootstrapping (Requestable $requestInstance) {
-               $this->partialStub();
-       }
-
-       /**
-        * 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) {
-               $this->partialStub();
+               // Call generic (parent) bootstrapping method
+               parent::doGenericBootstrapping();
+               $this->partialStub("Please implement this method.");
        }
 }
 
index c000f64d752abf8c0fa59a8ecfd4808a4c0e539a..61028b3287abc1aa3ad388df42ec403ce669d56c 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.ship-simu.org
  *
@@ -25,7 +25,12 @@ class BaseHubNode extends BaseFrameworkSystem implements Updateable {
        /**
         * Node id
         */
-       private $nodeId = "";
+       private $nodeId = '';
+
+       /**
+        * IP/port number of bootstrapping node
+        */
+       private $bootIpPort = '';
 
        /**
         * Protected constructor
@@ -62,7 +67,106 @@ class BaseHubNode extends BaseFrameworkSystem implements Updateable {
        }
 
        /**
-        * Method to aquire a hub-id. On first run this generates a new one
+        * Checks wether the given IP address matches one of the bootstrapping nodes
+        *
+        * @param       $remoteAddr             IP address to checkout against our bootstrapping list
+        * @return      $isFound                Wether the IP is found
+        */
+       private function ifAddressMatchesBootstrappingNodes ($remoteAddr) {
+               // By default nothing is found
+               $isFound = false;
+
+               // Run through all configured IPs
+               foreach (explode(',', $this->getConfigInstance()->readConfig('hub_bootstrap_nodes')) as $ipPort) {
+                       // Does it match?
+                       if (substr($ipPort, 0, strlen($remoteAddr)) == $remoteAddr) {
+                               // Found it!
+                               $isFound = true;
+
+                               // Remember the port number
+                               $this->bootIpPort = $ipPort;
+
+                               // Output message
+                               $this->getDebugInstance()->output(__FUNCTION__.': IP matches remote address ' . $ipPort . '.');
+
+                               // Stop further searching
+                               break;
+                       } elseif (substr($ipPort, 0, strlen($this->getConfigInstance()->readConfig('node_listen_addr'))) == $this->getConfigInstance()->readConfig('node_listen_addr')) {
+                               // IP matches listen address. At this point we really don't care
+                               // if we can also listen on that address!
+                               $isFound = true;
+
+                               // Remember the port number
+                               $this->bootIpPort = $ipPort;
+
+                               // Output message
+                               $this->getDebugInstance()->output(__FUNCTION__.': IP matches listen address ' . $ipPort . '.');
+
+                               // Stop further searching
+                               break;
+                       }
+               } // END - foreach
+
+               // Return the result
+               return $isFound;
+       }
+
+       /**
+        * Outputs the console teaser. This should only be executed on startup or
+        * full restarts. This method generates some space around the teaser.
+        *
+        * @return      void
+        */
+       private function outputConsoleTeaser () {
+               // Get the app instance (for shortening our code)
+               $app = $this->getApplicationInstance();
+
+               // Output all lines
+               $this->getDebugInstance()->output(' ');
+               $this->getDebugInstance()->output($app->getAppName() . ' v' . $app->getAppVersion() . ' - ' . $this->getRequestInstance()->getRequestElement('mode') . ' mode active');
+               $this->getDebugInstance()->output('Copyright(c) 2007 - 2008 Roland Haeder, 2009 Hub Developer Team');
+               $this->getDebugInstance()->output(' ');
+               $this->getDebugInstance()->output('This program comes with ABSOLUTELY NO WARRANTY; for details see docs/COPYING.');
+               $this->getDebugInstance()->output('This is free software, and you are welcome to redistribute it under certain');
+               $this->getDebugInstance()->output('conditions; see docs/COPYING for details.');
+               $this->getDebugInstance()->output(' ');
+       }
+
+       /**
+        * Do generic things for bootup phase. This can be e.g. checking if the
+        * right node mode is selected for this hub's IP number.
+        *
+        * @todo        This method is maybe not yet finished.
+        * @return      void
+        */
+       protected function doGenericBootstrapping () {
+               // Now check if the IP address matches one of the bootstrap nodes
+               if ($this->ifAddressMatchesBootstrappingNodes($_SERVER['REMOTE_ADDR'])) {
+                       // Get our port
+                       $ourPort = $this->getConfigInstance()->readConfig('node_listen_port');
+
+                       // Is the port the same?
+                       if (substr($this->bootIpPort, -strlen($ourPort), strlen($ourPort)) == $ourPort) {
+                               // It is the same!
+                               $this->getDebugInstance()->output(__FUNCTION__.': IP/port matches bootstrapping node ' . $this->bootIpPort . '.');
+
+                               // Now, does the mode match (should be 'boot'!)
+                               if ($this->getRequestInstance()->getRequestElement('mode') == 'boot') {
+                                       // Output debug message
+                                       $this->getDebugInstance()->output(__FUNCTION__.': Our node is a valid boot-strapping node.');
+                               } else {
+                                       // Output warning
+                                       $this->getDebugInstance()->output(__FUNCTION__.': WARNING! Mismatching mode ' . $this->getRequestInstance()->getRequestElement('mode') . '!=boot detected.');
+                               }
+                       } // END - if
+               } // END - if
+
+               // Finally output our teaser. This should be the last line!
+               $this->outputConsoleTeaser();
+       }
+
+       /**
+        * Generic 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.
         *
@@ -116,7 +220,7 @@ class BaseHubNode extends BaseFrameworkSystem implements Updateable {
        }
 
        /**
-        * Adds registration elements to a given dataset instance
+        * Adds hub data elements to a given dataset instance
         *
         * @param       $criteriaInstance       An instance of a storeable criteria
         * @param       $requestInstance        An instance of a Requestable class
diff --git a/application/hub/main/nodes/list/class_BootListNode.php b/application/hub/main/nodes/list/class_BootListNode.php
new file mode 100644 (file)
index 0000000..8698756
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * A hub-node class for the 'List' mode
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 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 HubListNode extends BaseHubNode implements NodeHelper {
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+       }
+
+       /**
+        * Creates an instance of this hub-node class
+        *
+        * @param       $requestInstance        An instance of a Requestable class
+        * @return      $nodeInstance           An instance of this hub-node class
+        */
+       public final static function createHubListNode (Requestable $requestInstance) {
+               // Get a new instance
+               $nodeInstance = new HubListNode();
+
+               // Set the request instance
+               $nodeInstance->setRequestInstance($requestInstance);
+
+               // Return the instance
+               return $nodeInstance;
+       }
+
+       /**
+        * Method to "bootstrap" the node. This step does also apply provided
+        * command-line arguments stored in the request instance. The regular node
+        * should communicate with the bootstrap-nodes at this point.
+        *
+        * @param       $requestInstance        An instance of a Requestable class
+        * @return      void
+        */
+       public function doBootstrapping (Requestable $requestInstance) {
+               // Call generic (parent) bootstrapping method
+               parent::doGenericBootstrapping();
+               $this->partialStub("Please implement this method.");
+       }
+}
+
+// [EOF]
+?>
diff --git a/application/hub/main/nodes/master/class_HubMasterNode.php b/application/hub/main/nodes/master/class_HubMasterNode.php
new file mode 100644 (file)
index 0000000..e2e2a1f
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * A hub-node class for the 'Master' mode
+ *
+ * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @version            0.0.0
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 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 HubMasterNode extends BaseHubNode implements NodeHelper {
+       /**
+        * Protected constructor
+        *
+        * @return      void
+        */
+       protected function __construct () {
+               // Call parent constructor
+               parent::__construct(__CLASS__);
+       }
+
+       /**
+        * Creates an instance of this hub-node class
+        *
+        * @param       $requestInstance        An instance of a Requestable class
+        * @return      $nodeInstance           An instance of this hub-node class
+        */
+       public final static function createHubMasterNode (Requestable $requestInstance) {
+               // Get a new instance
+               $nodeInstance = new HubMasterNode();
+
+               // Set the request instance
+               $nodeInstance->setRequestInstance($requestInstance);
+
+               // Return the instance
+               return $nodeInstance;
+       }
+
+       /**
+        * Method to "bootstrap" the node. This step does also apply provided
+        * command-line arguments stored in the request instance. The regular node
+        * should communicate with the bootstrap-nodes at this point.
+        *
+        * @param       $requestInstance        An instance of a Requestable class
+        * @return      void
+        */
+       public function doBootstrapping (Requestable $requestInstance) {
+               // Call generic (parent) bootstrapping method
+               parent::doGenericBootstrapping();
+               $this->partialStub("Please implement this method.");
+       }
+}
+
+// [EOF]
+?>
index 39903a5a575a27654a76051087ccc313749ab7af..dd9105121f3cee9f3612da6593140f5742c2105c 100644 (file)
@@ -4,7 +4,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.ship-simu.org
  *
@@ -35,12 +35,16 @@ class HubRegularNode extends BaseHubNode implements NodeHelper {
        /**
         * Creates an instance of this hub-node class
         *
-        * @return      $nodeInstance   An instance of this hub-node class
+        * @param       $requestInstance        An instance of a Requestable class
+        * @return      $nodeInstance           An instance of this hub-node class
         */
-       public final static function createHubRegularNode () {
+       public final static function createHubRegularNode (Requestable $requestInstance) {
                // Get a new instance
                $nodeInstance = new HubRegularNode();
 
+               // Set the request instance
+               $nodeInstance->setRequestInstance($requestInstance);
+
                // Return the instance
                return $nodeInstance;
        }
@@ -54,7 +58,9 @@ class HubRegularNode extends BaseHubNode implements NodeHelper {
         * @return      void
         */
        public function doBootstrapping (Requestable $requestInstance) {
-               $this->partialStub();
+               // Call generic (parent) bootstrapping method
+               parent::doGenericBootstrapping();
+               $this->partialStub("Please implement this method.");
        }
 }