diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2021-10-11 22:19:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-11 22:19:12 +0200 |
commit | f3e402cd0928a00e017bac1a38708debced7a4eb (patch) | |
tree | 9e157f3d1847392b0d1330a786811598267f5cf1 /vespa-feed-client/src/main/java/ai/vespa/feed/client/DocumentId.java | |
parent | f889f5f3df5411901f549f1a7144ad0845e01103 (diff) | |
parent | 6587de95f2d732f9d3259b2baac60d7edf0fd965 (diff) |
Merge pull request #19509 from vespa-engine/jonmv/fix-docid-parse-bugv7.481.18
Fix document id parse bug in feed client
Diffstat (limited to 'vespa-feed-client/src/main/java/ai/vespa/feed/client/DocumentId.java')
-rw-r--r-- | vespa-feed-client/src/main/java/ai/vespa/feed/client/DocumentId.java | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/DocumentId.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/DocumentId.java index a0722f1f6dc..5474bcfda01 100644 --- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/DocumentId.java +++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/DocumentId.java @@ -41,20 +41,34 @@ public class DocumentId { } public static DocumentId of(String serialized) { - String[] parts = serialized.split(":"); - while (parts.length >= 5 && parts[0].equals("id")) { - if (parts[3].startsWith("n=")) - return DocumentId.of(parts[1], parts[2], Long.parseLong(parts[3]), parts[4]); - if (parts[3].startsWith("g=")) - return DocumentId.of(parts[1], parts[2], parts[3], parts[4]); - else if (parts[3].isEmpty()) - return DocumentId.of(parts[1], parts[2], parts[4]); - } + DocumentId parsed = parse(serialized); + if (parsed != null) return parsed; throw new IllegalArgumentException("Document ID must be on the form " + - "'id:<namespace>:<document-type>:[n=number|g=group]:<user-specific>', " + + "'id:<namespace>:<document-type>:[n=<number>|g=<group>]:<user-specific>', " + "but was '" + serialized + "'"); } + private static DocumentId parse(String serialized) { + int i, j = -1; + if ((j = serialized.indexOf(':', i = j + 1)) < i) return null; + if ( ! "id".equals(serialized.substring(i, j))) return null; + if ((j = serialized.indexOf(':', i = j + 1)) <= i) return null; + String namespace = serialized.substring(i, j); + if ((j = serialized.indexOf(':', i = j + 1)) <= i) return null; + String documentType = serialized.substring(i, j); + if ((j = serialized.indexOf(':', i = j + 1)) < i) return null; + String group = serialized.substring(i, j); + if (serialized.length() <= (i = j + 1)) return null; + String userSpecific = serialized.substring(i); + if (group.startsWith("n=") && group.length() > 2) + return DocumentId.of(namespace, documentType, Long.parseLong(group.substring(2)), userSpecific); + if (group.startsWith("g=") && group.length() > 2) + return DocumentId.of(namespace, documentType, group.substring(2), userSpecific); + if (group.isEmpty()) + return DocumentId.of(namespace, documentType, userSpecific); + return null; + } + public String documentType() { return documentType; } |