From 376bfb811d83f45c150f68a9d357220f0842b1a8 Mon Sep 17 00:00:00 2001 From: John DeRegnaucourt Date: Sat, 3 Feb 2024 13:31:31 -0500 Subject: [PATCH] Added Year support to short and float. Add Map support to OffsetTime and OffsetDateTime --- .../cedarsoftware/util/convert/Converter.java | 4 ++ .../util/convert/MapConversions.java | 42 +++++++++++++++++++ .../util/convert/YearConversions.java | 18 ++++---- 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cedarsoftware/util/convert/Converter.java b/src/main/java/com/cedarsoftware/util/convert/Converter.java index aff236ca..e6ed6a93 100644 --- a/src/main/java/com/cedarsoftware/util/convert/Converter.java +++ b/src/main/java/com/cedarsoftware/util/convert/Converter.java @@ -139,6 +139,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Number.class, Short.class), NumberConversions::toShort); DEFAULT_FACTORY.put(pair(Map.class, Short.class), MapConversions::toShort); DEFAULT_FACTORY.put(pair(String.class, Short.class), StringConversions::toShort); + DEFAULT_FACTORY.put(pair(Year.class, Short.class), YearConversions::toShort); // toInteger DEFAULT_FACTORY.put(pair(Void.class, int.class), NumberConversions::toIntZero); @@ -212,6 +213,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Number.class, Float.class), NumberConversions::toFloat); DEFAULT_FACTORY.put(pair(Map.class, Float.class), MapConversions::toFloat); DEFAULT_FACTORY.put(pair(String.class, Float.class), StringConversions::toFloat); + DEFAULT_FACTORY.put(pair(Year.class, Float.class), YearConversions::toFloat); // Double/double conversions supported DEFAULT_FACTORY.put(pair(Void.class, double.class), NumberConversions::toDoubleZero); @@ -576,12 +578,14 @@ private static void buildFactoryConversions() { // toOffsetDateTime DEFAULT_FACTORY.put(pair(Void.class, OffsetDateTime.class), VoidConversions::toNull); DEFAULT_FACTORY.put(pair(OffsetDateTime.class, OffsetDateTime.class), Converter::identity); + DEFAULT_FACTORY.put(pair(Map.class, OffsetDateTime.class), MapConversions::toOffsetDateTime); DEFAULT_FACTORY.put(pair(String.class, OffsetDateTime.class), StringConversions::toOffsetDateTime); // toOffsetTime DEFAULT_FACTORY.put(pair(Void.class, OffsetTime.class), VoidConversions::toNull); DEFAULT_FACTORY.put(pair(OffsetTime.class, OffsetTime.class), Converter::identity); DEFAULT_FACTORY.put(pair(OffsetDateTime.class, OffsetTime.class), OffsetDateTimeConversions::toOffsetTime); + DEFAULT_FACTORY.put(pair(Map.class, OffsetTime.class), MapConversions::toOffsetTime); DEFAULT_FACTORY.put(pair(String.class, OffsetTime.class), StringConversions::toOffsetTime); // UUID conversions supported diff --git a/src/main/java/com/cedarsoftware/util/convert/MapConversions.java b/src/main/java/com/cedarsoftware/util/convert/MapConversions.java index 525e3944..86a9e488 100644 --- a/src/main/java/com/cedarsoftware/util/convert/MapConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/MapConversions.java @@ -9,7 +9,10 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; import java.time.Year; +import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.Calendar; import java.util.Date; @@ -58,6 +61,8 @@ public final class MapConversions { private static final String SECONDS = "seconds"; private static final String NANO = "nano"; private static final String NANOS = "nanos"; + private static final String OFFSET_HOUR = "offsetHour"; + private static final String OFFSET_MINUTE = "offsetMinute"; private static final String MOST_SIG_BITS = "mostSigBits"; private static final String LEAST_SIG_BITS = "leastSigBits"; @@ -205,6 +210,43 @@ static LocalTime toLocalTime(Object from, Converter converter, ConverterOptions } } + private static final String[] OFFSET_TIME_PARAMS = new String[] { HOUR, MINUTE, SECOND, NANO, OFFSET_HOUR, OFFSET_MINUTE }; + static OffsetTime toOffsetTime(Object from, Converter converter, ConverterOptions options) { + Map map = (Map) from; + if (map.containsKey(HOUR) && map.containsKey(MINUTE)) { + int hour = converter.convert(map.get(HOUR), int.class, options); + int minute = converter.convert(map.get(MINUTE), int.class, options); + int second = converter.convert(map.get(SECOND), int.class, options); + int nano = converter.convert(map.get(NANO), int.class, options); + int offsetHour = converter.convert(map.get(OFFSET_HOUR), int.class, options); + int offsetMinute = converter.convert(map.get(OFFSET_MINUTE), int.class, options); + ZoneOffset zoneOffset = ZoneOffset.ofHoursMinutes(offsetHour, offsetMinute); + return OffsetTime.of(hour, minute, second, nano, zoneOffset); + } else { + return fromValueForMultiKey(map, converter, options, OffsetTime.class, OFFSET_TIME_PARAMS); + } + } + + private static final String[] OFFSET_DATE_TIME_PARAMS = new String[] { YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, NANO, OFFSET_HOUR, OFFSET_MINUTE }; + static OffsetDateTime toOffsetDateTime(Object from, Converter converter, ConverterOptions options) { + Map map = (Map) from; + if (map.containsKey(YEAR) && map.containsKey(OFFSET_HOUR)) { + int year = converter.convert(map.get(YEAR), int.class, options); + int month = converter.convert(map.get(MONTH), int.class, options); + int day = converter.convert(map.get(DAY), int.class, options); + int hour = converter.convert(map.get(HOUR), int.class, options); + int minute = converter.convert(map.get(MINUTE), int.class, options); + int second = converter.convert(map.get(SECOND), int.class, options); + int nano = converter.convert(map.get(NANO), int.class, options); + int offsetHour = converter.convert(map.get(OFFSET_HOUR), int.class, options); + int offsetMinute = converter.convert(map.get(OFFSET_MINUTE), int.class, options); + ZoneOffset zoneOffset = ZoneOffset.ofHoursMinutes(offsetHour, offsetMinute); + return OffsetDateTime.of(year, month, day, hour, minute, second, nano, zoneOffset); + } else { + return fromValueForMultiKey(map, converter, options, OffsetDateTime.class, OFFSET_DATE_TIME_PARAMS); + } + } + static LocalDateTime toLocalDateTime(Object from, Converter converter, ConverterOptions options) { return fromValue(from, converter, options, LocalDateTime.class); } diff --git a/src/main/java/com/cedarsoftware/util/convert/YearConversions.java b/src/main/java/com/cedarsoftware/util/convert/YearConversions.java index 05052e7e..1a76cfe4 100644 --- a/src/main/java/com/cedarsoftware/util/convert/YearConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/YearConversions.java @@ -2,17 +2,7 @@ import java.math.BigDecimal; import java.math.BigInteger; -import java.sql.Timestamp; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; import java.time.Year; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -28,6 +18,10 @@ static long toLong(Object from, Converter converter, ConverterOptions options) { return toInt(from); } + static short toShort(Object from, Converter converter, ConverterOptions options) { + return (short) toInt(from); + } + static int toInt(Object from, Converter converter, ConverterOptions options) { return toInt(from); } @@ -44,6 +38,10 @@ static double toDouble(Object from, Converter converter, ConverterOptions option return toInt(from); } + static float toFloat(Object from, Converter converter, ConverterOptions options) { + return toInt(from); + } + static boolean toBoolean(Object from, Converter converter, ConverterOptions options) { return toInt(from) == 0; }