From 620586af3bc329caa3442872f85c453b5c6a344d Mon Sep 17 00:00:00 2001 From: Subhashni Balakrishnan Date: Tue, 11 Apr 2017 16:09:04 -0700 Subject: [PATCH] DATACOUCH-90 Polishing Add modified couchbase specific jsr310 converters which converts to number formats instead of date objects which cannot be handled by the client. Original pull request: #139. --- .../convert/CouchbaseJsr310Converters.java | 239 ++++++++++++++++++ .../core/convert/CustomConversions.java | 3 +- .../MappingCouchbaseConverterTests.java | 4 +- 3 files changed, 242 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/springframework/data/couchbase/core/convert/CouchbaseJsr310Converters.java diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/CouchbaseJsr310Converters.java b/src/main/java/org/springframework/data/couchbase/core/convert/CouchbaseJsr310Converters.java new file mode 100644 index 00000000..9b04c141 --- /dev/null +++ b/src/main/java/org/springframework/data/couchbase/core/convert/CouchbaseJsr310Converters.java @@ -0,0 +1,239 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.couchbase.core.convert; + +import static java.time.Instant.ofEpochMilli; +import static java.time.LocalDateTime.ofInstant; +import static java.time.ZoneId.systemDefault; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.data.convert.ReadingConverter; +import org.springframework.data.convert.WritingConverter; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.Period; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * Helper class to register JSR-310 specific {@link Converter} implementations. + * + * @author Oliver Gierke + * @author Barak Schoster + * @author Christoph Strobl + * @author Subhashni Balakrishnan + */ +public final class CouchbaseJsr310Converters { + + private CouchbaseJsr310Converters() { + + } + + /** + * Returns the converters to be registered + * + * @return + */ + public static Collection> getConvertersToRegister() { + List> converters = new ArrayList<>(); + converters.add(NumberToLocalDateTimeConverter.INSTANCE); + converters.add(LocalDateTimeToLongConverter.INSTANCE); + converters.add(NumberToLocalDateConverter.INSTANCE); + converters.add(LocalDateToLongConverter.INSTANCE); + converters.add(NumberToLocalTimeConverter.INSTANCE); + converters.add(LocalTimeToLongConverter.INSTANCE); + converters.add(NumberToInstantConverter.INSTANCE); + converters.add(InstantToLongConverter.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; + } + + @ReadingConverter + public enum NumberToLocalDateTimeConverter implements Converter { + + INSTANCE; + + @Override + public LocalDateTime convert(Number source) { + return source == null ? null : ofInstant( + DateConverters.NumberToDateConverter.INSTANCE.convert(source) + .toInstant(), systemDefault()); + } + } + + + @WritingConverter + public enum LocalDateTimeToLongConverter implements Converter { + + INSTANCE; + + @Override + public Long convert(LocalDateTime source) { + return source == null ? null : DateConverters.DateToLongConverter.INSTANCE.convert( + Date.from(source.atZone(systemDefault()).toInstant())); + } + } + + @ReadingConverter + public enum NumberToLocalDateConverter implements Converter { + + INSTANCE; + + @Override + public LocalDate convert(Number source) { + return source == null ? null : ofInstant(ofEpochMilli( + DateConverters.NumberToDateConverter.INSTANCE.convert(source).getTime()), + systemDefault()).toLocalDate(); + } + } + + @WritingConverter + public enum LocalDateToLongConverter implements Converter { + + INSTANCE; + + @Override + public Long convert(LocalDate source) { + return source == null ? null : DateConverters.DateToLongConverter.INSTANCE.convert( + Date.from(source.atStartOfDay(systemDefault()).toInstant())); + } + } + + @ReadingConverter + public enum NumberToLocalTimeConverter implements Converter { + + INSTANCE; + + @Override + public LocalTime convert(Number source) { + return source == null ? null : ofInstant(ofEpochMilli( + DateConverters.NumberToDateConverter.INSTANCE.convert(source) + .getTime()), systemDefault()).toLocalTime(); + } + } + + @WritingConverter + public enum LocalTimeToLongConverter implements Converter { + + INSTANCE; + + @Override + public Long convert(LocalTime source) { + return source == null ? null : DateConverters.DateToLongConverter.INSTANCE.convert( + Date.from(source.atDate(LocalDate.now()).atZone(systemDefault()).toInstant())); + } + } + + @ReadingConverter + public enum NumberToInstantConverter implements Converter { + + INSTANCE; + + @Override + public Instant convert(Number source) { + return source == null ? null : DateConverters.NumberToDateConverter.INSTANCE.convert(source).toInstant(); + } + } + + @WritingConverter + public enum InstantToLongConverter implements Converter { + + INSTANCE; + + @Override + public Long convert(Instant source) { + return source == null ? null : DateConverters.DateToLongConverter.INSTANCE.convert(Date.from(source.atZone(systemDefault()).toInstant())); + } + } + + @WritingConverter + public enum ZoneIdToStringConverter implements Converter { + + INSTANCE; + + @Override + public String convert(ZoneId source) { + return source.toString(); + } + } + + @ReadingConverter + public enum StringToZoneIdConverter implements Converter { + + INSTANCE; + + @Override + public ZoneId convert(String source) { + return ZoneId.of(source); + } + } + + @WritingConverter + public enum DurationToStringConverter implements Converter { + + INSTANCE; + + @Override + public String convert(Duration duration) { + return duration.toString(); + } + } + + @ReadingConverter + public enum StringToDurationConverter implements Converter { + + INSTANCE; + + @Override + public Duration convert(String s) { + return Duration.parse(s); + } + } + + @WritingConverter + public enum PeriodToStringConverter implements Converter { + + INSTANCE; + + @Override + public String convert(Period period) { + return period.toString(); + } + } + + @ReadingConverter + public enum StringToPeriodConverter implements Converter { + + INSTANCE; + + @Override + public Period convert(String s) { + return Period.parse(s); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/CustomConversions.java b/src/main/java/org/springframework/data/couchbase/core/convert/CustomConversions.java index d33defe0..a006d827 100644 --- a/src/main/java/org/springframework/data/couchbase/core/convert/CustomConversions.java +++ b/src/main/java/org/springframework/data/couchbase/core/convert/CustomConversions.java @@ -36,7 +36,6 @@ import org.springframework.data.convert.ReadingConverter; import org.springframework.data.convert.WritingConverter; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.util.Assert; -import org.springframework.data.convert.Jsr310Converters; /** * Value object to capture custom conversion. @@ -90,7 +89,7 @@ public class CustomConversions { this.converters = new ArrayList(); this.converters.addAll(converters); this.converters.addAll(DateConverters.getConvertersToRegister()); - this.converters.addAll(Jsr310Converters.getConvertersToRegister()); + this.converters.addAll(CouchbaseJsr310Converters.getConvertersToRegister()); for (Object converter : this.converters) { registerConversion(converter); diff --git a/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java b/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java index fdd323e2..9068acbb 100644 --- a/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java +++ b/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java @@ -34,7 +34,6 @@ import java.util.TreeMap; import java.util.TreeSet; import java.time.LocalDateTime; -import org.springframework.data.convert.Jsr310Converters.LocalDateTimeToDateConverter; import org.junit.Test; import org.junit.runner.RunWith; @@ -44,6 +43,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.convert.ReadingConverter; import org.springframework.data.convert.WritingConverter; import org.springframework.data.couchbase.UnitTestApplicationConfig; +import org.springframework.data.couchbase.core.convert.CouchbaseJsr310Converters.LocalDateTimeToLongConverter; import org.springframework.data.couchbase.core.convert.CustomConversions; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.mapping.model.MappingException; @@ -480,7 +480,7 @@ public class MappingCouchbaseConverterTests { converter.write(entity, converted); assertEquals(created.getTime(), converted.getPayload().get("created")); assertEquals(modified.getTimeInMillis() / 1000, converted.getPayload().get("modified")); - LocalDateTimeToDateConverter localDateTimeToDateconverter = LocalDateTimeToDateConverter.INSTANCE; + LocalDateTimeToLongConverter localDateTimeToDateconverter = LocalDateTimeToLongConverter.INSTANCE; assertEquals(localDateTimeToDateconverter.convert(deleted), converted.getPayload().get("deleted")); DateEntity read = converter.read(DateEntity.class, converted);