http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormTest.java
new file mode 100644
index 0000000..7c81101
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormTest.java
@@ -0,0 +1,115 @@
+/**
+ * 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.jetty;
+
+import java.io.File;
+
+import javax.activation.DataHandler;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.RequestEntity;
+import org.apache.commons.httpclient.methods.multipart.FilePart;
+import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
+import org.apache.commons.httpclient.methods.multipart.Part;
+import org.apache.commons.httpclient.methods.multipart.StringPart;
+import org.apache.commons.httpclient.params.HttpMethodParams;
+import org.junit.Test;
+
+public class MultiPartFormTest extends BaseJettyTest {
+    private RequestEntity createMultipartRequestEntity() throws Exception {
+        File file = new File("src/main/resources/META-INF/NOTICE.txt");
+
+        Part[] parts = {new StringPart("comment", "A binary file of some 
kind"),
+                        new FilePart(file.getName(), file)};
+
+        return new MultipartRequestEntity(parts, new HttpMethodParams());
+
+    }
+
+    @Test
+    public void testSendMultiPartForm() throws Exception {
+        HttpClient httpclient = new HttpClient();
+
+        PostMethod httppost = new PostMethod("http://localhost:"; + getPort() + 
"/test");
+        
+        httppost.setRequestEntity(createMultipartRequestEntity());
+
+        int status = httpclient.executeMethod(httppost);
+
+        assertEquals("Get a wrong response status", 200, status);
+        String result = httppost.getResponseBodyAsString();
+
+        assertEquals("Get a wrong result", "A binary file of some kind", 
result);
+
+    }
+
+    @Test
+    public void testSendMultiPartFormFromCamelHttpComponnent() throws 
Exception {
+        String result = template.requestBody("http://localhost:"; + getPort() + 
"/test", createMultipartRequestEntity(), String.class);
+        assertEquals("Get a wrong result", "A binary file of some kind", 
result);
+    }
+
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                // START SNIPPET: e1
+                // Set the jetty temp directory which store the file for multi
+                // part form
+                // camel-jetty will clean up the file after it handled the
+                // request.
+                // The option works rightly from Camel 2.4.0
+                getContext().getProperties().put("CamelJettyTempDir", 
"target");
+
+                from("jetty://http://localhost:{{port}}/test";).process(new 
Processor() {
+
+                    public void process(Exchange exchange) throws Exception {
+                        Message in = exchange.getIn();
+                        assertEquals("Get a wrong attachement size", 1, 
in.getAttachments().size());
+                        // The file name is attachment id
+                        DataHandler data = in.getAttachment("NOTICE.txt");
+
+                        assertNotNull("Should get the DataHandle NOTICE.txt", 
data);
+                        // This assert is wrong, but the correct content-type
+                        // (application/octet-stream)
+                        // will not be returned until Jetty makes it available 
-
+                        // currently the content-type
+                        // returned is just the default for FileDataHandler 
(for
+                        // the implentation being used)
+                        // assertEquals("Get a wrong content type",
+                        // "text/plain", data.getContentType());
+                        assertEquals("Got the wrong name", "NOTICE.txt", 
data.getName());
+
+                        assertTrue("We should get the data from the 
DataHandle", data.getDataSource()
+                            .getInputStream().available() > 0);
+
+                        // The other form date can be get from the message
+                        // header
+                        exchange.getOut().setBody(in.getHeader("comment"));
+                    }
+
+                });
+                // END SNIPPET: e1
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java
new file mode 100644
index 0000000..846f8df
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java
@@ -0,0 +1,152 @@
+/**
+ * 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.jetty;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.activation.DataHandler;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.multipart.FilePart;
+import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
+import org.apache.commons.httpclient.methods.multipart.Part;
+import org.apache.commons.httpclient.methods.multipart.StringPart;
+import org.eclipse.jetty.servlets.MultiPartFilter;
+import org.junit.Test;
+
+public class MultiPartFormWithCustomFilterTest extends BaseJettyTest {
+
+    private static class MyMultipartFilter extends MultiPartFilter {
+        @Override
+        public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain) throws IOException, ServletException {            
+            // set a marker attribute to show that this filter class was used
+            ((HttpServletResponse)response).addHeader("MyMultipartFilter", 
"true");
+            
+            super.doFilter(request, response, chain);
+        }        
+    }
+
+    @Test
+    public void testSendMultiPartForm() throws Exception {
+        HttpClient httpclient = new HttpClient();
+        File file = new File("src/main/resources/META-INF/NOTICE.txt");
+        PostMethod httppost = new PostMethod("http://localhost:"; + getPort() + 
"/test");
+        Part[] parts = {
+            new StringPart("comment", "A binary file of some kind"),
+            new FilePart(file.getName(), file)
+        };
+
+        MultipartRequestEntity reqEntity = new MultipartRequestEntity(parts, 
httppost.getParams());
+        httppost.setRequestEntity(reqEntity);
+
+        int status = httpclient.executeMethod(httppost);
+
+        assertEquals("Get a wrong response status", 200, status);
+
+        String result = httppost.getResponseBodyAsString();
+        assertEquals("Get a wrong result", "A binary file of some kind", 
result);
+        assertNotNull("Did not use custom multipart filter", 
httppost.getResponseHeader("MyMultipartFilter"));
+    }
+    
+    @Test
+    public void testSendMultiPartFormOverrideEnableMultpartFilterFalse() 
throws Exception {
+        HttpClient httpclient = new HttpClient();
+
+        File file = new File("src/main/resources/META-INF/NOTICE.txt");
+
+        PostMethod httppost = new PostMethod("http://localhost:"; + getPort() + 
"/test2");
+        Part[] parts = {
+            new StringPart("comment", "A binary file of some kind"),
+            new FilePart(file.getName(), file)
+        };
+
+        MultipartRequestEntity reqEntity = new MultipartRequestEntity(parts, 
httppost.getParams());
+        httppost.setRequestEntity(reqEntity);
+
+        int status = httpclient.executeMethod(httppost);
+
+        assertEquals("Get a wrong response status", 200, status);
+        assertNotNull("Did not use custom multipart filter", 
httppost.getResponseHeader("MyMultipartFilter"));
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("myMultipartFilter", new MyMultipartFilter());
+        return jndi;
+    }
+    
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                // START SNIPPET: e1
+                // Set the jetty temp directory which store the file for multi 
part form
+                // camel-jetty will clean up the file after it handled the 
request.
+                // The option works rightly from Camel 2.4.0
+                getContext().getProperties().put("CamelJettyTempDir", 
"target");
+                
+                
from("jetty://http://localhost:{{port}}/test?multipartFilterRef=myMultipartFilter";).process(new
 Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        Message in = exchange.getIn();
+                        assertEquals("Get a wrong attachement size", 1, 
in.getAttachments().size());
+                        // The file name is attachment id
+                        DataHandler data = in.getAttachment("NOTICE.txt");
+
+                        assertNotNull("Should get the DataHandle NOTICE.txt", 
data);
+                        // This assert is wrong, but the correct content-type 
(application/octet-stream)
+                        // will not be returned until Jetty makes it available 
- currently the content-type
+                        // returned is just the default for FileDataHandler 
(for the implentation being used)
+                        //assertEquals("Get a wrong content type", 
"text/plain", data.getContentType());
+                        assertEquals("Got the wrong name", "NOTICE.txt", 
data.getName());
+
+                        assertTrue("We should get the data from the 
DataHandle", data.getDataSource()
+                            .getInputStream().available() > 0);
+
+                        // The other form date can be get from the message 
header
+                        exchange.getOut().setBody(in.getHeader("comment"));
+                    }
+                });
+                // END SNIPPET: e1
+
+                // Test to ensure that setting a multipartFilterRef overrides 
the enableMultipartFilter=false parameter
+                
from("jetty://http://localhost:{{port}}/test2?multipartFilterRef=myMultipartFilter&enableMultipartFilter=false";).process(new
 Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        Message in = exchange.getIn();
+                        assertEquals("Get a wrong attachement size", 1, 
in.getAttachments().size());
+                        DataHandler data = in.getAttachment("NOTICE.txt");
+
+                        assertNotNull("Should get the DataHandle NOTICE.txt", 
data);
+                        // The other form date can be get from the message 
header
+                        exchange.getOut().setBody(in.getHeader("comment"));
+                    }
+                });
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiThreadedHttpGetTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiThreadedHttpGetTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiThreadedHttpGetTest.java
new file mode 100644
index 0000000..d1f77db
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiThreadedHttpGetTest.java
@@ -0,0 +1,120 @@
+/**
+ * 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.jetty;
+
+import java.io.InputStream;
+import java.util.List;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.http.HttpComponent;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.commons.httpclient.HttpConnectionManager;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+public class MultiThreadedHttpGetTest extends BaseJettyTest {
+
+    @Test
+    public void testHttpGetWithConversion() throws Exception {
+
+        // In this scenario response stream is converted to String
+        // so the stream has to be read to the end. When this happens
+        // the associated connection is released automatically.
+
+        String endpointName = "seda:withConversion?concurrentConsumers=5";
+        sendMessagesTo(endpointName, 5);
+    }
+
+    @Test
+    public void testHttpGetWithoutConversion() throws Exception {
+
+        // This is needed as by default there are 2 parallel
+        // connections to some host and there is nothing that
+        // closes the http connection here.
+        // Need to set the httpConnectionManager 
+        HttpConnectionManager httpConnectionManager = new 
MultiThreadedHttpConnectionManager();
+        httpConnectionManager.getParams().setDefaultMaxConnectionsPerHost(5);
+        context.getComponent("http", 
HttpComponent.class).setHttpConnectionManager(httpConnectionManager);
+       
+
+        String endpointName = "seda:withoutConversion?concurrentConsumers=5";
+        sendMessagesTo(endpointName, 5);
+    }
+
+    @Test
+    public void testHttpGetWithExplicitStreamClose() throws Exception {
+
+        // We close connections explicitely at the very end of the flow
+        // (camel doesn't know when the stream is not needed any more)
+
+        MockEndpoint mockEndpoint = resolveMandatoryEndpoint("mock:results", 
MockEndpoint.class);
+
+        for (int i = 0; i < 5; i++) {
+            mockEndpoint.expectedMessageCount(1);
+            template.sendBody("seda:withoutConversion?concurrentConsumers=5", 
null);
+            mockEndpoint.assertIsSatisfied();
+            Object response = 
mockEndpoint.getReceivedExchanges().get(0).getIn().getBody();
+            InputStream responseStream = assertIsInstanceOf(InputStream.class, 
response);
+            responseStream.close();
+            mockEndpoint.reset();
+        }
+    }
+
+    protected void sendMessagesTo(String endpointName, int count) throws 
InterruptedException {
+        MockEndpoint mockEndpoint = resolveMandatoryEndpoint("mock:results", 
MockEndpoint.class);
+        mockEndpoint.expectedMessageCount(count);
+
+        for (int i = 0; i < count; i++) {
+            template.sendBody(endpointName, null);
+        }
+
+        mockEndpoint.assertIsSatisfied();
+        List<Exchange> list = mockEndpoint.getReceivedExchanges();
+        for (Exchange exchange : list) {
+            String body = exchange.getIn().getBody(String.class);
+
+            log.debug("Body: " + body);
+            assertNotNull("Should have a body!", body);
+            assertTrue("body should contain: <html", body.contains("<html"));
+        }
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                
from("seda:withConversion?concurrentConsumers=5").to("http://localhost:{{port}}/search";)
+                        .convertBodyTo(String.class).to("mock:results");
+
+                
from("seda:withoutConversion?concurrentConsumers=5").to("http://localhost:{{port}}/search";)
+                        .to("mock:results");
+
+                from("jetty:http://localhost:{{port}}/search";).process(new 
Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        exchange.getOut().setBody("<html>Bye World</html>");
+                    }
+                });
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MyErrorHandler.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MyErrorHandler.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MyErrorHandler.java
new file mode 100644
index 0000000..917ae35
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MyErrorHandler.java
@@ -0,0 +1,42 @@
+/**
+ * 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.jetty;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.eclipse.jetty.server.handler.ErrorHandler;
+
+public class MyErrorHandler extends ErrorHandler {
+    
+    protected void writeErrorPageBody(HttpServletRequest request, Writer 
writer, int code, String message, boolean showStacks)
+        throws IOException {
+        String uri = request.getRequestURI();
+        
+        writeErrorPageMessage(request, writer, code, message, uri);
+        if (showStacks) {
+            writeErrorPageStacks(request, writer);
+        }
+        writer.write("<hr /><i><small>MyErrorHandler</small></i>");
+        for (int i = 0; i < 20; i++) {
+            writer.write("<br/>                                                
\n");
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MyUrlRewrite.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MyUrlRewrite.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MyUrlRewrite.java
new file mode 100644
index 0000000..8ca31d4
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MyUrlRewrite.java
@@ -0,0 +1,31 @@
+/**
+ * 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.jetty;
+
+import org.apache.camel.Producer;
+import org.apache.camel.component.http.UrlRewrite;
+
+/**
+ *
+ */
+public class MyUrlRewrite implements UrlRewrite {
+
+    @Override
+    public String rewrite(String url, String relativeUrl, Producer producer) {
+        return url.replaceAll("foo", "bar");
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SimpleJettyChunkedFalseTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SimpleJettyChunkedFalseTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SimpleJettyChunkedFalseTest.java
new file mode 100644
index 0000000..56114d2
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SimpleJettyChunkedFalseTest.java
@@ -0,0 +1,40 @@
+/**
+ * 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.jetty;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class SimpleJettyChunkedFalseTest extends BaseJettyTest {
+
+    @Test
+    public void testSimple() throws Exception {
+        String result = 
template.requestBody("http://localhost:{{port}}/myapp";, "Camel", String.class);
+        assertEquals("Hello Camel", result);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("jetty:http://localhost:{{port}}/myapp?chunked=false";)
+                    .transform(body().prepend("Hello "));
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SimpleJettyTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SimpleJettyTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SimpleJettyTest.java
new file mode 100644
index 0000000..aa06352
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SimpleJettyTest.java
@@ -0,0 +1,40 @@
+/**
+ * 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.jetty;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class SimpleJettyTest extends BaseJettyTest {
+
+    @Test
+    public void testSimple() throws Exception {
+        String result = 
template.requestBody("http://localhost:{{port}}/myapp";, "Camel", String.class);
+        assertEquals("Hello Camel", result);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("jetty:http://localhost:{{port}}/myapp";)
+                    .transform(body().prepend("Hello "));
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringHttpsRouteTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringHttpsRouteTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringHttpsRouteTest.java
new file mode 100644
index 0000000..fe4154f
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringHttpsRouteTest.java
@@ -0,0 +1,135 @@
+/**
+ * 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.jetty;
+
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import javax.annotation.Resource;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.test.junit4.TestSupport;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = 
{"/org/apache/camel/component/jetty/jetty-https.xml"})
+public class SpringHttpsRouteTest {
+    private static final String NULL_VALUE_MARKER = 
CamelTestSupport.class.getCanonicalName();
+    protected String expectedBody = "<hello>world!</hello>";
+    protected String pwd = "changeit";
+    protected Properties originalValues = new Properties();
+    protected transient Log log = LogFactory.getLog(TestSupport.class);
+
+    @EndpointInject(uri = "mock:a")
+    MockEndpoint mockEndpoint;
+    
+    @Produce
+    private ProducerTemplate template;
+
+    private Integer port;
+
+    @Before
+    public void setUp() throws Exception {
+        // ensure jsse clients can validate the self signed dummy localhost 
cert, 
+        // use the server keystore as the trust store for these tests
+        URL trustStoreUrl = 
Thread.currentThread().getContextClassLoader().getResource("jsse/localhost.ks");
+        setSystemProp("javax.net.ssl.trustStore", trustStoreUrl.getPath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        restoreSystemProperties();
+    }
+
+    private void setSystemProp(String key, String value) {
+        String originalValue = System.setProperty(key, value);
+        originalValues.put(key, originalValue != null ? originalValue : 
NULL_VALUE_MARKER);
+    }
+
+    private void restoreSystemProperties() {
+        for (Object key : originalValues.keySet()) {
+            Object value = originalValues.get(key);
+            if (NULL_VALUE_MARKER.equals(value)) {
+                System.getProperties().remove(key);
+            } else {
+                System.setProperty((String) key, (String) value);
+            }
+        }
+    }
+
+    @Test
+    public void testEndpoint() throws Exception {
+        mockEndpoint.reset();
+        mockEndpoint.expectedBodiesReceived(expectedBody);
+
+        template.sendBodyAndHeader("https://localhost:"; + port + "/test", 
expectedBody, "Content-Type", "application/xml");
+
+        mockEndpoint.assertIsSatisfied();
+        List<Exchange> list = mockEndpoint.getReceivedExchanges();
+        Exchange exchange = list.get(0);
+        Assert.assertNotNull("exchange", exchange);
+
+        Message in = exchange.getIn();
+        assertNotNull("in", in);
+
+        Map<String, Object> headers = in.getHeaders();
+
+        log.info("Headers: " + headers);
+
+        assertTrue("Should be more than one header but was: " + headers, 
headers.size() > 0);
+    }
+
+    @Test
+    public void testEndpointWithoutHttps() {
+        mockEndpoint.reset();
+        try {
+            template.sendBodyAndHeader("http://localhost:"; + port + "/test", 
expectedBody, "Content-Type", "application/xml");
+            fail("expect exception on access to https endpoint via http");
+        } catch (RuntimeCamelException expected) {
+        }
+        assertTrue("mock endpoint was not called", 
mockEndpoint.getExchanges().isEmpty());
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    @Resource(name = "dynaPort")
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringJettyNoConnectionRedeliveryTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringJettyNoConnectionRedeliveryTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringJettyNoConnectionRedeliveryTest.java
new file mode 100644
index 0000000..3b26744
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringJettyNoConnectionRedeliveryTest.java
@@ -0,0 +1,64 @@
+/**
+ * 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.jetty;
+
+import java.net.ConnectException;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Test;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * @version
+ */
+public class SpringJettyNoConnectionRedeliveryTest extends 
CamelSpringTestSupport {
+
+    @Override
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new 
ClassPathXmlApplicationContext("org/apache/camel/component/jetty/jetty-noconnection-redelivery.xml");
+    }
+
+    @Test
+    public void testConnectionOk() throws Exception {
+        String reply = template.requestBody("direct:start", "World", 
String.class);
+        assertEquals("Bye World", reply);
+    }
+
+    @Test
+    public void testConnectionNotOk() throws Exception {
+        // stop Jetty route so there should not be a connection
+        context.stopRoute("jetty");
+
+        Exchange exchange = template.request("direct:start", new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("Moon");
+            }
+        });
+
+        assertTrue(exchange.isFailed());
+
+        // there should be a connect exception as cause
+        ConnectException ce = exchange.getException(ConnectException.class);
+        assertNotNull(ce);
+
+        assertEquals(true, exchange.getIn().getHeader(Exchange.REDELIVERED));
+        assertEquals(4, 
exchange.getIn().getHeader(Exchange.REDELIVERY_COUNTER));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringJettyNoConnectionTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringJettyNoConnectionTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringJettyNoConnectionTest.java
new file mode 100644
index 0000000..fd5eae0
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/SpringJettyNoConnectionTest.java
@@ -0,0 +1,55 @@
+/**
+ * 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.jetty;
+
+import java.net.ConnectException;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Test;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * @version 
+ */
+public class SpringJettyNoConnectionTest extends CamelSpringTestSupport {
+
+    @Override
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new 
ClassPathXmlApplicationContext("org/apache/camel/component/jetty/jetty-noconnection.xml");
+    }
+
+    @Test
+    public void testConnectionOk() throws Exception {
+        String reply = template.requestBody("direct:start", "World", 
String.class);
+        assertEquals("Bye World", reply);
+    }
+
+    @Test
+    public void testConnectionNotOk() throws Exception {
+        // stop Jetty route so there should not be a connection
+        context.stopRoute("jetty");
+
+        try {
+            template.requestBody("direct:start", "Moon", String.class);
+            fail("Should have thrown an exception");
+        } catch (CamelExecutionException e) {
+            assertIsInstanceOf(ConnectException.class, e.getCause());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/TwoCamelContextWithJettyRouteTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/TwoCamelContextWithJettyRouteTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/TwoCamelContextWithJettyRouteTest.java
new file mode 100644
index 0000000..420ec91
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/TwoCamelContextWithJettyRouteTest.java
@@ -0,0 +1,93 @@
+/**
+ * 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.jetty;
+
+import java.net.ConnectException;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.Test;
+
+public class TwoCamelContextWithJettyRouteTest extends BaseJettyTest {
+
+    private int port1;
+    private int port2;
+
+    @Test
+    public void testTwoServerPorts() throws Exception {
+        // create another camelContext
+        CamelContext contextB = new DefaultCamelContext();
+        contextB.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("jetty://http://localhost:"; + port2 + 
"/myotherapp").process(new Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        String in = exchange.getIn().getBody(String.class);
+                        exchange.getOut().setBody("Hi " + in);
+                    }
+                });
+            }
+        });
+        contextB.start();
+        
+        String reply = template.requestBody("direct:a", "World", String.class);
+        assertEquals("Bye World", reply);
+
+        reply = template.requestBody("direct:b", "Camel", String.class);
+        assertEquals("Hi Camel", reply);
+        
+        contextB.stop();
+        
+        reply = template.requestBody("direct:a", "Earth", String.class);
+        assertEquals("Bye Earth", reply);
+        
+        try {
+            reply = template.requestBody("direct:b", "Moon", String.class);
+            // expert the exception here
+            fail("Expert the exception here");
+        } catch (Exception ex) {
+            assertTrue("Should get the ConnectException", ex.getCause() 
instanceof ConnectException);
+        }
+        
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                port1 = getPort();
+                port2 = getNextPort();
+
+                from("direct:a").to("http://localhost:"; + port1 + "/myapp");
+
+                from("direct:b").to("http://localhost:"; + port2 + 
"/myotherapp");
+
+                from("jetty://http://localhost:"; + port1 + 
"/myapp").process(new Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        String in = exchange.getIn().getBody(String.class);
+                        exchange.getOut().setBody("Bye " + in);
+                    }
+                });
+            }
+        };
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncCBRTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncCBRTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncCBRTest.java
new file mode 100644
index 0000000..e3f41c9
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncCBRTest.java
@@ -0,0 +1,55 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+public class JettyAsyncCBRTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsync() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        String reply = 
template.requestBody("http://localhost:{{port}}/myservice";, "Hello Camel", 
String.class);
+        assertEquals("Bye World", reply);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                from("jetty:http://localhost:{{port}}/myservice";)
+                    .convertBodyTo(String.class)
+                    .choice()
+                        .when(body().contains("Camel"))
+                            .to("async:bye:world")
+                        .end()
+                    .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationDisabledTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationDisabledTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationDisabledTest.java
new file mode 100644
index 0000000..acca758
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationDisabledTest.java
@@ -0,0 +1,51 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+public class JettyAsyncContinuationDisabledTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsyncContinuationDisabled() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        String out = 
template.requestBody("http://localhost:{{port}}/myservice";, null, String.class);
+        assertEquals("Bye World", out);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                
from("jetty:http://localhost:{{port}}/myservice?useContinuation=false";)
+                    .to("async:bye:world")
+                    .to("mock:result");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java
new file mode 100644
index 0000000..023d79c
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java
@@ -0,0 +1,51 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+public class JettyAsyncContinuationTimeoutOkTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsyncTimeoutOk() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        String reply = 
template.requestBody("http://localhost:{{port}}/myservice";, null, String.class);
+        assertEquals("Bye World", reply);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                
from("jetty:http://localhost:{{port}}/myservice?continuationTimeout=3000";)
+                    .to("async:bye:world")
+                    .to("mock:result");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutTest.java
new file mode 100644
index 0000000..91c7535
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutTest.java
@@ -0,0 +1,67 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.http.HttpOperationFailedException;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.apache.camel.util.StopWatch;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+public class JettyAsyncContinuationTimeoutTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsyncTimeout() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        StopWatch watch = new StopWatch();
+        try {
+            template.requestBody("http://localhost:{{port}}/myservice";, null, 
String.class);
+            fail("Should have thrown an exception");
+        } catch (CamelExecutionException e) {
+            log.info("Timeout hit and client got reply with failure status 
code");
+
+            long taken = watch.stop();
+
+            HttpOperationFailedException cause = 
assertIsInstanceOf(HttpOperationFailedException.class, e.getCause());
+            assertEquals(503, cause.getStatusCode());
+
+            // should be approx 3-4 sec.
+            assertTrue("Timeout should occur faster than " + taken, taken < 
4500);
+        }
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                
from("jetty:http://localhost:{{port}}/myservice?continuationTimeout=3000";)
+                    .to("async:bye:world?delay=6000")
+                    .to("mock:result");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncDefaultContinuationTimeoutTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncDefaultContinuationTimeoutTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncDefaultContinuationTimeoutTest.java
new file mode 100644
index 0000000..c85d716
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncDefaultContinuationTimeoutTest.java
@@ -0,0 +1,71 @@
+/**
+ * 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.jetty.async;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.http.HttpOperationFailedException;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.apache.camel.util.StopWatch;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+@Ignore("This test takes a long time to run, so run it manually")
+public class JettyAsyncDefaultContinuationTimeoutTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsyncTimeout() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        StopWatch watch = new StopWatch();
+        try {
+            template.requestBody("http://localhost:{{port}}/myservice";, null, 
String.class);
+            fail("Should have thrown an exception");
+        } catch (CamelExecutionException e) {
+            log.info("Timeout hit and client got reply with failure status 
code");
+
+            long taken = watch.stop();
+
+            HttpOperationFailedException cause = 
assertIsInstanceOf(HttpOperationFailedException.class, e.getCause());
+            assertEquals(503, cause.getStatusCode());
+
+            // should be approx 30-34 sec.
+            assertTrue("Timeout should occur faster than " + taken, taken < 
34000);
+        }
+
+        assertMockEndpointsSatisfied(2, TimeUnit.MINUTES);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                from("jetty:http://localhost:{{port}}/myservice";)
+                    .to("async:bye:world?delay=45s")
+                    .to("mock:result");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncFilterTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncFilterTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncFilterTest.java
new file mode 100644
index 0000000..07614f7
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncFilterTest.java
@@ -0,0 +1,54 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+public class JettyAsyncFilterTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsync() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        String reply = 
template.requestBody("http://localhost:{{port}}/myservice";, "Hello Camel", 
String.class);
+        assertEquals("Bye World", reply);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                from("jetty:http://localhost:{{port}}/myservice";)
+                    .convertBodyTo(String.class)
+                    .filter(body().contains("Camel"))
+                        .to("async:bye:world")
+                    .end()
+                    .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTest.java
new file mode 100644
index 0000000..e082076
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTest.java
@@ -0,0 +1,51 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+public class JettyAsyncTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsync() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        String reply = 
template.requestBody("http://localhost:{{port}}/myservice";, null, String.class);
+        assertEquals("Bye World", reply);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                from("jetty:http://localhost:{{port}}/myservice";)
+                    .to("async:bye:world")
+                    .to("mock:result");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncThrottleTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncThrottleTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncThrottleTest.java
new file mode 100644
index 0000000..890e3dd
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncThrottleTest.java
@@ -0,0 +1,76 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.junit.Test;
+
+/**
+ * CAMEL-4795, there should be no exceptions in the logs (before the fix there 
was a NPE)
+ *
+ * @version
+ */
+public class JettyAsyncThrottleTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsync() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(5);
+
+        template.asyncRequestBody("jetty:http://localhost:{{port}}/myservice";, 
null);
+        template.asyncRequestBody("jetty:http://localhost:{{port}}/myservice";, 
null);
+        template.asyncRequestBody("jetty:http://localhost:{{port}}/myservice";, 
null);
+        template.asyncRequestBody("jetty:http://localhost:{{port}}/myservice";, 
null);
+        template.asyncRequestBody("jetty:http://localhost:{{port}}/myservice";, 
null);
+
+        assertMockEndpointsSatisfied();
+        
+        for (int i = 0; i < 5; i++) {
+            Exchange exchange = 
getMockEndpoint("mock:result").getReceivedExchanges().get(i);
+            log.info("Reply " + exchange);
+        }
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                int port2 = getNextPort();
+                int port3 = getNextPort();
+
+                from("jetty:http://localhost:{{port}}/myservice";)
+                    .removeHeaders("*")
+                    .throttle(2).asyncDelayed()
+                        .loadBalance().failover()
+                            .to("jetty:http://localhost:"; + port2 + "/foo")
+                            .to("jetty:http://localhost:"; + port3 + "/bar")
+                        .end()
+                    .to("mock:result");
+
+                from("jetty:http://localhost:"; + port2 + "/foo")
+                    .transform().constant("foo")
+                    .to("mock:foo");
+
+                from("jetty:http://localhost:"; + port3 + "/bar")
+                    .transform().constant("bar")
+                    .to("mock:bar");
+            }
+        };
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTransformTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTransformTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTransformTest.java
new file mode 100644
index 0000000..7755f36
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTransformTest.java
@@ -0,0 +1,55 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+public class JettyAsyncTransformTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsync() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        String reply = 
template.requestBody("http://localhost:{{port}}/myservice";, null, String.class);
+        assertEquals("Bye World", reply);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                from("jetty:http://localhost:{{port}}/myservice";)
+                    .to("log:foo")
+                    .convertBodyTo(String.class)
+                    .transform(constant("Hello World"))
+                    .to("async:hi:world")
+                    .transform(constant("Bye World"))
+                    .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTryCatchFinallyTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTryCatchFinallyTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTryCatchFinallyTest.java
new file mode 100644
index 0000000..8993de4
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTryCatchFinallyTest.java
@@ -0,0 +1,64 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.junit.Test;
+
+/**
+ * @version 
+ */
+public class JettyAsyncTryCatchFinallyTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsync() throws Exception {
+        getMockEndpoint("mock:try").expectedBodiesReceived("Hello Camel");
+        getMockEndpoint("mock:catch").expectedBodiesReceived("Hello Camel");
+        getMockEndpoint("mock:finally").expectedBodiesReceived("Bye Camel");
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        String reply = 
template.requestBody("http://localhost:{{port}}/myservice";, "Hello Camel", 
String.class);
+        assertEquals("Bye World", reply);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                from("jetty:http://localhost:{{port}}/myservice";)
+                    .convertBodyTo(String.class)
+                    .doTry()
+                        .to("mock:try")
+                        .throwException(new IllegalArgumentException("Damn"))
+                    .doCatch(IllegalArgumentException.class)
+                        .to("mock:catch")
+                        .to("async:bye:camel")
+                    .doFinally()
+                        .to("mock:finally")
+                        .to("async:bye:world")
+                    .end()
+                    .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncComponent.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncComponent.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncComponent.java
new file mode 100644
index 0000000..7daa4d4
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncComponent.java
@@ -0,0 +1,48 @@
+/**
+ * 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.jetty.async;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+
+/**
+ * @version 
+ */
+public class MyAsyncComponent extends DefaultComponent {
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
+        MyAsyncEndpoint answer = new MyAsyncEndpoint(uri, this);
+        answer.setReply(prepareReply(remaining));
+        setProperties(answer, parameters);
+        return answer;
+    }
+
+    private String prepareReply(String value) {
+        // to make URIs valid we make the conventions of using ':' for ' ' and 
+        // capitalize words
+        String[] words = value.split(":");
+        String result = "";
+        for (String word : words) {
+            result += result.isEmpty() ? "" : " ";
+            result += word.substring(0, 1).toUpperCase() + word.substring(1);
+        }
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncEndpoint.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncEndpoint.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncEndpoint.java
new file mode 100644
index 0000000..de729cc
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncEndpoint.java
@@ -0,0 +1,74 @@
+/**
+ * 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.jetty.async;
+
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.impl.DefaultEndpoint;
+
+/**
+ * @version 
+ */
+public class MyAsyncEndpoint extends DefaultEndpoint {
+
+    private String reply;
+    private long delay = 1000;
+    private int failFirstAttempts;
+
+    public MyAsyncEndpoint(String endpointUri, Component component) {
+        super(endpointUri, component);
+    }
+
+    public Producer createProducer() throws Exception {
+        return new MyAsyncProducer(this);
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException("Consumer not supported");
+    }
+
+    public boolean isSingleton() {
+        return false;
+    }
+
+    public String getReply() {
+        return reply;
+    }
+
+    public void setReply(String reply) {
+        this.reply = reply;
+    }
+
+    public long getDelay() {
+        return delay;
+    }
+
+    public void setDelay(long delay) {
+        this.delay = delay;
+    }
+
+    public int getFailFirstAttempts() {
+        return failFirstAttempts;
+    }
+
+    public void setFailFirstAttempts(int failFirstAttempts) {
+        this.failFirstAttempts = failFirstAttempts;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncProducer.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncProducer.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncProducer.java
new file mode 100644
index 0000000..2af5747
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/async/MyAsyncProducer.java
@@ -0,0 +1,75 @@
+/**
+ * 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.jetty.async;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.CamelExchangeException;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultAsyncProducer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @version 
+ */
+public class MyAsyncProducer extends DefaultAsyncProducer {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(MyAsyncProducer.class);
+    private final ExecutorService executor = Executors.newCachedThreadPool();
+    private final AtomicInteger counter = new AtomicInteger();
+
+    public MyAsyncProducer(MyAsyncEndpoint endpoint) {
+        super(endpoint);
+    }
+
+    public MyAsyncEndpoint getEndpoint() {
+        return (MyAsyncEndpoint) super.getEndpoint();
+    }
+
+    public boolean process(final Exchange exchange, final AsyncCallback 
callback) {
+        executor.submit(new Callable<Object>() {
+            public Object call() throws Exception {
+                LOG.info("Simulating a task which takes " + 
getEndpoint().getDelay() + " millis to reply");
+                Thread.sleep(getEndpoint().getDelay());
+
+                int count = counter.incrementAndGet();
+                if (getEndpoint().getFailFirstAttempts() >= count) {
+                    LOG.info("Simulating a failure at attempt " + count);
+                    exchange.setException(new 
CamelExchangeException("Simulated error at attempt " + count, exchange));
+                } else {
+                    String reply = getEndpoint().getReply();
+                    exchange.getOut().setBody(reply);
+                    LOG.info("Setting reply " + reply);
+                }
+
+                LOG.info("Callback done(false)");
+                callback.done(false);
+                return null;
+            }
+        });
+
+        // indicate from this point forward its being routed asynchronously
+        LOG.info("Task submitted, now tell Camel routing engine to that this 
Exchange is being continued asynchronously");
+        return false;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8b2a8877/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/file/JettyFileConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/file/JettyFileConsumerTest.java
 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/file/JettyFileConsumerTest.java
new file mode 100644
index 0000000..5d0ed3e
--- /dev/null
+++ 
b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/file/JettyFileConsumerTest.java
@@ -0,0 +1,108 @@
+/**
+ * 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.jetty.file;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class JettyFileConsumerTest extends BaseJettyTest {
+
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        deleteDirectory("target/binary");
+        deleteDirectory("target/test");
+        super.setUp();
+    }
+
+    private void testingSendingFile(File src) throws Exception {
+        deleteDirectory("target/test");
+        FileInputStream fis = new FileInputStream(src);
+        String response = 
template.requestBody("http://localhost:{{port}}/myapp/myservice";, fis, 
String.class);
+        assertEquals("Response should be OK ", "OK", response);
+        File des = new File("target/test/temp.xml");
+        assertTrue("The uploaded file should exists", des.exists());
+        assertEquals("This two file should have same size", src.length(), 
des.length());
+    }
+
+    @Test
+    public void testSending4K() throws Exception {
+        File src = new File("src/test/resources/log4j.properties");
+        testingSendingFile(src);
+    }
+    
+    @Test
+    @Ignore
+    public void testSending18k() throws Exception {
+        File src = new 
File("src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java");
+        testingSendingFile(src);
+    }
+    
+    @Test
+    public void testSendBinaryFile() throws Exception {
+        deleteDirectory("target/test");
+        File jpg = new File("src/test/resources/java.jpg");
+        String response = 
template.requestBody("http://localhost:{{port}}/myapp/myservice2";, jpg, 
String.class);
+        assertEquals("Response should be OK ", "OK", response);
+        File des = new File("target/test/java.jpg");
+        assertTrue("The uploaded file should exists", des.exists());
+        assertEquals("This two file should have same size", jpg.length(), 
des.length());
+    }
+    
+    @Test
+    public void testSendBinaryFileUsingCamelRoute() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        File jpg = new File("src/test/resources/java.jpg");
+        template.sendBodyAndHeader("file://target/binary", jpg, 
Exchange.FILE_NAME, "java.jpg");
+
+        assertMockEndpointsSatisfied();
+        Thread.sleep(1000);
+
+        File des = new File("target/test/java.jpg");
+        assertTrue("The uploaded file should exists", des.exists());
+        assertEquals("This two file should have same size", jpg.length(), 
des.length());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("jetty:http://localhost:{{port}}/myapp/myservice";)
+                    .to("file://target/test?fileName=temp.xml")
+                    .setBody(constant("OK"));
+                
+                from("jetty:http://localhost:{{port}}/myapp/myservice2";)
+                    .to("log:foo?showAll=true")
+                    .to("file://target/test?fileName=java.jpg")
+                    .setBody(constant("OK"));
+
+                from("file://target/binary?noop=true")
+                    .to("http://localhost:{{port}}/myapp/myservice2";)
+                    .to("mock:result");
+            }
+        };
+    }   
+
+}

Reply via email to