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 14:04:29 UTC

cxf git commit: [CXF-6515] Preferring custom endpoint-specific providers over custom bus(global) providers which are otherwise equal candidates

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


[CXF-6515] Preferring custom endpoint-specific providers over custom bus(global) providers which are otherwise equal candidates


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

Branch: refs/heads/master
Commit: 507b390c5bf82824c433896e7dbf762cf48effb0
Parents: f7b77f3
Author: Sergey Beryozkin <sb...@talend.com>
Authored: Wed Aug 12 13:04:12 2015 +0100
Committer: Sergey Beryozkin <sb...@talend.com>
Committed: Wed Aug 12 13:04:12 2015 +0100

----------------------------------------------------------------------
 .../apache/cxf/jaxrs/model/ProviderInfo.java    |  9 ++++++
 .../cxf/jaxrs/provider/ProviderFactory.java     | 22 +++++++++++----
 .../jaxrs/provider/ServerProviderFactory.java   |  6 ++--
 .../cxf/jaxrs/provider/ProviderFactoryTest.java | 29 ++++++++++++++++++++
 .../cxf/jaxrs/client/ClientProviderFactory.java |  4 +--
 5 files changed, 59 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/507b390c/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
index 89d2bcd..fa755ff 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
@@ -28,6 +28,7 @@ public class ProviderInfo<T> extends AbstractResourceInfo {
 
     private T provider;
     private boolean custom;
+    private boolean busGlobal;
     
     public ProviderInfo(T provider, Bus bus, boolean custom) {
         this(provider, bus, true, custom);
@@ -78,4 +79,12 @@ public class ProviderInfo<T> extends AbstractResourceInfo {
         return custom;
     }
 
+    public boolean isBusGlobal() {
+        return busGlobal;
+    }
+
+    public void setBusGlobal(boolean busGlobal) {
+        this.busGlobal = busGlobal;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/507b390c/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 830036b..70333b7 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
@@ -127,6 +127,7 @@ public abstract class ProviderFactory {
     
     protected static void initFactory(ProviderFactory factory) {
         factory.setProviders(false,
+                             false,
                      new BinaryDataProvider<Object>(),
                      new SourceProvider<Object>(),
                      new DataSourceProvider<Object>(),
@@ -137,7 +138,7 @@ public abstract class ProviderFactory {
                      new MultipartProvider());
         Object prop = factory.getBus().getProperty("skip.default.json.provider.registration");
         if (!PropertyUtils.isTrue(prop)) {
-            factory.setProviders(false, createProvider(JSON_PROVIDER_NAME));
+            factory.setProviders(false, false, createProvider(JSON_PROVIDER_NAME));
         }
             
     }
@@ -442,7 +443,7 @@ public abstract class ProviderFactory {
                             MessageBodyWriter.class,
                             ExceptionMapper.class);
             if (!extensions.isEmpty()) {
-                setProviders(true, extensions.toArray());
+                setProviders(true, true, extensions.toArray());
                 bus.setProperty(alreadySetProp, "");
             }
         }
@@ -464,7 +465,7 @@ public abstract class ProviderFactory {
         }
     }
     
-    protected abstract void setProviders(boolean custom, Object... providers);
+    protected abstract void setProviders(boolean custom, boolean busGlobal, Object... providers);
     
     @SuppressWarnings("unchecked")
     protected void setCommonProviders(List<ProviderInfo<? extends Object>> theProviders) {
@@ -657,7 +658,7 @@ public abstract class ProviderFactory {
      * @param entityProviders the entityProviders to set
      */
     public void setUserProviders(List<?> userProviders) {
-        setProviders(true, userProviders.toArray());
+        setProviders(true, false, userProviders.toArray());
     }
 
     private static class MessageBodyReaderComparator 
@@ -713,7 +714,13 @@ public abstract class ProviderFactory {
     private static int compareCustomStatus(ProviderInfo<?> p1, ProviderInfo<?> p2) {
         Boolean custom1 = p1.isCustom();
         Boolean custom2 = p2.isCustom();
-        return custom1.compareTo(custom2) * -1;
+        int result = custom1.compareTo(custom2) * -1;
+        if (result == 0 && custom1) {
+            Boolean busGlobal1 = p1.isBusGlobal();
+            Boolean busGlobal2 = p2.isBusGlobal();
+            result = busGlobal1.compareTo(busGlobal2);
+        }
+        return result;
     }
     
     private static class ContextResolverComparator 
@@ -1138,6 +1145,7 @@ public abstract class ProviderFactory {
     }
     
     protected List<ProviderInfo<? extends Object>> prepareProviders(boolean custom,
+                                                                    boolean busGlobal,
                                                                     Object[] providers,
                                                                     ProviderInfo<Application> application) {
         List<ProviderInfo<? extends Object>> theProviders = 
@@ -1158,7 +1166,9 @@ public abstract class ProviderFactory {
             } else if (provider instanceof ProviderInfo) {
                 theProviders.add((ProviderInfo<?>)provider);
             } else {    
-                theProviders.add(new ProviderInfo<Object>(provider, getBus(), custom));
+                ProviderInfo<Object> theProvider = new ProviderInfo<Object>(provider, getBus(), custom);
+                theProvider.setBusGlobal(busGlobal);
+                theProviders.add(theProvider);
             }
         }
         return theProviders;

http://git-wip-us.apache.org/repos/asf/cxf/blob/507b390c/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
index 325e7e7..f904ecb 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
@@ -112,7 +112,7 @@ public final class ServerProviderFactory extends ProviderFactory {
         }
         ServerProviderFactory factory = new ServerProviderFactory(bus);
         ProviderFactory.initFactory(factory);
-        factory.setProviders(false, new WebApplicationExceptionMapper());
+        factory.setProviders(false, false, new WebApplicationExceptionMapper());
         factory.setBusProviders();
         return factory;
     }
@@ -183,14 +183,14 @@ public final class ServerProviderFactory extends ProviderFactory {
     
     @SuppressWarnings("unchecked")
     @Override
-    protected void setProviders(boolean custom, Object... providers) {
+    protected void setProviders(boolean custom, boolean busGlobal, Object... providers) {
         List<ProviderInfo<ContainerRequestFilter>> postMatchRequestFilters = 
             new LinkedList<ProviderInfo<ContainerRequestFilter>>();
         List<ProviderInfo<ContainerResponseFilter>> postMatchResponseFilters = 
             new LinkedList<ProviderInfo<ContainerResponseFilter>>();
         
         List<ProviderInfo<? extends Object>> theProviders = 
-            prepareProviders(custom, (Object[])providers, application);
+            prepareProviders(custom, busGlobal, (Object[])providers, application);
         super.setCommonProviders(theProviders);
         for (ProviderInfo<? extends Object> provider : theProviders) {
             Class<?> providerCls = ClassHelper.getRealClass(getBus(), provider.getProvider());

http://git-wip-us.apache.org/repos/asf/cxf/blob/507b390c/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 f33d49d..ddedbc1 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
@@ -50,6 +50,8 @@ import javax.xml.bind.JAXBContext;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.validation.Schema;
 
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
 import org.apache.cxf.endpoint.Endpoint;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.jaxrs.Customer;
@@ -133,6 +135,33 @@ public class ProviderFactoryTest extends Assert {
     }
     
     @Test
+    public void testCustomProviderSortingWithBus() {
+        WildcardReader wc1 = new WildcardReader();
+        WildcardReader2 wc2 = new WildcardReader2();
+        Bus bus = BusFactory.newInstance().createBus();
+        bus.setProperty(MessageBodyReader.class.getName(), wc1);
+        ProviderFactory pf = ServerProviderFactory.createInstance(bus);
+        pf.registerUserProvider(wc2);
+        List<ProviderInfo<MessageBodyReader<?>>> readers = pf.getMessageReaders();
+        assertEquals(10, readers.size());
+        assertSame(wc2, readers.get(6).getProvider());
+        assertSame(wc1, readers.get(7).getProvider());
+    }
+    @Test
+    public void testCustomProviderSortingWithBus2() {
+        WildcardReader wc1 = new WildcardReader();
+        WildcardReader2 wc2 = new WildcardReader2();
+        Bus bus = BusFactory.newInstance().createBus();
+        bus.setProperty(MessageBodyReader.class.getName(), wc2);
+        ProviderFactory pf = ServerProviderFactory.createInstance(bus);
+        pf.registerUserProvider(wc1);
+        List<ProviderInfo<MessageBodyReader<?>>> readers = pf.getMessageReaders();
+        assertEquals(10, readers.size());
+        assertSame(wc1, readers.get(6).getProvider());
+        assertSame(wc2, readers.get(7).getProvider());
+    }
+    
+    @Test
     public void testCustomJaxbProvider() {
         ProviderFactory pf = ServerProviderFactory.getInstance();
         JAXBElementProvider<Book> provider = new JAXBElementProvider<Book>();

http://git-wip-us.apache.org/repos/asf/cxf/blob/507b390c/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java
----------------------------------------------------------------------
diff --git a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java
index b094a9a..dd2522e 100644
--- a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java
+++ b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ClientProviderFactory.java
@@ -68,9 +68,9 @@ public final class ClientProviderFactory extends ProviderFactory {
        
     
     @Override
-    protected void setProviders(boolean custom, Object... providers) {
+    protected void setProviders(boolean custom, boolean busGlobal, Object... providers) {
         List<ProviderInfo<? extends Object>> theProviders = 
-            prepareProviders(custom, (Object[])providers, null);
+            prepareProviders(custom, busGlobal, (Object[])providers, null);
         super.setCommonProviders(theProviders);
         for (ProviderInfo<? extends Object> provider : theProviders) {
             Class<?> providerCls = ClassHelper.getRealClass(getBus(), provider.getProvider());