diff --git a/src/main/java/com/cedarsoftware/util/convert/AtomicBooleanConversion.java b/src/main/java/com/cedarsoftware/util/convert/AtomicBooleanConversion.java index a823bab1b..bffd761c3 100644 --- a/src/main/java/com/cedarsoftware/util/convert/AtomicBooleanConversion.java +++ b/src/main/java/com/cedarsoftware/util/convert/AtomicBooleanConversion.java @@ -27,6 +27,21 @@ public static Long toLong(Object from, Converter converter, ConverterOptions opt return b.get() ? CommonValues.LONG_ONE : CommonValues.LONG_ZERO; } + public static Float toFloat(Object from, Converter converter, ConverterOptions options) { + AtomicBoolean b = (AtomicBoolean) from; + return b.get() ? CommonValues.FLOAT_ONE : CommonValues.FLOAT_ZERO; + } + + public static Double toDouble(Object from, Converter converter, ConverterOptions options) { + AtomicBoolean b = (AtomicBoolean) from; + return b.get() ? CommonValues.DOUBLE_ONE : CommonValues.DOUBLE_ZERO; + } + + public static boolean toBoolean(Object from, Converter converter, ConverterOptions options) { + AtomicBoolean b = (AtomicBoolean) from; + return b.get(); + } + public static AtomicInteger toAtomicInteger(Object from, Converter converter, ConverterOptions options) { AtomicBoolean b = (AtomicBoolean) from; return b.get() ? new AtomicInteger(1) : new AtomicInteger (0); diff --git a/src/main/java/com/cedarsoftware/util/convert/BooleanConversion.java b/src/main/java/com/cedarsoftware/util/convert/BooleanConversion.java index e119c069b..372503b18 100644 --- a/src/main/java/com/cedarsoftware/util/convert/BooleanConversion.java +++ b/src/main/java/com/cedarsoftware/util/convert/BooleanConversion.java @@ -25,22 +25,27 @@ public class BooleanConversion { public static Byte toByte(Object from, Converter converter, ConverterOptions options) { Boolean b = (Boolean) from; - return b.booleanValue() ? CommonValues.BYTE_ONE : CommonValues.BYTE_ZERO; + return b ? CommonValues.BYTE_ONE : CommonValues.BYTE_ZERO; } public static Short toShort(Object from, Converter converter, ConverterOptions options) { Boolean b = (Boolean) from; - return b.booleanValue() ? CommonValues.SHORT_ONE : CommonValues.SHORT_ZERO; + return b ? CommonValues.SHORT_ONE : CommonValues.SHORT_ZERO; } public static Integer toInteger(Object from, Converter converter, ConverterOptions options) { Boolean b = (Boolean) from; - return b.booleanValue() ? CommonValues.INTEGER_ONE : CommonValues.INTEGER_ZERO; + return b ? CommonValues.INTEGER_ONE : CommonValues.INTEGER_ZERO; } public static AtomicLong toAtomicLong(Object from, Converter converter, ConverterOptions options) { Boolean b = (Boolean) from; - return new AtomicLong(b.booleanValue() ? 1 : 0); + return new AtomicLong(b ? 1 : 0); + } + + public static AtomicBoolean toAtomicBoolean(Object from, Converter converter, ConverterOptions options) { + Boolean b = (Boolean) from; + return new AtomicBoolean(b); } public static Long toLong(Object from, Converter converter, ConverterOptions options) { @@ -55,46 +60,16 @@ public static BigDecimal toBigDecimal(Object from, Converter converter, Converte public static Float toFloat(Object from, Converter converter, ConverterOptions options) { Boolean b = (Boolean) from; - return b.booleanValue() ? CommonValues.FLOAT_ONE : CommonValues.FLOAT_ZERO; + return b ? CommonValues.FLOAT_ONE : CommonValues.FLOAT_ZERO; } public static Double toDouble(Object from, Converter converter, ConverterOptions options) { Boolean b = (Boolean) from; - return b.booleanValue() ? CommonValues.DOUBLE_ONE : CommonValues.DOUBLE_ZERO; - } - - public static Float atomicToFloat(Object from, Converter converter, ConverterOptions options) { - AtomicBoolean b = (AtomicBoolean) from; - return b.get() ? CommonValues.FLOAT_ONE : CommonValues.FLOAT_ZERO; - } - - public static Double atomicToDouble(Object from, Converter converter, ConverterOptions options) { - AtomicBoolean b = (AtomicBoolean) from; - return b.get() ? CommonValues.DOUBLE_ONE : CommonValues.DOUBLE_ZERO; - } - - public static Byte atomicToByte(Object from, Converter converter, ConverterOptions options) { - AtomicBoolean b = (AtomicBoolean) from; - return b.get() ? CommonValues.BYTE_ONE : CommonValues.BYTE_ZERO; - } - - public static Short atomicToShort(Object from, Converter converter, ConverterOptions options) { - AtomicBoolean b = (AtomicBoolean) from; - return b.get() ? CommonValues.SHORT_ONE : CommonValues.SHORT_ZERO; - } - - public static Integer atomicToInteger(Object from, Converter converter, ConverterOptions options) { - AtomicBoolean b = (AtomicBoolean) from; - return b.get() ? CommonValues.INTEGER_ONE : CommonValues.INTEGER_ZERO; - } - - public static Long atomicToLong(Object from, Converter converter, ConverterOptions options) { - AtomicBoolean b = (AtomicBoolean) from; - return b.get() ? CommonValues.LONG_ONE : CommonValues.LONG_ZERO; + return b ? CommonValues.DOUBLE_ONE : CommonValues.DOUBLE_ZERO; } - public static Long atomicToCharacter(Object from, Converter converter, ConverterOptions options) { - AtomicBoolean b = (AtomicBoolean) from; - return b.get() ? CommonValues.LONG_ONE : CommonValues.LONG_ZERO; + public static char toCharacter(Object from, Converter converter, ConverterOptions options) { + Boolean b = (Boolean) from; + return b ? CommonValues.CHARACTER_ONE : CommonValues.CHARACTER_ZERO; } } diff --git a/src/main/java/com/cedarsoftware/util/convert/CharacterConversion.java b/src/main/java/com/cedarsoftware/util/convert/CharacterConversion.java new file mode 100644 index 000000000..11c0501c6 --- /dev/null +++ b/src/main/java/com/cedarsoftware/util/convert/CharacterConversion.java @@ -0,0 +1,18 @@ +package com.cedarsoftware.util.convert; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class CharacterConversion { + public static boolean toBoolean(Object from, Converter converter, ConverterOptions options) { + Character c = (Character) from; + return c != CommonValues.CHARACTER_ZERO; + } + + public static double toDouble(Object from, Converter converter, ConverterOptions options) { + return (char) from; + } + + public static float toFloat(Object from, Converter converter, ConverterOptions options) { + return (char) from; + } +} diff --git a/src/main/java/com/cedarsoftware/util/convert/CommonValues.java b/src/main/java/com/cedarsoftware/util/convert/CommonValues.java index 398647c83..3b2370f20 100644 --- a/src/main/java/com/cedarsoftware/util/convert/CommonValues.java +++ b/src/main/java/com/cedarsoftware/util/convert/CommonValues.java @@ -31,7 +31,7 @@ public class CommonValues { public static final Double DOUBLE_ZERO = 0.0d; public static final Double DOUBLE_ONE = 1.0d; - public static final Character CHARACTER_ZERO = '0'; + public static final Character CHARACTER_ZERO = (char)0; - public static final Character CHARACTER_ONE = '1'; + public static final Character CHARACTER_ONE = (char)1; } diff --git a/src/main/java/com/cedarsoftware/util/convert/Converter.java b/src/main/java/com/cedarsoftware/util/convert/Converter.java index 5465b257c..0a1244110 100644 --- a/src/main/java/com/cedarsoftware/util/convert/Converter.java +++ b/src/main/java/com/cedarsoftware/util/convert/Converter.java @@ -126,7 +126,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(BigDecimal.class, Byte.class), NumberConversion::toByte); DEFAULT_FACTORY.put(pair(Number.class, Byte.class), NumberConversion::toByte); DEFAULT_FACTORY.put(pair(Map.class, Byte.class), MapConversion::toByte); - DEFAULT_FACTORY.put(pair(String.class, Byte.class), StringConversion::stringToByte); + DEFAULT_FACTORY.put(pair(String.class, Byte.class), StringConversion::toByte); // Short/short conversions supported DEFAULT_FACTORY.put(pair(Void.class, short.class), NumberConversion::toShortZero); @@ -147,7 +147,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(LocalDate.class, Short.class), (fromInstance, converter, options) -> ((LocalDate) fromInstance).toEpochDay()); DEFAULT_FACTORY.put(pair(Number.class, Short.class), NumberConversion::toShort); DEFAULT_FACTORY.put(pair(Map.class, Short.class), (fromInstance, converter, options) -> converter.fromValueMap((Map) fromInstance, short.class, null, options)); - DEFAULT_FACTORY.put(pair(String.class, Short.class), StringConversion::stringToShort); + DEFAULT_FACTORY.put(pair(String.class, Short.class), StringConversion::toShort); // Integer/int conversions supported DEFAULT_FACTORY.put(pair(Void.class, int.class), NumberConversion::toIntZero); @@ -168,7 +168,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(LocalDate.class, Integer.class), (fromInstance, converter, options) -> (int) ((LocalDate) fromInstance).toEpochDay()); DEFAULT_FACTORY.put(pair(Number.class, Integer.class), NumberConversion::toInt); DEFAULT_FACTORY.put(pair(Map.class, Integer.class), MapConversion::toInt); - DEFAULT_FACTORY.put(pair(String.class, Integer.class), StringConversion::stringToInteger); + DEFAULT_FACTORY.put(pair(String.class, Integer.class), StringConversion::toInt); // Long/long conversions supported DEFAULT_FACTORY.put(pair(Void.class, long.class), NumberConversion::toLongZero); @@ -195,7 +195,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Calendar.class, Long.class), (fromInstance, converter, options) -> ((Calendar) fromInstance).getTime().getTime()); DEFAULT_FACTORY.put(pair(Number.class, Long.class), NumberConversion::toLong); DEFAULT_FACTORY.put(pair(Map.class, Long.class), MapConversion::toLong); - DEFAULT_FACTORY.put(pair(String.class, Long.class), StringConversion::stringToLong); + DEFAULT_FACTORY.put(pair(String.class, Long.class), StringConversion::toLong); // Float/float conversions supported DEFAULT_FACTORY.put(pair(Void.class, float.class), NumberConversion::toFloatZero); @@ -207,16 +207,16 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Float.class, Float.class), Converter::identity); DEFAULT_FACTORY.put(pair(Double.class, Float.class), NumberConversion::toFloat); DEFAULT_FACTORY.put(pair(Boolean.class, Float.class), BooleanConversion::toFloat); - DEFAULT_FACTORY.put(pair(Character.class, Float.class), (fromInstance, converter, options) -> (float) ((char) fromInstance)); + DEFAULT_FACTORY.put(pair(Character.class, Float.class), CharacterConversion::toFloat); DEFAULT_FACTORY.put(pair(LocalDate.class, Float.class), (fromInstance, converter, options) -> ((LocalDate) fromInstance).toEpochDay()); - DEFAULT_FACTORY.put(pair(AtomicBoolean.class, Float.class), BooleanConversion::atomicToFloat); + DEFAULT_FACTORY.put(pair(AtomicBoolean.class, Float.class), AtomicBooleanConversion::toFloat); DEFAULT_FACTORY.put(pair(AtomicInteger.class, Float.class), NumberConversion::toFloat); DEFAULT_FACTORY.put(pair(AtomicLong.class, Float.class), NumberConversion::toFloat); DEFAULT_FACTORY.put(pair(BigInteger.class, Float.class), NumberConversion::toFloat); DEFAULT_FACTORY.put(pair(BigDecimal.class, Float.class), NumberConversion::toFloat); DEFAULT_FACTORY.put(pair(Number.class, Float.class), NumberConversion::toFloat); DEFAULT_FACTORY.put(pair(Map.class, Float.class), MapConversion::toFloat); - DEFAULT_FACTORY.put(pair(String.class, Float.class), StringConversion::stringToFloat); + DEFAULT_FACTORY.put(pair(String.class, Float.class), StringConversion::toFloat); // Double/double conversions supported DEFAULT_FACTORY.put(pair(Void.class, double.class), (fromInstance, converter, options) -> 0.0d); @@ -228,14 +228,14 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Float.class, Double.class), NumberConversion::toDouble); DEFAULT_FACTORY.put(pair(Double.class, Double.class), Converter::identity); DEFAULT_FACTORY.put(pair(Boolean.class, Double.class), BooleanConversion::toDouble); - DEFAULT_FACTORY.put(pair(Character.class, Double.class), (fromInstance, converter, options) -> (double) ((char) fromInstance)); + DEFAULT_FACTORY.put(pair(Character.class, Double.class), CharacterConversion::toDouble); DEFAULT_FACTORY.put(pair(LocalDate.class, Double.class), (fromInstance, converter, options) -> (double) ((LocalDate) fromInstance).toEpochDay()); DEFAULT_FACTORY.put(pair(LocalDateTime.class, Double.class), (fromInstance, converter, options) -> (double) localDateTimeToMillis((LocalDateTime) fromInstance, options.getSourceZoneId())); DEFAULT_FACTORY.put(pair(ZonedDateTime.class, Double.class), (fromInstance, converter, options) -> (double) zonedDateTimeToMillis((ZonedDateTime) fromInstance)); DEFAULT_FACTORY.put(pair(Date.class, Double.class), (fromInstance, converter, options) -> (double) ((Date) fromInstance).getTime()); DEFAULT_FACTORY.put(pair(java.sql.Date.class, Double.class), (fromInstance, converter, options) -> (double) ((Date) fromInstance).getTime()); DEFAULT_FACTORY.put(pair(Timestamp.class, Double.class), (fromInstance, converter, options) -> (double) ((Date) fromInstance).getTime()); - DEFAULT_FACTORY.put(pair(AtomicBoolean.class, Double.class), BooleanConversion::atomicToDouble); + DEFAULT_FACTORY.put(pair(AtomicBoolean.class, Double.class), AtomicBooleanConversion::toDouble); DEFAULT_FACTORY.put(pair(AtomicInteger.class, Double.class), NumberConversion::toDouble); DEFAULT_FACTORY.put(pair(AtomicLong.class, Double.class), NumberConversion::toDouble); DEFAULT_FACTORY.put(pair(BigInteger.class, Double.class), NumberConversion::toDouble); @@ -243,7 +243,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Calendar.class, Double.class), (fromInstance, converter, options) -> (double) ((Calendar) fromInstance).getTime().getTime()); DEFAULT_FACTORY.put(pair(Number.class, Double.class), NumberConversion::toDouble); DEFAULT_FACTORY.put(pair(Map.class, Double.class), MapConversion::toDouble); - DEFAULT_FACTORY.put(pair(String.class, Double.class), StringConversion::stringToDouble); + DEFAULT_FACTORY.put(pair(String.class, Double.class), StringConversion::toDouble); // Boolean/boolean conversions supported DEFAULT_FACTORY.put(pair(Void.class, boolean.class), VoidConversion::toBoolean); @@ -255,57 +255,35 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Float.class, Boolean.class), NumberConversion::isFloatTypeNotZero); DEFAULT_FACTORY.put(pair(Double.class, Boolean.class), NumberConversion::isFloatTypeNotZero); DEFAULT_FACTORY.put(pair(Boolean.class, Boolean.class), Converter::identity); - DEFAULT_FACTORY.put(pair(Character.class, Boolean.class), (fromInstance, converter, options) -> ((char) fromInstance) > 0); - DEFAULT_FACTORY.put(pair(AtomicBoolean.class, Boolean.class), (fromInstance, converter, options) -> ((AtomicBoolean) fromInstance).get()); + DEFAULT_FACTORY.put(pair(Character.class, Boolean.class), CharacterConversion::toBoolean); + DEFAULT_FACTORY.put(pair(AtomicBoolean.class, Boolean.class), AtomicBooleanConversion::toBoolean); DEFAULT_FACTORY.put(pair(AtomicInteger.class, Boolean.class), NumberConversion::isIntTypeNotZero); DEFAULT_FACTORY.put(pair(AtomicLong.class, Boolean.class), NumberConversion::isIntTypeNotZero); - DEFAULT_FACTORY.put(pair(BigInteger.class, Boolean.class), (fromInstance, converter, options) -> ((BigInteger)fromInstance).compareTo(BigInteger.ZERO) != 0); - DEFAULT_FACTORY.put(pair(BigDecimal.class, Boolean.class), (fromInstance, converter, options) -> ((BigDecimal)fromInstance).compareTo(BigDecimal.ZERO) != 0); + DEFAULT_FACTORY.put(pair(BigInteger.class, Boolean.class), NumberConversion::isBigIntegerNotZero); + DEFAULT_FACTORY.put(pair(BigDecimal.class, Boolean.class), NumberConversion::isBigDecimalNotZero); DEFAULT_FACTORY.put(pair(Number.class, Boolean.class), NumberConversion::isIntTypeNotZero); DEFAULT_FACTORY.put(pair(Map.class, Boolean.class), MapConversion::toBoolean); - DEFAULT_FACTORY.put(pair(String.class, Boolean.class), (fromInstance, converter, options) -> { - String str = ((String) fromInstance).trim(); - if (str.isEmpty()) { - return false; - } - // faster equals check "true" and "false" - if ("true".equals(str)) { - return true; - } else if ("false".equals(str)) { - return false; - } - return "true".equalsIgnoreCase(str); - }); + DEFAULT_FACTORY.put(pair(String.class, Boolean.class), StringConversion::toBoolean); // Character/chat conversions supported DEFAULT_FACTORY.put(pair(Void.class, char.class), VoidConversion::toChar); DEFAULT_FACTORY.put(pair(Void.class, Character.class), VoidConversion::toNull); - DEFAULT_FACTORY.put(pair(Byte.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(Short.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(Integer.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(Long.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(Float.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(Double.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(Boolean.class, Character.class), (fromInstance, converter, options) -> ((Boolean) fromInstance) ? '1' : '0'); + DEFAULT_FACTORY.put(pair(Byte.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(Short.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(Integer.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(Long.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(Float.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(Double.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(Boolean.class, Character.class), BooleanConversion::toCharacter); DEFAULT_FACTORY.put(pair(Character.class, Character.class), Converter::identity); DEFAULT_FACTORY.put(pair(AtomicBoolean.class, Character.class), AtomicBooleanConversion::toCharacter); - DEFAULT_FACTORY.put(pair(AtomicInteger.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(AtomicLong.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(BigInteger.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(BigDecimal.class, Character.class), NumberConversion::numberToCharacter); - DEFAULT_FACTORY.put(pair(Number.class, Character.class), NumberConversion::numberToCharacter); + DEFAULT_FACTORY.put(pair(AtomicInteger.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(AtomicLong.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(BigInteger.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(BigDecimal.class, Character.class), NumberConversion::toCharacter); + DEFAULT_FACTORY.put(pair(Number.class, Character.class), NumberConversion::toCharacter); DEFAULT_FACTORY.put(pair(Map.class, Character.class), (fromInstance, converter, options) -> converter.fromValueMap((Map) fromInstance, char.class, null, options)); - DEFAULT_FACTORY.put(pair(String.class, Character.class), (fromInstance, converter, options) -> { - String str = ((String) fromInstance); - if (str.isEmpty()) { - return (char) 0; - } - if (str.length() == 1) { - return str.charAt(0); - } - // Treat as a String number, like "65" = 'A' - return (char) Integer.parseInt(str.trim()); - }); + DEFAULT_FACTORY.put(pair(String.class, Character.class), StringConversion::toCharacter); // BigInteger versions supported DEFAULT_FACTORY.put(pair(Void.class, BigInteger.class), VoidConversion::toNull); @@ -384,17 +362,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Calendar.class, BigDecimal.class), CalendarConversion::toBigDecimal); DEFAULT_FACTORY.put(pair(Number.class, BigDecimal.class), (fromInstance, converter, options) -> new BigDecimal(fromInstance.toString())); DEFAULT_FACTORY.put(pair(Map.class, BigDecimal.class), MapConversion::toBigDecimal); - DEFAULT_FACTORY.put(pair(String.class, BigDecimal.class), (fromInstance, converter, options) -> { - String str = ((String) fromInstance).trim(); - if (str.isEmpty()) { - return BigDecimal.ZERO; - } - try { - return new BigDecimal(str); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("Value: " + fromInstance + " not parseable as a BigDecimal value."); - } - }); + DEFAULT_FACTORY.put(pair(String.class, BigDecimal.class), StringConversion::toBigDecimal); // AtomicBoolean conversions supported DEFAULT_FACTORY.put(pair(Void.class, AtomicBoolean.class), VoidConversion::toNull); @@ -404,7 +372,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Long.class, AtomicBoolean.class), NumberConversion::toAtomicBoolean); DEFAULT_FACTORY.put(pair(Float.class, AtomicBoolean.class), NumberConversion::toAtomicBoolean); DEFAULT_FACTORY.put(pair(Double.class, AtomicBoolean.class), NumberConversion::toAtomicBoolean); - DEFAULT_FACTORY.put(pair(Boolean.class, AtomicBoolean.class), (fromInstance, converter, options) -> new AtomicBoolean((Boolean) fromInstance)); + DEFAULT_FACTORY.put(pair(Boolean.class, AtomicBoolean.class), BooleanConversion::toAtomicBoolean); DEFAULT_FACTORY.put(pair(Character.class, AtomicBoolean.class), (fromInstance, converter, options) -> new AtomicBoolean((char) fromInstance > 0)); DEFAULT_FACTORY.put(pair(BigInteger.class, AtomicBoolean.class), NumberConversion::toAtomicBoolean); DEFAULT_FACTORY.put(pair(BigDecimal.class, AtomicBoolean.class), NumberConversion::toAtomicBoolean); @@ -412,7 +380,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(AtomicInteger.class, AtomicBoolean.class), NumberConversion::toAtomicBoolean); DEFAULT_FACTORY.put(pair(AtomicLong.class, AtomicBoolean.class), NumberConversion::toAtomicBoolean); DEFAULT_FACTORY.put(pair(Number.class, AtomicBoolean.class), NumberConversion::toAtomicBoolean); - DEFAULT_FACTORY.put(pair(Map.class, AtomicBoolean.class), (fromInstance, converter, options) -> converter.fromValueMap((Map) fromInstance, AtomicBoolean.class, null, options)); + DEFAULT_FACTORY.put(pair(Map.class, AtomicBoolean.class), MapConversion::toAtomicBoolean); DEFAULT_FACTORY.put(pair(String.class, AtomicBoolean.class), (fromInstance, converter, options) -> { String str = ((String) fromInstance).trim(); if (str.isEmpty()) { @@ -438,8 +406,8 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(AtomicLong.class, AtomicInteger.class), NumberConversion::toAtomicInteger); DEFAULT_FACTORY.put(pair(LocalDate.class, AtomicInteger.class), (fromInstance, converter, options) -> new AtomicInteger((int) ((LocalDate) fromInstance).toEpochDay())); DEFAULT_FACTORY.put(pair(Number.class, AtomicBoolean.class), NumberConversion::toAtomicInteger); - DEFAULT_FACTORY.put(pair(Map.class, AtomicInteger.class), (fromInstance, converter, options) -> converter.fromValueMap((Map) fromInstance, AtomicInteger.class, null, options)); - DEFAULT_FACTORY.put(pair(String.class, AtomicInteger.class), StringConversion::stringToAtomicInteger); + DEFAULT_FACTORY.put(pair(Map.class, AtomicInteger.class), MapConversion::toAtomicInteger); + DEFAULT_FACTORY.put(pair(String.class, AtomicInteger.class), StringConversion::toAtomicInteger); // AtomicLong conversions supported DEFAULT_FACTORY.put(pair(Void.class, AtomicLong.class), VoidConversion::toNull); @@ -464,16 +432,16 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(ZonedDateTime.class, AtomicLong.class), (fromInstance, converter, options) -> new AtomicLong(zonedDateTimeToMillis((ZonedDateTime) fromInstance))); DEFAULT_FACTORY.put(pair(Calendar.class, AtomicLong.class), CalendarConversion::toAtomicLong); DEFAULT_FACTORY.put(pair(Number.class, AtomicLong.class), NumberConversion::toAtomicLong); - DEFAULT_FACTORY.put(pair(Map.class, AtomicLong.class), (fromInstance, converter, options) -> converter.fromValueMap((Map) fromInstance, AtomicLong.class, null, options)); - DEFAULT_FACTORY.put(pair(String.class, AtomicLong.class), StringConversion::stringToAtomicLong); + DEFAULT_FACTORY.put(pair(Map.class, AtomicLong.class), MapConversion::toAtomicLong); + DEFAULT_FACTORY.put(pair(String.class, AtomicLong.class), StringConversion::toAtomicLong); // Date conversions supported DEFAULT_FACTORY.put(pair(Void.class, Date.class), VoidConversion::toNull); - DEFAULT_FACTORY.put(pair(Long.class, Date.class), NumberConversion::numberToDate); - DEFAULT_FACTORY.put(pair(Double.class, Date.class), NumberConversion::numberToDate); - DEFAULT_FACTORY.put(pair(BigInteger.class, Date.class), NumberConversion::numberToDate); - DEFAULT_FACTORY.put(pair(BigDecimal.class, Date.class), NumberConversion::numberToDate); - DEFAULT_FACTORY.put(pair(AtomicLong.class, Date.class), NumberConversion::numberToDate); + DEFAULT_FACTORY.put(pair(Long.class, Date.class), NumberConversion::toDate); + DEFAULT_FACTORY.put(pair(Double.class, Date.class), NumberConversion::toDate); + DEFAULT_FACTORY.put(pair(BigInteger.class, Date.class), NumberConversion::toDate); + DEFAULT_FACTORY.put(pair(BigDecimal.class, Date.class), NumberConversion::toDate); + DEFAULT_FACTORY.put(pair(AtomicLong.class, Date.class), NumberConversion::toDate); DEFAULT_FACTORY.put(pair(Date.class, Date.class), (fromInstance, converter, options) -> new Date(((Date) fromInstance).getTime())); DEFAULT_FACTORY.put(pair(java.sql.Date.class, Date.class), (fromInstance, converter, options) -> new Date(((Date) fromInstance).getTime())); DEFAULT_FACTORY.put(pair(Timestamp.class, Date.class), (fromInstance, converter, options) -> new Date(((Date) fromInstance).getTime())); @@ -481,7 +449,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(LocalDateTime.class, Date.class), (fromInstance, converter, options) -> new Date(localDateTimeToMillis((LocalDateTime) fromInstance, options.getSourceZoneId()))); DEFAULT_FACTORY.put(pair(ZonedDateTime.class, Date.class), (fromInstance, converter, options) -> new Date(zonedDateTimeToMillis((ZonedDateTime) fromInstance))); DEFAULT_FACTORY.put(pair(Calendar.class, Date.class), (fromInstance, converter, options) -> ((Calendar) fromInstance).getTime()); - DEFAULT_FACTORY.put(pair(Number.class, Date.class), NumberConversion::numberToDate); + DEFAULT_FACTORY.put(pair(Number.class, Date.class), NumberConversion::toDate); DEFAULT_FACTORY.put(pair(Map.class, Date.class), (fromInstance, converter, options) -> { Map map = (Map) fromInstance; if (map.containsKey("time")) { @@ -494,19 +462,20 @@ private static void buildFactoryConversions() { // java.sql.Date conversion supported DEFAULT_FACTORY.put(pair(Void.class, java.sql.Date.class), VoidConversion::toNull); - DEFAULT_FACTORY.put(pair(Long.class, java.sql.Date.class), NumberConversion::numberToSqlDate); - DEFAULT_FACTORY.put(pair(Double.class, java.sql.Date.class), NumberConversion::numberToSqlDate); - DEFAULT_FACTORY.put(pair(BigInteger.class, java.sql.Date.class), NumberConversion::numberToSqlDate); - DEFAULT_FACTORY.put(pair(BigDecimal.class, java.sql.Date.class), NumberConversion::numberToSqlDate); - DEFAULT_FACTORY.put(pair(AtomicLong.class, java.sql.Date.class), NumberConversion::numberToSqlDate); + DEFAULT_FACTORY.put(pair(Long.class, java.sql.Date.class), NumberConversion::toSqlDate); + DEFAULT_FACTORY.put(pair(Double.class, java.sql.Date.class), NumberConversion::toSqlDate); + DEFAULT_FACTORY.put(pair(BigInteger.class, java.sql.Date.class), NumberConversion::toSqlDate); + DEFAULT_FACTORY.put(pair(BigDecimal.class, java.sql.Date.class), NumberConversion::toSqlDate); + DEFAULT_FACTORY.put(pair(AtomicLong.class, java.sql.Date.class), NumberConversion::toSqlDate); + // why not use identity? (no conversion needed) DEFAULT_FACTORY.put(pair(java.sql.Date.class, java.sql.Date.class), (fromInstance, converter, options) -> new java.sql.Date(((java.sql.Date) fromInstance).getTime())); // java.sql.Date is mutable - DEFAULT_FACTORY.put(pair(Date.class, java.sql.Date.class), (fromInstance, converter, options) -> new java.sql.Date(((Date) fromInstance).getTime())); + DEFAULT_FACTORY.put(pair(Date.class, java.sql.Date.class), DateConversion::toSqlDate); DEFAULT_FACTORY.put(pair(Timestamp.class, java.sql.Date.class), (fromInstance, converter, options) -> new java.sql.Date(((Date) fromInstance).getTime())); DEFAULT_FACTORY.put(pair(LocalDate.class, java.sql.Date.class), (fromInstance, converter, options) -> new java.sql.Date(localDateToMillis((LocalDate) fromInstance, options.getSourceZoneId()))); DEFAULT_FACTORY.put(pair(LocalDateTime.class, java.sql.Date.class), (fromInstance, converter, options) -> new java.sql.Date(localDateTimeToMillis((LocalDateTime) fromInstance, options.getSourceZoneId()))); DEFAULT_FACTORY.put(pair(ZonedDateTime.class, java.sql.Date.class), (fromInstance, converter, options) -> new java.sql.Date(zonedDateTimeToMillis((ZonedDateTime) fromInstance))); DEFAULT_FACTORY.put(pair(Calendar.class, java.sql.Date.class), (fromInstance, converter, options) -> new java.sql.Date(((Calendar) fromInstance).getTime().getTime())); - DEFAULT_FACTORY.put(pair(Number.class, java.sql.Date.class), NumberConversion::numberToSqlDate); + DEFAULT_FACTORY.put(pair(Number.class, java.sql.Date.class), NumberConversion::toSqlDate); DEFAULT_FACTORY.put(pair(Map.class, java.sql.Date.class), (fromInstance, converter, options) -> { Map map = (Map) fromInstance; if (map.containsKey("time")) { @@ -526,11 +495,11 @@ private static void buildFactoryConversions() { // Timestamp conversions supported DEFAULT_FACTORY.put(pair(Void.class, Timestamp.class), VoidConversion::toNull); - DEFAULT_FACTORY.put(pair(Long.class, Timestamp.class), NumberConversion::numberToTimestamp); - DEFAULT_FACTORY.put(pair(Double.class, Timestamp.class), NumberConversion::numberToTimestamp); - DEFAULT_FACTORY.put(pair(BigInteger.class, Timestamp.class), NumberConversion::numberToTimestamp); - DEFAULT_FACTORY.put(pair(BigDecimal.class, Timestamp.class), NumberConversion::numberToTimestamp); - DEFAULT_FACTORY.put(pair(AtomicLong.class, Timestamp.class), NumberConversion::numberToTimestamp); + DEFAULT_FACTORY.put(pair(Long.class, Timestamp.class), NumberConversion::toTimestamp); + DEFAULT_FACTORY.put(pair(Double.class, Timestamp.class), NumberConversion::toTimestamp); + DEFAULT_FACTORY.put(pair(BigInteger.class, Timestamp.class), NumberConversion::toTimestamp); + DEFAULT_FACTORY.put(pair(BigDecimal.class, Timestamp.class), NumberConversion::toTimestamp); + DEFAULT_FACTORY.put(pair(AtomicLong.class, Timestamp.class), NumberConversion::toTimestamp); DEFAULT_FACTORY.put(pair(Timestamp.class, Timestamp.class), (fromInstance, converter, options) -> new Timestamp(((Timestamp) fromInstance).getTime())); DEFAULT_FACTORY.put(pair(java.sql.Date.class, Timestamp.class), (fromInstance, converter, options) -> new Timestamp(((Date) fromInstance).getTime())); DEFAULT_FACTORY.put(pair(Date.class, Timestamp.class), (fromInstance, converter, options) -> new Timestamp(((Date) fromInstance).getTime())); @@ -538,7 +507,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(LocalDateTime.class, Timestamp.class), (fromInstance, converter, options) -> new Timestamp(localDateTimeToMillis((LocalDateTime) fromInstance, options.getSourceZoneId()))); DEFAULT_FACTORY.put(pair(ZonedDateTime.class, Timestamp.class), (fromInstance, converter, options) -> new Timestamp(zonedDateTimeToMillis((ZonedDateTime) fromInstance))); DEFAULT_FACTORY.put(pair(Calendar.class, Timestamp.class), (fromInstance, converter, options) -> new Timestamp(((Calendar) fromInstance).getTime().getTime())); - DEFAULT_FACTORY.put(pair(Number.class, Timestamp.class), NumberConversion::numberToTimestamp); + DEFAULT_FACTORY.put(pair(Number.class, Timestamp.class), NumberConversion::toTimestamp); DEFAULT_FACTORY.put(pair(Map.class, Timestamp.class), (fromInstance, converter, options) -> { Map map = (Map) fromInstance; if (map.containsKey("time")) { @@ -562,11 +531,11 @@ private static void buildFactoryConversions() { // Calendar conversions supported DEFAULT_FACTORY.put(pair(Void.class, Calendar.class), VoidConversion::toNull); - DEFAULT_FACTORY.put(pair(Long.class, Calendar.class), NumberConversion::numberToCalendar); - DEFAULT_FACTORY.put(pair(Double.class, Calendar.class), NumberConversion::numberToCalendar); - DEFAULT_FACTORY.put(pair(BigInteger.class, Calendar.class), NumberConversion::numberToCalendar); - DEFAULT_FACTORY.put(pair(BigDecimal.class, Calendar.class), NumberConversion::numberToCalendar); - DEFAULT_FACTORY.put(pair(AtomicLong.class, Calendar.class), NumberConversion::numberToCalendar); + DEFAULT_FACTORY.put(pair(Long.class, Calendar.class), NumberConversion::toCalendar); + DEFAULT_FACTORY.put(pair(Double.class, Calendar.class), NumberConversion::toCalendar); + DEFAULT_FACTORY.put(pair(BigInteger.class, Calendar.class), NumberConversion::toCalendar); + DEFAULT_FACTORY.put(pair(BigDecimal.class, Calendar.class), NumberConversion::toCalendar); + DEFAULT_FACTORY.put(pair(AtomicLong.class, Calendar.class), NumberConversion::toCalendar); DEFAULT_FACTORY.put(pair(Date.class, Calendar.class), (fromInstance, converter, options) -> initCal(((Date) fromInstance).getTime())); DEFAULT_FACTORY.put(pair(java.sql.Date.class, Calendar.class), (fromInstance, converter, options) -> initCal(((Date) fromInstance).getTime())); DEFAULT_FACTORY.put(pair(Timestamp.class, Calendar.class), (fromInstance, converter, options) -> initCal(((Date) fromInstance).getTime())); @@ -574,7 +543,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(LocalDateTime.class, Calendar.class), (fromInstance, converter, options) -> initCal(localDateTimeToMillis((LocalDateTime) fromInstance, options.getSourceZoneId()))); DEFAULT_FACTORY.put(pair(ZonedDateTime.class, Calendar.class), (fromInstance, converter, options) -> initCal(zonedDateTimeToMillis((ZonedDateTime) fromInstance))); DEFAULT_FACTORY.put(pair(Calendar.class, Calendar.class), (fromInstance, converter, options) -> ((Calendar) fromInstance).clone()); - DEFAULT_FACTORY.put(pair(Number.class, Calendar.class), NumberConversion::numberToCalendar); + DEFAULT_FACTORY.put(pair(Number.class, Calendar.class), NumberConversion::toCalendar); DEFAULT_FACTORY.put(pair(Map.class, Calendar.class), (fromInstance, converter, options) -> { Map map = (Map) fromInstance; if (map.containsKey("time")) { @@ -630,15 +599,15 @@ private static void buildFactoryConversions() { // LocalDate conversions supported DEFAULT_FACTORY.put(pair(Void.class, LocalDate.class), VoidConversion::toNull); - DEFAULT_FACTORY.put(pair(Short.class, LocalDate.class), NumberConversion::numberToLocalDate); - DEFAULT_FACTORY.put(pair(Integer.class, LocalDate.class), NumberConversion::numberToLocalDate); - DEFAULT_FACTORY.put(pair(Long.class, LocalDate.class), NumberConversion::numberToLocalDate); - DEFAULT_FACTORY.put(pair(Float.class, LocalDate.class), NumberConversion::numberToLocalDate); - DEFAULT_FACTORY.put(pair(Double.class, LocalDate.class), NumberConversion::numberToLocalDate); - DEFAULT_FACTORY.put(pair(BigInteger.class, LocalDate.class), NumberConversion::numberToLocalDate); - DEFAULT_FACTORY.put(pair(BigDecimal.class, LocalDate.class), NumberConversion::numberToLocalDate); - DEFAULT_FACTORY.put(pair(AtomicInteger.class, LocalDate.class), NumberConversion::numberToLocalDate); - DEFAULT_FACTORY.put(pair(AtomicLong.class, LocalDate.class), NumberConversion::numberToLocalDate); + DEFAULT_FACTORY.put(pair(Short.class, LocalDate.class), NumberConversion::toLocalDate); + DEFAULT_FACTORY.put(pair(Integer.class, LocalDate.class), NumberConversion::toLocalDate); + DEFAULT_FACTORY.put(pair(Long.class, LocalDate.class), NumberConversion::toLocalDate); + DEFAULT_FACTORY.put(pair(Float.class, LocalDate.class), NumberConversion::toLocalDate); + DEFAULT_FACTORY.put(pair(Double.class, LocalDate.class), NumberConversion::toLocalDate); + DEFAULT_FACTORY.put(pair(BigInteger.class, LocalDate.class), NumberConversion::toLocalDate); + DEFAULT_FACTORY.put(pair(BigDecimal.class, LocalDate.class), NumberConversion::toLocalDate); + DEFAULT_FACTORY.put(pair(AtomicInteger.class, LocalDate.class), NumberConversion::toLocalDate); + DEFAULT_FACTORY.put(pair(AtomicLong.class, LocalDate.class), NumberConversion::toLocalDate); DEFAULT_FACTORY.put(pair(java.sql.Date.class, LocalDate.class), (fromInstance, converter, options) -> ((java.sql.Date) fromInstance).toLocalDate()); DEFAULT_FACTORY.put(pair(Timestamp.class, LocalDate.class), (fromInstance, converter, options) -> ((Timestamp) fromInstance).toLocalDateTime().toLocalDate()); DEFAULT_FACTORY.put(pair(Date.class, LocalDate.class), (fromInstance, converter, options) -> ((Date) fromInstance).toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); @@ -646,7 +615,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(LocalDateTime.class, LocalDate.class), (fromInstance, converter, options) -> ((LocalDateTime) fromInstance).toLocalDate()); DEFAULT_FACTORY.put(pair(ZonedDateTime.class, LocalDate.class), (fromInstance, converter, options) -> ((ZonedDateTime) fromInstance).toLocalDate()); DEFAULT_FACTORY.put(pair(Calendar.class, LocalDate.class), (fromInstance, converter, options) -> ((Calendar) fromInstance).toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); - DEFAULT_FACTORY.put(pair(Number.class, LocalDate.class), NumberConversion::numberToLocalDate); + DEFAULT_FACTORY.put(pair(Number.class, LocalDate.class), NumberConversion::toLocalDate); DEFAULT_FACTORY.put(pair(Map.class, LocalDate.class), (fromInstance, converter, options) -> { Map map = (Map) fromInstance; if (map.containsKey("month") && map.containsKey("day") && map.containsKey("year")) { @@ -669,11 +638,11 @@ private static void buildFactoryConversions() { // LocalDateTime conversions supported DEFAULT_FACTORY.put(pair(Void.class, LocalDateTime.class), VoidConversion::toNull); - DEFAULT_FACTORY.put(pair(Long.class, LocalDateTime.class), NumberConversion::numberToLocalDateTime); - DEFAULT_FACTORY.put(pair(Double.class, LocalDateTime.class), NumberConversion::numberToLocalDateTime); - DEFAULT_FACTORY.put(pair(BigInteger.class, LocalDateTime.class), NumberConversion::numberToLocalDateTime); - DEFAULT_FACTORY.put(pair(BigDecimal.class, LocalDateTime.class), NumberConversion::numberToLocalDateTime); - DEFAULT_FACTORY.put(pair(AtomicLong.class, LocalDateTime.class), NumberConversion::numberToLocalDateTime); + DEFAULT_FACTORY.put(pair(Long.class, LocalDateTime.class), NumberConversion::toLocalDateTime); + DEFAULT_FACTORY.put(pair(Double.class, LocalDateTime.class), NumberConversion::toLocalDateTime); + DEFAULT_FACTORY.put(pair(BigInteger.class, LocalDateTime.class), NumberConversion::toLocalDateTime); + DEFAULT_FACTORY.put(pair(BigDecimal.class, LocalDateTime.class), NumberConversion::toLocalDateTime); + DEFAULT_FACTORY.put(pair(AtomicLong.class, LocalDateTime.class), NumberConversion::toLocalDateTime); DEFAULT_FACTORY.put(pair(java.sql.Date.class, LocalDateTime.class), (fromInstance, converter, options) -> ((java.sql.Date) fromInstance).toLocalDate().atStartOfDay()); DEFAULT_FACTORY.put(pair(Timestamp.class, LocalDateTime.class), (fromInstance, converter, options) -> ((Timestamp) fromInstance).toLocalDateTime()); DEFAULT_FACTORY.put(pair(Date.class, LocalDateTime.class), (fromInstance, converter, options) -> ((Date) fromInstance).toInstant().atZone(options.getSourceZoneId()).toLocalDateTime()); @@ -681,7 +650,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(LocalDate.class, LocalDateTime.class), (fromInstance, converter, options) -> ((LocalDate) fromInstance).atStartOfDay()); DEFAULT_FACTORY.put(pair(ZonedDateTime.class, LocalDateTime.class), (fromInstance, converter, options) -> ((ZonedDateTime) fromInstance).toLocalDateTime()); DEFAULT_FACTORY.put(pair(Calendar.class, LocalDateTime.class), (fromInstance, converter, options) -> ((Calendar) fromInstance).toInstant().atZone(options.getSourceZoneId()).toLocalDateTime()); - DEFAULT_FACTORY.put(pair(Number.class, LocalDateTime.class), NumberConversion::numberToLocalDateTime); + DEFAULT_FACTORY.put(pair(Number.class, LocalDateTime.class), NumberConversion::toLocalDateTime); DEFAULT_FACTORY.put(pair(Map.class, LocalDateTime.class), (fromInstance, converter, options) -> { Map map = (Map) fromInstance; return converter.fromValueMap(map, LocalDateTime.class, null, options); @@ -697,11 +666,11 @@ private static void buildFactoryConversions() { // ZonedDateTime conversions supported DEFAULT_FACTORY.put(pair(Void.class, ZonedDateTime.class), VoidConversion::toNull); - DEFAULT_FACTORY.put(pair(Long.class, ZonedDateTime.class), NumberConversion::numberToZonedDateTime); - DEFAULT_FACTORY.put(pair(Double.class, ZonedDateTime.class), NumberConversion::numberToZonedDateTime); - DEFAULT_FACTORY.put(pair(BigInteger.class, ZonedDateTime.class), NumberConversion::numberToZonedDateTime); - DEFAULT_FACTORY.put(pair(BigDecimal.class, ZonedDateTime.class), NumberConversion::numberToZonedDateTime); - DEFAULT_FACTORY.put(pair(AtomicLong.class, ZonedDateTime.class), NumberConversion::numberToZonedDateTime); + DEFAULT_FACTORY.put(pair(Long.class, ZonedDateTime.class), NumberConversion::toZonedDateTime); + DEFAULT_FACTORY.put(pair(Double.class, ZonedDateTime.class), NumberConversion::toZonedDateTime); + DEFAULT_FACTORY.put(pair(BigInteger.class, ZonedDateTime.class), NumberConversion::toZonedDateTime); + DEFAULT_FACTORY.put(pair(BigDecimal.class, ZonedDateTime.class), NumberConversion::toZonedDateTime); + DEFAULT_FACTORY.put(pair(AtomicLong.class, ZonedDateTime.class), NumberConversion::toZonedDateTime); DEFAULT_FACTORY.put(pair(java.sql.Date.class, ZonedDateTime.class), (fromInstance, converter, options) -> ((java.sql.Date) fromInstance).toLocalDate().atStartOfDay(options.getSourceZoneId())); DEFAULT_FACTORY.put(pair(Timestamp.class, ZonedDateTime.class), (fromInstance, converter, options) -> ((Timestamp) fromInstance).toInstant().atZone(options.getSourceZoneId())); DEFAULT_FACTORY.put(pair(Date.class, ZonedDateTime.class), (fromInstance, converter, options) -> ((Date) fromInstance).toInstant().atZone(options.getSourceZoneId())); @@ -709,7 +678,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(LocalDateTime.class, ZonedDateTime.class), (fromInstance, converter, options) -> ((LocalDateTime) fromInstance).atZone(options.getSourceZoneId())); DEFAULT_FACTORY.put(pair(ZonedDateTime.class, ZonedDateTime.class), Converter::identity); DEFAULT_FACTORY.put(pair(Calendar.class, ZonedDateTime.class), (fromInstance, converter, options) -> ((Calendar) fromInstance).toInstant().atZone(options.getSourceZoneId())); - DEFAULT_FACTORY.put(pair(Number.class, ZonedDateTime.class), NumberConversion::numberToZonedDateTime); + DEFAULT_FACTORY.put(pair(Number.class, ZonedDateTime.class), NumberConversion::toZonedDateTime); DEFAULT_FACTORY.put(pair(Map.class, ZonedDateTime.class), (fromInstance, converter, options) -> { Map map = (Map) fromInstance; return converter.fromValueMap(map, ZonedDateTime.class, null, options); diff --git a/src/main/java/com/cedarsoftware/util/convert/ConverterOptions.java b/src/main/java/com/cedarsoftware/util/convert/ConverterOptions.java index f3c633a7a..fabee345b 100644 --- a/src/main/java/com/cedarsoftware/util/convert/ConverterOptions.java +++ b/src/main/java/com/cedarsoftware/util/convert/ConverterOptions.java @@ -1,6 +1,7 @@ package com.cedarsoftware.util.convert; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.time.ZoneId; import java.util.Locale; import java.util.TimeZone; @@ -27,32 +28,32 @@ public interface ConverterOptions { /** * @return zoneId to use for source conversion when on is not provided on the source (Date, Instant, etc.) */ - ZoneId getSourceZoneId(); + default ZoneId getSourceZoneId() { return ZoneId.systemDefault(); } /** * @return zoneId expected on the target when finished (only for types that support ZoneId or TimeZone) */ - ZoneId getTargetZoneId(); + default ZoneId getTargetZoneId() { return ZoneId.systemDefault(); } /** * @return Locale to use as source locale when converting between types that require a Locale */ - Locale getSourceLocale(); + default Locale getSourceLocale() { return Locale.getDefault(); } /** * @return Locale to use as target when converting between types that require a Locale. */ - Locale getTargetLocale(); + default Locale getTargetLocale() { return Locale.getDefault(); } /** * @return Charset to use as source CharSet on types that require a Charset during conversion (if required). */ - Charset getSourceCharset(); + default Charset getSourceCharset() { return StandardCharsets.UTF_8; } /** * @return Charset to use os target Charset on types that require a Charset during conversion (if required). */ - Charset getTargetCharset(); + default Charset getTargetCharset() { return StandardCharsets.UTF_8; } /** diff --git a/src/main/java/com/cedarsoftware/util/convert/DateConversion.java b/src/main/java/com/cedarsoftware/util/convert/DateConversion.java index c4339d01a..24ea3300b 100644 --- a/src/main/java/com/cedarsoftware/util/convert/DateConversion.java +++ b/src/main/java/com/cedarsoftware/util/convert/DateConversion.java @@ -6,6 +6,11 @@ import java.util.concurrent.atomic.AtomicLong; public class DateConversion { + public static Date toSqlDate(Object fromInstance, Converter converter, ConverterOptions options) { + Date from = (Date)fromInstance; + return new java.sql.Date(from.getTime()); + } + public static BigDecimal toBigDecimal(Object fromInstance, Converter converter, ConverterOptions options) { Date from = (Date)fromInstance; return BigDecimal.valueOf(from.getTime()); diff --git a/src/main/java/com/cedarsoftware/util/convert/DefaultConverterOptions.java b/src/main/java/com/cedarsoftware/util/convert/DefaultConverterOptions.java index 667b09c81..2e9d23ecd 100644 --- a/src/main/java/com/cedarsoftware/util/convert/DefaultConverterOptions.java +++ b/src/main/java/com/cedarsoftware/util/convert/DefaultConverterOptions.java @@ -27,45 +27,9 @@ public class DefaultConverterOptions implements ConverterOptions { private final Map customOptions; - private final ZoneId zoneId; - private final Locale locale; - private final Charset charset; public DefaultConverterOptions() { this.customOptions = new ConcurrentHashMap<>(); - this.zoneId = ZoneId.systemDefault(); - this.locale = Locale.getDefault(); - this.charset = StandardCharsets.UTF_8; - } - - @Override - public ZoneId getSourceZoneId() { - return zoneId; - } - - @Override - public ZoneId getTargetZoneId() { - return zoneId; - } - - @Override - public Locale getSourceLocale() { - return locale; - } - - @Override - public Locale getTargetLocale() { - return locale; - } - - @Override - public Charset getSourceCharset() { - return charset; - } - - @Override - public Charset getTargetCharset() { - return charset; } @SuppressWarnings("unchecked") diff --git a/src/main/java/com/cedarsoftware/util/convert/MapConversion.java b/src/main/java/com/cedarsoftware/util/convert/MapConversion.java index 6aeed1f90..dc2544993 100644 --- a/src/main/java/com/cedarsoftware/util/convert/MapConversion.java +++ b/src/main/java/com/cedarsoftware/util/convert/MapConversion.java @@ -1,9 +1,15 @@ package com.cedarsoftware.util.convert; +import com.cedarsoftware.util.CollectionUtilities; + import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Date; import java.util.Map; import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; public class MapConversion { @@ -64,6 +70,18 @@ public static String toString(Object fromInstance, Converter converter, Converte } + public static AtomicInteger toAtomicInteger(Object fromInstance, Converter converter, ConverterOptions options) { + return fromMapValue(fromInstance, converter, options, AtomicInteger.class); + } + + public static AtomicLong toAtomicLong(Object fromInstance, Converter converter, ConverterOptions options) { + return fromMapValue(fromInstance, converter, options, AtomicLong.class); + } + + public static AtomicBoolean toAtomicBoolean(Object fromInstance, Converter converter, ConverterOptions options) { + return fromMapValue(fromInstance, converter, options, AtomicBoolean.class); + } + public static T fromMapValue(Object fromInstance, Converter converter, ConverterOptions options, Class type) { Map map = (Map) fromInstance; diff --git a/src/main/java/com/cedarsoftware/util/convert/NumberConversion.java b/src/main/java/com/cedarsoftware/util/convert/NumberConversion.java index ff9f1038a..d7674553f 100644 --- a/src/main/java/com/cedarsoftware/util/convert/NumberConversion.java +++ b/src/main/java/com/cedarsoftware/util/convert/NumberConversion.java @@ -120,13 +120,23 @@ public static boolean isFloatTypeNotZero(Object from, Converter converter, Conve return ((Number) from).doubleValue() != 0; } + public static boolean isBigIntegerNotZero(Object from, Converter converter, ConverterOptions options) { + BigInteger bi = (BigInteger) from; + return bi.compareTo(BigInteger.ZERO) != 0; + } + + public static boolean isBigDecimalNotZero(Object from, Converter converter, ConverterOptions options) { + BigDecimal bd = (BigDecimal) from; + return bd.compareTo(BigDecimal.ZERO) != 0; + } + /** * @param number Number instance to convert to char. * @return char that best represents the Number. The result will always be a value between * 0 and Character.MAX_VALUE. * @throws IllegalArgumentException if the value exceeds the range of a char. */ - public static char numberToCharacter(Number number) { + public static char toCharacter(Number number) { long value = number.longValue(); if (value >= 0 && value <= Character.MAX_VALUE) { return (char) value; @@ -142,41 +152,41 @@ public static char numberToCharacter(Number number) { * 0 and Character.MAX_VALUE. * @throws IllegalArgumentException if the value exceeds the range of a char. */ - public static char numberToCharacter(Object from, Converter converter, ConverterOptions options) { - return numberToCharacter((Number) from); + public static char toCharacter(Object from, Converter converter, ConverterOptions options) { + return toCharacter((Number) from); } - public static Date numberToDate(Object from, Converter converter, ConverterOptions options) { + public static Date toDate(Object from, Converter converter, ConverterOptions options) { Number number = (Number) from; return new Date(number.longValue()); } - public static java.sql.Date numberToSqlDate(Object from, Converter converter, ConverterOptions options) { + public static java.sql.Date toSqlDate(Object from, Converter converter, ConverterOptions options) { Number number = (Number) from; return new java.sql.Date(number.longValue()); } - public static Timestamp numberToTimestamp(Object from, Converter converter, ConverterOptions options) { + public static Timestamp toTimestamp(Object from, Converter converter, ConverterOptions options) { Number number = (Number) from; return new Timestamp(number.longValue()); } - public static Calendar numberToCalendar(Object from, Converter converter, ConverterOptions options) { + public static Calendar toCalendar(Object from, Converter converter, ConverterOptions options) { Number number = (Number) from; return Converter.initCal(number.longValue()); } - public static LocalDate numberToLocalDate(Object from, Converter converter, ConverterOptions options) { + public static LocalDate toLocalDate(Object from, Converter converter, ConverterOptions options) { Number number = (Number) from; return LocalDate.ofEpochDay(number.longValue()); } - public static LocalDateTime numberToLocalDateTime(Object from, Converter converter, ConverterOptions options) { + public static LocalDateTime toLocalDateTime(Object from, Converter converter, ConverterOptions options) { Number number = (Number) from; return Instant.ofEpochMilli(number.longValue()).atZone(options.getSourceZoneId()).toLocalDateTime(); } - public static ZonedDateTime numberToZonedDateTime(Object from, Converter converter, ConverterOptions options) { + public static ZonedDateTime toZonedDateTime(Object from, Converter converter, ConverterOptions options) { Number number = (Number) from; return Instant.ofEpochMilli(number.longValue()).atZone(options.getSourceZoneId()); } diff --git a/src/main/java/com/cedarsoftware/util/convert/StringConversion.java b/src/main/java/com/cedarsoftware/util/convert/StringConversion.java index af0d334a2..bc17587ac 100644 --- a/src/main/java/com/cedarsoftware/util/convert/StringConversion.java +++ b/src/main/java/com/cedarsoftware/util/convert/StringConversion.java @@ -32,7 +32,7 @@ public class StringConversion { private static final BigDecimal bigDecimalMaxLong = BigDecimal.valueOf(Long.MAX_VALUE); private static final BigDecimal bigDecimalMinLong = BigDecimal.valueOf(Long.MIN_VALUE); - static Byte stringToByte(Object from, Converter converter, ConverterOptions options) { + static Byte toByte(Object from, Converter converter, ConverterOptions options) { String str = ((String) from).trim(); if (str.isEmpty()) { return CommonValues.BYTE_ZERO; @@ -40,7 +40,7 @@ static Byte stringToByte(Object from, Converter converter, ConverterOptions opti try { return Byte.valueOf(str); } catch (NumberFormatException e) { - Byte value = stringToByte(str); + Byte value = toByte(str); if (value == null) { throw new IllegalArgumentException("Value: " + from + " not parseable as a byte value or outside " + Byte.MIN_VALUE + " to " + Byte.MAX_VALUE); } @@ -48,15 +48,15 @@ static Byte stringToByte(Object from, Converter converter, ConverterOptions opti } } - private static Byte stringToByte(String s) { - Long value = stringToLong(s, bigDecimalMinByte, bigDecimalMaxByte); + private static Byte toByte(String s) { + Long value = toLong(s, bigDecimalMinByte, bigDecimalMaxByte); if (value == null) { return null; } return value.byteValue(); } - static Short stringToShort(Object from, Converter converter, ConverterOptions options) { + static Short toShort(Object from, Converter converter, ConverterOptions options) { String str = ((String) from).trim(); if (str.isEmpty()) { return CommonValues.SHORT_ZERO; @@ -64,7 +64,7 @@ static Short stringToShort(Object from, Converter converter, ConverterOptions op try { return Short.valueOf(str); } catch (NumberFormatException e) { - Short value = stringToShort(str); + Short value = toShort(str); if (value == null) { throw new IllegalArgumentException("Value: " + from + " not parseable as a short value or outside " + Short.MIN_VALUE + " to " + Short.MAX_VALUE); } @@ -72,15 +72,15 @@ static Short stringToShort(Object from, Converter converter, ConverterOptions op } } - private static Short stringToShort(String s) { - Long value = stringToLong(s, bigDecimalMinShort, bigDecimalMaxShort); + private static Short toShort(String s) { + Long value = toLong(s, bigDecimalMinShort, bigDecimalMaxShort); if (value == null) { return null; } return value.shortValue(); } - static Integer stringToInteger(Object from, Converter converter, ConverterOptions options) { + static Integer toInt(Object from, Converter converter, ConverterOptions options) { String str = ((String) from).trim(); if (str.isEmpty()) { return CommonValues.INTEGER_ZERO; @@ -88,7 +88,7 @@ static Integer stringToInteger(Object from, Converter converter, ConverterOption try { return Integer.valueOf(str); } catch (NumberFormatException e) { - Integer value = stringToInteger(str); + Integer value = toInt(str); if (value == null) { throw new IllegalArgumentException("Value: " + from + " not parseable as an int value or outside " + Integer.MIN_VALUE + " to " + Integer.MAX_VALUE); } @@ -96,15 +96,15 @@ static Integer stringToInteger(Object from, Converter converter, ConverterOption } } - private static Integer stringToInteger(String s) { - Long value = stringToLong(s, bigDecimalMinInteger, bigDecimalMaxInteger); + private static Integer toInt(String s) { + Long value = toLong(s, bigDecimalMinInteger, bigDecimalMaxInteger); if (value == null) { return null; } return value.intValue(); } - static Long stringToLong(Object from, Converter converter, ConverterOptions options) { + static Long toLong(Object from, Converter converter, ConverterOptions options) { String str = ((String) from).trim(); if (str.isEmpty()) { return CommonValues.LONG_ZERO; @@ -112,7 +112,7 @@ static Long stringToLong(Object from, Converter converter, ConverterOptions opti try { return Long.valueOf(str); } catch (NumberFormatException e) { - Long value = stringToLong(str, bigDecimalMinLong, bigDecimalMaxLong); + Long value = toLong(str, bigDecimalMinLong, bigDecimalMaxLong); if (value == null) { throw new IllegalArgumentException("Value: " + from + " not parseable as a long value or outside " + Long.MIN_VALUE + " to " + Long.MAX_VALUE); } @@ -120,7 +120,7 @@ static Long stringToLong(Object from, Converter converter, ConverterOptions opti } } - private static Long stringToLong(String s, BigDecimal low, BigDecimal high) { + private static Long toLong(String s, BigDecimal low, BigDecimal high) { try { BigDecimal big = new BigDecimal(s); big = big.setScale(0, RoundingMode.DOWN); @@ -133,7 +133,7 @@ private static Long stringToLong(String s, BigDecimal low, BigDecimal high) { } } - static Float stringToFloat(Object from, Converter converter, ConverterOptions options) { + static Float toFloat(Object from, Converter converter, ConverterOptions options) { String str = ((String) from).trim(); if (str.isEmpty()) { return CommonValues.FLOAT_ZERO; @@ -145,7 +145,7 @@ static Float stringToFloat(Object from, Converter converter, ConverterOptions op } } - static Double stringToDouble(Object from, Converter converter, ConverterOptions options) { + static Double toDouble(Object from, Converter converter, ConverterOptions options) { String str = ((String) from).trim(); if (str.isEmpty()) { return CommonValues.DOUBLE_ZERO; @@ -157,28 +157,66 @@ static Double stringToDouble(Object from, Converter converter, ConverterOptions } } - static AtomicInteger stringToAtomicInteger(Object from, Converter converter, ConverterOptions options) { + static AtomicInteger toAtomicInteger(Object from, Converter converter, ConverterOptions options) { String str = ((String) from).trim(); if (str.isEmpty()) { return new AtomicInteger(0); } - Integer integer = stringToInteger(str); + Integer integer = toInt(str); if (integer == null) { throw new IllegalArgumentException("Value: " + from + " not parseable as an AtomicInteger value or outside " + Integer.MIN_VALUE + " to " + Integer.MAX_VALUE); } return new AtomicInteger(integer); } - static AtomicLong stringToAtomicLong(Object from, Converter converter, ConverterOptions options) { + static AtomicLong toAtomicLong(Object from, Converter converter, ConverterOptions options) { String str = ((String) from).trim(); if (str.isEmpty()) { return new AtomicLong(0L); } - Long value = stringToLong(str, bigDecimalMinLong, bigDecimalMaxLong); + Long value = toLong(str, bigDecimalMinLong, bigDecimalMaxLong); if (value == null) { throw new IllegalArgumentException("Value: " + from + " not parseable as an AtomicLong value or outside " + Long.MIN_VALUE + " to " + Long.MAX_VALUE); } return new AtomicLong(value); } + + public static Boolean toBoolean(Object from, Converter converter, ConverterOptions options) { + String str = ((String) from).trim(); + if (str.isEmpty()) { + return false; + } + // faster equals check "true" and "false" + if ("true".equals(str)) { + return true; + } else if ("false".equals(str)) { + return false; + } + return "true".equalsIgnoreCase(str); + } + + public static char toCharacter(Object from, Converter converter, ConverterOptions options) { + String str = ((String) from); + if (str.isEmpty()) { + return (char) 0; + } + if (str.length() == 1) { + return str.charAt(0); + } + // Treat as a String number, like "65" = 'A' + return (char) Integer.parseInt(str.trim()); + } + + public static BigDecimal toBigDecimal(Object from, Converter converter, ConverterOptions options) { + String str = ((String) from).trim(); + if (str.isEmpty()) { + return BigDecimal.ZERO; + } + try { + return new BigDecimal(str); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Value: " + from + " not parseable as a BigDecimal value."); + } + } } diff --git a/src/test/java/com/cedarsoftware/util/convert/ConverterTest.java b/src/test/java/com/cedarsoftware/util/convert/ConverterTest.java index f63ff74e8..1671736c6 100644 --- a/src/test/java/com/cedarsoftware/util/convert/ConverterTest.java +++ b/src/test/java/com/cedarsoftware/util/convert/ConverterTest.java @@ -939,7 +939,8 @@ void testAtomicInteger(Object value, int expectedResult) @Test void testAtomicInteger_withEmptyString() { AtomicInteger converted = this.converter.convert("", AtomicInteger.class); - assertThat(converted).isNull(); + //TODO: Do we want nullable types to default to zero + assertThat(converted.get()).isEqualTo(0); } private static Stream testAtomicIntegerParams_withBooleanTypes() { @@ -2306,10 +2307,10 @@ void testCharacterSupport() assert 65 == this.converter.convert('A', BigInteger.class).longValue(); assert 65 == this.converter.convert('A', BigDecimal.class).longValue(); - assert '1' == this.converter.convert(true, char.class); - assert '0' == this.converter.convert(false, char.class); - assert '1' == this.converter.convert(new AtomicBoolean(true), char.class); - assert '0' == this.converter.convert(new AtomicBoolean(false), char.class); + assert 1 == this.converter.convert(true, char.class); + assert 0 == this.converter.convert(false, char.class); + assert 1 == this.converter.convert(new AtomicBoolean(true), char.class); + assert 0 == this.converter.convert(new AtomicBoolean(false), char.class); assert 'z' == this.converter.convert('z', char.class); assert 0 == this.converter.convert("", char.class); assert 0 == this.converter.convert("", Character.class);