DATACOUCH-390 - Adapt API changes for immutable entity support.

Related tickets: DATACMNS-1322.
This commit is contained in:
Oliver Gierke
2018-07-12 16:26:03 +02:00
parent cb0f453ddf
commit ed6820e3a4
3 changed files with 36 additions and 32 deletions

View File

@@ -578,7 +578,7 @@ public class CouchbaseTemplate implements CouchbaseOperations, ApplicationEventP
final PersistType persistType) {
ensureNotIterable(objectToPersist);
final ConvertingPropertyAccessor accessor = getPropertyAccessor(objectToPersist);
final ConvertingPropertyAccessor<Object> accessor = getPropertyAccessor(objectToPersist);
final CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(objectToPersist.getClass());
final CouchbasePersistentProperty versionProperty = persistentEntity.getVersionProperty();
final Long version = versionProperty != null ? accessor.getProperty(versionProperty, Long.class) : null;
@@ -692,28 +692,30 @@ public class CouchbaseTemplate implements CouchbaseOperations, ApplicationEventP
}
private <T> T mapToEntity(String id, Document<String> data, Class<T> entityClass) {
if (data == null) {
return null;
}
final CouchbaseDocument converted = new CouchbaseDocument(id);
Object readEntity = converter.read(entityClass, (CouchbaseDocument) decodeAndUnwrap(data, converted));
T readEntity = converter.read(entityClass, (CouchbaseDocument) decodeAndUnwrap(data, converted));
final ConvertingPropertyAccessor accessor = getPropertyAccessor(readEntity);
final ConvertingPropertyAccessor<T> accessor = getPropertyAccessor(readEntity);
CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(readEntity.getClass());
if (persistentEntity.getVersionProperty() != null) {
accessor.setProperty(persistentEntity.getVersionProperty(), data.cas());
}
}
return (T) readEntity;
return accessor.getBean();
}
private final ConvertingPropertyAccessor getPropertyAccessor(Object source) {
CouchbasePersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(source.getClass());
PersistentPropertyAccessor accessor = entity.getPropertyAccessor(source);
private final <T> ConvertingPropertyAccessor<T> getPropertyAccessor(T source) {
return new ConvertingPropertyAccessor(accessor, converter.getConversionService());
CouchbasePersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(source.getClass());
PersistentPropertyAccessor<T> accessor = entity.getPropertyAccessor(source);
return new ConvertingPropertyAccessor<>(accessor, converter.getConversionService());
}
private void checkN1ql() {

View File

@@ -194,11 +194,12 @@ public class RxJavaCouchbaseTemplate implements RxJavaCouchbaseOperations {
return c;
}
private final ConvertingPropertyAccessor getPropertyAccessor(Object source) {
CouchbasePersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(source.getClass());
PersistentPropertyAccessor accessor = entity.getPropertyAccessor(source);
private final <T> ConvertingPropertyAccessor<T> getPropertyAccessor(T source) {
return new ConvertingPropertyAccessor(accessor, converter.getConversionService());
CouchbasePersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(source.getClass());
PersistentPropertyAccessor<T> accessor = entity.getPropertyAccessor(source);
return new ConvertingPropertyAccessor<>(accessor, converter.getConversionService());
}
private <T> Observable<T> doPersist(T objectToPersist, PersistType persistType, PersistTo persistTo, ReplicateTo replicateTo) {
@@ -227,12 +228,9 @@ public class RxJavaCouchbaseTemplate implements RxJavaCouchbaseOperations {
break;
}
return persistFunction.call(toJsonDocument(objectToPersist), persistTo, replicateTo)
.flatMap(storedDoc -> {
if (storedDoc != null && storedDoc.cas() != 0) {
setVersion(objectToPersist, storedDoc.cas());
}
return Observable.just(objectToPersist);
})
.flatMap(storedDoc -> Observable.just(storedDoc != null && storedDoc.cas() != 0
? setVersion(objectToPersist, storedDoc.cas())
: objectToPersist))
.onErrorResumeNext(e -> {
if (e instanceof DocumentAlreadyExistsException) {
throw new OptimisticLockingFailureException(persistType.springDataOperationName +
@@ -259,22 +257,25 @@ public class RxJavaCouchbaseTemplate implements RxJavaCouchbaseOperations {
}
private <T> Long getVersion(T object) {
final ConvertingPropertyAccessor accessor = getPropertyAccessor(object);
CouchbasePersistentProperty versionProperty = versionProperty(object);
if (versionProperty != null) {
return accessor.getProperty(versionProperty, Long.class);
}
return null;
return versionProperty == null //
? null //
: getPropertyAccessor(object).getProperty(versionProperty, Long.class);
}
private <T> void setVersion(T object, long cas) {
final ConvertingPropertyAccessor accessor = getPropertyAccessor(object);
private <T> T setVersion(T object, long version) {
CouchbasePersistentProperty versionProperty = versionProperty(object);
if (versionProperty != null) {
accessor.setProperty(versionProperty, cas);
if (versionProperty == null) {
return object;
}
final ConvertingPropertyAccessor<T> accessor = getPropertyAccessor(object);
accessor.setProperty(versionProperty, version);
return accessor.getBean();
}
private <T> Observable<T> doRemove(T objectToRemove, final PersistTo persistTo, final ReplicateTo replicateTo) {

View File

@@ -464,7 +464,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter
throw new MappingException("No mapping metadata found for entity of type " + source.getClass().getName());
}
final ConvertingPropertyAccessor accessor = getPropertyAccessor(source);
final ConvertingPropertyAccessor<Object> accessor = getPropertyAccessor(source);
final CouchbasePersistentProperty idProperty = entity.getIdProperty();
final CouchbasePersistentProperty versionProperty = entity.getVersionProperty();
@@ -811,11 +811,12 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter
}
}
private ConvertingPropertyAccessor getPropertyAccessor(Object source) {
private ConvertingPropertyAccessor<Object> getPropertyAccessor(Object source) {
CouchbasePersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(source.getClass());
PersistentPropertyAccessor accessor = entity.getPropertyAccessor(source);
PersistentPropertyAccessor<Object> accessor = entity.getPropertyAccessor(source);
return new ConvertingPropertyAccessor(accessor, conversionService);
return new ConvertingPropertyAccessor<>(accessor, conversionService);
}
/**