From 4217ef07de123d4210ba6296ae2c982369125ef1 Mon Sep 17 00:00:00 2001 From: Barak Schuster Date: Wed, 23 Nov 2016 15:25:19 +0200 Subject: [PATCH 1/2] support convertion to and from String representations of java.time.Duration and java.time.Period --- .../data/convert/Jsr310Converters.java | 64 +++++++++++++++++-- .../convert/Jsr310ConvertersUnitTests.java | 38 +++++++++-- 2 files changed, 92 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/springframework/data/convert/Jsr310Converters.java b/src/main/java/org/springframework/data/convert/Jsr310Converters.java index 262017d681..6a74b645c8 100644 --- a/src/main/java/org/springframework/data/convert/Jsr310Converters.java +++ b/src/main/java/org/springframework/data/convert/Jsr310Converters.java @@ -19,11 +19,7 @@ import static java.time.LocalDateTime.*; import static java.time.ZoneId.*; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.ZoneId; +import java.time.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -66,6 +62,10 @@ public abstract class Jsr310Converters { converters.add(InstantToDateConverter.INSTANCE); converters.add(ZoneIdToStringConverter.INSTANCE); converters.add(StringToZoneIdConverter.INSTANCE); + converters.add(DurationToStringConverter.INSTANCE); + converters.add(StringToDurationConverter.INSTANCE); + converters.add(PeriodToStringConverter.INSTANCE); + converters.add(StringToPeriodConverter.INSTANCE); return converters; } @@ -181,4 +181,58 @@ public ZoneId convert(String source) { return ZoneId.of(source); } } + + /** + * enable jsr-310 {@link java.time.Duration} write + */ + @WritingConverter + public static enum DurationToStringConverter implements Converter { + INSTANCE; + + @Override + public String convert(Duration duration) { + return duration.toString(); + } + } + + /** + * enable jsr-310 {@link java.time.Duration} read + */ + @ReadingConverter + public static enum StringToDurationConverter implements Converter { + + INSTANCE; + + @Override + public Duration convert(String s) { + return Duration.parse(s); + } + } + + /** + * enable jsr-310 {@link java.time.Period} write + */ + @WritingConverter + public static enum PeriodToStringConverter implements Converter { + INSTANCE; + + @Override + public String convert(Period period) { + return period.toString(); + } + } + + /** + * enable jsr-310 {@link java.time.Period} read + */ + @ReadingConverter + public static enum StringToPeriodConverter implements Converter { + + INSTANCE; + + @Override + public Period convert(String s) { + return Period.parse(s); + } + } } diff --git a/src/test/java/org/springframework/data/convert/Jsr310ConvertersUnitTests.java b/src/test/java/org/springframework/data/convert/Jsr310ConvertersUnitTests.java index 3c6c4aadb6..516bb15334 100644 --- a/src/test/java/org/springframework/data/convert/Jsr310ConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/convert/Jsr310ConvertersUnitTests.java @@ -19,11 +19,7 @@ import static org.junit.Assert.*; import java.text.SimpleDateFormat; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.ZoneId; +import java.time.*; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -143,6 +139,38 @@ public void convertsZoneIdToStringAndBack() { } } + @Test + public void convertsDurationToStringAndBack() { + + Map ids = new HashMap(); + ids.put("PT240H", Duration.ofDays(10)); + ids.put("PT2H", Duration.ofHours(2)); + ids.put("PT3M", Duration.ofMinutes(3)); + ids.put("PT4S", Duration.ofSeconds(4)); + ids.put("PT0.005S", Duration.ofMillis(5)); + ids.put("PT0.000000006S", Duration.ofNanos(6)); + + + for (Entry entry : ids.entrySet()) { + assertThat(CONVERSION_SERVICE.convert(entry.getValue(), String.class), is(entry.getKey())); + assertThat(CONVERSION_SERVICE.convert(entry.getKey(), Duration.class), is(entry.getValue())); + } + } + + @Test + public void convertsPeriodToStringAndBack() { + + Map ids = new HashMap(); + ids.put("P2D", Period.ofDays(2)); + ids.put("P21D", Period.ofWeeks(3)); + ids.put("P4M", Period.ofMonths(4)); + ids.put("P5Y", Period.ofYears(5)); + + for (Entry entry : ids.entrySet()) { + assertThat(CONVERSION_SERVICE.convert(entry.getValue(), String.class), is(entry.getKey())); + assertThat(CONVERSION_SERVICE.convert(entry.getKey(), Period.class), is(entry.getValue())); + } + } private static String format(Date date, String format) { return new SimpleDateFormat(format).format(date); } From e64cffc26db892fd6bfa85fd77775f3b4e2bf825 Mon Sep 17 00:00:00 2001 From: Barak Schuster Date: Wed, 23 Nov 2016 15:28:26 +0200 Subject: [PATCH 2/2] add author --- .../springframework/data/convert/Jsr310ConvertersUnitTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/springframework/data/convert/Jsr310ConvertersUnitTests.java b/src/test/java/org/springframework/data/convert/Jsr310ConvertersUnitTests.java index 516bb15334..a181b871fe 100644 --- a/src/test/java/org/springframework/data/convert/Jsr310ConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/convert/Jsr310ConvertersUnitTests.java @@ -33,7 +33,7 @@ /** * Unit tests for {@link Jsr310Converters}. * - * @author Oliver Gierke + * @author Oliver Gierke & Barak Schoster */ public class Jsr310ConvertersUnitTests {