Author: ningjiang
Date: Thu Apr 14 07:48:40 2011
New Revision: 1092034

URL: http://svn.apache.org/viewvc?rev=1092034&view=rev
Log:
CAMEL-3860 cxfrs producer supports to configure the query parameter with the 
Exchange.HTTP_QUERY message header

Modified:
    
camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
    
camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java

Modified: 
camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java?rev=1092034&r1=1092033&r2=1092034&view=diff
==============================================================================
--- 
camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
 (original)
+++ 
camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
 Thu Apr 14 07:48:40 2011
@@ -16,12 +16,15 @@
  */
 package org.apache.camel.component.cxf.jaxrs;
 
+import java.io.UnsupportedEncodingException;
 import java.lang.ref.SoftReference;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.net.URLDecoder;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -33,6 +36,7 @@ import org.apache.camel.Message;
 import org.apache.camel.component.cxf.CxfConstants;
 import org.apache.camel.component.cxf.CxfOperationException;
 import org.apache.camel.component.cxf.util.CxfEndpointUtils;
+import org.apache.camel.converter.IOConverter;
 import org.apache.camel.impl.DefaultProducer;
 import org.apache.camel.util.LRUCache;
 import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean;
@@ -104,6 +108,13 @@ public class CxfRsProducer extends Defau
         // check if there is a query map in the message header
         Map<String, String> maps = 
inMessage.getHeader(CxfConstants.CAMEL_CXF_RS_QUERY_MAP, Map.class);
         if (maps == null) {
+            // Get the map from HTTP_QUERY header
+            String queryString = inMessage.getHeader(Exchange.HTTP_QUERY, 
String.class);
+            if (queryString != null) {
+                maps = getQueryParametersFromQueryString(queryString, 
IOConverter.getCharsetName(exchange));
+            }
+        }
+        if (maps == null) {
             maps = cxfRsEndpoint.getParameters();
         }
         if (maps != null) {
@@ -111,6 +122,10 @@ public class CxfRsProducer extends Defau
                 client.query(entry.getKey(), entry.getValue());
             }
         }
+        String queryString = inMessage.getHeader(Exchange.HTTP_QUERY, 
String.class);
+        if (queryString != null) {
+            
+        }
 
         CxfRsBinding binding = cxfRsEndpoint.getBinding();
 
@@ -202,6 +217,21 @@ public class CxfRsProducer extends Defau
             exchange.getOut().setBody(response);
         }
     }
+    
+    private Map<String, String> getQueryParametersFromQueryString(String 
queryString, String charset) throws UnsupportedEncodingException {
+        Map<String, String> answer  = new LinkedHashMap<String, String>();
+        for (String param : queryString.split("&")) {
+            String[] pair = param.split("=", 2);
+            if (pair.length == 2) {
+                String name = URLDecoder.decode(pair[0], charset);
+                String value = URLDecoder.decode(pair[1], charset);
+                answer.put(name, value);
+            } else {
+                throw new IllegalArgumentException("Invalid parameter, 
expected to be a pair but was " + param);
+            }
+        }
+        return answer;
+    }
 
     private Method findRightMethod(List<Class<?>> resourceClasses, String 
methodName, Class[] parameterTypes) throws NoSuchMethodException {
         Method answer = null;

Modified: 
camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java?rev=1092034&r1=1092033&r2=1092034&view=diff
==============================================================================
--- 
camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java
 (original)
+++ 
camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java
 Thu Apr 14 07:48:40 2011
@@ -65,6 +65,23 @@ public class CxfRsRouterTest extends Cam
         }
     }
     
+
+    @Test
+    public void testGetCustomerWithQuery() throws Exception {      
+        HttpGet get = new 
HttpGet("http://localhost:9000/route/customerservice/customers?id=123";);
+        get.addHeader("Accept" , "application/json");
+        HttpClient httpclient = new DefaultHttpClient();
+
+        try {
+            HttpResponse response = httpclient.execute(get);
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertEquals("{\"Customer\":{\"id\":123,\"name\":\"John\"}}", 
+                         EntityUtils.toString(response.getEntity()));
+        } finally {
+            httpclient.getConnectionManager().shutdown();
+        }
+    }
+    
     @Test
     public void testGetCustomers() throws Exception {      
         HttpGet get = new 
HttpGet("http://localhost:9000/route/customerservice/customers/";);


Reply via email to