Skip to content

Commit f4a9b7b

Browse files
committed
Implement some methods in MessagePackParser
getTokenLocation(), getCurrentLocation() and overrideCurrentName()
1 parent 62b9e3b commit f4a9b7b

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackParser.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ public class MessagePackParser extends ParserMinimalBase {
2929
private final LinkedList<StackItem> stack = new LinkedList<StackItem>();
3030
private final ValueHolder valueHolder = new ValueHolder();
3131
private boolean isClosed;
32+
private long tokenPosition;
33+
private long currentPosition;
34+
private final IOContext ioContext;
3235

3336
private static abstract class StackItem {
3437
private long numOfElements;
@@ -67,6 +70,7 @@ public MessagePackParser(IOContext ctxt, int features, byte[] bytes) throws IOEx
6770
}
6871

6972
private MessagePackParser(IOContext ctxt, int features, MessageBufferInput input) throws IOException {
73+
ioContext = ctxt;
7074
DupDetector dups = Feature.STRICT_DUPLICATE_DETECTION.enabledIn(features)
7175
? DupDetector.rootDetector(this) : null;
7276
parsingContext = JsonReadContext.createRootContext(dups);
@@ -99,6 +103,8 @@ public Version version() {
99103
@Override
100104
public JsonToken nextToken() throws IOException, JsonParseException {
101105
MessageUnpacker messageUnpacker = getMessageUnpacker();
106+
tokenPosition = messageUnpacker.getTotalReadBytes();
107+
102108
JsonToken nextToken = null;
103109
if (parsingContext.inObject() || parsingContext.inArray()) {
104110
if (stack.getFirst().isEmpty()) {
@@ -158,6 +164,7 @@ public JsonToken nextToken() throws IOException, JsonParseException {
158164
default:
159165
throw new IllegalStateException("Shouldn't reach here");
160166
}
167+
currentPosition = messageUnpacker.getTotalReadBytes();
161168

162169
if (parsingContext.inObject() && nextToken != JsonToken.FIELD_NAME || parsingContext.inArray()) {
163170
stack.getFirst().consume();
@@ -302,17 +309,27 @@ public JsonStreamContext getParsingContext() {
302309

303310
@Override
304311
public JsonLocation getTokenLocation() {
305-
throw new UnsupportedOperationException("Not implemented yet");
312+
return new JsonLocation(ioContext.getSourceReference(), tokenPosition, -1, -1, (int) tokenPosition);
306313
}
307314

308315
@Override
309316
public JsonLocation getCurrentLocation() {
310-
throw new UnsupportedOperationException("Not implemented yet");
317+
return new JsonLocation(ioContext.getSourceReference(), currentPosition, -1, -1, (int) currentPosition);
311318
}
312319

313320
@Override
314321
public void overrideCurrentName(String name) {
315-
throw new UnsupportedOperationException("Not implemented yet");
322+
try {
323+
if (_currToken == JsonToken.START_OBJECT || _currToken == JsonToken.START_ARRAY) {
324+
JsonReadContext parent = parsingContext.getParent();
325+
parent.setCurrentName(name);
326+
}
327+
else {
328+
parsingContext.setCurrentName(name);
329+
}
330+
} catch (JsonProcessingException e) {
331+
throw new IllegalStateException(e);
332+
}
316333
}
317334

318335
@Override public String getCurrentName() throws IOException {

msgpack-jackson/src/test/java/org/msgpack/jackson/dataformat/MessagePackParserTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,25 +248,43 @@ public void testMessagePackParserDirectly() throws IOException {
248248

249249
JsonToken jsonToken = parser.nextToken();
250250
assertEquals(JsonToken.START_OBJECT, jsonToken);
251+
assertEquals(-1, parser.getTokenLocation().getLineNr());
252+
assertEquals(0, parser.getTokenLocation().getColumnNr());
253+
assertEquals(-1, parser.getCurrentLocation().getLineNr());
254+
assertEquals(1, parser.getCurrentLocation().getColumnNr());
251255

252256
jsonToken = parser.nextToken();
253257
assertEquals(JsonToken.FIELD_NAME, jsonToken);
254258
assertEquals("zero", parser.getCurrentName());
259+
assertEquals(1, parser.getTokenLocation().getColumnNr());
260+
assertEquals(6, parser.getCurrentLocation().getColumnNr());
255261

256262
jsonToken = parser.nextToken();
257263
assertEquals(JsonToken.VALUE_NUMBER_INT, jsonToken);
258264
assertEquals(0, parser.getIntValue());
265+
assertEquals(6, parser.getTokenLocation().getColumnNr());
266+
assertEquals(7, parser.getCurrentLocation().getColumnNr());
259267

260268
jsonToken = parser.nextToken();
261269
assertEquals(JsonToken.FIELD_NAME, jsonToken);
262270
assertEquals("one", parser.getCurrentName());
271+
assertEquals(7, parser.getTokenLocation().getColumnNr());
272+
assertEquals(11, parser.getCurrentLocation().getColumnNr());
273+
parser.overrideCurrentName("two");
274+
assertEquals("two", parser.getCurrentName());
263275

264276
jsonToken = parser.nextToken();
265277
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, jsonToken);
266278
assertEquals(1.0f, parser.getIntValue(), 0.001f);
279+
assertEquals(11, parser.getTokenLocation().getColumnNr());
280+
assertEquals(16, parser.getCurrentLocation().getColumnNr());
267281

268282
jsonToken = parser.nextToken();
269283
assertEquals(JsonToken.END_OBJECT, jsonToken);
284+
assertEquals(-1, parser.getTokenLocation().getLineNr());
285+
assertEquals(16, parser.getTokenLocation().getColumnNr());
286+
assertEquals(-1, parser.getCurrentLocation().getLineNr());
287+
assertEquals(16, parser.getCurrentLocation().getColumnNr());
270288

271289
try {
272290
parser.nextToken();

0 commit comments

Comments
 (0)