[jboss-svn-commits] JBL Code SVN: r35817 - labs/jbossesb/branches/JBESB_4_9_CP/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/camel.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Nov 1 10:19:15 EDT 2010


Author: tfennelly
Date: 2010-11-01 10:19:15 -0400 (Mon, 01 Nov 2010)
New Revision: 35817

Modified:
   labs/jbossesb/branches/JBESB_4_9_CP/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/camel/CamelGateway.java
   labs/jbossesb/branches/JBESB_4_9_CP/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/camel/CamelMessageComposer.java
Log:
https://jira.jboss.org/browse/JBESB-3471
CamelGateway does not support JNDI lookups

Modified: labs/jbossesb/branches/JBESB_4_9_CP/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/camel/CamelGateway.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_9_CP/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/camel/CamelGateway.java	2010-11-01 14:03:56 UTC (rev 35816)
+++ labs/jbossesb/branches/JBESB_4_9_CP/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/camel/CamelGateway.java	2010-11-01 14:19:15 UTC (rev 35817)
@@ -21,33 +21,52 @@
 
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
 
+import javax.jms.ConnectionFactory;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.sql.DataSource;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Unmarshaller;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.NoTypeConversionAvailableException;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.TypeConverter;
 import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.impl.SimpleRegistry;
+import org.apache.camel.impl.DefaultPackageScanClassResolver;
+import org.apache.camel.impl.JndiRegistry;
 import org.apache.camel.model.Constants;
 import org.apache.camel.model.RoutesDefinition;
+import org.apache.camel.spi.PackageScanClassResolver;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.log4j.Logger;
 import org.dom4j.DocumentHelper;
 import org.dom4j.io.OutputFormat;
 import org.dom4j.io.XMLWriter;
 import org.jboss.mx.util.MBeanServerLocator;
 import org.jboss.soa.esb.ConfigurationException;
+import org.jboss.soa.esb.addressing.eprs.JMSEpr;
+import org.jboss.soa.esb.common.Configuration;
 import org.jboss.soa.esb.helpers.ConfigTree;
+import org.jboss.soa.esb.helpers.NamingContextException;
+import org.jboss.soa.esb.helpers.NamingContextPool;
 import org.jboss.soa.esb.listeners.lifecycle.AbstractManagedLifecycle;
 import org.jboss.soa.esb.listeners.lifecycle.ManagedLifecycleException;
