You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2015/09/04 11:14:52 UTC

incubator-johnzon git commit: JOHNZON-58 splitting provider in X and WidlcardX

Repository: incubator-johnzon
Updated Branches:
  refs/heads/master abe417036 -> fac2ce678


JOHNZON-58 splitting provider in X and WidlcardX


Project: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/commit/fac2ce67
Tree: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/tree/fac2ce67
Diff: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/diff/fac2ce67

Branch: refs/heads/master
Commit: fac2ce6784d08f3c4311620f986307605ddf2ab9
Parents: abe4170
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Fri Sep 4 11:15:06 2015 +0200
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Fri Sep 4 11:15:06 2015 +0200

----------------------------------------------------------------------
 .../jaxrs/ConfigurableJohnzonProvider.java      |  12 +-
 .../apache/johnzon/jaxrs/JohnzonProvider.java   |  12 +-
 .../org/apache/johnzon/jaxrs/JsrProvider.java   |  12 +-
 .../WildcardConfigurableJohnzonProvider.java    | 206 +++++++++++++++++++
 .../johnzon/jaxrs/WildcardJohnzonProvider.java  |  48 +++++
 .../johnzon/jaxrs/WildcardJsrProvider.java      |  41 ++++
 .../johnzon/jaxrs/JohnzonProviderTest.java      |  23 ++-
 src/site/markdown/index.md.vm                   |   8 +-
 8 files changed, 327 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/fac2ce67/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
index 2b9bd41..e942385 100644
--- a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
@@ -42,16 +42,8 @@ import java.util.concurrent.atomic.AtomicReference;
 import static java.util.Arrays.asList;
 
 @Provider
