]> git.mxchange.org Git - hub.git/blob - application/hub/main/tags/package/class_PackageTags.php
In 'core' introduced XmlTemplateEngineFactory used:
[hub.git] / application / hub / main / tags / package / class_PackageTags.php
1 <?php
2 /**
3  * A Package tags class
4  *
5  * @author              Roland Haeder <webmaster@ship-simu.org>
6  * @version             0.0.0
7  * @copyright   Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Hub Developer Team
8  * @license             GNU GPL 3.0 or any newer version
9  * @link                http://www.ship-simu.org
10  *
11  * This program is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation, either version 3 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23  */
24 class PackageTags extends BaseTags implements Tagable {
25         // Exception codes
26         const EXCEPTION_INVALID_TAG = 0x160;
27
28         /**
29          * Last found protocol
30          */
31         private $lastProtocol = 'invalid';
32
33         /**
34          * Last found recipient type
35          */
36         private $lastRecipientType = 'invalid';
37
38         /**
39          * Protected constructor
40          *
41          * @return      void
42          */
43         protected function __construct () {
44                 // Call parent constructor
45                 parent::__construct(__CLASS__);
46
47                 // Init the object registry
48                 $this->initObjectRegistry();
49         }
50
51         /**
52          * Creates an instance of this class
53          *
54          * @return      $tagsInstance   An instance of a Tagable class
55          */
56         public static final function createPackageTags () {
57                 // Get new instance
58                 $tagsInstance = new PackageTags();
59
60                 // Return the prepared instance
61                 return $tagsInstance;
62         }
63
64         /**
65          * Loads the XML file (our "object registry") and saves an instance for faster re-use
66          *
67          * @return      void
68          */
69         private function initObjectRegistry () {
70                 // Output debug message
71                 $this->debugOutput('TAGS: Initializing object registry - START');
72
73                 // Get the application instance
74                 $applicationInstance = Registry::getRegistry()->getInstance('app');
75
76                 // Get a XML template instance
77                 $templateInstance = XmlTemplateEngineFactory::createXmlTemplateEngineInstance('node_object_registry_template_class');
78
79                 // Set it for later use
80                 $this->setTemplateInstance($templateInstance);
81
82                 // Read the XML file
83                 $this->getTemplateInstance()->loadObjectRegistryTemplate('object_registry');
84
85                 // Render the XML content
86                 $this->getTemplateInstance()->renderXmlContent();
87
88                 // Output debug message
89                 $this->debugOutput('TAGS: Initializing object registry - FINISHED');
90         }
91
92         /**
93          * Extracts the tags from given package data
94          *
95          * @param       $packageData    Raw package data
96          * @return      void
97          */
98         private function extractTagsFromPackageData (array $packageData) {
99                 /*
100                  * We take a look at the tags (in most cases only one is needed) so
101                  * first we need the content data splitted up into all it's parts.
102                  */
103                 $contentData = explode(NetworkPackage::PACKAGE_MASK_SEPERATOR, $packageData['content']);
104
105                 // Get the tags and store them locally
106                 $this->setTags(explode(NetworkPackage::PACKAGE_TAGS_SEPERATOR, $contentData[NetworkPackage::INDEX_TAGS]));
107         }
108
109         /**
110          * Verifies all tags by looking them up in an XML file. This method is
111          * the key method to make sure only known objects are being distributed and
112          * shared over the whole hub-network. So if the "tag" (let's better say
113          * object type) isn't found in that XML the package won't be distributed.
114          *
115          * @return      void
116          * @throws      InvalidTagException             If a provided tag from the package data is invalid
117          */
118         private function verifyAllTags () {
119                 // Get the registry
120                 $objectRegistryInstance = ObjectFactory::createObjectByConfiguredName('node_object_type_registry_class');
121
122                 // "Walk" over all tags
123                 foreach ($this->getTags() as $tag) {
124                         // Debug output
125                         $this->debugOutput('TAGS: Validating tag ' . $tag . ' ...');
126
127                         // Get an array from this tag
128                         $entry = $objectRegistryInstance->getArrayFromKey($tag);
129
130                         // If the array is empty, the entry is invalid!
131                         if (count($entry) == 0) {
132                                 // Invalid entry found
133                                 throw new InvalidTagException(array($this, $tag), self::EXCEPTION_INVALID_TAG);
134                         } // END - if
135
136                         // Now save the last discovered protocol/recipient type
137                         $this->lastProtocol      = $entry['object-protocol'];
138                         $this->lastRecipientType = $entry['object-recipient-type'];
139                 } // END - foreach
140         }
141
142         /**
143          * Chooses the right protocol from given package data
144          *
145          * @param       $packageData    Raw package data
146          * @return      $protocolName   Name of the choosen procotol
147          */
148         public function chooseProtocolFromPackageData (array $packageData) {
149                 // Extract the tags
150                 $this->extractTagsFromPackageData($packageData);
151
152                 // Now we need to verify every single tag
153                 $this->verifyAllTags();
154
155                 // Use the last found protocol for transmission
156                 $protocolName = $this->lastProtocol;
157
158                 // Return it
159                 return $protocolName;
160         }
161
162         /**
163          * Checks wether the given package data is accepted by the listener
164          *
165          * @param       $packageData            Raw package data
166          * @param       $listenerInstance       A Listenable instance
167          * @return      $accepts                        Wether it is accepted
168          */
169         public function ifPackageDataIsAcceptedByListener (array $packageData, Listenable $listenerInstance) {
170                 // Extract the tags
171                 $this->extractTagsFromPackageData($packageData);
172
173                 // Now we need to verify every single tag
174                 $this->verifyAllTags();
175
176                 // Now simply check it out
177                 $accepts = (($this->lastRecipientType == $listenerInstance->getListenerType()) && ($listenerInstance->getListenerType() != 'invalid'));
178
179                 // And return the result
180                 return $accepts;
181         }
182 }
183
184 // [EOF]
185 ?>