diff --git a/pom.xml b/pom.xml
index 47999643..7c56738c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,6 +21,7 @@
1.3.1
2.3.1
1.6.3.RELEASE
+ 1.0.0.GA
@@ -74,6 +75,13 @@
test
+
+ org.hibernate
+ hibernate-validator
+ 4.2.0.Final
+ test
+
+
org.apache.httpcomponents
httpclient
@@ -94,6 +102,14 @@
true
+
+
+ javax.validation
+ validation-api
+ ${validation}
+ true
+
+
org.hamcrest
hamcrest-all
diff --git a/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java b/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java
index 431faa6e..e8631d6f 100644
--- a/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java
+++ b/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java
@@ -28,6 +28,8 @@ import net.spy.memcached.ReplicateTo;
import net.spy.memcached.internal.OperationFuture;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.dao.QueryTimeoutException;
import org.springframework.data.couchbase.core.convert.CouchbaseConverter;
@@ -39,6 +41,12 @@ import org.springframework.data.couchbase.core.mapping.CouchbaseMappingContext;
import org.springframework.data.couchbase.core.mapping.CouchbasePersistentEntity;
import org.springframework.data.couchbase.core.mapping.CouchbasePersistentProperty;
import org.springframework.data.couchbase.core.mapping.CouchbaseStorable;
+import org.springframework.data.couchbase.core.mapping.event.AfterDeleteEvent;
+import org.springframework.data.couchbase.core.mapping.event.AfterSaveEvent;
+import org.springframework.data.couchbase.core.mapping.event.BeforeConvertEvent;
+import org.springframework.data.couchbase.core.mapping.event.BeforeDeleteEvent;
+import org.springframework.data.couchbase.core.mapping.event.BeforeSaveEvent;
+import org.springframework.data.couchbase.core.mapping.event.CouchbaseMappingEvent;
import org.springframework.data.mapping.PersistentEntity;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mapping.model.BeanWrapper;
@@ -56,7 +64,7 @@ import java.util.concurrent.TimeoutException;
/**
* @author Michael Nitschinger
*/
-public class CouchbaseTemplate implements CouchbaseOperations {
+public class CouchbaseTemplate implements CouchbaseOperations, ApplicationEventPublisherAware {
private static final Logger LOGGER = LoggerFactory.getLogger(CouchbaseTemplate.class);
private static final Collection ITERABLE_CLASSES;
@@ -66,6 +74,7 @@ public class CouchbaseTemplate implements CouchbaseOperations {
protected final MappingContext extends CouchbasePersistentEntity>, CouchbasePersistentProperty> mappingContext;
private final CouchbaseExceptionTranslator exceptionTranslator = new CouchbaseExceptionTranslator();
private final TranslationService translationService;
+ private ApplicationEventPublisher eventPublisher;
private CouchbaseConverter couchbaseConverter;
private WriteResultChecking writeResultChecking = DEFAULT_WRITE_RESULT_CHECKING;
@@ -86,6 +95,10 @@ public class CouchbaseTemplate implements CouchbaseOperations {
this(client, null, null);
}
+ public CouchbaseTemplate(final CouchbaseClient client, final TranslationService translationService) {
+ this(client, null, translationService);
+ }
+
public CouchbaseTemplate(final CouchbaseClient client, final CouchbaseConverter couchbaseConverter, final TranslationService translationService) {
this.client = client;
this.couchbaseConverter = couchbaseConverter == null ? getDefaultConverter() : couchbaseConverter;
@@ -93,11 +106,9 @@ public class CouchbaseTemplate implements CouchbaseOperations {
mappingContext = this.couchbaseConverter.getMappingContext();
}
- public CouchbaseTemplate(final CouchbaseClient client, final TranslationService translationService) {
- this.client = client;
- couchbaseConverter = couchbaseConverter == null ? getDefaultConverter() : couchbaseConverter;
- this.translationService = translationService == null ? getDefaultTranslationService() : translationService;
- mappingContext = couchbaseConverter.getMappingContext();
+ @Override
+ public void setApplicationEventPublisher(final ApplicationEventPublisher eventPublisher) {
+ this.eventPublisher = eventPublisher;
}
private static CouchbaseConverter getDefaultConverter() {
@@ -282,9 +293,11 @@ public class CouchbaseTemplate implements CouchbaseOperations {
final CouchbasePersistentProperty versionProperty = persistentEntity.getVersionProperty();
final Long version = versionProperty != null ? beanWrapper.getProperty(versionProperty, Long.class, true) : null;
+ maybeEmitEvent(new BeforeConvertEvent