[Git][java-team/jackson-core][master] 5 commits: New upstream version 2.10.1

Mechtilde Stehmann gitlab at salsa.debian.org
Mon Dec 23 20:10:29 GMT 2019



Mechtilde Stehmann pushed to branch master at Debian Java Maintainers / jackson-core


Commits:
63928b7d by Mechtilde at 2019-12-22T18:52:42Z
New upstream version 2.10.1
- - - - -
f46384b1 by Mechtilde at 2019-12-22T18:52:57Z
Update upstream source from tag 'upstream/2.10.1'

Update to upstream version '2.10.1'
with Debian dir e7a682d10e3c331715dec6e46cce7163db92afaf
- - - - -
4ef437a0 by Mechtilde at 2019-12-22T18:56:10Z
Updated debian/control

- - - - -
d389c02b by Mechtilde at 2019-12-23T20:04:18Z
Apply patches newly

- - - - -
f114c773 by Mechtilde at 2019-12-23T20:05:04Z
Prepared for release: debian/changelog

- - - - -


20 changed files:

- debian/changelog
- debian/control
- debian/patches/no-bundle.patch → debian/patches/01-no-bundle.patch
- debian/patches/skip-jacoco.patch → debian/patches/02-skip-jacoco.patch
- debian/patches/series
- pom.xml
- release-notes/CREDITS-2.x
- release-notes/VERSION-2.x
- src/main/java/com/fasterxml/jackson/core/JsonGenerator.java
- src/main/java/com/fasterxml/jackson/core/io/CharTypes.java
- src/main/java/com/fasterxml/jackson/core/json/JsonReadFeature.java
- src/main/java/com/fasterxml/jackson/core/json/JsonWriteFeature.java
- src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java
- src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
- src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParser.java
- src/moditect/module-info.java
- src/test/java/com/fasterxml/jackson/core/io/TestCharTypes.java
- + src/test/java/com/fasterxml/jackson/core/read/LocationDuringReaderParsingTest.java
- + src/test/java/com/fasterxml/jackson/core/read/LocationDuringStreamParsingTest.java
- src/test/java/com/fasterxml/jackson/core/read/ParserDupHandlingTest.java


Changes:

=====================================
debian/changelog
=====================================
@@ -1,3 +1,12 @@
+jackson-core (2.10.1-1) unstable; urgency=medium
+
+  [ Mechtilde ]
+  * [63928b7] New upstream version 2.10.1
+  * [4ef437a] Updated debian/control
+  * [d389c02] Apply patches newly
+
+ -- Mechtilde Stehmann <mechtilde at debian.org>  Mon, 23 Dec 2019 21:04:45 +0100
+
 jackson-core (2.10.0-1) unstable; urgency=medium
 
   [ Mechtilde ]


=====================================
debian/control
=====================================
@@ -3,13 +3,11 @@ Section: java
 Priority: optional
 Maintainer: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
 Uploaders:
- Wolodja Wentland <debian at babilen5.org>
- , Mechtilde Stehmann <mechtilde at debian.org>
-Build-Depends:
- debhelper-compat (= 12),
- default-jdk,
- maven-debian-helper (>= 1.6.5),
- xmlstarlet
+ Mechtilde Stehmann <mechtilde at debian.org>
+Build-Depends: debhelper-compat (= 12)
+ , default-jdk
+ , maven-debian-helper (>= 1.6.5)
+ , xmlstarlet
 Build-Depends-Indep:
  default-jdk-doc
  , junit4
@@ -17,7 +15,7 @@ Build-Depends-Indep:
  , libmaven-enforcer-plugin-java
  , libmaven-javadoc-plugin-java
  , libreplacer-java
-Standards-Version: 4.4.0
+Standards-Version: 4.4.1
 Rules-Requires-Root: no
 Vcs-Git: https://salsa.debian.org/java-team/jackson-core.git
 Vcs-Browser: https://salsa.debian.org/java-team/jackson-core


=====================================
debian/patches/no-bundle.patch → debian/patches/01-no-bundle.patch
=====================================
@@ -1,13 +1,13 @@
 Description: packaging no bundle
 Forwarded:   No
