KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jfox > jndi > JNDIContainerImpl


1 /* JFox, the OpenSource J2EE Application Server
2  *
3  * Distributable under GNU LGPL license by gun.org
4  * more details please visit http://www.huihoo.org/jfox
5  */

6
7 package org.jfox.jndi;
8
9
10 import java.io.IOException JavaDoc;
11 import java.rmi.MarshalledObject JavaDoc;
12 import java.util.ArrayList JavaDoc;
13 import java.util.Collections JavaDoc;
14 import java.util.HashMap JavaDoc;
15 import java.util.Hashtable JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.List JavaDoc;
18 import java.util.Map JavaDoc;
19 import javax.naming.Binding JavaDoc;
20 import javax.naming.Context JavaDoc;
21 import javax.naming.ContextNotEmptyException JavaDoc;
22 import javax.naming.InvalidNameException JavaDoc;
23 import javax.naming.Name JavaDoc;
24 import javax.naming.NameAlreadyBoundException JavaDoc;
25 import javax.naming.NameClassPair JavaDoc;
26 import javax.naming.NameNotFoundException JavaDoc;
27 import javax.naming.NamingException JavaDoc;
28 import javax.naming.NotContextException JavaDoc;
29
30 import org.jfox.ioc.connector.AbstractContainer;
31
32
33 /**
34  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
35  */

