DATACASS-113 - Adapted changes in BeanWrapper API.

Adapted reduced generics in BeanWrapper from Spring Data Commons. Also as of DATACMNS-243, the decision about property or field access for persistent properties is solely made by the PersistentProperty implementation.

Related issues: DATACMNS-468, DATACMNS-243.
This commit is contained in:
Oliver Gierke
2014-03-19 12:11:40 +01:00
parent 633eb08ad8
commit 2b9ddab985
2 changed files with 30 additions and 66 deletions

View File

@@ -15,7 +15,7 @@
*/
package org.springframework.data.cassandra.convert;
import static org.springframework.data.cassandra.repository.support.BasicMapId.id;
import static org.springframework.data.cassandra.repository.support.BasicMapId.*;
import java.io.Serializable;
import java.util.Map;
@@ -56,6 +56,7 @@ import com.datastax.driver.core.querybuilder.Update;
*
* @author Alex Shvid
* @author Matthew T. Adams
* @author Oliver Gierke
*/
public class MappingCassandraConverter extends AbstractCassandraConverter implements CassandraConverter,
ApplicationContextAware, BeanClassLoaderAware {
@@ -65,7 +66,6 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
protected final CassandraMappingContext mappingContext;
protected ApplicationContext applicationContext;
protected SpELContext spELContext;
protected boolean useFieldAccessOnly = true;
protected ClassLoader beanClassLoader;
@@ -124,7 +124,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
EntityInstantiator instantiator = instantiators.getInstantiatorFor(entity);
S instance = instantiator.createInstance(entity, parameterProvider);
BeanWrapper<CassandraPersistentEntity<S>, S> wrapper = BeanWrapper.create(instance, conversionService);
BeanWrapper<S> wrapper = BeanWrapper.create(instance, conversionService);
readPropertiesFromRow(entity, rowValueProvider, wrapper);
@@ -132,7 +132,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
}
protected void readPropertiesFromRow(final CassandraPersistentEntity<?> entity,
final BasicCassandraRowValueProvider row, final BeanWrapper<?, ?> wrapper) {
final BasicCassandraRowValueProvider row, final BeanWrapper<?> wrapper) {
entity.doWithProperties(new PropertyHandler<CassandraPersistentProperty>() {
@@ -145,7 +145,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
}
protected void readPropertyFromRow(final CassandraPersistentEntity<?> entity, final CassandraPersistentProperty prop,
final BasicCassandraRowValueProvider row, final BeanWrapper<?, ?> wrapper) {
final BasicCassandraRowValueProvider row, final BeanWrapper<?> wrapper) {
if (entity.isConstructorArgument(prop)) { // skip 'cause prop was set in ctor
return;
@@ -161,14 +161,13 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
}
// wrap the key
@SuppressWarnings("rawtypes")
BeanWrapper keyWrapper = BeanWrapper.create(key, conversionService);
BeanWrapper<Object> keyWrapper = BeanWrapper.create(key, conversionService);
// now recurse on using the key this time
readPropertiesFromRow(prop.getCompositePrimaryKeyEntity(), row, keyWrapper);
// now that the key's properties have been populated, set the key property on the entity
wrapper.setProperty(keyProperty, keyWrapper.getBean(), useFieldAccessOnly);
wrapper.setProperty(keyProperty, keyWrapper.getBean());
return;
}
@@ -177,7 +176,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
}
Object obj = row.getPropertyValue(prop);
wrapper.setProperty(prop, obj, useFieldAccessOnly);
wrapper.setProperty(prop, obj);
}
protected Object instantiatePrimaryKey(CassandraPersistentEntity<?> entity, CassandraPersistentProperty keyProperty,
@@ -189,14 +188,6 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
propertyProvider, null));
}
public boolean getUseFieldAccessOnly() {
return useFieldAccessOnly;
}
public void setUseFieldAccessOnly(boolean useFieldAccessOnly) {
this.useFieldAccessOnly = useFieldAccessOnly;
}
@Override
public <R> R read(Class<R> type, Object row) {
if (row instanceof Row) {
@@ -231,23 +222,21 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
}
protected void writeInsertFromObject(final Object object, final Insert insert, CassandraPersistentEntity<?> entity) {
writeInsertFromWrapper(BeanWrapper.<CassandraPersistentEntity<Object>, Object> create(object, conversionService),
insert, entity);
writeInsertFromWrapper(BeanWrapper.create(object, conversionService), insert, entity);
}
protected void writeInsertFromWrapper(final BeanWrapper<CassandraPersistentEntity<Object>, Object> wrapper,
final Insert insert, CassandraPersistentEntity<?> entity) {
protected void writeInsertFromWrapper(final BeanWrapper<Object> wrapper, final Insert insert,
CassandraPersistentEntity<?> entity) {
entity.doWithProperties(new PropertyHandler<CassandraPersistentProperty>() {
@Override
public void doWithPersistentProperty(CassandraPersistentProperty prop) {
Object value = wrapper.getProperty(prop, prop.getType(), useFieldAccessOnly);
Object value = wrapper.getProperty(prop, prop.getType());
if (prop.isCompositePrimaryKey()) {
writeInsertFromWrapper(
BeanWrapper.<CassandraPersistentEntity<Object>, Object> create(value, conversionService), insert,
writeInsertFromWrapper(BeanWrapper.create(value, conversionService), insert,
prop.getCompositePrimaryKeyEntity());
return;
}
@@ -260,23 +249,21 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
}
protected void writeUpdateFromObject(final Object object, final Update update, CassandraPersistentEntity<?> entity) {
writeUpdateFromWrapper(BeanWrapper.<CassandraPersistentEntity<Object>, Object> create(object, conversionService),
update, entity);
writeUpdateFromWrapper(BeanWrapper.create(object, conversionService), update, entity);
}
protected void writeUpdateFromWrapper(final BeanWrapper<CassandraPersistentEntity<Object>, Object> wrapper,
final Update update, final CassandraPersistentEntity<?> entity) {
protected void writeUpdateFromWrapper(final BeanWrapper<Object> wrapper, final Update update,
final CassandraPersistentEntity<?> entity) {
entity.doWithProperties(new PropertyHandler<CassandraPersistentProperty>() {
@Override
public void doWithPersistentProperty(CassandraPersistentProperty prop) {
Object value = wrapper.getProperty(prop, prop.getType(), useFieldAccessOnly);
Object value = wrapper.getProperty(prop, prop.getType());
if (prop.isCompositePrimaryKey()) {
writeUpdateFromWrapper(
BeanWrapper.<CassandraPersistentEntity<Object>, Object> create(value, conversionService), update,
writeUpdateFromWrapper(BeanWrapper.create(value, conversionService), update,
prop.getCompositePrimaryKeyEntity());
return;
}
@@ -293,12 +280,11 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
}
protected void writeDeleteWhereFromObject(final Object object, final Where where, CassandraPersistentEntity<?> entity) {
writeDeleteWhereFromWrapper(
BeanWrapper.<CassandraPersistentEntity<Object>, Object> create(object, conversionService), where, entity);
writeDeleteWhereFromWrapper(BeanWrapper.create(object, conversionService), where, entity);
}
protected void writeDeleteWhereFromWrapper(final BeanWrapper<CassandraPersistentEntity<Object>, Object> wrapper,
final Where where, CassandraPersistentEntity<?> entity) {
protected void writeDeleteWhereFromWrapper(final BeanWrapper<Object> wrapper, final Where where,
CassandraPersistentEntity<?> entity) {
Object id = getId(wrapper, entity);
if (id == null) {
@@ -319,8 +305,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
if (idProperty != null) {
if (idProperty.isCompositePrimaryKey()) {
writeDeleteWhereFromWrapper(
BeanWrapper.<CassandraPersistentEntity<Object>, Object> create(id, conversionService), where,
writeDeleteWhereFromWrapper(BeanWrapper.create(id, conversionService), where,
idProperty.getCompositePrimaryKeyEntity());
return;
}
@@ -335,8 +320,8 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
Assert.notNull(object);
final BeanWrapper<?, ?> wrapper = (object instanceof BeanWrapper) ? (BeanWrapper<?, ?>) object : BeanWrapper
.create(object, conversionService);
final BeanWrapper<?> wrapper = object instanceof BeanWrapper ? (BeanWrapper<?>) object : BeanWrapper.create(object,
conversionService);
object = wrapper == null ? object : wrapper.getBean();
if (!entity.getType().isAssignableFrom(object.getClass())) {
@@ -351,7 +336,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
CassandraPersistentProperty idProperty = entity.getIdProperty();
if (idProperty != null) {
return wrapper.getProperty(entity.getIdProperty(), idProperty.getType(), useFieldAccessOnly);
return wrapper.getProperty(entity.getIdProperty(), idProperty.getType());
}
// if the class doesn't have an id property, then it's using MapId
@@ -361,7 +346,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem
@Override
public void doWithPersistentProperty(CassandraPersistentProperty p) {
if (p.isPrimaryKeyColumn()) {
id.with(p.getName(), (Serializable) wrapper.getProperty(p, p.getType(), useFieldAccessOnly));
id.with(p.getName(), (Serializable) wrapper.getProperty(p, p.getType()));
}
}
});

View File

@@ -55,20 +55,18 @@ import com.datastax.driver.core.querybuilder.Update;
* @author Alex Shvid
* @author David Webb
* @author Matthew T. Adams
*
* @author Oliver Gierke
* @see CqlTemplate
*/
public class CassandraTemplate extends CqlTemplate implements CassandraOperations {
protected CassandraConverter cassandraConverter;
protected CassandraMappingContext mappingContext;
protected boolean useFieldAccessOnly = false;
/**
* Default Constructor for wiring in the required components later
*/
public CassandraTemplate() {
}
public CassandraTemplate() {}
/**
* Constructor if only session and converter are known at time of Template Creation
@@ -98,19 +96,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation
return mappingContext;
}
public boolean getUseFieldAccessOnly() {
return useFieldAccessOnly;
}
/**
* Whether only fields should be used when accessing a persistent entity's data.
*
* @param useFieldAccessOnly
*/
public void setUseFieldAccessOnly(boolean useFieldAccessOnly) {
this.useFieldAccessOnly = useFieldAccessOnly;
}
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
@@ -313,8 +298,7 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation
CassandraPersistentEntity<?> idEntity = idProperty.getCompositePrimaryKeyEntity();
final BeanWrapper<CassandraPersistentEntity<Object>, Object> idWrapper = BeanWrapper
.<CassandraPersistentEntity<Object>, Object> create(id, cassandraConverter.getConversionService());
final BeanWrapper<Object> idWrapper = BeanWrapper.create(id, cassandraConverter.getConversionService());
idEntity.doWithProperties(new PropertyHandler<CassandraPersistentProperty>() {
@@ -322,7 +306,7 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation
public void doWithPersistentProperty(CassandraPersistentProperty p) {
clauseCallback.doWithClause(QueryBuilder.eq(p.getColumnName().toCql(),
idWrapper.getProperty(p, p.getActualType(), useFieldAccessOnly)));
idWrapper.getProperty(p, p.getActualType())));
}
});
@@ -595,7 +579,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation
* @param objectToSave
* @param entity
* @param optionsByName
*
* @return The Query object to run with session.execute();
*/
public static Insert createInsertQuery(String tableName, Object objectToSave, QueryOptions options,
@@ -623,7 +606,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation
* @param objectToSave
* @param entity
* @param optionsByName
*
* @return The Query object to run with session.execute();
*/
public static Update toUpdateQuery(String tableName, Object objectToSave, QueryOptions options,
@@ -651,7 +633,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation
* @param objectsToSave
* @param entity
* @param optionsByName
*
* @return The Query object to run with session.execute();
*/
public static <T> Batch toUpdateBatchQuery(String tableName, List<T> objectsToSave, QueryOptions options,
@@ -684,7 +665,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation
* @param entities
* @param entity
* @param optionsByName
*
* @return The Query object to run with session.execute();
*/
public static <T> Batch createInsertBatchQuery(String tableName, List<T> entities, QueryOptions options,
@@ -731,7 +711,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation
* @param entities
* @param entity
* @param optionsByName
*
* @return
*/
public static <T> Batch createDeleteBatchQuery(String tableName, List<T> entities, QueryOptions options,