Skip to content

Commit 54cee64

Browse files
committed
DATAMONGO-1100 - Upgrade to new PersistentPropertyAccessor API.
1 parent 4774992 commit 54cee64

File tree

9 files changed

+79
-386
lines changed

9 files changed

+79
-386
lines changed

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

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,9 @@
5555
import org.springframework.data.geo.GeoResult;
5656
import org.springframework.data.geo.GeoResults;
5757
import org.springframework.data.geo.Metric;
58+
import org.springframework.data.mapping.PersistentPropertyAccessor;
5859
import org.springframework.data.mapping.context.MappingContext;
59-
import org.springframework.data.mapping.model.BeanWrapper;
60+
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
6061
import org.springframework.data.mapping.model.MappingException;
6162
import org.springframework.data.mongodb.MongoDbFactory;
6263
import org.springframework.data.mongodb.core.aggregation.Aggregation;
@@ -745,8 +746,9 @@ private void initializeVersionProperty(Object entity) {
745746
MongoPersistentEntity<?> mongoPersistentEntity = getPersistentEntity(entity.getClass());
746747

747748
if (mongoPersistentEntity != null && mongoPersistentEntity.hasVersionProperty()) {
748-
BeanWrapper<Object> wrapper = BeanWrapper.create(entity, this.mongoConverter.getConversionService());
749-
wrapper.setProperty(mongoPersistentEntity.getVersionProperty(), 0);
749+
ConvertingPropertyAccessor accessor = new ConvertingPropertyAccessor(
750+
mongoPersistentEntity.getPropertyAccessor(entity), mongoConverter.getConversionService());
751+
accessor.setProperty(mongoPersistentEntity.getVersionProperty(), 0);
750752
}
751753
}
752754