36
37 // NOTE: all name was absolute name
38
public class JNDIContainerImpl extends AbstractContainer implements JNDIContainer{
39
40 // private Logger logger = Logger.getLogger(JNDIContainerImpl.class.getName());
41
/**
42      * the bindings hold all the naming
43      */

44     private static Map JavaDoc bindings = Collections.synchronizedMap(new HashMap JavaDoc());
45
46 // private final static JNDIContainerImpl me = new JNDIContainerImpl();
47

48     public JNDIContainerImpl() {
49     }
50
51     public Class JavaDoc getHandlerClass() {
52         return JNDIHandler.class;
53     }
54
55 /*
56     public static JNDIContainer getInstance(){
57         return me;
58     }
59 */

60
61     public void bind(Context JavaDoc ctx, Name JavaDoc name, Object JavaDoc obj, String JavaDoc className) throws NamingException JavaDoc {
62         if(name.isEmpty()) {
63             throw new InvalidNameException JavaDoc();
64         }
65         // doCreate needed subcontext
66
if(name.size() > 1) {
67             Name JavaDoc prefix = name.getPrefix(name.size() - 1);
68             if(!prefix.toString().equals("/")) {
69                 this.createSubcontext(ctx, name.getPrefix(name.size() - 1));
70             }
71         }
72
73         if(this.isBound(name)) {
74             throw new NameAlreadyBoundException JavaDoc(name.toString());
75         }
76         // so bind it
77
setBinding(name, obj, className);
78     }
79
80     public void rebind(Context JavaDoc ctx, Name JavaDoc name, Object JavaDoc obj, String JavaDoc className) throws NamingException JavaDoc {
81         if(name.isEmpty()) {
82             throw new InvalidNameException JavaDoc();
83         }
84         // doCreate needed subcontext
85
// this.createSubcontext(context,name.getPrefix(name.size()-1));
86
if(name.size() > 1) {
87             Name JavaDoc prefix = name.getPrefix(name.size() - 1);
88             if(!prefix.toString().equals("/")) {
89                 this.createSubcontext(ctx, name.getPrefix(name.size() - 1));
90             }
91         }
92         // can't rebind a context
93
if(this.isBound(name) && (this.getBinding(name).getObject() instanceof Context JavaDoc)) {
94             throw new NamingException JavaDoc("Cannot rebind a context!");
95         }
96         // so bind it
97
setBinding(name, obj, className);
98     }
99
100     public void unbind(Context JavaDoc ctx, Name JavaDoc name) throws NamingException JavaDoc {
101         if(!this.isBound(name)) { // not bound,throw Exception
102
throw new NameNotFoundException JavaDoc("name: " + name.toString());
103         }
104
105         if(this.getBinding(name).getObject() instanceof Context JavaDoc) { // is a context
106
this.destroySubcontext(ctx, name);
107         }
108         else { // is a normal object
109
removeBinding(name);
110         }
111     }
112
113     public Object JavaDoc lookup(Name JavaDoc name) throws NamingException JavaDoc {
114         if(this.isBound(name)) {
115             Object JavaDoc obj = this.getBinding(name).getObject();
116             return obj;
117         }
118         else {
119             throw new NameNotFoundException JavaDoc(name.toString());
120         }
121     }
122
123     public Object JavaDoc lookupLink(Name JavaDoc name) throws NamingException JavaDoc {
124         return null;
125     }
126
127     public List JavaDoc list(Context JavaDoc ctx, Name JavaDoc name) throws NamingException JavaDoc {
128         if(!this.isBound(name)) { // not bound
129
throw new NameNotFoundException JavaDoc(name.toString());
130         }
131 // if(!(this.getBinding(name).getObject() instanceof Context)){ // not context
132
// throw new NotContextException("name: " + name.toString());
133
// }
134
isContext(name);
135
136         List JavaDoc list = new ArrayList JavaDoc();
137         Iterator JavaDoc it = bindings.keySet().iterator();
138         while(it.hasNext()) {
139             String JavaDoc key = (String JavaDoc) it.next();
140             Name JavaDoc namekey = ctx.getNameParser(key).parse(key);
141             if(namekey.startsWith(name) && (namekey.size() == name.size() + 1)) {
142                 Binding JavaDoc bind = this.getBinding(namekey);
143                 list.add(new NameClassPair JavaDoc(bind.getName(), bind.getClassName(), false));
144             }
145         }
146         return list;
147     }
148
149     public List JavaDoc listBindings(Context JavaDoc ctx, Name JavaDoc name) throws NamingException JavaDoc {
150         if(!this.isBound(name)) { // not bound
151
throw new NameNotFoundException JavaDoc(name.toString());
152         }
153 // if(!(this.getBinding(name).getObject() instanceof Context)){ // not context
154
// throw new NotContextException("name: " + name.toString());
155
// }
156
isContext(name);
157
158         List JavaDoc list = new ArrayList JavaDoc();
159         Iterator JavaDoc it = bindings.keySet().iterator();
160         while(it.hasNext()) {
161             String JavaDoc key = (String JavaDoc) it.next();
162             Name JavaDoc namekey = ctx.getNameParser(key).parse(key);
163             if(namekey.startsWith(name) && (namekey.size() == name.size() + 1)) {
164                 Binding JavaDoc bind = this.getBinding(namekey);
165                 list.add(bind);
166             }
167         }
168         return list;
169     }
170
171     public synchronized Context JavaDoc createSubcontext(Context JavaDoc ctx, Name JavaDoc name) throws NamingException JavaDoc {
172         if(name.isEmpty() || name.toString().trim().equals("/")) {
173             throw new InvalidNameException JavaDoc(name.toString());
174         }
175         Context JavaDoc lastContext = null;
176         for(int i = 2; i <= name.size(); i++) { // while i = Configure.ROOT_NAME_LENGTH ,will doCreate the root context
177
Name JavaDoc subName = name.getPrefix(i);
178             if(!this.isBound(subName)) {
179                 lastContext = createNextSubcontext(subName, ctx.getEnvironment()); // name not binding,doCreate a sub context
180
}
181         }
182         return lastContext;
183     }
184
185     /**
186      * destory a empty sub context
187      */

188     public void destroySubcontext(Context JavaDoc ctx, Name JavaDoc name) throws NamingException JavaDoc {
189         if(!bindings.containsKey(name.toString())) {
190             throw new NameNotFoundException JavaDoc("name: " + name.toString());
191         }
192
193         isContext(name);
194
195         List JavaDoc list = this.list(ctx, name);
196         if(list.isEmpty()) { // context is empty
197
removeBinding(name);
198         }
199         else { // context not empty
200
throw new ContextNotEmptyException JavaDoc("name: " + name.toString());
201         }
202     }
203
204     public void closeSubcontext(Context JavaDoc ctx, Name JavaDoc name) throws NamingException JavaDoc {
205         if(!bindings.containsKey(name.toString())) {
206             throw new NameNotFoundException JavaDoc("name: " + name.toString());
207         }
208
209         isContext(name);
210
211 // Object binding = this.getBinding(name).getObject();
212
// if(!(binding instanceof MarshalledObject)){
213
// throw new NotContextException("name: " + name.toString() + ", " + binding);
214
// }
215
// Object obj = binding;
216
// try {
217
// obj = ((MarshalledObject)binding).get();
218
// }
219
// catch(Exception e){
220
// throw new NamingException(e.toString());
221
// }
222
//
223
// if(!(obj instanceof Context)) {
224
// throw new NotContextException("name: " + name.toString() + ", " + binding);
225
// }
226

227         List JavaDoc list = this.list(ctx, name);
228         if(!list.isEmpty()) { // context is not empty
229
for(int i = 0; i < list.size(); i++) {
230                 String JavaDoc sub_name = ((NameClassPair JavaDoc) list.get(i)).getName();
231                 if(sub_name.trim().equals("/")) continue;
232                 removeBinding(ctx.getNameParser(sub_name).parse(sub_name));
233             }
234         }
235
236         removeBinding(name);
237     }
238
239     public boolean isBound(Name JavaDoc name) {
240         return bindings.containsKey(name.toString()) ? true : false;
241     }
242
243     /**
244      * get the Binding object that bind with the key
245      */

246     private Binding JavaDoc getBinding(Name JavaDoc key) {
247         String JavaDoc s_key = key.toString();
248         Object JavaDoc obj = bindings.get(s_key);
249         if(obj == null) return null;
250         Binding JavaDoc b = (Binding JavaDoc) bindings.get(s_key);
251         return b;
252     }
253
254     private void setBinding(Name JavaDoc name, Object JavaDoc obj, String JavaDoc className) {
255         logger.info("binding " + name.toString() + " => " + obj.toString() + "[" + className + "]");
256         String JavaDoc n = name.toString();
257         bindings.put(n, new Binding JavaDoc(n, className, obj, false));
258     }
259
260     /**
261      * doCreate a sub context with the name
262      * return the context
263      */

264     private Context JavaDoc createNextSubcontext(Name JavaDoc name, Hashtable JavaDoc env) throws NamingException JavaDoc {
265         ContextImpl ctx = new ContextImpl(name, env);
266         Object JavaDoc obj = ctx;
267         try {
268             obj = new MarshalledObject JavaDoc(ctx);
269         }
270         catch(IOException JavaDoc e) {
271             throw new NamingException JavaDoc(e.toString());
272         }
273         setBinding(name, obj, ctx.getClass().getName());
274         return ctx;
275     }
276
277     private void isContext(Name JavaDoc name) throws NamingException JavaDoc {
278         Object JavaDoc binding = this.getBinding(name).getObject();
279         if(!(binding instanceof MarshalledObject JavaDoc)) {
280             throw new NotContextException JavaDoc("name: " + name.toString() + ", " + binding);
281         }
282         Object JavaDoc obj = binding;
283         try {
284             obj = ((MarshalledObject JavaDoc) binding).get();
285         }
286         catch(Exception JavaDoc e) {
287             throw new NamingException JavaDoc(e.toString());
288         }
289
290         if(!(obj instanceof Context JavaDoc)) {
291             throw new NotContextException JavaDoc("name: " + name.toString() + ", " + binding);
292         }
293
294     }
295
296     /**
297      * remove from bindings
298      */

299     private void removeBinding(Name JavaDoc name) {
300         logger.info("unbinding " + name.toString());
301         bindings.remove(name.toString());
302     }
303
304
305 }
306
Popular Tags