diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-05-01 00:21:28 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-05-01 00:21:28 +0200 |
commit | e2caa3207ec5701554be40bc1447b0f1811baf64 (patch) | |
tree | 0ac5e7367f74fe37e181ab4344779ebaddc00752 /document/src | |
parent | 6c93798b95d6a82102c9b363822a9f5e7483d31a (diff) |
Handle xml feed without the wrapping <vespafeed> tag
Diffstat (limited to 'document/src')
-rw-r--r-- | document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java | 19 | ||||
-rwxr-xr-x | document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java | 65 |
2 files changed, 77 insertions, 7 deletions
diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java b/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java index 7bc0cc871ca..efbfd4a2167 100644 --- a/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java +++ b/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java @@ -28,11 +28,13 @@ import java.util.Optional; */ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader { + private final boolean requireVespaFeedTag; /** * Creates a reader that reads from the given file. */ public VespaXMLFeedReader(String fileName, DocumentTypeManager docTypeManager) throws Exception { super(fileName, docTypeManager); + requireVespaFeedTag = true; readInitial(); } @@ -40,17 +42,18 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader { * Creates a reader that reads from the given stream. */ public VespaXMLFeedReader(InputStream stream, DocumentTypeManager docTypeManager) throws Exception { - super(stream, docTypeManager); - readInitial(); + this(stream, docTypeManager, true); } /** - * Creates a reader that uses the given reader to read - this can be used if the vespa feed - * is part of a larger XML document. + * Creates a reader that reads from the given stream. */ - public VespaXMLFeedReader(XMLStreamReader reader, DocumentTypeManager manager) throws Exception { - super(reader, manager); - readInitial(); + public VespaXMLFeedReader(InputStream stream, DocumentTypeManager docTypeManager, boolean requireVespaFeedTag) throws Exception { + super(stream, docTypeManager); + this.requireVespaFeedTag = requireVespaFeedTag; + if (requireVespaFeedTag) { + readInitial(); + } } /** @@ -131,6 +134,8 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader { throw newDeserializeException("Missing \"documentid\" attribute for remove operation"); } return new RemoveFeedOperation(documentId, TestAndSetCondition.fromConditionString(condition)); + } else if ("vespafeed".equals(startTag)) { + //Ignore it } else { throw newDeserializeException("Element \"" + startTag + "\" not allowed in this context"); } diff --git a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java index e33dbfe8898..167b3d385c5 100755 --- a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java +++ b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java @@ -821,6 +821,71 @@ public class VespaXMLReaderTestCase { assertEquals("Worker", child.getFieldValue("content").toString()); } + private void verifyTitle(String input, boolean requireFeedTag) throws Exception { + DocumentTypeManager dtm = new DocumentTypeManager(); + + DocumentType type = new DocumentType("foo"); + type.addField(new Field("title", DataType.STRING)); + + dtm.registerDocumentType(type); + + VespaXMLFeedReader parser = new VespaXMLFeedReader(new ByteArrayInputStream(Utf8.toBytes(input)), dtm, requireFeedTag); + List<FeedOperation> ops = parser.readAll(); + + assertEquals(1, ops.size()); + FeedOperation op = ops.get(0); + assertEquals(FeedOperation.Type.DOCUMENT, op.getType()); + assertEquals(1, op.getDocument().getFieldCount()); + assertEquals("xyz", op.getDocument().getFieldValue("title").toString()); + } + + @Test + public void testWithEncodingAndVespaFeedWrapping() throws Exception { + verifyTitle("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + + "<vespafeed>\n" + + " <document documenttype=\"foo\" documentid=\"doc:foo:bar:baz\"> \n" + + " <title>xyz</title>\n" + + " </document>\n" + + "</vespafeed>\n", + true); + verifyTitle("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + + "<vespafeed>\n" + + " <document documenttype=\"foo\" documentid=\"doc:foo:bar:baz\"> \n" + + " <title>xyz</title>\n" + + " </document>\n" + + "</vespafeed>\n", + false); + + verifyTitle("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + + " <document documenttype=\"foo\" documentid=\"doc:foo:bar:baz\"> \n" + + " <title>xyz</title>\n" + + " </document>\n", + false); + + verifyTitle("<document documenttype=\"foo\" documentid=\"doc:foo:bar:baz\"> \n" + + " <title>xyz</title>\n" + + "</document>\n", + false); + } + + @Test(expected = DeserializationException.class) + public void testThatMissingFeedTagThrows() throws Exception { + verifyTitle("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + + " <document documenttype=\"foo\" documentid=\"doc:foo:bar:baz\"> \n" + + " <title>xyz</title>\n" + + " </document>\n", + true); + } + @Test + public void testThatMissingXmlHeaderWorks() throws Exception { + verifyTitle("<vespafeed>\n" + + " <document documenttype=\"foo\" documentid=\"doc:foo:bar:baz\"> \n" + + " <title>xyz</title>\n" + + " </document>\n" + + "</vespafeed>\n", + true); + } + @Test(expected = DeserializationException.class) public void testBinaryEncodingStrings() throws Exception { DocumentTypeManager dtm = new DocumentTypeManager(); |