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 2012/09/13 11:40:03 UTC

svn commit: r1384254 - in /cxf/trunk/rt/rs/extensions/providers/src: main/java/org/apache/cxf/jaxrs/provider/atom/ test/java/org/apache/cxf/jaxrs/provider/ test/java/org/apache/cxf/jaxrs/provider/atom/ test/java/org/apache/cxf/jaxrs/provider/json/

Author: sergeyb
Date: Thu Sep 13 09:40:02 2012
New Revision: 1384254

URL: http://svn.apache.org/viewvc?rev=1384254&view=rev
Log:
Relaxing the type safety of AtomPojoProvider as a single provider needs to handle both feed and entry Pojos, registering a provider typed on a feed Pojo from Eclipse prevents the runtime from selecting it when a Pojo representing an entry is returned from the resource

Added:
    cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryAllTest.java
      - copied, changed from r1381984, cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/ProviderFactoryJsonTest.java
Removed:
    cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/ProviderFactoryJsonTest.java
Modified:
    cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java
    cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java

Modified: cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java?rev=1384254&r1=1384253&r2=1384254&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java (original)
+++ cxf/trunk/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java Thu Sep 13 09:40:02 2012
@@ -65,14 +65,14 @@ import org.apache.cxf.jaxrs.utils.Inject
 @Produces({"application/atom+xml", "application/atom+xml;type=feed", "application/atom+xml;type=entry" })
 @Consumes({"application/atom+xml", "application/atom+xml;type=feed", "application/atom+xml;type=entry" })
 @Provider
-public class AtomPojoProvider<T> extends AbstractConfigurableProvider
-    implements MessageBodyWriter<T>, MessageBodyReader<T> {
+public class AtomPojoProvider extends AbstractConfigurableProvider
+    implements MessageBodyWriter<Object>, MessageBodyReader<Object> {
     
     private static final Logger LOG = LogUtils.getL7dLogger(AtomPojoProvider.class);
     private static final Abdera ATOM_ENGINE = new Abdera();
     private static final String DEFAULT_ENTRY_CONTENT_METHOD = "getContent";
     
-    private JAXBElementProvider<T> jaxbProvider = new JAXBElementProvider<T>();
+    private JAXBElementProvider<Object> jaxbProvider = new JAXBElementProvider<Object>();
     private Map<String, String> collectionGetters = Collections.emptyMap();
     private Map<String, String> collectionSetters = Collections.emptyMap();
     private Map<String, AtomElementWriter<?, ?>> atomWriters = Collections.emptyMap();
@@ -117,7 +117,7 @@ public class AtomPojoProvider<T> extends
         }
     }
     
-    public long getSize(T t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mt) {
+    public long getSize(Object t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mt) {
         return -1;
     }
     
@@ -133,11 +133,11 @@ public class AtomPojoProvider<T> extends
         return !Feed.class.isAssignableFrom(type) && !Entry.class.isAssignableFrom(type);
     }
 
