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");
                         }
                     });
             }


Reply via email to