Skip to content

Commit 9843325

Browse files
committed
DATAMONGO-1992 - Introduced MappingMongoEvent.mapSource(…).
We're currently using application events to allow users to pre-process both entities and documents persisted via our …Template classes. That approach actually exposes a conceptual mismatch as events should be immutable and the hardly can be if event listeners try to modify the entity instance or even exchange them (in case the entity itself is immutable). We now introduce an intermediate, package protected MappingMongoEvent.mapSource(…) that allows to exchange the source of the event. This is now used by the refined auditing infrastructure as this now returns the manipulated entity as it supports immutable ones as well. This will be removed as soon as we've come up with an alternative callback API that doesn't suffer from these conceptual mismatches (currently scheduled for release train Moore).
1 parent 323b0a8 commit 9843325

File tree

4 files changed

+26
-87
lines changed

4 files changed

+26
-87
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java

+3-25
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,13 @@
1717

1818
import static org.springframework.data.mongodb.core.query.SerializationUtils.*;
1919

20-
import com.mongodb.client.model.*;
2120
import lombok.AccessLevel;
2221
import lombok.AllArgsConstructor;
2322
import lombok.NonNull;
2423
import lombok.RequiredArgsConstructor;
2524

2625
import java.io.IOException;
27-
import java.util.ArrayList;
28-
import java.util.Collection;
29-
import java.util.Collections;
30-
import java.util.HashMap;
31-
import java.util.HashSet;
32-
import java.util.Iterator;
33-
import java.util.LinkedHashSet;
34-
import java.util.List;
35-
import java.util.Map;
36-
import java.util.Map.Entry;
37-
import java.util.Optional;
38-
import java.util.Scanner;
39-
import java.util.Set;
26+
import java.util.*;
4027
import java.util.concurrent.TimeUnit;
4128
import java.util.stream.Collectors;
4229

@@ -80,16 +67,7 @@
8067
import org.springframework.data.mongodb.core.aggregation.Fields;
8168
import org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext;
8269
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
83-
import org.springframework.data.mongodb.core.convert.DbRefResolver;
84-
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
85-
import org.springframework.data.mongodb.core.convert.JsonSchemaMapper;
86-
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
87-
import org.springframework.data.mongodb.core.convert.MongoConverter;
88-
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
89-
import org.springframework.data.mongodb.core.convert.MongoJsonSchemaMapper;
90-
import org.springframework.data.mongodb.core.convert.MongoWriter;
91-
import org.springframework.data.mongodb.core.convert.QueryMapper;
92-
import org.springframework.data.mongodb.core.convert.UpdateMapper;
70+
import org.springframework.data.mongodb.core.convert.*;
9371
import org.springframework.data.mongodb.core.index.IndexOperations;
9472
import org.springframework.data.mongodb.core.index.IndexOperationsProvider;
9573
import org.springframework.data.mongodb.core.index.MongoMappingEventPublisher;
@@ -116,7 +94,6 @@
11694
import org.springframework.data.mongodb.core.query.Query;
11795
import org.springframework.data.mongodb.core.query.Update;
11896
import org.springframework.data.mongodb.core.validation.Validator;
119-
import org.springframework.data.mongodb.util.MongoClientVersion;
12097
import org.springframework.data.projection.ProjectionInformation;
12198
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
12299
import org.springframework.data.util.CloseableIterator;
@@ -148,6 +125,7 @@
148125
import com.mongodb.client.MongoCursor;
149126
import com.mongodb.client.MongoDatabase;
150127
import com.mongodb.client.MongoIterable;
128+
import com.mongodb.client.model.*;
151129
import com.mongodb.client.result.DeleteResult;
152130
import com.mongodb.client.result.UpdateResult;
153131

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java

+5-57
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,7 @@
2525
import reactor.util.function.Tuple2;
2626
import reactor.util.function.Tuples;
2727

