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/08/12 15:41:09 UTC

cxf git commit: [CXF-6515] Returning to a single custom comparator setter and checking the generic types as suggested by Romain

Repository: cxf
Updated Branches:
  refs/heads/master 507b390c5 -> 405059c0c


[CXF-6515] Returning to a single custom comparator setter and checking the generic types as suggested by Romain


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/405059c0
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/405059c0
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/405059c0

Branch: refs/heads/master
Commit: 405059c0c0801c84b4eb0e91c6c7819f57aad23d
Parents: 507b390
Author: Sergey Beryozkin <sb...@talend.com>
Authored: Wed Aug 12 14:40:43 2015 +0100
Committer: Sergey Beryozkin <sb...@talend.com>
Committed: Wed Aug 12 14:40:43 2015 +0100

----------------------------------------------------------------------
 .../cxf/jaxrs/AbstractJAXRSFactoryBean.java     | 18 ++---
 .../cxf/jaxrs/provider/ProviderFactory.java     | 45 +++++++++----
 .../cxf/jaxrs/provider/ProviderFactoryTest.java | 71 +++++++++++++++++++-
 3 files changed, 105 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/405059c0/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
index d467689..0fb8fae 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
@@ -71,8 +71,7 @@ public class AbstractJAXRSFactoryBean extends AbstractEndpointFactory {
     protected List<String> schemaLocations;
     protected JAXRSServiceFactoryBean serviceFactory;
     protected List<Object> entityProviders = new LinkedList<Object>();
-    private Comparator<?> messageReaderComparator;
-    private Comparator<?> messageWriterComparator;
+    private Comparator<?> providerComparator;
     
     protected AbstractJAXRSFactoryBean(JAXRSServiceFactoryBean serviceFactory) {
         this.serviceFactory = serviceFactory;
@@ -326,11 +325,8 @@ public class AbstractJAXRSFactoryBean extends AbstractEndpointFactory {
     }
     
     protected void setupFactory(ProviderFactory factory, Endpoint ep) { 
-        if (messageReaderComparator != null) {
-            factory.setMessageReaderComparator(messageReaderComparator);
-        }
-        if (messageWriterComparator != null) {
-            factory.setMessageWriterComparator(messageWriterComparator);
+        if (providerComparator != null) {
+            factory.setProviderComparator(providerComparator);
         }
         if (entityProviders != null) {
             factory.setUserProviders(entityProviders); 
@@ -435,12 +431,8 @@ public class AbstractJAXRSFactoryBean extends AbstractEndpointFactory {
             serviceFactory.setUserResourcesWithServiceClass(resources, sClasses);
         }
     }
-
-    public void setMessageWriterComparator(Comparator<?> messageWriterComparator) {
-        this.messageWriterComparator = messageWriterComparator;
-    }
-    public void setMessageReaderComparator(Comparator<?> messageReaderComparator) {
-        this.messageReaderComparator = messageReaderComparator;
+    public void setProviderComparator(Comparator<?> providerComparator) {
+        this.providerComparator = providerComparator;
     }
     
     

http://git-wip-us.apache.org/repos/asf/cxf/blob/405059c0/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
index 70333b7..4529ceb 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
@@ -25,6 +25,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -114,8 +115,7 @@ public abstract class ProviderFactory {
     
     private Bus bus;
     
-    private Comparator<?> messageWriterComparator;
-    private Comparator<?> messageReaderComparator;
+    private Comparator<?> providerComparator;
     
     protected ProviderFactory(Bus bus) {
         this.bus = bus;
@@ -564,25 +564,45 @@ public abstract class ProviderFactory {
      * x/y;q=1.0 < x/y;q=0.7.
      */    
     private void sortReaders() {
-        if (messageReaderComparator == null) {
+        if (!customComparatorAvailable(MessageBodyReader.class)) {
             Collections.sort(messageReaders, new MessageBodyReaderComparator());
         } else {
-            doCustomSort(messageReaderComparator, messageReaders);
+            doCustomSort(messageReaders);
         }
     }
     private <T> void sortWriters() {
-        if (messageWriterComparator == null) {
+        if (!customComparatorAvailable(MessageBodyWriter.class)) {
             Collections.sort(messageWriters, new MessageBodyWriterComparator());
         } else {
-            doCustomSort(messageWriterComparator, messageWriters);
+            doCustomSort(messageWriters);
+        }
+    }
+    
+    private boolean customComparatorAvailable(Class<?> providerClass) {
+        if (providerComparator != null) {
+            Type type = ((ParameterizedType)providerComparator.getClass()
+                .getGenericInterfaces()[0]).getActualTypeArguments()[0];
+            if (type instanceof ParameterizedType) {
+                ParameterizedType pt = (ParameterizedType)type;
+                if (pt.getRawType() == ProviderInfo.class) {
+                    Type type2 = pt.getActualTypeArguments()[0];
+                    if (type2 == providerClass
+                        || type2 instanceof WildcardType
+                        || type2 instanceof ParameterizedType 
+                           && ((ParameterizedType)type2).getRawType() == providerClass) {
+                        return true;
+                    }
+                }
+            }
         }
+        return false;
     }
     
-    private static <T> void doCustomSort(Comparator<?> comparator, List<?> listOfProviders) {
+    private <T> void doCustomSort(List<?> listOfProviders) {
         @SuppressWarnings("unchecked")
         List<T> theProviders = (List<T>)listOfProviders;
         @SuppressWarnings("unchecked")
-        Comparator<? super T> theComparator = (Comparator<? super T>)comparator;
+        Comparator<? super T> theComparator = (Comparator<? super T>)providerComparator;
         Collections.sort((List<T>)theProviders, theComparator);
     }
     
@@ -1185,12 +1205,9 @@ public abstract class ProviderFactory {
         return null;
     }
 
-    public void setMessageWriterComparator(Comparator<?> messageWriterComparator) {
-        this.messageWriterComparator = messageWriterComparator;
-        sortWriters();
-    }
-    public void setMessageReaderComparator(Comparator<?> messageReaderComparator) {
-        this.messageReaderComparator = messageReaderComparator;
+    public void setProviderComparator(Comparator<?> providerComparator) {
+        this.providerComparator = providerComparator;
         sortReaders();
+        sortWriters();
     }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/405059c0/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
index ddedbc1..199f227 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
@@ -120,19 +120,86 @@ public class ProviderFactoryTest extends Assert {
             }    
         
         };
+        pf.setProviderComparator(comp);
+        
         // writers
-        pf.setMessageWriterComparator(comp);
         List<ProviderInfo<MessageBodyWriter<?>>> writers = pf.getMessageWriters();
         assertEquals(8, writers.size());
         Object lastWriter = writers.get(7).getProvider();
         assertTrue(lastWriter instanceof StringTextProvider);
         //readers
-        pf.setMessageReaderComparator(comp);
         List<ProviderInfo<MessageBodyReader<?>>> readers = pf.getMessageReaders();
         assertEquals(8, readers.size());
         Object lastReader = readers.get(7).getProvider();
         assertTrue(lastReader instanceof StringTextProvider);
     }
+    @SuppressWarnings("rawtypes")
+    @Test
+    public void testCustomProviderSortingMBROnly() {
+        ProviderFactory pf = ServerProviderFactory.getInstance();
+        Comparator<ProviderInfo<MessageBodyReader>> comp = 
+            new Comparator<ProviderInfo<MessageBodyReader>>() {
+
+            @Override
+            public int compare(ProviderInfo<MessageBodyReader> o1, ProviderInfo<MessageBodyReader> o2) {
+                MessageBodyReader<?> provider1 = o1.getProvider();
+                MessageBodyReader<?> provider2 = o2.getProvider();
+                if (provider1 instanceof StringTextProvider) {
+                    return 1;
+                } else if (provider2 instanceof StringTextProvider) {
+                    return -1;
+                } else {
+                    return 0;
+                }
+            }    
+        
+        };
+        pf.setProviderComparator(comp);
+        
+        // writers
+        List<ProviderInfo<MessageBodyWriter<?>>> writers = pf.getMessageWriters();
+        assertEquals(8, writers.size());
+        Object lastWriter = writers.get(7).getProvider();
+        assertFalse(lastWriter instanceof StringTextProvider);
+        //readers
+        List<ProviderInfo<MessageBodyReader<?>>> readers = pf.getMessageReaders();
+        assertEquals(8, readers.size());
+        Object lastReader = readers.get(7).getProvider();
+        assertTrue(lastReader instanceof StringTextProvider);
+    }
+    @Test
+    public void testCustomProviderSortingMBWOnly() {
+        ProviderFactory pf = ServerProviderFactory.getInstance();
+        Comparator<ProviderInfo<MessageBodyWriter<?>>> comp = 
+            new Comparator<ProviderInfo<MessageBodyWriter<?>>>() {
+
+            @Override
+            public int compare(ProviderInfo<MessageBodyWriter<?>> o1, ProviderInfo<MessageBodyWriter<?>> o2) {
+                MessageBodyWriter<?> provider1 = o1.getProvider();
+                MessageBodyWriter<?> provider2 = o2.getProvider();
+                if (provider1 instanceof StringTextProvider) {
+                    return 1;
+                } else if (provider2 instanceof StringTextProvider) {
+                    return -1;
+                } else {
+                    return 0;
+                }
+            }    
+        
+        };
+        pf.setProviderComparator(comp);
+        
+        // writers
+        List<ProviderInfo<MessageBodyWriter<?>>> writers = pf.getMessageWriters();
+        assertEquals(8, writers.size());
+        Object lastWriter = writers.get(7).getProvider();
+        assertTrue(lastWriter instanceof StringTextProvider);
+        //readers
+        List<ProviderInfo<MessageBodyReader<?>>> readers = pf.getMessageReaders();
+        assertEquals(8, readers.size());
+        Object lastReader = readers.get(7).getProvider();
+        assertFalse(lastReader instanceof StringTextProvider);
+    }
     
     @Test
     public void testCustomProviderSortingWithBus() {