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..2e673426 --- /dev/null +++ b/src/main/java/org/springframework/data/couchbase/core/convert/CouchbaseJsr310Converters.java @@ -0,0 +1,246 @@ +/* + * 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 org.springframework.util.ClassUtils; + +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.*; + +/** + * Helper class to register JSR-310 specific {@link Converter} implementations for Java 8. + * + * @author Oliver Gierke + * @author Barak Schoster + * @author Christoph Strobl + * @author Subhashni Balakrishnan + */ +public final class CouchbaseJsr310Converters { + + private static final boolean JAVA_8_IS_PRESENT = ClassUtils.isPresent("java.time.LocalDateTime", + CouchbaseJsr310Converters.class.getClassLoader()); + + private CouchbaseJsr310Converters() { + + } + + /** + * Returns the converters to be registered if Java 8 is present. + * + * @return + */ + public static Collection> getConvertersToRegister() { + + if (!JAVA_8_IS_PRESENT) { + return Collections.emptySet(); + } + + 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);