Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ public class MessagePackParser extends ParserMinimalBase {
private final LinkedList<StackItem> stack = new LinkedList<StackItem>();
private final ValueHolder valueHolder = new ValueHolder();
private boolean isClosed;
private long tokenPosition;
private long currentPosition;
private final IOContext ioContext;

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

private MessagePackParser(IOContext ctxt, int features, MessageBufferInput input) throws IOException {
ioContext = ctxt;
DupDetector dups = Feature.STRICT_DUPLICATE_DETECTION.enabledIn(features)
? DupDetector.rootDetector(this) : null;
parsingContext = JsonReadContext.createRootContext(dups);
Expand Down Expand Up @@ -99,6 +103,8 @@ public Version version() {
@Override
public JsonToken nextToken() throws IOException, JsonParseException {
MessageUnpacker messageUnpacker = getMessageUnpacker();
tokenPosition = messageUnpacker.getTotalReadBytes();

JsonToken nextToken = null;
if (parsingContext.inObject() || parsingContext.inArray()) {
if (stack.getFirst().isEmpty()) {
Expand Down Expand Up @@ -158,6 +164,7 @@ public JsonToken nextToken() throws IOException, JsonParseException {
default:
throw new IllegalStateException("Shouldn't reach here");
}
currentPosition = messageUnpacker.getTotalReadBytes();

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

@Override
public JsonLocation getTokenLocation() {
throw new UnsupportedOperationException("Not implemented yet");
return new JsonLocation(ioContext.getSourceReference(), tokenPosition, -1, -1, (int) tokenPosition);
}

@Override
public JsonLocation getCurrentLocation() {
throw new UnsupportedOperationException("Not implemented yet");
return new JsonLocation(ioContext.getSourceReference(), currentPosition, -1, -1, (int) currentPosition);
}

@Override
public void overrideCurrentName(String name) {
throw new UnsupportedOperationException("Not implemented yet");
try {
if (_currToken == JsonToken.START_OBJECT || _currToken == JsonToken.START_ARRAY) {
JsonReadContext parent = parsingContext.getParent();
parent.setCurrentName(name);
}
else {
parsingContext.setCurrentName(name);
}
} catch (JsonProcessingException e) {
throw new IllegalStateException(e);
}
}

@Override public String getCurrentName() throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,25 +248,43 @@ public void testMessagePackParserDirectly() throws IOException {

JsonToken jsonToken = parser.nextToken();
assertEquals(JsonToken.START_OBJECT, jsonToken);
assertEquals(-1, parser.getTokenLocation().getLineNr());
assertEquals(0, parser.getTokenLocation().getColumnNr());
assertEquals(-1, parser.getCurrentLocation().getLineNr());
assertEquals(1, parser.getCurrentLocation().getColumnNr());

jsonToken = parser.nextToken();
assertEquals(JsonToken.FIELD_NAME, jsonToken);
assertEquals("zero", parser.getCurrentName());
assertEquals(1, parser.getTokenLocation().getColumnNr());
assertEquals(6, parser.getCurrentLocation().getColumnNr());

jsonToken = parser.nextToken();
assertEquals(JsonToken.VALUE_NUMBER_INT, jsonToken);
assertEquals(0, parser.getIntValue());
assertEquals(6, parser.getTokenLocation().getColumnNr());
assertEquals(7, parser.getCurrentLocation().getColumnNr());

jsonToken = parser.nextToken();
assertEquals(JsonToken.FIELD_NAME, jsonToken);
assertEquals("one", parser.getCurrentName());
assertEquals(7, parser.getTokenLocation().getColumnNr());
assertEquals(11, parser.getCurrentLocation().getColumnNr());
parser.overrideCurrentName("two");
assertEquals("two", parser.getCurrentName());

jsonToken = parser.nextToken();
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, jsonToken);
assertEquals(1.0f, parser.getIntValue(), 0.001f);
assertEquals(11, parser.getTokenLocation().getColumnNr());
assertEquals(16, parser.getCurrentLocation().getColumnNr());

jsonToken = parser.nextToken();
assertEquals(JsonToken.END_OBJECT, jsonToken);
assertEquals(-1, parser.getTokenLocation().getLineNr());
assertEquals(16, parser.getTokenLocation().getColumnNr());
assertEquals(-1, parser.getCurrentLocation().getLineNr());
assertEquals(16, parser.getCurrentLocation().getColumnNr());

try {
parser.nextToken();
Expand Down