-Author:      Mechtilde Stehmann <mechtilde at debian.org>
-Last-Update: 2019-09-28
+Author:      "Mechtilde Stehmann" <"mechtilde at debian.org">
+Last-Update: 2019-12-23
 --- a/pom.xml
 +++ b/pom.xml
 @@ -10,7 +10,7 @@
    <artifactId>jackson-core</artifactId>
    <name>Jackson-core</name>
-   <version>2.10.0</version>
+   <version>2.10.1</version>
 -  <packaging>bundle</packaging>
 +  <packaging>jar</packaging>
    <description>Core Jackson processing abstractions (aka Streaming API), implementation for JSON</description>


=====================================
debian/patches/skip-jacoco.patch → debian/patches/02-skip-jacoco.patch
=====================================
@@ -1,7 +1,7 @@
 Description: deactivate code coverage
 Forwarded:   No
-Author:      Mechtilde Stehmann <mechtilde at debian.org>
-Last-Update: 2019-09-28
+Author:      "Mechtilde Stehmann" <"mechtilde at debian.org">
+Last-Update: 2019-12-23
 --- a/pom.xml
 +++ b/pom.xml
 @@ -57,7 +57,7 @@
@@ -9,7 +9,7 @@ Last-Update: 2019-09-28
  
        <!-- 26-Aug-2019, tatu: JaCoCo for code coverage -->
 -      <plugin>
-+      <!-- <plugin>
++    <!--  <plugin>
  	<groupId>org.jacoco</groupId>
  	<artifactId>jacoco-maven-plugin</artifactId>
  	<version>0.8.4</version>


=====================================
debian/patches/series
=====================================
@@ -1,2 +1,2 @@
-no-bundle.patch
-skip-jacoco.patch
+01-no-bundle.patch
+02-skip-jacoco.patch


=====================================
pom.xml
=====================================
@@ -3,13 +3,13 @@
   <parent>
     <groupId>com.fasterxml.jackson</groupId>
     <artifactId>jackson-base</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1</version>
   </parent>
 
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-core</artifactId>
   <name>Jackson-core</name>
-  <version>2.10.0</version>
+  <version>2.10.1</version>
   <packaging>bundle</packaging>
   <description>Core Jackson processing abstractions (aka Streaming API), implementation for JSON</description>
   <inceptionYear>2008</inceptionYear>
@@ -19,7 +19,7 @@
     <connection>scm:git:git at github.com:FasterXML/jackson-core.git</connection>
     <developerConnection>scm:git:git at github.com:FasterXML/jackson-core.git</developerConnection>
     <url>http://github.com/FasterXML/jackson-core</url>    
-    <tag>jackson-core-2.10.0</tag>
+    <tag>jackson-core-2.10.1</tag>
   </scm>
 
   <properties>


=====================================
release-notes/CREDITS-2.x
=====================================
@@ -116,9 +116,12 @@ Arnaud Roger (arnaudroger at github)
   * Contributed #359: FilteringGeneratorDelegate does not override writeStartObject(Object forValue)
    (2.8.8)
 
-Wil Selwood (wselwood at github)
+
+Emily Selwood (emilyselwood at github)
   * Reported #382: ArrayIndexOutOfBoundsException from UTF32Reader.read on invalid input
    (2.8.9)
+  * Reported #578: Array index out of bounds in hex lookup
+   (2.10.1)
 
 Alex Yursha (AlexYursha at github)
   * Contributed #312: Add `JsonProcessingException.clearLocation()` to allow clearing
@@ -193,3 +196,7 @@ Fabien Renaud (fabienrenaud at github)
   * Reported, contributed fix fir #533: UTF-8 BOM not accounted for in
     `JsonLocation.getByteOffset()`
   (2.10.0)
+
+Todd O'Bryan (toddobryan at github)
+  * Contributed fix fox #455: Jackson reports wrong locations for JsonEOFException
+  (2.10.1)


=====================================
release-notes/VERSION-2.x
=====================================
@@ -14,6 +14,15 @@ JSON library.
 === Releases ===
 ------------------------------------------------------------------------
 
+2.10.1 (09-Nov-2019)
+
+#455: Jackson reports wrong locations for JsonEOFException
+ (reported by wastevenson at github, fix contributed by Todd O'B
+#567: Add `uses` for `ObjectCodec` in module-info
+ (reported by Marc M)
+#578: Array index out of bounds in hex lookup
+ (reported by Emily S)
+
 2.10.0 (26-Sep-2019)
 
 #433: Add Builder pattern for creating configured Stream factories


=====================================
src/main/java/com/fasterxml/jackson/core/JsonGenerator.java
=====================================
@@ -906,7 +906,7 @@ public abstract class JsonGenerator
             throw new IllegalArgumentException("null array");
         }
         _verifyOffsets(array.length, offset, length);
