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 2013/11/20 13:22:58 UTC
svn commit: r1543802 - in /cxf/branches/2.7.x-fixes: ./
rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java
rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java
Author: sergeyb
Date: Wed Nov 20 12:22:58 2013
New Revision: 1543802
URL: http://svn.apache.org/r1543802
Log:
Merged revisions 1543800 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1543800 | sergeyb | 2013-11-20 12:18:26 +0000 (Wed, 20 Nov 2013) | 1 line
[CXF-5404,CXF-5406] Fixing NPE and ClassCastException when reading entries with no content or without 'type' parameter
........
Modified:
cxf/branches/2.7.x-fixes/ (props changed)
cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java
cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Merged /cxf/trunk:r1543800
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java?rev=1543802&r1=1543801&r2=1543802&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java (original)
+++ cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java Wed Nov 20 12:22:58 2013
@@ -561,8 +561,8 @@ public class AtomPojoProvider extends Ab
reportError(message, ex, 500);
}
- private boolean isFeedRequested(MediaType mt) {
- if ("entry".equals(mt.getParameters().get("type"))) {
+ protected boolean isFeedRequested(MediaType mt) {
+ if ("entry".equalsIgnoreCase(mt.getParameters().get("type"))) {
return false;
}
return true;
@@ -603,25 +603,29 @@ public class AtomPojoProvider extends Ab
boolean isFeed = isFeedRequested(mt);
if (isFeed) {
- return readFromFeed(cls, mt, headers, is);
+ return readFromFeedOrEntry(cls, mt, headers, is);
} else {
AtomEntryProvider p = new AtomEntryProvider();
p.setAutodetectCharset(autodetectCharset);
Entry entry = p.readFrom(Entry.class, Entry.class,
new Annotation[]{}, mt, headers, is);
- return readFromEntry(entry, cls, mt, headers, is);
+ return readFromEntry(entry, cls);
}
}
@SuppressWarnings("unchecked")
- private Object readFromFeed(Class<Object> cls, MediaType mt,
+ private Object readFromFeedOrEntry(Class<Object> cls, MediaType mt,
MultivaluedMap<String, String> headers, InputStream is)
throws IOException {
AtomFeedProvider p = new AtomFeedProvider();
p.setAutodetectCharset(autodetectCharset);
- Feed feed = p.readFrom(Feed.class, Feed.class, new Annotation[]{}, mt, headers, is);
-
+ Object atomObject = p.readFrom(Feed.class, Feed.class, new Annotation[]{}, mt, headers, is);
+ if (atomObject instanceof Entry) {
+ return this.readFromEntry((Entry)atomObject, cls);
+ }
+
+ Feed feed = (Feed)atomObject;
AtomElementReader<?, ?> reader = getAtomReader(cls);
if (reader != null) {
return ((AtomElementReader<Feed, Object>)reader).readFrom(feed);
@@ -634,7 +638,7 @@ public class AtomPojoProvider extends Ab
= (Class<Object>)InjectionUtils.getActualType(m.getGenericParameterTypes()[0]);
List<Object> objects = new ArrayList<Object>();
for (Entry e : feed.getEntries()) {
- objects.add(readFromEntry(e, realCls, mt, headers, is));
+ objects.add(readFromEntry(e, realCls));
}
instance = cls.newInstance();
m.invoke(instance, new Object[]{objects});
@@ -646,20 +650,22 @@ public class AtomPojoProvider extends Ab
}
@SuppressWarnings("unchecked")
- private Object readFromEntry(Entry entry, Class<Object> cls, MediaType mt,
- MultivaluedMap<String, String> headers, InputStream is)
+ private Object readFromEntry(Entry entry, Class<Object> cls)
throws IOException {
AtomElementReader<?, ?> reader = getAtomReader(cls);
if (reader != null) {
return ((AtomElementReader<Entry, Object>)reader).readFrom(entry);
}
- try {
- Unmarshaller um =
- jaxbProvider.getJAXBContext(cls, cls).createUnmarshaller();
- return cls.cast(um.unmarshal(new StringReader(entry.getContent())));
- } catch (Exception ex) {
- reportError("Object of type " + cls.getName() + " can not be deserialized from Entry", ex, 400);
+ String entryContent = entry.getContent();
+ if (entryContent != null) {
+ try {
+ Unmarshaller um =
+ jaxbProvider.getJAXBContext(cls, cls).createUnmarshaller();
+ return cls.cast(um.unmarshal(new StringReader(entryContent)));
+ } catch (Exception ex) {
+ reportError("Object of type " + cls.getName() + " can not be deserialized from Entry", ex, 400);
+ }
}
return null;
}
Modified: cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java?rev=1543802&r1=1543801&r2=1543802&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java (original)
+++ cxf/branches/2.7.x-fixes/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java Wed Nov 20 12:22:58 2013
@@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
import java.lang.annotation.Annotation;
+import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
@@ -31,6 +32,7 @@ import javax.xml.bind.annotation.XmlRoot
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
+import org.apache.cxf.jaxrs.impl.MetadataMap;
import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
import org.junit.Assert;
@@ -39,7 +41,6 @@ import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
-
public class AtomPojoProviderTest extends Assert {
private ClassPathXmlApplicationContext ctx;
@@ -177,7 +178,71 @@ public class AtomPojoProviderTest extend
assertTrue("a".equals(list.get(0).getName()) || "a".equals(list.get(1).getName()));
assertTrue("b".equals(list.get(0).getName()) || "b".equals(list.get(1).getName()));
}
-
+
+ @Test
+ public void testReadEntryNoContent() throws Exception {
+ /** A sample entry without content. */
+ final String entryNoContent =
+ "<?xml version='1.0' encoding='UTF-8'?>\n"
+ + "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
+ + " <id>84297856</id>\n"
+ + "</entry>";
+
+ AtomPojoProvider atomPojoProvider = new AtomPojoProvider();
+ @SuppressWarnings({
+ "rawtypes", "unchecked"
+ })
+ JaxbDataType type = (JaxbDataType)atomPojoProvider.readFrom((Class)JaxbDataType.class,
+ JaxbDataType.class,
+ new Annotation[0],
+ MediaType.valueOf("application/atom+xml;type=entry"),
+ new MetadataMap<String, String>(),
+ new ByteArrayInputStream(entryNoContent.getBytes(Charset.forName("UTF-8"))));
+ assertNull(type);
+ }
+
+ @Test
+ public void testReadEntryWithUpperCaseTypeParam() throws Exception {
+ doReadEntryWithContent("application/atom+xml;type=ENTRY");
+ }
+
+ @Test
+ public void testReadEntryNoTypeParam() throws Exception {
+ doReadEntryWithContent("application/atom+xml");
+ }
+
+ private void doReadEntryWithContent(String mediaType) throws Exception {
+ final String entryWithContent =
+ "<?xml version='1.0' encoding='UTF-8'?>\n"
+ + "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
+ + " <id>84297856</id>\n"
+ + " <content type=\"application/xml\">\n"
+ + " <jaxbDataType xmlns=\"\">\n"
+ + " </jaxbDataType>\n"
+ + " </content>\n"
+ + "</entry>";
+
+ AtomPojoProvider atomPojoProvider = new AtomPojoProvider();
+ @SuppressWarnings({
+ "rawtypes", "unchecked"
+ })
+ JaxbDataType type = (JaxbDataType)atomPojoProvider.readFrom((Class)JaxbDataType.class,
+ JaxbDataType.class,
+ new Annotation[0],
+ MediaType.valueOf(mediaType),
+ new MetadataMap<String, String>(),
+ new ByteArrayInputStream(entryWithContent.getBytes(Charset.forName("UTF-8"))));
+ assertNotNull(type);
+ }
+
+ /**
+ * A sample JAXB data-type to read data into.
+ */
+ @XmlRootElement
+ public static class JaxbDataType {
+ // no data
+ }
+
private Entry getEntry(List<Entry> entries, String title) {
for (Entry e : entries) {
if (title.equals(e.getTitle())) {