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