You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/01/24 23:44:16 UTC

svn commit: r1063045 - in /cxf/branches/2.3.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ rt/frontend/jaxrs/s...

Author: sergeyb
Date: Mon Jan 24 22:44:16 2011
New Revision: 1063045

URL: http://svn.apache.org/viewvc?rev=1063045&view=rev
Log:
Merged revisions 1063042 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1063042 | sergeyb | 2011-01-24 22:40:53 +0000 (Mon, 24 Jan 2011) | 1 line
  
  [CXF-3274] Better support for Form requests
........

Modified:
    cxf/branches/2.3.x-fixes/   (props changed)
    cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingProvider.java
    cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java
    cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
    cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
    cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
    cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/security/SecureBookStoreNoInterface.java

Propchange: cxf/branches/2.3.x-fixes/
------------------------------------------------------------------------------
    svn:mergeinfo = /cxf/trunk:1063042

Propchange: cxf/branches/2.3.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingProvider.java?rev=1063045&r1=1063044&r2=1063045&view=diff
==============================================================================
--- cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingProvider.java (original)
+++ cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingProvider.java Mon Jan 24 22:44:16 2011
@@ -51,6 +51,8 @@ import org.apache.cxf.jaxrs.utils.Annota
 import org.apache.cxf.jaxrs.utils.FormUtils;
 import org.apache.cxf.jaxrs.utils.HttpUtils;
 import org.apache.cxf.jaxrs.utils.multipart.AttachmentUtils;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.PhaseInterceptorChain;
 
 @Produces({"application/x-www-form-urlencoded", "multipart/form-data" })
 @Consumes({"application/x-www-form-urlencoded", "multipart/form-data" })
@@ -98,6 +100,9 @@ public class FormEncodingProvider implem
             populateMap(params, is, mt,
                         AnnotationUtils.getAnnotation(annotations, Encoded.class) == null);
             validateMap(params);
+            
+            persistParamsOnMessage(params);
+            
             return params;
         } catch (WebApplicationException e) {
             throw e;
@@ -106,6 +111,13 @@ public class FormEncodingProvider implem
         }
     }
 
