From 483a6027e0918deb636c04cc24ba3d54b08eb0fd Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Fri, 18 Dec 2020 13:58:11 +0100 Subject: [PATCH] DATAGRAPH-1466 - Add support for storing java.util.Timezone and java.time.ZoneId. --- .../neo4j/core/convert/AdditionalTypes.java | 28 +++++++++++++++++++ .../conversion/Neo4jConversionsITBase.java | 7 ++++- .../ThingWithAllAdditionalTypes.java | 6 ++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/neo4j/core/convert/AdditionalTypes.java b/src/main/java/org/springframework/data/neo4j/core/convert/AdditionalTypes.java index ea650a91c..bb5949cb3 100644 --- a/src/main/java/org/springframework/data/neo4j/core/convert/AdditionalTypes.java +++ b/src/main/java/org/springframework/data/neo4j/core/convert/AdditionalTypes.java @@ -22,6 +22,7 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.time.Instant; +import java.time.ZoneId; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAmount; @@ -33,6 +34,7 @@ import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.TimeZone; import java.util.UUID; import org.neo4j.driver.Value; @@ -94,10 +96,36 @@ final class AdditionalTypes { hlp.add(ConverterBuilder.reading(Value.class, UUID.class, AdditionalTypes::asUUID).andWriting(AdditionalTypes::value)); hlp.add(ConverterBuilder.reading(Value.class, URL.class, AdditionalTypes::asURL).andWriting(AdditionalTypes::value)); hlp.add(ConverterBuilder.reading(Value.class, URI.class, AdditionalTypes::asURI).andWriting(AdditionalTypes::value)); + hlp.add(ConverterBuilder.reading(Value.class, TimeZone.class, AdditionalTypes::asTimeZone).andWriting(AdditionalTypes::value)); + hlp.add(ConverterBuilder.reading(Value.class, ZoneId.class, AdditionalTypes::asZoneId).andWriting(AdditionalTypes::value)); CONVERTERS = Collections.unmodifiableList(hlp); } + static TimeZone asTimeZone(Value value) { + return TimeZone.getTimeZone(value.asString()); + } + + static Value value(TimeZone timeZone) { + if (timeZone == null) { + return Values.NULL; + } + + return Values.value(timeZone.getID()); + } + + static ZoneId asZoneId(Value value) { + return ZoneId.of(value.asString()); + } + + static Value value(ZoneId zoneId) { + if (zoneId == null) { + return Values.NULL; + } + + return Values.value(zoneId.getId()); + } + static UUID asUUID(Value value) { return UUID.fromString(value.asString()); } diff --git a/src/test/java/org/springframework/data/neo4j/integration/shared/conversion/Neo4jConversionsITBase.java b/src/test/java/org/springframework/data/neo4j/integration/shared/conversion/Neo4jConversionsITBase.java index c55d68969..975d84d6e 100644 --- a/src/test/java/org/springframework/data/neo4j/integration/shared/conversion/Neo4jConversionsITBase.java +++ b/src/test/java/org/springframework/data/neo4j/integration/shared/conversion/Neo4jConversionsITBase.java @@ -121,6 +121,8 @@ public abstract class Neo4jConversionsITBase { hlp.put("anArrayOfEnums", new SomeEnum[] { SomeEnum.ValueA, SomeEnum.ValueB }); hlp.put("aCollectionOfEnums", Arrays.asList(SomeEnum.ValueC, SomeEnum.TheUsualMisfit)); hlp.put("listOfDoubles", Arrays.asList(1.0)); + hlp.put("aTimeZone", TimeZone.getTimeZone("America/Los_Angeles")); + hlp.put("aZoneId", ZoneId.of("America/New_York")); ADDITIONAL_TYPES = Collections.unmodifiableMap(hlp); } @@ -226,7 +228,10 @@ public abstract class Neo4jConversionsITBase { + " n.aURL = 'https://www.test.com'," + " n.aURI = 'urn:isbn:9783864905254'," + " n.anEnum = 'TheUsualMisfit'," + " n.anArrayOfEnums = ['ValueA', 'ValueB']," - + " n.aCollectionOfEnums = ['ValueC', 'TheUsualMisfit']" + " RETURN id(n) AS id", parameters) + + " n.aCollectionOfEnums = ['ValueC', 'TheUsualMisfit']," + + " n.aTimeZone = 'America/Los_Angeles', " + + " n.aZoneId = 'America/New_York'" + + " RETURN id(n) AS id", parameters) .single().get("id").asLong(); parameters = new HashMap<>(); diff --git a/src/test/java/org/springframework/data/neo4j/integration/shared/conversion/ThingWithAllAdditionalTypes.java b/src/test/java/org/springframework/data/neo4j/integration/shared/conversion/ThingWithAllAdditionalTypes.java index 63246fb70..0ecd99fa0 100644 --- a/src/test/java/org/springframework/data/neo4j/integration/shared/conversion/ThingWithAllAdditionalTypes.java +++ b/src/test/java/org/springframework/data/neo4j/integration/shared/conversion/ThingWithAllAdditionalTypes.java @@ -28,10 +28,12 @@ import java.net.URL; import java.time.Duration; import java.time.Instant; import java.time.Period; +import java.time.ZoneId; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.TimeZone; import java.util.UUID; import org.springframework.data.neo4j.core.schema.GeneratedValue; @@ -112,4 +114,8 @@ public class ThingWithAllAdditionalTypes { private List listOfDoubles; private List aCollectionOfEnums; + + private TimeZone aTimeZone; + + private ZoneId aZoneId; }