Repository: tomee
Updated Branches:
  refs/heads/master 1c5369893 -> 0d95e3d23


try to avoid provider conflict for known case - mainly johnzon/jackson for now


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/0d95e3d2
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/0d95e3d2
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/0d95e3d2

Branch: refs/heads/master
Commit: 0d95e3d234228d1cac41680066b1484f980137b6
Parents: 1c53698
Author: Romain Manni-Bucau <rmann...@starbucks.com>
Authored: Mon Aug 10 08:30:48 2015 -0700
Committer: Romain Manni-Bucau <rmann...@starbucks.com>
Committed: Mon Aug 10 08:30:48 2015 -0700

----------------------------------------------------------------------
 .../server/cxf/rs/CxfRsHttpListener.java        | 37 ++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/0d95e3d2/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
----------------------------------------------------------------------
diff --git 
a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
 
b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
index 4f3f21d..d335c2a 100644
--- 
a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
+++ 
b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
@@ -41,6 +41,8 @@ import org.apache.cxf.message.Message;
 import org.apache.cxf.service.invoker.Invoker;
 import org.apache.cxf.transport.DestinationFactory;
 import org.apache.cxf.transport.servlet.BaseUrlHelper;
+import org.apache.johnzon.jaxrs.ConfigurableJohnzonProvider;
+import org.apache.johnzon.jaxrs.JohnzonProvider;
 import org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter;
 import org.apache.openejb.AppContext;
 import org.apache.openejb.BeanContext;
@@ -97,6 +99,7 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -121,6 +124,7 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.MessageBodyWriter;
 
+import static java.util.Arrays.asList;
 import static org.apache.openejb.loader.JarLocation.jarLocation;
 
 public class CxfRsHttpListener implements RsHttpListener {
@@ -321,8 +325,8 @@ public class CxfRsHttpListener implements RsHttpListener {
         final Object proxy = ProxyEJB.subclassProxy(beanContext);
 
         deploy(contextRoot, beanContext.getBeanClass(), fullContext, new 
NoopResourceProvider(beanContext.getBeanClass(), proxy),
-                proxy, null, new 
OpenEJBEJBInvoker(Collections.singleton(beanContext)), additionalProviders, 
configuration,
-                beanContext.getWebBeansContext());
+            proxy, null, new 
OpenEJBEJBInvoker(Collections.singleton(beanContext)), additionalProviders, 
configuration,
+            beanContext.getWebBeansContext());
     }
 
     private void deploy(final String contextRoot, final Class<?> clazz, final 
String address, final ResourceProvider rp, final Object serviceBean,
@@ -579,6 +583,7 @@ public class CxfRsHttpListener implements RsHttpListener {
 
             try {
                 server = factory.create();
+                fixProviderIfKnown();
                 fireServerCreated(oldLoader);
 
                 final ServerProviderFactory spf = 
ServerProviderFactory.class.cast(server.getEndpoint().get(ServerProviderFactory.class.getName()));
@@ -627,6 +632,34 @@ public class CxfRsHttpListener implements RsHttpListener {
         }
     }
 
+    private void fixProviderIfKnown() {
+        final ServerProviderFactory spf = 
ServerProviderFactory.class.cast(server.getEndpoint().get(ServerProviderFactory.class.getName()));
+        for (final String field : asList("messageWriters", "messageReaders")) {
+            final List<ProviderInfo<?>> values = 
List.class.cast(Reflections.get(spf, field));
+
+            boolean customJsonProvider = false;
+            for (final ProviderInfo<?> o : values) { // using getName to not 
suppose any classloader setup
+                if 
(ConfigurableJohnzonProvider.class.getName().equals(o.getResourceClass().getName())
+                    // contains in case of proxying
+                    || 
o.getResourceClass().getName().contains("com.fasterxml.jackson.jaxrs.json")) {
+                    customJsonProvider = true;
+                    break; //  cause we only handle json for now
+                }
+            }
+
+            if (customJsonProvider) {
+                final Iterator<ProviderInfo<?>> it = values.iterator();
+                while (it.hasNext()) {
+                    if 
(JohnzonProvider.class.getName().equals(it.next().getResourceClass().getName()))
 {
+                        it.remove();
+                        break;
+                    }
+                }
+            }
+        }
+
+    }
+
     private static Class<?> realClass(final Class<?> aClass) {
         Class<?> result = aClass;
         while (result.getName().contains("$$")) {

Reply via email to