/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.object; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.core.api.lifecycle.InitialisationCallback; import org.mule.runtime.api.lifecycle.InitialisationException; import org.mule.runtime.core.api.object.ObjectFactory; import org.mule.runtime.core.config.i18n.CoreMessages; import java.util.Hashtable; import java.util.Map; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JndiObjectFactory implements ObjectFactory { /** * If true, the object is looked up from JNDI each time create() is called, otherwise it is looked up once and stored locally. * Default value is false. */ private boolean lookupOnEachCall = false; private String objectName; private String initialFactory; private String url; private Map properties; private Context _context; private Object _object; protected final Logger logger = LoggerFactory.getLogger(getClass()); public JndiObjectFactory() { // for IoC only } public JndiObjectFactory(String objectName, String initialFactory, String url) { this(objectName, initialFactory, url, null); } public JndiObjectFactory(String objectName, String initialFactory, String url, Map properties) { this.objectName = objectName; this.initialFactory = initialFactory; this.url = url; this.properties = properties; } public void initialise() throws InitialisationException { if (_context == null) { Hashtable props = new Hashtable(); if (initialFactory != null) { props.put(Context.INITIAL_CONTEXT_FACTORY, initialFactory); } else if (properties == null || !properties.containsKey(Context.INITIAL_CONTEXT_FACTORY)) { throw new InitialisationException(CoreMessages.objectIsNull("jndiInitialFactory"), this); } if (url != null) { props.put(Context.PROVIDER_URL, url); } if (properties != null) { props.putAll(properties); } try { _context = new InitialContext(props); } catch (NamingException e) { throw new InitialisationException(e, this); } } } public void dispose() { if (_context != null) { try { _context.close(); } catch (NamingException e) { logger.error("JNDI Context failed to dispose properly: ", e); } finally { _context = null; } } } public Object getInstance(MuleContext muleContext) throws Exception { if (_object == null || lookupOnEachCall == true) { _object = _context.lookup(objectName); } return _object; } /** {@inheritDoc} */ public Class<?> getObjectClass() { throw new UnsupportedOperationException(); } /////////////////////////////////////////////////////////////////////////////////////////// // Getters and Setters /////////////////////////////////////////////////////////////////////////////////////////// public String getInitialFactory() { return initialFactory; } public void setInitialFactory(String initialFactory) { this.initialFactory = initialFactory; } public boolean isLookupOnEachCall() { return lookupOnEachCall; } public void setLookupOnEachCall(boolean lookupOnEachCall) { this.lookupOnEachCall = lookupOnEachCall; } public String getObjectName() { return objectName; } public void setObjectName(String objectName) { this.objectName = objectName; } public Map getProperties() { return properties; } public void setProperties(Map properties) { this.properties = properties; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Context getContext() { return _context; } protected void setContext(Context context) { this._context = context; } public void addObjectInitialisationCallback(InitialisationCallback callback) { throw new UnsupportedOperationException(); } public boolean isSingleton() { return false; } public boolean isExternallyManagedLifecycle() { return false; } public boolean isAutoWireObject() { return true; } }