package com.revolsys.jndi; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NameNotFoundException; import javax.naming.spi.NamingManager; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.AbstractFactoryBean; import com.revolsys.logging.Logs; public class JndiObjectFactory extends AbstractFactoryBean<Object> { private String beanName; private String jndiUrl; @Override protected Object createInstance() throws Exception { final Hashtable<Object, Object> initialEnvironment = new Hashtable<>(); final String initialFactory = System.getProperty(Context.INITIAL_CONTEXT_FACTORY); final BeanFactory beanFactory = getBeanFactory(); if (initialFactory != null) { initialEnvironment.put(Context.INITIAL_CONTEXT_FACTORY, initialFactory); } Object savedObject; if (initialFactory == null && !NamingManager.hasInitialContextFactoryBuilder()) { final SimpleNamingContextBuilder builder = SimpleNamingContextBuilder .emptyActivatedContextBuilder(); synchronized (this.beanName.intern()) { savedObject = beanFactory.getBean(this.beanName); builder.bind(this.jndiUrl, savedObject); } } else { Context context; if (NamingManager.hasInitialContextFactoryBuilder()) { context = NamingManager.getInitialContext(initialEnvironment); } else { context = new InitialContext(); } try { savedObject = context.lookup(this.jndiUrl); } catch (final NameNotFoundException e) { synchronized (this.beanName.intern()) { savedObject = beanFactory.getBean(this.beanName); try { context.bind(this.jndiUrl, savedObject); } catch (final NameNotFoundException e2) { } } } if (savedObject == null) { synchronized (this.beanName.intern()) { Logs.error(this, "JNDI data source was null " + this.jndiUrl); savedObject = beanFactory.getBean(this.beanName); } } } return null; } public String getBeanName() { return this.beanName; } public String getJndiUrl() { return this.jndiUrl; } @Override public Class<?> getObjectType() { return null; } public void setBeanName(final String beanName) { this.beanName = beanName; } public void setJndiUrl(final String jndiUrl) { this.jndiUrl = jndiUrl; } }