You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2016/12/08 07:53:14 UTC

tomee git commit: TOMEE-1981 propagating .activated config to client default jaxrs provider, thanks Robert Panzer for the patch

Repository: tomee
Updated Branches:
  refs/heads/master 5182e7262 -> 0b8ba1814


TOMEE-1981 propagating <name>.activated config to client default jaxrs provider, thanks Robert Panzer for the patch


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

Branch: refs/heads/master
Commit: 0b8ba18148ac86ec22ed352def3e570fe887b377
Parents: 5182e72
Author: rmannibucau <rm...@apache.org>
Authored: Thu Dec 8 08:53:01 2016 +0100
Committer: rmannibucau <rm...@apache.org>
Committed: Thu Dec 8 08:53:01 2016 +0100

----------------------------------------------------------------------
 .../openejb/server/cxf/rs/CxfRSService.java     |  82 +++++--------
 .../server/cxf/rs/CxfRsHttpListener.java        |  11 +-
 .../cxf/rs/johnzon/TomEEJohnzonProvider.java    |  52 +++++++++
 .../cxf/rs/johnzon/TomEEJsonpProvider.java      |  45 +++++++
 .../server/cxf/rs/DisableTomEEJohnzonTest.java  | 117 +++++++++++++++++++
 5 files changed, 247 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/0b8ba181/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
----------------------------------------------------------------------
diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
index 020d7c1..31bd2e0 100644
--- a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
+++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
@@ -21,9 +21,6 @@ import org.apache.cxf.binding.BindingFactoryManager;
 import org.apache.cxf.jaxrs.JAXRSBindingFactory;
 import org.apache.cxf.transport.DestinationFactory;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
-import org.apache.johnzon.jaxrs.JohnzonProvider;
-import org.apache.johnzon.jaxrs.JsrProvider;
-import org.apache.johnzon.mapper.MapperBuilder;
 import org.apache.openejb.cdi.WebBeansContextBeforeDeploy;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.observer.Observes;
@@ -46,32 +43,24 @@ import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.PassivationCapable;
 import javax.enterprise.util.AnnotationLiteral;
-import javax.json.JsonStructure;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
 import javax.ws.rs.container.ResourceContext;
 import javax.ws.rs.container.ResourceInfo;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Request;
-import javax.ws.rs.core.Response;
 import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.core.StreamingOutput;
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.ext.ContextResolver;
-import javax.ws.rs.ext.Provider;
 import javax.ws.rs.ext.Providers;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Serializable;
