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 2010/09/19 23:25:50 UTC

svn commit: r998736 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/impl/ main/java/org/apache/cxf/jaxrs/utils/ test/java/org/apache/cxf/jaxrs/ test/java/org/apache/cxf/jaxrs/impl/ test/java/org/apache/cxf/jaxrs/utils/

Author: sergeyb
Date: Sun Sep 19 21:25:49 2010
New Revision: 998736

URL: http://svn.apache.org/viewvc?rev=998736&view=rev
Log:
making comma a default separator for Cache-Control and fixing the issue of the empty collections in the absense of @DefaultValue

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java?rev=998736&r1=998735&r2=998736&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java Sun Sep 19 21:25:49 2010
@@ -27,8 +27,15 @@ import java.util.Map;
 import javax.ws.rs.core.CacheControl;
 import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
 
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.PhaseInterceptorChain;
+
 public class CacheControlHeaderProvider implements HeaderDelegate<CacheControl> {
     
+    public static final String CACHE_CONTROL_SEPARATOR_PROPERTY =
+        "org.apache.cxf.http.cache-control.separator";
+    private static final String DEFAULT_SEPARATOR = ",";
+    
     private static final String PUBLIC = "public";
     private static final String PRIVATE = "private";
     private static final String NO_CACHE = "no-cache";
@@ -51,9 +58,11 @@ public class CacheControlHeaderProvider 
         int maxAge = -1;
         int sMaxAge = -1;
        
+        String separator = getSeparator();
         
-        String[] tokens = c.split(";");
-        for (String token : tokens) {
+        String[] tokens = c.split(separator);
+        for (String rawToken : tokens) {
+            String token = rawToken.trim();
             if (token.startsWith(MAX_AGE)) {
                 maxAge = Integer.parseInt(token.substring(MAX_AGE.length() + 1));
             } else if (token.startsWith(SMAX_AGE)) {
@@ -93,32 +102,36 @@ public class CacheControlHeaderProvider 
     }
 
     public String toString(CacheControl c) {
+        String separator = getSeparator();
+        
         StringBuilder sb = new StringBuilder();
         if (c.isPrivate()) {
             sb.append(PRIVATE);
             handleFields(c.getPrivateFields(), sb);
+            sb.append(separator);
         }
         if (c.isNoCache()) {
             sb.append(NO_CACHE);
             handleFields(c.getNoCacheFields(), sb);
+            sb.append(separator);
         }
         if (c.isNoStore()) {
-            sb.append(NO_STORE).append(';');
+            sb.append(NO_STORE).append(separator);
         }
         if (c.isNoTransform()) {
-            sb.append(NO_TRANSFORM).append(';');
+            sb.append(NO_TRANSFORM).append(separator);
         }
         if (c.isMustRevalidate()) {
-            sb.append(MUST_REVALIDATE).append(';');
+            sb.append(MUST_REVALIDATE).append(separator);
         }
         if (c.isProxyRevalidate()) {
-            sb.append(PROXY_REVALIDATE).append(';');
+            sb.append(PROXY_REVALIDATE).append(separator);
         }
         if (c.getMaxAge() != -1) {
-            sb.append(MAX_AGE).append('=').append(c.getMaxAge()).append(';');
+            sb.append(MAX_AGE).append('=').append(c.getMaxAge()).append(separator);
         }
         if (c.getSMaxAge() != -1) {
-            sb.append(SMAX_AGE).append('=').append(c.getSMaxAge()).append(';');
+            sb.append(SMAX_AGE).append('=').append(c.getSMaxAge()).append(separator);
         }
         Map<String, String> exts = c.getCacheExtension();
         for (Map.Entry<String, String> entry : exts.entrySet()) {
@@ -132,10 +145,10 @@ public class CacheControlHeaderProvider 
                     sb.append(v);
                 }
             }
-            sb.append(';');
+            sb.append(separator);
         }
         String s = sb.toString();
-        return s.endsWith(";") ? s.substring(0, s.length() - 1) : s; 
+        return s.endsWith(separator) ? s.substring(0, s.length() - 1) : s; 
     }
     
     private static void addFields(List<String> fields, String token) {
@@ -155,15 +168,34 @@ public class CacheControlHeaderProvider 
     }
 
     private static void handleFields(List<String> fields, StringBuilder sb) {
-        if (!fields.isEmpty()) {
-            sb.append('=');
+        if (fields.isEmpty()) {
+            return;
         }
+        sb.append('=');
         for (Iterator<String> it = fields.iterator(); it.hasNext();) {
             sb.append('\"').append(it.next()).append('\"');
             if (it.hasNext()) {
                 sb.append(',');
             }
         }
-        sb.append(';');
+    }
+    
+    protected String getSeparator() {
+        
+        String separator = DEFAULT_SEPARATOR;
+        
+        Message message = getCurrentMessage();
+        
+        if (message != null) {
+            Object sepProperty = message.getContextualProperty(CACHE_CONTROL_SEPARATOR_PROPERTY);
+            if (sepProperty != null) {
+                separator = sepProperty.toString();
+            }
+        }
+        return separator;
+    }
+    
+    protected Message getCurrentMessage() {
+        return PhaseInterceptorChain.getCurrentMessage();
     }
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=998736&r1=998735&r2=998736&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Sun Sep 19 21:25:49 2010
@@ -671,6 +671,8 @@ public final class InjectionUtils {
                 if (paramType.isPrimitive()) {
                     paramValues = Collections.singletonList(
                         boolean.class == paramType ? "false" : "0");
+                } else if (InjectionUtils.isSupportedCollectionOrArray(paramType)) {
+                    paramValues = Collections.emptyList();
                 } else {
                     return null;
                 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java?rev=998736&r1=998735&r2=998736&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java Sun Sep 19 21:25:49 2010
@@ -268,7 +268,18 @@ public class Customer extends AbstractCu
     
     @Produces("text/xml")   
     public void testQuery(@QueryParam("query") String queryString, 
-                          @QueryParam("query") int queryInt) {
+                          @QueryParam("query") int queryInt,
+                          @QueryParam("query2") String query2,
+                          @QueryParam("query3") String query3) {
+        // complete
+    }
+    
+    @Produces("text/xml")   
+    public void testQueryAsList(
+        @DefaultValue("default") @QueryParam("query") List<String> queryString,
+        @QueryParam("query2") List<String> queryString2,
+        @QueryParam("query3") List<String> queryString3,
+        @QueryParam("query4") List<String> queryString4) {
         // complete
     }
     

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java?rev=998736&r1=998735&r2=998736&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java Sun Sep 19 21:25:49 2010
@@ -21,17 +21,18 @@ package org.apache.cxf.jaxrs.impl;
 
 import javax.ws.rs.core.CacheControl;
 
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageImpl;
+
 import org.junit.Assert;
 import org.junit.Test;
 
 public class CacheControlHeaderProviderTest extends Assert {
     
-    
-        
     @Test
     public void testFromSimpleString() {
         CacheControl c = CacheControl.valueOf(
-            "public;must-revalidate");
+            "public,must-revalidate");
         assertTrue(!c.isPrivate() && !c.isNoStore()
                    && c.isMustRevalidate() && !c.isProxyRevalidate());
         assertTrue(!c.isNoCache()
@@ -42,6 +43,27 @@ public class CacheControlHeaderProviderT
     @Test
     public void testFromComplexString() {
         CacheControl c = CacheControl.valueOf(
+            "private=\"foo\",no-cache=\"bar\",no-store,no-transform,"
+            + "must-revalidate,proxy-revalidate,max-age=2,s-maxage=3");
+        assertTrue(c.isPrivate() && c.isNoStore()
+                   && c.isMustRevalidate() && c.isProxyRevalidate() && c.isNoCache());
+        assertTrue(c.isNoTransform() && c.getNoCacheFields().size() == 1
+                   && c.getPrivateFields().size() == 1);
+        assertEquals("foo", c.getPrivateFields().get(0));
+        assertEquals("bar", c.getNoCacheFields().get(0));
+        
+    }
+    
+    @Test
+    public void testFromComplexStringWithSemicolon() {
+        CacheControlHeaderProvider cp = new CacheControlHeaderProvider() {
+            protected Message getCurrentMessage() {
+                Message m = new MessageImpl();
+                m.put(CacheControlHeaderProvider.CACHE_CONTROL_SEPARATOR_PROPERTY, ";");
+                return m;
+            }
+        };
+        CacheControl c = cp.fromString(
             "private=\"foo\";no-cache=\"bar\";no-store;no-transform;"
             + "must-revalidate;proxy-revalidate;max-age=2;s-maxage=3");
         assertTrue(c.isPrivate() && c.isNoStore()
@@ -56,8 +78,8 @@ public class CacheControlHeaderProviderT
     
     @Test
     public void testToString() {
-        String s = "private=\"foo\";no-cache=\"bar\";no-store;no-transform;"
-            + "must-revalidate;proxy-revalidate;max-age=2;s-maxage=3";
+        String s = "private=\"foo\",no-cache=\"bar\",no-store,no-transform,"
+            + "must-revalidate,proxy-revalidate,max-age=2,s-maxage=3";
         String parsed = CacheControl.valueOf(s).toString();
         assertEquals(s, parsed);       
     }
@@ -66,7 +88,7 @@ public class CacheControlHeaderProviderT
     public void testNoCacheEnabled() {
         CacheControl cc = new CacheControl();
         cc.setNoCache(true);
-        assertEquals("no-cache;no-transform", cc.toString());
+        assertEquals("no-cache,no-transform", cc.toString());
     }
     
     @Test

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=998736&r1=998735&r2=998736&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Sun Sep 19 21:25:49 2010
@@ -526,18 +526,50 @@ public class JAXRSUtilsTest extends Asse
     
     @Test
     public void testQueryParameters() throws Exception {
-        Class[] argType = {String.class, Integer.TYPE};
+        Class[] argType = {String.class, Integer.TYPE, String.class, String.class};
         Method m = Customer.class.getMethod("testQuery", argType);
         MessageImpl messageImpl = new MessageImpl();
         
-        messageImpl.put(Message.QUERY_STRING, "query=24");
+        messageImpl.put(Message.QUERY_STRING, "query=24&query2");
         List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null),
                                                            null, 
                                                            messageImpl);
+        assertEquals(4, params.size());
         assertEquals("Query Parameter was not matched correctly", "24", params.get(0));
         assertEquals("Primitive Query Parameter was not matched correctly", 24, params.get(1));
-        
-        
+        assertEquals("", params.get(2));
+        assertNull(params.get(3));
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testQueryParamAsListWithDefaultValue() throws Exception {
+        Class[] argType = {List.class, List.class, List.class, List.class};
+        Method m = Customer.class.getMethod("testQueryAsList", argType);
+        MessageImpl messageImpl = new MessageImpl();
+        messageImpl.put(Message.QUERY_STRING, "query2=query2Value&query3");
+        List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null),
+                                                           null, 
+                                                           messageImpl);
+        assertEquals(4, params.size());
+        List<String> queryList = (List<String>)params.get(0);
+        assertNotNull(queryList);
+        assertEquals(1, queryList.size());
+        assertEquals("default", queryList.get(0));
+        
+        List<String> queryList2 = (List<String>)params.get(1);
+        assertNotNull(queryList2);
+        assertEquals(1, queryList2.size());
+        assertEquals("query2Value", queryList2.get(0));
+        
+        List<String> queryList3 = (List<String>)params.get(2);
+        assertNotNull(queryList3);
+        assertEquals(1, queryList3.size());
+        assertEquals("", queryList3.get(0));
+        
+        List<String> queryList4 = (List<String>)params.get(3);
+        assertNotNull(queryList4);
+        assertEquals(0, queryList4.size());
     }
     
     @Test