1 6 7 package org.jfox.jndi; 8 9 10 import java.io.IOException ; 11 import java.rmi.MarshalledObject ; 12 import java.util.ArrayList ; 13 import java.util.Collections ; 14 import java.util.HashMap ; 15 import java.util.Hashtable ; 16 import java.util.Iterator ; 17 import java.util.List ; 18 import java.util.Map ; 19 import javax.naming.Binding ; 20 import javax.naming.Context ; 21 import javax.naming.ContextNotEmptyException ; 22 import javax.naming.InvalidNameException ; 23 import javax.naming.Name ; 24 import javax.naming.NameAlreadyBoundException ; 25 import javax.naming.NameClassPair ; 26 import javax.naming.NameNotFoundException ; 27 import javax.naming.NamingException ; 28 import javax.naming.NotContextException ; 29 30 import org.jfox.ioc.connector.AbstractContainer; 31 32 33 36 37 public class JNDIContainerImpl extends AbstractContainer implements JNDIContainer{ 39 40 44 private static Map bindings = Collections.synchronizedMap(new HashMap ()); 45 46 48 public JNDIContainerImpl() { 49 } 50 51 public Class getHandlerClass() { 52 return JNDIHandler.class; 53 } 54 55 60 61 public void bind(Context ctx, Name name, Object obj, String className) throws NamingException { 62 if(name.isEmpty()) { 63 throw new InvalidNameException (); 64 } 65 if(name.size() > 1) { 67 Name 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 (name.toString()); 75 } 76 setBinding(name, obj, className); 78 } 79 80 public void rebind(Context ctx, Name name, Object obj, String className) throws NamingException { 81 if(name.isEmpty()) { 82 throw new InvalidNameException (); 83 } 84 if(name.size() > 1) { 87 Name prefix = name.getPrefix(name.size() - 1); 88 if(!prefix.toString().equals("/")) { 89 this.createSubcontext(ctx, name.getPrefix(name.size() - 1)); 90 } 91 } 92 if(this.isBound(name) && (this.getBinding(name).getObject() instanceof Context )) { 94 throw new NamingException ("Cannot rebind a context!"); 95 } 96 setBinding(name, obj, className); 98 } 99 100 public void unbind(Context ctx, Name name) throws NamingException { 101 if(!this.isBound(name)) { throw new NameNotFoundException ("name: " + name.toString()); 103 } 104 105 if(this.getBinding(name).getObject() instanceof Context ) { this.destroySubcontext(ctx, name); 107 } 108 else { removeBinding(name); 110 } 111 } 112 113 public Object lookup(Name name) throws NamingException { 114 if(this.isBound(name)) { 115 Object obj = this.getBinding(name).getObject(); 116 return obj; 117 } 118 else { 119 throw new NameNotFoundException (name.toString()); 120 } 121 } 122 123 public Object lookupLink(Name name) throws NamingException { 124 return null; 125 } 126 127 public List list(Context ctx, Name name) throws NamingException { 128 if(!this.isBound(name)) { throw new NameNotFoundException (name.toString()); 130 } 131 isContext(name); 135 136 List list = new ArrayList (); 137 Iterator it = bindings.keySet().iterator(); 138 while(it.hasNext()) { 139 String key = (String ) it.next(); 140 Name namekey = ctx.getNameParser(key).parse(key); 141 if(namekey.startsWith(name) && (namekey.size() == name.size() + 1)) { 142 Binding bind = this.getBinding(namekey); 143 list.add(new NameClassPair (bind.getName(), bind.getClassName(), false)); 144 } 145 } 146 return list; 147 } 148 149 public List listBindings(Context ctx, Name name) throws NamingException { 150 if(!this.isBound(name)) { throw new NameNotFoundException (name.toString()); 152 } 153 isContext(name); 157 158 List list = new ArrayList (); 159 Iterator it = bindings.keySet().iterator(); 160 while(it.hasNext()) { 161 String key = (String ) it.next(); 162 Name namekey = ctx.getNameParser(key).parse(key); 163 if(namekey.startsWith(name) && (namekey.size() == name.size() + 1)) { 164 Binding bind = this.getBinding(namekey); 165 list.add(bind); 166 } 167 } 168 return list; 169 } 170 171 public synchronized Context createSubcontext(Context ctx, Name name) throws NamingException { 172 if(name.isEmpty() || name.toString().trim().equals("/")) { 173 throw new InvalidNameException (name.toString()); 174 } 175 Context lastContext = null; 176 for(int i = 2; i <= name.size(); i++) { Name subName = name.getPrefix(i); 178 if(!this.isBound(subName)) { 179 lastContext = createNextSubcontext(subName, ctx.getEnvironment()); } 181 } 182 return lastContext; 183 } 184 185 188 public void destroySubcontext(Context ctx, Name name) throws NamingException { 189 if(!bindings.containsKey(name.toString())) { 190 throw new NameNotFoundException ("name: " + name.toString()); 191 } 192 193 isContext(name); 194 195 List list = this.list(ctx, name); 196 if(list.isEmpty()) { removeBinding(name); 198 } 199 else { throw new ContextNotEmptyException ("name: " + name.toString()); 201 } 202 } 203 204 public void closeSubcontext(Context ctx, Name name) throws NamingException { 205 if(!bindings.containsKey(name.toString())) { 206 throw new NameNotFoundException ("name: " + name.toString()); 207 } 208 209 isContext(name); 210 211 227 List list = this.list(ctx, name); 228 if(!list.isEmpty()) { for(int i = 0; i < list.size(); i++) { 230 String sub_name = ((NameClassPair ) 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 name) { 240 return bindings.containsKey(name.toString()) ? true : false; 241 } 242 243 246 private Binding getBinding(Name key) { 247 String s_key = key.toString(); 248 Object obj = bindings.get(s_key); 249 if(obj == null) return null; 250 Binding b = (Binding ) bindings.get(s_key); 251 return b; 252 } 253 254 private void setBinding(Name name, Object obj, String className) { 255 logger.info("binding " + name.toString() + " => " + obj.toString() + "[" + className + "]"); 256 String n = name.toString(); 257 bindings.put(n, new Binding (n, className, obj, false)); 258 } 259 260 264 private Context createNextSubcontext(Name name, Hashtable env) throws NamingException { 265 ContextImpl ctx = new ContextImpl(name, env); 266 Object obj = ctx; 267 try { 268 obj = new MarshalledObject (ctx); 269 } 270 catch(IOException e) { 271 throw new NamingException (e.toString()); 272 } 273 setBinding(name, obj, ctx.getClass().getName()); 274 return ctx; 275 } 276 277 private void isContext(Name name) throws NamingException { 278 Object binding = this.getBinding(name).getObject(); 279 if(!(binding instanceof MarshalledObject )) { 280 throw new NotContextException ("name: " + name.toString() + ", " + binding); 281 } 282 Object obj = binding; 283 try { 284 obj = ((MarshalledObject ) binding).get(); 285 } 286 catch(Exception e) { 287 throw new NamingException (e.toString()); 288 } 289 290 if(!(obj instanceof Context )) { 291 throw new NotContextException ("name: " + name.toString() + ", " + binding); 292 } 293 294 } 295 296 299 private void removeBinding(Name name) { 300 logger.info("unbinding " + name.toString()); 301 bindings.remove(name.toString()); 302 } 303 304 305 } 306 | Popular Tags |