package com.revolsys.jndi; import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.spi.InitialContextFactory; import javax.naming.spi.InitialContextFactoryBuilder; import javax.naming.spi.NamingManager; import org.springframework.util.ClassUtils; import com.revolsys.logging.Logs; public class SimpleNamingContextBuilder implements InitialContextFactoryBuilder { private static volatile SimpleNamingContextBuilder activated; private static final Object initializationLock = new Object(); private static boolean initialized = false; public static SimpleNamingContextBuilder emptyActivatedContextBuilder() throws NamingException { if (activated != null) { activated.clear(); } else { final SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder(); builder.activate(); } return activated; } public static SimpleNamingContextBuilder getCurrentContextBuilder() { return activated; } private final Hashtable<String, Object> boundObjects = new Hashtable<>(); public SimpleNamingContextBuilder() { } public void activate() throws IllegalStateException, NamingException { Logs.info(this, "Activating simple JNDI environment"); synchronized (initializationLock) { if (!initialized) { if (NamingManager.hasInitialContextFactoryBuilder()) { throw new IllegalStateException( "Cannot activate SimpleNamingContextBuilder: there is already a JNDI provider registered. Note that JNDI is a JVM-wide service, shared at the JVM system class loader level, with no reset option. As a consequence, a JNDI provider must only be registered once per JVM."); } NamingManager.setInitialContextFactoryBuilder(this); initialized = true; } } activated = this; } public void bind(final String name, final Object obj) { Logs.info(this, new StringBuilder("Static JNDI binding: [").append(name) .append("] = [") .append(obj) .append("]") .toString()); this.boundObjects.put(name, obj); } public void clear() { this.boundObjects.clear(); } @Override public InitialContextFactory createInitialContextFactory(final Hashtable environment) { if (activated == null && environment != null) { final Object icf = environment.get("java.naming.factory.initial"); if (icf != null) { Class<?> icfClass = null; if (icf instanceof Class<?>) { icfClass = (Class<?>)icf; } else if (icf instanceof String) { icfClass = ClassUtils.resolveClassName((String)icf, getClass().getClassLoader()); } else { throw new IllegalArgumentException(new StringBuilder( "Invalid value type for environment key [java.naming.factory.initial]: ") .append(icf.getClass().getName()).toString()); } if (!InitialContextFactory.class.isAssignableFrom(icfClass)) { throw new IllegalArgumentException( new StringBuilder("Specified class does not implement [") .append(InitialContextFactory.class.getName()).append("]: ").append(icf).toString()); } try { return (InitialContextFactory)icfClass.newInstance(); } catch (final Throwable ex) { final IllegalStateException ise = new IllegalStateException( new StringBuilder("Cannot instantiate specified InitialContextFactory: ").append(icf) .toString()); ise.initCause(ex); throw ise; } } } return new InitialContextFactory() { @Override public Context getInitialContext(final Hashtable environment) { return new SimpleNamingContext("", SimpleNamingContextBuilder.this.boundObjects, environment); } }; } public void deactivate() { Logs.info(this, "Deactivating simple JNDI environment"); activated = null; } } // Messages from Jad: // Overlapped try statements detected. Not all exception handlers will be // resolved in the method activate //