This is an automated email from the git hooks/post-receive script. bengen pushed a commit to annotated tag jackson-dataformat-smile-2.0.0 in repository jackson-dataformat-smile.
commit 97eaf00569cf71567815da3a7600aad0fd7c78a3 Author: Tatu Saloranta <[email protected]> Date: Tue Mar 6 19:46:54 2012 -0800 Fix [JACKSON-803] for 2.0 --- pom.xml | 4 +- .../jackson/dataformat/smile/SmileParser.java | 24 +++++-- .../jackson/dataformat/smile/SmileTestBase.java | 17 ++++- .../dataformat/smile/TestSmileParserNames.java | 66 ++++++++++++++++++++ 4 files changed, 101 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index dbf0edb..59cab89 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> - <version>${project.version}</version> + <version>2.0.0-RC2</version> </dependency> <!-- and for testing, JUnit (or TestNG?) is needed --> @@ -65,7 +65,7 @@ <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> - <version>${project.version}</version> + <version>2.0.0-RC2</version> <scope>test</scope> </dependency> </dependencies> diff --git a/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java b/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java index e3170c9..945dcf1 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java @@ -1544,7 +1544,7 @@ public class SmileParser } return _symbols.addName(baseName, quads, quadLen); } - + private final void _handleLongFieldName() throws IOException, JsonParseException { // First: gather quads we need, looking for end marker @@ -1554,24 +1554,36 @@ public class SmileParser int q = 0; while (true) { + if (_inputPtr >= _inputEnd) { + loadMoreGuaranteed(); + } byte b = inBuf[_inputPtr++]; if (BYTE_MARKER_END_OF_STRING == b) { bytes = 0; break; } q = ((int) b) & 0xFF; + if (_inputPtr >= _inputEnd) { + loadMoreGuaranteed(); + } b = inBuf[_inputPtr++]; if (BYTE_MARKER_END_OF_STRING == b) { bytes = 1; break; } q = (q << 8) | (b & 0xFF); + if (_inputPtr >= _inputEnd) { + loadMoreGuaranteed(); + } b = inBuf[_inputPtr++]; if (BYTE_MARKER_END_OF_STRING == b) { bytes = 2; break; } q = (q << 8) | (b & 0xFF); + if (_inputPtr >= _inputEnd) { + loadMoreGuaranteed(); + } b = inBuf[_inputPtr++]; if (BYTE_MARKER_END_OF_STRING == b) { bytes = 3; @@ -1620,8 +1632,8 @@ public class SmileParser if ((_inputEnd - _inputPtr) < len) { _loadToHaveAtLeast(len); } - // First: maybe we already have this name decoded? - if (len < 5) { + // First: maybe we already have this name decoded? + if (len < 5) { int inPtr = _inputPtr; final byte[] inBuf = _inputBuffer; int q = inBuf[inPtr] & 0xFF; @@ -1636,7 +1648,7 @@ public class SmileParser } _quad1 = q; return _symbols.findName(q); - } + } if (len < 9) { int inPtr = _inputPtr; final byte[] inBuf = _inputBuffer; @@ -1889,7 +1901,7 @@ public class SmileParser } private final void _finishBigInteger() - throws IOException, JsonParseException + throws IOException, JsonParseException { byte[] raw = _read7BitBinaryWithLength(); _numberBigInt = new BigInteger(raw); @@ -1900,7 +1912,7 @@ public class SmileParser throws IOException, JsonParseException { // just need 5 bytes to get int32 first; all are unsigned - int i = _fourBytesToInt(); + int i = _fourBytesToInt(); if (_inputPtr >= _inputEnd) { loadMoreGuaranteed(); } diff --git a/src/test/java/com/fasterxml/jackson/dataformat/smile/SmileTestBase.java b/src/test/java/com/fasterxml/jackson/dataformat/smile/SmileTestBase.java index c01a509..7f8b8ea 100644 --- a/src/test/java/com/fasterxml/jackson/dataformat/smile/SmileTestBase.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/smile/SmileTestBase.java @@ -2,6 +2,7 @@ package com.fasterxml.jackson.dataformat.smile; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import org.junit.Assert; @@ -54,18 +55,30 @@ abstract class SmileTestBase return _smileParser(input, false); } + protected SmileParser _smileParser(InputStream in) throws IOException { + return _smileParser(in, false); + } + protected SmileParser _smileParser(byte[] input, boolean requireHeader) throws IOException { SmileFactory f = smileFactory(requireHeader, false, false); return _smileParser(f, input); } - protected SmileParser _smileParser(SmileFactory f, byte[] input) - throws IOException + protected SmileParser _smileParser(InputStream in, boolean requireHeader) throws IOException { + SmileFactory f = smileFactory(requireHeader, false, false); + return _smileParser(f, in); + } + + protected SmileParser _smileParser(SmileFactory f, byte[] input) throws IOException { return f.createJsonParser(input); } + protected SmileParser _smileParser(SmileFactory f, InputStream in) throws IOException { + return f.createJsonParser(in); + } + protected ObjectMapper smileMapper() { return smileMapper(false); } diff --git a/src/test/java/com/fasterxml/jackson/dataformat/smile/TestSmileParserNames.java b/src/test/java/com/fasterxml/jackson/dataformat/smile/TestSmileParserNames.java new file mode 100644 index 0000000..7deab74 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/dataformat/smile/TestSmileParserNames.java @@ -0,0 +1,66 @@ +package com.fasterxml.jackson.dataformat.smile; + +import java.io.*; +import java.util.Random; + +import com.fasterxml.jackson.core.*; + +public class TestSmileParserNames extends SmileTestBase +{ + public void testLongNames() throws IOException + { + _testWithName(generateName(5000)); + } + + public void testJsonBinForLargeObjects() throws Exception + { + StringBuilder nameBuf = new StringBuilder("longString"); + int minLength = 9000; + for (int i = 1; nameBuf.length() < minLength; ++i) { + nameBuf.append("." + i); + } + String name = nameBuf.toString(); + _testWithName(name); + } + + /* + /********************************************************** + /* Helper methods + /********************************************************** + */ + + private void _testWithName(String name) throws IOException + { + byte[] data = _smileDoc("{"+quote(name)+":13}"); + // important: MUST use InputStream to enforce buffer boundaries! + SmileParser p = _smileParser(new ByteArrayInputStream(data)); + assertNull(p.getCurrentToken()); + assertToken(JsonToken.START_OBJECT, p.nextToken()); + assertToken(JsonToken.FIELD_NAME, p.nextToken()); + assertEquals(name, p.getCurrentName()); + assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken()); + assertEquals(13, p.getIntValue()); + assertEquals(name, p.getCurrentName()); + assertToken(JsonToken.END_OBJECT, p.nextToken()); + assertNull(p.nextToken()); + p.close(); + } + + + private String generateName(int minLen) + { + StringBuilder sb = new StringBuilder(); + Random rnd = new Random(123); + while (sb.length() < minLen) { + int ch = rnd.nextInt(96); + if (ch < 32) { // ascii (single byte) + sb.append((char) (48 + ch)); + } else if (ch < 64) { // 2 byte + sb.append((char) (128 + ch)); + } else { // 3 byte + sb.append((char) (4000 + ch)); + } + } + return sb.toString(); + } +} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jackson-dataformat-smile.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

