summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-05-01 00:21:28 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-05-01 00:21:28 +0200
commite2caa3207ec5701554be40bc1447b0f1811baf64 (patch)
tree0ac5e7367f74fe37e181ab4344779ebaddc00752
parent6c93798b95d6a82102c9b363822a9f5e7483d31a (diff)
Handle xml feed without the wrapping <vespafeed> tag
-rw-r--r--document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java19
-rwxr-xr-xdocument/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java65
-rw-r--r--vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java2
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedReaderFactory.java2
-rwxr-xr-xvespaclient-core/src/main/java/com/yahoo/feedapi/XMLFeeder.java2
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);
}
}