import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.event.EventContext; import javax.naming.event.NamespaceChangeListener; import javax.naming.event.NamingEvent; import javax.naming.event.NamingExceptionEvent; import javax.naming.spi.ObjectFactory; import net.sf.ehcache.CacheManager; public class CacheManagerFactory implements ObjectFactory { private static final String CONFIGURATION_FILE = "configurationFile"; private static final NamespaceChangeListener SHUTDOWN_LISTENER = new NamespaceChangeListener() { @Override public void namingExceptionThrown(NamingExceptionEvent event) {} @Override public void objectAdded(NamingEvent event) {} @Override public void objectRemoved(NamingEvent event) { Object object = event.getOldBinding().getObject(); if (object instanceof CacheManager) { CacheManager cacheManager = (CacheManager) object; cacheManager.shutdown(); } } @Override public void objectRenamed(NamingEvent event) {} }; @Override public CacheManager getObjectInstance(Object object, Name jndiName, Context context, Hashtable environment) throws Exception { String configurationFile = null; if (object instanceof Reference) { Reference reference = (Reference) object; RefAddr refAddr = reference.get(CONFIGURATION_FILE); if (refAddr != null) { configurationFile = (String) refAddr.getContent(); } } if (context instanceof EventContext) { EventContext eventContext = (EventContext) context; eventContext.addNamingListener(jndiName, EventContext.OBJECT_SCOPE, SHUTDOWN_LISTENER); } return configurationFile == null ? CacheManager.newInstance() : CacheManager.newInstance(configurationFile); } }