/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, 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 GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * 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 GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General 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.jboss.jms.jndi; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NameNotFoundException; import javax.naming.NamingException; import org.jboss.deployment.DeploymentException; import org.jboss.system.ServiceMBeanSupport; /** * A JMX service to load a JMSProviderAdapter and register it. * * @author <a href="mailto:cojonudo14@hotmail.com">Hiram Chirino</a> * @author <a href="mailto:jason@planet57.com">Jason Dillon</a> * @author <a href="mailto:adrian@jboss.com">Adrian Brock</a> * @version $Revision: 81030 $ */ public class JMSProviderLoader extends ServiceMBeanSupport implements JMSProviderLoaderMBean { /** The provider adapter which we are loading. */ protected JMSProviderAdapter providerAdapter; /** The properties */ protected Properties properties; /** The provider name. */ protected String providerName; /** The provider adapter classname. */ protected String providerAdapterClass; /** The factory jndi name. */ protected String factoryRef; /** The queue factory jndi name. */ protected String queueFactoryRef; /** The topic factory jndi name. */ protected String topicFactoryRef; /** The JNDI name to bind the adapter to. */ protected String jndiName; public void setProviderName(String name) { this.providerName = name; } public String getProviderName() { return providerName; } public void setProviderAdapterClass(String clazz) { providerAdapterClass = clazz; } public String getProviderAdapterClass() { return providerAdapterClass; } public void setProperties(final Properties properties) { this.properties = properties; } public Properties getProperties() { return properties; } public void setAdapterJNDIName(final String name) { this.jndiName = name; } public String getAdapterJNDIName() { return jndiName; } public void setFactoryRef(final String newFactoryRef) { factoryRef = newFactoryRef; } public void setQueueFactoryRef(final String newQueueFactoryRef) { queueFactoryRef = newQueueFactoryRef; } public void setTopicFactoryRef(final String newTopicFactoryRef) { topicFactoryRef = newTopicFactoryRef; } public String getFactoryRef() { return factoryRef; } public String getQueueFactoryRef() { return queueFactoryRef; } public String getTopicFactoryRef() { return topicFactoryRef; } public String getName() { return providerName; } protected void startService() throws Exception { // validate the configuration if (queueFactoryRef == null) throw new DeploymentException("missing required attribute: QueueFactoryRef"); if (topicFactoryRef == null) throw new DeploymentException("missing required attribute: TopicFactoryRef"); Class cls = Thread.currentThread().getContextClassLoader().loadClass(providerAdapterClass); providerAdapter = (JMSProviderAdapter) cls.newInstance(); providerAdapter.setName(providerName); providerAdapter.setProperties(properties); providerAdapter.setFactoryRef(factoryRef); providerAdapter.setQueueFactoryRef(queueFactoryRef); providerAdapter.setTopicFactoryRef(topicFactoryRef); InitialContext context = new InitialContext(); try { // Bind in JNDI if (jndiName == null) { String name = providerAdapter.getName(); jndiName = "java:/" + name; } bind(context, jndiName, providerAdapter); log.debug("Bound adapter to " + jndiName); } finally { context.close(); } } protected void stopService() throws Exception { InitialContext context = new InitialContext(); try { // Unbind from JNDI String name = providerAdapter.getName(); String jndiname = "java:/" + name; context.unbind(jndiname); log.debug("unbound adapter " + name + " from " + jndiname); } finally { context.close(); } } private void bind(Context ctx, String name, Object val) throws NamingException { log.debug("attempting to bind " + val + " to " + name); // Bind val to name in ctx, and make sure that all // intermediate contexts exist Name n = ctx.getNameParser("").parse(name); while (n.size() > 1) { String ctxName = n.get(0); try { ctx = (Context) ctx.lookup(ctxName); } catch (NameNotFoundException e) { ctx = ctx.createSubcontext(ctxName); } n = n.getSuffix(1); } ctx.bind(n.get(0), val); } }