From dda63d95113c76500ecb63bd0c7329a21028b9a1 Mon Sep 17 00:00:00 2001 From: chenson42 Date: Sat, 13 Jun 2015 19:51:36 +0000 Subject: [PATCH] 0002314: dbimport of xml (XmlDataReader) does not handle xsi:nil correctly --- .../io/data/reader/XmlDataReader.java | 16 ++--- .../io/data/reader/TestableDataWriter.java | 64 +++++++++++++++++++ .../io/data/reader/XmlDataReaderTest.java | 31 +++++++++ .../io/data/reader/xmldatareadertest1.xml | 20 ++++++ 4 files changed, 123 insertions(+), 8 deletions(-) create mode 100644 symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/TestableDataWriter.java create mode 100644 symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/XmlDataReaderTest.java create mode 100644 symmetric-io/src/test/resources/org/jumpmind/symmetric/io/data/reader/xmldatareadertest1.xml diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/XmlDataReader.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/XmlDataReader.java index 259c66a7a3..6e268b2b21 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/XmlDataReader.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/reader/XmlDataReader.java @@ -81,7 +81,6 @@ public void open(DataContext context) { protected void readNext() { try { - boolean nullValue = false; Map rowData = new LinkedHashMap(); String columnName = null; CsvData data = null; @@ -93,12 +92,7 @@ protected void readNext() { switch (eventType) { case XmlPullParser.TEXT: if (columnName != null) { - if (!nullValue) { - rowData.put(columnName, parser.getText()); - } else { - rowData.put(columnName, null); - } - nullValue = false; + rowData.put(columnName, parser.getText()); columnName = null; } break; @@ -113,6 +107,7 @@ protected void readNext() { } data.setDataEventType(DataEventType.INSERT); } else if ("field".equalsIgnoreCase(name)) { + boolean nullValue = false; for (int i = 0; i < parser.getAttributeCount(); i++) { String attributeName = parser.getAttributeName(i); String attributeValue = parser.getAttributeValue(i); @@ -122,6 +117,11 @@ protected void readNext() { nullValue = true; } } + + if (nullValue) { + rowData.put(columnName, null); + columnName = null; + } } else if ("table_data".equalsIgnoreCase(name)) { Batch batch = new Batch(); batch.setBinaryEncoding(BinaryEncoding.BASE64); @@ -178,13 +178,13 @@ protected void readNext() { next.add(table); } next.add(data); + rowData = new HashMap(); } else if ("table_data".equalsIgnoreCase(name)) { if (batch != null) { batch.setComplete(true); } } else if ("field".equalsIgnoreCase(name)) { columnName = null; - nullValue = false; } break; diff --git a/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/TestableDataWriter.java b/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/TestableDataWriter.java new file mode 100644 index 0000000000..778cbfd44c --- /dev/null +++ b/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/TestableDataWriter.java @@ -0,0 +1,64 @@ +package org.jumpmind.symmetric.io.data.reader; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.jumpmind.db.model.Table; +import org.jumpmind.symmetric.io.data.Batch; +import org.jumpmind.symmetric.io.data.CsvData; +import org.jumpmind.symmetric.io.data.DataContext; +import org.jumpmind.symmetric.io.data.IDataWriter; +import org.jumpmind.util.Statistics; + +public class TestableDataWriter implements IDataWriter { + + List datas = new ArrayList(); + + Table lastTableRead; + + public List getDatas() { + return datas; + } + + public Table getLastTableRead() { + return lastTableRead; + } + + @Override + public void open(DataContext context) { + } + + @Override + public void close() { + } + + @Override + public Map getStatistics() { + return null; + } + + @Override + public void start(Batch batch) { + } + + @Override + public boolean start(Table table) { + lastTableRead = table; + return true; + } + + @Override + public void write(CsvData data) { + datas.add(data); + } + + @Override + public void end(Table table) { + } + + @Override + public void end(Batch batch, boolean inError) { + } + +} diff --git a/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/XmlDataReaderTest.java b/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/XmlDataReaderTest.java new file mode 100644 index 0000000000..7385e7c763 --- /dev/null +++ b/symmetric-io/src/test/java/org/jumpmind/symmetric/io/data/reader/XmlDataReaderTest.java @@ -0,0 +1,31 @@ +package org.jumpmind.symmetric.io.data.reader; + +import static org.junit.Assert.assertEquals; + +import java.util.List; +import java.util.Map; + +import org.jumpmind.symmetric.io.data.CsvData; +import org.jumpmind.symmetric.io.data.DataProcessor; +import org.junit.Test; + +public class XmlDataReaderTest { + + @Test + public void testNilDataElement() { + XmlDataReader reader = new XmlDataReader(getClass().getResourceAsStream("xmldatareadertest1.xml")); + TestableDataWriter writer = new TestableDataWriter(); + DataProcessor processor = new DataProcessor(reader, writer, "test"); + processor.process(); + List dataRead = writer.getDatas(); + assertEquals(4, dataRead.size()); + Map data1 = dataRead.get(1).toColumnNameValuePairs(writer.getLastTableRead().getColumnNames(), CsvData.ROW_DATA); + assertEquals("1", data1.get("id")); + assertEquals("A", data1.get("my_value")); + + Map data2 = dataRead.get(2).toColumnNameValuePairs(writer.getLastTableRead().getColumnNames(), CsvData.ROW_DATA); + assertEquals("2", data2.get("id")); + assertEquals(null, data2.get("my_value")); + + } +} diff --git a/symmetric-io/src/test/resources/org/jumpmind/symmetric/io/data/reader/xmldatareadertest1.xml b/symmetric-io/src/test/resources/org/jumpmind/symmetric/io/data/reader/xmldatareadertest1.xml new file mode 100644 index 0000000000..63a42de8d5 --- /dev/null +++ b/symmetric-io/src/test/resources/org/jumpmind/symmetric/io/data/reader/xmldatareadertest1.xml @@ -0,0 +1,20 @@ + + + + +
+ + + 1 + A + + + 2 + + + + 3 + C + + +
\ No newline at end of file