Skip to content

Commit 697f5ad

Browse files
committed
DATAMONGO-1730 - Adapt to API changes in mapping subsystem.
1 parent 028aeb3 commit 697f5ad

File tree

47 files changed

+683
-670
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+683
-670
lines changed

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

Lines changed: 94 additions & 90 deletions
Large diffs are not rendered by default.

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

Lines changed: 63 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,8 @@
2222
import reactor.core.publisher.Mono;
2323
import reactor.util.function.Tuple2;
2424

25-
import java.util.ArrayList;
26-
import java.util.Collection;
27-
import java.util.Collections;
28-
import java.util.HashMap;
29-
import java.util.HashSet;
30-
import java.util.Iterator;
31-
import java.util.List;
32-
import java.util.Map;
25+
import java.util.*;
3326
import java.util.Map.Entry;
34-
import java.util.Optional;
35-
import java.util.Set;
3627
import java.util.function.Function;
3728
import java.util.stream.Collectors;
3829

@@ -59,11 +50,10 @@
5950
import org.springframework.data.geo.Distance;
6051
import org.springframework.data.geo.GeoResult;
6152
import org.springframework.data.geo.Metric;
62-
import org.springframework.data.mapping.PersistentEntity;
6353
import org.springframework.data.mapping.PersistentPropertyAccessor;
6454
import org.springframework.data.mapping.context.MappingContext;
6555
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
66-
import org.springframework.data.mapping.model.MappingException;
56+
import org.springframework.data.mapping.MappingException;
6757
import org.springframework.data.mongodb.MongoDbFactory;
6858
import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory;
6959
import org.springframework.data.mongodb.core.convert.DbRefProxyHandler;
@@ -94,6 +84,7 @@
9484
import org.springframework.data.mongodb.core.query.Update;
9585
import org.springframework.data.mongodb.util.MongoClientVersion;
9686
import org.springframework.data.util.Optionals;
87+
import org.springframework.data.util.Pair;
9788
import org.springframework.util.Assert;
9889
import org.springframework.util.ObjectUtils;
9990
import org.springframework.util.StringUtils;
@@ -615,8 +606,8 @@ public <T> Mono<T> findById(Object id, Class<T> entityClass) {
615606
*/
616607
public <T> Mono<T> findById(Object id, Class<T> entityClass, String collectionName) {
617608

618-
Optional<? extends MongoPersistentEntity<?>> persistentEntity = mappingContext.getPersistentEntity(entityClass);
619-
MongoPersistentProperty idProperty = persistentEntity.flatMap(PersistentEntity::getIdProperty).orElse(null);
609+
MongoPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(entityClass);
610+
MongoPersistentProperty idProperty = persistentEntity != null ? persistentEntity.getIdProperty() : null;
620611

621612
String idKey = idProperty == null ? ID_FIELD : idProperty.getName();
622613

@@ -764,7 +755,7 @@ public Mono<Long> count(final Query query, final Class<?> entityClass, String co
764755

765756
final Document Document = query == null ? null
766757
: queryMapper.getMappedObject(query.getQueryObject(),
767-
entityClass == null ? Optional.empty() : mappingContext.getPersistentEntity(entityClass));
758+
entityClass == null ? null : mappingContext.getPersistentEntity(entityClass));
768759

769760
return collection.count(Document);
770761
});
@@ -971,29 +962,28 @@ private <T> Mono<T> doSaveVersioned(T objectToSave, MongoPersistentEntity<?> ent
971962
ConvertingPropertyAccessor convertingAccessor = new ConvertingPropertyAccessor(
972963
entity.getPropertyAccessor(objectToSave), mongoConverter.getConversionService());
973964

974-
MongoPersistentProperty idProperty = entity.getIdProperty()
975-
.orElseThrow(() -> new IllegalArgumentException("No id property present!"));
976-
MongoPersistentProperty versionProperty = entity.getVersionProperty()
977-
.orElseThrow(() -> new IllegalArgumentException("No version property present!"));
978-
;
965+
MongoPersistentProperty idProperty = entity.getRequiredIdProperty();
966+
MongoPersistentProperty versionProperty = entity.getRequiredVersionProperty();
979967

980-
Optional<Object> version = convertingAccessor.getProperty(versionProperty);
981-
Optional<Number> versionNumber = convertingAccessor.getProperty(versionProperty, Number.class);
968+
Object version = convertingAccessor.getProperty(versionProperty);
969+
Number versionNumber = convertingAccessor.getProperty(versionProperty, Number.class);
982970

983971
// Fresh instance -> initialize version property
984-
if (!version.isPresent()) {
972+
if (version == null) {
985973
return doInsert(collectionName, objectToSave, mongoConverter);
986974
}
987975

988-
ReactiveMongoTemplate.this.assertUpdateableIdIfNotSet(objectToSave);
976+
assertUpdateableIdIfNotSet(objectToSave);
989977

990978
// Create query for entity with the id and old version
991-
Optional<Object> id = convertingAccessor.getProperty(idProperty);
992-
Query query = new Query(
993-
Criteria.where(idProperty.getName()).is(id.get()).and(versionProperty.getName()).is(version.get()));
979+
Object id = convertingAccessor.getProperty(idProperty);
980+
Query query = new Query(Criteria.where(idProperty.getName()).is(id).and(versionProperty.getName()).is(version));
994981

982+
if (versionNumber == null) {
983+
versionNumber = 0;
984+
}
995985
// Bump version number
996-
convertingAccessor.setProperty(versionProperty, Optional.of(versionNumber.orElse(0).longValue() + 1));
986+
convertingAccessor.setProperty(versionProperty, versionNumber.longValue() + 1);
997987

998988
ReactiveMongoTemplate.this.maybeEmitEvent(new BeforeConvertEvent<T>(objectToSave, collectionName));
999989

@@ -1241,7 +1231,7 @@ protected Mono<UpdateResult> doUpdate(final String collectionName, final Query q
12411231
private void increaseVersionForUpdateIfNecessary(MongoPersistentEntity<?> persistentEntity, Update update) {
12421232

12431233
if (persistentEntity != null && persistentEntity.hasVersionProperty()) {
1244-
String versionFieldName = persistentEntity.getVersionProperty().get().getFieldName();
1234+
String versionFieldName = persistentEntity.getRequiredVersionProperty().getFieldName();
12451235
if (!update.modifies(versionFieldName)) {
12461236
update.inc(versionFieldName, 1L);
12471237
}
@@ -1254,7 +1244,7 @@ private boolean dbObjectContainsVersionProperty(Document document, MongoPersiste
12541244
return false;
12551245
}
12561246

1257-
return document.containsKey(persistentEntity.getVersionProperty().get().getFieldName());
1247+
return document.containsKey(persistentEntity.getRequiredIdProperty().getFieldName());
12581248
}
12591249

12601250
/* (non-Javadoc)
@@ -1306,25 +1296,27 @@ public Mono<DeleteResult> remove(Object object, String collection) {
13061296
* @param object
13071297
* @return
13081298
*/
1309-
private Entry<String, Object> extractIdPropertyAndValue(Object object) {
1299+
private Pair<String, Object> extractIdPropertyAndValue(Object object) {
1300+
1301+
Assert.notNull(object, "Id cannot be extracted from 'null'.");
13101302

13111303
Assert.notNull(object, "Id cannot be extracted from 'null'.");
13121304

13131305
Class<?> objectType = object.getClass();
13141306

13151307
if (object instanceof Document) {
1316-
return Collections.singletonMap(ID_FIELD, ((Document) object).get(ID_FIELD)).entrySet().iterator().next();
1308+
return Pair.of(ID_FIELD, ((Document) object).get(ID_FIELD));
13171309
}
13181310

1319-
Optional<? extends MongoPersistentEntity<?>> entity = mappingContext.getPersistentEntity(objectType);
1320-
MongoPersistentProperty idProp = entity.flatMap(PersistentEntity::getIdProperty).orElse(null);
1311+
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(objectType);
13211312

1322-
if (idProp == null) {
1323-
throw new MappingException("No id property found for object of type " + objectType);
1313+
if (entity != null && entity.hasIdProperty()) {
1314+
1315+
MongoPersistentProperty idProperty = entity.getIdProperty();
1316+
return Pair.of(idProperty.getFieldName(), entity.getPropertyAccessor(object).getProperty(idProperty));
13241317
}
13251318

1326-
Optional<Object> idValue = entity.get().getPropertyAccessor(object).getProperty(idProp);
1327-
return Collections.singletonMap(idProp.getFieldName(), idValue.get()).entrySet().iterator().next();
1319+
throw new MappingException("No id property found for object of type " + objectType);
13281320
}
13291321

13301322
/**
@@ -1335,8 +1327,8 @@ private Entry<String, Object> extractIdPropertyAndValue(Object object) {
13351327
*/
13361328
private Query getIdQueryFor(Object object) {
13371329

1338-
Entry<String, Object> id = extractIdPropertyAndValue(object);
1339-
return new Query(where(id.getKey()).is(id.getValue()));
1330+
Pair<String, Object> id = extractIdPropertyAndValue(object);
1331+
return new Query(where(id.getFirst()).is(id.getSecond()));
13401332
}
13411333

13421334
/**
@@ -1350,35 +1342,36 @@ private Query getIdInQueryFor(Collection<?> objects) {
13501342
Assert.notEmpty(objects, "Cannot create Query for empty collection.");
13511343

13521344
Iterator<?> it = objects.iterator();
1353-
Entry<String, Object> firstEntry = extractIdPropertyAndValue(it.next());
1345+
Pair<String, Object> firstEntry = extractIdPropertyAndValue(it.next());
13541346

13551347
ArrayList<Object> ids = new ArrayList<Object>(objects.size());
1356-
ids.add(firstEntry.getValue());
1348+
ids.add(firstEntry.getSecond());
13571349

13581350
while (it.hasNext()) {
1359-
ids.add(extractIdPropertyAndValue(it.next()).getValue());
1351+
ids.add(extractIdPropertyAndValue(it.next()).getSecond());
13601352
}
13611353

1362-
return new Query(where(firstEntry.getKey()).in(ids));
1354+
return new Query(where(firstEntry.getFirst()).in(ids));
13631355
}
13641356

1365-
private void assertUpdateableIdIfNotSet(Object entity) {
1357+
private void assertUpdateableIdIfNotSet(Object value) {
13661358

1367-
Optional<? extends MongoPersistentEntity<?>> persistentEntity = mappingContext
1368-
.getPersistentEntity(entity.getClass());
1369-
Optional<MongoPersistentProperty> idProperty = persistentEntity.isPresent() ? persistentEntity.get().getIdProperty()
1370-
: Optional.empty();
1359+
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(value.getClass());
13711360

1372-
if (!idProperty.isPresent()) {
1373-
return;
1374-
}
1361+
if (entity != null && entity.hasIdProperty()) {
13751362

1376-
Optional<Object> idValue = persistentEntity.get().getPropertyAccessor(entity).getProperty(idProperty.get());
1363+
MongoPersistentProperty property = entity.getRequiredIdProperty();
1364+
Object propertyValue = entity.getPropertyAccessor(value).getProperty(property);
13771365

1378-
if (!idValue.isPresent() && !MongoSimpleTypes.AUTOGENERATED_ID_TYPES.contains(idProperty.get().getType())) {
1379-
throw new InvalidDataAccessApiUsageException(
1380-
String.format("Cannot autogenerate id of type %s for entity of type %s!",
1381-
idProperty.get().getType().getName(), entity.getClass().getName()));
1366+
if (propertyValue != null) {
1367+
return;
1368+
}
1369+
1370+
if (!MongoSimpleTypes.AUTOGENERATED_ID_TYPES.contains(property.getType())) {
1371+
throw new InvalidDataAccessApiUsageException(
1372+
String.format("Cannot autogenerate id of type %s for entity of type %s!", property.getType().getName(),
1373+
value.getClass().getName()));
1374+
}
13821375
}
13831376
}
13841377

@@ -1557,7 +1550,7 @@ protected Mono<MongoCollection<Document>> doCreateCollection(final String collec
15571550
protected <T> Mono<T> doFindOne(String collectionName, Document query, Document fields, Class<T> entityClass,
15581551
Collation collation) {
15591552

1560-
Optional<? extends MongoPersistentEntity<?>> entity = mappingContext.getPersistentEntity(entityClass);
1553+
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(entityClass);
15611554
Document mappedQuery = queryMapper.getMappedObject(query, entity);
15621555
Document mappedFields = fields == null ? null : queryMapper.getMappedObject(fields, entity);
15631556

@@ -1607,7 +1600,7 @@ protected <T> Flux<T> doFind(String collectionName, Document query, Document fie
16071600
protected <S, T> Flux<T> doFind(String collectionName, Document query, Document fields, Class<S> entityClass,
16081601
FindPublisherPreparer preparer, DocumentCallback<T> objectCallback) {
16091602

1610-
Optional<? extends MongoPersistentEntity<?>> entity = mappingContext.getPersistentEntity(entityClass);
1603+
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(entityClass);
16111604

16121605
Document mappedFields = queryMapper.getMappedFields(fields, entity);
16131606
Document mappedQuery = queryMapper.getMappedObject(query, entity);
@@ -1654,7 +1647,7 @@ protected <T> Mono<T> doFindAndRemove(String collectionName, Document query, Doc
16541647
serializeToJsonSafely(query), fields, sort, entityClass, collectionName));
16551648
}
16561649

1657-
Optional<? extends MongoPersistentEntity<?>> entity = mappingContext.getPersistentEntity(entityClass);
1650+
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(entityClass);
16581651

16591652
return executeFindOneInternal(
16601653
new FindAndRemoveCallback(queryMapper.getMappedObject(query, entity), fields, sort, collation),
@@ -1666,11 +1659,11 @@ protected <T> Mono<T> doFindAndModify(String collectionName, Document query, Doc
16661659

16671660
FindAndModifyOptions optionsToUse = options != null ? options : new FindAndModifyOptions();
16681661

1669-
Optional<? extends MongoPersistentEntity<?>> entity = mappingContext.getPersistentEntity(entityClass);
1662+
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(entityClass);
16701663

16711664
return Mono.defer(() -> {
16721665

1673-
increaseVersionForUpdateIfNecessary(entity.get(), update);
1666+
increaseVersionForUpdateIfNecessary(entity, update);
16741667

16751668
Document mappedQuery = queryMapper.getMappedObject(query, entity);
16761669
Document mappedUpdate = updateMapper.getMappedObject(update.getUpdateObject(), entity);
@@ -1721,11 +1714,11 @@ private void populateIdIfNecessary(Object savedObject, Object id) {
17211714
MongoPersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(savedObject.getClass());
17221715
PersistentPropertyAccessor accessor = entity.getPropertyAccessor(savedObject);
17231716

1724-
if (accessor.getProperty(idProp).isPresent()) {
1717+
if (accessor.getProperty(idProp) != null) {
17251718
return;
17261719
}
17271720

1728-
new ConvertingPropertyAccessor(accessor, conversionService).setProperty(idProp, Optional.ofNullable(id));
1721+
new ConvertingPropertyAccessor(accessor, conversionService).setProperty(idProp, id);
17291722
}
17301723

17311724
private MongoCollection<Document> getAndPrepareCollection(MongoDatabase db, String collectionName) {
@@ -1896,13 +1889,13 @@ private static RuntimeException potentiallyConvertRuntimeException(RuntimeExcept
18961889
}
18971890

18981891
private MongoPersistentEntity<?> getPersistentEntity(Class<?> type) {
1899-
return type == null ? null : mappingContext.getPersistentEntity(type).orElse(null);
1892+
return type == null ? null : mappingContext.getPersistentEntity(type);
19001893
}
19011894

19021895
private MongoPersistentProperty getIdPropertyFor(Class<?> type) {
19031896

1904-
Optional<? extends MongoPersistentEntity<?>> persistentEntity = mappingContext.getPersistentEntity(type);
1905-
return persistentEntity.flatMap(PersistentEntity::getIdProperty).orElse(null);
1897+
MongoPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(type);
1898+
return persistentEntity != null ? persistentEntity.getIdProperty() : null;
19061899
}
19071900

19081901
private <T> String determineEntityCollectionName(T obj) {
@@ -1976,7 +1969,7 @@ private void initializeVersionProperty(Object entity) {
19761969
if (mongoPersistentEntity != null && mongoPersistentEntity.hasVersionProperty()) {
19771970
ConvertingPropertyAccessor accessor = new ConvertingPropertyAccessor(
19781971
mongoPersistentEntity.getPropertyAccessor(entity), mongoConverter.getConversionService());
1979-
accessor.setProperty(mongoPersistentEntity.getVersionProperty().get(), Optional.of(0));
1972+
accessor.setProperty(mongoPersistentEntity.getRequiredVersionProperty(), 0);
19801973
}
19811974
}
19821975

@@ -2349,9 +2342,9 @@ private static List<? extends Document> toDocuments(final Collection<? extends D
23492342
static class NoOpDbRefResolver implements DbRefResolver {
23502343

23512344
@Override
2352-
public Optional<Object> resolveDbRef(MongoPersistentProperty property, DBRef dbref, DbRefResolverCallback callback,
2345+
public Object resolveDbRef(MongoPersistentProperty property, DBRef dbref, DbRefResolverCallback callback,
23532346
DbRefProxyHandler proxyHandler) {
2354-
return Optional.empty();
2347+
return null;
23552348
}
23562349

23572350
@Override

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2016 the original author or authors.
2+
* Copyright 2013-2017 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,10 +15,9 @@
1515
*/
1616
package org.springframework.data.mongodb.core.convert;
1717

18-
import org.bson.Document;
1918
import java.util.List;
20-
import java.util.Optional;
2119

20+
import org.bson.Document;
2221
import org.springframework.dao.InvalidDataAccessApiUsageException;
2322
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
2423
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
@@ -27,7 +26,7 @@
2726

2827
/**
2928
* Used to resolve associations annotated with {@link org.springframework.data.mongodb.core.mapping.DBRef}.
30-
*
29+
*
3130
* @author Thomas Darimont
3231
* @author Oliver Gierke
3332
* @author Christoph Strobl
@@ -40,19 +39,19 @@ public interface DbRefResolver {
4039
* Resolves the given {@link DBRef} into an object of the given {@link MongoPersistentProperty}'s type. The method
4140
* might return a proxy object for the {@link DBRef} or resolve it immediately. In both cases the
4241
* {@link DbRefResolverCallback} will be used to obtain the actual backing object.
43-
*
42+
*
4443
* @param property will never be {@literal null}.
4544
* @param dbref the {@link DBRef} to resolve.
4645
* @param callback will never be {@literal null}.
4746
* @return
4847
*/
49-
Optional<Object> resolveDbRef(MongoPersistentProperty property, DBRef dbref, DbRefResolverCallback callback,
48+
Object resolveDbRef(MongoPersistentProperty property, DBRef dbref, DbRefResolverCallback callback,
5049
DbRefProxyHandler proxyHandler);
5150

5251
/**
5352
* Creates a {@link DBRef} instance for the given {@link org.springframework.data.mongodb.core.mapping.DBRef}
5453
* annotation, {@link MongoPersistentEntity} and id.
55-
*
54+
*
5655
* @param annotation will never be {@literal null}.
5756
* @param entity will never be {@literal null}.
5857
* @param id will never be {@literal null}.
@@ -63,7 +62,7 @@ DBRef createDbRef(org.springframework.data.mongodb.core.mapping.DBRef annotation
6362

6463
/**
6564
* Actually loads the {@link DBRef} from the datasource.
66-
*
65+
*
6766
* @param dbRef must not be {@literal null}.
6867
* @return
6968
* @since 1.7

0 commit comments

Comments
 (0)