-    public void writeTo(T o, Class<?> clazz, Type genericType, Annotation[] annotations, 
+    public void writeTo(Object o, Class<?> cls, Type genericType, Annotation[] annotations, 
                         MediaType mt, MultivaluedMap<String, Object> headers, OutputStream os)
         throws IOException {
         boolean isFeed = isFeedRequested(mt);        
-        boolean isCollection = InjectionUtils.isSupportedCollectionOrArray(clazz);
+        boolean isCollection = InjectionUtils.isSupportedCollectionOrArray(cls);
         
         
         if (isFeed && isCollection) {
@@ -151,8 +151,6 @@ public class AtomPojoProvider<T> extends
             if (isFeed && !isCollection) {
                 atomElement = createFeedFromCollectionWrapper(o);
             } else if (!isFeed && !isCollection) {
-                @SuppressWarnings("unchecked")
-                Class<? extends T> cls = (Class<? extends T>)clazz;
                 atomElement = createEntryFromObject(o, cls);
             }
         } catch (Exception ex) {
@@ -233,15 +231,14 @@ public class AtomPojoProvider<T> extends
         return false;
     }
     
-    protected <X> void setFeedFromCollection(Factory factory, Feed feed, X wrapper, 
+    protected void setFeedFromCollection(Factory factory, Feed feed, Object wrapper, 
                                              Object collection,
                                              Class<?> collectionCls, 
                                              Type collectionType, 
                                              boolean writerUsed) throws Exception {
         
         Object[] arr = collectionCls.isArray() ? (Object[])collection : ((Collection<?>)collection).toArray();
-        @SuppressWarnings("unchecked")
-        Class<? extends X> memberClass = (Class<? extends X>)InjectionUtils.getActualType(collectionType);
+        Class<?> memberClass = InjectionUtils.getActualType(collectionType);
         
         for (Object o : arr) {
             Entry entry = createEntryFromObject(o, memberClass);
@@ -253,17 +250,17 @@ public class AtomPojoProvider<T> extends
     }
     
     @SuppressWarnings("unchecked")
-    protected <X> void setFeedProperties(Factory factory, Feed feed, X wrapper, Object collection, 
+    protected void setFeedProperties(Factory factory, Feed feed, Object wrapper, Object collection, 
                                          Class<?> collectionCls, Type collectionType) {
         
-        AbstractAtomElementBuilder<X> builder 
-            = (AbstractAtomElementBuilder<X>)atomBuilders.get(wrapper.getClass().getName());
+        AbstractAtomElementBuilder<Object> builder 
+            = (AbstractAtomElementBuilder<Object>)atomBuilders.get(wrapper.getClass().getName());
         if (builder == null) {
             return;
         }
         setCommonElementProperties(factory, feed, builder, wrapper);
         
-        AbstractFeedBuilder<X> theBuilder = (AbstractFeedBuilder<X>)builder;
+        AbstractFeedBuilder<Object> theBuilder = (AbstractFeedBuilder<Object>)builder;
         
         // the hierarchy is a bit broken in that we can not set author/title.etc on some
         // common Feed/Entry super type
@@ -325,7 +322,7 @@ public class AtomPojoProvider<T> extends
     
     
     
-    protected <X> Entry createEntryFromObject(X o, Class<? extends X> cls) throws Exception {
+    protected Entry createEntryFromObject(Object o, Class<?> cls) throws Exception {
         
         Factory factory = Abdera.getNewFactory();
         Entry entry = factory.getAbdera().newEntry();
@@ -377,18 +374,18 @@ public class AtomPojoProvider<T> extends
         e.getContentElement().setValue(content);
     }
     
-    protected <X> void setEntryProperties(Factory factory, Entry entry, 
-                                          X o, Class<? extends X> cls) {
+    protected void setEntryProperties(Factory factory, Entry entry, 
+                                          Object o, Class<?> cls) {
         @SuppressWarnings("unchecked")
-            AbstractAtomElementBuilder<X> builder 
-            = (AbstractAtomElementBuilder<X>)atomBuilders.get(o.getClass().getName());
+        AbstractAtomElementBuilder<Object> builder 
+            = (AbstractAtomElementBuilder<Object>)atomBuilders.get(o.getClass().getName());
         if (builder == null) {
             return;
         }
         
         setCommonElementProperties(factory, entry, builder, o);
         
-        AbstractEntryBuilder<X> theBuilder = (AbstractEntryBuilder<X>)builder;
+        AbstractEntryBuilder<Object> theBuilder = (AbstractEntryBuilder<Object>)builder;
         String author = theBuilder.getAuthor(o);
         if (author != null) {
             entry.addAuthor(author);
@@ -448,9 +445,9 @@ public class AtomPojoProvider<T> extends
         
     }
 
-    private <X> void setCommonElementProperties(Factory factory, ExtensibleElement element, 
-                                            AbstractAtomElementBuilder<X> builder,
-                                            X o) {
+    private void setCommonElementProperties(Factory factory, ExtensibleElement element, 
+                                            AbstractAtomElementBuilder<Object> builder,
+                                            Object o) {
         String baseUri = builder.getBaseUri(o);
         if (baseUri != null) {
             element.setBaseUri(baseUri);
@@ -492,7 +489,7 @@ public class AtomPojoProvider<T> extends
         return true;
     }
 
-    public T readFrom(Class<T> cls, Type type, Annotation[] anns, MediaType mt, 
+    public Object readFrom(Class<Object> cls, Type type, Annotation[] anns, MediaType mt, 
                       MultivaluedMap<String, String> headers, InputStream is) 
         throws IOException, WebApplicationException {
         boolean isFeed = isFeedRequested(mt);
@@ -507,7 +504,7 @@ public class AtomPojoProvider<T> extends
     }
     
     @SuppressWarnings("unchecked")
-    private T readFromFeed(Class<T> cls, MediaType mt, 
+    private Object readFromFeed(Class<Object> cls, MediaType mt, 
                            MultivaluedMap<String, String> headers, InputStream is) 
         throws IOException {
         
@@ -516,9 +513,9 @@ public class AtomPojoProvider<T> extends
         
         AtomElementReader<?, ?> reader = atomReaders.get(cls.getName());
         if (reader != null) {
-            return ((AtomElementReader<Feed, T>)reader).readFrom(feed);
+            return ((AtomElementReader<Feed, Object>)reader).readFrom(feed);
         }
-        T instance = null;
+        Object instance = null;
         try {
             String methodName = getCollectionMethod(cls, false);
             Method m = cls.getMethod(methodName, new Class[]{List.class});
@@ -538,13 +535,13 @@ public class AtomPojoProvider<T> extends
     }
     
     @SuppressWarnings("unchecked")
-    private <X> X readFromEntry(Entry entry, Class<X> cls, MediaType mt, 
+    private Object readFromEntry(Entry entry, Class<Object> cls, MediaType mt, 
                             MultivaluedMap<String, String> headers, InputStream is) 
         throws IOException {
         
         AtomElementReader<?, ?> reader = atomReaders.get(cls.getName());
         if (reader != null) {
-            return ((AtomElementReader<Entry, X>)reader).readFrom(entry);
+            return ((AtomElementReader<Entry, Object>)reader).readFrom(entry);
         }
         try {
             Unmarshaller um = 

Copied: cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryAllTest.java (from r1381984, cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/ProviderFactoryJsonTest.java)
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryAllTest.java?p2=cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryAllTest.java&p1=cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/ProviderFactoryJsonTest.java&r1=1381984&r2=1384254&rev=1384254&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/json/ProviderFactoryJsonTest.java (original)
+++ cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryAllTest.java Thu Sep 13 09:40:02 2012
@@ -17,21 +17,23 @@
  * under the License.
  */
 
-package org.apache.cxf.jaxrs.provider.json;
+package org.apache.cxf.jaxrs.provider;
 
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.MessageBodyWriter;
 
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.provider.atom.AtomPojoProvider;
+import org.apache.cxf.jaxrs.provider.json.JSONProvider;
 import org.apache.cxf.jaxrs.resources.Book;
+import org.apache.cxf.jaxrs.resources.Chapter;
 import org.apache.cxf.message.MessageImpl;
 
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-public class ProviderFactoryJsonTest extends Assert {
+public class ProviderFactoryAllTest extends Assert {
 
     @Before
     public void setUp() {
@@ -39,6 +41,25 @@ public class ProviderFactoryJsonTest ext
     }
     
     @Test
+    public void testAtomPojoProvider() {
+        ProviderFactory pf = ProviderFactory.getInstance();
+        AtomPojoProvider provider = new AtomPojoProvider();
+        pf.registerUserProvider(provider);
+        MessageBodyReader<?> feedReader = pf.createMessageBodyReader(Book.class,
+                                               Book.class, null, 
+                                               MediaType.valueOf("application/atom+xml"), 
+                                               new MessageImpl());
+        assertSame(feedReader, provider);
+        
+        MessageBodyReader<?> entryReader = pf.createMessageBodyReader(Chapter.class, 
+                                               Chapter.class, null, 
+                                               MediaType.valueOf("application/atom+xml;type=entry"), 
+                                               new MessageImpl());
+        assertSame(entryReader, provider);
+    }
+    
+    
+    @Test
     public void testCustomJsonProvider() {
         ProviderFactory pf = ProviderFactory.getInstance();
         JSONProvider<Book> provider = new JSONProvider<Book>();

Modified: cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java?rev=1384254&r1=1384253&r2=1384254&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java (original)
+++ cxf/trunk/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProviderTest.java Thu Sep 13 09:40:02 2012
@@ -39,6 +39,7 @@ import org.junit.Test;
 
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
+
 public class AtomPojoProviderTest extends Assert {
 
     private ClassPathXmlApplicationContext ctx;
@@ -52,8 +53,7 @@ public class AtomPojoProviderTest extend
     
     @Test
     public void testWriteFeedWithBuilders() throws Exception {
-        @SuppressWarnings("unchecked")
-        AtomPojoProvider<Books> provider = (AtomPojoProvider<Books>)ctx.getBean("atom");
+        AtomPojoProvider provider = (AtomPojoProvider)ctx.getBean("atom");
         assertNotNull(provider);
         provider.setFormattedOutput(true);
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
@@ -76,8 +76,7 @@ public class AtomPojoProviderTest extend
     
     @Test
     public void testWriteFeedWithBuildersNoJaxb() throws Exception {
-        @SuppressWarnings("unchecked")
-        AtomPojoProvider<Books> provider = (AtomPojoProvider<Books>)ctx.getBean("atomNoJaxb");
+        AtomPojoProvider provider = (AtomPojoProvider)ctx.getBean("atomNoJaxb");
         assertNotNull(provider);
         provider.setFormattedOutput(true);
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
@@ -110,8 +109,7 @@ public class AtomPojoProviderTest extend
     
     @Test
     public void testWriteEntryWithBuilders() throws Exception {
-        @SuppressWarnings("unchecked")
-        AtomPojoProvider<Book> provider = (AtomPojoProvider<Book>)ctx.getBean("atom2");
+        AtomPojoProvider provider = (AtomPojoProvider)ctx.getBean("atom2");
         assertNotNull(provider);
         provider.setFormattedOutput(true);
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
@@ -125,25 +123,24 @@ public class AtomPojoProviderTest extend
     
     @Test
     public void testReadEntryWithBuilders() throws Exception {
-        @SuppressWarnings("unchecked")
-        AtomPojoProvider<Book> provider = (AtomPojoProvider<Book>)ctx.getBean("atom3");
+        AtomPojoProvider provider = (AtomPojoProvider)ctx.getBean("atom3");
         assertNotNull(provider);
         doTestReadEntry(provider);
     }
     
     @Test
     public void testReadEntryWithoutBuilders() throws Exception {
-        doTestReadEntry(new AtomPojoProvider<Book>());
+        doTestReadEntry(new AtomPojoProvider());
     }
     
-    private void doTestReadEntry(AtomPojoProvider<Book> provider) throws Exception {
+    private void doTestReadEntry(AtomPojoProvider provider) throws Exception {
         provider.setFormattedOutput(true);
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         MediaType mt = MediaType.valueOf("application/atom+xml;type=entry");
         provider.writeTo(new Book("a"), Book.class, Book.class, new Annotation[]{}, mt, null, bos);
-        //System.out.println(bos.toString());
         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
-        Book book = (Book)provider.readFrom(Book.class, Book.class, 
+        @SuppressWarnings({"unchecked", "rawtypes" })
+        Book book = (Book)provider.readFrom((Class)Book.class, Book.class, 
                                             new Annotation[]{}, mt, null, bis);
         assertEquals("a", book.getName());
     }
@@ -151,19 +148,18 @@ public class AtomPojoProviderTest extend
     
     @Test
     public void testReadFeedWithBuilders() throws Exception {
-        @SuppressWarnings("unchecked")
-        AtomPojoProvider<Books> provider = (AtomPojoProvider<Books>)ctx.getBean("atom4");
+        AtomPojoProvider provider = (AtomPojoProvider)ctx.getBean("atom4");
         assertNotNull(provider);
         doTestReadFeed(provider);
     }
     
     @Test
     public void testReadFeedWithoutBuilders() throws Exception {
-        AtomPojoProvider<Books> provider = new AtomPojoProvider<Books>();
+        AtomPojoProvider provider = new AtomPojoProvider();
         doTestReadFeed(provider);
     }
 
-    private void doTestReadFeed(AtomPojoProvider<Books> provider) throws Exception {
+    private void doTestReadFeed(AtomPojoProvider provider) throws Exception {
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         MediaType mt = MediaType.valueOf("application/atom+xml;type=feed");
         Books books = new Books();
@@ -173,7 +169,8 @@ public class AtomPojoProviderTest extend
         books.setBooks(bs);
         provider.writeTo(books, Books.class, Books.class, new Annotation[]{}, mt, null, bos);
         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
-        Books books2 = provider.readFrom(Books.class, Books.class, 
+        @SuppressWarnings({"unchecked", "rawtypes" })
+        Books books2 = (Books)provider.readFrom((Class)Books.class, Books.class, 
                                             new Annotation[]{}, mt, null, bis);
         List<Book> list = books2.getBooks();
         assertEquals(2, list.size());