]> git.mxchange.org Git - hub.git/blobdiff - application/hub/main/nodes/class_BaseHubNode.php
Network package writer added, shutdown refactured, fixes:
[hub.git] / application / hub / main / nodes / class_BaseHubNode.php
index 422fe6f1782341409a52a2edcb66657eb4f157e8..f9d1cdf9c6425fe44b6d21b902650faf98457242 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 Hub Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009, 2010 Hub Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.ship-simu.org
  *
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 class BaseHubNode extends BaseHubSystem implements Updateable {
-       /**
-        * Node id
-        */
-       private $nodeId = '';
-
-       /**
-        * Session id
-        */
-       private $sessionId = '';
+       // Exception constants
+       const EXCEPTION_HUB_ALREADY_ANNOUNCED = 0xe00;
 
        /**
         * IP/port number of bootstrapping node
@@ -48,9 +41,15 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
        private $listenerPoolInstance = null;
 
        /**
-        * Wether the hub is active (true/false)
+        * Wether this node is anncounced (KEEP ON false!)
+        * @deprecated
+        */
+       private $hubIsAnnounced = false;
+
+       /**
+        * State instance
         */
-       private $hubIsActive = false;
+       private $stateInstance = null;
 
        /**
         * Protected constructor
@@ -61,6 +60,20 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
        protected function __construct ($className) {
                // Call parent constructor
                parent::__construct($className);
+
+               // Init state which sets the state to 'init'
+               $this->initState();
+       }
+
+       /**
+        * Initializes the node's state which sets it to 'init'
+        *
+        * @return      void
+        */
+       private function initState() {
+               // Get the state factory and create the initial state, we don't need
+               // the state instance here
+               StateFactory::createStateInstanceByName('init', $this);
        }
 
        /**
@@ -70,16 +83,18 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
         * @return      void
         */
        private final function setNodeId ($nodeId) {
-               $this->nodeId = (string) $nodeId;
+               // Set it config now
+               $this->getConfigInstance()->setConfigEntry('node_id', (string) $nodeId);
        }
 
        /**
         * Getter for node id
         *
-        * @return      $nodeId         Our new node id
+        * @return      $nodeId         Current node id
         */
        private final function getNodeId () {
-               return $this->nodeId;
+               // Get it from config
+               return $this->getConfigInstance()->getConfigEntry('node_id');
        }
 
        /**
@@ -101,6 +116,25 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                return $this->listenerPoolInstance;
        }
 
+       /**
+        * Setter for state instance
+        *
+        * @param       $stateInstance  Node's current state instance
+        * @return      void
+        */
+       public final function setStateInstance (Stateable $stateInstance) {
+               $this->stateInstance = $stateInstance;
+       }
+
+       /**
+        * Getter for state instance
+        *
+        * @return      $stateInstance  Node's current state instance
+        */
+       public final function getStateInstance () {
+               return $this->stateInstance;
+       }
+
        /**
         * Setter for session id
         *
@@ -108,16 +142,16 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
         * @return      void
         */
        private final function setSessionId ($sessionId) {
-               $this->sessionId = (string) $sessionId;
+               $this->getConfigInstance()->setConfigEntry('session_id', (string) $sessionId);
        }
 
        /**
         * Getter for session id
         *
-        * @return      $sessionId              Our new session id
+        * @return      $sessionId              Current session id
         */
        public final function getSessionId () {
-               return $this->sessionId;
+               return $this->getConfigInstance()->getConfigEntry('session_id');
        }
 
        /**
@@ -148,6 +182,26 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                return $this->bootIpPort;
        }
 
+       /**
+        * "Getter" for a printable state name
+        */
+       public final function getPrintableState () {
+               // Default is 'null'
+               $stateName = 'null';
+
+               // Get the state instance
+               $stateInstance = $this->getStateInstance();
+
+               // Is it an instance of Stateable?
+               if ($stateInstance instanceof Stateable) {
+                       // Then use that state name
+                       $stateName = $stateInstance->getStateName();
+               } // END - if
+
+               // Return result
+               return $stateName;
+       }
+
        /**
         * Checks wether the given IP address matches one of the bootstrapping nodes
         *
@@ -209,7 +263,7 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                // Output all lines
                $this->debugOutput(' ');
                $this->debugOutput($app->getAppName() . ' v' . $app->getAppVersion() . ' - ' . $this->getRequestInstance()->getRequestElement('mode') . ' mode active');
-               $this->debugOutput('Copyright (c) 2007 - 2008 Roland Haeder, 2009 Hub Developer Team');
+               $this->debugOutput('Copyright (c) 2007 - 2008 Roland Haeder, 2009, 2010 Hub Developer Team');
                $this->debugOutput(' ');
                $this->debugOutput('This program comes with ABSOLUTELY NO WARRANTY; for details see docs/COPYING.');
                $this->debugOutput('This is free software, and you are welcome to redistribute it under certain');
@@ -222,9 +276,11 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
         * 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        A Requestable class
+        * @param       $responseInstance       A Responseable class
         * @return      void
         */
-       public function bootstrapAcquireHubId () {
+       public function bootstrapAcquireHubId (Requestable $requestInstance, Responseable $responseInstance) {
                // Get a wrapper instance
                $wrapperInstance = ObjectFactory::createObjectByConfiguredName('node_info_db_wrapper_class');
 
@@ -296,6 +352,9 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
 
                // Output message
                $this->debugOutput('BOOTSTRAP: Created new session-id: ' . $this->getSessionId() . '');
+
+               // Change the state because the node has auired a hub id
+               $this->getStateInstance()->nodeGeneratedSessionId();
        }
 
        /**
@@ -316,7 +375,7 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                // Debug message
                $this->debugOutput('BOOTSTRAP: Initialize queues: FINISHED');
        }
-       
+
        /**
         * Adds hub data elements to a given dataset instance
         *
@@ -376,21 +435,44 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
        }
 
        /**
-        * Getter for $hubIsActive attribute
+        * Announces this hub to the upper (bootstrap or list) hubs. After this is
+        * successfully done the given task is unregistered from the handler.
         *
-        * @return      $hubIsActive    Wether the hub is activer
+        * @param       $taskInstance   The task instance running this announcement
+        * @return      void
+        * @throws      HubAlreadyAnnouncedException    If this hub is already announced
+        * @todo        Change the first if() block to check for a specific state
         */
-       public final function isHubActive () {
-               return $this->hubIsActive;
-       }
+       public function announceSelfToUpperNodes (Taskable $taskInstance) {
+               // Is this hub node announced?
+               if ($this->hubIsAnnounced === true) {
+                       // Already announced!
+                       throw new HubAlreadyAnnouncedException($this, self::EXCEPTION_HUB_ALREADY_ANNOUNCED);
+               } // END - if
 
-       /**
-        * Setter for $hubIsActive attribute
-        *
-        * @param       $hubIsActive    Wether the hub is activer
-        */
-       public final function enableHubIsActive ($hubIsActive = true) {
-               $this->hubIsActive = $hubIsActive;
+               // Debug output
+               $this->debugOutput('HUB: Self-announcement: START (taskInstance=' . $taskInstance->__toString(). ')');
+
+               // Get a helper instance
+               $helperInstance = ObjectFactory::createObjectByConfiguredName('hub_announcement_helper_class', array($this));
+
+               // Load the announcement descriptor
+               $helperInstance->loadAnnouncementDescriptor();
+
+               // Set some dummy configuration entries, e.g. node_status
+               $this->getConfigInstance()->setConfigEntry('node_status', $this->getStateInstance()->getStateName());
+
+               // Compile all variables
+               $helperInstance->getTemplateInstance()->compileConfigInVariables();
+
+               // "Publish" the descriptor by sending it to the bootstrap/list nodes
+               $helperInstance->publishAnnouncementDescriptor();
+
+               // Change the state, this should be the last line except debug output
+               $this->getStateInstance()->nodeAnnouncedToUpperHubs();
+
+               // Debug output
+               $this->debugOutput('HUB: Self-announcement: FINISHED');
        }
 
        /**
@@ -403,8 +485,8 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
         */
        public function activateHub (Requestable $requestInstance, Responseable $responseInstance) {
                // Checks wether a listener is still active and shuts it down if one
-               // is still listening
-               if (($this->determineIfListenerIsActive()) && ($this->isHubActive())) {
+               // is still listening.
+               if (($this->determineIfListenerIsActive()) && ($this->determineIfHubIsActive())) {
                        // Shutdown them down before they can hurt anything
                        $this->shutdownListenerPool();
                } // END - if
@@ -417,7 +499,7 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
 
                // ----------------------- Last step from here ------------------------
                // Activate the hub. This is ALWAYS the last step in this method
-               $this->enableHubIsActive();
+               $this->getStateInstance()->nodeIsActivated();
                // ---------------------- Last step until here ------------------------
        }
 
@@ -518,6 +600,20 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                // Debug output
                $this->debugOutput('HUB: Restore node list: FINISHED.');
        }
+
+       /**
+        * Determines wether the hub is active by checking its current state
+        *
+        * @return      $isActive       Wether the hub is active
+        */
+       public function determineIfHubIsActive () {
+               // Check the state
+               // @TODO Add more states e.g. 'firewalled', 'senior'
+               $isActive = ($this->getStateInstance() instanceof NodeActiveState);
+
+               // Return value
+               return $isActive;
+       }
 }
 
 // [EOF]