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 | |
parent | 6c93798b95d6a82102c9b363822a9f5e7483d31a (diff) |
Handle xml feed without the wrapping <vespafeed> tag
5 files changed, 80 insertions, 10 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(); diff --git a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java index 32e883f171a..126c4a8fd65 100644 --- a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java +++ b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java @@ -364,7 +364,7 @@ public class SimpleFeeder implements ReplyHandler { } else if ((b[0] == 'V') && (b[1] == '1')) { return new VespaV1FeedReader(in, docTypeMgr); } else { - return new VespaXMLFeedReader(in, docTypeMgr); + return new VespaXMLFeedReader(in, docTypeMgr, false); } } diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedReaderFactory.java b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedReaderFactory.java index 6a3229e86b7..e30ac3919bb 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedReaderFactory.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedReaderFactory.java @@ -29,7 +29,7 @@ public class FeedReaderFactory { switch (dataFormat) { case XML_UTF8: try { - return new VespaXMLFeedReader(inputStream, docTypeManager); + return new VespaXMLFeedReader(inputStream, docTypeManager, true); } catch (Exception e) { throw new RuntimeException("Could not create VespaXMLFeedReader", e); } diff --git a/vespaclient-core/src/main/java/com/yahoo/feedapi/XMLFeeder.java b/vespaclient-core/src/main/java/com/yahoo/feedapi/XMLFeeder.java index 85b714b3b42..c5bd8643687 100755 --- a/vespaclient-core/src/main/java/com/yahoo/feedapi/XMLFeeder.java +++ b/vespaclient-core/src/main/java/com/yahoo/feedapi/XMLFeeder.java @@ -21,6 +21,6 @@ public class XMLFeeder extends Feeder { @Override protected FeedReader createReader() throws Exception { - return new VespaXMLFeedReader(stream, docMan); + return new VespaXMLFeedReader(stream, docMan, false); } } |