[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><jbossesb ...><br/>
* <providers><br/>
* <camel-provider name="..."><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("&", "&");
}
+ 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