/* * IronJacamar, a Java EE Connector Architecture implementation * Copyright 2015, Red Hat Inc, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the Eclipse Public License 1.0 as * published by the Free Software Foundation. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse * Public License for more details. * * You should have received a copy of the Eclipse Public License * along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.ironjacamar.core.naming; import org.ironjacamar.core.CoreLogger; import java.util.Hashtable; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.naming.spi.ObjectFactory; import org.jboss.logging.Logger; /** * Helper class to create JNDI bindings * @author <a href="mailto:jesper.pedersen@ironjacamar.org">Jesper Pedersen</a> */ public class JndiBinder implements ObjectFactory { private static CoreLogger log = Logger.getMessageLogger(CoreLogger.class, JndiBinder.class.getName()); private static boolean trace = log.isTraceEnabled(); private static ConcurrentMap<String, Object> objs = new ConcurrentHashMap<String, Object>(); private String name; private Object obj; private int jndiPort; private String jndiProtocol; private String jndiHost; /** * Constructor */ public JndiBinder() { } /** * Set the name * @param v The value */ public void setName(String v) { this.name = v; } /** * Set the object * @param v The value */ public void setObject(Object v) { this.obj = v; } /** * set the jndi port * @param jndiPort the jndi port */ public void setJndiPort(int jndiPort) { this.jndiPort = jndiPort; } /** * set the jndi protocol * @param jndiProtocol the jndi protocol */ public void setJndiProtocol(String jndiProtocol) { this.jndiProtocol = jndiProtocol; } /** * set the jndi host * @param jndiHost the jndi host */ public void setJndiHost(String jndiHost) { this.jndiHost = jndiHost; } /** * Obtain the connection factory * {@inheritDoc} */ public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception { Reference ref = (Reference)obj; String objName = (String)ref.get("name").getContent(); return objs.get(objName); } /** * Bind * @exception Throwable Thrown in case of an error */ public void bind() throws Throwable { if (name == null) throw new IllegalArgumentException("Name is null"); if (obj == null) throw new IllegalArgumentException("Obj is null"); if (trace) log.trace("Binding " + obj.getClass().getName() + " under " + name); Properties properties = new Properties(); properties.setProperty(Context.PROVIDER_URL, jndiProtocol + "://" + jndiHost + ":" + jndiPort); Context context = new InitialContext(properties); try { String className = obj.getClass().getName(); Reference ref = new Reference(className, new StringRefAddr("class", className), JndiBinder.class.getName(), null); ref.add(new StringRefAddr("name", name)); objs.put(name, obj); Util.bind(context, name, ref); if (log.isDebugEnabled()) log.debug("Bound " + obj.getClass().getName() + " under " + name); } finally { if (context != null) { try { context.close(); } catch (NamingException ne) { // Ignore } } } } /** * Unbind * @exception Throwable Thrown in case of an error */ public void unbind() throws Throwable { if (name == null) throw new IllegalArgumentException("Name is null"); if (trace) log.trace("Unbinding " + name); Context context = null; try { Properties properties = new Properties(); properties.setProperty(Context.PROVIDER_URL, jndiProtocol + "://" + jndiHost + ":" + jndiPort); context = new InitialContext(properties); Util.unbind(context, name); objs.remove(name); if (log.isDebugEnabled()) log.debug("Unbound " + name); } catch (Throwable t) { log.exceptionDuringUnbind(t); } finally { if (context != null) { try { context.close(); } catch (NamingException ne) { // Ignore } } } } }