Skip to content

Commit 0f48593

Browse files
committed
Fix #24 in 2.3.x branch (2.3.6 is such released)
1 parent d8fb06a commit 0f48593

File tree

4 files changed

+49
-8
lines changed

4 files changed

+49
-8
lines changed

release-notes/VERSION

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
Project: jackson-dataformat-smile
2-
Version: 2.3.4 (17-Jul-2014)
32

43
------------------------------------------------------------------------
54
=== History: ===
65
------------------------------------------------------------------------
76

7+
2.3.6 (not yet released)
8+
9+
#24: Current location does not always updated properly
10+
811
2.3.5 (14-Jan-2015)
912

1013
No changes since 2.3.4

src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,16 +373,18 @@ public JsonLocation getCurrentLocation()
373373
protected final boolean loadMore()
374374
throws IOException
375375
{
376-
_currInputProcessed += _inputEnd;
377376
//_currInputRowStart -= _inputEnd;
378377

379378
if (_inputStream != null) {
380379
int count = _inputStream.read(_inputBuffer, 0, _inputBuffer.length);
380+
_currInputProcessed += _inputEnd;
381+
_inputPtr = 0;
381382
if (count > 0) {
382-
_inputPtr = 0;
383383
_inputEnd = count;
384384
return true;
385385
}
386+
// important: move pointer to same as end, to keep location accurate
387+
_inputEnd = 0;
386388
// End of input
387389
_closeInput();
388390
// Should never return 0, so let's fail
@@ -406,8 +408,8 @@ protected final void _loadToHaveAtLeast(int minAvailable)
406408
}
407409
// Need to move remaining data in front?
408410
int amount = _inputEnd - _inputPtr;
411+
_currInputProcessed += _inputPtr;
409412
if (amount > 0 && _inputPtr > 0) {
410-
_currInputProcessed += _inputPtr;
411413
//_currInputRowStart -= _inputPtr;
412414
System.arraycopy(_inputBuffer, _inputPtr, _inputBuffer, 0, amount);
413415
_inputEnd = amount;

src/test/java/com/fasterxml/jackson/dataformat/smile/SmileTestBase.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
import java.io.ByteArrayOutputStream;
44
import java.io.IOException;
55
import java.io.InputStream;
6+
import java.io.OutputStream;
67
import java.util.Arrays;
78

89
import org.junit.Assert;
910

1011
import com.fasterxml.jackson.core.*;
1112
import com.fasterxml.jackson.databind.ObjectMapper;
12-
1313
import com.fasterxml.jackson.dataformat.smile.SmileFactory;
1414
import com.fasterxml.jackson.dataformat.smile.SmileGenerator;
1515
import com.fasterxml.jackson.dataformat.smile.SmileParser;
@@ -128,14 +128,14 @@ protected byte[] _smileDoc(SmileFactory smileFactory, String json, boolean write
128128
return out.toByteArray();
129129
}
130130

131-
protected SmileGenerator smileGenerator(ByteArrayOutputStream result, boolean addHeader)
131+
protected SmileGenerator smileGenerator(OutputStream result, boolean addHeader)
132132
throws IOException
133133
{
134134
return smileGenerator(new SmileFactory(), result, addHeader);
135135
}
136136

137137
protected SmileGenerator smileGenerator(SmileFactory f,
138-
ByteArrayOutputStream result, boolean addHeader)
138+
OutputStream result, boolean addHeader)
139139
throws IOException
140140
{
141141
f.configure(SmileGenerator.Feature.WRITE_HEADER, addHeader);

src/test/java/com/fasterxml/jackson/dataformat/smile/TestParserLocation.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.fasterxml.jackson.dataformat.smile;
22

3-
import java.io.IOException;
3+
import java.io.*;
44

55
import com.fasterxml.jackson.core.*;
66

@@ -57,4 +57,40 @@ public void testSimpleOffsets() throws IOException
5757
assertNull(p.nextToken());
5858
p.close();
5959
}
60+
61+
// for [databind-smile#24]
62+
public void testAscendingOffsets() throws Exception
63+
{
64+
// need to create big enough document, say at least 64k
65+
// but as importantly, try to create buffer boundaries by using 6-char (7-byte) ASCII strings
66+
final int COUNT = 57000;
67+
final int SIZE = COUNT * 7;
68+
69+
ByteArrayOutputStream bytes = new ByteArrayOutputStream(COUNT + 10);
70+
SmileGenerator gen = smileGenerator(bytes, true);
71+
gen.disable(SmileGenerator.Feature.CHECK_SHARED_STRING_VALUES);
72+
gen.writeStartArray();
73+
for (int i = 0; i < COUNT; ++i) {
74+
gen.writeString("abc123");
75+
}
76+
gen.writeEndArray();
77+
gen.close();
78+
byte[] b = bytes.toByteArray();
79+
assertEquals(4 + 2 + SIZE, b.length);
80+
81+
SmileParser p = _smileParser(new ByteArrayInputStream(b));
82+
assertToken(JsonToken.START_ARRAY, p.nextToken());
83+
// 4 byte header, start array read, so 4 bytes down:
84+
assertEquals(5, p.getCurrentLocation().getByteOffset());
85+
for (int i = 0; i < COUNT; ++i) {
86+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
87+
assertEquals(6 + i*7, p.getCurrentLocation().getByteOffset());
88+
assertEquals("abc123", p.getText());
89+
}
90+
assertToken(JsonToken.END_ARRAY, p.nextToken());
91+
assertEquals(SIZE+6, p.getCurrentLocation().getByteOffset());
92+
assertNull(p.nextToken());
93+
assertEquals(SIZE+6, p.getCurrentLocation().getByteOffset());
94+
p.close();
95+
}
6096
}

0 commit comments

Comments
 (0)