+import org.jboss.soa.esb.util.JndiUtil;
 
 /**
  * <p>The CamelGateway leverages Apache Camel's input capabilities, translates the Camel Message to an ESB Message,
  * and invokes the associated ESB Service.</p>
- * 
+ *
  * <p><em>Configuration example:</em></p>
- * 
+ *
  * <p><code>&lt;jbossesb ...&gt;<br/>
  * &nbsp;&nbsp;&lt;providers&gt;<br/>
  * &nbsp;&nbsp;&nbsp;&nbsp;&lt;camel-provider name="..."&gt;<br/>
@@ -70,15 +89,15 @@
  * <p>For more detailed information, please visit this wiki page:<br/>
  * <a href="http://community.jboss.org/wiki/CamelGateway">http://community.jboss.org/wiki/CamelGateway</a><br/>
  * or refer to the Programmer's Guide.</p>
- * 
+ *
  * @author dward at jboss.org
  */
 public class CamelGateway extends AbstractManagedLifecycle {
-	
+
 	public static final String ROUTES = "routes";
-	
+
 	private static final Logger logger = Logger.getLogger(CamelGateway.class);
-	
+
 	private static final boolean isAS4;
 	static {
 		try {
@@ -89,10 +108,12 @@
 			throw new RuntimeException("problem detecting JBoss AS version", t);
 		}
 	}
-	
+
 	private String routesXML = null;
+	private Properties jndiEnvironment = null;
+	private Context jndiContext = null;
 	private CamelContext camelContext = null;
-	
+
 	public CamelGateway(ConfigTree config) throws ConfigurationException {
 		super(config);
 		for (ConfigTree property: config.getChildren("property")) {
@@ -106,17 +127,50 @@
 		} else {
 			routesXML = routesXML.replaceAll("&", "&amp;");
 		}
+		jndiEnvironment = JndiUtil.parseEnvironmentProperties(config);
+		jndiEnvironment.setProperty(Context.PROVIDER_URL, config.getAttribute(JMSEpr.JNDI_URL_TAG, Configuration.getJndiServerURL()));
+		jndiEnvironment.setProperty(Context.INITIAL_CONTEXT_FACTORY, config.getAttribute(JMSEpr.JNDI_CONTEXT_FACTORY_TAG, Configuration.getJndiServerContextFactory()));
+		jndiEnvironment.setProperty(Context.URL_PKG_PREFIXES, config.getAttribute(JMSEpr.JNDI_PKG_PREFIX_TAG, Configuration.getJndiServerPkgPrefix()));
 	}
 
 	@Override
 	protected void doInitialise() throws ManagedLifecycleException {
-		camelContext = new DefaultCamelContext(new SimpleRegistry());
+		try {
+			jndiContext = NamingContextPool.getNamingContext(jndiEnvironment);
+		} catch (NamingContextException nce) {
+			throw new ManagedLifecycleException(nce);
+		}
+		// this allows us to use Camel's property replacement via ref:{{jndiName}} - actually (ref:%7B%7BjndiName%7D%7D)
+		camelContext = new DefaultCamelContext(new JndiRegistry(jndiContext));
+		// we need to disable JMX so we don't depend on Spring classes
 		camelContext.disableJMX();
+		// configure correct classloading
+		PackageScanClassResolver packageScanClassResolver;
 		if (!isAS4) {
 			// JBossESB on AS5+ needs this to handle VFS classloading URIs.
 			// JBossESB on AS4 will not work if we use this.
-			camelContext.setPackageScanClassResolver(new JBossPackageScanClassResolver());
+			packageScanClassResolver = new JBossPackageScanClassResolver();
+			camelContext.setPackageScanClassResolver(packageScanClassResolver);
+		} else {
+			packageScanClassResolver = camelContext.getPackageScanClassResolver();
+			if (packageScanClassResolver == null) {
+				packageScanClassResolver = new DefaultPackageScanClassResolver();
+				camelContext.setPackageScanClassResolver(packageScanClassResolver);
+			}
 		}
+		Set<ClassLoader> classLoaders = new HashSet<ClassLoader>();
+		classLoaders.add(Thread.currentThread().getContextClassLoader());
+		packageScanClassResolver.setClassLoaders(classLoaders);
+		// register JndiTypeConverters
+		Set<Class<?>> jndiTypes = new HashSet<Class<?>>();
+		jndiTypes.add(ConnectionFactory.class);
+		jndiTypes.add(DataSource.class);
+		// TODO: add classes from comma-separated config property for more jndiTypes that get looked up?
+		TypeConverterRegistry typeConverterRegistry = camelContext.getTypeConverterRegistry();
+		TypeConverter jndiTypeConverter = new JndiTypeConverter(jndiContext);
+		for (Class<?> jndiType : jndiTypes) {
+			typeConverterRegistry.addTypeConverter(jndiType, String.class, jndiTypeConverter);
+		}
 		camelContext.addComponent(JBossESBComponent.JBOSSESB, new JBossESBComponent(getConfig()));
 		if (logger.isDebugEnabled()) {
 			try {
@@ -131,8 +185,8 @@
 			}
 		}
 		try {
-			JAXBContext jc = JAXBContext.newInstance(Constants.JAXB_CONTEXT_PACKAGES);
-			Unmarshaller um = jc.createUnmarshaller();
+			JAXBContext jaxbContext = JAXBContext.newInstance(Constants.JAXB_CONTEXT_PACKAGES);
+			Unmarshaller um = jaxbContext.createUnmarshaller();
 			RoutesDefinition rd = (RoutesDefinition)um.unmarshal(new StringReader(routesXML));
 			camelContext.addRouteDefinitions(rd.getRoutes());
 		} catch (Exception e) {
@@ -161,6 +215,51 @@
 	@Override
 	protected void doDestroy() throws ManagedLifecycleException {
 		camelContext = null;
+		if (jndiContext != null) {
+			try {
+				NamingContextPool.releaseNamingContext(jndiContext);
+			} catch (NamingContextException nce) {
+				throw new ManagedLifecycleException(nce);
+			} finally {
+				jndiContext = null;
+			}
+		}
 	}
 
+	private static class JndiTypeConverter implements TypeConverter {
+
+		private Context jndiContext;
+
+		private JndiTypeConverter(Context jndiContext) {
+			this.jndiContext = jndiContext;
+		}
+
+		public <T> T convertTo(Class<T> type, Object value) {
+			if (value instanceof String) {
+				String jndiName = (String)value;
+				Object jndiObject;
+				try {
+					jndiObject = jndiContext.lookup(jndiName);
+				} catch (NamingException ne) {
+					throw new RuntimeCamelException(ne);
+				}
+				return type.cast(jndiObject);
+			}
+			return null;
+		}
+
+		public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
+			return convertTo(type, value);
+		}
+
+		public <T> T mandatoryConvertTo(Class<T> type, Object value) throws NoTypeConversionAvailableException {
+			return convertTo(type, value);
+		}
+
+		public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange, Object value) throws NoTypeConversionAvailableException {
+			return convertTo(type, value);
+		}
+
+	}
+
 }

