Return-Path: X-Original-To: apmail-johnzon-commits-archive@www.apache.org Delivered-To: apmail-johnzon-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 13D01195A4 for ; Sun, 3 Apr 2016 17:34:55 +0000 (UTC) Received: (qmail 30400 invoked by uid 500); 3 Apr 2016 17:34:55 -0000 Delivered-To: apmail-johnzon-commits-archive@johnzon.apache.org Received: (qmail 30390 invoked by uid 500); 3 Apr 2016 17:34:55 -0000 Mailing-List: contact commits-help@johnzon.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@johnzon.incubator.apache.org Delivered-To: mailing list commits@johnzon.incubator.apache.org Received: (qmail 30381 invoked by uid 99); 3 Apr 2016 17:34:54 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 03 Apr 2016 17:34:54 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 7819BC130D for ; Sun, 3 Apr 2016 17:34:54 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -4.216 X-Spam-Level: X-Spam-Status: No, score=-4.216 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.996] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id ui8rEQBkJPBa for ; Sun, 3 Apr 2016 17:34:52 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id 9092C5F3F1 for ; Sun, 3 Apr 2016 17:34:50 +0000 (UTC) Received: (qmail 30371 invoked by uid 99); 3 Apr 2016 17:34:49 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 03 Apr 2016 17:34:49 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 86B70DFE2E; Sun, 3 Apr 2016 17:34:49 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: rmannibucau@apache.org To: commits@johnzon.incubator.apache.org Message-Id: <7e06e8e5c6984a12bad941ca6216b0ea@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: incubator-johnzon git commit: ensuring mapper stays the only piece - excepted adapters map - where config can change at runtime + removing a johnzon-core import which shouldn't have been there Date: Sun, 3 Apr 2016 17:34:49 +0000 (UTC) Repository: incubator-johnzon Updated Branches: refs/heads/master 220899954 -> c755f1497 ensuring mapper stays the only piece - excepted adapters map - where config can change at runtime + removing a johnzon-core import which shouldn't have been there Project: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/commit/c755f149 Tree: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/tree/c755f149 Diff: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/diff/c755f149 Branch: refs/heads/master Commit: c755f1497cb2a341bba82375ab904609eb1a10db Parents: 2208999 Author: Romain manni-Bucau Authored: Sun Apr 3 19:34:24 2016 +0200 Committer: Romain manni-Bucau Committed: Sun Apr 3 19:34:24 2016 +0200 ---------------------------------------------------------------------- .../johnzon/mapper/JohnzonReaderHandler.java | 6 + .../java/org/apache/johnzon/mapper/Mapper.java | 25 +-- .../apache/johnzon/mapper/MapperBuilder.java | 170 ++++++++++---- .../org/apache/johnzon/mapper/MapperConfig.java | 224 +++++-------------- .../johnzon/mapper/MappingParserImpl.java | 2 - .../apache/johnzon/mapper/ReaderHandler.java | 8 + 6 files changed, 201 insertions(+), 234 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c755f149/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonReaderHandler.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonReaderHandler.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonReaderHandler.java index 3aeec4d..a89a354 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonReaderHandler.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonReaderHandler.java @@ -18,8 +18,10 @@ */ package org.apache.johnzon.mapper; +import org.apache.johnzon.core.JsonLongImpl; import org.apache.johnzon.core.JsonReaderImpl; +import javax.json.JsonNumber; import javax.json.JsonReader; import javax.json.JsonValue; @@ -32,4 +34,8 @@ public class JohnzonReaderHandler { public static JsonValue read(final JsonReader reader) { return JsonReaderImpl.class.cast(reader).readValue(); } + + public static boolean isLong(final JsonNumber number) { + return JsonLongImpl.class.isInstance(number); + } } http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c755f149/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java index 871a8b9..812863c 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java @@ -18,7 +18,6 @@ */ package org.apache.johnzon.mapper; -import org.apache.johnzon.core.JsonLongImpl; import org.apache.johnzon.mapper.access.AccessMode; import org.apache.johnzon.mapper.converter.EnumConverter; import org.apache.johnzon.mapper.internal.AdapterKey; @@ -171,11 +170,6 @@ public class Mapper implements Closeable { || type == float.class || type == Float.class; } - /*private String convertFrom(final Class aClass, final T value) { - final Converter converter = (Converter) findAdapter(aClass); - return doConvertFrom(value, converter); - }*/ - private static Object doConvertFrom(final T value, final Adapter converter) { if (converter == null) { throw new MapperException("can't convert " + value + " to String"); @@ -717,18 +711,19 @@ public class Mapper implements Closeable { final boolean any = fieldArgTypes.length < 2 || fieldArgTypes[1] == Object.class; for (final Map.Entry value : object.entrySet()) { final JsonValue jsonValue = value.getValue(); - if (JsonLongImpl.class.isInstance(jsonValue) && any) { + if (JsonNumber.class.isInstance(jsonValue) && any) { final JsonNumber number = JsonNumber.class.cast(jsonValue); - final int integer = number.intValue(); - final long asLong = number.longValue(); - if (integer == asLong) { - map.put(value.getKey(), integer); + if (readerHandler.isJsonLong(number)) { + final int integer = number.intValue(); + final long asLong = number.longValue(); + if (integer == asLong) { + map.put(value.getKey(), integer); + } else { + map.put(value.getKey(), asLong); + } } else { - map.put(value.getKey(), asLong); + map.put(value.getKey(), !number.isIntegral() ? number.bigDecimalValue() : number.intValue()); } - } else if (JsonNumber.class.isInstance(jsonValue) && any) { - final JsonNumber number = JsonNumber.class.cast(jsonValue); - map.put(value.getKey(), !number.isIntegral() ? number.bigDecimalValue() : number.intValue()); } else if (JsonString.class.isInstance(jsonValue) && any) { map.put(value.getKey(), JsonString.class.cast(jsonValue).getString()); } else { http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c755f149/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 cf3c4d8..d619d85 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 @@ -18,16 +18,32 @@ */ package org.apache.johnzon.mapper; +import org.apache.johnzon.core.JsonParserFactoryImpl; import org.apache.johnzon.mapper.access.AccessMode; import org.apache.johnzon.mapper.access.BaseAccessMode; import org.apache.johnzon.mapper.access.FieldAccessMode; import org.apache.johnzon.mapper.access.FieldAndMethodAccessMode; import org.apache.johnzon.mapper.access.MethodAccessMode; +import org.apache.johnzon.mapper.converter.BigDecimalConverter; +import org.apache.johnzon.mapper.converter.BigIntegerConverter; +import org.apache.johnzon.mapper.converter.BooleanConverter; +import org.apache.johnzon.mapper.converter.ByteConverter; +import org.apache.johnzon.mapper.converter.CachedDelegateConverter; +import org.apache.johnzon.mapper.converter.CharacterConverter; +import org.apache.johnzon.mapper.converter.ClassConverter; +import org.apache.johnzon.mapper.converter.DateConverter; +import org.apache.johnzon.mapper.converter.DoubleConverter; +import org.apache.johnzon.mapper.converter.FloatConverter; +import org.apache.johnzon.mapper.converter.IntegerConverter; +import org.apache.johnzon.mapper.converter.LocaleConverter; +import org.apache.johnzon.mapper.converter.LongConverter; +import org.apache.johnzon.mapper.converter.ShortConverter; +import org.apache.johnzon.mapper.converter.StringConverter; +import org.apache.johnzon.mapper.converter.URIConverter; +import org.apache.johnzon.mapper.converter.URLConverter; import org.apache.johnzon.mapper.internal.AdapterKey; import org.apache.johnzon.mapper.internal.ConverterAdapter; -import org.apache.johnzon.core.JsonParserFactoryImpl; - import javax.json.JsonReaderFactory; import javax.json.spi.JsonProvider; import javax.json.stream.JsonGenerator; @@ -35,18 +51,53 @@ import javax.json.stream.JsonGeneratorFactory; import java.io.Closeable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.URI; +import java.net.URL; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.Date; import java.util.HashMap; +import java.util.Locale; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +// this class is responsible to hold any needed config +// to build the runtime public class MapperBuilder { - private static final Map> DEFAULT_CONVERTERS = new HashMap>(23); - - - private MapperConfig builderConfig = new MapperConfig(); + private static final Map> DEFAULT_CONVERTERS = new HashMap>(24); + + static { + //DEFAULT_CONVERTERS.put(Date.class, new DateConverter("yyyy-MM-dd'T'HH:mm:ssZ")); // ISO8601 long RFC822 zone + DEFAULT_CONVERTERS.put(new AdapterKey(Date.class, String.class), new ConverterAdapter(new DateConverter("yyyyMMddHHmmssZ"))); // ISO8601 short + DEFAULT_CONVERTERS.put(new AdapterKey(URL.class, String.class), new ConverterAdapter(new URLConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(URI.class, String.class), new ConverterAdapter(new URIConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(Class.class, String.class), new ConverterAdapter>(new ClassConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(String.class, String.class), new ConverterAdapter(new StringConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(BigDecimal.class, String.class), new ConverterAdapter(new BigDecimalConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(BigInteger.class, String.class), new ConverterAdapter(new BigIntegerConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(Byte.class, String.class), new ConverterAdapter(new CachedDelegateConverter(new ByteConverter()))); + DEFAULT_CONVERTERS.put(new AdapterKey(Character.class, String.class), new ConverterAdapter(new CharacterConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(Double.class, String.class), new ConverterAdapter(new DoubleConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(Float.class, String.class), new ConverterAdapter(new FloatConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(Integer.class, String.class), new ConverterAdapter(new IntegerConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(Long.class, String.class), new ConverterAdapter(new LongConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(Short.class, String.class), new ConverterAdapter(new ShortConverter())); + DEFAULT_CONVERTERS.put(new AdapterKey(Boolean.class, String.class), new ConverterAdapter(new CachedDelegateConverter(new BooleanConverter()))); + DEFAULT_CONVERTERS.put(new AdapterKey(byte.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Byte.class, String.class))); + DEFAULT_CONVERTERS.put(new AdapterKey(char.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Character.class, String.class))); + DEFAULT_CONVERTERS.put(new AdapterKey(double.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Double.class, String.class))); + DEFAULT_CONVERTERS.put(new AdapterKey(float.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Float.class, String.class))); + DEFAULT_CONVERTERS.put(new AdapterKey(int.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Integer.class, String.class))); + DEFAULT_CONVERTERS.put(new AdapterKey(long.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Long.class, String.class))); + DEFAULT_CONVERTERS.put(new AdapterKey(short.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Short.class, String.class))); + DEFAULT_CONVERTERS.put(new AdapterKey(boolean.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Boolean.class, String.class))); + DEFAULT_CONVERTERS.put(new AdapterKey(Locale.class, String.class), new LocaleConverter()); + } private JsonReaderFactory readerFactory; private JsonGeneratorFactory generatorFactory; @@ -58,7 +109,21 @@ public class MapperBuilder { private boolean supportConstructors; private boolean useGetterForCollections; private String accessModeName; + private boolean pretty; private final Collection closeables = new ArrayList(); + private int version = -1; + private boolean close; + private boolean skipNull = true; + private boolean skipEmptyArray; + private boolean supportsComments; + private boolean treatByteArrayAsBase64; + private boolean treatByteArrayAsBase64URL; + private boolean readAttributeBeforeWrite; + private AccessMode accessMode; + private Charset encoding = Charset.forName(System.getProperty("johnzon.mapper.encoding", "UTF-8")); + private ConcurrentMap> adapters = new ConcurrentHashMap>(DEFAULT_CONVERTERS); + private Map, ObjectConverter> objectConverters = new HashMap, ObjectConverter>(); + private Map, String[]> ignoredForFields = new HashMap, String[]>(); public Mapper build() { if (readerFactory == null || generatorFactory == null) { @@ -67,7 +132,7 @@ public class MapperBuilder { if (bufferStrategy != null) { config.put(JsonParserFactoryImpl.BUFFER_STRATEGY, bufferStrategy); } - if (builderConfig.isPrettyPrint()) { + if (pretty) { config.put(JsonGenerator.PRETTY_PRINTING, true); } @@ -76,7 +141,7 @@ public class MapperBuilder { } config.remove(JsonGenerator.PRETTY_PRINTING); // doesnt mean anything anymore for reader - if (builderConfig.isSupportsComments()) { + if (supportsComments) { config.put(JsonParserFactoryImpl.SUPPORTS_COMMENTS, "true"); } if (maxSize > 0) { @@ -90,28 +155,45 @@ public class MapperBuilder { } } - if (builderConfig.getAccessMode() == null) { + if (accessMode == null) { if ("field".equalsIgnoreCase(accessModeName)) { - builderConfig.setAccessMode(new FieldAccessMode(supportConstructors, supportHiddenAccess)); + accessMode = new FieldAccessMode(supportConstructors, supportHiddenAccess); } else if ("method".equalsIgnoreCase(accessModeName)) { - builderConfig.setAccessMode(new MethodAccessMode(supportConstructors, supportHiddenAccess, true)); + accessMode = new MethodAccessMode(supportConstructors, supportHiddenAccess, true); } else if ("strict-method".equalsIgnoreCase(accessModeName)) { - builderConfig.setAccessMode(new MethodAccessMode(supportConstructors, supportHiddenAccess, false)); + accessMode = new MethodAccessMode(supportConstructors, supportHiddenAccess, false); } else if ("both".equalsIgnoreCase(accessModeName)) { - builderConfig.setAccessMode(new FieldAndMethodAccessMode(supportConstructors, supportHiddenAccess)); + accessMode = new FieldAndMethodAccessMode(supportConstructors, supportHiddenAccess); } else { - builderConfig.setAccessMode(new MethodAccessMode(supportConstructors, supportHiddenAccess, useGetterForCollections)); + accessMode = new MethodAccessMode(supportConstructors, supportHiddenAccess, useGetterForCollections); + } + } + if (!ignoredForFields.isEmpty()) { + if (BaseAccessMode.class.isInstance(accessMode)) { + final BaseAccessMode baseAccessMode = BaseAccessMode.class.cast(accessMode); + for (final Map.Entry, String[]> ignored : ignoredForFields.entrySet()) { + final String[] fields = ignored.getValue(); + if (fields == null || fields.length == 0) { + baseAccessMode.getFieldsToRemove().remove(ignored.getKey()); + } else { + baseAccessMode.getFieldsToRemove().put(ignored.getKey(), fields); + } + } + } else { + throw new IllegalStateException("AccessMode is not an BaseAccessMode"); } } - - // new config so builderConfig can get tweaked again. - MapperConfig mapperConfig = builderConfig.clone(); return new Mapper( - readerFactory, generatorFactory, - mapperConfig, - attributeOrder, - closeables); + readerFactory, generatorFactory, + new MapperConfig( + adapters, objectConverters, + version, close, + skipNull, skipEmptyArray, + treatByteArrayAsBase64, treatByteArrayAsBase64URL, readAttributeBeforeWrite, + accessMode, encoding), + attributeOrder, + closeables); } public MapperBuilder addCloseable(final Closeable closeable) { @@ -120,15 +202,7 @@ public class MapperBuilder { } public MapperBuilder setIgnoreFieldsForType(final Class type, final String... fields) { - if (BaseAccessMode.class.isInstance(builderConfig.getAccessMode())) { - if (fields == null || fields.length == 0) { - BaseAccessMode.class.cast(builderConfig.getAccessMode()).getFieldsToRemove().remove(type); - } else { - BaseAccessMode.class.cast(builderConfig.getAccessMode()).getFieldsToRemove().put(type, fields); - } - } else { - throw new IllegalStateException("AccessMode is not an BaseAccessMode"); - } + ignoredForFields.put(type, fields == null ? new String[0] : fields); return this; } @@ -138,12 +212,12 @@ public class MapperBuilder { } public MapperBuilder setSupportsComments(final boolean supportsComments) { - builderConfig.setSupportsComments(supportsComments); + this.supportsComments = supportsComments; return this; } public MapperBuilder setPretty(final boolean pretty) { - builderConfig.setPrettyPrint(pretty); + this.pretty = pretty; return this; } @@ -163,13 +237,13 @@ public class MapperBuilder { } public MapperBuilder setAccessMode(final AccessMode mode) { - builderConfig.setAccessMode(mode); + this.accessMode = mode; return this; } public MapperBuilder setAccessModeName(final String mode) { if (!"field".equalsIgnoreCase(mode) && !"method".equalsIgnoreCase(mode) && - !"strict-method".equalsIgnoreCase(mode) && !"both".equalsIgnoreCase(mode)) { + !"strict-method".equalsIgnoreCase(mode) && !"both".equalsIgnoreCase(mode)) { throw new IllegalArgumentException("Mode " + mode + " unsupported"); } this.accessModeName = mode; @@ -197,24 +271,24 @@ public class MapperBuilder { } public MapperBuilder setDoCloseOnStreams(final boolean doCloseOnStreams) { - builderConfig.setClose(doCloseOnStreams); + this.close = doCloseOnStreams; return this; } @Deprecated // use addAdapter public MapperBuilder addPropertyEditor(final Class clazz, final Converter converter) { - builderConfig.addAdapter(new AdapterKey(clazz, String.class), new ConverterAdapter(converter)); + adapters.put(new AdapterKey(clazz, String.class), new ConverterAdapter(converter)); return this; } @Deprecated // use addAdapter public MapperBuilder addConverter(final Type clazz, final Converter converter) { - builderConfig.addAdapter(new AdapterKey(clazz, String.class), new ConverterAdapter(converter)); + adapters.put(new AdapterKey(clazz, String.class), new ConverterAdapter(converter)); return this; } public MapperBuilder addAdapter(final Type from, final Type to, final Adapter adapter) { - builderConfig.addAdapter(new AdapterKey(from, to), adapter); + adapters.put(new AdapterKey(from, to), adapter); return this; } @@ -222,7 +296,7 @@ public class MapperBuilder { for (final Type gi : converter.getClass().getGenericInterfaces()) { if (ParameterizedType.class.isInstance(gi) && Adapter.class == ParameterizedType.class.cast(gi).getRawType()) { final Type[] args = ParameterizedType.class.cast(gi).getActualTypeArguments(); - builderConfig.addAdapter(new AdapterKey(args[0], args[1]), converter); + adapters.put(new AdapterKey(args[0], args[1]), converter); return this; } } @@ -230,27 +304,27 @@ public class MapperBuilder { } public MapperBuilder setVersion(final int version) { - builderConfig.setVersion(version); + this.version = version; return this; } public MapperBuilder setSkipNull(final boolean skipNull) { - builderConfig.setSkipNull(skipNull); + this.skipNull = skipNull; return this; } public MapperBuilder setSkipEmptyArray(final boolean skipEmptyArray) { - builderConfig.setSkipEmptyArray(skipEmptyArray); + this.skipEmptyArray = skipEmptyArray; return this; } public MapperBuilder setTreatByteArrayAsBase64(final boolean treatByteArrayAsBase64) { - builderConfig.setTreatByteArrayAsBase64(treatByteArrayAsBase64); + this.treatByteArrayAsBase64 = treatByteArrayAsBase64; return this; } public MapperBuilder setTreatByteArrayAsBase64URL(final boolean treatByteArrayAsBase64URL) { - builderConfig.setTreatByteArrayAsBase64URL(treatByteArrayAsBase64URL); + this.treatByteArrayAsBase64URL = treatByteArrayAsBase64URL; return this; } @@ -260,17 +334,17 @@ public class MapperBuilder { } public MapperBuilder setEncoding(final String encoding) { - builderConfig.setEncoding(Charset.forName(encoding)); + this.encoding = Charset.forName(encoding); return this; } public MapperBuilder setReadAttributeBeforeWrite(final boolean readAttributeBeforeWrite) { - builderConfig.setReadAttributeBeforeWrite(readAttributeBeforeWrite); + this.readAttributeBeforeWrite = readAttributeBeforeWrite; return this; } - public MapperBuilder addObjectConverter(Class targetType, ObjectConverter objectConverter) { - builderConfig.addObjectConverter(targetType, objectConverter); + public MapperBuilder addObjectConverter(final Class targetType, final ObjectConverter objectConverter) { + this.objectConverters.put(targetType, objectConverter); return this; } http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c755f149/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java index 39ee8cf..d650769 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java @@ -18,99 +18,71 @@ */ package org.apache.johnzon.mapper; -import java.lang.reflect.Type; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.net.URI; -import java.net.URL; -import java.nio.charset.Charset; -import java.util.Date; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - import org.apache.johnzon.mapper.access.AccessMode; -import org.apache.johnzon.mapper.converter.BigDecimalConverter; -import org.apache.johnzon.mapper.converter.BigIntegerConverter; -import org.apache.johnzon.mapper.converter.BooleanConverter; -import org.apache.johnzon.mapper.converter.ByteConverter; -import org.apache.johnzon.mapper.converter.CachedDelegateConverter; -import org.apache.johnzon.mapper.converter.CharacterConverter; -import org.apache.johnzon.mapper.converter.ClassConverter; -import org.apache.johnzon.mapper.converter.DateConverter; -import org.apache.johnzon.mapper.converter.DoubleConverter; import org.apache.johnzon.mapper.converter.EnumConverter; -import org.apache.johnzon.mapper.converter.FloatConverter; -import org.apache.johnzon.mapper.converter.IntegerConverter; -import org.apache.johnzon.mapper.converter.LocaleConverter; -import org.apache.johnzon.mapper.converter.LongConverter; -import org.apache.johnzon.mapper.converter.ShortConverter; -import org.apache.johnzon.mapper.converter.StringConverter; -import org.apache.johnzon.mapper.converter.URIConverter; -import org.apache.johnzon.mapper.converter.URLConverter; import org.apache.johnzon.mapper.internal.AdapterKey; import org.apache.johnzon.mapper.internal.ConverterAdapter; +import java.lang.reflect.Type; +import java.nio.charset.Charset; +import java.util.Map; +import java.util.concurrent.ConcurrentMap; + /** - * Contains internal configuration for all the mapper stuff + * Contains internal configuration for all the mapper stuff. + * It needs to be immutable and 100% runtime oriented. */ class MapperConfig implements Cloneable { - private static final Map> DEFAULT_CONVERTERS = new HashMap>(23); - static { - //DEFAULT_CONVERTERS.put(Date.class, new DateConverter("yyyy-MM-dd'T'HH:mm:ssZ")); // ISO8601 long RFC822 zone - DEFAULT_CONVERTERS.put(new AdapterKey(Date.class, String.class), new ConverterAdapter(new DateConverter("yyyyMMddHHmmssZ"))); // ISO8601 short - DEFAULT_CONVERTERS.put(new AdapterKey(URL.class, String.class), new ConverterAdapter(new URLConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(URI.class, String.class), new ConverterAdapter(new URIConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(Class.class, String.class), new ConverterAdapter>(new ClassConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(String.class, String.class), new ConverterAdapter(new StringConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(BigDecimal.class, String.class), new ConverterAdapter(new BigDecimalConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(BigInteger.class, String.class), new ConverterAdapter(new BigIntegerConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(Byte.class, String.class), new ConverterAdapter(new CachedDelegateConverter(new ByteConverter()))); - DEFAULT_CONVERTERS.put(new AdapterKey(Character.class, String.class), new ConverterAdapter(new CharacterConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(Double.class, String.class), new ConverterAdapter(new DoubleConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(Float.class, String.class), new ConverterAdapter(new FloatConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(Integer.class, String.class), new ConverterAdapter(new IntegerConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(Long.class, String.class), new ConverterAdapter(new LongConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(Short.class, String.class), new ConverterAdapter(new ShortConverter())); - DEFAULT_CONVERTERS.put(new AdapterKey(Boolean.class, String.class), new ConverterAdapter(new CachedDelegateConverter(new BooleanConverter()))); - DEFAULT_CONVERTERS.put(new AdapterKey(byte.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Byte.class, String.class))); - DEFAULT_CONVERTERS.put(new AdapterKey(char.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Character.class, String.class))); - DEFAULT_CONVERTERS.put(new AdapterKey(double.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Double.class, String.class))); - DEFAULT_CONVERTERS.put(new AdapterKey(float.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Float.class, String.class))); - DEFAULT_CONVERTERS.put(new AdapterKey(int.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Integer.class, String.class))); - DEFAULT_CONVERTERS.put(new AdapterKey(long.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Long.class, String.class))); - DEFAULT_CONVERTERS.put(new AdapterKey(short.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Short.class, String.class))); - DEFAULT_CONVERTERS.put(new AdapterKey(boolean.class, String.class), DEFAULT_CONVERTERS.get(new AdapterKey(Boolean.class, String.class))); - DEFAULT_CONVERTERS.put(new AdapterKey(Locale.class, String.class), new LocaleConverter()); + private final int version; + private final boolean close; + private final boolean skipNull; + private final boolean skipEmptyArray; + private final boolean treatByteArrayAsBase64; + private final boolean treatByteArrayAsBase64URL; + private final boolean readAttributeBeforeWrite; + private final AccessMode accessMode; + private final Charset encoding; + private final ConcurrentMap> adapters; + private final Map, ObjectConverter> objectConverters; + + public MapperConfig(final ConcurrentMap> adapters, + final Map, ObjectConverter> objectConverters, + final int version, final boolean close, + final boolean skipNull, final boolean skipEmptyArray, + final boolean treatByteArrayAsBase64, final boolean treatByteArrayAsBase64URL, + final boolean readAttributeBeforeWrite, + final AccessMode accessMode, final Charset encoding) { + this.objectConverters = objectConverters; + this.version = version; + this.close = close; + this.skipNull = skipNull; + this.skipEmptyArray = skipEmptyArray; + this.treatByteArrayAsBase64 = treatByteArrayAsBase64; + this.treatByteArrayAsBase64URL = treatByteArrayAsBase64URL; + this.readAttributeBeforeWrite = readAttributeBeforeWrite; + this.accessMode = accessMode; + this.encoding = encoding; + this.adapters = adapters; } - - private int version = -1; - - private boolean close = false; - private boolean skipNull = true; - private boolean skipEmptyArray = false; - private boolean supportsComments = false; - private boolean treatByteArrayAsBase64; - private boolean treatByteArrayAsBase64URL; - private boolean readAttributeBeforeWrite; - private boolean prettyPrint; - private AccessMode accessMode; - private Charset encoding = Charset.forName(System.getProperty("johnzon.mapper.encoding", "UTF-8")); - private ConcurrentMap> adapters = new ConcurrentHashMap>(DEFAULT_CONVERTERS);; - - - //X TODO we need a more elaborated approache at the end, but for now it's fine - private Map, ObjectConverter> objectConverters = new HashMap, ObjectConverter>(); - - - MapperConfig() { + public Adapter findAdapter(final Type aClass) { + final Adapter converter = adapters.get(new AdapterKey(aClass, String.class)); + if (converter != null) { + return converter; + } + if (Class.class.isInstance(aClass)) { + final Class clazz = Class.class.cast(aClass); + if (clazz.isEnum()) { + final Adapter enumConverter = new ConverterAdapter(new EnumConverter(clazz)); + adapters.putIfAbsent(new AdapterKey(String.class, aClass), enumConverter); + return enumConverter; + } + } + return null; } - void setClose(boolean close) { - this.close = close; + public int getVersion() { + return version; } public boolean isClose() { @@ -121,121 +93,35 @@ class MapperConfig implements Cloneable { return skipNull; } - void setSkipNull(boolean skipNull) { - this.skipNull = skipNull; - } - public boolean isSkipEmptyArray() { return skipEmptyArray; } - void setSkipEmptyArray(boolean skipEmptyArray) { - this.skipEmptyArray = skipEmptyArray; - } - - public boolean isSupportsComments() { - return supportsComments; - } - - void setSupportsComments(boolean supportsComments) { - this.supportsComments = supportsComments; - } - public boolean isTreatByteArrayAsBase64() { return treatByteArrayAsBase64; } - void setTreatByteArrayAsBase64(boolean treatByteArrayAsBase64) { - this.treatByteArrayAsBase64 = treatByteArrayAsBase64; - } - public boolean isTreatByteArrayAsBase64URL() { return treatByteArrayAsBase64URL; } - void setTreatByteArrayAsBase64URL(boolean treatByteArrayAsBase64URL) { - this.treatByteArrayAsBase64URL = treatByteArrayAsBase64URL; - } - public boolean isReadAttributeBeforeWrite() { return readAttributeBeforeWrite; } - void setReadAttributeBeforeWrite(boolean readAttributeBeforeWrite) { - this.readAttributeBeforeWrite = readAttributeBeforeWrite; - } - - public boolean isPrettyPrint() { - return prettyPrint; - } - - void setPrettyPrint(boolean prettyPrint) { - this.prettyPrint = prettyPrint; - } - public AccessMode getAccessMode() { return accessMode; } - void setAccessMode(AccessMode accessMode) { - this.accessMode = accessMode; - } - public Charset getEncoding() { return encoding; } - void setEncoding(Charset encoding) { - this.encoding = encoding; - } - - void addObjectConverter(Class targetType, ObjectConverter objectConverter) { - objectConverters.put(targetType, objectConverter); - } - - public Map, ObjectConverter> getObjectConverters() { - return objectConverters; - } - public ConcurrentMap> getAdapters() { return adapters; } - void addAdapter(AdapterKey adapterKey, Adapter adapter) { - adapters.put(adapterKey, adapter); - } - - public int getVersion() { - return version; - } - - void setVersion(int version) { - this.version = version; - } - - public Adapter findAdapter(final Type aClass) { - final Adapter converter = adapters.get(new AdapterKey(aClass, String.class)); - if (converter != null) { - return converter; - } - if (Class.class.isInstance(aClass)) { - final Class clazz = Class.class.cast(aClass); - if (clazz.isEnum()) { - final Adapter enumConverter = new ConverterAdapter(new EnumConverter(clazz)); - adapters.putIfAbsent(new AdapterKey(String.class, aClass), enumConverter); - return enumConverter; - } - } - return null; - } - - - @Override - public MapperConfig clone() { - try { - return (MapperConfig) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } + public Map, ObjectConverter> getObjectConverters() { + return objectConverters; } } http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c755f149/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java index cd92fdc..369b9b8 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java @@ -30,12 +30,10 @@ import org.apache.johnzon.core.JsonReaderImpl; * This class is not concurrently usable as it contains state. */ public class MappingParserImpl implements MappingParser { - private final JsonParser jsonParser; private JsonReader jsonReader = null; - public MappingParserImpl(JsonParser jsonParser) { this.jsonParser = jsonParser; } http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c755f149/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/ReaderHandler.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/ReaderHandler.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/ReaderHandler.java index 42e272e..c317cab 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/ReaderHandler.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/ReaderHandler.java @@ -18,6 +18,7 @@ */ package org.apache.johnzon.mapper; +import javax.json.JsonNumber; import javax.json.JsonReader; import javax.json.JsonReaderFactory; import javax.json.JsonValue; @@ -42,4 +43,11 @@ public class ReaderHandler { } return reader.read(); } + + public boolean isJsonLong(final JsonNumber number) { + if (johnzon) { + return JohnzonReaderHandler.isLong(number); + } + return false; // will be slower but not a big deal + } }