From b52e3438f9bd0ce130fa1a8a646e8bad0a4d8c13 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 | 37 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java b/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java index ab30f27d6b..45a23f6bd0 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.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.util.Date; import java.util.Optional; import org.springframework.data.util.AnnotationDetectionFieldCallback; @@ -117,6 +118,10 @@ private static Instant convertToInstant(Object timestamp) { 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 9f9cb139e1..1413e0c71d 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 @@ 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; @@ -108,6 +110,31 @@ public void exposesRevisionDateForLong() { 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.getRevisionDate()).hasValue(LocalDateTime.ofInstant(now, ZoneOffset.systemDefault())); + } + + @Test // DATACMNS-1384 + public void supportsDateRevisionInstant() { + + SampleWithDate sample = new SampleWithDate(); + Date date = new Date(); + sample.revision = date; + + RevisionMetadata metadata = getMetadata(sample); + + assertThat(metadata.getRevisionDate()) + .hasValue(LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.systemDefault())); + } + private static RevisionMetadata getMetadata(Object sample) { return new AnnotationRevisionMetadata<>(sample, Autowired.class, Reference.class); } @@ -129,4 +156,14 @@ static class SampleWithLong { @Autowired Long revisionNumber; @Reference long revisionLong; } + + // DATACMNS-1384 + + static class SampleWithTimestamp { + @Reference Timestamp revision; + } + + static class SampleWithDate { + @Reference Date revision; + } }