List<Map>에서 DataSet으로 변환 시 dynamic 하게 컬럼 추가할 수 있도록 변경
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user