[jackson-dataformat-smile] 21/31: Fix [JACKSON-803] for 2.0

Hilko Bengen bengen at alioth.debian.org
Mon Sep 2 17:37:26 UTC 2013


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 <tsaloranta at gmail.com>
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



More information about the pkg-java-commits mailing list