1 // ========================================================================
2 // $Id: NamingUtil.java 3680 2008-09-21 10:37:13Z janb $
3 // Copyright 1999-2006 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 // ========================================================================
15
16 package org.mortbay.naming;
17
18 import java.util.HashMap;
19 import java.util.Map;
20
21 import javax.naming.Binding;
22 import javax.naming.Context;
23 import javax.naming.Name;
24 import javax.naming.NameNotFoundException;
25 import javax.naming.NameParser;
26 import javax.naming.NamingEnumeration;
27 import javax.naming.NamingException;
28
29 import org.mortbay.log.Log;
30
31
32 /**
33 * Util.java
34 *
35 *
36 * Created: Tue Jul 1 18:26:17 2003
37 *
38 * @author <a href="mailto:janb@mortbay.com">Jan Bartel</a>
39 * @version 1.0
40 */
41 public class NamingUtil
42 {
43
44 /* ------------------------------------------------------------ */
45 /**
46 * Bind an object to a context ensuring all subcontexts
47 * are created if necessary
48 *
49 * @param ctx the context into which to bind
50 * @param name the name relative to context to bind
51 * @param obj the object to be bound
52 * @exception NamingException if an error occurs
53 */
54 public static Context bind (Context ctx, String nameStr, Object obj)
55 throws NamingException
56 {
57 Name name = ctx.getNameParser("").parse(nameStr);
58
59 //no name, nothing to do
60 if (name.size() == 0)
61 return null;
62
63 Context subCtx = ctx;
64
65 //last component of the name will be the name to bind
66 for (int i=0; i < name.size() - 1; i++)
67 {
68 try
69 {
70 subCtx = (Context)subCtx.lookup (name.get(i));
71 if(Log.isDebugEnabled())Log.debug("Subcontext "+name.get(i)+" already exists");
72 }
73 catch (NameNotFoundException e)
74 {
75 subCtx = subCtx.createSubcontext(name.get(i));
76 if(Log.isDebugEnabled())Log.debug("Subcontext "+name.get(i)+" created");
77 }
78 }
79
80 subCtx.rebind (name.get(name.size() - 1), obj);
81 if(Log.isDebugEnabled())Log.debug("Bound object to "+name.get(name.size() - 1));
82 return subCtx;
83
84 }
85
86
87 public static void unbind (Context ctx)
88 throws NamingException
89 {
90 //unbind everything in the context and all of its subdirectories
91 NamingEnumeration ne = ctx.listBindings(ctx.getNameInNamespace());
92
93 while (ne.hasMoreElements())
94 {
95 Binding b = (Binding)ne.nextElement();
96 if (b.getObject() instanceof Context)
97 {
98 unbind((Context)b.getObject());
99 }
100 else
101 ctx.unbind(b.getName());
102 }
103 }
104
105 /**
106 * Do a deep listing of the bindings for a context.
107 * @param ctx the context containing the name for which to list the bindings
108 * @param name the name in the context to list
109 * @return map: key is fully qualified name, value is the bound object
110 * @throws NamingException
111 */
112 public static Map flattenBindings (Context ctx, String name)
113 throws NamingException
114 {
115 HashMap map = new HashMap();
116
117 //the context representation of name arg
118 Context c = (Context)ctx.lookup (name);
119 NameParser parser = c.getNameParser("");
120 NamingEnumeration enm = ctx.listBindings(name);
121 while (enm.hasMore())
122 {
123 Binding b = (Binding)enm.next();
124
125 if (b.getObject() instanceof Context)
126 {
127 map.putAll(flattenBindings (c, b.getName()));
128 }
129 else
130 {
131 Name compoundName = parser.parse (c.getNameInNamespace());
132 compoundName.add(b.getName());
133 map.put (compoundName.toString(), b.getObject());
134 }
135
136 }
137
138 return map;
139 }
140
141 }