Author: sergeyb Date: Fri Mar 30 16:02:17 2012 New Revision: 1307497 URL: http://svn.apache.org/viewvc?rev=1307497&view=rev Log: Merged revisions 1307492 via svnmerge from https://svn.apache.org/repos/asf/cxf/branches/2.5.x-fixes
................ r1307492 | sergeyb | 2012-03-30 16:55:06 +0100 (Fri, 30 Mar 2012) | 9 lines Merged revisions 1307387 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r1307387 | sergeyb | 2012-03-30 13:48:14 +0100 (Fri, 30 Mar 2012) | 1 line [CXF-4217] Introduce Nullable annotation to help override the handling of empty payloads by the JAXB provider ........ ................ Added: cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/Nullable.java - copied unchanged from r1307492, cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/Nullable.java Modified: cxf/branches/2.4.x-fixes/ (props changed) cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Propchange: cxf/branches/2.4.x-fixes/ ------------------------------------------------------------------------------ --- svn:mergeinfo (added) +++ svn:mergeinfo Fri Mar 30 16:02:17 2012 @@ -0,0 +1,2 @@ +/cxf/branches/2.5.x-fixes:1307492 +/cxf/trunk:1307387 Propchange: cxf/branches/2.4.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java?rev=1307497&r1=1307496&r2=1307497&view=diff ============================================================================== --- cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java (original) +++ cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java Fri Mar 30 16:02:17 2012 @@ -21,6 +21,8 @@ package org.apache.cxf.jaxrs.provider; import java.util.List; +import javax.ws.rs.core.HttpHeaders; + import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; import org.apache.cxf.jaxrs.model.ClassResourceInfo; @@ -143,4 +145,19 @@ public abstract class AbstractConfigurab public void init(List<ClassResourceInfo> resources) { // complete } + + protected boolean isPayloadEmpty(HttpHeaders headers) { + if (headers != null) { + List<String> values = headers.getRequestHeader(HttpHeaders.CONTENT_LENGTH); + if (values.size() == 1) { + try { + Long len = Long.valueOf(values.get(0)); + return len <= 0; + } catch (NumberFormatException ex) { + // ignore + } + } + } + return false; + } } Modified: cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=1307497&r1=1307496&r2=1307497&view=diff ============================================================================== --- cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original) +++ cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Fri Mar 30 16:02:17 2012 @@ -37,7 +37,6 @@ import java.util.Set; import java.util.logging.Logger; import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ContextResolver; @@ -171,20 +170,16 @@ public abstract class AbstractJAXBProvid jaxbElementClassMap = map; } - protected void checkContentLength() { - if (mc != null) { - HttpHeaders headers = mc.getHttpHeaders(); - if (headers != null) { - List<String> values = mc.getHttpHeaders().getRequestHeader(HttpHeaders.CONTENT_LENGTH); - if (values.size() == 1 && "0".equals(values.get(0))) { - String message = new org.apache.cxf.common.i18n.Message("EMPTY_BODY", BUNDLE).toString(); - LOG.warning(message); - throw new WebApplicationException(400); - } - } - } + protected boolean isPayloadEmpty() { + return mc != null ? isPayloadEmpty(mc.getHttpHeaders()) : false; } + protected void reportEmptyContentLength() { + String message = new org.apache.cxf.common.i18n.Message("EMPTY_BODY", BUNDLE).toString(); + LOG.warning(message); + throw new WebApplicationException(400); + } + protected <T> T getStaxHandlerFromCurrentMessage(Class<T> staxCls) { Message m = PhaseInterceptorChain.getCurrentMessage(); if (m != null) { Modified: cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=1307497&r1=1307496&r2=1307497&view=diff ============================================================================== --- cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java (original) +++ cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java Fri Mar 30 16:02:17 2012 @@ -58,6 +58,7 @@ import javax.xml.transform.Source; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.jaxb.NamespaceMapper; import org.apache.cxf.jaxrs.ext.MessageContext; +import org.apache.cxf.jaxrs.ext.Nullable; import org.apache.cxf.jaxrs.ext.xml.XMLInstruction; import org.apache.cxf.jaxrs.ext.xml.XMLSource; import org.apache.cxf.jaxrs.ext.xml.XSISchemaLocation; @@ -151,10 +152,16 @@ public class JAXBElementProvider extends public Object readFrom(Class<Object> type, Type genericType, Annotation[] anns, MediaType mt, MultivaluedMap<String, String> headers, InputStream is) throws IOException { + if (isPayloadEmpty()) { + if (AnnotationUtils.getAnnotation(anns, Nullable.class) != null) { + return null; + } else { + reportEmptyContentLength(); + } + } + try { - checkContentLength(); - boolean isCollection = InjectionUtils.isSupportedCollectionOrArray(type); Class<?> theGenericType = isCollection ? InjectionUtils.getActualType(genericType) : type; Class<?> theType = getActualType(theGenericType, genericType, anns); Modified: cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java?rev=1307497&r1=1307496&r2=1307497&view=diff ============================================================================== --- cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java (original) +++ cxf/branches/2.4.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java Fri Mar 30 16:02:17 2012 @@ -44,7 +44,6 @@ import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; @@ -122,13 +121,10 @@ public class MultipartProvider extends A } protected void checkContentLength() { - if (mc != null) { - List<String> values = mc.getHttpHeaders().getRequestHeader(HttpHeaders.CONTENT_LENGTH); - if (values.size() == 1 && "0".equals(values.get(0))) { - String message = new org.apache.cxf.common.i18n.Message("EMPTY_BODY", BUNDLE).toString(); - LOG.warning(message); - throw new WebApplicationException(400); - } + if (mc != null && isPayloadEmpty(mc.getHttpHeaders())) { + String message = new org.apache.cxf.common.i18n.Message("EMPTY_BODY", BUNDLE).toString(); + LOG.warning(message); + throw new WebApplicationException(400); } } Modified: cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=1307497&r1=1307496&r2=1307497&view=diff ============================================================================== --- cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original) +++ cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Fri Mar 30 16:02:17 2012 @@ -75,6 +75,7 @@ import javax.xml.transform.dom.DOMSource import org.apache.cxf.annotations.GZIP; import org.apache.cxf.common.util.ProxyHelper; import org.apache.cxf.helpers.XMLUtils; +import org.apache.cxf.jaxrs.ext.Nullable; import org.apache.cxf.jaxrs.ext.Oneway; import org.apache.cxf.jaxrs.ext.search.SearchCondition; import org.apache.cxf.jaxrs.ext.search.SearchContext; @@ -753,6 +754,17 @@ public class BookStore { } @POST + @Path("/books/null") + @Produces("application/xml") + @Consumes("application/xml") + public Book handleNullBook(@Nullable Book book) { + if (book != null) { + throw new WebApplicationException(400); + } + return new Book("Default Book", 222L); + } + + @POST @Path("/books") @Produces("text/xml") @Consumes("application/xml") Modified: cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=1307497&r1=1307496&r2=1307497&view=diff ============================================================================== --- cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original) +++ cxf/branches/2.4.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Fri Mar 30 16:02:17 2012 @@ -1337,6 +1337,19 @@ public class JAXRSClientServerBookTest e } @Test + public void testAddBookEmptyContent() throws Exception { + Response r = WebClient.create("http://localhost:" + PORT + "/bookstore/books").post(null); + assertEquals(400, r.getStatus()); + } + + @Test + public void testAddBookEmptyContentWithNullable() throws Exception { + Book defaultBook = + WebClient.create("http://localhost:" + PORT + "/bookstore/books/null").post(null, Book.class); + assertEquals("Default Book", defaultBook.getName()); + } + + @Test public void testAddBook() throws Exception { doAddBook("http://localhost:" + PORT + "/bookstore/books"); }