+    protected void persistParamsOnMessage(MultivaluedMap<String, String> params) {
+        Message message = PhaseInterceptorChain.getCurrentMessage();
+        if (message != null) {
+            message.put(FormUtils.FORM_PARAM_MAP, params);
+        }
+    }
+    
     @SuppressWarnings("unchecked")
     protected MultivaluedMap<String, String> createMap(Class<?> clazz) throws Exception {
         if (clazz == MultivaluedMap.class) {

Modified: cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java?rev=1063045&r1=1063044&r2=1063045&view=diff
==============================================================================
--- cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java (original)
+++ cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java Mon Jan 24 22:44:16 2011
@@ -39,8 +39,9 @@ import org.apache.cxf.jaxrs.ext.multipar
 import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
 
 public final class FormUtils {
-    
-    private static final String FORM_DATA_TYPE = "form-data";  
+
+    public static final String FORM_PARAM_MAP = "org.apache.cxf.form_data";
+    private static final String MULTIPART_FORM_DATA_TYPE = "form-data";  
         
     private FormUtils() {
         
@@ -109,7 +110,7 @@ public final class FormUtils {
         List<Attachment> atts = body.getAllAttachments();
         for (Attachment a : atts) {
             ContentDisposition cd = a.getContentDisposition();
-            if (cd == null || !FORM_DATA_TYPE.equalsIgnoreCase(cd.getType())
+            if (cd == null || !MULTIPART_FORM_DATA_TYPE.equalsIgnoreCase(cd.getType())
                 || cd.getParameter("name") == null) {
                 throw new WebApplicationException(415);
             }

Modified: cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1063045&r1=1063044&r2=1063045&view=diff
==============================================================================
--- cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Mon Jan 24 22:44:16 2011
@@ -110,8 +110,7 @@ public final class JAXRSUtils {
     private static final Logger LOG = LogUtils.getL7dLogger(JAXRSUtils.class);
     private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JAXRSUtils.class);
     private static final String PROPOGATE_EXCEPTION = "org.apache.cxf.propagate.exception";
-    private static final String FORM_PARAM_MAP = JAXRSUtils.class.getName() + ".FORM_DATA";
-
+    
     private JAXRSUtils() {        
     }
     
@@ -689,18 +688,15 @@ public final class JAXRSUtils {
         MediaType mt = mc.getHttpHeaders().getMediaType();
         
         @SuppressWarnings("unchecked")
-        MultivaluedMap<String, String> params = (MultivaluedMap<String, String>)m.get(FORM_PARAM_MAP); 
+        MultivaluedMap<String, String> params = 
+            (MultivaluedMap<String, String>)m.get(FormUtils.FORM_PARAM_MAP); 
         
         if (params == null) {
             params = new MetadataMap<String, String>();
-            m.put(FORM_PARAM_MAP, params);
+            m.put(FormUtils.FORM_PARAM_MAP, params);
         
             if (mt == null || mt.isCompatible(MediaType.APPLICATION_FORM_URLENCODED_TYPE)) {
-                String body = (String)m.get("org.apache.cxf.jaxrs.provider.form.body");
-                if (body == null) {
-                    body = FormUtils.readBody(m.getContent(InputStream.class), mt);
-                    m.put("org.apache.cxf.jaxrs.provider.form.body", body);
-                }
+                String body = FormUtils.readBody(m.getContent(InputStream.class), mt);
                 HttpServletRequest request = (HttpServletRequest)m.get(AbstractHTTPDestination.HTTP_REQUEST);
                 FormUtils.populateMapFromString(params, (String)body, decode, request);
             } else {

Modified: cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java?rev=1063045&r1=1063044&r2=1063045&view=diff
==============================================================================
--- cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java (original)
+++ cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java Mon Jan 24 22:44:16 2011
@@ -43,6 +43,8 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Cookie;
 import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.PathSegment;
 import javax.ws.rs.core.Request;
 import javax.ws.rs.core.SecurityContext;
@@ -341,6 +343,13 @@ public class Customer extends AbstractCu
         // complete
     }
     
+    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    public void testMultivaluedMapAndFormParam(MultivaluedMap<String, String> params,
+                                               @FormParam("p1") String fp1, 
+                                               @FormParam("p2") List<String> fp2) {
+        // complete
+    }
+    
     public void testCookieParam(@CookieParam("c1") String c1,
                                 @CookieParam("c2") @DefaultValue("c2Value") String c2) {
         // complete

Modified: cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=1063045&r1=1063044&r2=1063045&view=diff
==============================================================================
--- cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java (original)
+++ cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Mon Jan 24 22:44:16 2011
@@ -73,6 +73,7 @@ import org.apache.cxf.jaxrs.model.ClassR
 import org.apache.cxf.jaxrs.model.MethodDispatcher;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
 import org.apache.cxf.jaxrs.model.URITemplate;
+import org.apache.cxf.jaxrs.provider.FormEncodingProvider;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.ExchangeImpl;
@@ -1054,6 +1055,47 @@ public class JAXRSUtilsTest extends Asse
         assertEquals("3", list.get(1));
     }
     
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testFormParametersAndMap() throws Exception {
+        Class[] argType = {MultivaluedMap.class, String.class, List.class};
+        Method m = Customer.class.getMethod("testMultivaluedMapAndFormParam", argType);
+        final Message messageImpl = createMessage();
+        String body = "p1=1&p2=2&p2=3";
+        messageImpl.put(Message.REQUEST_URI, "/foo");
+        messageImpl.put("Content-Type", MediaType.APPLICATION_FORM_URLENCODED);
+        messageImpl.setContent(InputStream.class, new ByteArrayInputStream(body.getBytes()));
+        
+        ProviderFactory.getInstance(messageImpl).registerUserProvider(
+            new FormEncodingProvider() {
+                @Override
+                protected void persistParamsOnMessage(MultivaluedMap<String, String> params) {
+                    messageImpl.put(FormUtils.FORM_PARAM_MAP, params);    
+                }
+            });
+        
+        List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null), 
+                                                           new MetadataMap<String, String>(), messageImpl);
+        assertEquals("3 params should've been identified", 3, params.size());
+        
+        MultivaluedMap<String, String> map = (MultivaluedMap<String, String>)params.get(0);
+        assertEquals(2, map.size());
+        assertEquals(1, map.get("p1").size());
+        assertEquals("First map parameter not matched correctly", 
+                     "1", map.getFirst("p1"));
+        assertEquals(2, map.get("p2").size());
+        
+        assertEquals("2", map.get("p2").get(0));
+        assertEquals("3", map.get("p2").get(1));
+        
+        assertEquals("First Form Parameter not matched correctly", 
+                     "1", params.get(1));
+        List<String> list = (List<String>)params.get(2);
+        assertEquals(2, list.size());
+        assertEquals("2", list.get(0));
+        assertEquals("3", list.get(1));
+    }
+    
     @Test
     public void testSelectResourceMethod() throws Exception {
         ClassResourceInfo cri = new ClassResourceInfo(Customer.class);

Modified: cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/security/SecureBookStoreNoInterface.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/security/SecureBookStoreNoInterface.java?rev=1063045&r1=1063044&r2=1063045&view=diff
==============================================================================
--- cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/security/SecureBookStoreNoInterface.java (original)
+++ cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/security/SecureBookStoreNoInterface.java Mon Jan 24 22:44:16 2011
@@ -33,6 +33,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
 
 import org.apache.cxf.systest.jaxrs.Book;
 import org.apache.cxf.systest.jaxrs.BookNotFoundFault;
@@ -51,8 +52,10 @@ public class SecureBookStoreNoInterface 
     @POST
     @Path("/bookforms")
     @RolesAllowed({"ROLE_USER", "ROLE_ADMIN" })
-    public Book getBookFromFormParams(@FormParam("name") String name, @FormParam("id") long id) {
-        if (name == null || id == 0) {
+    public Book getBookFromFormParams(MultivaluedMap<String, String> map,
+        @FormParam("name") String name, @FormParam("id") long id) {
+        if (name == null || id == 0 || map.getFirst("name") == null
+            || Integer.valueOf(map.getFirst("id")) == 0) {
             throw new RuntimeException("FormParams are not set");
         }
         return new Book(name, id);
@@ -64,7 +67,12 @@ public class SecureBookStoreNoInterface 
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
     public Book getBookFromHttpRequestParams(@Context HttpServletRequest request) {
         Map<String, String[]> params = request.getParameterMap();
-        return getBookFromFormParams(params.get("name")[0], Long.valueOf(params.get("id")[0]));
+        String name = params.get("name")[0];
+        Long id = Long.valueOf(params.get("id")[0]);
+        if (name == null || id == 0) {
+            throw new RuntimeException("FormParams are not set");
+        }
+        return new Book(name, id);
     }
     
     @GET