Skip to content

Commit

Permalink
0002314: dbimport of xml (XmlDataReader) does not handle xsi:nil corr…
Browse files Browse the repository at this point in the history
…ectly
  • Loading branch information
chenson42 committed Jul 31, 2015
1 parent 529255b commit dda63d9
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 8 deletions.
Expand Up @@ -81,7 +81,6 @@ public void open(DataContext context) {

protected void readNext() {
try {
boolean nullValue = false;
Map<String, String> rowData = new LinkedHashMap<String, String>();
String columnName = null;
CsvData data = null;
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -178,13 +178,13 @@ protected void readNext() {
next.add(table);
}
next.add(data);
rowData = new HashMap<String, String>();
} else if ("table_data".equalsIgnoreCase(name)) {
if (batch != null) {
batch.setComplete(true);
}
} else if ("field".equalsIgnoreCase(name)) {
columnName = null;
nullValue = false;
}

break;
Expand Down
@@ -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<CsvData> datas = new ArrayList<CsvData>();

Table lastTableRead;

public List<CsvData> getDatas() {
return datas;
}

public Table getLastTableRead() {
return lastTableRead;
}

@Override
public void open(DataContext context) {
}

@Override
public void close() {
}

@Override
public Map<Batch, Statistics> 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) {
}

}
@@ -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<CsvData> dataRead = writer.getDatas();
assertEquals(4, dataRead.size());
Map<String, String> data1 = dataRead.get(1).toColumnNameValuePairs(writer.getLastTableRead().getColumnNames(), CsvData.ROW_DATA);
assertEquals("1", data1.get("id"));
assertEquals("A", data1.get("my_value"));

Map<String, String> data2 = dataRead.get(2).toColumnNameValuePairs(writer.getLastTableRead().getColumnNames(), CsvData.ROW_DATA);
assertEquals("2", data2.get("id"));
assertEquals(null, data2.get("my_value"));

}
}
@@ -0,0 +1,20 @@
<database>
<table name="my_table">
<column name="id" primaryKey="true" required="true" type="INTEGER" size="10" />
<column name="my_value" type="VARCHAR" size="50" />
</table>
<table_data name="my_table">
<row>
<field name="id">1</field>
<field name="my_value">A</field>
</row>
<row>
<field name="id">2</field>
<field name="my_value" xsi:nil="true" />
</row>
<row>
<field name="id">3</field>
<field name="my_value">C</field>
</row>
</table_data>
</database>

0 comments on commit dda63d9

Please sign in to comment.