diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index efe011e027d..e0c881fbdfb 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -543,6 +543,8 @@ Bug Fixes * SOLR-2057: DataImportHandler never calls UpdateRequestProcessor.finish() (Drew Farris via koji) + +* SOLR-1973: Empty fields in XML update messages confuse DataImportHandler. (koji) Other Changes ---------------------- diff --git a/solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/XPathRecordReader.java b/solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/XPathRecordReader.java index 0f1ea4d6b3f..0875945b8c3 100644 --- a/solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/XPathRecordReader.java +++ b/solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/XPathRecordReader.java @@ -277,7 +277,7 @@ public class XPathRecordReader { if (event == END_ELEMENT) { if (flattenedStarts > 0) flattenedStarts--; else { - if (text.length() > 0 && valuesAddedinThisFrame != null) { + if (hasText && valuesAddedinThisFrame != null) { valuesAddedinThisFrame.add(fieldName); putText(values, text.toString(), fieldName, multiValued); } diff --git a/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestXPathRecordReader.java b/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestXPathRecordReader.java index a06ac345ba8..dad5510610c 100644 --- a/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestXPathRecordReader.java +++ b/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestXPathRecordReader.java @@ -194,6 +194,29 @@ public class TestXPathRecordReader extends AbstractDataImportHandlerTestCase { assertNull(((List) l.get(1).get("b")).get(0)); } + @Test + public void testElems2LevelEmpty() { + String xml="\n" + + "\t\n" + + "\t \n\t x0\n" + + "\t y0\n" + + "\t \n" + + "\t \n\t \n" // empty + + "\t y1\n" + + "\t \n" + + "\t\n" + + ""; + XPathRecordReader rr = new XPathRecordReader("/root/a"); + rr.addField("a", "/root/a/b/x", true); + rr.addField("b", "/root/a/b/y", true); + List> l = rr.getAllRecords(new StringReader(xml)); + assertEquals(1, l.size()); + assertEquals("x0",((List) l.get(0).get("a")).get(0)); + assertEquals("y0",((List) l.get(0).get("b")).get(0)); + assertEquals("",((List) l.get(0).get("a")).get(1)); + assertEquals("y1",((List) l.get(0).get("b")).get(1)); + } + @Test public void testMixedContent() { String xml = "This text is \n" + @@ -236,12 +259,16 @@ public class TestXPathRecordReader extends AbstractDataImportHandlerTestCase { public void testElems2LevelWithAttrib() { String xml = "\n\t\n\t \n" + "\t x0\n" - + "\t y0\n" + + "\t \n" // empty + "\t \n" + "\t \n" - + "\t x1\n" + + "\t \n" // empty + "\t y1\n" + "\t \n" + + "\t \n" + + "\t x2\n" + + "\t y2\n" + + "\t \n" + "\t \n" + "\t \n\t \n" + "\t x3\n" @@ -256,8 +283,14 @@ public class TestXPathRecordReader extends AbstractDataImportHandlerTestCase { rr.addField("y", "/root/a/b[@k]/y", true); List> l = rr.getAllRecords(new StringReader(xml)); assertEquals(2, l.size()); - assertEquals(2, ((List) l.get(0).get("x")).size()); - assertEquals(2, ((List) l.get(0).get("y")).size()); + assertEquals(3, ((List) l.get(0).get("x")).size()); + assertEquals(3, ((List) l.get(0).get("y")).size()); + assertEquals("x0", ((List) l.get(0).get("x")).get(0)); + assertEquals("", ((List) l.get(0).get("y")).get(0)); + assertEquals("", ((List) l.get(0).get("x")).get(1)); + assertEquals("y1", ((List) l.get(0).get("y")).get(1)); + assertEquals("x2", ((List) l.get(0).get("x")).get(2)); + assertEquals("y2", ((List) l.get(0).get("y")).get(2)); assertEquals(0, l.get(1).size()); }