This is an automated email from the ASF dual-hosted git repository. jlmonteiro pushed a commit to branch johnzon-1.2.x in repository https://gitbox.apache.org/repos/asf/johnzon.git
commit 8e2b28157314b2b264be039371be24f1ca372cbb Author: Jean-Louis Monteiro <[email protected]> AuthorDate: Sat May 13 09:54:19 2023 +0200 feat(JOHNZON-397): make sure to pass the provider instance so we can configure the scale per provider --- .../johnzon/core/CommentsJsonStreamParserImpl.java | 12 ++--- .../apache/johnzon/core/JohnzonJsonParserImpl.java | 15 ++++-- .../apache/johnzon/core/JsonArrayBuilderImpl.java | 25 +++++----- .../johnzon/core/JsonBuilderFactoryImpl.java | 16 +++--- .../apache/johnzon/core/JsonInMemoryParser.java | 8 ++- .../apache/johnzon/core/JsonMergePatchDiff.java | 9 ++-- .../apache/johnzon/core/JsonMergePatchImpl.java | 9 ++-- .../org/apache/johnzon/core/JsonNumberImpl.java | 26 +++------- .../apache/johnzon/core/JsonObjectBuilderImpl.java | 19 +++++--- .../apache/johnzon/core/JsonParserFactoryImpl.java | 20 ++++---- .../org/apache/johnzon/core/JsonProviderImpl.java | 57 +++++++++++++--------- .../apache/johnzon/core/JsonReaderFactoryImpl.java | 14 +++--- .../org/apache/johnzon/core/JsonReaderImpl.java | 26 +++++----- .../apache/johnzon/core/JsonStreamParserImpl.java | 15 +++--- .../org/apache/johnzon/core/JsonNumberTest.java | 6 +-- .../johnzon/core/JsonParserStreamingTest.java | 3 +- .../org/apache/johnzon/core/JsonParserTest.java | 6 +-- .../johnzon/core/JsonStreamParserImplTest.java | 8 +-- .../org/apache/johnzon/core/SerializationTest.java | 3 +- .../org/apache/johnzon/jsonb/JohnzonBuilder.java | 12 ++--- .../apache/johnzon/mapper/MapperConfigTest.java | 2 +- .../test/java/org/superbiz/ExtendMappingTest.java | 4 +- 22 files changed, 171 insertions(+), 144 deletions(-) diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/CommentsJsonStreamParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/CommentsJsonStreamParserImpl.java index f9d298e6..fb199bda 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/CommentsJsonStreamParserImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/CommentsJsonStreamParserImpl.java @@ -27,8 +27,8 @@ public class CommentsJsonStreamParserImpl extends JsonStreamParserImpl { final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer, - final boolean autoAdjust) { - super(inputStream, maxStringLength, bufferProvider, valueBuffer, autoAdjust); + final boolean autoAdjust, final JsonProviderImpl provider) { + super(inputStream, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider); } public CommentsJsonStreamParserImpl(final InputStream inputStream, @@ -36,16 +36,16 @@ public class CommentsJsonStreamParserImpl extends JsonStreamParserImpl { final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer, - final boolean autoAdjust) { - super(inputStream, encoding, maxStringLength, bufferProvider, valueBuffer, autoAdjust); + final boolean autoAdjust, final JsonProviderImpl provider) { + super(inputStream, encoding, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider); } public CommentsJsonStreamParserImpl(final Reader reader, final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer, - final boolean autoAdjust) { - super(reader, maxStringLength, bufferProvider, valueBuffer, autoAdjust); + final boolean autoAdjust, final JsonProviderImpl provider) { + super(reader, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider); } @Override diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java index 61cb7080..16d26400 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java @@ -50,6 +50,13 @@ public abstract class JohnzonJsonParserImpl implements JohnzonJsonParser { private boolean manualNext = false; + private final JsonProviderImpl provider; + + protected JohnzonJsonParserImpl(final JsonProviderImpl provider) { + this.provider = provider; + } + + @Override public Event next() { manualNext = true; @@ -65,7 +72,7 @@ public abstract class JohnzonJsonParserImpl implements JohnzonJsonParser { throw new IllegalStateException(current + " doesn't support getObject()"); } - JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT); + JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT, provider); return jsonReader.readObject(); } @@ -77,7 +84,7 @@ public abstract class JohnzonJsonParserImpl implements JohnzonJsonParser { throw new IllegalStateException(current + " doesn't support getArray()"); } - JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT); + JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT, provider); return jsonReader.readArray(); } @@ -87,7 +94,7 @@ public abstract class JohnzonJsonParserImpl implements JohnzonJsonParser { switch (current) { case START_ARRAY: case START_OBJECT: - JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT); + JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, getCharArrayProvider(), RejectDuplicateKeysMode.DEFAULT, provider); return jsonReader.readValue(); case VALUE_TRUE: return JsonValue.TRUE; @@ -102,7 +109,7 @@ public abstract class JohnzonJsonParserImpl implements JohnzonJsonParser { if (isFitLong()) { return new JsonLongImpl(getLong()); } - return new JsonNumberImpl(getBigDecimal()); + return new JsonNumberImpl(getBigDecimal(), provider::checkBigDecimalScale); default: throw new IllegalStateException(current + " doesn't support getValue()"); } diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java index 1ee44fcd..87c9a161 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java @@ -36,6 +36,7 @@ import org.apache.johnzon.core.util.ArrayUtil; class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { private RejectDuplicateKeysMode rejectDuplicateKeysMode; + private JsonProviderImpl jsonProvider; private List<JsonValue> tmpList; private BufferStrategy.BufferProvider<char[]> bufferProvider; @@ -45,14 +46,15 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { public JsonArrayBuilderImpl(final JsonArray initialData, final BufferStrategy.BufferProvider<char[]> provider, - final RejectDuplicateKeysMode rejectDuplicateKeysMode) { + final RejectDuplicateKeysMode rejectDuplicateKeysMode, final JsonProviderImpl jsonProvider) { this.tmpList = new ArrayList<>(initialData); this.bufferProvider = provider; this.rejectDuplicateKeysMode = rejectDuplicateKeysMode; + this.jsonProvider = jsonProvider; } public JsonArrayBuilderImpl(final Collection<?> initialData, final BufferStrategy.BufferProvider<char[]> provider, - final RejectDuplicateKeysMode rejectDuplicateKeysMode) { + final RejectDuplicateKeysMode rejectDuplicateKeysMode, final JsonProviderImpl jsonProvider) { this.bufferProvider = provider; this.rejectDuplicateKeysMode = rejectDuplicateKeysMode; this.tmpList = new ArrayList<>(); @@ -61,6 +63,7 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { add(initialValue); } } + this.jsonProvider = jsonProvider; } @Override @@ -83,13 +86,13 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { @Override public JsonArrayBuilder add(final int index, final BigDecimal value) { - addValue(index, new JsonNumberImpl(value)); + addValue(index, new JsonNumberImpl(value, jsonProvider::checkBigDecimalScale)); return this; } @Override public JsonArrayBuilder add(final int index, final BigInteger value) { - addValue(index, new JsonNumberImpl(new BigDecimal(value))); + addValue(index, new JsonNumberImpl(new BigDecimal(value), jsonProvider::checkBigDecimalScale)); return this; } @@ -149,13 +152,13 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { @Override public JsonArrayBuilder set(final int index, final BigDecimal value) { - setValue(index, new JsonNumberImpl(value)); + setValue(index, new JsonNumberImpl(value, jsonProvider::checkBigDecimalScale)); return this; } @Override public JsonArrayBuilder set(final int index, final BigInteger value) { - setValue(index, new JsonNumberImpl(new BigDecimal(value))); + setValue(index, new JsonNumberImpl(new BigDecimal(value), jsonProvider::checkBigDecimalScale)); return this; } @@ -225,12 +228,12 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { } else if (value instanceof String) { add((String) value); } else if (value instanceof Map) { - add(new JsonObjectBuilderImpl(Map.class.cast(value), bufferProvider, rejectDuplicateKeysMode).build()); + add(new JsonObjectBuilderImpl(Map.class.cast(value), bufferProvider, rejectDuplicateKeysMode, jsonProvider).build()); } else if (value instanceof Collection) { - add(new JsonArrayBuilderImpl(Collection.class.cast(value), bufferProvider, rejectDuplicateKeysMode).build()); + add(new JsonArrayBuilderImpl(Collection.class.cast(value), bufferProvider, rejectDuplicateKeysMode, jsonProvider).build()); } else if (value.getClass().isArray()) { final Collection<Object> collection = ArrayUtil.newCollection(value); - add(new JsonArrayBuilderImpl(collection, bufferProvider, rejectDuplicateKeysMode).build()); + add(new JsonArrayBuilderImpl(collection, bufferProvider, rejectDuplicateKeysMode, jsonProvider).build()); } else { throw new JsonException("Illegal JSON type! type=" + value.getClass()); } @@ -252,13 +255,13 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { @Override public JsonArrayBuilder add(final BigDecimal value) { - addValue(new JsonNumberImpl(value)); + addValue(new JsonNumberImpl(value, jsonProvider::checkBigDecimalScale)); return this; } @Override public JsonArrayBuilder add(final BigInteger value) { - addValue(new JsonNumberImpl(new BigDecimal(value))); + addValue(new JsonNumberImpl(new BigDecimal(value), jsonProvider::checkBigDecimalScale)); return this; } diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java index efd10fe6..99ec7e2d 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java @@ -37,6 +37,7 @@ import static java.util.Collections.emptyMap; class JsonBuilderFactoryImpl implements JsonBuilderFactory, Serializable { private final Map<String, Object> internalConfig = new HashMap<String, Object>(); private RejectDuplicateKeysMode rejectDuplicateKeysMode; + private JsonProviderImpl provider; private BufferStrategy.BufferProvider<char[]> bufferProvider; private static final List<String> SUPPORTED_CONFIG_KEYS = RejectDuplicateKeysMode.CONFIG_KEYS; @@ -45,9 +46,10 @@ class JsonBuilderFactoryImpl implements JsonBuilderFactory, Serializable { } JsonBuilderFactoryImpl(final Map<String, ?> config, final BufferStrategy.BufferProvider<char[]> bufferProvider, - final RejectDuplicateKeysMode rejectDuplicateKeysMode) { + final RejectDuplicateKeysMode rejectDuplicateKeysMode, final JsonProviderImpl provider) { this.bufferProvider = bufferProvider; this.rejectDuplicateKeysMode = rejectDuplicateKeysMode; + this.provider = provider; if (config != null && !config.isEmpty()) { for (String configKey : config.keySet()) { if(SUPPORTED_CONFIG_KEYS.contains(configKey)) { @@ -62,28 +64,28 @@ class JsonBuilderFactoryImpl implements JsonBuilderFactory, Serializable { @Override public JsonObjectBuilder createObjectBuilder() { - return new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode); + return new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode, provider); } @Override public JsonObjectBuilder createObjectBuilder(JsonObject initialData) { - return new JsonObjectBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode); + return new JsonObjectBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode, provider); } @Override public JsonArrayBuilder createArrayBuilder() { - return new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode); + return new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode, provider); } @Override public JsonArrayBuilder createArrayBuilder(JsonArray initialData) { - return new JsonArrayBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode); + return new JsonArrayBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode, provider); } @Override public JsonArrayBuilder createArrayBuilder(Collection<?> initialData) { - return new JsonArrayBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode); + return new JsonArrayBuilderImpl(initialData, bufferProvider, rejectDuplicateKeysMode, provider); } @Override @@ -93,7 +95,7 @@ class JsonBuilderFactoryImpl implements JsonBuilderFactory, Serializable { @Override public JsonObjectBuilder createObjectBuilder(Map<String, Object> initialValues) { - return new JsonObjectBuilderImpl(initialValues, bufferProvider, rejectDuplicateKeysMode); + return new JsonObjectBuilderImpl(initialValues, bufferProvider, rejectDuplicateKeysMode, provider); } } diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java index 740a1007..e7f99560 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java @@ -216,12 +216,16 @@ class JsonInMemoryParser extends JohnzonJsonParserImpl { } - JsonInMemoryParser(final JsonObject object, final BufferStrategy.BufferProvider<char[]> bufferProvider) { + JsonInMemoryParser(final JsonObject object, final BufferStrategy.BufferProvider<char[]> bufferProvider, + final JsonProviderImpl provider) { + super(provider); stack.push(new ObjectIterator(object)); this.bufferProvider = bufferProvider; } - JsonInMemoryParser(final JsonArray array, final BufferStrategy.BufferProvider<char[]> bufferProvider) { + JsonInMemoryParser(final JsonArray array, final BufferStrategy.BufferProvider<char[]> bufferProvider, + final JsonProviderImpl provider) { + super(provider); stack.push(new ArrayIterator(array)); this.bufferProvider = bufferProvider; } diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java index 3825229b..e137e90d 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java @@ -32,20 +32,23 @@ class JsonMergePatchDiff extends DiffBase { private final BufferStrategy.BufferProvider<char[]> bufferProvider; private final JsonValue source; private final JsonValue target; + private JsonProviderImpl provider; public JsonMergePatchDiff(final JsonValue source, final JsonValue target, - final BufferStrategy.BufferProvider<char[]> bufferProvider) { + final BufferStrategy.BufferProvider<char[]> bufferProvider, + final JsonProviderImpl provider) { this.bufferProvider = bufferProvider; this.source = source; this.target = target; + this.provider = provider; } public JsonMergePatch calculateDiff() { - return new JsonMergePatchImpl(diff(source, target), bufferProvider); + return new JsonMergePatchImpl(diff(source, target), bufferProvider, provider); } private JsonValue diff(JsonValue source, JsonValue target) { - JsonObjectBuilder builder = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, RejectDuplicateKeysMode.DEFAULT); + JsonObjectBuilder builder = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, RejectDuplicateKeysMode.DEFAULT, provider); if (isJsonObject(source) && isJsonObject(target)) { JsonObject srcObj = source.asJsonObject(); diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java index 9d40f052..2773191a 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java @@ -31,10 +31,13 @@ import javax.json.JsonValue; public class JsonMergePatchImpl implements JsonMergePatch, Serializable { private JsonValue patch; private BufferStrategy.BufferProvider<char[]> bufferProvider; + private JsonProviderImpl provider; - public JsonMergePatchImpl(final JsonValue patch, final BufferStrategy.BufferProvider<char[]> bufferProvider) { + public JsonMergePatchImpl(final JsonValue patch, final BufferStrategy.BufferProvider<char[]> bufferProvider, + final JsonProviderImpl provider) { this.patch = patch; this.bufferProvider = bufferProvider; + this.provider = provider; } @Override @@ -51,14 +54,14 @@ public class JsonMergePatchImpl implements JsonMergePatch, Serializable { return applyJsonObjectPatch(valueToApplyPatchOn.asJsonObject(), patchObject); } else { - // this must be a native JsonValue or JsonObject, so we just replace the + // this must be a native JsonValue or JsonObject, so we just replace // the whole original valueToApplyPatchOn with the new jsonValue return patch; } } private JsonValue applyJsonObjectPatch(JsonObject jsonObject, JsonObject patch) { - JsonObjectBuilder builder = new JsonObjectBuilderImpl(jsonObject, bufferProvider, RejectDuplicateKeysMode.DEFAULT); + JsonObjectBuilder builder = new JsonObjectBuilderImpl(jsonObject, bufferProvider, RejectDuplicateKeysMode.DEFAULT, provider); for (Map.Entry<String, JsonValue> patchAttrib : patch.entrySet()) { String attribName = patchAttrib.getKey(); diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java index 57db2ca1..d63fa34f 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java @@ -22,13 +22,15 @@ import javax.json.JsonNumber; import java.io.Serializable; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.function.Consumer; final class JsonNumberImpl implements JsonNumber, Serializable { private final BigDecimal value; private transient Integer hashCode = null; - private static final int MAX_BIG_DECIMAL_SCALE = toInt(System.getProperty("johnzon.max-big-decimal-scale", "1000")); + private transient Consumer<BigDecimal> maxBigDecimalScale = (bigDecimal) -> {}; // for deserialization? - JsonNumberImpl(final BigDecimal decimal) { + JsonNumberImpl(final BigDecimal decimal, final Consumer<BigDecimal> maxBigDecimalScale) { + this.maxBigDecimalScale = maxBigDecimalScale; if (decimal == null) { throw new NullPointerException("decimal must not be null"); } @@ -70,13 +72,13 @@ final class JsonNumberImpl implements JsonNumber, Serializable { @Override public BigInteger bigIntegerValue() { - checkBigDecimalScale(); + maxBigDecimalScale.accept(value); return value.toBigInteger(); } @Override public BigInteger bigIntegerValueExact() { - checkBigDecimalScale(); + maxBigDecimalScale.accept(value); return value.toBigIntegerExact(); } @@ -121,20 +123,4 @@ final class JsonNumberImpl implements JsonNumber, Serializable { } } - private void checkBigDecimalScale() { - // should be fine enough. Maybe we should externalize so users can pick something better if they need to - // it becomes their responsibility to fix the limit and may expose them to a DoS attack - final int limit = MAX_BIG_DECIMAL_SCALE; - final int absScale = Math.abs(value.scale()); - - if (absScale > limit) { - throw new ArithmeticException(String.format( - "BigDecimal scale (%d) limit exceeds maximum allowed (%d)", - value.scale(), limit)); - } - } - - private static Integer toInt(final Object v) { - return !Integer.class.isInstance(v) ? Integer.parseInt(v.toString()) : Integer.class.cast(v); - } } diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java index 2eb4ab09..33ef91d3 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java @@ -37,6 +37,7 @@ import org.apache.johnzon.core.util.ArrayUtil; class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable { private RejectDuplicateKeysMode rejectDuplicateKeysMode; + private JsonProviderImpl provider; private BufferStrategy.BufferProvider<char[]> bufferProvider; private Map<String, JsonValue> attributeMap = new LinkedHashMap<>(); @@ -46,17 +47,21 @@ class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable { public JsonObjectBuilderImpl(final JsonObject initialData, final BufferStrategy.BufferProvider<char[]> bufferProvider, - final RejectDuplicateKeysMode rejectDuplicateKeysMode) { + final RejectDuplicateKeysMode rejectDuplicateKeysMode, + final JsonProviderImpl provider) { this.bufferProvider = bufferProvider; this.rejectDuplicateKeysMode = rejectDuplicateKeysMode; + this.provider = provider; this.attributeMap = new LinkedHashMap<>(initialData); } public JsonObjectBuilderImpl(final Map<String, Object> initialValues, final BufferStrategy.BufferProvider<char[]> bufferProvider, - final RejectDuplicateKeysMode rejectDuplicateKeysMode) { + final RejectDuplicateKeysMode rejectDuplicateKeysMode, + final JsonProviderImpl provider) { this.bufferProvider = bufferProvider; this.rejectDuplicateKeysMode = rejectDuplicateKeysMode; + this.provider = provider; if (!initialValues.isEmpty()) { for (Map.Entry<String, Object> entry : initialValues.entrySet()) { add(entry.getKey(), entry.getValue()); @@ -88,12 +93,12 @@ class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable { } else if (value == null) { addNull(name); } else if (value instanceof Map) { - add(name, new JsonObjectBuilderImpl(Map.class.cast(value), bufferProvider, rejectDuplicateKeysMode).build()); + add(name, new JsonObjectBuilderImpl(Map.class.cast(value), bufferProvider, rejectDuplicateKeysMode, provider).build()); } else if (value instanceof Collection) { - add(name, new JsonArrayBuilderImpl(Collection.class.cast(value), bufferProvider, rejectDuplicateKeysMode).build()); + add(name, new JsonArrayBuilderImpl(Collection.class.cast(value), bufferProvider, rejectDuplicateKeysMode, provider).build()); } else if (value.getClass().isArray()) { final Collection<Object> collection = ArrayUtil.newCollection(value); - add(name, new JsonArrayBuilderImpl(collection, bufferProvider, rejectDuplicateKeysMode).build()); + add(name, new JsonArrayBuilderImpl(collection, bufferProvider, rejectDuplicateKeysMode, provider).build()); } else { throw new JsonException("Illegal JSON type! name=" + name + " type=" + value.getClass()); } @@ -113,13 +118,13 @@ class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable { @Override public JsonObjectBuilder add(final String name, final BigInteger value) { - putValue(name, new JsonNumberImpl(new BigDecimal(value))); + putValue(name, new JsonNumberImpl(new BigDecimal(value), provider::checkBigDecimalScale)); return this; } @Override public JsonObjectBuilder add(final String name, final BigDecimal value) { - putValue(name, new JsonNumberImpl(value)); + putValue(name, new JsonNumberImpl(value, provider::checkBigDecimalScale)); return this; } diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java index 85174bce..841d0a37 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java @@ -53,9 +53,11 @@ public class JsonParserFactoryImpl extends AbstractJsonFactory implements JsonPa private final boolean supportsComments; private final boolean autoAdjustBuffers; private final Charset defaultEncoding; + private final JsonProviderImpl provider; - JsonParserFactoryImpl(final Map<String, ?> config) { + JsonParserFactoryImpl(final Map<String, ?> config, final JsonProviderImpl provider) { super(config, SUPPORTED_CONFIG_KEYS, null); + this.provider = provider; final int bufferSize = getInt(BUFFER_LENGTH, DEFAULT_BUFFER_LENGTH); if (bufferSize <= 0) { @@ -79,26 +81,26 @@ public class JsonParserFactoryImpl extends AbstractJsonFactory implements JsonPa return getDefaultJsonParserImpl(in, defaultEncoding); } if (supportsComments) { - return new CommentsJsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers); + return new CommentsJsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider); } //UTF Auto detection RFC 4627 - return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers); + return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider); } private JsonStreamParserImpl getDefaultJsonParserImpl(final InputStream in, final Charset charset) { if (supportsComments) { - return new CommentsJsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers); + return new CommentsJsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider); } //use provided charset - return new JsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers); + return new JsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider); } private JsonStreamParserImpl getDefaultJsonParserImpl(final Reader in) { if (supportsComments) { - return new CommentsJsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers); + return new CommentsJsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider); } //no charset necessary - return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers); + return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider, autoAdjustBuffers, provider); } @Override @@ -119,13 +121,13 @@ public class JsonParserFactoryImpl extends AbstractJsonFactory implements JsonPa @Override public JsonParser createParser(final JsonObject obj) { // no need of a comment version since JsonObject has no comment event - return new JsonInMemoryParser(obj, bufferProvider); + return new JsonInMemoryParser(obj, bufferProvider, provider); } @Override public JsonParser createParser(final JsonArray array) { // no need of a comment version since JsonObject has no comment event - return new JsonInMemoryParser(array, bufferProvider); + return new JsonInMemoryParser(array, bufferProvider, provider); } @Override diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java index 1bfcd716..55101a32 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java @@ -18,8 +18,6 @@ */ package org.apache.johnzon.core; -import org.apache.johnzon.core.spi.JsonPointerFactory; - import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; @@ -29,9 +27,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.Collection; import java.util.Map; -import java.util.ServiceLoader; import java.util.function.Supplier; -import java.util.stream.StreamSupport; import javax.json.JsonArray; import javax.json.JsonArrayBuilder; @@ -56,26 +52,18 @@ import javax.json.stream.JsonGeneratorFactory; import javax.json.stream.JsonParser; import javax.json.stream.JsonParserFactory; -import static java.util.Comparator.comparing; - public class JsonProviderImpl extends JsonProvider implements Serializable { private final Supplier<BufferStrategy.BufferProvider<char[]>> bufferProvider = new Cached<>(() -> BufferStrategyFactory.valueOf(System.getProperty(AbstractJsonFactory.BUFFER_STRATEGY, "QUEUE")) .newCharProvider(Integer.getInteger("org.apache.johnzon.default-char-provider.length", 1024))); - private final JsonReaderFactory readerFactory = new JsonReaderFactoryImpl(null); - private final JsonParserFactory parserFactory = new JsonParserFactoryImpl(null); + private final JsonReaderFactory readerFactory = new JsonReaderFactoryImpl(null, this); + private final JsonParserFactory parserFactory = new JsonParserFactoryImpl(null, this); private final JsonGeneratorFactory generatorFactory = new JsonGeneratorFactoryImpl(null); private final JsonWriterFactory writerFactory = new JsonWriterFactoryImpl(null); private final Supplier<JsonBuilderFactory> builderFactory = new Cached<>(() -> - new JsonBuilderFactoryImpl(null, bufferProvider.get(), RejectDuplicateKeysMode.DEFAULT)); - private final JsonPointerFactory jsonPointerFactory; - - public JsonProviderImpl() { - jsonPointerFactory = StreamSupport.stream(ServiceLoader.load(JsonPointerFactory.class).spliterator(), false) - .min(comparing(JsonPointerFactory::ordinal)) - .orElseGet(DefaultJsonPointerFactory::new); - } + new JsonBuilderFactoryImpl(null, bufferProvider.get(), RejectDuplicateKeysMode.DEFAULT, this)); + private int maxBigDecimalScale = Integer.getInteger("johnzon.max-big-decimal-scale", 1_000); @Override public JsonParser createParser(final InputStream in) { @@ -99,12 +87,12 @@ public class JsonProviderImpl extends JsonProvider implements Serializable { @Override public JsonParserFactory createParserFactory(final Map<String, ?> config) { - return (config == null || config.isEmpty()) ? parserFactory : new JsonParserFactoryImpl(config); + return (config == null || config.isEmpty()) ? parserFactory : new JsonParserFactoryImpl(config, this); } @Override public JsonReaderFactory createReaderFactory(final Map<String, ?> config) { - return (config == null || config.isEmpty()) ? readerFactory : new JsonReaderFactoryImpl(config); + return (config == null || config.isEmpty()) ? readerFactory : new JsonReaderFactoryImpl(config, this); } @Override @@ -189,19 +177,19 @@ public class JsonProviderImpl extends JsonProvider implements Serializable { @Override public JsonNumber createValue(final BigDecimal value) { - return new JsonNumberImpl(value); + return new JsonNumberImpl(value, this::checkBigDecimalScale); } @Override public JsonNumber createValue(final BigInteger value) { - return new JsonNumberImpl(new BigDecimal(value.toString())); + return new JsonNumberImpl(new BigDecimal(value.toString()), this::checkBigDecimalScale); } @Override public JsonBuilderFactory createBuilderFactory(final Map<String, ?> config) { final JsonBuilderFactory builderFactory = this.builderFactory.get(); return (config == null || config.isEmpty()) ? - builderFactory : new JsonBuilderFactoryImpl(config, bufferProvider.get(), RejectDuplicateKeysMode.from(config)); + builderFactory : new JsonBuilderFactoryImpl(config, bufferProvider.get(), RejectDuplicateKeysMode.from(config), this); } @Override @@ -216,7 +204,7 @@ public class JsonProviderImpl extends JsonProvider implements Serializable { @Override public JsonPointer createPointer(String path) { - return jsonPointerFactory.createPointer(this, path); + return new JsonPointerImpl(this, path); } @Override @@ -231,12 +219,20 @@ public class JsonProviderImpl extends JsonProvider implements Serializable { @Override public JsonMergePatch createMergePatch(JsonValue patch) { - return new JsonMergePatchImpl(patch, bufferProvider.get()); + return new JsonMergePatchImpl(patch, bufferProvider.get(), this); } @Override public JsonMergePatch createMergeDiff(JsonValue source, JsonValue target) { - return new JsonMergePatchDiff(source, target, bufferProvider.get()).calculateDiff(); + return new JsonMergePatchDiff(source, target, bufferProvider.get(), this).calculateDiff(); + } + + public int getMaxBigDecimalScale() { + return maxBigDecimalScale; + } + + public void setMaxBigDecimalScale(final int maxBigDecimalScale) { + this.maxBigDecimalScale = maxBigDecimalScale; } /** @@ -263,4 +259,17 @@ public class JsonProviderImpl extends JsonProvider implements Serializable { return computed; } } + + public void checkBigDecimalScale(final BigDecimal value) { + // should be fine enough. Maybe we should externalize so users can pick something better if they need to + // it becomes their responsibility to fix the limit and may expose them to a DoS attack + final int limit = maxBigDecimalScale; + final int absScale = Math.abs(value.scale()); + + if (absScale > limit) { + throw new ArithmeticException(String.format( + "BigDecimal scale (%d) limit exceeds maximum allowed (%d)", + value.scale(), limit)); + } + } } diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java index 233f8b02..1608e496 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java @@ -34,33 +34,35 @@ class JsonReaderFactoryImpl extends AbstractJsonFactory implements JsonReaderFac private final JsonParserFactoryImpl parserFactory; private final RejectDuplicateKeysMode rejectDuplicateKeys; + private JsonProviderImpl provider; - JsonReaderFactoryImpl(final Map<String, ?> config) { + JsonReaderFactoryImpl(final Map<String, ?> config, final JsonProviderImpl provider) { super(config, SUPPORTED_CONFIG_KEYS, JsonParserFactoryImpl.SUPPORTED_CONFIG_KEYS); + this.provider = provider; if (!internalConfig.isEmpty()) { RejectDuplicateKeysMode.CONFIG_KEYS.forEach(internalConfig::remove); } - this.parserFactory = new JsonParserFactoryImpl(internalConfig); + this.parserFactory = new JsonParserFactoryImpl(internalConfig, provider); this.rejectDuplicateKeys = RejectDuplicateKeysMode.from(config); } @Override public JsonReader createReader(final Reader reader) { - return new JsonReaderImpl(parserFactory.createInternalParser(reader), parserFactory.getValueBufferProvider(), rejectDuplicateKeys); + return new JsonReaderImpl(parserFactory.createInternalParser(reader), parserFactory.getValueBufferProvider(), rejectDuplicateKeys, provider); } @Override public JsonReader createReader(final InputStream in) { - return new JsonReaderImpl(parserFactory.createInternalParser(in), parserFactory.getValueBufferProvider(), rejectDuplicateKeys); + return new JsonReaderImpl(parserFactory.createInternalParser(in), parserFactory.getValueBufferProvider(), rejectDuplicateKeys, provider); } @Override public JsonReader createReader(final InputStream in, final Charset charset) { - return new JsonReaderImpl(parserFactory.createInternalParser(in, charset), parserFactory.getValueBufferProvider(), rejectDuplicateKeys); + return new JsonReaderImpl(parserFactory.createInternalParser(in, charset), parserFactory.getValueBufferProvider(), rejectDuplicateKeys, provider); } public JsonReader createReader(final JsonParser parser) { - return new JsonReaderImpl(parser, parserFactory.getValueBufferProvider(), rejectDuplicateKeys); + return new JsonReaderImpl(parser, parserFactory.getValueBufferProvider(), rejectDuplicateKeys, provider); } @Override diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java index 969ad9a7..bdc48577 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java @@ -36,14 +36,15 @@ import static java.util.Collections.emptyMap; public class JsonReaderImpl implements JsonReader { private final JohnzonJsonParser parser; private final BufferStrategy.BufferProvider<char[]> bufferProvider; + private JsonProviderImpl provider; private final RejectDuplicateKeysMode rejectDuplicateKeysMode; private boolean closed = false; private boolean subStreamReader; public JsonReaderImpl(final JsonParser parser, final BufferStrategy.BufferProvider<char[]> bufferProvider, - final RejectDuplicateKeysMode rejectDuplicateKeysMode) { - this(parser, false, bufferProvider, rejectDuplicateKeysMode); + final RejectDuplicateKeysMode rejectDuplicateKeysMode, final JsonProviderImpl provider) { + this(parser, false, bufferProvider, rejectDuplicateKeysMode, provider); } /** @@ -54,8 +55,9 @@ public class JsonReaderImpl implements JsonReader { */ public JsonReaderImpl(final JsonParser parser, boolean subStreamReader, final BufferStrategy.BufferProvider<char[]> bufferProvider, - final RejectDuplicateKeysMode rejectDuplicateKeys) { + final RejectDuplicateKeysMode rejectDuplicateKeys, final JsonProviderImpl provider) { this.bufferProvider = bufferProvider; + this.provider = provider; if (parser instanceof JohnzonJsonParser) { this.parser = (JohnzonJsonParser) parser; } else { @@ -89,14 +91,14 @@ public class JsonReaderImpl implements JsonReader { switch (next) { case START_OBJECT: - final JsonObjectBuilder objectBuilder = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode); + final JsonObjectBuilder objectBuilder = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode, provider); parseObject(objectBuilder); if (!subStreamReader && parser.hasNext()) { throw new JsonParsingException("Expected end of file", parser.getLocation()); } return objectBuilder.build(); case START_ARRAY: - final JsonArrayBuilder arrayBuilder = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode); + final JsonArrayBuilder arrayBuilder = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode, provider); parseArray(arrayBuilder); if (!subStreamReader && parser.hasNext()) { throw new JsonParsingException("Expected end of file", parser.getLocation()); @@ -128,7 +130,7 @@ public class JsonReaderImpl implements JsonReader { if (parser.isFitLong()) { number = new JsonLongImpl(parser.getLong()); } else { - number = new JsonNumberImpl(parser.getBigDecimal()); + number = new JsonNumberImpl(parser.getBigDecimal(), provider::checkBigDecimalScale); } if (!subStreamReader && parser.hasNext()) { throw new JsonParsingException("Expected end of file", parser.getLocation()); @@ -182,13 +184,13 @@ public class JsonReaderImpl implements JsonReader { break; case START_OBJECT: - JsonObjectBuilder subObject = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode); + JsonObjectBuilder subObject = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode, provider); parseObject(subObject); builder.add(key, subObject); break; case START_ARRAY: - JsonArrayBuilder subArray = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode); + JsonArrayBuilder subArray = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode, provider); parseArray(subArray); builder.add(key, subArray); break; @@ -197,7 +199,7 @@ public class JsonReaderImpl implements JsonReader { if (parser.isIntegralNumber() && parser.isNotTooLong()) { builder.add(key, new JsonLongImpl(parser.getLong())); } else { - builder.add(key, new JsonNumberImpl(parser.getBigDecimal())); + builder.add(key, new JsonNumberImpl(parser.getBigDecimal(), provider::checkBigDecimalScale)); } break; @@ -237,19 +239,19 @@ public class JsonReaderImpl implements JsonReader { if (parser.isFitLong()) { builder.add(new JsonLongImpl(parser.getLong())); } else { - builder.add(new JsonNumberImpl(parser.getBigDecimal())); + builder.add(new JsonNumberImpl(parser.getBigDecimal(), provider::checkBigDecimalScale)); } break; case START_OBJECT: - JsonObjectBuilder subObject = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode); + JsonObjectBuilder subObject = new JsonObjectBuilderImpl(emptyMap(), bufferProvider, rejectDuplicateKeysMode, provider); parseObject(subObject); builder.add(subObject); break; case START_ARRAY: JsonArrayBuilder subArray = null; - parseArray(subArray = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode)); + parseArray(subArray = new JsonArrayBuilderImpl(emptyList(), bufferProvider, rejectDuplicateKeysMode, provider)); builder.add(subArray); break; diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java index c854069d..7619ad8d 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java @@ -118,29 +118,30 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC //detect charset according to RFC 4627 public JsonStreamParserImpl(final InputStream inputStream, final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer, - final boolean autoAdjust) { + final boolean autoAdjust, final JsonProviderImpl provider) { - this(inputStream, null, null, maxStringLength, bufferProvider, valueBuffer, autoAdjust); + this(inputStream, null, null, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider); } //use charset provided public JsonStreamParserImpl(final InputStream inputStream, final Charset encoding, final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer, - final boolean autoAdjust) { + final boolean autoAdjust, final JsonProviderImpl provider) { - this(inputStream, null, encoding, maxStringLength, bufferProvider, valueBuffer, autoAdjust); + this(inputStream, null, encoding, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider); } public JsonStreamParserImpl(final Reader reader, final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider, - final BufferStrategy.BufferProvider<char[]> valueBuffer, final boolean autoAdjust) { + final BufferStrategy.BufferProvider<char[]> valueBuffer, final boolean autoAdjust, final JsonProviderImpl provider) { - this(null, reader, null, maxStringLength, bufferProvider, valueBuffer, autoAdjust); + this(null, reader, null, maxStringLength, bufferProvider, valueBuffer, autoAdjust, provider); } private JsonStreamParserImpl(final InputStream inputStream, final Reader reader, final Charset encoding, final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer, - final boolean autoAdjust) { + final boolean autoAdjust, final JsonProviderImpl provider) { + super(provider); this.autoAdjust = autoAdjust; this.maxValueLength = maxStringLength <= 0 ? 8192 : maxStringLength; this.fallBackCopyBuffer = valueBuffer.newBuffer(); diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java index f77773b6..21ddd12e 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java @@ -77,7 +77,7 @@ public class JsonNumberTest { @Test public void testSlowBigIntegerConversion() { JsonArray array = Json.createArrayBuilder() - .add(new BigDecimal("1000000000e1000")) + .add(new BigDecimal("1e1000")) // 1e20000000 --> lost of damage .add(Double.MAX_VALUE) .build(); @@ -85,7 +85,7 @@ public class JsonNumberTest { long start = System.nanoTime(); for (int i = 1; i < 5; i++) { // if it takes a few seconds in any machine, that's already too much - if (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) > (3 * i)) { + if (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) > 1) { fail("took too long: " + TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) + " s" + " to compute " + i + " conversions toBigInteger"); } @@ -101,7 +101,7 @@ public class JsonNumberTest { for (int i = 1; i < 100; i++) { // if it takes a second in any machine, that's already too much // depends on the allowed scale in JsonNumberImpl#checkBigDecimalScale - if (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) > (30 * i)) { + if (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) > 1) { fail("took too long: " + TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) + " s" + " to compute " + i + " conversions toBigInteger"); } diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserStreamingTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserStreamingTest.java index 42fd6594..b0639743 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserStreamingTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserStreamingTest.java @@ -49,7 +49,8 @@ public class JsonParserStreamingTest { final BufferStrategy.BufferProvider<char[]> bs = BufferStrategyFactory.valueOf("QUEUE").newCharProvider(len); try (final InputStream stream = new ByteArrayInputStream(bytes); - final JsonStreamParserImpl impl = new JsonStreamParserImpl(stream, len, bs, bs, false)) { + final JsonStreamParserImpl impl = new JsonStreamParserImpl(stream, len, bs, bs, false, + (JsonProviderImpl) JsonProviderImpl.provider())) { while (impl.hasNext()) { impl.next(); diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java index d388f5f4..41ebf148 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java @@ -355,10 +355,10 @@ public class JsonParserTest { public void simpleInMemory() { final JsonObjectBuilder ob = Json.createObjectBuilder(); ob.add("a", new JsonStringImpl("b")); - ob.add("c", new JsonNumberImpl(new BigDecimal(4))); + ob.add("c", new JsonNumberImpl(new BigDecimal(4), ((JsonProviderImpl)JsonProviderImpl.provider())::checkBigDecimalScale)); JsonArrayBuilder ab = Json.createArrayBuilder(); - ab.add(new JsonNumberImpl(new BigDecimal(1))); - ab.add(new JsonNumberImpl(new BigDecimal(-2))); + ab.add(new JsonNumberImpl(new BigDecimal(1), ((JsonProviderImpl)JsonProviderImpl.provider())::checkBigDecimalScale)); + ab.add(new JsonNumberImpl(new BigDecimal(-2), ((JsonProviderImpl)JsonProviderImpl.provider())::checkBigDecimalScale)); ob.add("d", ab); ob.add ("e", Json.createObjectBuilder() diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonStreamParserImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonStreamParserImplTest.java index 45371389..f155d138 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonStreamParserImplTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonStreamParserImplTest.java @@ -35,9 +35,9 @@ public class JsonStreamParserImplTest { @Test public void ensureNoArrayBoundErrorWhenOverflow() throws IOException { final String json = new JsonObjectBuilderImpl( - emptyMap(), - BufferStrategyFactory.valueOf("QUEUE").newCharProvider(100), - RejectDuplicateKeysMode.TRUE) + emptyMap(), + BufferStrategyFactory.valueOf("QUEUE").newCharProvider(100), + RejectDuplicateKeysMode.TRUE, (JsonProviderImpl) JsonProviderImpl.provider()) .add("content", "{\"foo\":\"barbar\\barbarbar\"}") .build() .toString(); @@ -46,7 +46,7 @@ public class JsonStreamParserImplTest { 10, BufferStrategyFactory.valueOf("QUEUE").newCharProvider(10), BufferStrategyFactory.valueOf("QUEUE").newCharProvider(10), - true); + true, (JsonProviderImpl) JsonProviderImpl.provider()); final List<String> events = new ArrayList<>(); while (parser.hasNext()) { final JsonParser.Event event = parser.next(); diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java index 6074563b..73699dfd 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java @@ -52,7 +52,8 @@ public class SerializationTest { @Test public void jsonNumber() throws IOException, ClassNotFoundException { - final JsonNumber source = new JsonNumberImpl(new BigDecimal("1.0")); + final JsonNumber source = new JsonNumberImpl(new BigDecimal("1.0"), + ((JsonProviderImpl) JsonProviderImpl.provider())::checkBigDecimalScale); final JsonNumber deserialized = serialDeser(source); assertNotSame(source, deserialized); assertEquals(1.0, deserialized.doubleValue(), 0.); 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 46f99177..3cab08e2 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 @@ -107,10 +107,8 @@ public class JohnzonBuilder implements JsonbBuilder { final boolean skipCdi = shouldSkipCdi(); // todo: global spec toggle to disable all these ones at once? - builder.setUseBigDecimalForObjectNumbers( - config.getProperty("johnzon.use-big-decimal-for-object").map(this::toBool).orElse(true)); - builder.setMaxBigDecimalScale( - config.getProperty("johnzon.max-big-decimal-scale").map(this::toInt).orElse(1000)); + builder.setUseBigDecimalForObjectNumbers(config.getProperty("johnzon.use-big-decimal-for-object").map(this::toBool).orElse(true)); + builder.setMaxBigDecimalScale(config.getProperty("johnzon.max-big-decimal-scale").map(this::toInt).orElse(1000)); builder.setSupportEnumContainerDeserialization( // https://github.com/eclipse-ee4j/jakartaee-tck/issues/103 toBool(System.getProperty("johnzon.support-enum-container-deserialization", config.getProperty("johnzon.support-enum-container-deserialization") @@ -284,10 +282,8 @@ public class JohnzonBuilder implements JsonbBuilder { getBeanManager(); // force detection } - builder.setReadAttributeBeforeWrite( - config.getProperty("johnzon.readAttributeBeforeWrite").map(Boolean.class::cast).orElse(false)); - builder.setAutoAdjustStringBuffers( - config.getProperty("johnzon.autoAdjustBuffer").map(Boolean.class::cast).orElse(true)); + builder.setReadAttributeBeforeWrite(config.getProperty("johnzon.readAttributeBeforeWrite").map(Boolean.class::cast).orElse(false)); + builder.setAutoAdjustStringBuffers(config.getProperty("johnzon.autoAdjustBuffer").map(Boolean.class::cast).orElse(true)); config.getProperty("johnzon.serialize-value-filter") .map(s -> { if (String.class.isInstance(s)) { diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java index d512b419..4307d11d 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java @@ -169,7 +169,7 @@ public class MapperConfigTest { new FieldAccessMode(true, true), StandardCharsets.UTF_8, null, - false, null, false, false, emptyMap(), true, false, true, + false, null, false, false, emptyMap(), true, false, 1000, true, null, null, null, null, null, type -> new EnumConverter(type)); } diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java index febe682d..83bb883d 100644 --- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java +++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java @@ -62,8 +62,8 @@ public class ExtendMappingTest { -1, true, true, true, false, false, false, new FieldAccessMode(false, false), StandardCharsets.UTF_8, String::compareTo, false, null, false, false, - emptyMap(), true, false, true, - null, null, null, null, null, + emptyMap(), true, false,1000, true, null, + null, null, null, null, type -> new EnumConverter(type))); }
