List<Map>에서 DataSet으로 변환 시 dynamic 하게 컬럼 추가할 수 있도록 변경

This commit is contained in:
ParkSeongMin
2015-12-17 17:38:42 +09:00
parent 5ac3e2db2d
commit 70b1bfa85e
2 changed files with 771 additions and 708 deletions

View File

@@ -61,6 +61,14 @@ public class AbstractDataSetConverter extends AbstractListenerHandler {
Object object = NexacroConverterHelper.toObject(value);
int columnIndex = ds.indexOfColumn(columnName);
if(columnIndex < 0) {
// flexible map data. 'null' data should be ignored
ds.setChangeStructureWithData(true);
if(!addColumnByMap(ds, columnName, value)) {
continue;
}
}
// fire event
object = fireDataSetConvertedValue(ds, object, newRow, columnIndex, false, false);
@@ -128,21 +136,8 @@ public class AbstractDataSetConverter extends AbstractListenerHandler {
throw new NexacroConvertException("must be Map<String, Object> if you use List<Map>. target="+ds.getName());
}
String columnName = (String) key;
if(ignoreSpecfiedColumnName(columnName)) {
continue;
}
if(value == null) {
ds.addColumn(columnName, PlatformDataType.UNDEFINED);
continue;
}
// add column
if(!NexacroConverterHelper.isConvertibleType(value.getClass())) {
continue;
}
DataType dataTypeOfValue = NexacroConverterHelper.getDataTypeOfValue(value);
ds.addColumn(columnName, dataTypeOfValue);
boolean isAdded = addColumnByMap(ds, columnName, value);
}
}
@@ -182,6 +177,27 @@ public class AbstractDataSetConverter extends AbstractListenerHandler {
}
protected boolean addColumnByMap(DataSet ds, String columnName, Object value) {
if (ignoreSpecfiedColumnName(columnName)) {
return false;
}
if (value == null) {
ds.addColumn(columnName, PlatformDataType.UNDEFINED);
return false;
}
// add column
if (!NexacroConverterHelper.isConvertibleType(value.getClass())) {
return false;
}
DataType dataTypeOfValue = NexacroConverterHelper.getDataTypeOfValue(value);
ds.addColumn(columnName, dataTypeOfValue);
return true;
}
/**
* <code>DataSet</code>의 컬럼이름들을 반환한다.
* @param ds

View File

@@ -3,6 +3,7 @@ package com.nexacro.spring.data.support;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -126,6 +127,52 @@ public class ListToDataSetConverterTest {
}
@Test
public void testConvertListFlexibleMapToDataSet() {
String addColumnName = "otherColumn";
String addData = "otherColumnData";
List<Map<String, Object>> defaultMap = NexacroTestUtil.createDefaultMaps();
Map<String, Object> otherStructureMap = new HashMap<String, Object>();
otherStructureMap.put(addColumnName, addData);
// add other structure map..
defaultMap.add(otherStructureMap);
ConvertDefinition definition = new ConvertDefinition("ds");
Object ds = null;
try {
ds = converter.convert(defaultMap, definition);
} catch (NexacroConvertException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
if(!(ds instanceof DataSet)) {
Assert.fail("converted object must be implemented DataSet");
}
DataSet convertedDs = (DataSet) ds;
// original column 12, added column 1
int expectedColumnCount = 12 + 1;
int actualColumnCount = convertedDs.getColumnCount();
Assert.assertEquals("other key in the Map column should be added.", expectedColumnCount, actualColumnCount);
ColumnHeader column = convertedDs.getColumn(addColumnName);
Assert.assertNotNull(column);
// original row 2, added row 1
int expectedRowCount = 2 + 1;
int actualRowCount = convertedDs.getRowCount();
Assert.assertEquals(expectedRowCount, actualRowCount);
String addedData = convertedDs.getString(2, addColumnName);
Assert.assertEquals(addData, addedData);
}
@Test
public void testNullData() {