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 2015/10/28 11:22:07 UTC

[1/2] camel git commit: CAMEL-9263: camel-servlet - Allow to configure the context path without leading slash

Repository: camel
Updated Branches:
  refs/heads/camel-2.16.x 0661fdc1c -> 3f84e4a20
  refs/heads/master 2768222c6 -> 6fb6be7f6


CAMEL-9263: camel-servlet - Allow to configure the context path without leading slash


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/6fb6be7f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6fb6be7f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6fb6be7f

Branch: refs/heads/master
Commit: 6fb6be7f61ebe23203d48f16fe06c3e9efbc70da
Parents: 2768222
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Oct 28 11:21:45 2015 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Oct 28 11:22:29 2015 +0100

----------------------------------------------------------------------
 .../component/servlet/ServletComponent.java     | 12 +++++
 .../component/servlet/ServletEndpoint.java      | 18 +++++++-
 .../ExposedServletEndpointURIToJMXTest.java     | 13 +++---
 .../component/servlet/HttpClientRouteTest.java  | 10 ++---
 ...ponentConfigurationAndDocumentationTest.java |  2 +-
 .../servlet/ServletNoSlashNeededTest.java       | 47 ++++++++++++++++++++
 .../component/servlet/ServletSetBodyTest.java   |  2 +-
 .../servlet/ServletTransferExceptionTest.java   |  2 +-
 .../component/servlet/example-camelContext.xml  |  2 +-
 .../src/main/resources/camel-config.xml         |  2 +-
 10 files changed, 92 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
index 5aca6a6..7da4497 100644
--- a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
+++ b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
@@ -33,6 +33,7 @@ import org.apache.camel.spi.RestApiConsumerFactory;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.RestConsumerFactory;
 import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.URISupport;
 import org.apache.camel.util.UnsafeUriCharactersEncoder;
 
@@ -66,6 +67,17 @@ public class ServletComponent extends HttpCommonComponent implements RestConsume
         String httpMethodRestrict = getAndRemoveParameter(parameters, "httpMethodRestrict", String.class);
         HeaderFilterStrategy headerFilterStrategy = resolveAndRemoveReferenceParameter(parameters, "headerFilterStrategy", HeaderFilterStrategy.class);
 
+        // the uri must have a leading slash for the context-path matching to work with servlet, and it can be something people
+        // forget to add and then the servlet consumer cannot match the context-path as would have been expected
+        String scheme = ObjectHelper.before(uri, ":");
+        String after = ObjectHelper.after(uri, ":");
+        // rebuild uri to have exactly one leading slash
+        while (after.startsWith("/")) {
+            after = after.substring(1);
+        }
+        after = "/" + after;
+        uri = scheme + ":" + after;
+
         // restructure uri to be based on the parameters left as we dont want to include the Camel internal options
         URI httpUri = URISupport.createRemainingURI(new URI(UnsafeUriCharactersEncoder.encodeHttpURI(uri)), parameters);
 

