1 /*
2 * Copyright (C) The Apache Software Foundation. All rights reserved.
3 *
4 * This software is published under the terms of the Apache Software License
5 * version 1.1, a copy of which has been included with this distribution in
6 * the LICENSE file.
7 */
8 package org.apache.avalon.excalibur.naming;
9
10 import java.io.Serializable;
11 import java.io.IOException;
12 import java.util.Hashtable;
13 import java.util.Iterator;
14 import java.rmi.MarshalledObject;
15 import javax.naming.*;
16 import javax.naming.Context;
17
18 /***
19 * Context that hooks up to a remote source.
20 *
21 * @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
22 * @version $Revision: 1.2 $
23 */
24 public class RemoteContext
25 extends AbstractContext
26 implements Serializable
27 {
28 public final static String NAMESPACE_NAME = "org.apache.avalon.excalibur.naming.Namespace/NAME";
29 public final static String NAMESPACE = "org.apache.avalon.excalibur.naming.Namespace";
30 public final static String NAMING_PROVIDER = "org.apache.avalon.excalibur.naming.NamingProvider";
31
32 protected transient NamingProvider m_provider;
33 protected transient NameParser m_nameParser;
34 protected transient Namespace m_namespace;
35
36 protected Name m_baseName;
37
38 //for deserialisation
39 public RemoteContext()
40 {
41 }
42
43 public RemoteContext( final Hashtable environment, final Name baseName )
44 throws NamingException
45 {
46 super( environment );
47 m_baseName = baseName;
48 }
49
50 /***
51 * Helper method to bind
52 */
53 protected void bind( final Name name, Object object, final boolean rebind )
54 throws NamingException
55 {
56 if( isSelf( name ) )
57 {
58 throw new InvalidNameException( "Failed to bind self" );
59 }
60
61 String className = null;
62
63 object = getNamespace().getStateToBind( object, name, this, m_environment );
64
65 if( object instanceof Reference )
66 {
67 className = ((Reference)object).getClassName();
68 }
69 else if( object instanceof Referenceable )
70 {
71 object = ((Referenceable)object).getReference();
72 className = ((Reference)object).getClassName();
73 }
74 else
75 {
76 className = object.getClass().getName();
77
78 try { object = new MarshalledObject( object ); }
79 catch( final IOException ioe )
80 {
81 throw new NamingException( "Only Reference, Referenceables and " +
82 "Serializable objects can be bound " +
83 "to context" );
84 }
85 }
86
87 try
88 {
89 if( rebind )
90 {
91 getProvider().rebind( getAbsoluteName( name ), className, object );
92 }
93 else
94 {
95 getProvider().bind( getAbsoluteName( name ), className, object );
96 }
97 }
98 catch( final Exception e )
99 {
100 throw handleException( e );
101 }
102 }
103
104 /***
105 * Release resources associated with context.
106 */
107 public void close()
108 {
109 m_namespace = null;
110 m_environment = null;
111 m_provider = null;
112 }
113
114 /***
115 * Create a Subcontext.
116 *
117 * @param name the name of subcontext
118 * @return the created context
119 * @exception NamingException if an error occurs (ie context exists, badly formated name etc)
120 */
121 public Context createSubcontext( final Name name )
122 throws NamingException
123 {
124 if( isSelf( name ) )
125 {
126 throw new InvalidNameException( "Failed to create null subcontext" );
127 }
128
129 Context result = null;
130 try { result = getProvider().createSubcontext( getAbsoluteName( name ) ); }
131 catch( final Exception e )
132 {
133 throw handleException( e );
134 }
135
136 fillInContext( result );
137
138 return result;
139 }
140
141 public void destroySubcontext( final Name name )
142 throws NamingException
143 {
144 if( isSelf( name ) )
145 {
146 throw new InvalidNameException( "Failed to destroy self" );
147 }
148
149 try { getProvider().destroySubcontext( getAbsoluteName( name ) ); }
150 catch( final Exception e )
151 {
152 throw handleException( e );
153 }
154 }
155
156 public String getNameInNamespace()
157 throws NamingException
158 {
159 return getAbsoluteName( getNameParser().parse( "" ) ).toString();
160 }
161
162 /***
163 * Enumerates the names bound in the named context.
164 *
165 * @param name the name of the context
166 * @return the enumeration
167 * @exception NamingException if an error occurs
168 */
169 public NamingEnumeration list( final Name name )
170 throws NamingException
171 {
172 try
173 {
174 final NameClassPair[] result = getProvider().list( getAbsoluteName( name ) );
175 return new ArrayNamingEnumeration( this, m_namespace, result );
176 }
177 catch( final Exception e )
178 {
179 throw handleException( e );
180 }
181 }
182
183 /***
184 * Enumerates the names bound in the named context, along with the objects bound to them.
185 *
186 * @param name the name of the context
187 * @return the enumeration
188 * @exception NamingException if an error occurs
189 */
190 public NamingEnumeration listBindings( final Name name )
191 throws NamingException
192 {
193 try
194 {
195 final Binding[] result = getProvider().listBindings( getAbsoluteName( name ) );
196
197 for( int i = 0; i < result.length; i++ )
198 {
199 final Object object = result[ i ].getObject();
200 if( object instanceof Context )
201 {
202 fillInContext( (Context)object );
203 }
204 }
205
206 return new ArrayNamingEnumeration( this, m_namespace, result );
207 }
208 catch( final Exception e )
209 {
210 throw handleException( e );
211 }
212 }
213
214 /***
215 * Get the object named.
216 *
217 * @param name the name
218 * @return the object
219 * @exception NamingException if an error occurs (ie object name is inavlid or unbound)
220 */
221 public Object lookup( final Name name )
222 throws NamingException
223 {
224 if( isSelf( name ) )
225 {
226 return new RemoteContext( m_environment, m_baseName );
227 }
228
229 //TODO: actually do a real-lookup
230 Object object = null;
231 try
232 {
233 object = getProvider().lookup( getAbsoluteName( name ) );
234
235 if( object instanceof MarshalledObject )
236 {
237 object = ((MarshalledObject)object).get();
238 }
239
240 object = getNamespace().getObjectInstance( object, name, this, m_environment );
241
242 if( object instanceof Context )
243 {
244 fillInContext( (Context)object );
245 }
246 }
247 catch( final Exception e )
248 {
249 throw handleException( e );
250 }
251
252 return object;
253 }
254
255 /***
256 * Unbind a object from a name.
257 *
258 * @param name the name
259 * @exception NamingException if an error occurs
260 */
261 public void unbind( final Name name )
262 throws NamingException
263 {
264 if( isSelf( name ) )
265 {
266 throw new InvalidNameException( "Failed to unbind self" );
267 }
268
269 try { getProvider().unbind( getAbsoluteName( name ) ); }
270 catch( final Exception e )
271 {
272 throw handleException( e );
273 }
274 }
275
276 protected void fillInContext( final Context object )
277 throws NamingException
278 {
279 final Iterator keys = m_environment.keySet().iterator();
280
281 while( keys.hasNext() )
282 {
283 final String key = (String)keys.next();
284 final Object value = m_environment.get( key );
285 object.addToEnvironment( key , value );
286 }
287 }
288
289 protected Namespace getNamespace()
290 throws NamingException
291 {
292 if( null == m_namespace )
293 {
294 final Object object = m_environment.get( RemoteContext.NAMESPACE );
295
296 if( !(object instanceof Namespace) || null == object )
297 {
298 throw new ConfigurationException( "Context does not contain Namespace" );
299 }
300 else
301 {
302 m_namespace = (Namespace)object;
303 }
304 }
305
306 return m_namespace;
307 }
308
309 protected NamingProvider getProvider()
310 throws NamingException
311 {
312 if( null == m_provider )
313 {
314 final Object object = m_environment.get( RemoteContext.NAMING_PROVIDER );
315
316 if( !(object instanceof NamingProvider) || null == object )
317 {
318 throw new ConfigurationException( "Context does not contain provider" );
319 }
320 else
321 {
322 m_provider = (NamingProvider)object;
323 }
324 }
325
326 return m_provider;
327 }
328
329 protected NameParser getNameParser()
330 throws NamingException
331 {
332 if( null == m_nameParser )
333 {
334 //Make sure provider is valid and returns nameparser
335 try { m_nameParser = getProvider().getNameParser(); }
336 catch( final Exception e )
337 {
338 throw handleException( e );
339 }
340
341 }
342 return m_nameParser;
343 }
344
345 protected Name getAbsoluteName( final Name name )
346 throws NamingException
347 {
348 return composeName( name, m_baseName );
349 }
350
351 protected NamingException handleException( final Exception e )
352 {
353 if( e instanceof NamingException )
354 {
355 return (NamingException)e;
356 }
357 else
358 {
359 return new CommunicationException( e.toString() );
360 }
361 }
362 }
This page was automatically generated by Maven