private T getCellValue()

in extensions/core/excel/applib/src/main/java/org/apache/causeway/extensions/excel/applib/service/_CellMarshaller.java [329:482]


    private <T> T getCellValue(final Cell cell, final Class<T> requiredType) {
        final CellType cellType = cell.getCellType();

        if(requiredType == boolean.class || requiredType == Boolean.class) {
            if(cellType == CellType.BOOLEAN) {
                boolean booleanCellValue = cell.getBooleanCellValue();
                return (T) Boolean.valueOf(booleanCellValue);
            } else {
                return null;
            }
        }

        // enum
        if(Enum.class.isAssignableFrom(requiredType)) {
            String stringCellValue = cell.getStringCellValue();
            @SuppressWarnings("rawtypes")
            Class rawType = requiredType;
            return (T) Enum.valueOf(rawType, stringCellValue);
        }

        // date
        if(requiredType == java.util.Date.class) {
            java.util.Date dateCellValue = cell.getDateCellValue();
            return (T) dateCellValue;
        }

//        if(requiredType == org.apache.causeway.applib.value.Date.class) {
//            java.util.Date dateCellValue = cell.getDateCellValue();
//            return (T)new org.apache.causeway.applib.value.Date(dateCellValue);
//        }

//        if(requiredType == org.apache.causeway.applib.value.DateTime.class) {
//            java.util.Date dateCellValue = cell.getDateCellValue();
//            return (T)new org.apache.causeway.applib.value.DateTime(dateCellValue);
//        }

        if(requiredType == LocalDate.class) {
            java.util.Date dateCellValue = cell.getDateCellValue();
            return (T) new LocalDate(dateCellValue.getTime());
        }

        if(requiredType == LocalDateTime.class) {
            java.util.Date dateCellValue = cell.getDateCellValue();
            return (T) new LocalDateTime(dateCellValue.getTime());
        }

        if(requiredType == DateTime.class) {
            java.util.Date dateCellValue = cell.getDateCellValue();
            return (T) new DateTime(dateCellValue.getTime());
        }

        // number
        if(requiredType == double.class || requiredType == Double.class) {
            if(cellType == CellType.NUMERIC) {
                double doubleValue = cell.getNumericCellValue();
                return (T) Double.valueOf(doubleValue);
            } else {
                return null;
            }
        }

        if(requiredType == float.class || requiredType == Float.class) {
            if(cellType == CellType.NUMERIC) {
                float floatValue = (float)cell.getNumericCellValue();
                return (T) Float.valueOf(floatValue);
            } else {
                return null;
            }
        }

        if(requiredType == BigDecimal.class) {
            if(cellType == CellType.NUMERIC) {
                double doubleValue = cell.getNumericCellValue();
                return (T) BigDecimal.valueOf(doubleValue);
            } else {
                return null;
            }
        }

        if(requiredType == BigInteger.class) {
            if(cellType == CellType.NUMERIC) {
                long longValue = (long)cell.getNumericCellValue();
                return (T) BigInteger.valueOf(longValue);
            } else {
                return null;
            }
        }

        if(requiredType == long.class || requiredType == Long.class) {
            if(cellType == CellType.NUMERIC) {
                long longValue = (long) cell.getNumericCellValue();
                return (T) Long.valueOf(longValue);
            } else {
                return null;
            }
        }

        if(requiredType == int.class || requiredType == Integer.class) {
            if(cellType == CellType.NUMERIC) {
                int intValue = (int) cell.getNumericCellValue();
                return (T) Integer.valueOf(intValue);
            } else {
                return null;
            }
        }

        if(requiredType == short.class || requiredType == Short.class) {
            if(cellType == CellType.NUMERIC) {
                short shortValue = (short) cell.getNumericCellValue();
                return (T) Short.valueOf(shortValue);
            } else {
                return null;
            }
        }

        if(requiredType == byte.class || requiredType == Byte.class) {
            if(cellType == CellType.NUMERIC) {
                byte byteValue = (byte) cell.getNumericCellValue();
                return (T) Byte.valueOf(byteValue);
            } else {
                return null;
            }
        }

        if(requiredType == String.class) {
            if(cellType == CellType.STRING) {
                return (T) cell.getStringCellValue();
            } else if(cellType == CellType.NUMERIC) {
            	/*
            	 * In some cases, when editing a string type cell in excel and
            	 * when the cell content is just a number excel will silently
            	 * convert the cell type to numeric. To remedy unexpected
            	 * behavior we check whether we can recover numeric cells as
            	 * text, accounting for the fact that an integer number is
            	 * also stored with a floating point in excel, whereby
            	 * a textual representation as such may be undesired.
            	 *
            	 * @ see https://stackoverflow.com/questions/9898512/how-to-test-if-a-double-is-an-integer
            	 * @see https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#floor-double-
            	 * - If the argument value is already equal to a mathematical integer, then the result is the same as the argument.
            	 * - If the argument is NaN or an infinity or positive zero or negative zero, then the result is the same as the argument.
            	 */
            	double val = cell.getNumericCellValue();
        		if((val == Math.floor(val)) && !Double.isInfinite(val)) {
        			return (T) Integer.toString((int) val);
        		}
        		return (T) Double.toString(val);
            } else {
            	return null;
            }
        }

        return null;
    }