You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2013/01/03 11:09:49 UTC
svn commit: r1428260 - in /camel/trunk/components/camel-servletlistener/src:
main/java/org/apache/camel/component/servletlistener/
test/java/org/apache/camel/component/servletlistener/ test/resources/
test/resources/routes/
Author: davsclaus
Date: Thu Jan 3 10:09:48 2013
New Revision: 1428260
URL: http://svn.apache.org/viewvc?rev=1428260&view=rev
Log:
CAMEL-5906: Added new camel-servletlistener component for bootstrapping Camel in web app without using spring etc. Work in progress.
Added:
camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/RoutesFromXmlTest.java (with props)
camel/trunk/components/camel-servletlistener/src/test/resources/myweb2.xml
- copied, changed from r1428215, camel/trunk/components/camel-servletlistener/src/test/resources/myweb.xml
camel/trunk/components/camel-servletlistener/src/test/resources/routes/
camel/trunk/components/camel-servletlistener/src/test/resources/routes/myRoutes.xml (with props)
Modified:
camel/trunk/components/camel-servletlistener/src/main/java/org/apache/camel/component/servletlistener/CamelContextServletListener.java
camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/CamelContextServletListenerTest.java
camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/ServletCamelTestSupport.java
Modified: camel/trunk/components/camel-servletlistener/src/main/java/org/apache/camel/component/servletlistener/CamelContextServletListener.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servletlistener/src/main/java/org/apache/camel/component/servletlistener/CamelContextServletListener.java?rev=1428260&r1=1428259&r2=1428260&view=diff
==============================================================================
--- camel/trunk/components/camel-servletlistener/src/main/java/org/apache/camel/component/servletlistener/CamelContextServletListener.java (original)
+++ camel/trunk/components/camel-servletlistener/src/main/java/org/apache/camel/component/servletlistener/CamelContextServletListener.java Thu Jan 3 10:09:48 2013
@@ -16,6 +16,7 @@
*/
package org.apache.camel.component.servletlistener;
+import java.io.InputStream;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Locale;
@@ -24,9 +25,14 @@ import javax.naming.NamingException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
+import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.model.RoutesDefinition;
+import org.apache.camel.util.IOHelper;
import org.apache.camel.util.IntrospectionSupport;
import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.ResourceHelper;
import org.apache.camel.util.jndi.JndiContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,6 +57,7 @@ public class CamelContextServletListener
private boolean test;
@Override
+ @SuppressWarnings("unchecked")
public void contextInitialized(ServletContextEvent sce) {
LOG.info("CamelContextServletListener initializing ...");
@@ -82,14 +89,32 @@ public class CamelContextServletListener
}
}
- // get the route builders and add to the CamelContext
- Map<String, RouteBuilder> routeBuilders = extractRouteBuilders(map);
- for (Map.Entry<String, RouteBuilder> entry : routeBuilders.entrySet()) {
- LOG.debug("Adding RouteBuilder {} -> {}", entry.getKey(), entry.getValue());
- try {
- camelContext.addRoutes(entry.getValue());
- } catch (Exception e) {
- throw new RuntimeException("Error adding RouteBuilder " + entry.getKey(), e);
+ // get the routes and add to the CamelContext
+ Map<String, Object> routes = extractRoutes(map);
+ for (Map.Entry<String, Object> entry : routes.entrySet()) {
+ if (entry.getValue() instanceof RouteBuilder) {
+ LOG.debug("Adding route(s) {} -> {}", entry.getKey(), entry.getValue());
+ try {
+ camelContext.addRoutes((RoutesBuilder) entry.getValue());
+ } catch (Exception e) {
+ throw new RuntimeException("Error adding route(s) " + entry.getKey(), e);
+ }
+ } else if (entry.getValue() instanceof RoutesDefinition) {
+ LOG.debug("Adding routes {} -> {}", entry.getKey(), entry.getValue());
+ try {
+ camelContext.addRouteDefinitions(((RoutesDefinition) entry.getValue()).getRoutes());
+ } catch (Exception e) {
+ throw new RuntimeException("Error adding route(s) " + entry.getKey(), e);
+ }
+ } else if (entry.getValue() instanceof RouteDefinition) {
+ LOG.debug("Adding routes {} -> {}", entry.getKey(), entry.getValue());
+ try {
+ camelContext.addRouteDefinition((RouteDefinition) entry.getValue());
+ } catch (Exception e) {
+ throw new RuntimeException("Error adding route(s) " + entry.getKey(), e);
+ }
+ } else {
+ throw new IllegalArgumentException("Unsupported route " + entry.getKey() + " of type: " + entry.getValue().getClass().getName());
}
}
@@ -130,18 +155,29 @@ public class CamelContextServletListener
LOG.info("CamelContextServletListener initialized");
}
- private Map<String, RouteBuilder> extractRouteBuilders(Map<String, Object> map) {
- Map<String, RouteBuilder> routeBuilders = new LinkedHashMap<String, RouteBuilder>();
+ private Map<String, Object> extractRoutes(Map<String, Object> map) {
+ Map<String, Object> routes = new LinkedHashMap<String, Object>();
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getKey().toLowerCase(Locale.UK).startsWith("routebuilder")) {
String value = (String) entry.getValue();
if (ObjectHelper.isNotEmpty(value)) {
- Object target;
+ Object target = null;
if (value.startsWith("#")) {
// a reference lookup in jndi
value = value.substring(1);
target = lookupJndi(jndiContext, value);
+ } else if (ResourceHelper.hasScheme(value)) {
+ InputStream is = null;
+ try {
+ is = ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext.getClassResolver(), value);
+ target = camelContext.loadRoutesDefinition(is);
+ } catch (Exception e) {
+ throw new RuntimeException("Error loading routes from resource: " + value, e);
+ } finally {
+ IOHelper.close(is, entry.getKey(), LOG);
+ }
} else {
+ // assume its a FQN classname for a RouteBuilder class
try {
Class<RouteBuilder> clazz = camelContext.getClassResolver().resolveMandatoryClass(value, RouteBuilder.class);
target = camelContext.getInjector().newInstance(clazz);
@@ -149,22 +185,19 @@ public class CamelContextServletListener
throw new RuntimeException("Error creating RouteBuilder " + value, e);
}
}
- if (target instanceof RouteBuilder) {
- routeBuilders.put(entry.getKey(), (RouteBuilder) target);
- } else {
- throw new IllegalArgumentException("Parameter " + entry.getKey() + " is expected to be a " + RouteBuilder.class.getName()
- + " type but was " + target.getClass().getName() + " type.");
+ if (target != null) {
+ routes.put(entry.getKey(), target);
}
}
}
}
// after adding the route builders we should remove them from the map
- for (String name : routeBuilders.keySet()) {
+ for (String name : routes.keySet()) {
map.remove(name);
}
- return routeBuilders;
+ return routes;
}
private Map<String, Object> extractInitParameters(ServletContextEvent sce) {
Modified: camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/CamelContextServletListenerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/CamelContextServletListenerTest.java?rev=1428260&r1=1428259&r2=1428260&view=diff
==============================================================================
--- camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/CamelContextServletListenerTest.java (original)
+++ camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/CamelContextServletListenerTest.java Thu Jan 3 10:09:48 2013
@@ -26,6 +26,10 @@ import org.junit.Test;
*/
public class CamelContextServletListenerTest extends ServletCamelTestSupport {
+ protected String getConfiguration() {
+ return "/myweb.xml";
+ }
+
@Test
public void testCamelContext() throws Exception {
CamelContext context = getCamelContext();
@@ -43,4 +47,5 @@ public class CamelContextServletListener
mock.assertIsSatisfied();
template.stop();
}
+
}
Added: camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/RoutesFromXmlTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/RoutesFromXmlTest.java?rev=1428260&view=auto
==============================================================================
--- camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/RoutesFromXmlTest.java (added)
+++ camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/RoutesFromXmlTest.java Thu Jan 3 10:09:48 2013
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.servletlistener;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class RoutesFromXmlTest extends ServletCamelTestSupport {
+
+ protected String getConfiguration() {
+ return "/myweb2.xml";
+ }
+
+ @Test
+ public void testRoutes() throws Exception {
+ CamelContext context = getCamelContext();
+ assertNotNull(context);
+
+ assertEquals("MyCamel", context.getName());
+ assertEquals(2, context.getRoutes().size());
+
+ ProducerTemplate template = context.createProducerTemplate();
+
+ MockEndpoint mock = context.getEndpoint("mock:foo", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ MockEndpoint mock2 = context.getEndpoint("mock:bar", MockEndpoint.class);
+ mock2.expectedMessageCount(1);
+
+ template.sendBody("direct:foo", "Hello World");
+ template.sendBody("direct:bar", "Bye World");
+
+ mock.assertIsSatisfied();
+ mock2.assertIsSatisfied();
+
+ template.stop();
+ }
+
+}
Propchange: camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/RoutesFromXmlTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/RoutesFromXmlTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/ServletCamelTestSupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/ServletCamelTestSupport.java?rev=1428260&r1=1428259&r2=1428260&view=diff
==============================================================================
--- camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/ServletCamelTestSupport.java (original)
+++ camel/trunk/components/camel-servletlistener/src/test/java/org/apache/camel/component/servletlistener/ServletCamelTestSupport.java Thu Jan 3 10:09:48 2013
@@ -25,9 +25,9 @@ import org.junit.After;
import org.junit.Before;
/**
- *
+ * Base class for unit testing.
*/
-public class ServletCamelTestSupport extends TestSupport {
+public abstract class ServletCamelTestSupport extends TestSupport {
public static final String CONTEXT = "/mycontext";
public static final String CONTEXT_URL = "http://localhost/mycontext";
protected ServletRunner sr;
@@ -51,9 +51,7 @@ public class ServletCamelTestSupport ext
/**
* @return The web.xml to use for testing.
*/
- protected String getConfiguration() {
- return "/myweb.xml";
- }
+ protected abstract String getConfiguration();
protected ServletCamelContext getCamelContext() {
return CamelContextServletListener.instance;
Copied: camel/trunk/components/camel-servletlistener/src/test/resources/myweb2.xml (from r1428215, camel/trunk/components/camel-servletlistener/src/test/resources/myweb.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servletlistener/src/test/resources/myweb2.xml?p2=camel/trunk/components/camel-servletlistener/src/test/resources/myweb2.xml&p1=camel/trunk/components/camel-servletlistener/src/test/resources/myweb.xml&r1=1428215&r2=1428260&rev=1428260&view=diff
==============================================================================
--- camel/trunk/components/camel-servletlistener/src/test/resources/myweb.xml (original)
+++ camel/trunk/components/camel-servletlistener/src/test/resources/myweb2.xml Thu Jan 3 10:09:48 2013
@@ -41,7 +41,8 @@
<!-- Camel will pickup any parameter names that start with routeBuilder (case ignored) -->
<context-param>
<param-name>routeBuilder-MyRoute</param-name>
- <param-value>org.apache.camel.component.servletlistener.MyRoute</param-value>
+ <!-- define the routes as a resource from the classpath by prefixing the value with classpath: -->
+ <param-value>classpath:routes/myRoutes.xml</param-value>
</context-param>
<listener>
Added: camel/trunk/components/camel-servletlistener/src/test/resources/routes/myRoutes.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servletlistener/src/test/resources/routes/myRoutes.xml?rev=1428260&view=auto
==============================================================================
--- camel/trunk/components/camel-servletlistener/src/test/resources/routes/myRoutes.xml (added)
+++ camel/trunk/components/camel-servletlistener/src/test/resources/routes/myRoutes.xml Thu Jan 3 10:09:48 2013
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<routes xmlns="http://camel.apache.org/schema/spring">
+
+ <route id="foo">
+ <from uri="direct:foo"/>
+ <to uri="mock:foo"/>
+ </route>
+
+ <route id="bar">
+ <from uri="direct:bar"/>
+ <to uri="mock:bar"/>
+ </route>
+
+</routes>
Propchange: camel/trunk/components/camel-servletlistener/src/test/resources/routes/myRoutes.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: camel/trunk/components/camel-servletlistener/src/test/resources/routes/myRoutes.xml
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: camel/trunk/components/camel-servletlistener/src/test/resources/routes/myRoutes.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml