Skip to content

Commit 323bae9

Browse files
mp911dechristophstrobl
authored andcommitted
Initialize auditing metadata for known persistent entities.
We're warming the cache for known entities. Closes: #3441 Original Pull Request: #3442
1 parent 6065105 commit 323bae9

File tree

3 files changed

+30
-18
lines changed

3 files changed

+30
-18
lines changed

src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ public MappingAuditableBeanWrapperFactory(PersistentEntities entities) {
7171

7272
this.entities = entities;
7373
this.metadataCache = new ConcurrentHashMap<>();
74+
75+
entities
76+
.forEach(it -> entities.mapOnContext(it.getType(), (context, entity) -> getMetadata(context, it.getType())));
7477
}
7578

7679
@Override
@@ -82,20 +85,26 @@ public <T> Optional<AuditableBeanWrapper<T>> getBeanWrapperFor(T source) {
8285
return super.getBeanWrapperFor(source);
8386
}
8487

85-
return entities.mapOnContext(it.getClass(), (context, entity) -> {
88+
Class<?> entityClass = it.getClass();
89+
return entities.mapOnContext(entityClass, (context, entity) -> {
8690

87-
MappingAuditingMetadata metadata = metadataCache.computeIfAbsent(it.getClass(),
88-
key -> new MappingAuditingMetadata(context, it.getClass()));
91+
MappingAuditingMetadata metadata = getMetadata(context, entityClass);
8992

90-
return Optional.<AuditableBeanWrapper<T>> ofNullable(metadata.isAuditable() //
91-
? new MappingMetadataAuditableBeanWrapper<>(getConversionService(), entity.getPropertyPathAccessor(it),
92-
metadata)
93-
: null);
93+
if (metadata.isAuditable()) {
94+
return Optional.<AuditableBeanWrapper<T>> of(new MappingMetadataAuditableBeanWrapper<>(getConversionService(),
95+
entity.getPropertyPathAccessor(it), metadata));
96+
}
9497

98+
return Optional.<AuditableBeanWrapper<T>> empty();
9599
}).orElseGet(() -> super.getBeanWrapperFor(source));
96100
});
97101
}
98102

103+
private MappingAuditingMetadata getMetadata(MappingContext<?, ? extends PersistentProperty<?>> context,
104+
Class<?> entityClass) {
105+
return metadataCache.computeIfAbsent(entityClass, key -> new MappingAuditingMetadata(context, entityClass));
106+
}
107+
99108
/**
100109
* Captures {@link PersistentProperty} instances equipped with auditing annotations.
101110
*

src/test/java/org/springframework/data/auditing/IsNewAwareAuditingHandlerUnitTests.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020

2121
import java.util.Optional;
2222

23-
import org.junit.jupiter.api.BeforeEach;
2423
import org.junit.jupiter.api.Test;
2524
import org.junit.jupiter.api.extension.ExtendWith;
2625
import org.mockito.junit.jupiter.MockitoExtension;
2726
import org.mockito.junit.jupiter.MockitoSettings;
2827
import org.mockito.quality.Strictness;
28+
2929
import org.springframework.data.annotation.Id;
3030
import org.springframework.data.mapping.context.PersistentEntities;
3131
import org.springframework.data.mapping.context.SampleMappingContext;
@@ -34,24 +34,18 @@
3434
* Unit test for {@code AuditingHandler}.
3535
*
3636
* @author Oliver Gierke
37+
* @author Mark Paluch
3738
* @since 1.5
3839
*/
3940
@ExtendWith(MockitoExtension.class)
4041
@MockitoSettings(strictness = Strictness.LENIENT)
4142
class IsNewAwareAuditingHandlerUnitTests extends AuditingHandlerUnitTests {
4243

43-
SampleMappingContext mappingContext;
44-
45-
@BeforeEach
46-
void init() {
47-
48-
this.mappingContext = new SampleMappingContext();
49-
this.mappingContext.getPersistentEntity(AuditedUser.class);
50-
this.mappingContext.afterPropertiesSet();
51-
}
52-
5344
@Override
5445
protected IsNewAwareAuditingHandler getHandler() {
46+
SampleMappingContext mappingContext = new SampleMappingContext();
47+
mappingContext.getPersistentEntity(AuditedUser.class);
48+
mappingContext.afterPropertiesSet();
5549
return new IsNewAwareAuditingHandler(PersistentEntities.of(mappingContext));
5650
}
5751

src/test/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactoryUnitTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,14 @@
4545
import org.springframework.data.domain.Auditable;
4646
import org.springframework.data.mapping.context.PersistentEntities;
4747
import org.springframework.data.mapping.context.SampleMappingContext;
48+
import org.springframework.test.util.ReflectionTestUtils;
4849

4950
/**
5051
* Unit tests for {@link MappingAuditableBeanWrapperFactory}.
5152
*
5253
* @author Oliver Gierke
5354
* @author Jens Schauder
55+
* @author Mark Paluch
5456
* @since 1.8
5557
*/
5658
class MappingAuditableBeanWrapperFactoryUnitTests {
@@ -69,6 +71,13 @@ void setUp() {
6971
factory = new MappingAuditableBeanWrapperFactory(entities);
7072
}
7173

74+
@Test // GH-3441
75+
void cacheWarmedWithKnownPersistentEntities() {
76+
77+
Map<?, ?> metadataCache = (Map<?, ?>) ReflectionTestUtils.getField(factory, "metadataCache");
78+
assertThat(metadataCache).hasSize(4);
79+
}
80+
7281
@Test // DATACMNS-365
7382
void discoversAuditingPropertyOnField() {
7483

0 commit comments

Comments
 (0)