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 2015/04/01 17:35:49 UTC
cxf git commit: [CXF-6320] 400 should be returned when a primitive
MBR gets an empty payload
Repository: cxf
Updated Branches:
refs/heads/master cf7f58139 -> 02a35f0bf
[CXF-6320] 400 should be returned when a primitive MBR gets an empty payload
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/02a35f0b
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/02a35f0b
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/02a35f0b
Branch: refs/heads/master
Commit: 02a35f0bf624ec6230ee85720b49661e03520c18
Parents: cf7f581
Author: Sergey Beryozkin <sb...@talend.com>
Authored: Wed Apr 1 16:35:31 2015 +0100
Committer: Sergey Beryozkin <sb...@talend.com>
Committed: Wed Apr 1 16:35:31 2015 +0100
----------------------------------------------------------------------
.../provider/AbstractConfigurableProvider.java | 14 ++-
.../jaxrs/provider/AbstractJAXBProvider.java | 14 ---
.../jaxrs/provider/PrimitiveTextProvider.java | 16 ++--
.../apache/cxf/jaxrs/utils/InjectionUtils.java | 4 +-
.../provider/PrimitiveTextProviderTest.java | 97 ++++++++++++++++++--
.../cxf/systest/jaxrs/JAXRSSoapBookTest.java | 7 +-
6 files changed, 117 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/02a35f0b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java
index b24c647..ae201a6 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java
@@ -20,16 +20,23 @@
package org.apache.cxf.jaxrs.provider;
import java.util.List;
+import java.util.ResourceBundle;
+import java.util.logging.Logger;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.NoContentException;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
+import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
public abstract class AbstractConfigurableProvider {
-
+ protected static final ResourceBundle BUNDLE = BundleUtils.getBundle(AbstractJAXBProvider.class);
+ protected static final Logger LOG = LogUtils.getL7dLogger(AbstractJAXBProvider.class);
+
private List<String> consumeMediaTypes;
private List<String> produceMediaTypes;
private boolean enableBuffering;
@@ -170,4 +177,9 @@ public abstract class AbstractConfigurableProvider {
return false;
}
+ protected void reportEmptyContentLength() throws NoContentException {
+ String message = new org.apache.cxf.common.i18n.Message("EMPTY_BODY", BUNDLE).toString();
+ LOG.warning(message);
+ throw new NoContentException(message);
+ }
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/02a35f0b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
index 8105259..b456916 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
@@ -33,14 +33,11 @@ import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.ResourceBundle;
import java.util.Set;
-import java.util.logging.Logger;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.NoContentException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.MessageBodyReader;
@@ -67,9 +64,7 @@ import org.w3c.dom.Element;
import org.xml.sax.helpers.DefaultHandler;
import org.apache.cxf.annotations.SchemaValidation;
-import org.apache.cxf.common.i18n.BundleUtils;
import org.apache.cxf.common.jaxb.JAXBUtils;
-import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.common.util.PackageUtils;
import org.apache.cxf.jaxrs.ext.MessageContext;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
@@ -90,9 +85,6 @@ import org.apache.cxf.staxutils.transform.TransformUtils;
public abstract class AbstractJAXBProvider<T> extends AbstractConfigurableProvider
implements MessageBodyReader<T>, MessageBodyWriter<T> {
- protected static final ResourceBundle BUNDLE = BundleUtils.getBundle(AbstractJAXBProvider.class);
-
- protected static final Logger LOG = LogUtils.getL7dLogger(AbstractJAXBProvider.class);
protected static final String NS_MAPPER_PROPERTY_RI = "com.sun.xml.bind.namespacePrefixMapper";
protected static final String NS_MAPPER_PROPERTY_RI_INT = "com.sun.xml.internal.bind.namespacePrefixMapper";
private static final String JAXB_DEFAULT_NAMESPACE = "##default";
@@ -269,12 +261,6 @@ public abstract class AbstractJAXBProvider<T> extends AbstractConfigurableProvid
jaxbElementClassMap = map;
}
- protected void reportEmptyContentLength() throws NoContentException {
- String message = new org.apache.cxf.common.i18n.Message("EMPTY_BODY", BUNDLE).toString();
- LOG.warning(message);
- throw new NoContentException(message);
- }
-
protected <X> X getStreamHandlerFromCurrentMessage(Class<X> staxCls) {
Message m = PhaseInterceptorChain.getCurrentMessage();
if (m != null) {
http://git-wip-us.apache.org/repos/asf/cxf/blob/02a35f0b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java
index 93a6135..21fe81a 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java
@@ -35,23 +35,27 @@ import org.apache.cxf.jaxrs.model.ParameterType;
import org.apache.cxf.jaxrs.utils.HttpUtils;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
-public class PrimitiveTextProvider<T>
+public class PrimitiveTextProvider<T> extends AbstractConfigurableProvider
implements MessageBodyReader<T>, MessageBodyWriter<T> {
private int bufferSize = IOUtils.DEFAULT_BUFFER_SIZE;
- private static boolean isSupported(Class<?> type) {
- return InjectionUtils.isPrimitive(type);
+ private static boolean isSupported(Class<?> type, MediaType mt) {
+ boolean isSupported = InjectionUtils.isPrimitive(type);
+ return isSupported && (String.class == type || mt.isCompatible(MediaType.TEXT_PLAIN_TYPE));
}
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mt) {
- return isSupported(type);
+ return isSupported(type, mt);
}
public T readFrom(Class<T> type, Type genType, Annotation[] anns, MediaType mt,
MultivaluedMap<String, String> headers, InputStream is) throws IOException {
String string = IOUtils.toString(is, HttpUtils.getEncoding(mt, "UTF-8"));
+ if (String.class != type && StringUtils.isEmpty(string)) {
+ reportEmptyContentLength();
+ }
if (type == Character.class) {
- char character = StringUtils.isEmpty(string) ? ' ' : string.charAt(0);
+ char character = string.charAt(0);
return type.cast(Character.valueOf(character));
}
return InjectionUtils.handleParameter(
@@ -69,7 +73,7 @@ public class PrimitiveTextProvider<T>
}
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mt) {
- return isSupported(type);
+ return isSupported(type, mt);
}
public void writeTo(T obj, Class<?> type, Type genType, Annotation[] anns,
http://git-wip-us.apache.org/repos/asf/cxf/blob/02a35f0b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
index 631d2e4..2b6e7e4 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
@@ -1256,8 +1256,8 @@ public final class InjectionUtils {
public static boolean isPrimitive(Class<?> type) {
return type.isPrimitive()
|| Number.class.isAssignableFrom(type)
- || Boolean.class.isAssignableFrom(type)
- || Character.class.isAssignableFrom(type)
+ || Boolean.class == type
+ || Character.class == type
|| String.class == type;
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/02a35f0b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProviderTest.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProviderTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProviderTest.java
index 78863cd..54428d1 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProviderTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProviderTest.java
@@ -26,6 +26,7 @@ import java.util.Arrays;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.NoContentException;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.MessageBodyWriter;
@@ -37,21 +38,83 @@ import org.junit.Test;
public class PrimitiveTextProviderTest extends Assert {
@Test
- public void testIsWriteable() {
+ public void testNumberIsWriteable() {
MessageBodyWriter<Object> p = new PrimitiveTextProvider<Object>();
- assertTrue(p.isWriteable(Byte.TYPE, null, null, null)
- && p.isWriteable(Byte.class, null, null, null)
- && p.isWriteable(Boolean.TYPE, null, null, null)
- && p.isWriteable(Boolean.class, null, null, null));
+ assertTrue(p.isWriteable(Byte.class, null, null, MediaType.TEXT_PLAIN_TYPE));
}
@Test
- public void testIsReadable() {
+ public void testNumberIsNotWriteable() {
+ MessageBodyWriter<Object> p = new PrimitiveTextProvider<Object>();
+ assertFalse(p.isWriteable(Byte.class, null, null, MediaType.valueOf("text/custom")));
+ }
+
+ @Test
+ public void testBooleanIsWriteable() {
+ MessageBodyWriter<Object> p = new PrimitiveTextProvider<Object>();
+ assertTrue(p.isWriteable(Boolean.class, null, null, MediaType.TEXT_PLAIN_TYPE));
+ }
+
+ @Test
+ public void testBooleanIsNotWriteable() {
+ MessageBodyWriter<Object> p = new PrimitiveTextProvider<Object>();
+ assertFalse(p.isWriteable(Boolean.class, null, null, MediaType.valueOf("text/custom")));
+ }
+
+ @Test
+ public void testCharacterIsWriteable() {
+ MessageBodyWriter<Object> p = new PrimitiveTextProvider<Object>();
+ assertTrue(p.isWriteable(Character.class, null, null, MediaType.TEXT_PLAIN_TYPE));
+ }
+
+ @Test
+ public void testCharacterIsNotWriteable() {
+ MessageBodyWriter<Object> p = new PrimitiveTextProvider<Object>();
+ assertFalse(p.isWriteable(Character.class, null, null, MediaType.valueOf("text/custom")));
+ }
+
+ @Test
+ public void testStringIsWriteable() {
+ MessageBodyWriter<Object> p = new PrimitiveTextProvider<Object>();
+ assertTrue(p.isWriteable(String.class, null, null, MediaType.TEXT_PLAIN_TYPE)
+ && p.isWriteable(String.class, null, null, MediaType.valueOf("text/custom")));
+ }
+
+ @Test
+ public void testNumberIsReadable() {
MessageBodyReader<Object> p = new PrimitiveTextProvider<Object>();
- assertTrue(p.isReadable(Byte.TYPE, null, null, null)
- && p.isReadable(Byte.class, null, null, null)
- && p.isReadable(Boolean.TYPE, null, null, null)
- && p.isReadable(Boolean.class, null, null, null));
+ assertTrue(p.isReadable(Byte.class, null, null, MediaType.TEXT_PLAIN_TYPE));
+ }
+ @Test
+ public void testNumberIsNotReadable() {
+ MessageBodyReader<Object> p = new PrimitiveTextProvider<Object>();
+ assertFalse(p.isReadable(Byte.class, null, null, MediaType.valueOf("text/custom")));
+ }
+ @Test
+ public void testBooleanIsReadable() {
+ MessageBodyReader<Object> p = new PrimitiveTextProvider<Object>();
+ assertTrue(p.isReadable(Boolean.class, null, null, MediaType.TEXT_PLAIN_TYPE));
+ }
+ @Test
+ public void testBooleanIsNotReadable() {
+ MessageBodyReader<Object> p = new PrimitiveTextProvider<Object>();
+ assertFalse(p.isReadable(Boolean.class, null, null, MediaType.valueOf("text/custom")));
+ }
+ @Test
+ public void testCharacterIsReadable() {
+ MessageBodyReader<Object> p = new PrimitiveTextProvider<Object>();
+ assertTrue(p.isReadable(Character.class, null, null, MediaType.TEXT_PLAIN_TYPE));
+ }
+ @Test
+ public void testCharacterIsNotReadable() {
+ MessageBodyReader<Object> p = new PrimitiveTextProvider<Object>();
+ assertFalse(p.isReadable(Character.class, null, null, MediaType.valueOf("text/custom")));
+ }
+ @Test
+ public void testStringIsReadable() {
+ MessageBodyReader<Object> p = new PrimitiveTextProvider<Object>();
+ assertTrue(p.isReadable(String.class, null, null, MediaType.TEXT_PLAIN_TYPE)
+ && p.isReadable(String.class, null, null, MediaType.valueOf("text/custom")));
}
@SuppressWarnings("unchecked")
@@ -69,6 +132,20 @@ public class PrimitiveTextProviderTest extends Assert {
assertEquals(1, valueRead.byteValue());
}
+ @SuppressWarnings({
+ "unchecked", "rawtypes"
+ })
+ @Test(expected = NoContentException.class)
+ public void testReadEmptyByte() throws Exception {
+ MessageBodyReader<?> p = new PrimitiveTextProvider<Object>();
+
+ p.readFrom((Class)Byte.TYPE, null, null,
+ null,
+ null,
+ new ByteArrayInputStream("".getBytes()));
+
+
+ }
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test
http://git-wip-us.apache.org/repos/asf/cxf/blob/02a35f0b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
index 5393490..655c355 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
@@ -172,9 +172,12 @@ public class JAXRSSoapBookTest extends AbstractBusClientServerTestBase {
@Test
public void testGetAll() throws Exception {
+ URL url = new URL("http://localhost:" + PORT + "/test/services/rest2/myRestService");
+
+ URLConnection connect = url.openConnection();
+ connect.addRequestProperty("Accept", "text/plain");
+ InputStream in = connect.getInputStream();
- InputStream in = getHttpInputStream("http://localhost:" + PORT
- + "/test/services/rest2/myRestService");
assertEquals("0", getStringFromInputStream(in));
}