Return-Path: Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: (qmail 52167 invoked from network); 21 Sep 2010 21:32:38 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 21 Sep 2010 21:32:38 -0000 Received: (qmail 98955 invoked by uid 500); 21 Sep 2010 21:32:38 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 98866 invoked by uid 500); 21 Sep 2010 21:32:37 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 98859 invoked by uid 99); 21 Sep 2010 21:32:37 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 21 Sep 2010 21:32:37 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 21 Sep 2010 21:32:33 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 7F24523889DA; Tue, 21 Sep 2010 21:32:12 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r999654 - in /cxf/branches/2.2.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ rt/frontend/jaxrs/src/te... Date: Tue, 21 Sep 2010 21:32:12 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100921213212.7F24523889DA@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Tue Sep 21 21:32:11 2010 New Revision: 999654 URL: http://svn.apache.org/viewvc?rev=999654&view=rev Log: Merged revisions 998736 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r998736 | sergeyb | 2010-09-19 22:25:49 +0100 (Sun, 19 Sep 2010) | 1 line making comma a default separator for Cache-Control and fixing the issue of the empty collections in the absense of @DefaultValue ........ Modified: cxf/branches/2.2.x-fixes/ (props changed) cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Propchange: cxf/branches/2.2.x-fixes/ ------------------------------------------------------------------------------ svn:mergeinfo = /cxf/trunk:998736 Propchange: cxf/branches/2.2.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java?rev=999654&r1=999653&r2=999654&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java (original) +++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProvider.java Tue Sep 21 21:32:11 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 { + 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 exts = c.getCacheExtension(); for (Map.Entry 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 fields, String token) { @@ -155,15 +168,34 @@ public class CacheControlHeaderProvider } private static void handleFields(List fields, StringBuilder sb) { - if (!fields.isEmpty()) { - sb.append('='); + if (fields.isEmpty()) { + return; } + sb.append('='); for (Iterator 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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=999654&r1=999653&r2=999654&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original) +++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Tue Sep 21 21:32:11 2010 @@ -667,6 +667,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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java?rev=999654&r1=999653&r2=999654&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java (original) +++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java Tue Sep 21 21:32:11 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 queryString, + @QueryParam("query2") List queryString2, + @QueryParam("query3") List queryString3, + @QueryParam("query4") List queryString4) { // complete } Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java?rev=999654&r1=999653&r2=999654&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java (original) +++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/CacheControlHeaderProviderTest.java Tue Sep 21 21:32:11 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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=999654&r1=999653&r2=999654&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java (original) +++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Tue Sep 21 21:32:11 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 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 params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null), + null, + messageImpl); + assertEquals(4, params.size()); + List queryList = (List)params.get(0); + assertNotNull(queryList); + assertEquals(1, queryList.size()); + assertEquals("default", queryList.get(0)); + + List queryList2 = (List)params.get(1); + assertNotNull(queryList2); + assertEquals(1, queryList2.size()); + assertEquals("query2Value", queryList2.get(0)); + + List queryList3 = (List)params.get(2); + assertNotNull(queryList3); + assertEquals(1, queryList3.size()); + assertEquals("", queryList3.get(0)); + + List queryList4 = (List)params.get(3); + assertNotNull(queryList4); + assertEquals(0, queryList4.size()); } @Test