/* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package javax.naming; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.Hashtable; import java.util.Properties; import java.applet.Applet; import java.util.Hashtable; import javax.naming.spi.NamingManager; public class InitialContext implements Context { protected Context defaultInitCtx; protected boolean gotDefault = false; protected Hashtable myProps; public InitialContext (Hashtable environment) { init (environment); } protected InitialContext (boolean lazy) { if (! lazy) init (null); } public InitialContext () { init (null); } protected void init (Hashtable environment) { // FIXME: Is this enough? final String[] properties = { Context.DNS_URL, Context.INITIAL_CONTEXT_FACTORY, Context.OBJECT_FACTORIES, Context.PROVIDER_URL, Context.STATE_FACTORIES, Context.URL_PKG_PREFIXES, }; // Create myProps, cloning environment if needed. if (environment != null) myProps = (Hashtable) environment.clone (); else myProps = new Hashtable (); Applet napplet = (Applet) myProps.get (Context.APPLET); for (int i = properties.length - 1; i >= 0; i--) { Object o = myProps.get (properties[i]); if (o == null) { if (napplet != null) o = napplet.getParameter (properties[i]); if (o == null) o = System.getProperty (properties[i]); if (o != null) myProps.put (properties[i], o); } } try { Enumeration ep = Thread.currentThread().getContextClassLoader().getResources("jndi.naming"); while (ep.hasMoreElements ()) { URL url = (URL) ep.nextElement (); Properties p = new Properties (); try { InputStream is = url.openStream (); p.load (is); is.close (); } catch (IOException e) {} merge (myProps, p); } } catch (IOException e) {} String home = System.getProperty("java.home"); if (home != null) { String fileName = home + File.separator + "lib" + File.separator + "jndi.properties"; Properties p = new Properties (); try { InputStream is = new FileInputStream (fileName); p.load (is); is.close (); } catch (IOException e) {} merge (myProps, p); } } // FIXME: Is this enough? private static final String[] colon_list = { Context.OBJECT_FACTORIES, Context.URL_PKG_PREFIXES, Context.STATE_FACTORIES }; private static void merge (Hashtable h1, Hashtable h2) { Enumeration e2 = h2.keys(); while (e2.hasMoreElements()) { String key2 = (String) e2.nextElement(); Object value1 = h1.get(key2); if (value1 == null) h1.put(key2, h2.get(key2)); else if (key2.compareTo(colon_list[0]) == 0 || key2.compareTo(colon_list[1]) == 0 || key2.compareTo(colon_list[2]) == 0 || key2.compareTo(colon_list[3]) == 0) { String value2 = (String) h2.get(key2); h1.put(key2, (String) value1 + ":" + value2); } } } protected Context getDefaultInitCtx () throws NamingException { if (! gotDefault) { defaultInitCtx = NamingManager.getInitialContext (myProps); gotDefault = true; } return defaultInitCtx; } protected Context getURLOrDefaultInitCtx (Name name) throws NamingException { if (name.size () > 0) return getURLOrDefaultInitCtx (name.get (0)); else return getDefaultInitCtx (); } protected Context getURLOrDefaultInitCtx (String name) throws NamingException { String scheme = null; if (NamingManager.hasInitialContextFactoryBuilder()) return getDefaultInitCtx(); int colon = name.indexOf(':'); int slash = name.indexOf('/'); if (colon > 0 && (slash == -1 || colon < slash)) scheme = name.substring(0, colon); if (scheme != null) { Context context = NamingManager.getURLContext(scheme, myProps); if (context != null) return context; } return getDefaultInitCtx(); } public void bind (Name name, Object obj) throws NamingException { getURLOrDefaultInitCtx (name).bind (name, obj); } public void bind (String name, Object obj) throws NamingException { getURLOrDefaultInitCtx (name).bind (name, obj); } public Object lookup (Name name) throws NamingException { return getURLOrDefaultInitCtx (name).lookup (name); } public Object lookup (String name) throws NamingException { return getURLOrDefaultInitCtx (name).lookup (name); } public void rebind (Name name, Object obj) throws NamingException { getURLOrDefaultInitCtx (name).rebind (name, obj); } public void rebind (String name, Object obj) throws NamingException { getURLOrDefaultInitCtx (name).rebind (name, obj); } public void unbind (Name name) throws NamingException { getURLOrDefaultInitCtx (name).unbind (name); } public void unbind (String name) throws NamingException { getURLOrDefaultInitCtx (name).unbind (name); } public void rename (Name oldName, Name newName) throws NamingException { getURLOrDefaultInitCtx (oldName).rename (oldName, newName); } public void rename (String oldName, String newName) throws NamingException { getURLOrDefaultInitCtx (oldName).rename (oldName, newName); } public NamingEnumeration list (Name name) throws NamingException { return getURLOrDefaultInitCtx (name).list (name); } public NamingEnumeration list (String name) throws NamingException { return getURLOrDefaultInitCtx (name).list (name); } public NamingEnumeration listBindings (Name name) throws NamingException { return getURLOrDefaultInitCtx (name).listBindings (name); } public NamingEnumeration listBindings (String name) throws NamingException { return getURLOrDefaultInitCtx (name).listBindings (name); } public void destroySubcontext (Name name) throws NamingException { getURLOrDefaultInitCtx (name).destroySubcontext (name); } public void destroySubcontext (String name) throws NamingException { getURLOrDefaultInitCtx (name).destroySubcontext (name); } public Context createSubcontext (Name name) throws NamingException { return getURLOrDefaultInitCtx (name).createSubcontext (name); } public Context createSubcontext (String name) throws NamingException { return getURLOrDefaultInitCtx (name).createSubcontext (name); } public Object lookupLink (Name name) throws NamingException { return getURLOrDefaultInitCtx (name).lookupLink (name); } public Object lookupLink (String name) throws NamingException { return getURLOrDefaultInitCtx (name).lookupLink (name); } public NameParser getNameParser (Name name) throws NamingException { return getURLOrDefaultInitCtx (name).getNameParser (name); } public NameParser getNameParser (String name) throws NamingException { return getURLOrDefaultInitCtx (name).getNameParser (name); } public Name composeName (Name name, Name prefix) throws NamingException { return getURLOrDefaultInitCtx (name).composeName (name, prefix); } public String composeName (String name, String prefix) throws NamingException { return getURLOrDefaultInitCtx (name).composeName (name, prefix); } public Object addToEnvironment (String propName, Object propVal) throws NamingException { myProps.put (propName, propVal); } public Object removeFromEnvironment (String propName) throws NamingException { myProps.remove (propName); } public Hashtable getEnvironment () throws NamingException { return myProps; } public void close () throws NamingException { throw new OperationNotSupportedException (); } public String getNameInNamespace () throws NamingException { throw new OperationNotSupportedException (); } }