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 2017/06/24 12:50:21 UTC

johnzon git commit: JOHNZON-130 ensure access mode if configurable even for jsonb

Repository: johnzon
Updated Branches:
  refs/heads/master 88629d3aa -> 25984cbed


JOHNZON-130 ensure access mode if configurable even for jsonb


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

Branch: refs/heads/master
Commit: 25984cbeddff5f713feb319c817559a5b0afbc8b
Parents: 88629d3
Author: rmannibucau <rm...@apache.org>
Authored: Sat Jun 24 14:50:11 2017 +0200
Committer: rmannibucau <rm...@apache.org>
Committed: Sat Jun 24 14:50:11 2017 +0200

----------------------------------------------------------------------
 .../apache/johnzon/jsonb/JohnzonBuilder.java    | 65 ++++++++++++++------
 .../apache/johnzon/jsonb/JsonbAccessMode.java   |  9 ++-
 .../apache/johnzon/mapper/MapperBuilder.java    |  6 +-
 3 files changed, 54 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/25984cbe/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index 3778ff6..faee36e 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -33,6 +33,8 @@ import org.apache.johnzon.mapper.Mapper;
 import org.apache.johnzon.mapper.MapperBuilder;
 import org.apache.johnzon.mapper.ObjectConverter;
 import org.apache.johnzon.mapper.SerializeValueFilter;
+import org.apache.johnzon.mapper.access.AccessMode;
+import org.apache.johnzon.mapper.access.FieldAndMethodAccessMode;
 import org.apache.johnzon.mapper.internal.AdapterKey;
 import org.apache.johnzon.mapper.internal.ConverterAdapter;
 
@@ -50,6 +52,7 @@ import javax.json.bind.serializer.JsonbSerializer;
 import javax.json.spi.JsonProvider;
 import javax.json.stream.JsonGenerator;
 import javax.json.stream.JsonParserFactory;
+import java.io.Closeable;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -218,11 +221,16 @@ public class JohnzonBuilder implements JsonbBuilder {
             }
             throw new IllegalArgumentException("Unsupported factory: " + val);
         }).orElseGet(this::findFactory);
-        final JsonbAccessMode accessMode = new JsonbAccessMode(
-                propertyNamingStrategy, orderValue, visibilityStrategy,
-                !namingStrategyValue.orElse("").equals(PropertyNamingStrategy.CASE_INSENSITIVE),
-                defaultConverters,
-                factory, parserFactoryProvider);
+        final AccessMode accessMode = config.getProperty("johnzon.accessMode")
+                .map(this::toAccessMode)
+                .orElseGet(() -> new JsonbAccessMode(
+                        propertyNamingStrategy, orderValue, visibilityStrategy,
+                        !namingStrategyValue.orElse("").equals(PropertyNamingStrategy.CASE_INSENSITIVE),
+                        defaultConverters,
+                        factory, parserFactoryProvider,
+                        config.getProperty("johnzon.accessModeDelegate")
+                                .map(this::toAccessMode)
+                                .orElseGet(() -> new FieldAndMethodAccessMode(true, true, false))));
         builder.setAccessMode(accessMode);
 
 
@@ -328,7 +336,10 @@ public class JohnzonBuilder implements JsonbBuilder {
         });
 
         final boolean useCdi = cdiIntegration != null && cdiIntegration.isCanWrite() && config.getProperty("johnzon.cdi.activated").map(Boolean.class::cast).orElse(Boolean.TRUE);
