Author: davsclaus Date: Thu Aug 26 09:22:28 2010 New Revision: 989557 URL: http://svn.apache.org/viewvc?rev=989557&view=rev Log: CAMEL-3021: restlet component now supports using {} placeholders in uri, which gets replaced with headers from Exchange.
Added: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGet2Test.java - copied, changed from r989520, camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerTest.java camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java - copied, changed from r989520, camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerTest.java Removed: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerTest.java Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java?rev=989557&r1=989556&r2=989557&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java (original) +++ camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java Thu Aug 26 09:22:28 2010 @@ -16,6 +16,10 @@ */ package org.apache.camel.component.restlet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.camel.CamelExchangeException; import org.apache.camel.Exchange; import org.apache.camel.impl.DefaultProducer; import org.apache.commons.logging.Log; @@ -32,6 +36,7 @@ import org.restlet.data.Response; */ public class RestletProducer extends DefaultProducer { private static final Log LOG = LogFactory.getLog(RestletProducer.class); + private static final Pattern PATTERN = Pattern.compile("\\{([\\w\\.]*)\\}"); private Client client; public RestletProducer(RestletEndpoint endpoint) throws Exception { @@ -55,7 +60,7 @@ public class RestletProducer extends Def public void process(Exchange exchange) throws Exception { RestletEndpoint endpoint = (RestletEndpoint)getEndpoint(); - String resourceUri = buildUri(endpoint); + String resourceUri = buildUri(endpoint, exchange); Request request = new Request(endpoint.getRestletMethod(), resourceUri); RestletBinding binding = endpoint.getRestletBinding(); @@ -70,9 +75,37 @@ public class RestletProducer extends Def binding.populateExchangeFromRestletResponse(exchange, response); } - private static String buildUri(RestletEndpoint endpoint) { - return endpoint.getProtocol() + "://" + endpoint.getHost() + ":" + private static String buildUri(RestletEndpoint endpoint, Exchange exchange) throws CamelExchangeException { + String uri = endpoint.getProtocol() + "://" + endpoint.getHost() + ":" + endpoint.getPort() + endpoint.getUriPattern(); + + // substitute { } placeholders in uri and use mandatory headers + if (LOG.isTraceEnabled()) { + LOG.trace("Substituting { } placeholders in uri: " + uri); + } + Matcher matcher = PATTERN.matcher(uri); + while (matcher.find()) { + String key = matcher.group(1); + String header = exchange.getIn().getHeader(key, String.class); + // header should be mandatory + if (header == null) { + throw new CamelExchangeException("Header with key: " + key + " not found in Exchange", exchange); + } + + if (LOG.isTraceEnabled()) { + LOG.trace("Replacing: " + matcher.group(0) + " with header value: " + header); + } + + uri = matcher.replaceFirst(header); + // we replaced uri so reset and go again + matcher.reset(uri); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("Using uri: " + uri); + } + + return uri; } } Copied: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGet2Test.java (from r989520, camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGet2Test.java?p2=camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGet2Test.java&p1=camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerTest.java&r1=989520&r2=989557&rev=989557&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerTest.java (original) +++ camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGet2Test.java Thu Aug 26 09:22:28 2010 @@ -16,6 +16,9 @@ */ package org.apache.camel.component.restlet; +import java.util.HashMap; +import java.util.Map; + import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; @@ -25,12 +28,16 @@ import org.junit.Test; /** * @version $Revision$ */ -public class RestletProducerTest extends CamelTestSupport { +public class RestletProducerGet2Test extends CamelTestSupport { @Test - public void testRestletProducer() throws Exception { - String out = template.requestBodyAndHeader("direct:start", "Hello World", "id", 123, String.class); - assertEquals("123;Donald Duck;Hello World", out); + public void testRestletProducerGet2() throws Exception { + Map headers = new HashMap(); + headers.put("id", 123); + headers.put("beverage.beer", "Carlsberg"); + + String out = template.requestBodyAndHeaders("direct:start", null, headers, String.class); + assertEquals("123;Donald Duck;Carlsberg", out); } @Override @@ -38,16 +45,14 @@ public class RestletProducerTest extends return new RouteBuilder() { @Override public void configure() throws Exception { - // TODO: CAMEL-3021: Should support the {id} uri - // from("direct:start").to("restlet:http://localhost:9080/users/{id}/basic?restletMethod=post"); - from("direct:start").to("restlet:http://localhost:9080/users/123/basic?restletMethod=post"); + from("direct:start").to("restlet:http://localhost:9080/users/{id}/like/{beverage.beer}"); - from("restlet:http://localhost:9080/users/{id}/basic?restletMethod=post") + from("restlet:http://localhost:9080/users/{id}/like/{beer}") .process(new Processor() { public void process(Exchange exchange) throws Exception { String id = exchange.getIn().getHeader("id", String.class); - String body = exchange.getIn().getBody(String.class); - exchange.getOut().setBody(id + ";Donald Duck;" + body); + String beer = exchange.getIn().getHeader("beer", String.class); + exchange.getOut().setBody(id + ";Donald Duck;" + beer); } }); } Copied: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java (from r989520, camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java?p2=camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java&p1=camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerTest.java&r1=989520&r2=989557&rev=989557&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerTest.java (original) +++ camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java Thu Aug 26 09:22:28 2010 @@ -25,12 +25,12 @@ import org.junit.Test; /** * @version $Revision$ */ -public class RestletProducerTest extends CamelTestSupport { +public class RestletProducerGetTest extends CamelTestSupport { @Test - public void testRestletProducer() throws Exception { - String out = template.requestBodyAndHeader("direct:start", "Hello World", "id", 123, String.class); - assertEquals("123;Donald Duck;Hello World", out); + public void testRestletProducerGet() throws Exception { + String out = template.requestBodyAndHeader("direct:start", null, "id", 123, String.class); + assertEquals("123;Donald Duck", out); } @Override @@ -38,16 +38,13 @@ public class RestletProducerTest extends return new RouteBuilder() { @Override public void configure() throws Exception { - // TODO: CAMEL-3021: Should support the {id} uri - // from("direct:start").to("restlet:http://localhost:9080/users/{id}/basic?restletMethod=post"); - from("direct:start").to("restlet:http://localhost:9080/users/123/basic?restletMethod=post"); + from("direct:start").to("restlet:http://localhost:9080/users/123/basic"); - from("restlet:http://localhost:9080/users/{id}/basic?restletMethod=post") + from("restlet:http://localhost:9080/users/{id}/basic") .process(new Processor() { public void process(Exchange exchange) throws Exception { String id = exchange.getIn().getHeader("id", String.class); - String body = exchange.getIn().getBody(String.class); - exchange.getOut().setBody(id + ";Donald Duck;" + body); + exchange.getOut().setBody(id + ";Donald Duck"); } }); }