diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java index edf0eebd6333aaee4eb0d1cb15aeb7aa2d8b916c..66dcd02922d15fd98cbe92325625e4a7d311bc1e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java @@ -128,12 +128,8 @@ public class GridExpressionUtils String columnId = customColumn.getCode(); RowCalculator<T> calculator = calculators.get(columnId); PrimitiveValue value = evalCustomColumn(rowData, customColumn, calculator); - // don't modify type if it is a null string - if (value.toString() != null) - { - customColumn.setDataType(DataTypeUtils.getCompatibleDataType(customColumn - .getDataType(), value.getDataType())); - } + customColumn.setDataType(DataTypeUtils.getCompatibleDataType(customColumn + .getDataType(), value.getDataType())); customColumnValues.put(columnId, value); } result.add(new GridRowModel<T>(rowData, customColumnValues)); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java index e15abd5d91011caa92aa45a8f4d6cf5d4f3cf4dc..663edb922f7c501ff8211cf06cff552708c6a1c3 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java @@ -31,17 +31,18 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell; /** * Utility functions around data types. - * + * * @author Franz-Josef Elmer */ public class DataTypeUtils { private static final Map<DataTypeCode, Converter> map = new HashMap<DataTypeCode, Converter>(); - + private enum Converter implements IsSerializable { - - INTEGER(DataTypeCode.INTEGER){ + + INTEGER(DataTypeCode.INTEGER) + { @Override public ISerializableComparable doConvertion(String value) { @@ -56,7 +57,8 @@ public class DataTypeUtils return new IntegerTableCell(number); } }, - DOUBLE(DataTypeCode.REAL){ + DOUBLE(DataTypeCode.REAL) + { @Override public ISerializableComparable doConvertion(String value) { @@ -71,7 +73,8 @@ public class DataTypeUtils return new DoubleTableCell(number); } }, - DATE(DataTypeCode.TIMESTAMP){ + DATE(DataTypeCode.TIMESTAMP) + { @Override public ISerializableComparable doConvertion(String value) { @@ -88,9 +91,9 @@ public class DataTypeUtils } }, ; - + private static final StringTableCell EMPTY_CELL = new StringTableCell(""); - + private Converter(DataTypeCode... codes) { for (DataTypeCode dataTypeCode : codes) @@ -98,41 +101,46 @@ public class DataTypeUtils map.put(dataTypeCode, this); } } - + public static Converter resolve(DataTypeCode dataTypeCode) { return map.get(dataTypeCode); } - + public ISerializableComparable convert(String value) { if (StringUtils.isBlank(value)) { - return EMPTY_CELL ; + return EMPTY_CELL; } return doConvertion(value); } + public abstract ISerializableComparable doConvertion(String value); } - + /** - * Converts the specified string value into a data value in accordance with specified - * data type. + * Converts the specified string value into a data value in accordance with specified data type. */ public static ISerializableComparable convertTo(DataTypeCode dataTypeCode, String value) { return Converter.resolve(dataTypeCode).convert(value); } - + /** * Returns a data type which is compatible with the previous data type and the new data type. */ - public static DataTypeCode getCompatibleDataType(DataTypeCode previousDataTypeOrNull, DataTypeCode dataType) + public static DataTypeCode getCompatibleDataType(DataTypeCode previousDataTypeOrNull, + DataTypeCode dataType) { if (previousDataTypeOrNull == null) { return dataType; - } + } + if (dataType == null) + { + return previousDataTypeOrNull; + } if (previousDataTypeOrNull == DataTypeCode.REAL) { if (dataType == DataTypeCode.REAL || dataType == DataTypeCode.INTEGER) @@ -152,15 +160,14 @@ public class DataTypeUtils return DataTypeCode.INTEGER; } return DataTypeCode.VARCHAR; - } - if (previousDataTypeOrNull == DataTypeCode.TIMESTAMP - && dataType == DataTypeCode.TIMESTAMP) + } + if (previousDataTypeOrNull == DataTypeCode.TIMESTAMP && dataType == DataTypeCode.TIMESTAMP) { return DataTypeCode.TIMESTAMP; } return DataTypeCode.VARCHAR; } - + private DataTypeUtils() { } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtilsTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtilsTest.java index 09dfc2ae66be22b95ef437d7d5cd36fb23c2d675..e9aba90dcd15783f43b0eef6035ca8597d7c75ba 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtilsTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtilsTest.java @@ -26,8 +26,6 @@ import org.testng.AssertJUnit; import org.testng.annotations.Test; /** - * - * * @author Franz-Josef Elmer */ public class DataTypeUtilsTest extends AssertJUnit @@ -35,29 +33,35 @@ public class DataTypeUtilsTest extends AssertJUnit @Test public void testGetCompatibleDataType() { + assertEquals(null, DataTypeUtils.getCompatibleDataType(null, null)); assertEquals(REAL, DataTypeUtils.getCompatibleDataType(null, REAL)); + assertEquals(REAL, DataTypeUtils.getCompatibleDataType(REAL, null)); assertEquals(REAL, DataTypeUtils.getCompatibleDataType(REAL, INTEGER)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(REAL, BOOLEAN)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(REAL, TIMESTAMP)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(REAL, VARCHAR)); assertEquals(INTEGER, DataTypeUtils.getCompatibleDataType(null, INTEGER)); + assertEquals(INTEGER, DataTypeUtils.getCompatibleDataType(INTEGER, null)); assertEquals(INTEGER, DataTypeUtils.getCompatibleDataType(INTEGER, INTEGER)); assertEquals(REAL, DataTypeUtils.getCompatibleDataType(INTEGER, REAL)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(INTEGER, BOOLEAN)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(INTEGER, TIMESTAMP)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(INTEGER, VARCHAR)); assertEquals(BOOLEAN, DataTypeUtils.getCompatibleDataType(null, BOOLEAN)); + assertEquals(BOOLEAN, DataTypeUtils.getCompatibleDataType(BOOLEAN, null)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(BOOLEAN, REAL)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(BOOLEAN, INTEGER)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(BOOLEAN, TIMESTAMP)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(BOOLEAN, VARCHAR)); assertEquals(TIMESTAMP, DataTypeUtils.getCompatibleDataType(null, TIMESTAMP)); + assertEquals(TIMESTAMP, DataTypeUtils.getCompatibleDataType(TIMESTAMP, null)); assertEquals(TIMESTAMP, DataTypeUtils.getCompatibleDataType(TIMESTAMP, TIMESTAMP)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(TIMESTAMP, REAL)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(TIMESTAMP, INTEGER)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(TIMESTAMP, BOOLEAN)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(TIMESTAMP, VARCHAR)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(null, VARCHAR)); + assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(VARCHAR, null)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(VARCHAR, REAL)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(VARCHAR, INTEGER)); assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(VARCHAR, BOOLEAN));