From 71d97ff53a92a15603c1f55888df6802f9cf4669 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 17 Jul 2014 15:17:55 +0200 Subject: [PATCH] DATAMONGO-987 - Some polishing in MappingMongoConverter. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let getValueInternal(…) use the provided SpELExpressionEvaluator instead of relying on the MongoDbPropertyValueProvider to create a new one. Removed the obsolete constructor in MongoDbPropertyValueProvider. --- .../core/convert/MappingMongoConverter.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index 75c53f1f6..61cac1ecc 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -253,8 +253,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return; } - Object obj = getValueInternal(prop, dbo, evaluator, result); - wrapper.setProperty(prop, obj); + wrapper.setProperty(prop, getValueInternal(prop, dbo, evaluator, result)); } }); @@ -263,7 +262,6 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App public void doWithAssociation(Association association) { MongoPersistentProperty property = association.getInverse(); - Object value = dbo.get(property.getName()); if (value == null) { @@ -271,15 +269,13 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App } DBRef dbref = value instanceof DBRef ? (DBRef) value : null; - Object obj = dbRefResolver.resolveDbRef(property, dbref, new DbRefResolverCallback() { + wrapper.setProperty(property, dbRefResolver.resolveDbRef(property, dbref, new DbRefResolverCallback() { @Override public Object resolve(MongoPersistentProperty property) { return getValueInternal(property, dbo, evaluator, parent); } - }); - - wrapper.setProperty(property, obj); + })); } }); @@ -796,11 +792,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App idMapper.convertId(id)); } - protected Object getValueInternal(MongoPersistentProperty prop, DBObject dbo, SpELExpressionEvaluator eval, + protected Object getValueInternal(MongoPersistentProperty prop, DBObject dbo, SpELExpressionEvaluator evaluator, Object parent) { - MongoDbPropertyValueProvider provider = new MongoDbPropertyValueProvider(dbo, spELContext, parent); - return provider.getPropertyValue(prop); + return new MongoDbPropertyValueProvider(dbo, evaluator, parent).getPropertyValue(prop); } /** @@ -1017,17 +1012,27 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return dbObject; } + /** + * {@link PropertyValueProvider} to evaluate a SpEL expression if present on the property or simply accesses the field + * of the configured source {@link DBObject}. + * + * @author Oliver Gierke + */ private class MongoDbPropertyValueProvider implements PropertyValueProvider { private final DBObjectAccessor source; private final SpELExpressionEvaluator evaluator; private final Object parent; - public MongoDbPropertyValueProvider(DBObject source, SpELContext factory, Object parent) { - this(source, new DefaultSpELExpressionEvaluator(source, factory), parent); - } - - public MongoDbPropertyValueProvider(DBObject source, DefaultSpELExpressionEvaluator evaluator, Object parent) { + /** + * Creates a new {@link MongoDbPropertyValueProvider} for the given source, {@link SpELExpressionEvaluator} and + * parent object. + * + * @param source must not be {@literal null}. + * @param evaluator must not be {@literal null}. + * @param parent can be {@literal null}. + */ + public MongoDbPropertyValueProvider(DBObject source, SpELExpressionEvaluator evaluator, Object parent) { Assert.notNull(source); Assert.notNull(evaluator);