aboutsummaryrefslogtreecommitdiffstats
path: root/vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java
diff options
context:
space:
mode:
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.java28
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 {
}
}
+
}