Skip to content

Commit 874b023

Browse files
committed
Initialize auditing metadata for known persistent entities.
We're warming the cache for known entities.
1 parent b33239c commit 874b023

File tree

4 files changed

+31
-19
lines changed

4 files changed

+31
-19
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
@@ -68,6 +68,9 @@ public MappingAuditableBeanWrapperFactory(PersistentEntities entities) {
6868

6969
this.entities = entities;
7070
this.metadataCache = new ConcurrentHashMap<>();
71+
72+
entities
73+
.forEach(it -> entities.mapOnContext(it.getType(), (context, entity) -> getMetadata(context, it.getType())));
7174
}
7275

7376
@Override
@@ -79,20 +82,26 @@ public <T> Optional<AuditableBeanWrapper<T>> getBeanWrapperFor(T source) {
7982
return super.getBeanWrapperFor(source);
8083
}
8184

82-
return entities.mapOnContext(it.getClass(), (context, entity) -> {
85+
Class<?> entityClass = it.getClass();
86+
return entities.mapOnContext(entityClass, (context, entity) -> {
8387

84-
MappingAuditingMetadata metadata = metadataCache.computeIfAbsent(it.getClass(),
85-
key -> new MappingAuditingMetadata(context, it.getClass()));
88+
MappingAuditingMetadata metadata = getMetadata(context, entityClass);
8689

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

95+
return Optional.<AuditableBeanWrapper<T>> empty();
9296
}).orElseGet(() -> super.getBeanWrapperFor(source));
9397
});
9498
}
9599

100+
private MappingAuditingMetadata getMetadata(MappingContext<?, ? extends PersistentProperty<?>> context,
101+
Class<?> entityClass) {
102+
return metadataCache.computeIfAbsent(entityClass, key -> new MappingAuditingMetadata(context, entityClass));
103+
}
104+
96105
/**
97106
* Captures {@link PersistentProperty} instances equipped with auditing annotations.
98107
*

src/main/java/org/springframework/data/mapping/context/PersistentEntities.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public static PersistentEntities of(MappingContext<?, ?>... contexts) {
136136
* @return result of the {@link BiFunction}.
137137
*/
138138
public <T> Optional<T> mapOnContext(Class<?> type,
139-
BiFunction<MappingContext<?, ? extends PersistentProperty<?>>, PersistentEntity<?, ?>, @Nullable T> combiner) {
139+
BiFunction<MappingContext<?, ? extends PersistentProperty<?>>, PersistentEntity<?, ?>, T> combiner) {
140140

141141
Assert.notNull(type, "Type must not be null");
142142
Assert.notNull(combiner, "Combining BiFunction must not be null");

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)