KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > archie > jndi > JndiContext


1 package org.sapia.archie.jndi;
2
3 import java.util.Hashtable JavaDoc;
4 import java.util.Iterator JavaDoc;
5
6 import javax.naming.Context JavaDoc;
7 import javax.naming.Name JavaDoc;
8 import javax.naming.NameAlreadyBoundException JavaDoc;
9 import javax.naming.NameNotFoundException JavaDoc;
10 import javax.naming.NameParser JavaDoc;
11 import javax.naming.NamingEnumeration JavaDoc;
12 import javax.naming.NamingException JavaDoc;
13
14 import org.sapia.archie.Archie;
15 import org.sapia.archie.DuplicateException;
16 import org.sapia.archie.Node;
17 import org.sapia.archie.NotFoundException;
18 import org.sapia.archie.ProcessingException;
19
20 /**
21  * @author Yanick Duchesne
22  * <dl>
23  * <dt><b>Copyright:</b><dd>Copyright &#169; 2002-2003 <a HREF="http://www.sapia-oss.org">Sapia Open Source Software</a>. All Rights Reserved.</dd></dt>
24  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
25  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
26  * </dl>
27  */

28 public class JndiContext implements Context JavaDoc{
29   
30   private Archie _archie;
31   private Hashtable JavaDoc _env = new Hashtable JavaDoc();
32   private NameParser JavaDoc _parser;
33   
34   public JndiContext(Node node){
35     _archie = new Archie(node);
36     _parser = new JndiNameParser(node.getNameParser());
37   }
38   
39
40   /**
41    * @see javax.naming.Context#addToEnvironment(java.lang.String, java.lang.Object)
42    */

43   public Object JavaDoc addToEnvironment(String JavaDoc propName, Object JavaDoc propVal)
44     throws NamingException JavaDoc {
45     return _env.put(propName, propVal);
46   }
47
48   /**
49    * @see javax.naming.Context#bind(javax.naming.Name, java.lang.Object)
50    */

51   public synchronized void bind(Name JavaDoc name, Object JavaDoc obj) throws NamingException JavaDoc {
52     try{
53       _archie.bind(getNameFrom(name), obj);
54     }catch(ProcessingException e){
55       throw getNamingException("Could not bind under '" + name + "'", e);
56     }
57   }
58
59   /**
60    * @see javax.naming.Context#bind(java.lang.String, java.lang.Object)
61    */

62   public synchronized void bind(String JavaDoc name, Object JavaDoc obj) throws NamingException JavaDoc {
63     try{
64       _archie.bind(_archie.getNameParser().parse(name), obj);
65     }catch(ProcessingException e){
66       throw getNamingException("Could not bind under '" + name + "'", e);
67     }
68   }
69
70   /**
71    * @see javax.naming.Context#close()
72    */

73   public void close() throws NamingException JavaDoc {
74   }
75
76   /**
77    * @see javax.naming.Context#composeName(javax.naming.Name, javax.naming.Name)
78    */

79   public Name JavaDoc composeName(Name JavaDoc name, Name JavaDoc prefix) throws NamingException JavaDoc {
80     org.sapia.archie.Name toAdd = getNameFrom(name);
81     org.sapia.archie.Name prfx = getNameFrom(prefix);
82     return new JndiName(prfx.add(toAdd));
83   }
84   
85   /**
86    * @see javax.naming.Context#composeName(java.lang.String, java.lang.String)
87    */

88   public String JavaDoc composeName(String JavaDoc name, String JavaDoc prefix)
89     throws NamingException JavaDoc {
90     try{
91       org.sapia.archie.Name toAdd = _archie.getNameParser().parse(name);
92       org.sapia.archie.Name prfx = _archie.getNameParser().parse(prefix);
93       return _archie.getNameParser().asString(prfx.add(toAdd));
94     }catch(ProcessingException e){
95       throw getNamingException("Could not process name", e);
96     }
97   }
98
99   /**
100    * @see javax.naming.Context#createSubcontext(javax.naming.Name)
101    */

102   public synchronized Context JavaDoc createSubcontext(Name JavaDoc name) throws NamingException JavaDoc {
103     try{
104       return newChildContext(_archie.lookupNode(getNameFrom(name), true));
105     }catch(ProcessingException e){
106       throw getNamingException("Could not create subcontext", e);
107     }catch(NotFoundException JavaDoc e){
108       throw getNamingException("Could not create subcontext", e);
109     }
110   }
111
112   /**
113    * @see javax.naming.Context#createSubcontext(java.lang.String)
114    */

115   public synchronized Context JavaDoc createSubcontext(String JavaDoc name) throws NamingException JavaDoc {
116     try{
117       return newChildContext(_archie.lookupNode(_archie.getNameParser().parse(name), true));
118     }catch(ProcessingException e){
119       throw getNamingException("Could not create subcontext", e);
120     }catch(NotFoundException JavaDoc e){
121       throw getNamingException("Could not create subcontext", e);
122     }
123   }
124
125   /**
126    * @see javax.naming.Context#destroySubcontext(javax.naming.Name)
127    */

128   public synchronized void destroySubcontext(Name JavaDoc name) throws NamingException JavaDoc {
129     if(name.size() == 0){
130       return;
131     }
132     try{
133       org.sapia.archie.Name archName = getNameFrom(name);
134       Node node = _archie.lookupNode(archName, false);
135       if(node.getParent() != null){
136         node.getParent().removeChild(archName.last());
137       }
138     }catch(ProcessingException e){
139       throw getNamingException("Could not destroy subcontext", e);
140     }catch(NotFoundException JavaDoc e){
141       throw getNamingException("Context not found", e);
142     }
143   }
144
145   /**
146    * @see javax.naming.Context#destroySubcontext(java.lang.String)
147    */

148   public synchronized void destroySubcontext(String JavaDoc name) throws NamingException JavaDoc {
149     try{
150       org.sapia.archie.Name archName = _archie.getNameParser().parse(name);
151       if(archName.count() == 0) return;
152       Node node = _archie.lookupNode(archName, false);
153       if(node.getParent() != null){
154         node.getParent().removeChild(archName.last());
155       }
156     }catch(ProcessingException e){
157       throw getNamingException("Could not destroy subcontext", e);
158     }catch(NotFoundException JavaDoc e){
159       throw getNamingException("Context not found", e);
160     }
161
162   }
163
164   /**
165    * @see javax.naming.Context#getEnvironment()
166    */

167   public Hashtable JavaDoc getEnvironment() throws NamingException JavaDoc {
168     return _env;
169   }
170
171   /**
172    * @see javax.naming.Context#getNameInNamespace()
173    */

174   public synchronized String JavaDoc getNameInNamespace() throws NamingException JavaDoc {
175     return _archie.getNameParser().asString(_archie.getRoot().getAbsolutePath());
176   }
177
178   /**
179    * @see javax.naming.Context#getNameParser(javax.naming.Name)
180    */

181   public NameParser JavaDoc getNameParser(Name JavaDoc name) throws NamingException JavaDoc {
182     return _parser;
183   }
184
185   /**
186    * @see javax.naming.Context#getNameParser(java.lang.String)
187    */

188   public NameParser JavaDoc getNameParser(String JavaDoc name) throws NamingException JavaDoc {
189     return _parser;
190   }
191
192   /**
193    * Returns a <code>NamingEnumeration</code> of <code>NameClassPair</code>s.
194    *
195    * @see javax.naming.Context#list(javax.naming.Name)
196    */

197   public synchronized NamingEnumeration JavaDoc list(Name JavaDoc name) throws NamingException JavaDoc {
198     try{
199         Node node = _archie.lookupNode(getNameFrom(name), false);
200         return newNamingEnum(node.getEntries(), node.getChildren(), JndiNamingEnum.LIST_NAMECLASS_PAIRS);
201     }catch(ProcessingException e){
202         throw getNamingException("Could not list objects under: " + name, e);
203     }catch(NotFoundException JavaDoc e){
204         throw getNamingException("Could not list objects under: " + name, e);
205     }
206   }
207
208   /**
209    * Returns a <code>NamingEnumeration</code> of <code>NameClassPair</code>s.
210    *
211    * @see javax.naming.Context#list(java.lang.String)
212    */

213   public synchronized NamingEnumeration JavaDoc list(String JavaDoc name) throws NamingException JavaDoc {
214     try{
215         Node node = _archie.lookupNode(_archie.getNameParser().parse(name), false);
216         return newNamingEnum(node.getEntries(), node.getChildren(), JndiNamingEnum.LIST_NAMECLASS_PAIRS);
217     }catch(ProcessingException e){
218         throw getNamingException("Could not list objects under: " + name, e);
219     }catch(NotFoundException JavaDoc e){
220         throw getNamingException("Could not list objects under: " + name, e);
221     }
222   }
223
224   /**
225    * Returns a <code>NamingEnumeration</code> of <code>Binding</code>s.
226    *
227    * @see javax.naming.Context#listBindings(javax.naming.Name)
228    */

229   public synchronized NamingEnumeration JavaDoc listBindings(Name JavaDoc name) throws NamingException JavaDoc {
230     try{
231         Node node = _archie.lookupNode(getNameFrom(name), true);
232         return newNamingEnum(node.getEntries(), node.getChildren(), JndiNamingEnum.LIST_BINDINGS);
233     }catch(ProcessingException e){
234         throw getNamingException("Could not list objects under: " + name, e);
235     }catch(NotFoundException JavaDoc e){
236         throw getNamingException("Could not list objects under: " + name, e);
237     }
238   }
239
240   /**
241    * Returns a <code>NamingEnumeration</code> of <code>Binding</code>s.
242    *
243    * @see javax.naming.Context#listBindings(java.lang.String)
244    */

245   public synchronized NamingEnumeration JavaDoc listBindings(String JavaDoc name) throws NamingException JavaDoc {
246     try{
247         Node node = _archie.lookupNode(_archie.getNameParser().parse(name), true);
248         return newNamingEnum(node.getEntries(), node.getChildren(), JndiNamingEnum.LIST_BINDINGS);
249     }catch(ProcessingException e){
250         throw getNamingException("Could not list objects under: " + name, e);
251     }catch(NotFoundException JavaDoc e){
252         throw getNamingException("Could not list objects under: " + name, e);
253     }
254   }
255   
256   /**
257    * Returns the <code>NamingEnumeration</code> of objects bound under
258    * the context specified by the given name.
259    *
260    * @return a <code>NamingEnumaration</code>.
261    */

262   public synchronized NamingEnumeration JavaDoc listObjects(Name JavaDoc name) throws NamingException JavaDoc {
263     try{
264         Node node = _archie.lookupNode(getNameFrom(name), false);
265         return newNamingEnum(node.getEntries(), node.getChildren(), JndiNamingEnum.LIST_OBJECTS);
266     }catch(ProcessingException e){
267         throw getNamingException("Could not list objects under: " + name, e);
268     }catch(NotFoundException JavaDoc e){
269         throw getNamingException("Could not list objects under: " + name, e);
270     }
271   }
272
273   /**
274    * Returns the <code>NamingEnumeration</code> of objects bound under
275    * the context specified by the given name.
276    *
277    * @return a <code>NamingEnumaration</code>.
278    */

279   public synchronized NamingEnumeration JavaDoc listObjects(String JavaDoc name) throws NamingException JavaDoc {
280     try{
281         Node node = _archie.lookupNode(_archie.getNameParser().parse(name), false);
282         return newNamingEnum(node.getEntries(), node.getChildren(), JndiNamingEnum.LIST_OBJECTS);
283     }catch(ProcessingException e){
284         throw getNamingException("Could not list objects under: " + name, e);
285     }catch(NotFoundException JavaDoc e){
286         throw getNamingException("Could not list objects under: " + name, e);
287     }
288   }
289
290   /**
291    * @see javax.naming.Context#lookup(javax.naming.Name)
292    */

293   public synchronized Object JavaDoc lookup(Name JavaDoc name) throws NamingException JavaDoc {
294     if(name.size() == 0){
295       return this;
296     }
297     try{
298         return _archie.lookup(getNameFrom(name));
299     }catch(ProcessingException e){
300         throw getNamingException("Could not perform lookup", e);
301     }catch(NotFoundException JavaDoc e){
302         throw getNamingException("No object found for: " + name, e);
303     }
304   }
305
306   /**
307    * @see javax.naming.Context#lookup(java.lang.String)
308    */

309   public synchronized Object JavaDoc lookup(String JavaDoc name) throws NamingException JavaDoc {
310     if(name == null || name.length() == 0){
311       return this;
312     }
313     try{
314         return _archie.lookup(_archie.getNameParser().parse(name));
315     }catch(ProcessingException e){
316         throw getNamingException("Could not perform lookup", e);
317     }catch(NotFoundException JavaDoc e){
318         throw getNamingException("No object found for: " + name, e);
319     }
320   }
321
322   /**
323    * @see javax.naming.Context#lookupLink(javax.naming.Name)
324    */

325   public synchronized Object JavaDoc lookupLink(Name JavaDoc name) throws NamingException JavaDoc {
326     return lookup(name);
327   }
328
329   /**
330    * @see javax.naming.Context#lookupLink(java.lang.String)
331    */

332   public synchronized Object JavaDoc lookupLink(String JavaDoc name) throws NamingException JavaDoc {
333     return lookup(name);
334   }
335
336   /**
337    * @see javax.naming.Context#rebind(javax.naming.Name, java.lang.Object)
338    */

339   public synchronized void rebind(Name JavaDoc name, Object JavaDoc obj) throws NamingException JavaDoc {
340     try{
341         _archie.rebind(getNameFrom(name), obj);
342     }catch(ProcessingException e){
343         throw getNamingException("Could not bind object for: " + name, e);
344     }
345   }
346
347   /**
348    * @see javax.naming.Context#rebind(java.lang.String, java.lang.Object)
349    */

350   public synchronized void rebind(String JavaDoc name, Object JavaDoc obj) throws NamingException JavaDoc {
351     try{
352         _archie.rebind(_archie.getNameParser().parse(name), obj);
353     }catch(ProcessingException e){
354         throw getNamingException("Could not bind object for: " + name, e);
355     }
356   }
357
358   /**
359    * @see javax.naming.Context#removeFromEnvironment(java.lang.String)
360    */

361   public Object JavaDoc removeFromEnvironment(String JavaDoc propName) throws NamingException JavaDoc {
362     return _env.remove(propName);
363   }
364
365   /**
366    * NOT SUPPORTED.
367    * @see javax.naming.Context#rename(javax.naming.Name, javax.naming.Name)
368    */

369   public void rename(Name JavaDoc oldName, Name JavaDoc newName) throws NamingException JavaDoc {
370         throw new NamingException JavaDoc("Rename not supported");
371   }
372
373   /**
374    * NOT SUPPORTED.
375    *
376    * @see javax.naming.Context#rename(java.lang.String, java.lang.String)
377    */

378   public void rename(String JavaDoc oldName, String JavaDoc newName) throws NamingException JavaDoc {
379         throw new NamingException JavaDoc("Rename not supported");
380   }
381
382   /**
383    * @see javax.naming.Context#unbind(javax.naming.Name)
384    */

385   public synchronized void unbind(Name JavaDoc name) throws NamingException JavaDoc {
386     try{
387         _archie.unbind(getNameFrom(name));
388       }catch(ProcessingException e){
389         throw getNamingException("Could not unbind: " + name, e);
390       }
391   }
392
393   /**
394    * @see javax.naming.Context#unbind(java.lang.String)
395    */

396   public synchronized void unbind(String JavaDoc name) throws NamingException JavaDoc {
397     try{
398         _archie.unbind(_archie.getNameParser().parse(name));
399       }catch(ProcessingException e){
400         throw getNamingException("Could not unbind: " + name, e);
401       }
402   }
403   
404   protected org.sapia.archie.Name getNameFrom(Name JavaDoc name) throws NamingException JavaDoc{
405     org.sapia.archie.Name n = new org.sapia.archie.Name();
406     for(int i = 0; i < name.size(); i++){
407       try{
408         n.add(_archie.getNameParser().parseNamePart((name.get(i))));
409       }catch(ProcessingException e){
410         throw getNamingException("Could not process name: " + name, e);
411       }
412     }
413     return n;
414   }
415   
416   protected Context JavaDoc newChildContext(Node node){
417     return new JndiContext(node);
418   }
419   
420   /**
421    * Can be overridden to return an app-specific NamingEnumeration. The
422    * method takes this instance's node's entries and child nodes.
423    *
424    * @param entries an iterator of <code>Entry</code> instances.
425    * @param nodes an iterator of <code>Node</code> instances.
426    * @param boolean <code>true</code> if the returned enumeration should produce
427    * <code>Binding</code> instances.
428    */

429   protected NamingEnumeration JavaDoc newNamingEnum(Iterator JavaDoc entries, Iterator JavaDoc childNodes, int listType){
430     return new JndiNamingEnum(entries, childNodes, listType);
431   }
432   
433   private NamingException JavaDoc getNamingException(String JavaDoc msg, ProcessingException e){
434     if(e instanceof DuplicateException){
435       NameAlreadyBoundException JavaDoc nabe = new NameAlreadyBoundException JavaDoc(msg);
436       nabe.setRootCause(e);
437       return nabe;
438     }
439     else{
440       NamingException JavaDoc ne = new NamingException JavaDoc(msg);
441       ne.setRootCause(e);
442       return ne;
443     }
444   }
445   private NamingException JavaDoc getNamingException(String JavaDoc msg, NotFoundException JavaDoc e){
446     NamingException JavaDoc ne = new NameNotFoundException JavaDoc(msg);
447     ne.setRootCause(e);
448     ne.setResolvedName(new JndiName(e.getResolvedName()));
449     ne.setRemainingName(new JndiName(e.getRemainingName()));
450     return ne;
451   }
452 }
453
Popular Tags