-@Produces({
-    "application/json", "*/json",
-    "*/*+json", "*/x-json",
-    "*/javascript", "*/x-javascript"
-})
-@Consumes({
-    "application/json", "*/json",
-    "*/*+json", "*/x-json",
-    "*/javascript", "*/x-javascript"
-})
+@Produces("application/json")
+@Consumes("application/json")
 public class ConfigurableJohnzonProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T> {
     // build/configuration
     private MapperBuilder builder = new MapperBuilder();

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/fac2ce67/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonProvider.java
index 280ddbc..b1e137f 100644
--- a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonProvider.java
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonProvider.java
@@ -27,16 +27,8 @@ import javax.ws.rs.ext.Provider;
 import java.util.Collection;
 
 @Provider
-@Produces({
-    "application/json", "*/json",
-    "*/*+json", "*/x-json",
-    "*/javascript", "*/x-javascript"
-})
-@Consumes({
-    "application/json", "*/json",
-    "*/*+json", "*/x-json",
-    "*/javascript", "*/x-javascript"
-})
+@Produces("application/json")
+@Consumes("application/json")
 public class JohnzonProvider<T> extends DelegateProvider<T> {
     public JohnzonProvider(final Mapper mapper, final Collection<String> ignores) {
         super(new JohnzonMessageBodyReader<T>(mapper, ignores), new JohnzonMessageBodyWriter<T>(mapper, ignores));

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/fac2ce67/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrProvider.java
index 6b45894..06ec86d 100644
--- a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrProvider.java
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrProvider.java
@@ -24,16 +24,8 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.ext.Provider;
 
 @Provider
-@Produces({
-    "application/json", "*/json",
-    "*/*+json", "*/x-json",
-    "*/javascript", "*/x-javascript"
-})
-@Consumes({
-    "application/json", "*/json",
-    "*/*+json", "*/x-json",
-    "*/javascript", "*/x-javascript"
-})
+@Produces("application/json")
+@Consumes("application/json")
 public class JsrProvider extends DelegateProvider<JsonStructure> {
     public JsrProvider() {
         super(new JsrMessageBodyReader(), new JsrMessageBodyWriter());

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/fac2ce67/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java
new file mode 100644
index 0000000..23f51e0
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java
@@ -0,0 +1,206 @@
+/*
+ * 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.johnzon.jaxrs;
+
+import org.apache.johnzon.mapper.MapperBuilder;
+import org.apache.johnzon.mapper.access.AccessMode;
+
+import javax.json.JsonReaderFactory;
+import javax.json.stream.JsonGeneratorFactory;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+import static java.util.Arrays.asList;
+
+@Provider
+@Produces({
+    "*/json",
+    "*/*+json", "*/x-json",
+    "*/javascript", "*/x-javascript"
+})
+@Consumes({
+    "*/json",
+    "*/*+json", "*/x-json",
+    "*/javascript", "*/x-javascript"
+})
+public class WildcardConfigurableJohnzonProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T> {
+    // build/configuration
+    private MapperBuilder builder = new MapperBuilder();
+    private List<String> ignores;
+
+    // runtime
+    private AtomicReference<JohnzonProvider<T>> delegate = new AtomicReference<JohnzonProvider<T>>();
+
+    private JohnzonProvider<T> instance() {
+        JohnzonProvider<T> instance;
+        do {
+            instance = delegate.get();
+            if (builder != null && delegate.compareAndSet(null, new JohnzonProvider<T>(builder.build(), ignores))) {
+                // reset build instances
+                builder = null;
+                ignores = null;
+            }
+        } while (instance == null);
+        return instance;
+    }
+
+    @Override
+    public boolean isReadable(final Class<?> rawType, final Type genericType,
+                              final Annotation[] annotations, final MediaType mediaType) {
+        return instance().isReadable(rawType, genericType, annotations, mediaType);
+    }
+
+    @Override
+    public T readFrom(final Class<T> rawType, final Type genericType,
+                      final Annotation[] annotations, final MediaType mediaType,
+                      final MultivaluedMap<String, String> httpHeaders,
+                      final InputStream entityStream) throws IOException {
+        return instance().readFrom(rawType, genericType, annotations, mediaType, httpHeaders, entityStream);
+    }
+
+    @Override
+    public long getSize(final T t, final Class<?> rawType, final Type genericType,
+                        final Annotation[] annotations, final MediaType mediaType) {
+        return instance().getSize(t, rawType, genericType, annotations, mediaType);
+    }
+
+    @Override
+    public boolean isWriteable(final Class<?> rawType, final Type genericType,
+                               final Annotation[] annotations, final MediaType mediaType) {
+        return instance().isWriteable(rawType, genericType, annotations, mediaType);
+    }
+
+    @Override
+    public void writeTo(final T t, final Class<?> rawType, final Type genericType,
+                        final Annotation[] annotations, final MediaType mediaType,
+                        final MultivaluedMap<String, Object> httpHeaders,
+                        final OutputStream entityStream) throws IOException {
+        instance().writeTo(t, rawType, genericType, annotations, mediaType, httpHeaders, entityStream);
+    }
+
+    // type=a,b,c|type2=d,e
+    public void setIgnoreFieldsForType(final String mapping) {
+        for (final String config : mapping.split(" *| *")) {
+            final String[] parts = config.split(" *= *");
+            try {
+                final Class<?> type = Thread.currentThread().getContextClassLoader().loadClass(parts[0]);
+                if (parts.length == 1) {
+                    builder.setIgnoreFieldsForType(type);
+                } else {
+                    builder.setIgnoreFieldsForType(type, parts[1].split(" *, *"));
+                }
+            } catch (final ClassNotFoundException e) {
+                throw new IllegalArgumentException(e);
+            }
+        }
+    }
+
+    public void setSupportConstructors(final boolean supportConstructors) {
+        builder.setSupportConstructors(supportConstructors);
+    }
+
+    public void setPretty(final boolean pretty) {
+        builder.setPretty(pretty);
+    }
+
+    public void setSupportGetterForCollections(final boolean supportGetterForCollections) {
+        builder.setSupportGetterForCollections(supportGetterForCollections);
+    }
+
+    public void setSupportsComments(final boolean supportsComments) {
+        builder.setSupportsComments(supportsComments);
+    }
+
+    public void setIgnores(final String ignores) {
+        this.ignores = ignores == null ? null : asList(ignores.split(" *, *"));
+    }
+
+    public void setAccessMode(final AccessMode mode) {
+        builder.setAccessMode(mode);
+    }
+
+    public void setAccessModeName(final String mode) {
+        builder.setAccessModeName(mode);
+    }
+
+    public void setSupportHiddenAccess(final boolean supportHiddenAccess) {
+        builder.setSupportHiddenAccess(supportHiddenAccess);
+    }
+
+    public void setAttributeOrder(final Comparator<String> attributeOrder) {
+        builder.setAttributeOrder(attributeOrder);
+    }
+
+    public void setReaderFactory(final JsonReaderFactory readerFactory) {
+        builder.setReaderFactory(readerFactory);
+    }
+
+    public void setGeneratorFactory(final JsonGeneratorFactory generatorFactory) {
+        builder.setGeneratorFactory(generatorFactory);
+    }
+
+    public void setDoCloseOnStreams(final boolean doCloseOnStreams) {
+        builder.setDoCloseOnStreams(doCloseOnStreams);
+    }
+
+    public void setVersion(final int version) {
+        builder.setVersion(version);
+    }
+
+    public void setSkipNull(final boolean skipNull) {
+        builder.setSkipNull(skipNull);
+    }
+
+    public void setSkipEmptyArray(final boolean skipEmptyArray) {
+        builder.setSkipEmptyArray(skipEmptyArray);
+    }
+
+    public void setBufferSize(final int bufferSize) {
+        builder.setBufferSize(bufferSize);
+    }
+
+    public void setBufferStrategy(final String bufferStrategy) {
+        builder.setBufferStrategy(bufferStrategy);
+    }
+
+    public void setMaxSize(final int size) {
+        builder.setMaxSize(size);
+    }
+
+    public void setTreatByteArrayAsBase64(final boolean treatByteArrayAsBase64) {
+        builder.setTreatByteArrayAsBase64(treatByteArrayAsBase64);
+    }
+
+    public void setEncoding(final String encoding) {
+        builder.setEncoding(encoding);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/fac2ce67/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardJohnzonProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardJohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardJohnzonProvider.java
new file mode 100644
index 0000000..c573fff
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardJohnzonProvider.java
@@ -0,0 +1,48 @@
+/*
+ * 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.johnzon.jaxrs;
+
+import org.apache.johnzon.mapper.Mapper;
+import org.apache.johnzon.mapper.MapperBuilder;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.ext.Provider;
+import java.util.Collection;
+
+@Provider
+@Produces({
+    "*/json",
+    "*/*+json", "*/x-json",
+    "*/javascript", "*/x-javascript"
+})
+@Consumes({
+    "*/json",
+    "*/*+json", "*/x-json",
+    "*/javascript", "*/x-javascript"
+})
+public class WildcardJohnzonProvider<T> extends DelegateProvider<T> {
+    public WildcardJohnzonProvider(final Mapper mapper, final Collection<String> ignores) {
+        super(new JohnzonMessageBodyReader<T>(mapper, ignores), new JohnzonMessageBodyWriter<T>(mapper, ignores));
+    }
+
+    public WildcardJohnzonProvider() {
+        this(new MapperBuilder().setDoCloseOnStreams(false).build(), null);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/fac2ce67/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardJsrProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardJsrProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardJsrProvider.java
new file mode 100644
index 0000000..66d3791
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardJsrProvider.java
@@ -0,0 +1,41 @@
+/*
+ * 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.johnzon.jaxrs;
+
+import javax.json.JsonStructure;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+@Produces({
+    "*/json",
+    "*/*+json", "*/x-json",
+    "*/javascript", "*/x-javascript"
+})
+@Consumes({
+    "*/json",
+    "*/*+json", "*/x-json",
+    "*/javascript", "*/x-javascript"
+})
+public class WildcardJsrProvider extends DelegateProvider<JsonStructure> {
+    public WildcardJsrProvider() {
+        super(new JsrMessageBodyReader(), new JsrMessageBodyWriter());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/fac2ce67/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
index b29a290..405c77c 100644
--- a/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
+++ b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
@@ -30,6 +30,7 @@ import org.junit.Test;
 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.core.GenericType;
 import javax.ws.rs.core.MediaType;
@@ -41,6 +42,7 @@ import java.lang.reflect.Type;
 import java.util.List;
 
 import static java.util.Arrays.asList;
+import static java.util.Collections.singletonList;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -52,7 +54,7 @@ public class JohnzonProviderTest {
     public static void bindEndpoint() throws Exception {
         final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
         sf.setResourceClasses(JohnzonResource.class);
-        sf.setProviders(asList(new JohnzonProvider<Object>()));
+        sf.setProviders(singletonList(new JohnzonProvider<Object>()));
         sf.setResourceProvider(JohnzonResource.class, new SingletonResourceProvider(new JohnzonResource(), false));
         sf.setAddress(ENDPOINT_ADDRESS);
         server = sf.create();
@@ -83,6 +85,12 @@ public class JohnzonProviderTest {
     }
 
     @Test
+    public void primitive() {
+        final String val = client(MediaType.TEXT_PLAIN_TYPE).path("johnzon/primitive").get(String.class);
+        assertEquals("1986", val);
+    }
+
+    @Test
     public void array() {
         final Johnzon[] johnzon = client().path("johnzon/all1").get(Johnzon[].class);
         assertEquals(2, johnzon.length);
@@ -119,7 +127,11 @@ public class JohnzonProviderTest {
     }
 
     private static WebClient client() {
-        final WebClient client = WebClient.create(ENDPOINT_ADDRESS, asList(new JohnzonProvider<Object>())).accept(MediaType.APPLICATION_JSON_TYPE);
+        return client(MediaType.APPLICATION_JSON_TYPE);
+    }
+
+    private static WebClient client(final MediaType mediaType) {
+        final WebClient client = WebClient.create(ENDPOINT_ADDRESS, singletonList(new JohnzonProvider<Object>())).accept(mediaType);
         WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
         return client;
     }
@@ -178,5 +190,12 @@ public class JohnzonProviderTest {
                 }
             };
         }
+
+        @GET
+        @Produces(MediaType.TEXT_PLAIN)
+        @Path("primitive")
+        public Integer primitive() {
+            return 1986;
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/fac2ce67/src/site/markdown/index.md.vm
----------------------------------------------------------------------
diff --git a/src/site/markdown/index.md.vm b/src/site/markdown/index.md.vm
index 4dc272f..8102a0c 100644
--- a/src/site/markdown/index.md.vm
+++ b/src/site/markdown/index.md.vm
@@ -80,10 +80,12 @@ final MySuperObject otherObject = mapper.readObject(inputStream, MySuperObject.c
 
 JAX-RS module provides two providers (and underlying MessageBodyReaders and MessageBodyWriters):
 
-* org.apache.johnzon.jaxrs.JohnzonProvider: use Johnzon Mapper to map Object to Json and the opposite
-* org.apache.johnzon.jaxrs.ConfigurableJohnzonProvider: same as JohnzonProvider but with setters to ease the configuration of the provider in most servers/containers
-* org.apache.johnzon.jaxrs.JsrProvider: allows you to use JsrArray, JsrObject (more generally JsonStructure)
+* org.apache.johnzon.jaxrs.[Wildcard]JohnzonProvider: use Johnzon Mapper to map Object to Json and the opposite
+* org.apache.johnzon.jaxrs.[Wildcard]ConfigurableJohnzonProvider: same as JohnzonProvider but with setters to ease the configuration of the provider in most servers/containers
+* org.apache.johnzon.jaxrs.[Wildcard]JsrProvider: allows you to use JsrArray, JsrObject (more generally JsonStructure)
 
+Note: Wildcard providers are basically the same as other provider but instead of application/json they support */json, */*+json, */x-json, */javascript, */x-javascript. This
+split makes it easier to mix json and other MediaType in the same resource (like text/plain, xml etc since JAX-RS API always matches as true wildcard type in some version whatever the subtype is).
 
 ### Websocket (beta)