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 <[email protected]> Authored: Sat Jun 24 14:50:11 2017 +0200 Committer: rmannibucau <[email protected]> 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); }