-        final Mapper mapper = builder.addCloseable(accessMode).build();
+        if (Closeable.class.isInstance(accessMode)) {
+            builder.addCloseable(Closeable.class.cast(accessMode));
+        }
+        final Mapper mapper = builder.build();
 
         return useCdi ? new JohnzonJsonb(mapper) {
             {
@@ -348,26 +359,40 @@ public class JohnzonBuilder implements JsonbBuilder {
         } : new JohnzonJsonb(mapper);
     }
 
+    private AccessMode toAccessMode(final Object s) {
+        if (String.class.isInstance(s)) {
+            try {
+                return AccessMode.class.cast(
+                        Thread.currentThread().getContextClassLoader().loadClass(s.toString()).getConstructor().newInstance());
+            } catch (final InstantiationException | IllegalAccessException | NoSuchMethodException | ClassNotFoundException e) {
+                throw new IllegalArgumentException(e);
+            } catch (InvocationTargetException e) {
+                throw new IllegalArgumentException(e.getCause());
+            }
+        }
+        return AccessMode.class.cast(s);
+    }
+
     private Supplier<JsonParserFactory> createJsonParserFactory() {
         return new Supplier<JsonParserFactory>() { // thread safety is not mandatory
-                private final AtomicReference<JsonParserFactory> ref = new AtomicReference<>();
+            private final AtomicReference<JsonParserFactory> ref = new AtomicReference<>();
 
-                @Override
-                public JsonParserFactory get() {
-                    JsonParserFactory factory = ref.get();
-                    if (factory == null) {
-                        factory = doCreate();
-                        if (!ref.compareAndSet(null, factory)) {
-                            factory = ref.get();
-                        }
+            @Override
+            public JsonParserFactory get() {
+                JsonParserFactory factory = ref.get();
+                if (factory == null) {
+                    factory = doCreate();
+                    if (!ref.compareAndSet(null, factory)) {
+                        factory = ref.get();
                     }
-                    return factory;
                 }
+                return factory;
+            }
 
-                private JsonParserFactory doCreate() {
-                    return (jsonp == null ? JsonProvider.provider() : jsonp).createParserFactory(emptyMap());
-                }
-            };
+            private JsonParserFactory doCreate() {
+                return (jsonp == null ? JsonProvider.provider() : jsonp).createParserFactory(emptyMap());
+            }
+        };
     }
 
     private ParameterizedType findPT(final Object s, final Class<?> type) {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/25984cbe/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
index c785f03..3b020d2 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
@@ -100,7 +100,7 @@ public class JsonbAccessMode implements AccessMode, Closeable {
     private final PropertyNamingStrategy naming;
     private final String order;
     private final PropertyVisibilityStrategy visibility;
-    private final FieldAndMethodAccessMode delegate;
+    private final AccessMode delegate;
     private final boolean caseSensitive;
     private final Map<AdapterKey, Adapter<?, ?>> defaultConverters;
     private final JohnzonAdapterFactory factory;
@@ -122,12 +122,12 @@ public class JsonbAccessMode implements AccessMode, Closeable {
     public JsonbAccessMode(final PropertyNamingStrategy propertyNamingStrategy, final String orderValue,
                            final PropertyVisibilityStrategy visibilityStrategy, final boolean caseSensitive,
                            final Map<AdapterKey, Adapter<?, ?>> defaultConverters, final JohnzonAdapterFactory factory,
-                           final Supplier<JsonParserFactory> parserFactory) {
+                           final Supplier<JsonParserFactory> parserFactory, final AccessMode delegate) {
         this.naming = propertyNamingStrategy;
         this.order = orderValue;
         this.visibility = visibilityStrategy;
         this.caseSensitive = caseSensitive;
-        this.delegate = new FieldAndMethodAccessMode(true, true, false);
+        this.delegate = delegate;
         this.defaultConverters = defaultConverters;
         this.factory = factory;
         this.parserFactory = parserFactory;
@@ -661,6 +661,9 @@ public class JsonbAccessMode implements AccessMode, Closeable {
     @Override
     public void close() throws IOException {
         toRelease.forEach(JohnzonAdapterFactory.Instance::release);
+        if (Closeable.class.isInstance(delegate)) {
+            Closeable.class.cast(delegate).close();
+        }
         toRelease.clear();
     }
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/25984cbe/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
index 36e2e2c..09457cb 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
@@ -144,9 +144,6 @@ public class MapperBuilder {
             if (pretty) {
                 config.put(JsonGenerator.PRETTY_PRINTING, true);
             }
-            if (autoAdjustStringBuffers) {
-                config.put("org.apache.johnzon.auto-adjust-buffer", true);
-            }
 
             if (generatorFactory == null) {
                 generatorFactory = provider.createGeneratorFactory(config);
@@ -162,6 +159,9 @@ public class MapperBuilder {
             if (bufferSize > 0) {
                 config.put(JsonParserFactoryImpl.BUFFER_LENGTH, bufferSize);
             }
+            if (autoAdjustStringBuffers) {
+                config.put("org.apache.johnzon.auto-adjust-buffer", true);
+            }
             if (readerFactory == null) {
                 readerFactory = provider.createReaderFactory(config);
             }