Author: davsclaus
Date: Thu Apr 14 22:05:05 2011
New Revision: 1092531

URL: http://svn.apache.org/viewvc?rev=1092531&view=rev
Log:
CAMEL-2194: camel-restlet producer leverages asynchronous routing engine

Modified:
    
camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java
    
camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.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=1092531&r1=1092530&r2=1092531&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 Apr 14 22:05:05 2011
@@ -21,13 +21,15 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelExchangeException;
 import org.apache.camel.Exchange;
-import org.apache.camel.impl.DefaultProducer;
+import org.apache.camel.impl.DefaultAsyncProducer;
 import org.restlet.Client;
 import org.restlet.Context;
 import org.restlet.Request;
 import org.restlet.Response;
+import org.restlet.Uniform;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,7 +38,7 @@ import org.slf4j.LoggerFactory;
  *
  * @version 
  */
-public class RestletProducer extends DefaultProducer {
+public class RestletProducer extends DefaultAsyncProducer {
     private static final Logger LOG = 
LoggerFactory.getLogger(RestletProducer.class);
     private static final Pattern PATTERN = 
Pattern.compile("\\{([\\w\\.]*)\\}");
     private Client client;
@@ -61,29 +63,46 @@ public class RestletProducer extends Def
         super.doStop();
     }
 
-    public void process(Exchange exchange) throws Exception {
+    @Override
+    public boolean process(final Exchange exchange, final AsyncCallback 
callback) {
         RestletEndpoint endpoint = (RestletEndpoint) getEndpoint();
 
-        String resourceUri = buildUri(endpoint, exchange);
-        Request request = new Request(endpoint.getRestletMethod(), 
resourceUri);
-
-        RestletBinding binding = endpoint.getRestletBinding();
-        binding.populateRestletRequestFromExchange(request, exchange);
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Client sends a request (method: " + request.getMethod() 
+ ", uri: " + resourceUri + ")");
-        }
-
-        Response response = client.handle(request);
-        if (throwException) {
-            if (response != null) {
-                Integer respCode = response.getStatus().getCode();
-                if (respCode > 207) {
-                    throw populateRestletProducerException(exchange, response, 
respCode);
+        final RestletBinding binding = endpoint.getRestletBinding();
+        Request request;
+        try {
+            String resourceUri = buildUri(endpoint, exchange);
+            request = new Request(endpoint.getRestletMethod(), resourceUri);
+            binding.populateRestletRequestFromExchange(request, exchange);
+        } catch (CamelExchangeException e) {
+            // break out in case of exception
+            exchange.setException(e);
+            callback.done(true);
+            return true;
+        }
+
+        // process the request asynchronously
+        LOG.debug("Sending request: {} for exchangeId: {}", request, 
exchange.getExchangeId());
+        client.handle(request, new Uniform() {
+            @Override
+            public void handle(Request request, Response response) {
+                LOG.debug("Received response: {} for exchangeId: {}", 
response, exchange.getExchangeId());
+                try {
+                    if (response != null) {
+                        Integer respCode = response.getStatus().getCode();
+                        if (respCode > 207 && throwException) {
+                            
exchange.setException(populateRestletProducerException(exchange, response, 
respCode));
+                        } else {
+                            
binding.populateExchangeFromRestletResponse(exchange, response);
+                        }
+                    }
+                } catch (Exception e) {
+                    exchange.setException(e);
                 }
+                callback.done(false);
             }
-        }
-        binding.populateExchangeFromRestletResponse(exchange, response);
+        });
+
+        return false;
     }
 
     private static String buildUri(RestletEndpoint endpoint, Exchange 
exchange) throws CamelExchangeException {
@@ -116,15 +135,11 @@ public class RestletProducer extends Def
             }
             uri = addQueryToUri(uri, query);
         }
-        
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Using uri: " + uri);
-        }
 
+        LOG.trace("Using uri: {}", uri);
         return uri;
     }
 
-
     protected static String addQueryToUri(String uri, String query) {
         if (uri == null || uri.length() == 0) {
             return uri;
@@ -139,7 +154,7 @@ public class RestletProducer extends Def
             answer.append(query);
         } else {
             answer.append(uri.substring(0, index));
-            answer.append("?");            
+            answer.append("?");
             answer.append(query);
             String remaining = uri.substring(index + 1);
             if (remaining.length() > 0) {
@@ -148,7 +163,7 @@ public class RestletProducer extends Def
             }
         }
         return answer.toString();
-        
+
     }
 
     protected RestletOperationException 
populateRestletProducerException(Exchange exchange, Response response, int 
responseCode) {

Modified: 
camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java?rev=1092531&r1=1092530&r2=1092531&view=diff
==============================================================================
--- 
camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java
 (original)
+++ 
camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java
 Thu Apr 14 22:05:05 2011
@@ -38,7 +38,7 @@ public class RestletProducerGetTest exte
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                
from("direct:start").to("restlet:http://localhost:9080/users/123/basic";);
+                
from("direct:start").to("restlet:http://localhost:9080/users/123/basic";).to("log:reply");
 
                 from("restlet:http://localhost:9080/users/{id}/basic";)
                     .process(new Processor() {


Reply via email to