ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/server/uk/org/iscream/cms/server/componentmanager/ReferenceManager.java
Revision: 1.21
Committed: Sun Aug 1 10:40:50 2004 UTC (19 years, 9 months ago) by tdb
Branch: MAIN
CVS Tags: HEAD
Changes since 1.20: +4 -4 lines
Log Message:
Catch a lot of old URL's and update them. Also remove a couple of old files
that aren't used.

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org
4 * Copyright (C) 2000-2002 i-scream
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21 //---PACKAGE DECLARATION---
22 package uk.org.iscream.cms.server.componentmanager;
23
24 //---IMPORTS---
25 import org.omg.CORBA.ORB;
26 import org.omg.CosNaming.*;
27 import org.omg.PortableServer.*;
28 import uk.org.iscream.cms.server.core.*;
29 import uk.org.iscream.cms.util.*;
30
31 /**
32 * This class returns references for global system objects.
33 * This class is used to create and return references to objects
34 * that are required throughout the system. Most of which
35 * are CORBA based. It also manages the ORB for the component.
36 *
37 * It is a singleton object with a static method to obtain a
38 * reference to it. This removes the need for passing
39 * references to all the objects it contains throughout
40 * a component.
41 *
42 * @author $Author: ajm $
43 * @version $Id: ReferenceManager.java,v 1.20 2003/07/14 16:05:54 ajm Exp $
44 */
45 public class ReferenceManager {
46
47 //---FINAL ATTRIBUTES---
48
49 /**
50 * The current CVS revision of this class
51 */
52 public final String REVISION = "$Revision: 1.20 $";
53
54 //---STATIC METHODS---
55
56 /**
57 * This returns a reference to the single instance of the
58 * ReferenceManager.
59 *
60 * This creates the single instance of the ReferenceManager
61 * if it does not exist by calling the private constructor.
62 *
63 * @return a reference to the ReferenceManager
64 */
65 public synchronized static ReferenceManager getInstance() {
66 if (_instance == null) {
67 _instance = new ReferenceManager();
68 }
69 return _instance;
70 }
71
72 //---CONSTRUCTORS---
73
74 /**
75 * This is a private constructor
76 * This ensures that the system performs according to a Singleton design pattern
77 */
78 private ReferenceManager() {
79 _orb = ORB.init(new String[] {}, null);
80 }
81
82 //---PUBLIC METHODS---
83
84 /**
85 * Obtains a CORBA reference through the naming service
86 * for the named object.
87 * Calls the dieWithError() if any exceptions happen!
88 *
89 * @param name the name of the CORBA object to resolve
90 *
91 * @return a reference to the object
92 */
93 public org.omg.CORBA.Object getCORBARef(String name) {
94 org.omg.CORBA.Object objRef = null;
95 try {
96 objRef = getNS().resolve(getNS().to_name(name));
97 } catch (org.omg.CosNaming.NamingContextPackage.CannotProceed e) {
98 dieWithError("\nCRITICAL:Naming Service Cannot Proceed - when resolving reference to " + name + "!\n" +
99 " Please check with your CORBA naming service provider.");
100 } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
101 dieWithError("\nCRITICAL:Invalid Name - when resolving reference to " + name + "!\n" +
102 " Please check with your CORBA naming service provider.");
103 } catch (org.omg.CosNaming.NamingContextPackage.NotFound e) {
104 recoverWithError("\nCRITICAL:Not Found - when resolving reference to " + name + "!\n" +
105 " Please check that this component is running.");
106 }
107 return objRef;
108 }
109
110 /**
111 * Binds a given servant with the given name
112 * to the naming service.
113 * Calls the dieWithError() if any exceptions happen!
114 *
115 * @param objRef a reverence to the servant object
116 * @param name the name to bind to the naming service with
117 */
118 public void bindToOrb(org.omg.PortableServer.Servant objRef, String name) {
119 try {
120 getNS().bind(getNS().to_name(name), getRootPOA().servant_to_reference(objRef));
121 } catch (org.omg.PortableServer.POAPackage.WrongPolicy e) {
122 dieWithError("\nCRITICAL:Wrong POA Policy - when binding " + name + "!\n" +
123 " This indicates an error with your ORB.");
124 } catch (org.omg.PortableServer.POAPackage.ServantNotActive e) {
125 dieWithError("\nCRITICAL:ServantNotActive - when binding " + name + "!\n" +
126 " This indicates an error with your ORB.");
127 } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
128 dieWithError("\nCRITICAL:Invalid Name - when binding " + name + "!\n" +
129 " Please check with your CORBA naming service provider.");
130 } catch (org.omg.CosNaming.NamingContextPackage.CannotProceed e) {
131 dieWithError("\nCRITICAL:Naming Service Cannot Proceed - when binding " + name + "!\n" +
132 " Please check with your CORBA naming service provider.");
133 } catch (org.omg.CosNaming.NamingContextPackage.NotFound e) {
134 recoverWithError("\nCRITICAL:Naming Service Not Found - when binding " + name + "!\n" +
135 " Please check with your CORBA naming service provider.");
136 } catch (org.omg.CosNaming.NamingContextPackage.AlreadyBound e) {
137 dieWithError("\nCRITICAL:Already Bound - when binding " + name + "!\n" +
138 " Another component with this name is already running.");
139 }
140 }
141
142 /**
143 * Activates the POA
144 * Calls the dieWithError() if any exceptions happen!
145 */
146 public void activatePOA() {
147 try {
148 getRootPOA().the_POAManager().activate();
149 } catch (org.omg.PortableServer.POAManagerPackage.AdapterInactive e) {
150 dieWithError("\nCRITICAL:POA Set Inactive - when trying to activate POA!\n" +
151 " This indicates an error with your ORB.");
152 }
153 }
154
155 /**
156 * Overrides the {@link java.lang.Object#toString() Object.toString()}
157 * method to provide clean logging (every class should have this).
158 *
159 * This uses the uk.org.iscream.cms.util.NameFormat class
160 * to format the toString()
161 *
162 * @return the name of this class and its CVS revision
163 */
164 public String toString() {
165 return FormatName.getName(
166 _name,
167 getClass().getName(),
168 REVISION);
169 }
170
171 //---PRIVATE METHODS---
172
173 /**
174 * If there are any CORBA errors this method is called with the
175 * error message.
176 *
177 * The exception this throws is generic to CORBA communication
178 * problems, this is a Runtime exception and is typically only
179 * explicitly caught in the ComponentManager for the current VM
180 * The ComponentManager can then decide what course of action to
181 * take.
182 *
183 * Also, if it can, it will log the message with the logger.
184 *
185 * @param message the error message to die with
186 */
187 private void recoverWithError(String message) throws ComponentCORBAException {
188 if (_logger != null) {
189 _logger.write(toString(), Logger.WARNING, "component CORBA error - " + message);
190 }
191 throw new ComponentCORBAException(message);
192 }
193
194
195 /**
196 * If there are any CORBA errors this method is called with the
197 * error message.
198 *
199 * Currently this prints the error, on the local err stream. Will
200 * print to the logger if one is available.
201 *
202 * ANY CALLS TO THIS METHOD CAUSE
203 * THE SYSTEM TO EXIT WITH A NON
204 * ZERO CODE!
205 *
206 * @param message the error message to die with
207 */
208 private void dieWithError(String message) {
209 System.err.println(message);
210 if (_logger != null) {
211 _logger.write(toString(), Logger.FATAL, message);
212 }
213 System.exit(1);
214 }
215
216
217
218 //---ACCESSOR/MUTATOR METHODS---
219
220 /**
221 * Returns a reference to the ORB
222 *
223 * @return the reference this class holds
224 */
225 public ORB getORB() {
226 return _orb;
227 }
228
229 /**
230 * Returns a reference to the Root POA
231 * Calls the dieWithError() if any exceptions happen!
232 *
233 * @return the reference this class holds
234 */
235 public POA getRootPOA() {
236 if (_rootPOA == null) {
237 org.omg.CORBA.Object objRef = null;
238 try {
239 objRef = getORB().resolve_initial_references("RootPOA");
240 } catch (org.omg.CORBA.ORBPackage.InvalidName e) {
241 dieWithError("\nCRITICAL:Unable to resolve reference to the RootPOA!\n" +
242 " This indicates an error with your ORB.");
243 }
244 _rootPOA = POAHelper.narrow(objRef);
245 }
246 return _rootPOA;
247 }
248
249 /**
250 * Returns a reference to the Naming Service
251 * Calls the dieWithError() if any exceptions happen!
252 *
253 * @return the reference this class holds
254 */
255 public NamingContextExt getNS() {
256 if (_ns == null) {
257 org.omg.CORBA.Object objRef = null;
258 try {
259 objRef = getORB().resolve_initial_references("NameService");
260 } catch (org.omg.CORBA.ORBPackage.InvalidName e) {
261 dieWithError("\nCRITICAL:Unable to resolve reference to the Naming Service!\n" +
262 " Please check with your CORBA naming service provider.");
263 } catch (java.lang.NullPointerException e) {
264 dieWithError("\nCRITICAL:Unable to resolve reference to the Naming Service!\n" +
265 " Please check with your CORBA naming service provider.");
266 }
267 _ns = NamingContextExtHelper.narrow(objRef);
268 }
269 // check we managed to talk to the naming service
270 if (_ns == null) {
271 dieWithError("\nCRITICAL:Unable to resolve reference to the Naming Service!\n" +
272 " Please check with your CORBA naming service provider.");
273 }
274 return _ns;
275 }
276
277 /**
278 * Returns a reference to the configuration manager
279 * Calls the dieWithError() if any exceptions happen!
280 *
281 * @return the reference this class holds
282 */
283 public ConfigurationManager getCM() {
284 if (_cm == null) {
285 _cm = ConfigurationManagerHelper.narrow(getCORBARef("iscream.ConfigurationManager"));
286 }
287 // check we managed to talk to the configuration manager
288 if (_cm == null) {
289 dieWithError("\nCRITICAL:Unable to resolve reference to the Configuration Manager!\n" +
290 " Please check with your CORBA naming service provider.");
291 }
292 return _cm;
293 }
294
295 /**
296 * Returns a reference to the logger
297 * This will throw a Error if there is an error
298 *
299 * @return the reference this class holds
300 */
301 public Logger getLogger() {
302 if (_logger == null) {
303 _logger = LoggerHelper.narrow(getCORBARef("iscream.Logger"));
304 }
305 return _logger;
306 }
307
308 //---ATTRIBUTES---
309
310 /**
311 * The ORB
312 */
313 private ORB _orb;
314
315 /**
316 * The Naming Service
317 */
318 private NamingContextExt _ns;
319
320 /**
321 * The Root POA
322 */
323 private POA _rootPOA;
324
325 /**
326 * The configuration manager
327 */
328 private ConfigurationManager _cm;
329
330 /**
331 * The logger
332 */
333 private Logger _logger;
334
335 /**
336 * This is the friendly identifier of the
337 * component this class is running in.
338 * eg, a Filter may be called "filter1",
339 * If this class does not have an owning
340 * component, a name from the configuration
341 * can be placed here. This name could also
342 * be changed to null for utility classes.
343 */
344 private String _name = null;
345
346 //---STATIC ATTRIBUTES---
347
348 /**
349 * A reference to the single instance of this class
350 */
351 private static ReferenceManager _instance = null;
352 }