Permalink
Browse files

DATAMONGO-876 - Adapt to API changes introduced for better property a…

…ccess config.

Adapted usage of BeanWrapper as the property access is now solely defined via the PersistentProperty. Adapted MongoPersistentEntityIndexCreator to lookup annotations via PersistentProperty instead of the backing field. Removed code from BasicMongoPersistentProperty which is now already implemented in the Spring Data Commons types.
  • Loading branch information...
1 parent 47f0607 commit 4eae229bffd6e15305f13824b233588f006cc2b1 @olivergierke olivergierke committed Mar 7, 2014
@@ -841,7 +841,7 @@ public void save(Object objectToSave, String collectionName) {
MongoPersistentProperty idProperty = entity.getIdProperty();
MongoPersistentProperty versionProperty = entity.getVersionProperty();
- Number version = beanWrapper.getProperty(versionProperty, Number.class, !versionProperty.usePropertyAccess());
+ Number version = beanWrapper.getProperty(versionProperty, Number.class);
// Fresh instance -> initialize version property
if (version == null) {
@@ -855,7 +855,7 @@ public void save(Object objectToSave, String collectionName) {
Query query = new Query(Criteria.where(idProperty.getName()).is(id).and(versionProperty.getName()).is(version));
// Bump version number
- Number number = beanWrapper.getProperty(versionProperty, Number.class, false);
+ Number number = beanWrapper.getProperty(versionProperty, Number.class);
beanWrapper.setProperty(versionProperty, number.longValue() + 1);
BasicDBObject dbObject = new BasicDBObject();
@@ -1088,7 +1088,7 @@ private Query getIdQueryFor(Object object) {
ConversionService service = mongoConverter.getConversionService();
Object idProperty = null;
- idProperty = BeanWrapper.create(object, service).getProperty(idProp, Object.class, true);
+ idProperty = BeanWrapper.create(object, service).getProperty(idProp, Object.class);
return new Query(where(idProp.getFieldName()).is(idProperty));
}
@@ -1102,7 +1102,7 @@ private void assertUpdateableIdIfNotSet(Object entity) {
}
ConversionService service = mongoConverter.getConversionService();
- Object idValue = BeanWrapper.create(entity, service).getProperty(idProperty, Object.class, true);
+ Object idValue = BeanWrapper.create(entity, service).getProperty(idProperty, Object.class);
if (idValue == null && !MongoSimpleTypes.AUTOGENERATED_ID_TYPES.contains(idProperty.getType())) {
throw new InvalidDataAccessApiUsageException(String.format(
@@ -1614,7 +1614,7 @@ protected void populateIdIfNecessary(Object savedObject, Object id) {
ConversionService conversionService = mongoConverter.getConversionService();
BeanWrapper<PersistentEntity<Object, ?>, Object> wrapper = BeanWrapper.create(savedObject, conversionService);
- Object idValue = wrapper.getProperty(idProp, idProp.getType(), true);
+ Object idValue = wrapper.getProperty(idProp, idProp.getType());
if (idValue != null) {
return;
@@ -82,7 +82,6 @@
protected final QueryMapper idMapper;
protected final DbRefResolver dbRefResolver;
protected ApplicationContext applicationContext;
- protected boolean useFieldAccessOnly = true;
protected MongoTypeMapper typeMapper;
protected String mapKeyDotReplacement = null;
@@ -166,17 +165,6 @@ public void setMapKeyDotReplacement(String mapKeyDotReplacement) {
return mappingContext;
}
- /**
- * Configures whether to use field access only for entity mapping. Setting this to true will force the
- * {@link MongoConverter} to not go through getters or setters even if they are present for getting and setting
- * property values.
- *
- * @param useFieldAccessOnly
- */
- public void setUseFieldAccessOnly(boolean useFieldAccessOnly) {
- this.useFieldAccessOnly = useFieldAccessOnly;
- }
-
/*
* (non-Javadoc)
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
@@ -266,7 +254,7 @@ public void doWithPersistentProperty(MongoPersistentProperty prop) {
}
Object obj = getValueInternal(prop, dbo, evaluator, result);
- wrapper.setProperty(prop, obj, useFieldAccessOnly);
+ wrapper.setProperty(prop, obj);
}
});
@@ -380,10 +368,8 @@ protected void writeInternal(Object obj, final DBObject dbo, MongoPersistentEnti
if (!dbo.containsField("_id") && null != idProperty) {
- boolean fieldAccessOnly = idProperty.usePropertyAccess() ? false : useFieldAccessOnly;
-
try {
- Object id = wrapper.getProperty(idProperty, Object.class, fieldAccessOnly);
+ Object id = wrapper.getProperty(idProperty, Object.class);
dbo.put("_id", idMapper.convertId(id));
} catch (ConversionException ignored) {}
}
@@ -396,9 +382,7 @@ public void doWithPersistentProperty(MongoPersistentProperty prop) {
return;
}
- boolean fieldAccessOnly = prop.usePropertyAccess() ? false : useFieldAccessOnly;
-
- Object propertyObj = wrapper.getProperty(prop, prop.getType(), fieldAccessOnly);
+ Object propertyObj = wrapper.getProperty(prop);
if (null != propertyObj) {
if (!conversions.isSimpleType(propertyObj.getClass())) {
@@ -414,7 +398,7 @@ public void doWithPersistentProperty(MongoPersistentProperty prop) {
public void doWithAssociation(Association<MongoPersistentProperty> association) {
MongoPersistentProperty inverseProp = association.getInverse();
Class<?> type = inverseProp.getType();
- Object propertyObj = wrapper.getProperty(inverseProp, type, useFieldAccessOnly);
+ Object propertyObj = wrapper.getProperty(inverseProp, type);
if (null != propertyObj) {
writePropertyInternal(propertyObj, dbo, inverseProp);
}
@@ -769,7 +753,7 @@ protected DBRef createDBRef(Object target, MongoPersistentProperty property) {
id = target;
} else {
BeanWrapper<MongoPersistentEntity<Object>, Object> wrapper = BeanWrapper.create(target, conversionService);
- id = wrapper.getProperty(idProperty, Object.class, useFieldAccessOnly);
+ id = wrapper.getProperty(idProperty, Object.class);
}
if (null == id) {
@@ -15,7 +15,6 @@
*/
package org.springframework.data.mongodb.core.index;
-import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -119,30 +118,28 @@ protected void checkForIndexes(final MongoPersistentEntity<?> entity) {
}
entity.doWithProperties(new PropertyHandler<MongoPersistentProperty>() {
- public void doWithPersistentProperty(MongoPersistentProperty persistentProperty) {
+ public void doWithPersistentProperty(MongoPersistentProperty property) {
- Field field = persistentProperty.getField();
+ if (property.isAnnotationPresent(Indexed.class)) {
- if (field.isAnnotationPresent(Indexed.class)) {
-
- Indexed index = field.getAnnotation(Indexed.class);
+ Indexed index = property.findAnnotation(Indexed.class);
String name = index.name();
if (!StringUtils.hasText(name)) {
- name = persistentProperty.getFieldName();
+ name = property.getFieldName();
} else {
- if (!name.equals(field.getName()) && index.unique() && !index.sparse()) {
+ if (!name.equals(property.getName()) && index.unique() && !index.sparse()) {
// Names don't match, and sparse is not true. This situation will generate an error on the server.
if (LOGGER.isWarnEnabled()) {
- LOGGER.warn("The index name " + name + " doesn't match this property name: " + field.getName()
+ LOGGER.warn("The index name " + name + " doesn't match this property name: " + property.getName()
+ ". Setting sparse=true on this index will prevent errors when inserting documents.");
}
}
}
String collection = StringUtils.hasText(index.collection()) ? index.collection() : entity.getCollection();
int direction = index.direction() == IndexDirection.ASCENDING ? 1 : -1;
- DBObject definition = new BasicDBObject(persistentProperty.getFieldName(), direction);
+ DBObject definition = new BasicDBObject(property.getFieldName(), direction);
ensureIndex(collection, name, definition, index.unique(), index.dropDups(), index.sparse(),
index.background(), index.expireAfterSeconds());
@@ -151,13 +148,13 @@ public void doWithPersistentProperty(MongoPersistentProperty persistentProperty)
LOGGER.debug("Created property index " + index);
}
- } else if (field.isAnnotationPresent(GeoSpatialIndexed.class)) {
+ } else if (property.isAnnotationPresent(GeoSpatialIndexed.class)) {
- GeoSpatialIndexed index = field.getAnnotation(GeoSpatialIndexed.class);
+ GeoSpatialIndexed index = property.findAnnotation(GeoSpatialIndexed.class);
- GeospatialIndex indexObject = new GeospatialIndex(persistentProperty.getFieldName());
+ GeospatialIndex indexObject = new GeospatialIndex(property.getFieldName());
indexObject.withMin(index.min()).withMax(index.max());
- indexObject.named(StringUtils.hasText(index.name()) ? index.name() : field.getName());
+ indexObject.named(StringUtils.hasText(index.name()) ? index.name() : property.getName());
indexObject.typed(index.type()).withBucketSize(index.bucketSize())
.withAdditionalField(index.additionalField());
@@ -29,7 +29,6 @@
import org.springframework.data.mapping.model.AnnotationBasedPersistentProperty;
import org.springframework.data.mapping.model.MappingException;
import org.springframework.data.mapping.model.SimpleTypeHolder;
-import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
import com.mongodb.DBObject;
@@ -50,17 +49,14 @@
private static final Set<Class<?>> SUPPORTED_ID_TYPES = new HashSet<Class<?>>();
private static final Set<String> SUPPORTED_ID_PROPERTY_NAMES = new HashSet<String>();
- private static final Field CAUSE_FIELD;
-
static {
+
SUPPORTED_ID_TYPES.add(ObjectId.class);
SUPPORTED_ID_TYPES.add(String.class);
SUPPORTED_ID_TYPES.add(BigInteger.class);
SUPPORTED_ID_PROPERTY_NAMES.add("id");
SUPPORTED_ID_PROPERTY_NAMES.add("_id");
-
- CAUSE_FIELD = ReflectionUtils.findField(Throwable.class, "cause");
}
private final FieldNamingStrategy fieldNamingStrategy;
@@ -86,14 +82,6 @@ public BasicMongoPersistentProperty(Field field, PropertyDescriptor propertyDesc
}
}
- /* (non-Javadoc)
- * @see org.springframework.data.mapping.FooBasicPersistentProperty#isAssociation()
- */
- @Override
- public boolean isAssociation() {
- return field.isAnnotationPresent(DBRef.class) || super.isAssociation();
- }
-
/**
* Also considers fields as id that are of supported id type and name.
*
@@ -108,7 +96,7 @@ public boolean isIdProperty() {
}
// We need to support a wider range of ID types than just the ones that can be converted to an ObjectId
- return SUPPORTED_ID_PROPERTY_NAMES.contains(field.getName());
+ return SUPPORTED_ID_PROPERTY_NAMES.contains(getName());
}
/*
@@ -163,8 +151,7 @@ public String getFieldName() {
* @see org.springframework.data.mongodb.core.mapping.MongoPersistentProperty#getFieldOrder()
*/
public int getFieldOrder() {
- org.springframework.data.mongodb.core.mapping.Field annotation = getField().getAnnotation(
- org.springframework.data.mongodb.core.mapping.Field.class);
+ org.springframework.data.mongodb.core.mapping.Field annotation = findAnnotation(org.springframework.data.mongodb.core.mapping.Field.class);
return annotation != null ? annotation.order() : Integer.MAX_VALUE;
}
@@ -182,22 +169,14 @@ public int getFieldOrder() {
* @see org.springframework.data.mongodb.core.mapping.MongoPersistentProperty#isDbReference()
*/
public boolean isDbReference() {
- return getField().isAnnotationPresent(DBRef.class);
+ return isAnnotationPresent(DBRef.class);
}
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.mapping.MongoPersistentProperty#getDBRef()
*/
public DBRef getDBRef() {
- return getField().getAnnotation(DBRef.class);
- }
-
- /*
- * (non-Javadoc)
- * @see org.springframework.data.mongodb.core.mapping.MongoPersistentProperty#usePropertyAccess()
- */
- public boolean usePropertyAccess() {
- return CAUSE_FIELD.equals(getField());
+ return findAnnotation(DBRef.class);
}
}

0 comments on commit 4eae229

Please sign in to comment.