@@ -839,11 +841,14 @@ public void save(Object objectToSave, String collectionName) {
839841

840842
private <T> void doSaveVersioned(T objectToSave, MongoPersistentEntity<?> entity, String collectionName) {
841843

842-
BeanWrapper<T> beanWrapper = BeanWrapper.create(objectToSave, this.mongoConverter.getConversionService());
844+
ConvertingPropertyAccessor convertingAccessor = new ConvertingPropertyAccessor(
845+
entity.getPropertyAccessor(objectToSave), mongoConverter.getConversionService());
846+
843847
MongoPersistentProperty idProperty = entity.getIdProperty();
844848
MongoPersistentProperty versionProperty = entity.getVersionProperty();
845849

846-
Number version = beanWrapper.getProperty(versionProperty, Number.class);
850+
Object version = convertingAccessor.getProperty(versionProperty);
851+
Number versionNumber = convertingAccessor.getProperty(versionProperty, Number.class);
847852

848853
// Fresh instance -> initialize version property
849854
if (version == null) {
@@ -853,12 +858,11 @@ private <T> void doSaveVersioned(T objectToSave, MongoPersistentEntity<?> entity
853858
assertUpdateableIdIfNotSet(objectToSave);
854859

855860
// Create query for entity with the id and old version
856-
Object id = beanWrapper.getProperty(idProperty);
861+
Object id = convertingAccessor.getProperty(idProperty);
857862
Query query = new Query(Criteria.where(idProperty.getName()).is(id).and(versionProperty.getName()).is(version));
858863

859864
// Bump version number
860-
Number number = beanWrapper.getProperty(versionProperty, Number.class);
861-
beanWrapper.setProperty(versionProperty, number.longValue() + 1);
865+
convertingAccessor.setProperty(versionProperty, versionNumber.longValue() + 1);
862866

863867
BasicDBObject dbObject = new BasicDBObject();
864868

@@ -1089,12 +1093,11 @@ private Entry<String, Object> extractIdPropertyAndValue(Object object) {
10891093
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(objectType);
10901094
MongoPersistentProperty idProp = entity == null ? null : entity.getIdProperty();
10911095

1092-
if (idProp == null) {
1096+
if (idProp == null || entity == null) {
10931097
throw new MappingException("No id property found for object of type " + objectType);
10941098
}
10951099

1096-
Object idValue = BeanWrapper.create(object, mongoConverter.getConversionService())
1097-
.getProperty(idProp, Object.class);
1100+
Object idValue = entity.getPropertyAccessor(object).getProperty(idProp);
10981101
return Collections.singletonMap(idProp.getFieldName(), idValue).entrySet().iterator().next();
10991102
}
11001103

@@ -1138,12 +1141,11 @@ private void assertUpdateableIdIfNotSet(Object entity) {
11381141
MongoPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(entity.getClass());
11391142
MongoPersistentProperty idProperty = persistentEntity == null ? null : persistentEntity.getIdProperty();
11401143

1141-
if (idProperty == null) {
1144+
if (idProperty == null || persistentEntity == null) {
11421145
return;
11431146
}
11441147

1145-
ConversionService service = mongoConverter.getConversionService();
1146-
Object idValue = BeanWrapper.create(entity, service).getProperty(idProperty, Object.class);
1148+
Object idValue = persistentEntity.getPropertyAccessor(entity).getProperty(idProperty);
11471149

11481150
if (idValue == null && !MongoSimpleTypes.AUTOGENERATED_ID_TYPES.contains(idProperty.getType())) {
11491151
throw new InvalidDataAccessApiUsageException(String.format(
@@ -1718,15 +1720,14 @@ protected void populateIdIfNecessary(Object savedObject, Object id) {
17181720
}
17191721

17201722
ConversionService conversionService = mongoConverter.getConversionService();
1721-
BeanWrapper<Object> wrapper = BeanWrapper.create(savedObject, conversionService);
1722-
1723-
Object idValue = wrapper.getProperty(idProp, idProp.getType());
1723+
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(savedObject.getClass());
1724+
PersistentPropertyAccessor accessor = entity.getPropertyAccessor(savedObject);
17241725

1725-
if (idValue != null) {
1726+
if (accessor.getProperty(idProp) != null) {
17261727
return;
17271728
}
17281729

1729-
wrapper.setProperty(idProp, id);
1730+
new ConvertingPropertyAccessor(accessor, conversionService).setProperty(idProp, id);
17301731
}
17311732

17321733
private DBCollection getAndPrepareCollection(DB db, String collectionName) {

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
*/
1616
package org.springframework.data.mongodb.core.convert;
1717

18+
import org.springframework.data.mapping.PersistentPropertyAccessor;
1819
import org.springframework.data.mapping.context.MappingContext;
19-
import org.springframework.data.mapping.model.BeanWrapper;
2020
import org.springframework.data.mapping.model.DefaultSpELExpressionEvaluator;
2121
import org.springframework.data.mapping.model.SpELContext;
2222
import org.springframework.data.mapping.model.SpELExpressionEvaluator;
@@ -60,19 +60,19 @@ public Object populateId(MongoPersistentProperty property, DBRef source, Object
6060
return proxy;
6161
}
6262

63-
MongoPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(property);
64-
MongoPersistentProperty idProperty = persistentEntity.getIdProperty();
65-
66-
if(idProperty.usePropertyAccess()) {
63+
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(property);
64+
MongoPersistentProperty idProperty = entity.getIdProperty();
65+
66+
if (idProperty.usePropertyAccess()) {
6767
return proxy;
6868
}
69-
69+
7070
SpELExpressionEvaluator evaluator = new DefaultSpELExpressionEvaluator(proxy, spELContext);
71-
BeanWrapper<Object> proxyWrapper = BeanWrapper.create(proxy, null);
72-
71+
PersistentPropertyAccessor accessor = entity.getPropertyAccessor(proxy);
72+
7373
DBObject object = new BasicDBObject(idProperty.getFieldName(), source.getId());
74-
ObjectPath objectPath = ObjectPath.ROOT.push(proxy, persistentEntity, null);
75-
proxyWrapper.setProperty(idProperty, resolver.getValueInternal(idProperty, object, evaluator, objectPath));
74+
ObjectPath objectPath = ObjectPath.ROOT.push(proxy, entity, null);
75+
accessor.setProperty(idProperty, resolver.getValueInternal(idProperty, object, evaluator, objectPath));
7676

7777
return proxy;
7878
}

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

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@
3737
import org.springframework.data.convert.TypeMapper;
3838
import org.springframework.data.mapping.Association;
3939
import org.springframework.data.mapping.AssociationHandler;
40+
import org.springframework.data.mapping.PersistentPropertyAccessor;
4041
import org.springframework.data.mapping.PreferredConstructor.Parameter;
4142
import org.springframework.data.mapping.PropertyHandler;
4243
import org.springframework.data.mapping.context.MappingContext;
43-
import org.springframework.data.mapping.model.BeanWrapper;
44+
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
4445
import org.springframework.data.mapping.model.DefaultSpELExpressionEvaluator;
4546
import org.springframework.data.mapping.model.MappingException;
4647
import org.springframework.data.mapping.model.ParameterValueProvider;
@@ -248,16 +249,18 @@ private <S extends Object> S read(final MongoPersistentEntity<S> entity, final D
248249
EntityInstantiator instantiator = instantiators.getInstantiatorFor(entity);
249250
S instance = instantiator.createInstance(entity, provider);
250251

251-
final BeanWrapper<S> wrapper = BeanWrapper.create(instance, conversionService);
252+
final PersistentPropertyAccessor accessor = new ConvertingPropertyAccessor(entity.getPropertyAccessor(instance),
253+
conversionService);
254+
252255
final MongoPersistentProperty idProperty = entity.getIdProperty();
253-
final S result = wrapper.getBean();
256+
final S result = instance;
254257

255258
// make sure id property is set before all other properties
256259
Object idValue = null;
257260

258261
if (idProperty != null) {
259262
idValue = getValueInternal(idProperty, dbo, evaluator, path);
260-
wrapper.setProperty(idProperty, idValue);
263+
accessor.setProperty(idProperty, idValue);
261264
}
262265

263266
final ObjectPath currentPath = path.push(result, entity, idValue);
@@ -275,7 +278,7 @@ public void doWithPersistentProperty(MongoPersistentProperty prop) {
275278
return;
276279
}
277280

278-
wrapper.setProperty(prop, getValueInternal(prop, dbo, evaluator, currentPath));
281+
accessor.setProperty(prop, getValueInternal(prop, dbo, evaluator, currentPath));
279282
}
280283
});
281284

@@ -297,7 +300,7 @@ public void doWithAssociation(Association<MongoPersistentProperty> association)
297300
DbRefResolverCallback callback = new DefaultDbRefResolverCallback(dbo, currentPath, evaluator,
298301
MappingMongoConverter.this);
299302

300-
wrapper.setProperty(property, dbRefResolver.resolveDbRef(property, dbref, callback, handler));
303+
accessor.setProperty(property, dbRefResolver.resolveDbRef(property, dbref, callback, handler));
301304
}
302305
});
303306

@@ -397,13 +400,13 @@ protected void writeInternal(Object obj, final DBObject dbo, MongoPersistentEnti
397400
throw new MappingException("No mapping metadata found for entity of type " + obj.getClass().getName());
398401
}
399402

400-
final BeanWrapper<Object> wrapper = BeanWrapper.create(obj, conversionService);
403+
final PersistentPropertyAccessor accessor = entity.getPropertyAccessor(obj);
401404
final MongoPersistentProperty idProperty = entity.getIdProperty();
402405

403406
if (!dbo.containsField("_id") && null != idProperty) {
404407

405408
try {
406-
Object id = wrapper.getProperty(idProperty, Object.class);
409+
Object id = accessor.getProperty(idProperty);
407410
dbo.put("_id", idMapper.convertId(id));
408411
} catch (ConversionException ignored) {}
409412
}
@@ -416,7 +419,7 @@ public void doWithPersistentProperty(MongoPersistentProperty prop) {
416419
return;
417420
}
418421

419-
Object propertyObj = wrapper.getProperty(prop);
422+
Object propertyObj = accessor.getProperty(prop);
420423

421424
if (null != propertyObj) {
422425

@@ -430,10 +433,12 @@ public void doWithPersistentProperty(MongoPersistentProperty prop) {
430433
});
431434

432435
entity.doWithAssociations(new AssociationHandler<MongoPersistentProperty>() {
436+
433437
public void doWithAssociation(Association<MongoPersistentProperty> association) {
438+
434439
MongoPersistentProperty inverseProp = association.getInverse();
435-
Class<?> type = inverseProp.getType();
436-
Object propertyObj = wrapper.getProperty(inverseProp, type);
440+
Object propertyObj = accessor.getProperty(inverseProp);
441+
437442
if (null != propertyObj) {
438443
writePropertyInternal(propertyObj, dbo, inverseProp);
439444
}
@@ -807,8 +812,8 @@ protected DBRef createDBRef(Object target, MongoPersistentProperty property) {
807812
if (target.getClass().equals(idProperty.getType())) {
808813
id = target;
809814
} else {
810-
BeanWrapper<Object> wrapper = BeanWrapper.create(target, conversionService);
811-
id = wrapper.getProperty(idProperty, Object.class);
815+
PersistentPropertyAccessor accessor = targetEntity.getPropertyAccessor(target);
816+
id = accessor.getProperty(idProperty);
812817
}
813818

814819
if (null == id) {

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MappingMongoEntityInformation.java

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@
1717

1818
import java.io.Serializable;
1919

20-
import org.springframework.data.mapping.model.BeanWrapper;
2120
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
22-
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
2321
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
24-
import org.springframework.data.repository.core.support.AbstractEntityInformation;
22+
import org.springframework.data.repository.core.support.PersistentEntityInformation;
2523

2624
/**
2725
* {@link MongoEntityInformation} implementation using a {@link MongoPersistentEntity} instance to lookup the necessary
@@ -30,7 +28,7 @@
3028
*
3129
* @author Oliver Gierke
3230
*/
33-
public class MappingMongoEntityInformation<T, ID extends Serializable> extends AbstractEntityInformation<T, ID>
31+
public class MappingMongoEntityInformation<T, ID extends Serializable> extends PersistentEntityInformation<T, ID>
3432
implements MongoEntityInformation<T, ID> {
3533

3634
private final MongoPersistentEntity<T> entityMetadata;
@@ -50,40 +48,14 @@ public MappingMongoEntityInformation(MongoPersistentEntity<T> entity) {
5048
* collection name.
5149
*
5250
* @param entity must not be {@literal null}.
53-
* @param customCollectionName
51+
* @param customCollectionName can be {@literal null}.
5452
*/
5553
public MappingMongoEntityInformation(MongoPersistentEntity<T> entity, String customCollectionName) {
56-
super(entity.getType());
57-
this.entityMetadata = entity;
58-
this.customCollectionName = customCollectionName;
59-
}
60-
61-
/*
62-
* (non-Javadoc)
63-
* @see org.springframework.data.repository.support.EntityInformation#getId(java.lang.Object)
64-
*/
65-
@SuppressWarnings("unchecked")
66-
public ID getId(T entity) {
67-
68-
MongoPersistentProperty idProperty = entityMetadata.getIdProperty();
6954

70-
if (idProperty == null) {
71-
return null;
72-
}
55+
super(entity);
7356

74-
try {
75-
return (ID) BeanWrapper.create(entity, null).getProperty(idProperty);
76-
} catch (Exception e) {
77-
throw new RuntimeException(e);
78-
}
79-
}
80-
81-
/* (non-Javadoc)
82-
* @see org.springframework.data.repository.support.EntityInformation#getIdType()
83-
*/
84-
@SuppressWarnings("unchecked")
85-
public Class<ID> getIdType() {
86-
return (Class<ID>) entityMetadata.getIdProperty().getType();
57+
this.entityMetadata = entity;
58+
this.customCollectionName = customCollectionName;
8759
}
8860

8961
/* (non-Javadoc)

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/DbRefMappingMongoConverterUnitTests.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
import org.springframework.data.annotation.AccessType.Type;
4141
import org.springframework.data.annotation.Id;
4242
import org.springframework.data.annotation.PersistenceConstructor;
43+
import org.springframework.data.mapping.PersistentPropertyAccessor;
4344
import org.springframework.data.mapping.PropertyPath;
44-
import org.springframework.data.mapping.model.BeanWrapper;
4545
import org.springframework.data.mongodb.MongoDbFactory;
4646
import org.springframework.data.mongodb.core.MongoExceptionTranslator;
4747
import org.springframework.data.mongodb.core.convert.MappingMongoConverterUnitTests.Person;
@@ -505,6 +505,7 @@ public void shouldEagerlyResolveIdPropertyWithFieldAccess() {
505505

506506
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(ClassWithLazyDbRefs.class);
507507
MongoPersistentProperty property = entity.getPersistentProperty("dbRefToConcreteType");
508+
MongoPersistentEntity<?> propertyEntity = mappingContext.getPersistentEntity(property);
508509

509510
String idValue = new ObjectId().toString();
510511
DBRef dbRef = converter.toDBRef(new LazyDbRefTarget(idValue), property);
@@ -513,10 +514,10 @@ public void shouldEagerlyResolveIdPropertyWithFieldAccess() {
513514

514515
ClassWithLazyDbRefs result = converter.read(ClassWithLazyDbRefs.class, object);
515516

516-
BeanWrapper<LazyDbRefTarget> wrapper = BeanWrapper.create(result.dbRefToConcreteType, null);
517+
PersistentPropertyAccessor accessor = propertyEntity.getPropertyAccessor(result.dbRefToConcreteType);
517518
MongoPersistentProperty idProperty = mappingContext.getPersistentEntity(LazyDbRefTarget.class).getIdProperty();
518519

519-
assertThat(wrapper.getProperty(idProperty), is(notNullValue()));
520+
assertThat(accessor.getProperty(idProperty), is(notNullValue()));
520521
assertProxyIsResolved(result.dbRefToConcreteType, false);
521522
}
522523

0 commit comments

Comments
 (0)