Repository: cxf
Updated Branches:
  refs/heads/3.0.x-fixes 2ef6d4baa -> c3e504710


[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/c3e50471
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/c3e50471
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/c3e50471

Branch: refs/heads/3.0.x-fixes
Commit: c3e5047107c02cf639fed490e2596fc7e596b325
Parents: 2ef6d4b
Author: Sergey Beryozkin <[email protected]>
Authored: Wed Aug 12 14:40:43 2015 +0100
Committer: Sergey Beryozkin <[email protected]>
Committed: Wed Aug 12 14:42:11 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/c3e50471/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/c3e50471/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 77dc6ff..73a3234 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/c3e50471/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() {

Reply via email to