diff options
Diffstat (limited to 'vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java')
-rw-r--r-- | vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java index eb163a02bf0..68e102ab079 100644 --- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java +++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java @@ -3,6 +3,7 @@ package ai.vespa.feed.client; import ai.vespa.feed.client.FeedClient.OperationType; import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonLocation; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; @@ -358,6 +359,12 @@ public class JsonFeeder implements Closeable { abstract String getDocumentJson(long start, long end); + OperationParseException parseException(String error) { + JsonLocation location = parser.getTokenLocation(); + return new OperationParseException(error + " at offset " + location.getByteOffset() + + " (line " + location.getLineNr() + ", column " + location.getColumnNr() + ")"); + } + CompletableFuture<Result> next() throws IOException { JsonToken token = parser.nextToken(); if (multipleOperations && ! arrayPrefixParsed && token == START_ARRAY) { @@ -366,7 +373,7 @@ public class JsonFeeder implements Closeable { } if (token == END_ARRAY && multipleOperations) return null; else if (token == null && ! arrayPrefixParsed) return null; - else if (token != START_OBJECT) throw new OperationParseException("Unexpected token '" + parser.currentToken() + "' at offset " + parser.getTokenLocation().getByteOffset()); + else if (token != START_OBJECT) throw parseException("Unexpected token '" + parser.currentToken() + "'"); long start = 0, end = -1; OperationType type = null; DocumentId id = null; @@ -392,8 +399,7 @@ public class JsonFeeder implements Closeable { end = parser.getTokenLocation().getByteOffset() + 1; break; } - default: throw new OperationParseException("Unexpected field name '" + parser.getText() + "' at offset " + - parser.getTokenLocation().getByteOffset()); + default: throw parseException("Unexpected field name '" + parser.getText() + "'"); } break; @@ -401,15 +407,20 @@ public class JsonFeeder implements Closeable { break loop; default: - throw new OperationParseException("Unexpected token '" + parser.currentToken() + "' at offset " + - parser.getTokenLocation().getByteOffset()); + throw parseException("Unexpected token '" + parser.currentToken() + "'"); } } if (id == null) - throw new OperationParseException("No document id for document at offset " + start); + throw parseException("No document id for document"); + if (type == REMOVE) { + if (end >= start) + throw parseException("Illegal 'fields' object for remove operation"); + else + start = end = parser.getTokenLocation().getByteOffset(); // getDocumentJson advances buffer overwrite head. + } + else if (end < start) + throw parseException("No 'fields' object for document"); - if (end < start) - throw new OperationParseException("No 'fields' object for document at offset " + parser.getTokenLocation().getByteOffset()); String payload = getDocumentJson(start, end); switch (type) { case PUT: return client.put (id, payload, parameters); @@ -479,4 +490,5 @@ public class JsonFeeder implements Closeable { } } + } |