-import java.io.Writer;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
@@ -80,6 +69,7 @@ import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import java.net.Socket;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -93,6 +83,7 @@ public class CxfRSService extends RESTService {
     private static final String NAME = "cxf-rs";
     private DestinationFactory destinationFactory;
     private boolean factoryByListener;
+    private Properties config;
 
     @Override
     public void service(final InputStream in, final OutputStream out) throws ServiceException, IOException {
@@ -171,6 +162,7 @@ public class CxfRSService extends RESTService {
     @Override
     public void init(final Properties properties) throws Exception {
         super.init(properties);
+        config = properties;
         factoryByListener = "true".equalsIgnoreCase(properties.getProperty("openejb.cxf-rs.factoryByListener", "false"));
 
         System.setProperty("org.apache.johnzon.max-string-length",
@@ -230,16 +222,27 @@ public class CxfRSService extends RESTService {
         if (bus.getProperty("org.apache.cxf.jaxrs.bus.providers") == null) {
             bus.setProperty("skip.default.json.provider.registration", "true"); // client jaxrs, we want johnzon not jettison
 
+            final Collection<Object> defaults = new ArrayList<>();
+            for (final String provider : asList(
+                    "org.apache.openejb.server.cxf.rs.johnzon.TomEEJohnzonProvider",
+                    "org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider")) {
+                if (!isActive(provider)) {
+                    continue;
+                }
+                try {
+                    defaults.add(Class.forName(provider, true, CxfRSService.class.getClassLoader()).newInstance());
+                } catch (final Exception e) {
+                    // no-op
+                }
+            }
+
             try {
                 final List<Object> all;
                 final String userProviders = SystemInstance.get().getProperty("openejb.jaxrs.client.providers");
                 if (userProviders == null) {
-                    (all = new ArrayList<>(2)).addAll(asList(
-                        new TomEEJohnzonProvider<>(),
-                        new TomEEJsonpProvider()
-                    ));
+                    (all = new ArrayList<>(defaults.size())).addAll(defaults);
                 } else {
-                    all = new ArrayList<>(4 /* blind guess */);
+                    all = new ArrayList<>(defaults.size() + 2 /* blind guess */);
                     for (String p : userProviders.split(" *, *")) {
                         p = p.trim();
                         if (p.isEmpty()) {
@@ -249,9 +252,8 @@ public class CxfRSService extends RESTService {
                         all.add(Thread.currentThread().getContextClassLoader().loadClass(p).newInstance());
                     }
 
-                    all.addAll(asList( // added after to be after in the list once sorted
-                        new TomEEJohnzonProvider<>(),
-                        new TomEEJsonpProvider()));
+                    // added after to be after in the list once sorted
+                    all.addAll(defaults);
                 }
                 bus.setProperty("org.apache.cxf.jaxrs.bus.providers", all);
             } catch (final Exception e) {
@@ -291,7 +293,12 @@ public class CxfRSService extends RESTService {
 
     @Override
     protected RsHttpListener createHttpListener() {
-        return new CxfRsHttpListener(!factoryByListener ? destinationFactory : new HTTPTransportFactory(), getWildcard());
+        return new CxfRsHttpListener(!factoryByListener ? destinationFactory : new HTTPTransportFactory(), getWildcard(), this);
+    }
+
+    public boolean isActive(final String name) {
+        final String key = name + ".activated";
+        return "true".equalsIgnoreCase(SystemInstance.get().getProperty(key, config.getProperty(key, "true")));
     }
 
     private static class ContextLiteral extends EmptyAnnotationLiteral<Context> implements Context {
@@ -393,39 +400,4 @@ public class CxfRSService extends RESTService {
             }
         }
     }
-
-    @Provider
-    @Produces({"application/json", "application/*+json"})
-    @Consumes({"application/json", "application/*+json"})
-    public static class TomEEJohnzonProvider<T> extends JohnzonProvider<T> {
-        public TomEEJohnzonProvider() {
-            super(new MapperBuilder().setAccessModeName("both").build(), null);
-        }
-
-        @Override
-        public boolean isWriteable(final Class<?> rawType, final Type genericType,
-                                   final Annotation[] annotations, final MediaType mediaType) {
-            return super.isWriteable(rawType, genericType, annotations, mediaType)
-                && !OutputStream.class.isAssignableFrom(rawType)
-                && !StreamingOutput.class.isAssignableFrom(rawType)
-                && !Writer.class.isAssignableFrom(rawType)
-                && !Response.class.isAssignableFrom(rawType)
-                && !JsonStructure.class.isAssignableFrom(rawType);
-        }
-    }
-
-    @Provider
-    @Produces({"application/json", "application/*+json"})
-    @Consumes({"application/json", "application/*+json"})
-    public static class TomEEJsonpProvider extends JsrProvider {
-        @Override
-        public boolean isWriteable(final Class<?> rawType, final Type genericType,
-                                   final Annotation[] annotations, final MediaType mediaType) {
-            return super.isWriteable(rawType, genericType, annotations, mediaType)
-                && !OutputStream.class.isAssignableFrom(rawType)
-                && !StreamingOutput.class.isAssignableFrom(rawType)
-                && !Writer.class.isAssignableFrom(rawType)
-                && !Response.class.isAssignableFrom(rawType);
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/0b8ba181/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 7bede36..e10172f 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
@@ -164,6 +164,7 @@ public class CxfRsHttpListener implements RsHttpListener {
 
     private final DestinationFactory transportFactory;
     private final String wildcard;
+    private final CxfRSService service;
     private HttpDestination destination;
     private Server server;
     private String context = "";
@@ -191,9 +192,10 @@ public class CxfRsHttpListener implements RsHttpListener {
 
     private String pattern;
 
-    public CxfRsHttpListener(final DestinationFactory destinationFactory, final String star) {
+    public CxfRsHttpListener(final DestinationFactory destinationFactory, final String star, final CxfRSService cxfRSService) {
         transportFactory = destinationFactory;
         wildcard = star;
+        service = cxfRSService;
     }
 
     public void setUrlPattern(final String pattern) {
@@ -491,12 +493,11 @@ public class CxfRsHttpListener implements RsHttpListener {
         return false;
     }
 
-    private static boolean shouldSkipProvider(final String name) {
-        return "false".equalsIgnoreCase(SystemInstance.get().getProperty(name + ".activated", "true"))
-                || name.startsWith("org.apache.wink.common.internal.");
+    private boolean shouldSkipProvider(final String name) {
+        return !service.isActive(name) || name.startsWith("org.apache.wink.common.internal.");
     }
 
-    private static void addMandatoryProviders(final Collection<Object> instances, final ServiceConfiguration serviceConfiguration) {
+    private void addMandatoryProviders(final Collection<Object> instances, final ServiceConfiguration serviceConfiguration) {
         if (!shouldSkipProvider(WadlDocumentMessageBodyWriter.class.getName())) {
             instances.add(new WadlDocumentMessageBodyWriter());
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/0b8ba181/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/johnzon/TomEEJohnzonProvider.java
----------------------------------------------------------------------
diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/johnzon/TomEEJohnzonProvider.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/johnzon/TomEEJohnzonProvider.java
new file mode 100644
index 0000000..4e16e80
--- /dev/null
+++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/johnzon/TomEEJohnzonProvider.java
@@ -0,0 +1,52 @@
+/*
+ *     Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.openejb.server.cxf.rs.johnzon;
+
+import org.apache.johnzon.jaxrs.JohnzonProvider;
+import org.apache.johnzon.mapper.MapperBuilder;
+
+import javax.json.JsonStructure;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.ext.Provider;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+@Provider
+@Produces({"application/json", "application/*+json"})
+@Consumes({"application/json", "application/*+json"})
+public class TomEEJohnzonProvider<T> extends JohnzonProvider<T> {
+    public TomEEJohnzonProvider() {
+        super(new MapperBuilder().setAccessModeName("both").build(), null);
+    }
+
+    @Override
+    public boolean isWriteable(final Class<?> rawType, final Type genericType,
+                               final Annotation[] annotations, final MediaType mediaType) {
+        return super.isWriteable(rawType, genericType, annotations, mediaType)
+                && !OutputStream.class.isAssignableFrom(rawType)
+                && !StreamingOutput.class.isAssignableFrom(rawType)
+                && !Writer.class.isAssignableFrom(rawType)
+                && !Response.class.isAssignableFrom(rawType)
+                && !JsonStructure.class.isAssignableFrom(rawType);
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/0b8ba181/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/johnzon/TomEEJsonpProvider.java
----------------------------------------------------------------------
diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/johnzon/TomEEJsonpProvider.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/johnzon/TomEEJsonpProvider.java
new file mode 100644
index 0000000..472fba8
--- /dev/null
+++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/johnzon/TomEEJsonpProvider.java
@@ -0,0 +1,45 @@
+/*
+ *     Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.openejb.server.cxf.rs.johnzon;
+
+import org.apache.johnzon.jaxrs.JsrProvider;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.ext.Provider;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+@Provider
+@Produces({"application/json", "application/*+json"})
+@Consumes({"application/json", "application/*+json"})
+public class TomEEJsonpProvider extends JsrProvider {
+    @Override
+    public boolean isWriteable(final Class<?> rawType, final Type genericType,
+                               final Annotation[] annotations, final MediaType mediaType) {
+        return super.isWriteable(rawType, genericType, annotations, mediaType)
+                && !OutputStream.class.isAssignableFrom(rawType)
+                && !StreamingOutput.class.isAssignableFrom(rawType)
+                && !Writer.class.isAssignableFrom(rawType)
+                && !Response.class.isAssignableFrom(rawType);
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/0b8ba181/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java
----------------------------------------------------------------------
diff --git a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java
new file mode 100644
index 0000000..c6f0bc1
--- /dev/null
+++ b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java
@@ -0,0 +1,117 @@
+/*
+ *     Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.openejb.server.cxf.rs;
+
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.loader.IO;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.ContainerProperties;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.JaxrsProviders;
+import org.apache.openejb.testing.RandomPort;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.net.URL;
+
+import static javax.ws.rs.client.Entity.entity;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE;
+import static org.junit.Assert.assertEquals;
+
+@EnableServices("jax-rs")
+@Classes(DisableTomEEJohnzonTest.Endpoint.class)
+@JaxrsProviders(DisableTomEEJohnzonTest.TestWriter.class)
+@ContainerProperties({
+        @ContainerProperties.Property(name = "org.apache.openejb.server.cxf.rs.johnzon.TomEEJohnzonProvider.activated", value = "false")
+})
+@RunWith(ApplicationComposer.class)
+public class DisableTomEEJohnzonTest {
+
+    private static final String PAYLOAD = "{\"not\": \"johnzon\"}";
+
+    @RandomPort("http")
+    private URL base;
+
+    @Test
+    public void server() throws IOException {
+        assertEquals(PAYLOAD, IO.slurp(new URL(url())));
+    }
+
+    @Test
+    public void client() throws IOException {
+        assertEquals(PAYLOAD, ClientBuilder.newClient().register(new TestWriter()).target(url()).request().post(entity(new Payload(), APPLICATION_JSON_TYPE), String.class));
+    }
+
+    private String url() {
+        return base.toExternalForm() + "openejb/test";
+    }
+
+    @Path("test")
+    public static class Endpoint {
+        @GET
+        @Produces(MediaType.APPLICATION_JSON)
+        public Payload get() {
+            return new Payload();
+        }
+
+        @POST
+        @Consumes(MediaType.APPLICATION_JSON)
+        @Produces(MediaType.APPLICATION_JSON)
+        public String post(final String body) {
+            return body;
+        }
+    }
+
+    public static class Payload {
+    }
+
+    @Provider
+    @Produces(MediaType.WILDCARD)
+    public static class TestWriter implements MessageBodyWriter {
+        @Override
+        public boolean isWriteable(Class aClass, Type type, Annotation[] annotations, MediaType mediaType) {
+            return aClass == Payload.class;
+        }
+
+        @Override
+        public long getSize(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType) {
+            return -1;
+        }
+
+        @Override
+        public void writeTo(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType,
+                            MultivaluedMap multivaluedMap, OutputStream outputStream) throws IOException, WebApplicationException {
+            outputStream.write(PAYLOAD.getBytes("UTF-8"));
+
+        }
+    }
+}
\ No newline at end of file