You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2013/06/27 17:36:25 UTC
git commit: CAMEL-6327: camel-netty-http - Working on CBR with xpath
issue.
Updated Branches:
refs/heads/master 682d068b1 -> b0a6db144
CAMEL-6327: camel-netty-http - Working on CBR with xpath issue.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/b0a6db14
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/b0a6db14
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/b0a6db14
Branch: refs/heads/master
Commit: b0a6db144e7162787e635ef596990f40c25cba53
Parents: 682d068
Author: Claus Ibsen <da...@apache.org>
Authored: Thu Jun 27 17:32:59 2013 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Jun 27 17:36:13 2013 +0200
----------------------------------------------------------------------
.../netty/http/DefaultNettyHttpBinding.java | 10 ++-
.../http/NettyChannelBufferStreamCache.java | 88 ++++++++++++++++++++
.../netty/http/NettyHttpConfiguration.java | 9 ++
.../netty/http/NettyHttpConverter.java | 5 +-
.../http/NettyHttpXMLXPathResponseTest.java | 53 ++++++++++++
.../netty/http/NettyHttpXMLXPathTest.java | 8 --
6 files changed, 162 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/b0a6db14/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java
----------------------------------------------------------------------
diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java
index 0a57638..8e7579a 100644
--- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java
+++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java
@@ -75,8 +75,14 @@ public class DefaultNettyHttpBinding implements NettyHttpBinding {
populateCamelHeaders(request, answer.getHeaders(), exchange, configuration);
}
- // keep the body as is, and use type converters
- answer.setBody(request.getContent());
+ if (configuration.isDisableStreamCache()) {
+ // keep the body as is, and use type converters
+ answer.setBody(request.getContent());
+ } else {
+ // turn the body into stream cached
+ NettyChannelBufferStreamCache cache = new NettyChannelBufferStreamCache(request.getContent());
+ answer.setBody(cache);
+ }
return answer;
}
http://git-wip-us.apache.org/repos/asf/camel/blob/b0a6db14/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyChannelBufferStreamCache.java
----------------------------------------------------------------------
diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyChannelBufferStreamCache.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyChannelBufferStreamCache.java
new file mode 100644
index 0000000..c5ee8ba
--- /dev/null
+++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyChannelBufferStreamCache.java
@@ -0,0 +1,88 @@
+/**
+ * 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.netty.http;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.camel.StreamCache;
+import org.apache.camel.util.IOHelper;
+import org.jboss.netty.buffer.ChannelBuffer;
+
+/**
+ * A {@link ChannelBuffer} which is exposed as an {@link InputStream} which makes it very
+ * easy to use by Camel and other Camel components. Also supported is {@link StreamCache}
+ * which allows the data to be re-read for example when doing content based routing with XPath.
+ */
+public final class NettyChannelBufferStreamCache extends InputStream implements StreamCache {
+
+ private final ChannelBuffer buffer;
+
+ public NettyChannelBufferStreamCache(ChannelBuffer buffer) {
+ this.buffer = buffer;
+ buffer.markReaderIndex();
+ }
+
+ @Override
+ public boolean markSupported() {
+ return true;
+ }
+
+ @Override
+ public int read() throws IOException {
+ return buffer.readByte();
+ }
+
+ @Override
+ public int read(byte[] b) throws IOException {
+ return read(b, 0, b.length);
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ // are we at end, then return -1
+ if (buffer.readerIndex() == buffer.capacity()) {
+ return -1;
+ }
+
+ // ensure we don't read more than what we have in the buffer
+ int before = buffer.readerIndex();
+ int max = buffer.capacity() - before;
+ len = Math.min(max, len);
+
+ buffer.readBytes(b, off, len);
+ return buffer.readerIndex() - before;
+ }
+
+ @Override
+ public void reset() {
+ buffer.resetReaderIndex();
+ }
+
+ @Override
+ public void writeTo(OutputStream os) throws IOException {
+ // must remember current index so we can reset back to it after the copy
+ int idx = buffer.readerIndex();
+ try {
+ buffer.resetReaderIndex();
+ IOHelper.copy(this, os);
+ } finally {
+ buffer.readerIndex(idx);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b0a6db14/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
index cc7f154..e2360aa 100644
--- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
+++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
@@ -37,6 +37,7 @@ public class NettyHttpConfiguration extends NettyConfiguration {
private boolean matchOnUriPrefix;
private boolean bridgeEndpoint;
private String path;
+ private boolean disableStreamCache;
public NettyHttpConfiguration() {
// we need sync=true as http is request/reply by nature
@@ -133,4 +134,12 @@ public class NettyHttpConfiguration extends NettyConfiguration {
public void setPath(String path) {
this.path = path;
}
+
+ public boolean isDisableStreamCache() {
+ return disableStreamCache;
+ }
+
+ public void setDisableStreamCache(boolean disableStreamCache) {
+ this.disableStreamCache = disableStreamCache;
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/b0a6db14/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConverter.java
----------------------------------------------------------------------
diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConverter.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConverter.java
index affef68..0722651 100644
--- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConverter.java
+++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConverter.java
@@ -51,7 +51,10 @@ public final class NettyHttpConverter {
msg = exchange.getIn(NettyHttpMessage.class);
}
if (msg != null && msg.getBody() == value) {
- return msg.getHttpRequest();
+ // ensure the http request content is reset so we can read all the content out-of-the-box
+ HttpRequest request = msg.getHttpRequest();
+ request.getContent().resetReaderIndex();
+ return request;
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/b0a6db14/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpXMLXPathResponseTest.java
----------------------------------------------------------------------
diff --git a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpXMLXPathResponseTest.java b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpXMLXPathResponseTest.java
new file mode 100644
index 0000000..80dc732
--- /dev/null
+++ b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpXMLXPathResponseTest.java
@@ -0,0 +1,53 @@
+/**
+ * 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.netty.http;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class NettyHttpXMLXPathResponseTest extends BaseNettyTest {
+
+ @Test
+ public void testHttpXML() throws Exception {
+ String out = template.requestBody("netty-http:http://localhost:{{port}}/foo", "<person><name>Claus</name></person>", String.class);
+ assertEquals("<name>Claus</name>", out);
+
+ out = template.requestBody("netty-http:http://localhost:{{port}}/foo", "<person><name>James</name></person>", String.class);
+ assertEquals("James", out);
+
+ out = template.requestBody("netty-http:http://localhost:{{port}}/foo", "<person><name>Jonathan</name></person>", String.class);
+ assertEquals("Dont understand <person><name>Jonathan</name></person>", out);
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("netty-http:http://0.0.0.0:{{port}}/foo")
+ .choice()
+ .when().xpath("/person/name = 'Claus'")
+ .transform(xpath("/person/name"))
+ .when().xpath("/person/name = 'James'")
+ .transform(xpath("/person/name/text()"))
+ .otherwise()
+ .transform(simple("Dont understand ${body}"));
+ }
+ };
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b0a6db14/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpXMLXPathTest.java
----------------------------------------------------------------------
diff --git a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpXMLXPathTest.java b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpXMLXPathTest.java
index 4d433e5..f0d660e 100644
--- a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpXMLXPathTest.java
+++ b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpXMLXPathTest.java
@@ -16,17 +16,11 @@
*/
package org.apache.camel.component.netty.http;
-import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.junit.Test;
public class NettyHttpXMLXPathTest extends BaseNettyTest {
- @Override
- protected CamelContext createCamelContext() throws Exception {
- return super.createCamelContext();
- }
-
@Test
public void testHttpXML() throws Exception {
String out = template.requestBody("netty-http:http://localhost:{{port}}/foo", "<person><name>Claus</name></person>", String.class);
@@ -45,8 +39,6 @@ public class NettyHttpXMLXPathTest extends BaseNettyTest {
@Override
public void configure() throws Exception {
from("netty-http:http://0.0.0.0:{{port}}/foo")
- // need to convert to byte[] to have the CBR with xpath working
- .convertBodyTo(byte[].class)
.choice()
.when().xpath("/person/name = 'Claus'")
.transform(constant("<quote>Camel rocks</quote>"))