28-
import java.util.ArrayList;
29-
import java.util.Arrays;
30-
import java.util.Collection;
31-
import java.util.Collections;
32-
import java.util.HashMap;
33-
import java.util.HashSet;
34-
import java.util.Iterator;
35-
import java.util.List;
36-
import java.util.Map;
37-
import java.util.Map.Entry;
38-
import java.util.Optional;
39-
import java.util.Set;
28+
import java.util.*;
4029
import java.util.concurrent.TimeUnit;
4130
import java.util.function.Consumer;
4231
import java.util.function.Function;
@@ -81,27 +70,7 @@
8170
import org.springframework.data.mongodb.core.aggregation.PrefixingDelegatingAggregationOperationContext;
8271
import org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext;
8372
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
84-
import org.springframework.data.mongodb.core.convert.DbRefProxyHandler;
85-
import org.springframework.data.mongodb.core.convert.DbRefResolver;
86-
import org.springframework.data.mongodb.core.convert.DbRefResolverCallback;
87-
import org.springframework.data.mongodb.core.convert.JsonSchemaMapper;
88-
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
89-
import org.springframework.data.mongodb.core.convert.MongoConverter;
90-
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
91-
import org.springframework.data.mongodb.core.convert.MongoJsonSchemaMapper;
92-
import org.springframework.data.mongodb.core.convert.MongoWriter;
93-
import org.springframework.data.mongodb.core.convert.QueryMapper;
94-
import org.springframework.data.mongodb.core.convert.UpdateMapper;
95-
import org.springframework.data.mongodb.core.convert.DbRefResolver;
96-
import org.springframework.data.mongodb.core.convert.JsonSchemaMapper;
97-
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
98-
import org.springframework.data.mongodb.core.convert.MongoConverter;
99-
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
100-
import org.springframework.data.mongodb.core.convert.MongoJsonSchemaMapper;
101-
import org.springframework.data.mongodb.core.convert.MongoWriter;
102-
import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver;
103-
import org.springframework.data.mongodb.core.convert.QueryMapper;
104-
import org.springframework.data.mongodb.core.convert.UpdateMapper;
73+
import org.springframework.data.mongodb.core.convert.*;
10574
import org.springframework.data.mongodb.core.index.MongoMappingEventPublisher;
10675
import org.springframework.data.mongodb.core.index.ReactiveIndexOperations;
10776
import org.springframework.data.mongodb.core.index.ReactiveMongoPersistentEntityIndexCreator;
@@ -119,13 +88,11 @@
11988
import org.springframework.data.mongodb.core.mapping.event.MongoMappingEvent;
12089
import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions;
12190
import org.springframework.data.mongodb.core.query.Collation;
122-
import org.springframework.data.mongodb.core.query.Criteria;
12391
import org.springframework.data.mongodb.core.query.Meta;
12492
import org.springframework.data.mongodb.core.query.NearQuery;
12593
import org.springframework.data.mongodb.core.query.Query;
12694
import org.springframework.data.mongodb.core.query.Update;
12795
import org.springframework.data.mongodb.core.validation.Validator;
128-
import org.springframework.data.mongodb.util.MongoClientVersion;
12996
import org.springframework.data.projection.ProjectionInformation;
13097
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
13198
import org.springframework.data.util.Optionals;
@@ -145,29 +112,11 @@
145112
import com.mongodb.MongoException;
146113
import com.mongodb.ReadPreference;
147114
import com.mongodb.WriteConcern;
148-
import com.mongodb.client.model.CountOptions;
149-
import com.mongodb.client.model.CreateCollectionOptions;
150-
import com.mongodb.client.model.DeleteOptions;
151-
import com.mongodb.client.model.FindOneAndDeleteOptions;
152-
import com.mongodb.client.model.FindOneAndUpdateOptions;
153-
import com.mongodb.client.model.ReplaceOptions;
154-
import com.mongodb.client.model.ReturnDocument;
155-
import com.mongodb.client.model.UpdateOptions;
156-
import com.mongodb.client.model.ValidationOptions;
157115
import com.mongodb.client.model.*;
158116
import com.mongodb.client.model.changestream.FullDocument;
159117
import com.mongodb.client.result.DeleteResult;
160118
import com.mongodb.client.result.UpdateResult;
161-
import com.mongodb.reactivestreams.client.AggregatePublisher;
162-
import com.mongodb.reactivestreams.client.ChangeStreamPublisher;
163-
import com.mongodb.reactivestreams.client.ClientSession;
164-
import com.mongodb.reactivestreams.client.DistinctPublisher;
165-
import com.mongodb.reactivestreams.client.FindPublisher;
166-
import com.mongodb.reactivestreams.client.MapReducePublisher;
167-
import com.mongodb.reactivestreams.client.MongoClient;
168-
import com.mongodb.reactivestreams.client.MongoCollection;
169-
import com.mongodb.reactivestreams.client.MongoDatabase;
170-
import com.mongodb.reactivestreams.client.Success;
119+
import com.mongodb.reactivestreams.client.*;
171120

172121
/**
173122
* Primary implementation of {@link ReactiveMongoOperations}. It simplifies the use of Reactive MongoDB usage and helps
@@ -1967,9 +1916,8 @@ public <T> Flux<ChangeStreamEvent<T>> changeStream(@Nullable String database, @N
19671916
.map(publisher::startAtOperationTime).orElse(publisher);
19681917
publisher = publisher.fullDocument(options.getFullDocumentLookup().orElse(fullDocument));
19691918

1970-
return Flux.from(
1971-
publisher ).map(document -> new ChangeStreamEvent<>(document, targetType, getConverter()));
1972-
}
1919+
return Flux.from(publisher).map(document -> new ChangeStreamEvent<>(document, targetType, getConverter()));
1920+
}
19731921

19741922
List<Document> prepareFilter(ChangeStreamOptions options) {
19751923

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AuditingEventListener.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616
package org.springframework.data.mongodb.core.mapping.event;
1717

18-
import java.util.Optional;
19-
2018
import org.springframework.beans.factory.ObjectFactory;
2119
import org.springframework.context.ApplicationListener;
2220
import org.springframework.core.Ordered;
@@ -53,9 +51,7 @@ public AuditingEventListener(ObjectFactory<IsNewAwareAuditingHandler> auditingHa
5351
*/
5452
@Override
5553
public void onApplicationEvent(BeforeConvertEvent<Object> event) {
56-
57-
Optional.ofNullable(event.getSource())//
58-
.ifPresent(it -> auditingHandlerFactory.getObject().markAudited(it));
54+
event.mapSource(it -> auditingHandlerFactory.getObject().markAudited(it));
5955
}
6056

6157
/*

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/MongoMappingEvent.java

+17
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.springframework.data.mongodb.core.mapping.event;
1717

18+
import java.util.function.Function;
19+
1820
import org.bson.Document;
1921
import org.springframework.context.ApplicationEvent;
2022
import org.springframework.lang.Nullable;
@@ -72,4 +74,19 @@ public MongoMappingEvent(T source, @Nullable Document document, @Nullable String
7274
public T getSource() {
7375
return (T) super.getSource();
7476
}
77+
78+
/**
79+
* Allows client code to change the underlying source instance by applying the given {@link Function}.
80+
*
81+
* @param mapper the {@link Function} to apply, will only be applied if the source is not {@literal null}.
82+
* @since 2.1
83+
*/
84+
final void mapSource(Function<T, T> mapper) {
85+
86+
if (source == null) {
87+
return;
88+
}
89+
90+
this.source = mapper.apply(getSource());
91+
}
7592
}

0 commit comments

Comments
 (0)