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.
This commit is contained in:
Oliver Gierke
2018-09-01 18:34:56 +02:00
parent 7f8087a448
commit b52e3438f9
2 changed files with 42 additions and 0 deletions

View File

@@ -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;
@@ -117,6 +118,10 @@ public class AnnotationRevisionMetadata<N extends Number & Comparable<N>> 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));
}
}

View File

@@ -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;
@@ -108,6 +110,31 @@ 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<Long> 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<Long> metadata = getMetadata(sample);
assertThat(metadata.getRevisionDate())
.hasValue(LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.systemDefault()));
}
private static RevisionMetadata<Long> getMetadata(Object sample) {
return new AnnotationRevisionMetadata<>(sample, Autowired.class, Reference.class);
}
@@ -129,4 +156,14 @@ public class AnnotationRevisionMetadataUnitTests {
@Autowired Long revisionNumber;
@Reference long revisionLong;
}
// DATACMNS-1384
static class SampleWithTimestamp {
@Reference Timestamp revision;
}
static class SampleWithDate {
@Reference Date revision;
}
}