JOHNZON-367 Allow Snippet size to be configurable (via @rmannibucau)
All code written by Romain Manni-Bucau
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 ab616cc..f841e30 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
@@ -108,6 +108,10 @@
         instance().writeTo(t, rawType, genericType, annotations, mediaType, httpHeaders, entityStream);
     }
 
+    public void setSnippetMaxLength(final int value) {
+        builder.setSnippetMaxLength(value);
+    }
+
     public void setUseJsRange(final boolean value) {
         builder.setUseJsRange(value);
     }
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 5075ed4..999df68 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
@@ -23,6 +23,7 @@
 import static java.util.Locale.ROOT;
 
 // import org.apache.johnzon.core.JsonParserFactoryImpl; // don't depend on core in mapper
+import org.apache.johnzon.core.Snippet;
 import org.apache.johnzon.mapper.access.AccessMode;
 import org.apache.johnzon.mapper.access.BaseAccessMode;
 import org.apache.johnzon.mapper.access.FieldAccessMode;
@@ -81,6 +82,7 @@
     private boolean pretty;
     private final Collection<Closeable> closeables = new ArrayList<Closeable>();
     private int version = -1;
+    private int snippetMaxLength = 50;
     private boolean close;
     private boolean skipNull = true;
     private boolean skipEmptyArray;
@@ -236,7 +238,8 @@
                         supportEnumContainerDeserialization,
                         typeLoader, discriminatorMapper, discriminator,
                         deserializationPredicate, serializationPredicate,
-                        enumConverterFactory),
+                        enumConverterFactory,
+                        new Snippet(snippetMaxLength, generatorFactory)),
                 closeables);
     }
 
@@ -248,6 +251,11 @@
         return adapters;
     }
 
+    public MapperBuilder setSnippetMaxLength(final int snippetMaxLength) {
+        this.snippetMaxLength = snippetMaxLength;
+        return this;
+    }
+
     public MapperBuilder setUseShortISO8601Format(final boolean useShortISO8601Format) {
         adapters.setUseShortISO8601Format(useShortISO8601Format);
         return this;
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 4d8bceb..eb8affc 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,11 +18,13 @@
  */
 package org.apache.johnzon.mapper;
 
+import org.apache.johnzon.core.Snippet;
 import org.apache.johnzon.mapper.access.AccessMode;
 import org.apache.johnzon.mapper.internal.AdapterKey;
 import org.apache.johnzon.mapper.internal.ConverterAdapter;
 import org.apache.johnzon.mapper.map.LazyConverterMap;
 
+import javax.json.Json;
 import javax.json.JsonValue;
 import java.lang.reflect.Type;
 import java.nio.charset.Charset;
@@ -36,6 +38,7 @@
 import java.util.function.Function;
 import java.util.function.Predicate;
 
+import static java.util.Collections.emptyMap;
 import static java.util.stream.Collectors.toList;
 
 /**
@@ -94,6 +97,42 @@
 
     private final Function<Class<?>, CustomEnumConverter<?>> enumConverterFactory;
 
+    private final Snippet snippet;
+
+    //CHECKSTYLE:OFF
+    @Deprecated
+    public MapperConfig(final LazyConverterMap adapters,
+                        final Map<Class<?>, ObjectConverter.Writer<?>> objectConverterWriters,
+                        final Map<Class<?>, ObjectConverter.Reader<?>> objectConverterReaders,
+                        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,
+                        final Comparator<String> attributeOrder,
+                        final boolean failOnUnknown,
+                        final SerializeValueFilter serializeValueFilter,
+                        final boolean useBigDecimalForFloats,
+                        final Boolean deduplicateObjects,
+                        final Map<Class<?>, Class<?>> interfaceImplementationMapping,
+                        final boolean useJsRange,
+                        final boolean useBigDecimalForObjectNumbers,
+                        final boolean supportEnumMapDeserialization,
+                        final Function<String, Class<?>> typeLoader,
+                        final Function<Class<?>, String> discriminatorMapper,
+                        final String discriminator,
+                        final Predicate<Class<?>> deserializationPredicate,
+                        final Predicate<Class<?>> serializationPredicate,
+                        final Function<Class<?>, CustomEnumConverter<?>> enumConverterFactory) {
+        //CHECKSTYLE:ON
+        this(adapters, objectConverterWriters, objectConverterReaders, version, close, skipNull, skipEmptyArray,
+                treatByteArrayAsBase64, treatByteArrayAsBase64URL, readAttributeBeforeWrite, accessMode, encoding,
+                attributeOrder, failOnUnknown, serializeValueFilter, useBigDecimalForFloats, deduplicateObjects, interfaceImplementationMapping,
+                useJsRange, useBigDecimalForObjectNumbers, supportEnumMapDeserialization, typeLoader,
+                discriminatorMapper, discriminator, deserializationPredicate, serializationPredicate, enumConverterFactory,
+                new Snippet(50, Json.createGeneratorFactory(emptyMap())));
+    }
+
     //disable checkstyle for 10+ parameters
     //CHECKSTYLE:OFF
     public MapperConfig(final LazyConverterMap adapters,
@@ -118,7 +157,8 @@
                         final String discriminator,
                         final Predicate<Class<?>> deserializationPredicate,
                         final Predicate<Class<?>> serializationPredicate,
-                        final Function<Class<?>, CustomEnumConverter<?>> enumConverterFactory) {
+                        final Function<Class<?>, CustomEnumConverter<?>> enumConverterFactory,
+                        final Snippet snippet) {
     //CHECKSTYLE:ON
         this.objectConverterWriters = objectConverterWriters;
         this.objectConverterReaders = objectConverterReaders;
@@ -156,6 +196,11 @@
         this.objectConverterReaderCache = new HashMap<>(objectConverterReaders.size());
         this.useBigDecimalForFloats = useBigDecimalForFloats;
         this.deduplicateObjects = deduplicateObjects;
+        this.snippet = snippet;
+    }
+
+    public Snippet getSnippet() {
+        return snippet;
     }
 
     public Function<Class<?>, CustomEnumConverter<?>> getEnumConverterFactory() {
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 5c8af0c..546f131 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
@@ -18,7 +18,6 @@
  */
 package org.apache.johnzon.mapper;
 
-import org.apache.johnzon.core.Snippet;
 import org.apache.johnzon.mapper.access.AccessMode;
 import org.apache.johnzon.mapper.converter.CharacterConverter;
 import org.apache.johnzon.mapper.internal.AdapterKey;
@@ -34,7 +33,6 @@
 import javax.json.JsonString;
 import javax.json.JsonStructure;
 import javax.json.JsonValue;
-
 import java.lang.reflect.Array;
 import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.InvocationTargetException;
@@ -109,7 +107,6 @@
      */
     private Map<String, Object> jsonPointers;
 
-
     public MappingParserImpl(MapperConfig config, Mappings mappings, JsonReader jsonReader, Map<String, Object> jsonPointers) {
         this.config = config;
         this.mappings = mappings;
@@ -347,7 +344,7 @@
             }
         }
         if (classMapping == null) {
-            throw new MapperException("Can't map JSON Object to " + type + ": " + new Snippet(50).of(object));
+            throw new MapperException("Can't map JSON Object to " + type + ": " + config.getSnippet().of(object));
         }
 
         if (applyObjectConverter && classMapping.reader != null && (skippedConverters == null || !skippedConverters.contains(type))) {