From 5901a2713023d68d63a0b6665226bb62093ada02 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Fri, 6 Apr 2018 16:07:53 +0200 Subject: [PATCH] DATACMNS-1290 - Added support for timestamp values of type long. The type long or Long is actually required for custom revision entities by Envers. See also: https://github.com/spring-projects/spring-data-envers/issues/122 Original pull request: #282. --- .../history/AnnotationRevisionMetadata.java | 31 +++++++++---------- .../AnnotationRevisionMetadataUnitTests.java | 26 ++++++++++++++++ 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java b/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java index 868d536e1..23d80acfd 100755 --- a/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java +++ b/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java @@ -19,7 +19,6 @@ import java.lang.annotation.Annotation; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; -import java.time.temporal.TemporalAccessor; import java.util.Optional; import org.springframework.data.util.AnnotationDetectionFieldCallback; @@ -39,7 +38,7 @@ public class AnnotationRevisionMetadata> implem private final Object entity; private final Lazy> revisionNumber; - private final Lazy> revisionDate; + private final Lazy> revisionDate; /** * Creates a new {@link AnnotationRevisionMetadata} inspecting the given entity for the given annotations. If no @@ -106,29 +105,29 @@ public class AnnotationRevisionMetadata> implem }); } - private static LocalDateTime convertToLocalDateTime(TemporalAccessor temporalAccessor) { + private static LocalDateTime convertToLocalDateTime(Object timestamp) { - if (temporalAccessor instanceof LocalDateTime) { - return (LocalDateTime) temporalAccessor; + if (timestamp instanceof LocalDateTime) { + return (LocalDateTime) timestamp; } - if (temporalAccessor instanceof Instant) { - return LocalDateTime.ofInstant((Instant) temporalAccessor, ZoneOffset.systemDefault()); - } - - throw new IllegalArgumentException(String.format("Can't convert %s to LocalDateTime!", temporalAccessor)); + return LocalDateTime.ofInstant(convertToInstant(timestamp), ZoneOffset.systemDefault()); } - private static Instant convertToInstant(TemporalAccessor temporalAccessor) { + private static Instant convertToInstant(Object timestamp) { - if (temporalAccessor instanceof Instant) { - return (Instant) temporalAccessor; + if (timestamp instanceof Instant) { + return (Instant) timestamp; } - if (temporalAccessor instanceof LocalDateTime) { - return ((LocalDateTime) temporalAccessor).atZone(ZoneOffset.systemDefault()).toInstant(); + if (timestamp instanceof LocalDateTime) { + return ((LocalDateTime) timestamp).atZone(ZoneOffset.systemDefault()).toInstant(); } - throw new IllegalArgumentException(String.format("Can't convert %s to LocalDateTime!", temporalAccessor)); + if (timestamp instanceof Long) { + return Instant.ofEpochMilli((Long) timestamp); + } + + 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 7d247237e..e661711ec 100644 --- a/src/test/java/org/springframework/data/history/AnnotationRevisionMetadataUnitTests.java +++ b/src/test/java/org/springframework/data/history/AnnotationRevisionMetadataUnitTests.java @@ -106,6 +106,26 @@ public class AnnotationRevisionMetadataUnitTests { softly.assertAll(); } + @Test // DATACMNS-1290 + public void exposesRevisionDateAndInstantForLong() { + + SampleWithLong sample = new SampleWithLong(); + sample.revisionLong = 4711L; + + Instant expectedInstant = Instant.ofEpochMilli(sample.revisionLong); + LocalDateTime expectedLocalDateTime = LocalDateTime.ofInstant(expectedInstant, ZoneOffset.systemDefault()); + + RevisionMetadata metadata = getMetadata(sample); + + softly.assertThat(metadata.getRevisionDate()).hasValue(expectedLocalDateTime); + softly.assertThat(metadata.getRequiredRevisionDate()).isEqualTo(expectedLocalDateTime); + + softly.assertThat(metadata.getRevisionInstant()).hasValue(expectedInstant); + softly.assertThat(metadata.getRequiredRevisionInstant()).isEqualTo(expectedInstant); + + softly.assertAll(); + } + private static RevisionMetadata getMetadata(Object sample) { return new AnnotationRevisionMetadata<>(sample, Autowired.class, Reference.class); } @@ -121,4 +141,10 @@ public class AnnotationRevisionMetadataUnitTests { @Autowired Long revisionNumber; @Reference Instant revisionInstant; } + + static class SampleWithLong { + + @Autowired Long revisionNumber; + @Reference long revisionLong; + } }