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.20
Committed: Mon Jul 14 16:05:54 2003 UTC (20 years, 10 months ago) by ajm
Branch: MAIN
Changes since 1.19: +5 -2 lines
Log Message:
Added a NullPointerException check Niklas Saers, it now errors with a vaguely sensible error of:

"Unable to resolve reference to the Naming Service!"

File Contents

# User Rev Content
1 tdb 1.17 /*
2     * i-scream central monitoring system
3 tdb 1.18 * http://www.i-scream.org.uk
4 tdb 1.17 * 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 ajm 1.1 //---PACKAGE DECLARATION---
22 tdb 1.16 package uk.org.iscream.cms.server.componentmanager;
23 ajm 1.1
24     //---IMPORTS---
25     import org.omg.CORBA.ORB;
26     import org.omg.CosNaming.*;
27     import org.omg.PortableServer.*;
28 tdb 1.16 import uk.org.iscream.cms.server.core.*;
29 tdb 1.19 import uk.org.iscream.cms.util.*;
30 ajm 1.1
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 ajm 1.2 * are CORBA based. It also manages the ORB for the component.
36 ajm 1.1 *
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 tdb 1.17 * @author $Author: tdb $
43 ajm 1.20 * @version $Id: ReferenceManager.java,v 1.19 2003/02/05 16:43:46 tdb Exp $
44 ajm 1.1 */
45     public class ReferenceManager {
46    
47     //---FINAL ATTRIBUTES---
48    
49     /**
50     * The current CVS revision of this class
51     */
52 ajm 1.20 public final String REVISION = "$Revision: 1.19 $";
53 ajm 1.1
54     //---STATIC METHODS---
55    
56     /**
57     * This returns a reference to the single instance of the
58     * ReferenceManager.
59     *
60 ajm 1.6 * This creates the single instance of the ReferenceManager
61     * if it does not exist by calling the private constructor.
62     *
63 ajm 1.1 * @return a reference to the ReferenceManager
64     */
65 tdb 1.15 public synchronized static ReferenceManager getInstance() {
66 ajm 1.1 if (_instance == null) {
67 ajm 1.6 _instance = new ReferenceManager();
68 ajm 1.1 }
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 ajm 1.6 */
78     private ReferenceManager() {
79     _orb = ORB.init(new String[] {}, null);
80     }
81 ajm 1.1
82     //---PUBLIC METHODS---
83    
84     /**
85 ajm 1.2 * Obtains a CORBA reference through the naming service
86     * for the named object.
87 ajm 1.7 * Calls the dieWithError() if any exceptions happen!
88 ajm 1.2 *
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 ajm 1.6 dieWithError("\nCRITICAL:Naming Service Cannot Proceed - when resolving reference to " + name + "!\n" +
99 ajm 1.5 " Please check with your CORBA naming service provider.");
100 ajm 1.2 } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
101 ajm 1.6 dieWithError("\nCRITICAL:Invalid Name - when resolving reference to " + name + "!\n" +
102 ajm 1.5 " Please check with your CORBA naming service provider.");
103 ajm 1.2 } catch (org.omg.CosNaming.NamingContextPackage.NotFound e) {
104 ajm 1.12 recoverWithError("\nCRITICAL:Not Found - when resolving reference to " + name + "!\n" +
105 ajm 1.5 " Please check that this component is running.");
106 ajm 1.2 }
107     return objRef;
108     }
109    
110     /**
111     * Binds a given servant with the given name
112     * to the naming service.
113 ajm 1.7 * Calls the dieWithError() if any exceptions happen!
114 ajm 1.2 *
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 ajm 1.6 dieWithError("\nCRITICAL:Wrong POA Policy - when binding " + name + "!\n" +
123 ajm 1.5 " This indicates an error with your ORB.");
124 ajm 1.2 } catch (org.omg.PortableServer.POAPackage.ServantNotActive e) {
125 ajm 1.6 dieWithError("\nCRITICAL:ServantNotActive - when binding " + name + "!\n" +
126 ajm 1.5 " This indicates an error with your ORB.");
127 ajm 1.2 } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
128 ajm 1.6 dieWithError("\nCRITICAL:Invalid Name - when binding " + name + "!\n" +
129 ajm 1.5 " Please check with your CORBA naming service provider.");
130 ajm 1.2 } catch (org.omg.CosNaming.NamingContextPackage.CannotProceed e) {
131 ajm 1.6 dieWithError("\nCRITICAL:Naming Service Cannot Proceed - when binding " + name + "!\n" +
132 ajm 1.5 " Please check with your CORBA naming service provider.");
133 ajm 1.2 } catch (org.omg.CosNaming.NamingContextPackage.NotFound e) {
134 ajm 1.12 recoverWithError("\nCRITICAL:Naming Service Not Found - when binding " + name + "!\n" +
135 ajm 1.5 " Please check with your CORBA naming service provider.");
136 ajm 1.2 } catch (org.omg.CosNaming.NamingContextPackage.AlreadyBound e) {
137 ajm 1.6 dieWithError("\nCRITICAL:Already Bound - when binding " + name + "!\n" +
138 ajm 1.5 " Another component with this name is already running.");
139 ajm 1.2 }
140     }
141    
142     /**
143     * Activates the POA
144 ajm 1.7 * Calls the dieWithError() if any exceptions happen!
145 ajm 1.2 */
146     public void activatePOA() {
147     try {
148     getRootPOA().the_POAManager().activate();
149     } catch (org.omg.PortableServer.POAManagerPackage.AdapterInactive e) {
150 ajm 1.6 dieWithError("\nCRITICAL:POA Set Inactive - when trying to activate POA!\n" +
151 ajm 1.5 " This indicates an error with your ORB.");
152 ajm 1.2 }
153     }
154    
155     /**
156 ajm 1.1 * Overrides the {@link java.lang.Object#toString() Object.toString()}
157     * method to provide clean logging (every class should have this).
158     *
159 tdb 1.19 * This uses the uk.org.iscream.cms.util.NameFormat class
160 ajm 1.6 * to format the toString()
161     *
162 ajm 1.1 * @return the name of this class and its CVS revision
163     */
164     public String toString() {
165 ajm 1.6 return FormatName.getName(
166 ajm 1.7 _name,
167     getClass().getName(),
168 ajm 1.6 REVISION);
169 ajm 1.1 }
170    
171     //---PRIVATE METHODS---
172    
173 ajm 1.6 /**
174     * If there are any CORBA errors this method is called with the
175     * error message.
176     *
177 ajm 1.11 * 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 ajm 1.6 *
183 ajm 1.11 * Also, if it can, it will log the message with the logger.
184 ajm 1.6 *
185     * @param message the error message to die with
186     */
187 ajm 1.12 private void recoverWithError(String message) throws ComponentCORBAException {
188 ajm 1.6 if (_logger != null) {
189 ajm 1.11 _logger.write(toString(), Logger.WARNING, "component CORBA error - " + message);
190 ajm 1.6 }
191 ajm 1.11 throw new ComponentCORBAException(message);
192 ajm 1.6 }
193 ajm 1.12
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 ajm 1.6
218 ajm 1.1 //---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 ajm 1.7 * Calls the dieWithError() if any exceptions happen!
232 ajm 1.1 *
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 ajm 1.6 dieWithError("\nCRITICAL:Unable to resolve reference to the RootPOA!\n" +
242 ajm 1.5 " This indicates an error with your ORB.");
243 ajm 1.1 }
244     _rootPOA = POAHelper.narrow(objRef);
245     }
246     return _rootPOA;
247     }
248    
249     /**
250     * Returns a reference to the Naming Service
251 ajm 1.7 * Calls the dieWithError() if any exceptions happen!
252 ajm 1.1 *
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 ajm 1.6 dieWithError("\nCRITICAL:Unable to resolve reference to the Naming Service!\n" +
262 ajm 1.5 " Please check with your CORBA naming service provider.");
263 ajm 1.20 } 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 ajm 1.1 }
267     _ns = NamingContextExtHelper.narrow(objRef);
268     }
269 ajm 1.5 // check we managed to talk to the naming service
270     if (_ns == null) {
271 ajm 1.6 dieWithError("\nCRITICAL:Unable to resolve reference to the Naming Service!\n" +
272 ajm 1.5 " Please check with your CORBA naming service provider.");
273     }
274 ajm 1.1 return _ns;
275     }
276    
277     /**
278     * Returns a reference to the configuration manager
279 ajm 1.7 * Calls the dieWithError() if any exceptions happen!
280 ajm 1.1 *
281     * @return the reference this class holds
282     */
283     public ConfigurationManager getCM() {
284     if (_cm == null) {
285 ajm 1.2 _cm = ConfigurationManagerHelper.narrow(getCORBARef("iscream.ConfigurationManager"));
286 ajm 1.1 }
287 ajm 1.5 // check we managed to talk to the configuration manager
288     if (_cm == null) {
289 ajm 1.6 dieWithError("\nCRITICAL:Unable to resolve reference to the Configuration Manager!\n" +
290 ajm 1.5 " Please check with your CORBA naming service provider.");
291     }
292 ajm 1.1 return _cm;
293     }
294    
295     /**
296     * Returns a reference to the logger
297 ajm 1.5 * This will throw a Error if there is an error
298 ajm 1.1 *
299     * @return the reference this class holds
300     */
301     public Logger getLogger() {
302     if (_logger == null) {
303 ajm 1.2 _logger = LoggerHelper.narrow(getCORBARef("iscream.Logger"));
304 ajm 1.1 }
305     return _logger;
306 ajm 1.4 }
307 ajm 1.1
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 ajm 1.7 * 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 ajm 1.1 */
344 ajm 1.7 private String _name = null;
345 ajm 1.1
346     //---STATIC ATTRIBUTES---
347    
348     /**
349     * A reference to the single instance of this class
350     */
351 ajm 1.14 private static ReferenceManager _instance = null;
352 ajm 1.1 }