Skip to content

Commit

Permalink
Merge branch '2.18' into write-surrogate-pairs
Browse files Browse the repository at this point in the history
  • Loading branch information
cowtowncoder committed Sep 18, 2024
2 parents d782c65 + 5c76113 commit bf503b2
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 60 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ com.fasterxml.jackson.core.*;version=${project.version}
<dependency>
<groupId>ch.randelshofer</groupId>
<artifactId>fastdoubleparser</artifactId>
<version>1.0.0</version>
<version>1.0.1</version>
</dependency>
<!-- Test dependencies -->
<dependency>
Expand Down
5 changes: 3 additions & 2 deletions release-notes/VERSION-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ a pure JSON library.
#1305: Make helper methods of `WriterBasedJsonGenerator` non-final to allow overriding
(contributed by @zhangOranges)
#1310: Add new `StreamReadConstraints` (`maxTokenCount`) to limit maximum number
of Tokens allowed per document
(implemented by @pjfanning)
of Tokens allowed per document#
#1331: Update to FastDoubleParser v1.0.1 to fix `BigDecimal` decoding proble
(fixed by @pjfanning)

2.17.2 (05-Jul-2024)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1781,7 +1781,7 @@ public abstract int writeBinary(Base64Variant bv,
* If implementation does not implement this method,
* it needs to throw {@link UnsupportedOperationException}.
*
* @param encodedValue Textual (possibly format) number representation to write
* @param encodedValue Textual (possibly formatted) number representation to write
*
* @throws IOException if there is either an underlying I/O problem or encoding
* issue at format layer
Expand Down
16 changes: 14 additions & 2 deletions src/main/java/com/fasterxml/jackson/core/io/BigDecimalParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
public final class BigDecimalParser
{
final static int MAX_CHARS_TO_REPORT = 1000;
private final static int SIZE_FOR_SWITCH_TO_FASTDOUBLEPARSER = 500;

private BigDecimalParser() {}

Expand All @@ -40,7 +41,17 @@ private BigDecimalParser() {}
* @throws NumberFormatException
*/
public static BigDecimal parse(String valueStr) {
return parse(valueStr.toCharArray());
try {
if (valueStr.length() < SIZE_FOR_SWITCH_TO_FASTDOUBLEPARSER) {
return new BigDecimal(valueStr);
}
return JavaBigDecimalParser.parseBigDecimal(valueStr);

// 20-Aug-2022, tatu: Although "new BigDecimal(...)" only throws NumberFormatException
// operations by "parseBigDecimal()" can throw "ArithmeticException", so handle both:
} catch (ArithmeticException | NumberFormatException e) {
throw _parseFailure(e, valueStr);
}
}

/**
Expand All @@ -55,7 +66,7 @@ public static BigDecimal parse(String valueStr) {
*/
public static BigDecimal parse(final char[] chars, final int off, final int len) {
try {
if (len < 500) {
if (len < SIZE_FOR_SWITCH_TO_FASTDOUBLEPARSER) {
return new BigDecimal(chars, off, len);
}
return JavaBigDecimalParser.parseBigDecimal(chars, off, len);
Expand Down Expand Up @@ -165,4 +176,5 @@ private static String _generateExceptionMessage(final String valueToReport, fina
return String.format("Value %s can not be deserialized as `java.math.BigDecimal`, reason: %s" ,
valueToReport, desc);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.math.BigDecimal;

import ch.randelshofer.fastdoubleparser.JavaBigDecimalParser;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;
Expand Down Expand Up @@ -51,6 +52,18 @@ void longValidStringFastParse() {
assertEquals(EXP, BigDecimalParser.parseWithFastParser(num.toCharArray(), 0, num.length()));
}

@Test
void issueDatabind4694() {
final String str = "-11000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
final BigDecimal expected = new BigDecimal(str);
assertEquals(expected, JavaBigDecimalParser.parseBigDecimal(str));
assertEquals(expected, BigDecimalParser.parse(str));
assertEquals(expected, BigDecimalParser.parseWithFastParser(str));
final char[] arr = str.toCharArray();
assertEquals(expected, BigDecimalParser.parse(arr, 0, arr.length));
assertEquals(expected, BigDecimalParser.parseWithFastParser(arr, 0, arr.length));
}

static String genLongInvalidString() {
final int len = 1500;
final StringBuilder sb = new StringBuilder(len);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ protected JsonFactory jsonFactory() {
return sharedStreamFactory();
}

private final String ISSUE_4694_VALUE =
"-11000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";

/*
/**********************************************************************
/* Tests, Boolean
Expand Down Expand Up @@ -996,6 +999,41 @@ void negativeMaxNumberLength() {
}
}

// https://github.com/FasterXML/jackson-databind/issues/4694
@Test
void databind4694() throws Exception {
final BigDecimal expected = new BigDecimal(ISSUE_4694_VALUE);
for (int mode : ALL_MODES) {
try (JsonParser p = createParser(mode, String.format(" %s ", ISSUE_4694_VALUE))) {
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
assertEquals(expected, p.getDecimalValue());
assertFalse(p.isNaN());
}
}
}

void databind4694Double() throws Exception {
final Double expected = new Double(ISSUE_4694_VALUE);
for (int mode : ALL_MODES) {
try (JsonParser p = createParser(mode, String.format(" %s ", ISSUE_4694_VALUE))) {
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
assertEquals(expected, p.getDoubleValue());
assertFalse(p.isNaN());
}
}
}

void databind4694Float() throws Exception {
final Float expected = new Float(ISSUE_4694_VALUE);
for (int mode : ALL_MODES) {
try (JsonParser p = createParser(mode, String.format(" %s ", ISSUE_4694_VALUE))) {
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, p.nextToken());
assertEquals(expected, p.getFloatValue());
assertFalse(p.isNaN());
}
}
}

/*
/**********************************************************
/* Helper methods
Expand Down

This file was deleted.

This file was deleted.

0 comments on commit bf503b2

Please sign in to comment.