DATACOUCH-519 - Apply formatting for changes
This commit is contained in:
@@ -17,7 +17,9 @@
|
||||
package org.springframework.data.couchbase.core;
|
||||
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.context.*;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
||||
import org.springframework.data.couchbase.CouchbaseClientFactory;
|
||||
@@ -32,8 +34,7 @@ import org.springframework.lang.Nullable;
|
||||
import com.couchbase.client.java.Collection;
|
||||
|
||||
/**
|
||||
* Implements Couchbase operations
|
||||
* findBy, insertBy, upsertBy, replaceBy, removeBy, existsBy
|
||||
* Implements Couchbase operations findBy, insertBy, upsertBy, replaceBy, removeBy, existsBy
|
||||
*
|
||||
* @author Michael Nitschinger
|
||||
* @author Michael Reiche
|
||||
|
||||
@@ -27,7 +27,11 @@ import org.springframework.data.couchbase.core.convert.translation.TranslationSe
|
||||
import org.springframework.data.couchbase.core.mapping.CouchbaseDocument;
|
||||
import org.springframework.data.couchbase.core.mapping.CouchbasePersistentEntity;
|
||||
import org.springframework.data.couchbase.core.mapping.CouchbasePersistentProperty;
|
||||
import org.springframework.data.couchbase.core.mapping.event.*;
|
||||
import org.springframework.data.couchbase.core.mapping.event.AfterConvertCallback;
|
||||
import org.springframework.data.couchbase.core.mapping.event.BeforeConvertCallback;
|
||||
import org.springframework.data.couchbase.core.mapping.event.BeforeConvertEvent;
|
||||
import org.springframework.data.couchbase.core.mapping.event.BeforeSaveEvent;
|
||||
import org.springframework.data.couchbase.core.mapping.event.CouchbaseMappingEvent;
|
||||
import org.springframework.data.couchbase.repository.support.MappingCouchbaseEntityInformation;
|
||||
import org.springframework.data.mapping.PersistentPropertyAccessor;
|
||||
import org.springframework.data.mapping.callback.EntityCallbacks;
|
||||
@@ -49,8 +53,8 @@ public class CouchbaseTemplateSupport implements ApplicationContextAware {
|
||||
private final MappingContext<? extends CouchbasePersistentEntity<?>, CouchbasePersistentProperty> mappingContext;
|
||||
// TODO: this should be replaced I think
|
||||
private final TranslationService translationService;
|
||||
private ApplicationContext applicationContext;
|
||||
EntityCallbacks entityCallbacks;
|
||||
private ApplicationContext applicationContext;
|
||||
|
||||
public CouchbaseTemplateSupport(final CouchbaseConverter converter) {
|
||||
this.converter = converter;
|
||||
@@ -74,8 +78,7 @@ public class CouchbaseTemplateSupport implements ApplicationContextAware {
|
||||
|
||||
T readEntity = converter.read(entityClass, (CouchbaseDocument) translationService.decode(source, converted));
|
||||
final ConvertingPropertyAccessor<T> accessor = getPropertyAccessor(readEntity);
|
||||
CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(
|
||||
readEntity.getClass());
|
||||
CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(readEntity.getClass());
|
||||
|
||||
if (persistentEntity.getVersionProperty() != null) {
|
||||
accessor.setProperty(persistentEntity.getVersionProperty(), cas);
|
||||
@@ -85,8 +88,7 @@ public class CouchbaseTemplateSupport implements ApplicationContextAware {
|
||||
|
||||
public void applyUpdatedCas(final Object entity, final long cas) {
|
||||
final ConvertingPropertyAccessor<Object> accessor = getPropertyAccessor(entity);
|
||||
final CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(
|
||||
entity.getClass());
|
||||
final CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(entity.getClass());
|
||||
final CouchbasePersistentProperty versionProperty = persistentEntity.getVersionProperty();
|
||||
|
||||
if (versionProperty != null) {
|
||||
|
||||
@@ -19,7 +19,6 @@ package org.springframework.data.couchbase.core;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
||||
import org.springframework.data.couchbase.CouchbaseClientFactory;
|
||||
|
||||
@@ -33,8 +33,6 @@ import org.springframework.context.ApplicationContextAware;
|
||||
import org.springframework.core.CollectionFactory;
|
||||
import org.springframework.core.convert.ConversionService;
|
||||
import org.springframework.core.convert.support.DefaultConversionService;
|
||||
import org.springframework.data.annotation.CreatedDate;
|
||||
import org.springframework.data.annotation.LastModifiedDate;
|
||||
import org.springframework.data.convert.EntityInstantiator;
|
||||
import org.springframework.data.couchbase.core.mapping.CouchbaseDocument;
|
||||
import org.springframework.data.couchbase.core.mapping.CouchbaseList;
|
||||
@@ -64,9 +62,9 @@ import org.springframework.data.mapping.model.SpELExpressionEvaluator;
|
||||
import org.springframework.data.mapping.model.SpELExpressionParameterValueProvider;
|
||||
import org.springframework.data.util.ClassTypeInformation;
|
||||
import org.springframework.data.util.TypeInformation;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
/**
|
||||
* A mapping converter for Couchbase. The converter is responsible for reading from and writing to entities and
|
||||
@@ -112,8 +110,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
/**
|
||||
* Callbacks for Audit Mechanism
|
||||
*/
|
||||
private @Nullable
|
||||
EntityCallbacks entityCallbacks;
|
||||
private @Nullable EntityCallbacks entityCallbacks;
|
||||
|
||||
public MappingCouchbaseConverter() {
|
||||
super(new DefaultConversionService());
|
||||
@@ -138,7 +135,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
* attribute.
|
||||
*
|
||||
* @param mappingContext the mapping context to use.
|
||||
* @param typeKey the attribute name to use to store complex types class name.
|
||||
* @param typeKey the attribute name to use to store complex types class name.
|
||||
*/
|
||||
public MappingCouchbaseConverter(
|
||||
final MappingContext<? extends CouchbasePersistentEntity<?>, CouchbasePersistentProperty> mappingContext,
|
||||
@@ -167,7 +164,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
/**
|
||||
* Check if one class is a subtype of the other.
|
||||
*
|
||||
* @param left the first class.
|
||||
* @param left the first class.
|
||||
* @param right the second class.
|
||||
* @return true if it is a subtype, false otherwise.
|
||||
*/
|
||||
@@ -193,9 +190,9 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
/**
|
||||
* Read an incoming {@link CouchbaseDocument} into the target entity.
|
||||
*
|
||||
* @param type the type information of the target entity.
|
||||
* @param type the type information of the target entity.
|
||||
* @param source the document to convert.
|
||||
* @param <R> the entity type.
|
||||
* @param <R> the entity type.
|
||||
* @return the converted entity.
|
||||
*/
|
||||
protected <R> R read(final TypeInformation<R> type, final CouchbaseDocument source) {
|
||||
@@ -205,10 +202,10 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
/**
|
||||
* Read an incoming {@link CouchbaseDocument} into the target entity.
|
||||
*
|
||||
* @param type the type information of the target entity.
|
||||
* @param type the type information of the target entity.
|
||||
* @param source the document to convert.
|
||||
* @param parent an optional parent object.
|
||||
* @param <R> the entity type.
|
||||
* @param <R> the entity type.
|
||||
* @return the converted entity.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -228,8 +225,8 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
return (R) readMap(typeToUse, source, parent);
|
||||
}
|
||||
|
||||
CouchbasePersistentEntity<R> entity = (CouchbasePersistentEntity<R>) mappingContext.getRequiredPersistentEntity(
|
||||
typeToUse);
|
||||
CouchbasePersistentEntity<R> entity = (CouchbasePersistentEntity<R>) mappingContext
|
||||
.getRequiredPersistentEntity(typeToUse);
|
||||
return read(entity, source, parent);
|
||||
}
|
||||
|
||||
@@ -243,11 +240,10 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
* @param entity the target entity.
|
||||
* @param source the document to convert.
|
||||
* @param parent an optional parent object.
|
||||
* @param <R> the entity type.
|
||||
* @param <R> the entity type.
|
||||
* @return the converted entity.
|
||||
*/
|
||||
protected <R> R read(final CouchbasePersistentEntity<R> entity, final CouchbaseDocument source,
|
||||
final Object parent) {
|
||||
protected <R> R read(final CouchbasePersistentEntity<R> entity, final CouchbaseDocument source, final Object parent) {
|
||||
final DefaultSpELExpressionEvaluator evaluator = new DefaultSpELExpressionEvaluator(source, spELContext);
|
||||
ParameterValueProvider<CouchbasePersistentProperty> provider = getParameterProvider(entity, source, evaluator,
|
||||
parent);
|
||||
@@ -259,8 +255,8 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
entity.doWithProperties(new PropertyHandler<CouchbasePersistentProperty>() {
|
||||
@Override
|
||||
public void doWithPersistentProperty(final CouchbasePersistentProperty prop) {
|
||||
if (!doesPropertyExistInSource(prop) || entity.isConstructorArgument(prop) || isIdConstructionProperty(
|
||||
prop) || prop.isAnnotationPresent(N1qlJoin.class)) {
|
||||
if (!doesPropertyExistInSource(prop) || entity.isConstructorArgument(prop) || isIdConstructionProperty(prop)
|
||||
|| prop.isAnnotationPresent(N1qlJoin.class)) {
|
||||
return;
|
||||
}
|
||||
Object obj = prop.isIdProperty() ? source.getId() : getValueInternal(prop, source, instance);
|
||||
@@ -289,8 +285,8 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
* Loads the property value through the value provider.
|
||||
*
|
||||
* @param property the source property.
|
||||
* @param source the source document.
|
||||
* @param parent the optional parent.
|
||||
* @param source the source document.
|
||||
* @param parent the optional parent.
|
||||
* @return the actual property value.
|
||||
*/
|
||||
protected Object getValueInternal(final CouchbasePersistentProperty property, final CouchbaseDocument source,
|
||||
@@ -301,10 +297,10 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
/**
|
||||
* Creates a new parameter provider.
|
||||
*
|
||||
* @param entity the persistent entity.
|
||||
* @param source the source document.
|
||||
* @param entity the persistent entity.
|
||||
* @param source the source document.
|
||||
* @param evaluator the SPEL expression evaluator.
|
||||
* @param parent the optional parent.
|
||||
* @param parent the optional parent.
|
||||
* @return a new parameter value provider.
|
||||
*/
|
||||
private ParameterValueProvider<CouchbasePersistentProperty> getParameterProvider(
|
||||
@@ -321,7 +317,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
/**
|
||||
* Recursively parses the a map from the source document.
|
||||
*
|
||||
* @param type the type information for the document.
|
||||
* @param type the type information for the document.
|
||||
* @param source the source document.
|
||||
* @param parent the optional parent.
|
||||
* @return the recursively parsed map.
|
||||
@@ -362,7 +358,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
/**
|
||||
* Potentially convert simple values like ENUMs.
|
||||
*
|
||||
* @param value the value to convert.
|
||||
* @param value the value to convert.
|
||||
* @param target the target object.
|
||||
* @return the potentially converted object.
|
||||
*/
|
||||
@@ -406,16 +402,15 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
|
||||
writeInternal(source, target, type);
|
||||
if (target.getId() == null) {
|
||||
throw new MappingException(
|
||||
"An ID property is needed, but not found/could not be generated on this entity.");
|
||||
throw new MappingException("An ID property is needed, but not found/could not be generated on this entity.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a source object into a {@link CouchbaseDocument} target.
|
||||
*
|
||||
* @param source the source object.
|
||||
* @param target the target document.
|
||||
* @param source the source object.
|
||||
* @param target the target document.
|
||||
* @param typeHint the type information for the source.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -565,7 +560,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
*
|
||||
* @param source the source object.
|
||||
* @param target the target document.
|
||||
* @param prop the property information.
|
||||
* @param prop the property information.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private void writePropertyInternal(final Object source, final CouchbaseDocument target,
|
||||
@@ -615,9 +610,9 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
CouchbaseDocument propertyDoc = new CouchbaseDocument();
|
||||
addCustomTypeKeyIfNecessary(type, source, propertyDoc);
|
||||
|
||||
CouchbasePersistentEntity<?> entity = isSubtype(prop.getType(), source.getClass()) ?
|
||||
mappingContext.getRequiredPersistentEntity(source.getClass()) :
|
||||
mappingContext.getRequiredPersistentEntity(type);
|
||||
CouchbasePersistentEntity<?> entity = isSubtype(prop.getType(), source.getClass())
|
||||
? mappingContext.getRequiredPersistentEntity(source.getClass())
|
||||
: mappingContext.getRequiredPersistentEntity(type);
|
||||
writeInternal(source, propertyDoc, entity);
|
||||
target.put(name, propertyDoc);
|
||||
}
|
||||
@@ -625,7 +620,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
/**
|
||||
* Wrapper method to create the underlying map.
|
||||
*
|
||||
* @param map the source map.
|
||||
* @param map the source map.
|
||||
* @param prop the persistent property.
|
||||
* @return the written couchbase document.
|
||||
*/
|
||||
@@ -641,7 +636,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
*
|
||||
* @param source the source object.
|
||||
* @param target the target document.
|
||||
* @param type the type information for the document.
|
||||
* @param type the type information for the document.
|
||||
* @return the written couchbase document.
|
||||
*/
|
||||
private CouchbaseDocument writeMapInternal(final Map<Object, Object> source, final CouchbaseDocument target,
|
||||
@@ -660,9 +655,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
new CouchbaseList(conversions.getSimpleTypeHolder()), type.getMapValueType()));
|
||||
} else {
|
||||
CouchbaseDocument embeddedDoc = new CouchbaseDocument();
|
||||
TypeInformation<?> valueTypeInfo = type.isMap() ?
|
||||
type.getMapValueType() :
|
||||
ClassTypeInformation.OBJECT;
|
||||
TypeInformation<?> valueTypeInfo = type.isMap() ? type.getMapValueType() : ClassTypeInformation.OBJECT;
|
||||
writeInternal(val, embeddedDoc, valueTypeInfo);
|
||||
target.put(simpleKey, embeddedDoc);
|
||||
}
|
||||
@@ -678,7 +671,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
* Helper method to create the underlying collection/list.
|
||||
*
|
||||
* @param collection the collection to write.
|
||||
* @param prop the property information.
|
||||
* @param prop the property information.
|
||||
* @return the created couchbase list.
|
||||
*/
|
||||
private CouchbaseList createCollection(final Collection<?> collection, final CouchbasePersistentProperty prop) {
|
||||
@@ -691,7 +684,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
*
|
||||
* @param source the source object.
|
||||
* @param target the target document.
|
||||
* @param type the type information for the document.
|
||||
* @param type the type information for the document.
|
||||
* @return the created couchbase list.
|
||||
*/
|
||||
private CouchbaseList writeCollectionInternal(final Collection<?> source, final CouchbaseList target,
|
||||
@@ -704,8 +697,8 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
if (elementType == null || conversions.isSimpleType(elementType)) {
|
||||
target.put(getPotentiallyConvertedSimpleWrite(element));
|
||||
} else if (element instanceof Collection || elementType.isArray()) {
|
||||
target.put(writeCollectionInternal(asCollection(element),
|
||||
new CouchbaseList(conversions.getSimpleTypeHolder()), componentType));
|
||||
target.put(writeCollectionInternal(asCollection(element), new CouchbaseList(conversions.getSimpleTypeHolder()),
|
||||
componentType));
|
||||
} else {
|
||||
|
||||
CouchbaseDocument embeddedDoc = new CouchbaseDocument();
|
||||
@@ -722,13 +715,12 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
* Read a collection from the source object.
|
||||
*
|
||||
* @param targetType the target type.
|
||||
* @param source the list as source.
|
||||
* @param parent the optional parent.
|
||||
* @param source the list as source.
|
||||
* @param parent the optional parent.
|
||||
* @return the instantiated collection.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private Object readCollection(final TypeInformation<?> targetType, final CouchbaseList source,
|
||||
final Object parent) {
|
||||
private Object readCollection(final TypeInformation<?> targetType, final CouchbaseList source, final Object parent) {
|
||||
Assert.notNull(targetType, "Target type must not be null!");
|
||||
|
||||
Class<?> collectionType = targetType.getType();
|
||||
@@ -737,9 +729,8 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
}
|
||||
|
||||
collectionType = Collection.class.isAssignableFrom(collectionType) ? collectionType : List.class;
|
||||
Collection<Object> items = targetType.getType().isArray() ?
|
||||
new ArrayList<Object>() :
|
||||
CollectionFactory.createCollection(collectionType, source.size(false));
|
||||
Collection<Object> items = targetType.getType().isArray() ? new ArrayList<Object>()
|
||||
: CollectionFactory.createCollection(collectionType, source.size(false));
|
||||
TypeInformation<?> componentType = targetType.getComponentType();
|
||||
Class<?> rawComponentType = componentType == null ? null : componentType.getType();
|
||||
|
||||
@@ -764,7 +755,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
*
|
||||
* @param source the source object.
|
||||
* @param target the target document.
|
||||
* @param key the key of the object.
|
||||
* @param key the key of the object.
|
||||
*/
|
||||
private void writeSimpleInternal(final Object source, final CouchbaseDocument target, final String key) {
|
||||
target.put(key, getPotentiallyConvertedSimpleWrite(source));
|
||||
@@ -777,14 +768,14 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
|
||||
Optional<Class<?>> customTarget = conversions.getCustomWriteTarget(value.getClass());
|
||||
|
||||
return customTarget.map(it -> (Object) conversionService.convert(value, it)).orElseGet(
|
||||
() -> Enum.class.isAssignableFrom(value.getClass()) ? ((Enum<?>) value).name() : value);
|
||||
return customTarget.map(it -> (Object) conversionService.convert(value, it))
|
||||
.orElseGet(() -> Enum.class.isAssignableFrom(value.getClass()) ? ((Enum<?>) value).name() : value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a custom type key if needed.
|
||||
*
|
||||
* @param type the type information.
|
||||
* @param type the type information.
|
||||
* @param source th the source object.
|
||||
* @param target the target document.
|
||||
*/
|
||||
@@ -807,8 +798,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
}
|
||||
|
||||
/**
|
||||
* COPIED
|
||||
* Set the {@link EntityCallbacks} instance to use when invoking
|
||||
* COPIED Set the {@link EntityCallbacks} instance to use when invoking
|
||||
* {@link org.springframework.data.mapping.callback.EntityCallback callbacks} like the {@link AfterConvertCallback}.
|
||||
* <p/>
|
||||
* Overrides potentially existing {@link EntityCallbacks}.
|
||||
@@ -825,10 +815,10 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
/**
|
||||
* Helper method to read the value based on the value type.
|
||||
*
|
||||
* @param value the value to convert.
|
||||
* @param type the type information.
|
||||
* @param value the value to convert.
|
||||
* @param type the type information.
|
||||
* @param parent the optional parent.
|
||||
* @param <R> the target type.
|
||||
* @param <R> the target type.
|
||||
* @return the converted object.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -961,8 +951,8 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter implem
|
||||
private final Object parent;
|
||||
|
||||
public ConverterAwareSpELExpressionParameterValueProvider(final SpELExpressionEvaluator evaluator,
|
||||
final ConversionService conversionService,
|
||||
final ParameterValueProvider<CouchbasePersistentProperty> delegate, final Object parent) {
|
||||
final ConversionService conversionService, final ParameterValueProvider<CouchbasePersistentProperty> delegate,
|
||||
final Object parent) {
|
||||
super(evaluator, conversionService, delegate);
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@@ -34,8 +34,8 @@ public interface AfterConvertCallback<T> extends EntityCallback<T> {
|
||||
* Entity callback method invoked after a domain object is materialized from a {@link Document}. Can return either the
|
||||
* same or a modified instance of the domain object.
|
||||
*
|
||||
* @param entity the domain object (the result of the conversion).
|
||||
* @param document must not be {@literal null}.
|
||||
* @param entity the domain object (the result of the conversion).
|
||||
* @param document must not be {@literal null}.
|
||||
* @param collection name of the collection.
|
||||
* @return the domain object that is the result of reading it from the {@link Document}.
|
||||
*/
|
||||
|
||||
@@ -32,7 +32,7 @@ public interface BeforeConvertCallback<T> extends EntityCallback<T> {
|
||||
* Entity callback method invoked before a domain object is converted to be persisted. Can return either the same or a
|
||||
* modified instance of the domain object.
|
||||
*
|
||||
* @param entity the domain object to save.
|
||||
* @param entity the domain object to save.
|
||||
* @param collection name of the collection.
|
||||
* @return the domain object to be persisted.
|
||||
*/
|
||||
|
||||
@@ -34,8 +34,8 @@ import org.springframework.data.couchbase.core.mapping.event.AuditingEventListen
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* A support registrar that allows to set up auditing for Couchbase (including {@link AuditingHandler}
|
||||
* and { IsNewStrategyFactory} set up). See {@link EnableCouchbaseAuditing} for the associated annotation.
|
||||
* A support registrar that allows to set up auditing for Couchbase (including {@link AuditingHandler} and {
|
||||
* IsNewStrategyFactory} set up). See {@link EnableCouchbaseAuditing} for the associated annotation.
|
||||
*
|
||||
* @author Thomas Darimont
|
||||
* @author Oliver Gierke
|
||||
@@ -44,56 +44,56 @@ import org.springframework.util.Assert;
|
||||
*/
|
||||
public class CouchbaseAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
|
||||
|
||||
@Override
|
||||
protected Class<? extends Annotation> getAnnotation() {
|
||||
return EnableCouchbaseAuditing.class;
|
||||
}
|
||||
@Override
|
||||
protected Class<? extends Annotation> getAnnotation() {
|
||||
return EnableCouchbaseAuditing.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getAuditingHandlerBeanName() {
|
||||
return BeanNames.COUCHBASE_AUDITING_HANDLER;
|
||||
}
|
||||
@Override
|
||||
protected String getAuditingHandlerBeanName() {
|
||||
return BeanNames.COUCHBASE_AUDITING_HANDLER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
|
||||
Assert.notNull(annotationMetadata, "AnnotationMetadata must not be null!");
|
||||
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
|
||||
@Override
|
||||
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
|
||||
Assert.notNull(annotationMetadata, "AnnotationMetadata must not be null!");
|
||||
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
|
||||
|
||||
ensureMappingContext(registry, annotationMetadata);
|
||||
super.registerBeanDefinitions(annotationMetadata, registry);
|
||||
}
|
||||
ensureMappingContext(registry, annotationMetadata);
|
||||
super.registerBeanDefinitions(annotationMetadata, registry);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) {
|
||||
Assert.notNull(configuration, "AuditingConfiguration must not be null!");
|
||||
@Override
|
||||
protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) {
|
||||
Assert.notNull(configuration, "AuditingConfiguration must not be null!");
|
||||
|
||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class);
|
||||
builder.addConstructorArgReference(BeanNames.COUCHBASE_MAPPING_CONTEXT);
|
||||
return configureDefaultAuditHandlerAttributes(configuration, builder);
|
||||
}
|
||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class);
|
||||
builder.addConstructorArgReference(BeanNames.COUCHBASE_MAPPING_CONTEXT);
|
||||
return configureDefaultAuditHandlerAttributes(configuration, builder);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandlerDefinition,
|
||||
BeanDefinitionRegistry registry) {
|
||||
Assert.notNull(auditingHandlerDefinition, "BeanDefinition must not be null!");
|
||||
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
|
||||
@Override
|
||||
protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandlerDefinition,
|
||||
BeanDefinitionRegistry registry) {
|
||||
Assert.notNull(auditingHandlerDefinition, "BeanDefinition must not be null!");
|
||||
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
|
||||
|
||||
BeanDefinitionBuilder listenerBeanDefinitionBuilder = BeanDefinitionBuilder
|
||||
.rootBeanDefinition(AuditingEventListener.class);
|
||||
listenerBeanDefinitionBuilder.addConstructorArgValue(ParsingUtils.getObjectFactoryBeanDefinition(
|
||||
getAuditingHandlerBeanName(), registry));
|
||||
BeanDefinitionBuilder listenerBeanDefinitionBuilder = BeanDefinitionBuilder
|
||||
.rootBeanDefinition(AuditingEventListener.class);
|
||||
listenerBeanDefinitionBuilder
|
||||
.addConstructorArgValue(ParsingUtils.getObjectFactoryBeanDefinition(getAuditingHandlerBeanName(), registry));
|
||||
|
||||
registerInfrastructureBeanWithId(listenerBeanDefinitionBuilder.getBeanDefinition(),
|
||||
AuditingEventListener.class.getName(), registry);
|
||||
}
|
||||
registerInfrastructureBeanWithId(listenerBeanDefinitionBuilder.getBeanDefinition(),
|
||||
AuditingEventListener.class.getName(), registry);
|
||||
}
|
||||
|
||||
private void ensureMappingContext(BeanDefinitionRegistry registry, Object source) {
|
||||
if (!registry.containsBeanDefinition(BeanNames.COUCHBASE_MAPPING_CONTEXT)) {
|
||||
RootBeanDefinition definition = new RootBeanDefinition(CouchbaseMappingContext.class);
|
||||
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
definition.setSource(source);
|
||||
private void ensureMappingContext(BeanDefinitionRegistry registry, Object source) {
|
||||
if (!registry.containsBeanDefinition(BeanNames.COUCHBASE_MAPPING_CONTEXT)) {
|
||||
RootBeanDefinition definition = new RootBeanDefinition(CouchbaseMappingContext.class);
|
||||
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
definition.setSource(source);
|
||||
|
||||
registry.registerBeanDefinition(BeanNames.COUCHBASE_MAPPING_CONTEXT, definition);
|
||||
}
|
||||
}
|
||||
registry.registerBeanDefinition(BeanNames.COUCHBASE_MAPPING_CONTEXT, definition);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,24 +41,24 @@ import org.springframework.data.domain.AuditorAware;
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Import(CouchbaseAuditingRegistrar.class)
|
||||
public @interface EnableCouchbaseAuditing {
|
||||
/**
|
||||
* Configures the {@link AuditorAware} bean to be used to lookup the current principal.
|
||||
*/
|
||||
String auditorAwareRef() default "auditorAwareRef";
|
||||
/**
|
||||
* Configures the {@link AuditorAware} bean to be used to lookup the current principal.
|
||||
*/
|
||||
String auditorAwareRef() default "auditorAwareRef";
|
||||
|
||||
/**
|
||||
* Configures whether the creation and modification dates are set. Defaults to {@literal true}.
|
||||
*/
|
||||
boolean setDates() default true;
|
||||
/**
|
||||
* Configures whether the creation and modification dates are set. Defaults to {@literal true}.
|
||||
*/
|
||||
boolean setDates() default true;
|
||||
|
||||
/**
|
||||
* Configures whether the entity shall be marked as modified on creation. Defaults to {@literal true}.
|
||||
*/
|
||||
boolean modifyOnCreate() default true;
|
||||
/**
|
||||
* Configures whether the entity shall be marked as modified on creation. Defaults to {@literal true}.
|
||||
*/
|
||||
boolean modifyOnCreate() default true;
|
||||
|
||||
/**
|
||||
* Configures a {@link DateTimeProvider} bean name that allows customizing the {@link org.joda.time.DateTime} to be
|
||||
* used for setting creation and modification dates.
|
||||
*/
|
||||
String dateTimeProviderRef() default "dateTimeProviderRef";
|
||||
/**
|
||||
* Configures a {@link DateTimeProvider} bean name that allows customizing the {@link org.joda.time.DateTime} to be
|
||||
* used for setting creation and modification dates.
|
||||
*/
|
||||
String dateTimeProviderRef() default "dateTimeProviderRef";
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
package org.springframework.data.couchbase.core;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.springframework.data.couchbase.config.BeanNames.COUCHBASE_TEMPLATE;
|
||||
import static org.springframework.data.couchbase.config.BeanNames.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.Duration;
|
||||
@@ -33,19 +33,14 @@ import org.springframework.dao.DataRetrievalFailureException;
|
||||
import org.springframework.dao.DuplicateKeyException;
|
||||
import org.springframework.data.couchbase.CouchbaseClientFactory;
|
||||
import org.springframework.data.couchbase.SimpleCouchbaseClientFactory;
|
||||
import org.springframework.data.couchbase.core.convert.CouchbaseConverter;
|
||||
import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter;
|
||||
import org.springframework.data.couchbase.domain.Config;
|
||||
import org.springframework.data.couchbase.domain.User;
|
||||
import org.springframework.data.couchbase.util.Capabilities;
|
||||
import org.springframework.data.couchbase.util.ClusterAwareIntegrationTests;
|
||||
import org.springframework.data.couchbase.util.ClusterType;
|
||||
import org.springframework.data.couchbase.util.IgnoreWhen;
|
||||
|
||||
/**
|
||||
* KV tests
|
||||
*
|
||||
* Theses tests rely on a cb server running.
|
||||
* KV tests Theses tests rely on a cb server running.
|
||||
*
|
||||
* @author Michael Nitschinger
|
||||
* @author Michael Reiche
|
||||
@@ -70,7 +65,7 @@ class CouchbaseTemplateKeyValueIntegrationTests extends ClusterAwareIntegrationT
|
||||
@BeforeEach
|
||||
void beforeEach() {
|
||||
ApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
|
||||
couchbaseTemplate = (CouchbaseTemplate)ac.getBean(COUCHBASE_TEMPLATE);
|
||||
couchbaseTemplate = (CouchbaseTemplate) ac.getBean(COUCHBASE_TEMPLATE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -118,8 +113,7 @@ class CouchbaseTemplateKeyValueIntegrationTests extends ClusterAwareIntegrationT
|
||||
assertTrue(removeResult.getCas() != 0);
|
||||
assertTrue(removeResult.getMutationToken().isPresent());
|
||||
|
||||
assertThrows(DataRetrievalFailureException.class,
|
||||
() -> couchbaseTemplate.findById(User.class).one(user.getId()));
|
||||
assertThrows(DataRetrievalFailureException.class, () -> couchbaseTemplate.findById(User.class).one(user.getId()));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -17,17 +17,15 @@
|
||||
package org.springframework.data.couchbase.core;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.springframework.data.couchbase.config.BeanNames.COUCHBASE_TEMPLATE;
|
||||
import static org.springframework.data.couchbase.config.BeanNames.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.springframework.data.couchbase.domain.Config;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -37,6 +35,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
|
||||
import org.springframework.dao.DataRetrievalFailureException;
|
||||
import org.springframework.data.couchbase.CouchbaseClientFactory;
|
||||
import org.springframework.data.couchbase.SimpleCouchbaseClientFactory;
|
||||
import org.springframework.data.couchbase.domain.Config;
|
||||
import org.springframework.data.couchbase.domain.NaiveAuditorAware;
|
||||
import org.springframework.data.couchbase.domain.User;
|
||||
import org.springframework.data.couchbase.domain.time.AuditingDateTimeProvider;
|
||||
@@ -44,15 +43,12 @@ import org.springframework.data.couchbase.util.Capabilities;
|
||||
import org.springframework.data.couchbase.util.ClusterAwareIntegrationTests;
|
||||
import org.springframework.data.couchbase.util.ClusterType;
|
||||
import org.springframework.data.couchbase.util.IgnoreWhen;
|
||||
import org.springframework.test.context.TestContext;
|
||||
|
||||
import com.couchbase.client.core.error.IndexExistsException;
|
||||
import com.couchbase.client.java.query.QueryScanConsistency;
|
||||
|
||||
/**
|
||||
* Query tests
|
||||
*
|
||||
* Theses tests rely on a cb server running
|
||||
* Query tests Theses tests rely on a cb server running
|
||||
*
|
||||
* @author Michael Nitschinger
|
||||
* @author Michael Reiche
|
||||
@@ -93,8 +89,8 @@ class CouchbaseTemplateQueryIntegrationTests extends ClusterAwareIntegrationTest
|
||||
|
||||
couchbaseTemplate.upsertById(User.class).all(Arrays.asList(user1, user2));
|
||||
|
||||
final List<User> foundUsers = couchbaseTemplate.findByQuery(User.class).consistentWith(
|
||||
QueryScanConsistency.REQUEST_PLUS).all();
|
||||
final List<User> foundUsers = couchbaseTemplate.findByQuery(User.class)
|
||||
.consistentWith(QueryScanConsistency.REQUEST_PLUS).all();
|
||||
|
||||
for (User u : foundUsers) {
|
||||
System.out.println(u);
|
||||
@@ -119,6 +115,7 @@ class CouchbaseTemplateQueryIntegrationTests extends ClusterAwareIntegrationTest
|
||||
couchbaseTemplate.removeByQuery(User.class).all();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void removeByQuery() {
|
||||
User user1 = new User(UUID.randomUUID().toString(), "user1", "user1");
|
||||
@@ -131,10 +128,8 @@ class CouchbaseTemplateQueryIntegrationTests extends ClusterAwareIntegrationTest
|
||||
|
||||
couchbaseTemplate.removeByQuery(User.class).consistentWith(QueryScanConsistency.REQUEST_PLUS).all();
|
||||
|
||||
assertThrows(DataRetrievalFailureException.class,
|
||||
() -> couchbaseTemplate.findById(User.class).one(user1.getId()));
|
||||
assertThrows(DataRetrievalFailureException.class,
|
||||
() -> couchbaseTemplate.findById(User.class).one(user2.getId()));
|
||||
assertThrows(DataRetrievalFailureException.class, () -> couchbaseTemplate.findById(User.class).one(user1.getId()));
|
||||
assertThrows(DataRetrievalFailureException.class, () -> couchbaseTemplate.findById(User.class).one(user2.getId()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
|
||||
package org.springframework.data.couchbase.core.query;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.springframework.data.couchbase.core.query.QueryCriteria.*;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class QueryCriteriaTests {
|
||||
|
||||
@Test
|
||||
@@ -65,19 +65,14 @@ class QueryCriteriaTests {
|
||||
assertEquals("`name` = \"Bubba\" or (`age` > 12 or `country` = \"Austria\")", c.export());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testNestedNotIn() {
|
||||
QueryCriteria c =
|
||||
where("name").is("Bubba").or(
|
||||
where("age").gt(12).or("country").is("Austria")).and(
|
||||
where("state").notIn(new String[]{"Alabama", "Florida"}));
|
||||
assertEquals("`name` = \"Bubba\" or (`age` > 12 or `country` = \"Austria\") and " +
|
||||
"(not( (`state` in ( [ \"Alabama\", \"Florida\" ] )) ))",
|
||||
c.export());
|
||||
QueryCriteria c = where("name").is("Bubba").or(where("age").gt(12).or("country").is("Austria"))
|
||||
.and(where("state").notIn(new String[] { "Alabama", "Florida" }));
|
||||
assertEquals("`name` = \"Bubba\" or (`age` > 12 or `country` = \"Austria\") and "
|
||||
+ "(not( (`state` in ( [ \"Alabama\", \"Florida\" ] )) ))", c.export());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testLt() {
|
||||
QueryCriteria c = where("name").lt("Couch");
|
||||
@@ -156,7 +151,6 @@ class QueryCriteriaTests {
|
||||
assertEquals("not( (`name` like \"%Elvis%\") )", c.export());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testIsNull() {
|
||||
QueryCriteria c = where("name").isNull();
|
||||
@@ -201,13 +195,13 @@ class QueryCriteriaTests {
|
||||
|
||||
@Test
|
||||
void testIn() {
|
||||
QueryCriteria c = where("name").in(new String[]{"gump", "davis"});
|
||||
QueryCriteria c = where("name").in(new String[] { "gump", "davis" });
|
||||
assertEquals("`name` in ( [ \"gump\", \"davis\" ] )", c.export());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNotIn() {
|
||||
QueryCriteria c = where("name").notIn(new String[]{"gump", "davis"});
|
||||
QueryCriteria c = where("name").notIn(new String[] { "gump", "davis" });
|
||||
assertEquals("not( (`name` in ( [ \"gump\", \"davis\" ] )) )", c.export());
|
||||
}
|
||||
|
||||
@@ -222,4 +216,4 @@ class QueryCriteriaTests {
|
||||
QueryCriteria c = where("name").FALSE();
|
||||
assertEquals("not( (`name`) )", c.export());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,64 +1,62 @@
|
||||
package org.springframework.data.couchbase.domain;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.couchbase.core.mapping.Document;
|
||||
import org.springframework.data.couchbase.core.mapping.id.GeneratedValue;
|
||||
import org.springframework.data.couchbase.core.mapping.id.GenerationStrategy;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@Document
|
||||
public class AbstractEntity {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationStrategy.UNIQUE)
|
||||
private UUID id;
|
||||
@Id @GeneratedValue(strategy = GenerationStrategy.UNIQUE) private UUID id;
|
||||
|
||||
public AbstractEntity(){ }
|
||||
public AbstractEntity() {}
|
||||
|
||||
/**
|
||||
* set the id
|
||||
*/
|
||||
public void setId(UUID id) {
|
||||
this.id=id;
|
||||
}
|
||||
/**
|
||||
* @return the id
|
||||
*/
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
/**
|
||||
* @return the id
|
||||
*/
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.lang.Object#equals(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
/**
|
||||
* set the id
|
||||
*/
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.lang.Object#equals(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
|
||||
if (this.id == null || obj == null || !(this.getClass().equals(obj.getClass()))) {
|
||||
return false;
|
||||
}
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
AbstractEntity that = (AbstractEntity) obj;
|
||||
if (this.id == null || obj == null || !(this.getClass().equals(obj.getClass()))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return this.id.equals(that.getId());
|
||||
}
|
||||
AbstractEntity that = (AbstractEntity) obj;
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.lang.Object#hashCode()
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return id == null ? 0 : id.hashCode();
|
||||
}
|
||||
return this.id.equals(that.getId());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.lang.Object#hashCode()
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return id == null ? 0 : id.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,13 +7,11 @@ import org.springframework.data.couchbase.core.index.QueryIndexed;
|
||||
import org.springframework.data.couchbase.core.mapping.Document;
|
||||
|
||||
@Document
|
||||
@CompositeQueryIndex(fields = {"id", "name desc"})
|
||||
@CompositeQueryIndex(fields = { "id", "name desc" })
|
||||
public class Airline {
|
||||
@Id
|
||||
String id;
|
||||
@Id String id;
|
||||
|
||||
@QueryIndexed
|
||||
String name;
|
||||
@QueryIndexed String name;
|
||||
|
||||
@PersistenceConstructor
|
||||
public Airline(String id, String name) {
|
||||
|
||||
@@ -16,14 +16,14 @@
|
||||
|
||||
package org.springframework.data.couchbase.domain;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.data.couchbase.repository.ScanConsistency;
|
||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import com.couchbase.client.java.query.QueryScanConsistency;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface AirportRepository extends PagingAndSortingRepository<Airport, String> {
|
||||
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
package org.springframework.data.couchbase.domain;
|
||||
|
||||
import org.springframework.data.couchbase.domain.time.AuditingDateTimeProvider;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.auditing.DateTimeProvider;
|
||||
import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
|
||||
import org.springframework.data.couchbase.domain.time.AuditingDateTimeProvider;
|
||||
import org.springframework.data.couchbase.repository.auditing.EnableCouchbaseAuditing;
|
||||
import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories;
|
||||
|
||||
@Configuration
|
||||
@EnableCouchbaseRepositories
|
||||
@EnableCouchbaseAuditing //this activates auditing
|
||||
@EnableCouchbaseAuditing // this activates auditing
|
||||
public class Config extends AbstractCouchbaseConfiguration {
|
||||
String bucketname = "travel-sample";
|
||||
String username = "Administrator";
|
||||
@@ -46,4 +46,4 @@ public class Config extends AbstractCouchbaseConfiguration {
|
||||
public DateTimeProvider testDateTimeProvider() {
|
||||
return new AuditingDateTimeProvider();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package org.springframework.data.couchbase.domain;
|
||||
|
||||
import org.springframework.data.domain.AuditorAware;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.springframework.data.domain.AuditorAware;
|
||||
|
||||
// These are the classes that would be used for a real getCurrentAuditor() implementation
|
||||
//import org.springframework.security.core.Authentication;
|
||||
//import org.springframework.security.core.context.SecurityContextHolder;
|
||||
@@ -27,4 +27,4 @@ public class NaiveAuditorAware implements AuditorAware<String> {
|
||||
public void setAuditor(String auditor) {
|
||||
this.auditor = Optional.of(auditor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,90 +1,92 @@
|
||||
package org.springframework.data.couchbase.domain;
|
||||
|
||||
import org.springframework.data.annotation.*;
|
||||
import org.springframework.data.couchbase.core.mapping.Document;
|
||||
import org.springframework.data.couchbase.core.mapping.event.AuditingEventListener;
|
||||
import org.springframework.data.couchbase.repository.auditing.EnableCouchbaseAuditing;
|
||||
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.springframework.data.annotation.CreatedBy;
|
||||
import org.springframework.data.annotation.CreatedDate;
|
||||
import org.springframework.data.annotation.LastModifiedBy;
|
||||
import org.springframework.data.annotation.LastModifiedDate;
|
||||
import org.springframework.data.annotation.Version;
|
||||
import org.springframework.data.couchbase.core.mapping.Document;
|
||||
|
||||
@Document
|
||||
public class Person extends AbstractEntity {
|
||||
Optional<String> firstname;
|
||||
Optional<String> lastname;
|
||||
Optional<String> firstname;
|
||||
Optional<String> lastname;
|
||||
|
||||
@CreatedBy
|
||||
private String creator;
|
||||
@CreatedBy private String creator;
|
||||
|
||||
@LastModifiedBy
|
||||
private String lastModifiedBy;
|
||||
@LastModifiedBy private String lastModifiedBy;
|
||||
|
||||
@LastModifiedDate
|
||||
private long lastModification;
|
||||
@LastModifiedDate private long lastModification;
|
||||
|
||||
@CreatedDate
|
||||
private long creationDate; // =System.currentTimeMillis();
|
||||
@CreatedDate private long creationDate; // =System.currentTimeMillis();
|
||||
|
||||
@Version
|
||||
private long version;
|
||||
@Version private long version;
|
||||
|
||||
public Person(){
|
||||
}
|
||||
public Person() {}
|
||||
|
||||
public Person(String firstname, String lastname){
|
||||
this();
|
||||
setFirstname(firstname);
|
||||
setLastname(lastname);
|
||||
}
|
||||
public Person(String firstname, String lastname) {
|
||||
this();
|
||||
setFirstname(firstname);
|
||||
setLastname(lastname);
|
||||
}
|
||||
|
||||
public Person(int id,String firstname, String lastname){
|
||||
this(firstname,lastname);
|
||||
setId(new UUID(id, id));
|
||||
}
|
||||
public Person(int id, String firstname, String lastname) {
|
||||
this(firstname, lastname);
|
||||
setId(new UUID(id, id));
|
||||
}
|
||||
|
||||
public Optional<String> getFirstname(){
|
||||
return firstname;
|
||||
}
|
||||
public void setFirstname(String firstname) {
|
||||
this.firstname = firstname == null ? null : ( Optional.ofNullable(firstname.equals("")?null:firstname) );
|
||||
}
|
||||
public void setFirstname(Optional<String> firstname) {
|
||||
this.firstname = firstname;
|
||||
}
|
||||
static String optional(String name, Optional<String> obj) {
|
||||
if (obj != null)
|
||||
if (obj.isPresent())
|
||||
return (" " + name + ": '" + obj.get() + "'\n");
|
||||
else
|
||||
return " " + name + ": null\n";
|
||||
return "";
|
||||
}
|
||||
|
||||
public Optional<String> getLastname(){
|
||||
return lastname;
|
||||
}
|
||||
public void setLastname(String lastname) {
|
||||
this.lastname = lastname == null ? null : ( Optional.ofNullable(lastname.equals("")?null:lastname) );
|
||||
}
|
||||
public void setLastname(Optional lastname) {
|
||||
this.lastname = lastname;
|
||||
}
|
||||
public Optional<String> getFirstname() {
|
||||
return firstname;
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
StringBuilder sb=new StringBuilder();
|
||||
sb.append("Person : {\n");
|
||||
sb.append(" id : "+getId());
|
||||
sb.append(optional(", firstname",firstname));
|
||||
sb.append(optional( ", lastname", lastname));
|
||||
sb.append(", version : "+version);
|
||||
if(creator != null) sb.append(", creator : "+creator);
|
||||
if(creationDate != 0) sb.append(", creationDate : "+creationDate);
|
||||
if(lastModifiedBy != null) sb.append(", lastModifiedBy : "+lastModifiedBy);
|
||||
if(lastModification != 0) sb.append(", lastModification : "+lastModification);
|
||||
sb.append("}");
|
||||
return sb.toString();
|
||||
}
|
||||
public void setFirstname(String firstname) {
|
||||
this.firstname = firstname == null ? null : (Optional.ofNullable(firstname.equals("") ? null : firstname));
|
||||
}
|
||||
|
||||
static String optional(String name, Optional<String> obj){
|
||||
if(obj != null)
|
||||
if(obj.isPresent())
|
||||
return(" "+name+ ": '"+obj.get()+"'\n");
|
||||
else
|
||||
return" "+name+": null\n" ;
|
||||
return "";
|
||||
}
|
||||
public void setFirstname(Optional<String> firstname) {
|
||||
this.firstname = firstname;
|
||||
}
|
||||
|
||||
public Optional<String> getLastname() {
|
||||
return lastname;
|
||||
}
|
||||
|
||||
public void setLastname(String lastname) {
|
||||
this.lastname = lastname == null ? null : (Optional.ofNullable(lastname.equals("") ? null : lastname));
|
||||
}
|
||||
|
||||
public void setLastname(Optional lastname) {
|
||||
this.lastname = lastname;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Person : {\n");
|
||||
sb.append(" id : " + getId());
|
||||
sb.append(optional(", firstname", firstname));
|
||||
sb.append(optional(", lastname", lastname));
|
||||
sb.append(", version : " + version);
|
||||
if (creator != null)
|
||||
sb.append(", creator : " + creator);
|
||||
if (creationDate != 0)
|
||||
sb.append(", creationDate : " + creationDate);
|
||||
if (lastModifiedBy != null)
|
||||
sb.append(", lastModifiedBy : " + lastModifiedBy);
|
||||
if (lastModification != 0)
|
||||
sb.append(", lastModification : " + lastModification);
|
||||
sb.append("}");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,12 +16,13 @@
|
||||
|
||||
package org.springframework.data.couchbase.domain;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import org.springframework.data.couchbase.repository.ScanConsistency;
|
||||
import org.springframework.data.repository.reactive.ReactiveSortingRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import com.couchbase.client.java.query.QueryScanConsistency;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
@Repository
|
||||
public interface ReactiveAirportRepository extends ReactiveSortingRepository<Airport, String> {
|
||||
|
||||
@@ -16,9 +16,10 @@
|
||||
|
||||
package org.springframework.data.couchbase.domain;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import org.springframework.data.repository.reactive.ReactiveSortingRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
@Repository
|
||||
public interface ReactiveUserRepository extends ReactiveSortingRepository<User, String> {
|
||||
|
||||
@@ -18,7 +18,13 @@ package org.springframework.data.couchbase.domain;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import org.springframework.data.annotation.*;
|
||||
import org.springframework.data.annotation.CreatedBy;
|
||||
import org.springframework.data.annotation.CreatedDate;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.annotation.LastModifiedBy;
|
||||
import org.springframework.data.annotation.LastModifiedDate;
|
||||
import org.springframework.data.annotation.PersistenceConstructor;
|
||||
import org.springframework.data.annotation.Version;
|
||||
import org.springframework.data.couchbase.core.mapping.Document;
|
||||
|
||||
/**
|
||||
@@ -31,20 +37,14 @@ import org.springframework.data.couchbase.core.mapping.Document;
|
||||
@Document
|
||||
public class User {
|
||||
|
||||
@Id
|
||||
private String id;
|
||||
@Version long version;
|
||||
@Id private String id;
|
||||
private String firstname;
|
||||
private String lastname;
|
||||
@CreatedBy
|
||||
private String createdBy;
|
||||
@CreatedDate
|
||||
private long createdDate;
|
||||
@LastModifiedBy
|
||||
private String lastModifiedBy;
|
||||
@LastModifiedDate
|
||||
private long lastModifiedDate;
|
||||
@Version
|
||||
long version;
|
||||
@CreatedBy private String createdBy;
|
||||
@CreatedDate private long createdDate;
|
||||
@LastModifiedBy private String lastModifiedBy;
|
||||
@LastModifiedDate private long lastModifiedDate;
|
||||
|
||||
@PersistenceConstructor
|
||||
public User(final String id, final String firstname, final String lastname) {
|
||||
@@ -92,8 +92,8 @@ public class User {
|
||||
if (o == null || getClass() != o.getClass())
|
||||
return false;
|
||||
User user = (User) o;
|
||||
return Objects.equals(id, user.id) && Objects.equals(firstname, user.firstname) && Objects.equals(lastname,
|
||||
user.lastname);
|
||||
return Objects.equals(id, user.id) && Objects.equals(firstname, user.firstname)
|
||||
&& Objects.equals(lastname, user.lastname);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,14 +16,14 @@
|
||||
|
||||
package org.springframework.data.couchbase.domain;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* User Repository for tests
|
||||
*
|
||||
* @author Michael Nitschinger
|
||||
* @author Michael Reiche
|
||||
*/
|
||||
@@ -34,5 +34,4 @@ public interface UserRepository extends PagingAndSortingRepository<User, String>
|
||||
|
||||
List<User> findByFirstnameAndLastname(String firstname, String lastname);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
package org.springframework.data.couchbase.domain.time;
|
||||
|
||||
import org.springframework.data.auditing.DateTimeProvider;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.springframework.data.auditing.DateTimeProvider;
|
||||
|
||||
public class AuditingDateTimeProvider implements DateTimeProvider {
|
||||
|
||||
private DateTimeService dateTimeService = new FixedDateTimeService();
|
||||
|
||||
public AuditingDateTimeProvider() {
|
||||
}
|
||||
public AuditingDateTimeProvider() {}
|
||||
|
||||
public AuditingDateTimeProvider(DateTimeService dateTimeService) {
|
||||
this.dateTimeService = dateTimeService;
|
||||
@@ -21,4 +20,4 @@ public class AuditingDateTimeProvider implements DateTimeProvider {
|
||||
public Optional<TemporalAccessor> getNow() {
|
||||
return Optional.of(Instant.ofEpochSecond(dateTimeService.getCurrentDateAndTime().toEpochSecond()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,4 +4,4 @@ import java.time.ZonedDateTime;
|
||||
|
||||
public interface DateTimeService {
|
||||
ZonedDateTime getCurrentDateAndTime();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,12 +4,12 @@ import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
|
||||
public class FixedDateTimeService implements DateTimeService {
|
||||
public static void main(String[] args) {
|
||||
System.out.println((new FixedDateTimeService()).getCurrentDateAndTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ZonedDateTime getCurrentDateAndTime() {
|
||||
return ZonedDateTime.of(2020, 1, 1, 0, 0, 0, 0, ZoneId.of("GMT-8"));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println((new FixedDateTimeService()).getCurrentDateAndTime());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
|
||||
package org.springframework.data.couchbase.repository;
|
||||
|
||||
import com.couchbase.client.java.Cluster;
|
||||
import com.couchbase.client.java.manager.query.QueryIndex;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -29,29 +31,23 @@ import org.springframework.data.couchbase.util.ClusterType;
|
||||
import org.springframework.data.couchbase.util.IgnoreWhen;
|
||||
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import com.couchbase.client.java.Cluster;
|
||||
import com.couchbase.client.java.manager.query.QueryIndex;
|
||||
|
||||
@SpringJUnitConfig(CouchbaseRepositoryAutoQueryIndexIntegrationTests.Config.class)
|
||||
@IgnoreWhen(missesCapabilities = Capabilities.QUERY, clusterTypes = ClusterType.MOCKED)
|
||||
public class CouchbaseRepositoryAutoQueryIndexIntegrationTests extends ClusterAwareIntegrationTests {
|
||||
|
||||
@Autowired
|
||||
private Cluster cluster;
|
||||
@Autowired private Cluster cluster;
|
||||
|
||||
/**
|
||||
* Since the index creation happens at startup, the only way to properly check is by querying the
|
||||
* index list and making sure it is present.
|
||||
* Since the index creation happens at startup, the only way to properly check is by querying the index list and
|
||||
* making sure it is present.
|
||||
*/
|
||||
@Test
|
||||
void createsSingleFieldIndex() {
|
||||
Optional<QueryIndex> foundIndex = cluster
|
||||
.queryIndexes()
|
||||
.getAllIndexes(bucketName())
|
||||
.stream()
|
||||
.filter(i -> i.name().equals("idx_airline_name"))
|
||||
.findFirst();
|
||||
Optional<QueryIndex> foundIndex = cluster.queryIndexes().getAllIndexes(bucketName()).stream()
|
||||
.filter(i -> i.name().equals("idx_airline_name")).findFirst();
|
||||
|
||||
assertTrue(foundIndex.isPresent());
|
||||
assertTrue(foundIndex.get().condition().get().contains("_class"));
|
||||
@@ -59,12 +55,8 @@ public class CouchbaseRepositoryAutoQueryIndexIntegrationTests extends ClusterAw
|
||||
|
||||
@Test
|
||||
void createsCompositeIndex() {
|
||||
Optional<QueryIndex> foundIndex = cluster
|
||||
.queryIndexes()
|
||||
.getAllIndexes(bucketName())
|
||||
.stream()
|
||||
.filter(i -> i.name().equals("idx_airline_id_name"))
|
||||
.findFirst();
|
||||
Optional<QueryIndex> foundIndex = cluster.queryIndexes().getAllIndexes(bucketName()).stream()
|
||||
.filter(i -> i.name().equals("idx_airline_id_name")).findFirst();
|
||||
|
||||
assertTrue(foundIndex.isPresent());
|
||||
assertTrue(foundIndex.get().condition().get().contains("_class"));
|
||||
|
||||
@@ -28,7 +28,6 @@ import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
|
||||
import org.springframework.data.couchbase.domain.User;
|
||||
import org.springframework.data.couchbase.domain.UserRepository;
|
||||
import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories;
|
||||
import org.springframework.data.couchbase.util.Capabilities;
|
||||
import org.springframework.data.couchbase.util.ClusterAwareIntegrationTests;
|
||||
import org.springframework.data.couchbase.util.ClusterType;
|
||||
import org.springframework.data.couchbase.util.IgnoreWhen;
|
||||
@@ -44,8 +43,7 @@ import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
|
||||
@IgnoreWhen(clusterTypes = ClusterType.MOCKED)
|
||||
public class CouchbaseRepositoryKeyValueIntegrationTests extends ClusterAwareIntegrationTests {
|
||||
|
||||
@Autowired
|
||||
UserRepository userRepository;
|
||||
@Autowired UserRepository userRepository;
|
||||
|
||||
@Test
|
||||
@IgnoreWhen(clusterTypes = ClusterType.MOCKED)
|
||||
|
||||
@@ -37,8 +37,7 @@ import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
|
||||
@IgnoreWhen(clusterTypes = ClusterType.MOCKED)
|
||||
public class ReactiveCouchbaseRepositoryKeyValueIntegrationTests extends ClusterAwareIntegrationTests {
|
||||
|
||||
@Autowired
|
||||
ReactiveUserRepository userRepository;
|
||||
@Autowired ReactiveUserRepository userRepository;
|
||||
|
||||
@Test
|
||||
void saveAndFindById() {
|
||||
|
||||
@@ -20,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -29,9 +28,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.couchbase.CouchbaseClientFactory;
|
||||
import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
|
||||
import org.springframework.data.couchbase.domain.Airport;
|
||||
import org.springframework.data.couchbase.domain.AirportRepository;
|
||||
import org.springframework.data.couchbase.domain.ReactiveAirportRepository;
|
||||
import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories;
|
||||
import org.springframework.data.couchbase.repository.config.EnableReactiveCouchbaseRepositories;
|
||||
import org.springframework.data.couchbase.util.Capabilities;
|
||||
import org.springframework.data.couchbase.util.ClusterAwareIntegrationTests;
|
||||
@@ -63,8 +60,7 @@ public class ReactiveCouchbaseRepositoryQueryIntegrationTests extends ClusterAwa
|
||||
Airport vie = new Airport("airports::vie", "vie", "loww");
|
||||
airportRepository.save(vie).block();
|
||||
|
||||
List<Airport> all = airportRepository.findAll().toStream()
|
||||
.collect(Collectors.toList());
|
||||
List<Airport> all = airportRepository.findAll().toStream().collect(Collectors.toList());
|
||||
|
||||
assertFalse(all.isEmpty());
|
||||
assertTrue(all.stream().anyMatch(a -> a.getId().equals("airports::vie")));
|
||||
|
||||
@@ -16,6 +16,11 @@
|
||||
|
||||
package org.springframework.data.couchbase.repository.query;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.springframework.data.couchbase.core.query.QueryCriteria.*;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.data.couchbase.core.convert.CouchbaseConverter;
|
||||
@@ -33,11 +38,6 @@ import org.springframework.data.repository.query.Parameters;
|
||||
import org.springframework.data.repository.query.ParametersParameterAccessor;
|
||||
import org.springframework.data.repository.query.parser.PartTree;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.springframework.data.couchbase.core.query.QueryCriteria.*;
|
||||
|
||||
class N1qlQueryCreatorTests {
|
||||
|
||||
MappingContext<? extends CouchbasePersistentEntity<?>, CouchbasePersistentProperty> context;
|
||||
@@ -81,4 +81,4 @@ class N1qlQueryCreatorTests {
|
||||
return new DefaultParameters(method);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user