From 3dacaf64d802059307af0f41d4601716e2971e9e Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Sat, 1 Sep 2018 18:34:56 +0200 Subject: [PATCH] DATACMNS-1384 - Support for j.u.Date and j.s.Timestamp in AnnotationRevisionMetadata. We now properly convert legacy Date instances into Instants to expose the revision date. Support for Timestamp is transparent as it extends Date. --- .../history/AnnotationRevisionMetadata.java | 5 +++ .../AnnotationRevisionMetadataUnitTests.java | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java b/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java index 23d80acfd..17fa6ec30 100755 --- a/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java +++ b/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java @@ -19,6 +19,7 @@ import java.lang.annotation.Annotation; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.util.Date; import java.util.Optional; import org.springframework.data.util.AnnotationDetectionFieldCallback; @@ -128,6 +129,10 @@ public class AnnotationRevisionMetadata> implem return Instant.ofEpochMilli((Long) timestamp); } + if (Date.class.isInstance(timestamp)) { + return Date.class.cast(timestamp).toInstant(); + } + throw new IllegalArgumentException(String.format("Can't convert %s to Instant!", timestamp)); } } diff --git a/src/test/java/org/springframework/data/history/AnnotationRevisionMetadataUnitTests.java b/src/test/java/org/springframework/data/history/AnnotationRevisionMetadataUnitTests.java index e661711ec..d18ac58c3 100644 --- a/src/test/java/org/springframework/data/history/AnnotationRevisionMetadataUnitTests.java +++ b/src/test/java/org/springframework/data/history/AnnotationRevisionMetadataUnitTests.java @@ -17,9 +17,11 @@ package org.springframework.data.history; import static org.assertj.core.api.Assertions.*; +import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.util.Date; import org.assertj.core.api.SoftAssertions; import org.junit.Test; @@ -126,6 +128,30 @@ public class AnnotationRevisionMetadataUnitTests { softly.assertAll(); } + @Test // DATACMNS-1384 + public void supportsTimestampRevisionInstant() { + + SampleWithTimestamp sample = new SampleWithTimestamp(); + Instant now = Instant.now(); + sample.revision = Timestamp.from(now); + + RevisionMetadata metadata = getMetadata(sample); + + assertThat(metadata.getRequiredRevisionInstant()).isEqualTo(now); + } + + @Test // DATACMNS-1384 + public void supportsDateRevisionInstant() { + + SampleWithDate sample = new SampleWithDate(); + Date date = new Date(); + sample.revision = date; + + RevisionMetadata metadata = getMetadata(sample); + + assertThat(metadata.getRequiredRevisionInstant()).isEqualTo(date.toInstant()); + } + private static RevisionMetadata getMetadata(Object sample) { return new AnnotationRevisionMetadata<>(sample, Autowired.class, Reference.class); } @@ -147,4 +173,14 @@ public class AnnotationRevisionMetadataUnitTests { @Autowired Long revisionNumber; @Reference long revisionLong; } + + // DATACMNS-1384 + + static class SampleWithTimestamp { + @Reference Timestamp revision; + } + + static class SampleWithDate { + @Reference Date revision; + } }