Modified: labs/jbossesb/branches/JBESB_4_9_CP/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/camel/CamelMessageComposer.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_9_CP/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/camel/CamelMessageComposer.java	2010-11-01 14:03:56 UTC (rev 35816)
+++ labs/jbossesb/branches/JBESB_4_9_CP/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/camel/CamelMessageComposer.java	2010-11-01 14:19:15 UTC (rev 35817)
@@ -19,6 +19,8 @@
  */
 package org.jboss.soa.esb.listeners.gateway.camel;
 
+import static org.jboss.soa.esb.message.MessagePayloadProxy.NullPayloadHandling.NONE;
+
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Map.Entry;
@@ -28,9 +30,11 @@
 import org.apache.camel.impl.MessageSupport;
 import org.jboss.soa.esb.addressing.Call;
 import org.jboss.soa.esb.addressing.eprs.InVMEpr;
+import org.jboss.soa.esb.helpers.ConfigTree;
 import org.jboss.soa.esb.listeners.message.AbstractMessageComposer;
 import org.jboss.soa.esb.listeners.message.MessageDeliverException;
 import org.jboss.soa.esb.message.Message;
+import org.jboss.soa.esb.message.MessagePayloadProxy;
 import org.jboss.soa.esb.message.Properties;
 
 /**
@@ -39,6 +43,27 @@
  * @author dward at jboss.org
  */
 public class CamelMessageComposer<T extends org.apache.camel.Message> extends AbstractMessageComposer<T> {
+	
+	private ConfigTree config = null;
+	private MessagePayloadProxy payloadProxy = null;
+	
+	@Override
+	public ConfigTree getConfiguration() {
+		return config;
+	}
+	
+	@Override
+	public void setConfiguration(ConfigTree config) {
+		this.config = config;
+		payloadProxy = new MessagePayloadProxy(config);
+		payloadProxy.setNullGetPayloadHandling(NONE);
+		payloadProxy.setNullSetPayloadHandling(NONE);
+	}
+	
+	@Override
+	protected MessagePayloadProxy getPayloadProxy() {
+		return payloadProxy;
+	}
 
 	@Override
 	protected void populateMessage(Message esbMessageIn, T camelMessageIn) throws MessageDeliverException {



More information about the jboss-svn-commits mailing list