DATACMNS-1676 - Polishing.
Encapsulate field and introduce getter for ConversionService. Add missing Override annotation. Add author tags. Minor cleanups. Original pull request: #432.
This commit is contained in:
@@ -42,14 +42,26 @@ import org.springframework.util.Assert;
|
||||
* @author Oliver Gierke
|
||||
* @author Christoph Strobl
|
||||
* @author Jens Schauder
|
||||
* @author Pavel Horal
|
||||
* @since 1.5
|
||||
*/
|
||||
class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory {
|
||||
|
||||
protected final ConversionService conversionService;
|
||||
private final ConversionService conversionService;
|
||||
|
||||
public DefaultAuditableBeanWrapperFactory() {
|
||||
this.conversionService = getDateConversionService();
|
||||
|
||||
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
|
||||
|
||||
JodaTimeConverters.getConvertersToRegister().forEach(conversionService::addConverter);
|
||||
Jsr310Converters.getConvertersToRegister().forEach(conversionService::addConverter);
|
||||
ThreeTenBackPortConverters.getConvertersToRegister().forEach(conversionService::addConverter);
|
||||
|
||||
this.conversionService = conversionService;
|
||||
}
|
||||
|
||||
ConversionService getConversionService() {
|
||||
return conversionService;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -58,6 +70,7 @@ class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory
|
||||
* @param source the auditing candidate.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T> Optional<AuditableBeanWrapper<T>> getBeanWrapperFor(T source) {
|
||||
|
||||
@@ -79,21 +92,6 @@ class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates conversion service for conversions between {@link TemporalAccessor} values and other supported date type values.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
static ConversionService getDateConversionService() {
|
||||
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
|
||||
|
||||
JodaTimeConverters.getConvertersToRegister().forEach(conversionService::addConverter);
|
||||
Jsr310Converters.getConvertersToRegister().forEach(conversionService::addConverter);
|
||||
ThreeTenBackPortConverters.getConvertersToRegister().forEach(conversionService::addConverter);
|
||||
|
||||
return conversionService;
|
||||
}
|
||||
|
||||
/**
|
||||
* An {@link AuditableBeanWrapper} that works with objects implementing
|
||||
*
|
||||
@@ -107,6 +105,7 @@ class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public AuditableInterfaceBeanWrapper(ConversionService conversionService, Auditable<Object, ?, TemporalAccessor> auditable) {
|
||||
|
||||
super(conversionService);
|
||||
|
||||
this.auditable = auditable;
|
||||
|
||||
@@ -17,10 +17,10 @@ package org.springframework.data.auditing;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.springframework.core.convert.ConversionService;
|
||||
import org.springframework.data.annotation.CreatedBy;
|
||||
@@ -49,6 +49,7 @@ import org.springframework.util.ConcurrentReferenceHashMap;
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
* @author Christoph Strobl
|
||||
* @author Pavel Horal
|
||||
* @since 1.8
|
||||
*/
|
||||
public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrapperFactory {
|
||||
@@ -88,7 +89,8 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap
|
||||
key -> new MappingAuditingMetadata(context, it.getClass()));
|
||||
|
||||
return Optional.<AuditableBeanWrapper<T>> ofNullable(metadata.isAuditable() //
|
||||
? new MappingMetadataAuditableBeanWrapper<T>(conversionService, entity.getPropertyPathAccessor(it), metadata)
|
||||
? new MappingMetadataAuditableBeanWrapper<>(getConversionService(), entity.getPropertyPathAccessor(it),
|
||||
metadata)
|
||||
: null);
|
||||
|
||||
}).orElseGet(() -> super.getBeanWrapperFor(source));
|
||||
@@ -126,8 +128,8 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap
|
||||
this.lastModifiedDatePaths = findPropertyPaths(type, LastModifiedDate.class, context);
|
||||
|
||||
this.isAuditable = Lazy.of( //
|
||||
() -> Arrays.asList(createdByPaths, createdDatePaths, lastModifiedByPaths, lastModifiedDatePaths) //
|
||||
.stream() //
|
||||
() -> //
|
||||
Stream.of(createdByPaths, createdDatePaths, lastModifiedByPaths, lastModifiedDatePaths) //
|
||||
.anyMatch(it -> !it.isEmpty())//
|
||||
);
|
||||
}
|
||||
@@ -249,7 +251,7 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap
|
||||
return accessor.getBean();
|
||||
}
|
||||
|
||||
private <S, P extends PersistentProperty<?>> S setProperty(
|
||||
private <S> S setProperty(
|
||||
PersistentPropertyPaths<?, ? extends PersistentProperty<?>> paths, S value) {
|
||||
|
||||
paths.forEach(it -> this.accessor.setProperty(it, value, OPTIONS));
|
||||
@@ -257,7 +259,7 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap
|
||||
return value;
|
||||
}
|
||||
|
||||
private <P extends PersistentProperty<?>> TemporalAccessor setDateProperty(
|
||||
private TemporalAccessor setDateProperty(
|
||||
PersistentPropertyPaths<?, ? extends PersistentProperty<?>> property, TemporalAccessor value) {
|
||||
|
||||
property.forEach(it -> {
|
||||
|
||||
@@ -33,22 +33,22 @@ import org.springframework.data.convert.Jsr310Converters.LocalDateTimeToDateConv
|
||||
* Unit tests for {@link ReflectionAuditingBeanWrapper}.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
* @author Pavel Horal
|
||||
* @since 1.5
|
||||
*/
|
||||
class ReflectionAuditingBeanWrapperUnitTests {
|
||||
|
||||
ConversionService conversionService;
|
||||
AnnotationAuditingMetadata metadata;
|
||||
AnnotatedUser user;
|
||||
AuditableBeanWrapper wrapper;
|
||||
AuditableBeanWrapper<?> wrapper;
|
||||
|
||||
LocalDateTime time = LocalDateTime.now();
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
this.conversionService = DefaultAuditableBeanWrapperFactory.getDateConversionService();
|
||||
this.conversionService = new DefaultAuditableBeanWrapperFactory().getConversionService();
|
||||
this.user = new AnnotatedUser();
|
||||
this.wrapper = new ReflectionAuditingBeanWrapper(conversionService, user);
|
||||
this.wrapper = new ReflectionAuditingBeanWrapper<>(conversionService, user);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -76,7 +76,7 @@ class ReflectionAuditingBeanWrapperUnitTests {
|
||||
}
|
||||
|
||||
Sample sample = new Sample();
|
||||
AuditableBeanWrapper wrapper = new ReflectionAuditingBeanWrapper(conversionService, sample);
|
||||
AuditableBeanWrapper<Sample> wrapper = new ReflectionAuditingBeanWrapper<>(conversionService, sample);
|
||||
|
||||
wrapper.setCreatedDate(time);
|
||||
assertThat(sample.createdDate).isEqualTo(time.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli());
|
||||
|
||||
Reference in New Issue
Block a user