http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
index 1e870da..e2d4695 100644
--- a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
+++ b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
@@ -25,13 +25,17 @@ import org.apache.camel.Producer;
 import org.apache.camel.http.common.HttpCommonEndpoint;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 
 @UriEndpoint(scheme = "servlet", extendsScheme = "http", title = "Servlet",
-        syntax = "servlet:servletName", consumerOnly = true, consumerClass = ServletConsumer.class, label = "http")
+        syntax = "servlet:contextPath", consumerOnly = true, consumerClass = ServletConsumer.class, label = "http")
 public class ServletEndpoint extends HttpCommonEndpoint {
 
     @UriPath(label = "consumer") @Metadata(required = "true")
+    private String contextPath;
+
+    @UriParam(label = "consumer", defaultValue = "CamelServlet")
     private String servletName;
 
     public ServletEndpoint() {
@@ -39,6 +43,18 @@ public class ServletEndpoint extends HttpCommonEndpoint {
 
     public ServletEndpoint(String endPointURI, ServletComponent component, URI httpUri) throws URISyntaxException {
         super(endPointURI, component, httpUri);
+        this.contextPath = httpUri.getPath();
+    }
+
+    public String getContextPath() {
+        return contextPath;
+    }
+
+    /**
+     * The context-path to use
+     */
+    public void setContextPath(String contextPath) {
+        this.contextPath = contextPath;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java
index 383b2ea..2935ff4 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java
@@ -34,9 +34,9 @@ public class ExposedServletEndpointURIToJMXTest extends CamelTestSupport {
 
     @Test
     public void exposedEndpointURIShouldContainContextAndOptions() throws Exception {
-        checkServletEndpointURI("\"servlet:///test1\\?matchOnUriPrefix=true\"");
-        checkServletEndpointURI("\"servlet:///test2\\?servletName=test2\"");
-        checkServletEndpointURI("\"servlet:///test3\\?matchOnUriPrefix=true&servletName=test3\"");
+        checkServletEndpointURI("\"servlet:/test1\\?matchOnUriPrefix=true\"");
+        checkServletEndpointURI("\"servlet:/test2\\?servletName=test2\"");
+        checkServletEndpointURI("\"servlet:/test3\\?matchOnUriPrefix=true&servletName=test3\"");
     }
 
     private void checkServletEndpointURI(String servletEndpointURI) throws Exception {
@@ -48,14 +48,13 @@ public class ExposedServletEndpointURIToJMXTest extends CamelTestSupport {
     }
 
     protected RouteBuilder createRouteBuilder() throws Exception {
-
         return new RouteBuilder() {
 
             @Override
             public void configure() throws Exception {
-                from("servlet:///test1?matchOnUriPrefix=true").to("mock:jmx");
-                from("servlet:///test2?servletName=test2").to("mock:jmx");
-                from("servlet:///test3?matchOnUriPrefix=true&servletName=test3").to("mock:jmx");
+                from("servlet:test1?matchOnUriPrefix=true").to("mock:jmx");
+                from("servlet:test2?servletName=test2").to("mock:jmx");
+                from("servlet:test3?matchOnUriPrefix=true&servletName=test3").to("mock:jmx");
             }
 
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java
index b0453c2..aff55c1 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java
@@ -133,7 +133,7 @@ public class HttpClientRouteTest extends ServletCamelRouterTestSupport {
         public void configure() throws Exception {
             errorHandler(noErrorHandler());
             // START SNIPPET: route
-            from("servlet:///hello?matchOnUriPrefix=true").process(new Processor() {
+            from("servlet:hello?matchOnUriPrefix=true").process(new Processor() {
                 public void process(Exchange exchange) throws Exception {
                     String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
                     String path = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
@@ -152,14 +152,14 @@ public class HttpClientRouteTest extends ServletCamelRouterTestSupport {
             });
             // END SNIPPET: route
             
-            from("servlet:///testHttpMethodRestrict?httpMethodRestrict=POST").process(new Processor() {
+            from("servlet:testHttpMethodRestrict?httpMethodRestrict=POST").process(new Processor() {
                 public void process(Exchange exchange) throws Exception {
                     String request = exchange.getIn().getBody(String.class);
                     exchange.getOut().setBody(request);
                 }
             });
 
-            from("servlet:///testConverter?matchOnUriPrefix=true")
+            from("servlet:testConverter?matchOnUriPrefix=true")
                     .convertBodyTo(String.class)
                     .process(new Processor() {
                         public void process(Exchange exchange) throws Exception {
@@ -172,7 +172,7 @@ public class HttpClientRouteTest extends ServletCamelRouterTestSupport {
                         }
                     }).transform(constant("Bye World"));
 
-            from("servlet:///testUnicodeWithStringResponse?matchOnUriPrefix=true")
+            from("servlet:testUnicodeWithStringResponse?matchOnUriPrefix=true")
                     .process(new Processor() {
                         public void process(Exchange exchange) throws Exception {
                             String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
@@ -181,7 +181,7 @@ public class HttpClientRouteTest extends ServletCamelRouterTestSupport {
                     })
                     .transform(constant(UNICODE_TEXT));
 
-            from("servlet:///testUnicodeWithObjectResponse?matchOnUriPrefix=true")
+            from("servlet:testUnicodeWithObjectResponse?matchOnUriPrefix=true")
                     .process(new Processor() {
                         public void process(Exchange exchange) throws Exception {
                             String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);

http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java
index 4843c9f..5c3f020 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java
@@ -31,7 +31,7 @@ public class ServletComponentConfigurationAndDocumentationTest extends CamelTest
     @Test
     public void testComponentConfiguration() throws Exception {
         ServletComponent comp = context.getComponent("servlet", ServletComponent.class);
-        EndpointConfiguration conf = comp.createConfiguration("servlet://foo?servletName=MyServlet&proxyHost=myotherproxy&proxyPort=2345");
+        EndpointConfiguration conf = comp.createConfiguration("servlet:foo?servletName=MyServlet&proxyHost=myotherproxy&proxyPort=2345");
 
         assertEquals("myotherproxy", conf.getParameter("proxyHost"));
         assertEquals("2345", conf.getParameter("proxyPort"));

http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletNoSlashNeededTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletNoSlashNeededTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletNoSlashNeededTest.java
new file mode 100644
index 0000000..246e6bb
--- /dev/null
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletNoSlashNeededTest.java
@@ -0,0 +1,47 @@
+/**
+ * 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.servlet;
+
+import com.meterware.httpunit.GetMethodWebRequest;
+import com.meterware.httpunit.WebRequest;
+import com.meterware.httpunit.WebResponse;
+import com.meterware.servletunit.ServletUnitClient;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class ServletNoSlashNeededTest extends ServletCamelRouterTestSupport {
+
+    @Test
+    public void testNoSlashNeeded() throws Exception {
+        WebRequest req = new GetMethodWebRequest(CONTEXT_URL + "/services/hello");
+        ServletUnitClient client = newClient();
+        WebResponse response = client.getResponse(req);
+
+        assertEquals("The response message is wrong ", "Bye World", response.getText());
+    }
+    
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("servlet:hello")
+                    .setBody().constant("Bye World");
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java
index d0a7023..b28360f 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java
@@ -38,7 +38,7 @@ public class ServletSetBodyTest extends ServletCamelRouterTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("servlet:///hello")
+                from("servlet:/hello")
                     .setBody().constant("Bye World");
             }
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java
index 62a0f06..db91f6c 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java
@@ -53,7 +53,7 @@ public class ServletTransferExceptionTest extends ServletCamelRouterTestSupport
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("servlet:///hello?transferException=true")
+                from("servlet:hello?transferException=true")
                     .throwException(new IllegalArgumentException("Damn"));
             }
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml b/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml
index 13637de..127f213 100644
--- a/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml
+++ b/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml
@@ -26,7 +26,7 @@
    <camelContext id="camel" streamCache="true" xmlns="http://camel.apache.org/schema/spring" >
     <route id="helloRoute">
       <!-- incoming requests from the servlet is routed -->
-      <from uri="servlet:///hello"/>
+      <from uri="servlet:hello"/>
       <choice>
         <when>
           <!-- is there a header with the key name? -->

http://git-wip-us.apache.org/repos/asf/camel/blob/6fb6be7f/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml
----------------------------------------------------------------------
diff --git a/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml b/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml
index cb07609..7e9e9c0 100755
--- a/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml
+++ b/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml
@@ -28,7 +28,7 @@
 
     <route id="helloRoute">
       <!-- incoming requests from the servlet is routed -->
-      <from uri="servlet:///hello"/>
+      <from uri="servlet:hello"/>
       <choice>
         <when>
           <!-- is there a header with the key name? -->


[2/2] camel git commit: CAMEL-9263: camel-servlet - Allow to configure the context path without leading slash

Posted by da...@apache.org.
CAMEL-9263: camel-servlet - Allow to configure the context path without leading slash


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/3f84e4a2
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3f84e4a2
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3f84e4a2

Branch: refs/heads/camel-2.16.x
Commit: 3f84e4a209087bf910b1c0e130cdf7564ee63ef8
Parents: 0661fdc
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Oct 28 11:21:45 2015 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Oct 28 11:24:43 2015 +0100

----------------------------------------------------------------------
 .../component/servlet/ServletComponent.java     | 12 +++++
 .../component/servlet/ServletEndpoint.java      | 18 +++++++-
 .../ExposedServletEndpointURIToJMXTest.java     | 13 +++---
 .../component/servlet/HttpClientRouteTest.java  | 10 ++---
 ...ponentConfigurationAndDocumentationTest.java |  2 +-
 .../servlet/ServletNoSlashNeededTest.java       | 47 ++++++++++++++++++++
 .../component/servlet/ServletSetBodyTest.java   |  2 +-
 .../servlet/ServletTransferExceptionTest.java   |  2 +-
 .../component/servlet/example-camelContext.xml  |  2 +-
 .../src/main/resources/camel-config.xml         |  2 +-
 10 files changed, 92 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
index 5aca6a6..7da4497 100644
--- a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
+++ b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
@@ -33,6 +33,7 @@ import org.apache.camel.spi.RestApiConsumerFactory;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.RestConsumerFactory;
 import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.URISupport;
 import org.apache.camel.util.UnsafeUriCharactersEncoder;
 
@@ -66,6 +67,17 @@ public class ServletComponent extends HttpCommonComponent implements RestConsume
         String httpMethodRestrict = getAndRemoveParameter(parameters, "httpMethodRestrict", String.class);
         HeaderFilterStrategy headerFilterStrategy = resolveAndRemoveReferenceParameter(parameters, "headerFilterStrategy", HeaderFilterStrategy.class);
 
+        // the uri must have a leading slash for the context-path matching to work with servlet, and it can be something people
+        // forget to add and then the servlet consumer cannot match the context-path as would have been expected
+        String scheme = ObjectHelper.before(uri, ":");
+        String after = ObjectHelper.after(uri, ":");
+        // rebuild uri to have exactly one leading slash
+        while (after.startsWith("/")) {
+            after = after.substring(1);
+        }
+        after = "/" + after;
+        uri = scheme + ":" + after;
+
         // restructure uri to be based on the parameters left as we dont want to include the Camel internal options
         URI httpUri = URISupport.createRemainingURI(new URI(UnsafeUriCharactersEncoder.encodeHttpURI(uri)), parameters);
 

http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
index 1e870da..e2d4695 100644
--- a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
+++ b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
@@ -25,13 +25,17 @@ import org.apache.camel.Producer;
 import org.apache.camel.http.common.HttpCommonEndpoint;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 
 @UriEndpoint(scheme = "servlet", extendsScheme = "http", title = "Servlet",
-        syntax = "servlet:servletName", consumerOnly = true, consumerClass = ServletConsumer.class, label = "http")
+        syntax = "servlet:contextPath", consumerOnly = true, consumerClass = ServletConsumer.class, label = "http")
 public class ServletEndpoint extends HttpCommonEndpoint {
 
     @UriPath(label = "consumer") @Metadata(required = "true")
+    private String contextPath;
+
+    @UriParam(label = "consumer", defaultValue = "CamelServlet")
     private String servletName;
 
     public ServletEndpoint() {
@@ -39,6 +43,18 @@ public class ServletEndpoint extends HttpCommonEndpoint {
 
     public ServletEndpoint(String endPointURI, ServletComponent component, URI httpUri) throws URISyntaxException {
         super(endPointURI, component, httpUri);
+        this.contextPath = httpUri.getPath();
+    }
+
+    public String getContextPath() {
+        return contextPath;
+    }
+
+    /**
+     * The context-path to use
+     */
+    public void setContextPath(String contextPath) {
+        this.contextPath = contextPath;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java
index 383b2ea..2935ff4 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ExposedServletEndpointURIToJMXTest.java
@@ -34,9 +34,9 @@ public class ExposedServletEndpointURIToJMXTest extends CamelTestSupport {
 
     @Test
     public void exposedEndpointURIShouldContainContextAndOptions() throws Exception {
-        checkServletEndpointURI("\"servlet:///test1\\?matchOnUriPrefix=true\"");
-        checkServletEndpointURI("\"servlet:///test2\\?servletName=test2\"");
-        checkServletEndpointURI("\"servlet:///test3\\?matchOnUriPrefix=true&servletName=test3\"");
+        checkServletEndpointURI("\"servlet:/test1\\?matchOnUriPrefix=true\"");
+        checkServletEndpointURI("\"servlet:/test2\\?servletName=test2\"");
+        checkServletEndpointURI("\"servlet:/test3\\?matchOnUriPrefix=true&servletName=test3\"");
     }
 
     private void checkServletEndpointURI(String servletEndpointURI) throws Exception {
@@ -48,14 +48,13 @@ public class ExposedServletEndpointURIToJMXTest extends CamelTestSupport {
     }
 
     protected RouteBuilder createRouteBuilder() throws Exception {
-
         return new RouteBuilder() {
 
             @Override
             public void configure() throws Exception {
-                from("servlet:///test1?matchOnUriPrefix=true").to("mock:jmx");
-                from("servlet:///test2?servletName=test2").to("mock:jmx");
-                from("servlet:///test3?matchOnUriPrefix=true&servletName=test3").to("mock:jmx");
+                from("servlet:test1?matchOnUriPrefix=true").to("mock:jmx");
+                from("servlet:test2?servletName=test2").to("mock:jmx");
+                from("servlet:test3?matchOnUriPrefix=true&servletName=test3").to("mock:jmx");
             }
 
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java
index b0453c2..aff55c1 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java
@@ -133,7 +133,7 @@ public class HttpClientRouteTest extends ServletCamelRouterTestSupport {
         public void configure() throws Exception {
             errorHandler(noErrorHandler());
             // START SNIPPET: route
-            from("servlet:///hello?matchOnUriPrefix=true").process(new Processor() {
+            from("servlet:hello?matchOnUriPrefix=true").process(new Processor() {
                 public void process(Exchange exchange) throws Exception {
                     String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
                     String path = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
@@ -152,14 +152,14 @@ public class HttpClientRouteTest extends ServletCamelRouterTestSupport {
             });
             // END SNIPPET: route
             
-            from("servlet:///testHttpMethodRestrict?httpMethodRestrict=POST").process(new Processor() {
+            from("servlet:testHttpMethodRestrict?httpMethodRestrict=POST").process(new Processor() {
                 public void process(Exchange exchange) throws Exception {
                     String request = exchange.getIn().getBody(String.class);
                     exchange.getOut().setBody(request);
                 }
             });
 
-            from("servlet:///testConverter?matchOnUriPrefix=true")
+            from("servlet:testConverter?matchOnUriPrefix=true")
                     .convertBodyTo(String.class)
                     .process(new Processor() {
                         public void process(Exchange exchange) throws Exception {
@@ -172,7 +172,7 @@ public class HttpClientRouteTest extends ServletCamelRouterTestSupport {
                         }
                     }).transform(constant("Bye World"));
 
-            from("servlet:///testUnicodeWithStringResponse?matchOnUriPrefix=true")
+            from("servlet:testUnicodeWithStringResponse?matchOnUriPrefix=true")
                     .process(new Processor() {
                         public void process(Exchange exchange) throws Exception {
                             String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
@@ -181,7 +181,7 @@ public class HttpClientRouteTest extends ServletCamelRouterTestSupport {
                     })
                     .transform(constant(UNICODE_TEXT));
 
-            from("servlet:///testUnicodeWithObjectResponse?matchOnUriPrefix=true")
+            from("servlet:testUnicodeWithObjectResponse?matchOnUriPrefix=true")
                     .process(new Processor() {
                         public void process(Exchange exchange) throws Exception {
                             String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);

http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java
index 4843c9f..5c3f020 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletComponentConfigurationAndDocumentationTest.java
@@ -31,7 +31,7 @@ public class ServletComponentConfigurationAndDocumentationTest extends CamelTest
     @Test
     public void testComponentConfiguration() throws Exception {
         ServletComponent comp = context.getComponent("servlet", ServletComponent.class);
-        EndpointConfiguration conf = comp.createConfiguration("servlet://foo?servletName=MyServlet&proxyHost=myotherproxy&proxyPort=2345");
+        EndpointConfiguration conf = comp.createConfiguration("servlet:foo?servletName=MyServlet&proxyHost=myotherproxy&proxyPort=2345");
 
         assertEquals("myotherproxy", conf.getParameter("proxyHost"));
         assertEquals("2345", conf.getParameter("proxyPort"));

http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletNoSlashNeededTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletNoSlashNeededTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletNoSlashNeededTest.java
new file mode 100644
index 0000000..246e6bb
--- /dev/null
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletNoSlashNeededTest.java
@@ -0,0 +1,47 @@
+/**
+ * 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.servlet;
+
+import com.meterware.httpunit.GetMethodWebRequest;
+import com.meterware.httpunit.WebRequest;
+import com.meterware.httpunit.WebResponse;
+import com.meterware.servletunit.ServletUnitClient;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class ServletNoSlashNeededTest extends ServletCamelRouterTestSupport {
+
+    @Test
+    public void testNoSlashNeeded() throws Exception {
+        WebRequest req = new GetMethodWebRequest(CONTEXT_URL + "/services/hello");
+        ServletUnitClient client = newClient();
+        WebResponse response = client.getResponse(req);
+
+        assertEquals("The response message is wrong ", "Bye World", response.getText());
+    }
+    
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("servlet:hello")
+                    .setBody().constant("Bye World");
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java
index d0a7023..b28360f 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletSetBodyTest.java
@@ -38,7 +38,7 @@ public class ServletSetBodyTest extends ServletCamelRouterTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("servlet:///hello")
+                from("servlet:/hello")
                     .setBody().constant("Bye World");
             }
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java
index 62a0f06..db91f6c 100644
--- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java
+++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletTransferExceptionTest.java
@@ -53,7 +53,7 @@ public class ServletTransferExceptionTest extends ServletCamelRouterTestSupport
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("servlet:///hello?transferException=true")
+                from("servlet:hello?transferException=true")
                     .throwException(new IllegalArgumentException("Damn"));
             }
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml b/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml
index 13637de..127f213 100644
--- a/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml
+++ b/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/example-camelContext.xml
@@ -26,7 +26,7 @@
    <camelContext id="camel" streamCache="true" xmlns="http://camel.apache.org/schema/spring" >
     <route id="helloRoute">
       <!-- incoming requests from the servlet is routed -->
-      <from uri="servlet:///hello"/>
+      <from uri="servlet:hello"/>
       <choice>
         <when>
           <!-- is there a header with the key name? -->

http://git-wip-us.apache.org/repos/asf/camel/blob/3f84e4a2/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml
----------------------------------------------------------------------
diff --git a/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml b/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml
index cb07609..7e9e9c0 100755
--- a/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml
+++ b/examples/camel-example-servlet-tomcat/src/main/resources/camel-config.xml
@@ -28,7 +28,7 @@
 
     <route id="helloRoute">
       <!-- incoming requests from the servlet is routed -->
-      <from uri="servlet:///hello"/>
+      <from uri="servlet:hello"/>
       <choice>
         <when>
           <!-- is there a header with the key name? -->