-        writeStartArray();
+        writeStartArray(array, length);
         for (int i = offset, end = offset+length; i < end; ++i) {
             writeNumber(array[i]);
         }
@@ -930,7 +930,7 @@ public abstract class JsonGenerator
             throw new IllegalArgumentException("null array");
         }
         _verifyOffsets(array.length, offset, length);
-        writeStartArray();
+        writeStartArray(array, length);
         for (int i = offset, end = offset+length; i < end; ++i) {
             writeNumber(array[i]);
         }
@@ -954,7 +954,7 @@ public abstract class JsonGenerator
             throw new IllegalArgumentException("null array");
         }
         _verifyOffsets(array.length, offset, length);
-        writeStartArray();
+        writeStartArray(array, length);
         for (int i = offset, end = offset+length; i < end; ++i) {
             writeNumber(array[i]);
         }


=====================================
src/main/java/com/fasterxml/jackson/core/io/CharTypes.java
=====================================
@@ -174,11 +174,13 @@ public final class CharTypes
     }
 
     /**
-     * Lookup table for the first 128 Unicode characters (7-bit ASCII)
+     * Lookup table for the first 256 Unicode characters (ASCII / UTF-8)
      * range. For actual hex digits, contains corresponding value;
      * for others -1.
+     *<p>
+     * NOTE: before 2.10.1, was of size 128, extended for simpler handling
      */
-    private final static int[] sHexValues = new int[128];
+    private final static int[] sHexValues = new int[256];
     static {
         Arrays.fill(sHexValues, -1);
         for (int i = 0; i < 10; ++i) {
@@ -223,7 +225,9 @@ public final class CharTypes
 
     public static int charToHex(int ch)
     {
-        return (ch > 127) ? -1 : sHexValues[ch];
+        // 08-Nov-2019, tatu: As per [core#540] and [core#578], changed to
+        //   force masking here so caller need not do that.
+        return sHexValues[ch & 0xFF];
     }
 
     public static void appendQuoted(StringBuilder sb, String content)


=====================================
src/main/java/com/fasterxml/jackson/core/json/JsonReadFeature.java
=====================================
@@ -48,7 +48,6 @@ public enum JsonReadFeature
      * of single quotes (apostrophe, character '\'') for
      * quoting Strings (names and String values). If so,
      * this is in addition to other acceptable markers.
-     * but not by JSON specification).
      *<p>
      * Since JSON specification requires use of double quotes for
      * field names,


=====================================
src/main/java/com/fasterxml/jackson/core/json/JsonWriteFeature.java
=====================================
@@ -67,12 +67,6 @@ public enum JsonWriteFeature
      * if format uses escaping mechanisms (which is generally true
      * for textual formats but not for binary formats).
      *<p>
-     * Note that this setting may not necessarily make sense for all
-     * data formats (for example, binary formats typically do not use
-     * any escaping mechanisms; and some textual formats do not have
-     * general-purpose escaping); if so, settings is simply ignored.
-     * Put another way, effects of this feature are data-format specific.
-     *<p>
      * Feature is disabled by default.
      */
     @SuppressWarnings("deprecation")


=====================================
src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java
=====================================
@@ -246,19 +246,20 @@ public class ReaderBasedJsonParser // final in 2.3, earlier
     {
         final int bufSize = _inputEnd;
 
-        _currInputProcessed += bufSize;
-        _currInputRowStart -= bufSize;
-
-        // 26-Nov-2015, tatu: Since name-offset requires it too, must offset
-        //   this increase to avoid "moving" name-offset, resulting most likely
-        //   in negative value, which is fine as combine value remains unchanged.
-        _nameStartOffset -= bufSize;
-
         if (_reader != null) {
             int count = _reader.read(_inputBuffer, 0, _inputBuffer.length);
             if (count > 0) {
                 _inputPtr = 0;
                 _inputEnd = count;
+
+                _currInputProcessed += bufSize;
+                _currInputRowStart -= bufSize;
+
+                // 26-Nov-2015, tatu: Since name-offset requires it too, must offset
+                //   this increase to avoid "moving" name-offset, resulting most likely
+                //   in negative value, which is fine as combine value remains unchanged.
+                _nameStartOffset -= bufSize;
+
                 return true;
             }
             // End of input


=====================================
src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
=====================================
@@ -211,15 +211,6 @@ public class UTF8StreamJsonParser
     protected final boolean _loadMore() throws IOException
     {
         final int bufSize = _inputEnd;
-
-        _currInputProcessed += _inputEnd;
-        _currInputRowStart -= _inputEnd;
-
-        // 26-Nov-2015, tatu: Since name-offset requires it too, must offset
-        //   this increase to avoid "moving" name-offset, resulting most likely
-        //   in negative value, which is fine as combine value remains unchanged.
-        _nameStartOffset -= bufSize;
-
         if (_inputStream != null) {
             int space = _inputBuffer.length;
             if (space == 0) { // only occurs when we've been closed
@@ -230,6 +221,15 @@ public class UTF8StreamJsonParser
             if (count > 0) {
                 _inputPtr = 0;
                 _inputEnd = count;
+
+                _currInputProcessed += _inputEnd;
+                _currInputRowStart -= _inputEnd;
+
+                // 26-Nov-2015, tatu: Since name-offset requires it too, must offset
+                //   this increase to avoid "moving" name-offset, resulting most likely
+                //   in negative value, which is fine as combine value remains unchanged.
+                _nameStartOffset -= bufSize;
+
                 return true;
             }
             // End of input
@@ -3281,10 +3281,10 @@ public class UTF8StreamJsonParser
                     _reportInvalidEOF(" in character escape sequence", JsonToken.VALUE_STRING);
                 }
             }
-            int ch = _inputBuffer[_inputPtr++] & 0xFF;
+            int ch = _inputBuffer[_inputPtr++];
             int digit = CharTypes.charToHex(ch);
             if (digit < 0) {
-                _reportUnexpectedChar(ch, "expected a hex-digit for character escape sequence");
+                _reportUnexpectedChar(ch & 0xFF, "expected a hex-digit for character escape sequence");
             }
             value = (value << 4) | digit;
         }


=====================================
src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParser.java
=====================================
@@ -2352,7 +2352,7 @@ public class NonBlockingJsonParser
         while (true) {
             int digit = CharTypes.charToHex(c);
             if (digit < 0) {
-                _reportUnexpectedChar(c, "expected a hex-digit for character escape sequence");
+                _reportUnexpectedChar(c & 0xFF, "expected a hex-digit for character escape sequence");
             }
             value = (value << 4) | digit;
             if (++bytesRead == 4) {


=====================================
src/moditect/module-info.java
=====================================
@@ -17,4 +17,7 @@ module com.fasterxml.jackson.core {
     exports com.fasterxml.jackson.core.sym;
     exports com.fasterxml.jackson.core.type;
     exports com.fasterxml.jackson.core.util;
+
+    // 03-Oct-2019, tatu: [core#567] Add self-use to avoid warnings
+    uses com.fasterxml.jackson.core.ObjectCodec;
 }


=====================================
src/test/java/com/fasterxml/jackson/core/io/TestCharTypes.java
=====================================
@@ -20,4 +20,12 @@ public class TestCharTypes
             assertEquals(expected, actual);
         }
     }
+
+    public void testHexOutOfRange()
+    {
+        final int[] inputs = {0, -1, 1, 129, -129};
+        for (int input : inputs) {
+            assertEquals(-1, CharTypes.charToHex(input));
+        }
+    }
 }


=====================================
src/test/java/com/fasterxml/jackson/core/read/LocationDuringReaderParsingTest.java
=====================================
@@ -0,0 +1,219 @@
+package com.fasterxml.jackson.core.read;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.fasterxml.jackson.core.BaseTest;
+import com.fasterxml.jackson.core.JsonLocation;
+import com.fasterxml.jackson.core.JsonParser;
+
+/**
+ * Set of tests that checks getCurrentLocation() and getTokenLocation() are as expected during
+ * parsing.
+ */
+public class LocationDuringReaderParsingTest extends BaseTest
+{
+    public void testLocationAtEndOfParse() throws Exception
+    {
+        for (LocationTestCase test : LocationTestCase.values()) {
+            //System.out.println(test.name());
+            testLocationAtEndOfParse(test);
+        }
+    }
+
+    public void testInitialLocation() throws Exception
+    {
+        for (LocationTestCase test : LocationTestCase.values()) {
+            //System.out.println(test.name());
+            testInitialLocation(test);
+        }
+    }
+
+    public void testTokenLocations() throws Exception
+    {
+        for (LocationTestCase test : LocationTestCase.values()) {
+            //System.out.println(test.name());
+            testTokenLocations(test);
+        }
+    }
+
+    private void testLocationAtEndOfParse(LocationTestCase test) throws Exception
+    {
+        JsonParser p = createParserUsingReader(test.json);
+        while (p.nextToken() != null) {
+            p.nextToken();
+        }
+        assertCurrentLocation(p, test.getFinalLocation());
+        p.close();
+    }
+
+    private void testInitialLocation(LocationTestCase test) throws Exception
+    {
+        JsonParser p = createParserUsingReader(test.json);
+        JsonLocation loc = p.getCurrentLocation();
+        p.close();
+
+        assertLocation(loc, at(1, 1, 0));
+    }
+
+    private void testTokenLocations(LocationTestCase test) throws Exception
+    {
+        JsonParser p = createParserUsingReader(test.json);
+        int i = 0;
+        while (p.nextToken() != null) {
+            assertTokenLocation(p, test.locations.get(i));
+            i++;
+        }
+        assertEquals(test.locations.size(), i + 1); // last LocData is end of stream
+        p.close();
+    }
+
+    private void assertCurrentLocation(JsonParser p, LocData loc)
+    {
+        assertLocation(p.getCurrentLocation(), loc);
+    }
+
+    private void assertTokenLocation(JsonParser p, LocData loc)
+    {
+        assertLocation(p.getTokenLocation(), loc);
+    }
+
+    private void assertLocation(JsonLocation pLoc, LocData loc)
+    {
+        String expected = String.format("(%d, %d, %d)",
+                loc.lineNumber, loc.columnNumber, loc.offset);
+        String actual = String.format("(%d, %d, %d)", pLoc.getLineNr(), pLoc.getColumnNr(),
+                pLoc.getByteOffset() == -1 ? pLoc.getCharOffset() : pLoc.getByteOffset());
+        assertEquals(expected, actual);
+    }
+
+    private static class LocData
+    {
+        private long lineNumber;
+        private long columnNumber;
+        private long offset;
+
+        LocData(long lineNumber, long columnNumber, long offset)
+        {
+            this.lineNumber = lineNumber;
+            this.columnNumber = columnNumber;
+            this.offset = offset;
+        }
+    }
+
+    private static LocData at(long lineNumber, long columnNumber, long offset)
+    {
+        return new LocData(lineNumber, columnNumber, offset);
+    }
+
+    /**
+     * Adapted liberally from https://github.com/leadpony/jsonp-test-suite, also
+     * released under the Apache License v2.
+     */
+    enum LocationTestCase
+    {
+        SIMPLE_VALUE("42", at(1, 1, 0), at(1, 3, 2)),
+
+        SIMPLE_VALUE_WITH_PADDING("   1337  ", at(1, 4, 3), at(1, 10, 9)),
+
+        SIMPLE_VALUE_WITH_MULTIBYTE_CHARS("\"Правда\"",
+                at(1, 1, 0),
+                at(1, 9, 8)
+        ),
+
+        SIMPLE_VALUE_INCLUDING_SURROGATE_PAIR_CHARS("\"a П \uD83D\uDE01\"",
+                at(1, 1, 0),
+                at(1, 9, 8) // reader counts surrogate pairs as two chars
+        ),
+
+        ARRAY_IN_ONE_LINE("[\"hello\",42,true]",
+                at(1, 1, 0), // [
+                at(1, 2, 1), // "hello"
+                at(1, 10, 9), // 42
+                at(1, 13, 12), // true
+                at(1, 17, 16), // ]
+                at(1, 18, 17) // end of input
+        ),
+
+        ARRAY_IN_ONE_LINE_WITH_PADDING("  [ \"hello\" ,   42   ,   true   ]   ",
+                at(1, 3, 2), // [
+                at(1, 5, 4), // "hello"
+                at(1, 17, 16), // 42
+                at(1, 26, 25), // true
+                at(1, 33, 32), // ]
+                at(1, 37, 36) // end of input
+        ),
+
+        ARRAY_IN_MULTIPLE_LINES("[\n" + "    \"hello\",\n" + "    42,\n" + "    true\n" + "]",
+                at(1, 1, 0), // [
+                at(2, 5, 6), // "hello"
+                at(3, 5, 19), // 42
+                at(4, 5, 27), // true
+                at(5, 1, 32), // ]
+                at(5, 2, 33) // end of input
+        ),
+
+        ARRAY_IN_MULTIPLE_LINES_WITH_WEIRD_SPACING(" [\n" + "  \"hello\" ,  \n" + " 42   ,\n" + "      true\n" + " ]",
+                at(1, 2, 1), // [
+                at(2, 3, 5), // "hello"
+                at(3, 2, 18), // 42
+                at(4, 7, 31), // true
+                at(5, 2, 37), // ]
+                at(5, 3, 38) // end of input
+        ),
+
+        ARRAY_IN_MULTIPLE_LINES_CRLF("[\r\n" + "    \"hello\",\r\n" + "    42,\r\n" + "    true\r\n" + "]",
+                at(1, 1, 0), // [
+                at(2, 5, 7), // "hello"
+                at(3, 5, 21), // 42
+                at(4, 5, 30), // true
+                at(5, 1, 36), // ]
+                at(5, 2, 37) // end of input
+        ),
+
+        OBJECT_IN_ONE_LINE("{\"first\":\"hello\",\"second\":42}",
+                at(1, 1, 0), // {
+                at(1, 2, 1), // "first"
+                at(1, 10, 9), // "hello"
+                at(1, 18, 17), // "second"
+                at(1, 27, 26), // 42
+                at(1, 29, 28), // }
+                at(1, 30, 29) // end of input
+        ),
+
+        OBJECT_IN_MULTIPLE_LINES("{\n" + "    \"first\":\"hello\",\n" + "    \"second\":42\n" + "}",
+                at(1, 1, 0), // {
+                at(2, 5, 6), // "first"
+                at(2, 13, 14), // "hello"
+                at(3, 5, 27), // "second"
+                at(3, 14, 36), // 42
+                at(4, 1, 39), // }
+                at(4, 2, 40) // end of input
+        ),
+
+        OBJECT_IN_MULTIPLE_LINES_CRLF("{\r\n" + "    \"first\":\"hello\",\r\n" + "    \"second\":42\r\n" + "}",
+                at(1, 1, 0), // {
+                at(2, 5, 7), // "first"
+                at(2, 13, 15), // "hello"
+                at(3, 5, 29), // "second"
+                at(3, 14, 38), // 42
+                at(4, 1, 42), // }
+                at(4, 2, 43) // end of input
+        ),
+        ;
+
+        final String json;
+        final List<LocData> locations;
+
+        LocationTestCase(String json, LocData... locations)
+        {
+            this.json = json;
+            this.locations = Arrays.asList(locations);
+        }
+
+        LocData getFinalLocation()
+        {
+            return locations.get(locations.size() - 1);
+        }
+    }
+}


=====================================
src/test/java/com/fasterxml/jackson/core/read/LocationDuringStreamParsingTest.java
=====================================
@@ -0,0 +1,220 @@
+package com.fasterxml.jackson.core.read;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.fasterxml.jackson.core.BaseTest;
+import com.fasterxml.jackson.core.JsonLocation;
+import com.fasterxml.jackson.core.JsonParser;
+
+/**
+ * Set of tests that checks getCurrentLocation() and getTokenLocation() are as expected during
+ * parsing.
+ */
+public class LocationDuringStreamParsingTest extends BaseTest
+{
+    public void testLocationAtEndOfParse() throws Exception
+    {
+        for (LocationTestCase test : LocationTestCase.values()) {
+            //System.out.println(test.name());
+            testLocationAtEndOfParse(test);
+        }
+    }
+
+    public void testInitialLocation() throws Exception
+    {
+        for (LocationTestCase test : LocationTestCase.values()) {
+            //System.out.println(test.name());
+            testInitialLocation(test);
+        }
+    }
+
+    public void testTokenLocations() throws Exception
+    {
+        for (LocationTestCase test : LocationTestCase.values()) {
+            //System.out.println(test.name());
+            testTokenLocations(test);
+        }
+    }
+
+    private void testLocationAtEndOfParse(LocationTestCase test) throws Exception
+    {
+        JsonParser p = createParserUsingStream(test.json, "UTF8");
+        while (p.nextToken() != null) {
+            p.nextToken();
+        }
+        assertCurrentLocation(p, test.getFinalLocation());
+        p.close();
+    }
+
+    private void testInitialLocation(LocationTestCase test) throws Exception
+    {
+        JsonParser p = createParserUsingStream(test.json, "UTF8");
+        JsonLocation loc = p.getCurrentLocation();
+        p.close();
+
+        assertLocation(loc, at(1, 1, 0));
+    }
+
+    private void testTokenLocations(LocationTestCase test) throws Exception
+    {
+        JsonParser p = createParserUsingStream(test.json, "UTF8");
+        int i = 0;
+        while (p.nextToken() != null) {
+            assertTokenLocation(p, test.locations.get(i));
+            i++;
+        }
+        assertEquals(test.locations.size(), i + 1); // last LocData is end of stream
+        p.close();
+    }
+
+    private void assertCurrentLocation(JsonParser p, LocData loc)
+    {
+        assertLocation(p.getCurrentLocation(), loc);
+    }
+
+    private void assertTokenLocation(JsonParser p, LocData loc)
+    {
+        assertLocation(p.getTokenLocation(), loc);
+    }
+
+    private void assertLocation(JsonLocation pLoc, LocData loc)
+    {
+        String expected = String.format("(%d, %d, %d)",
+                loc.lineNumber, loc.columnNumber, loc.offset);
+        String actual = String.format("(%d, %d, %d)", pLoc.getLineNr(), pLoc.getColumnNr(),
+                pLoc.getByteOffset() == -1 ? pLoc.getCharOffset() : pLoc.getByteOffset());
+        assertEquals(expected, actual);
+    }
+
+    private static class LocData
+    {
+        private long lineNumber;
+        private long columnNumber;
+        private long offset;
+
+        LocData(long lineNumber, long columnNumber, long offset)
+        {
+            this.lineNumber = lineNumber;
+            this.columnNumber = columnNumber;
+            this.offset = offset;
+        }
+    }
+
+    private static LocData at(long lineNumber, long columnNumber, long offset)
+    {
+        return new LocData(lineNumber, columnNumber, offset);
+    }
+
+    /**
+     * Adapted liberally from https://github.com/leadpony/jsonp-test-suite, also
+     * released under the Apache License v2.
+     */
+    enum LocationTestCase
+    {
+        SIMPLE_VALUE("42", at(1, 1, 0), at(1, 3, 2)),
+
+        SIMPLE_VALUE_WITH_PADDING("   1337  ", at(1, 4, 3), at(1, 10, 9)),
+
+        SIMPLE_VALUE_WITH_MULTIBYTE_CHARS("\"Правда\"",
+                at(1, 1, 0),
+                at(1, 15, 14) // one byte for each ", two for each Cyrillic char
+        ),
+
+        SIMPLE_VALUE_INCLUDING_SURROGATE_PAIR_CHARS("\"a П \uD83D\uDE01\"",
+                at(1, 1, 0),
+                at(1, 12, 11) // one byte for each ", a and space; two for П, four for smiley emoji
+        ),
+
+        ARRAY_IN_ONE_LINE("[\"hello\",42,true]",
+                at(1, 1, 0), // [
+                at(1, 2, 1), // "hello"
+                at(1, 10, 9), // 42
+                at(1, 13, 12), // true
+                at(1, 17, 16), // ]
+                at(1, 18, 17) // end of input
+        ),
+
+        ARRAY_IN_ONE_LINE_WITH_PADDING("  [ \"hello\" ,   42   ,   true   ]   ",
+                at(1, 3, 2), // [
+                at(1, 5, 4), // "hello"
+                at(1, 17, 16), // 42
+                at(1, 26, 25), // true
+                at(1, 33, 32), // ]
+                at(1, 37, 36) // end of input
+        ),
+
+        ARRAY_IN_MULTIPLE_LINES("[\n" + "    \"hello\",\n" + "    42,\n" + "    true\n" + "]",
+                at(1, 1, 0), // [
+                at(2, 5, 6), // "hello"
+                at(3, 5, 19), // 42
+                at(4, 5, 27), // true
+                at(5, 1, 32), // ]
+                at(5, 2, 33) // end of input
+        ),
+
+        ARRAY_IN_MULTIPLE_LINES_WITH_WEIRD_SPACING(" [\n" + "  \"hello\" ,  \n" + " 42   ,\n" + "      true\n" + " ]",
+                at(1, 2, 1), // [
+                at(2, 3, 5), // "hello"
+                at(3, 2, 18), // 42
+                at(4, 7, 31), // true
+                at(5, 2, 37), // ]
+                at(5, 3, 38) // end of input
+        ),
+
+        ARRAY_IN_MULTIPLE_LINES_CRLF("[\r\n" + "    \"hello\",\r\n" + "    42,\r\n" + "    true\r\n" + "]",
+                at(1, 1, 0), // [
+                at(2, 5, 7), // "hello"
+                at(3, 5, 21), // 42
+                at(4, 5, 30), // true
+                at(5, 1, 36), // ]
+                at(5, 2, 37) // end of input
+        ),
+
+        OBJECT_IN_ONE_LINE("{\"first\":\"hello\",\"second\":42}",
+                at(1, 1, 0), // {
+                at(1, 2, 1), // "first"
+                at(1, 10, 9), // "hello"
+                at(1, 18, 17), // "second"
+                at(1, 27, 26), // 42
+                at(1, 29, 28), // }
+                at(1, 30, 29) // end of input
+        ),
+
+        OBJECT_IN_MULTIPLE_LINES("{\n" + "    \"first\":\"hello\",\n" + "    \"second\":42\n" + "}",
+                at(1, 1, 0), // {
+                at(2, 5, 6), // "first"
+                at(2, 13, 14), // "hello"
+                at(3, 5, 27), // "second"
+                at(3, 14, 36), // 42
+                at(4, 1, 39), // }
+                at(4, 2, 40) // end of input
+        ),
+
+        OBJECT_IN_MULTIPLE_LINES_CRLF("{\r\n" + "    \"first\":\"hello\",\r\n" + "    \"second\":42\r\n" + "}",
+                at(1, 1, 0), // {
+                at(2, 5, 7), // "first"
+                at(2, 13, 15), // "hello"
+                at(3, 5, 29), // "second"
+                at(3, 14, 38), // 42
+                at(4, 1, 42), // }
+                at(4, 2, 43) // end of input
+        ),
+        ;
+
+        final String json;
+        final List<LocData> locations;
+
+        LocationTestCase(String json, LocData... locations)
+        {
+            this.json = json;
+            this.locations = Arrays.asList(locations);
+        }
+
+        LocData getFinalLocation()
+        {
+            return locations.get(locations.size() - 1);
+        }
+    }
+
+}


=====================================
src/test/java/com/fasterxml/jackson/core/read/ParserDupHandlingTest.java
=====================================
@@ -35,8 +35,9 @@ public class ParserDupHandlingTest
     public void testSimpleDupsBytes() throws Exception
     {
         JsonFactory nonDupF = new JsonFactory();
-        JsonFactory dupF = new JsonFactory();
-        dupF.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
+        JsonFactory dupF = JsonFactory.builder()
+                .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION)
+                .build();
         for (String doc : DUP_DOCS) {
             // First, with static setting
             _testSimpleDupsFail(doc, dupF, MODE_INPUT_STREAM, "a", false);
@@ -51,8 +52,9 @@ public class ParserDupHandlingTest
     public void testSimpleDupsDataInput() throws Exception
     {
         JsonFactory nonDupF = new JsonFactory();
-        JsonFactory dupF = new JsonFactory();
-        dupF.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
+        JsonFactory dupF = JsonFactory.builder()
+                .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION)
+                .build();
         for (String doc : DUP_DOCS) {
             _testSimpleDupsFail(doc, dupF, MODE_DATA_INPUT, "a", false);
             _testSimpleDupsFail(doc, nonDupF, MODE_DATA_INPUT, "a", true);



View it on GitLab: https://salsa.debian.org/java-team/jackson-core/compare/440dc70471ee68f2b32058fdbc7bde505425be3a...f114c773c08388fb0ead021537d8e848bef1e664

-- 
View it on GitLab: https://salsa.debian.org/java-team/jackson-core/compare/440dc70471ee68f2b32058fdbc7bde505425be3a...f114c773c08388fb0ead021537d8e848bef1e664
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20191223/9167ec3e/attachment.html>


More information about the pkg-java-commits mailing list