diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java index 1bc6c474e..dbb02c205 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java @@ -15,6 +15,8 @@ import javax.persistence.PrePersist; import javax.persistence.PreRemove; import javax.persistence.PreUpdate; +import com.avaje.ebean.annotation.PostSoftDelete; +import com.avaje.ebean.annotation.PreSoftDelete; import com.avaje.ebean.event.BeanPersistAdapter; import com.avaje.ebean.event.BeanPersistRequest; import com.avaje.ebean.event.BeanPostConstructListener; @@ -28,12 +30,12 @@ import com.avaje.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; * lifecycle events. *

*/ -public class BeanLifecycleAdapterFactory { +class BeanLifecycleAdapterFactory { /** * Register a BeanPersistController for methods annotated with lifecycle events. */ - public void addLifecycleMethods(DeployBeanDescriptor deployDesc) { + void addLifecycleMethods(DeployBeanDescriptor deployDesc) { Method[] methods = deployDesc.getBeanType().getMethods(); @@ -70,6 +72,8 @@ public class BeanLifecycleAdapterFactory { private final List postUpdates = new ArrayList<>(); private final List preDeletes = new ArrayList<>(); private final List postDeletes = new ArrayList<>(); + private final List preSoftDeletes = new ArrayList<>(); + private final List postSoftDeletes = new ArrayList<>(); private final List postLoads = new ArrayList<>(); private final List postConstructs = new ArrayList<>(); @@ -110,6 +114,14 @@ public class BeanLifecycleAdapterFactory { postDeletes.add(method); hasPersistMethods = true; } + if (method.isAnnotationPresent(PreSoftDelete.class)) { + preSoftDeletes.add(method); + hasPersistMethods = true; + } + if (method.isAnnotationPresent(PostSoftDelete.class)) { + postSoftDeletes.add(method); + hasPersistMethods = true; + } if (method.isAnnotationPresent(PostLoad.class)) { postLoads.add(method); @@ -139,14 +151,18 @@ public class BeanLifecycleAdapterFactory { private final Method[] postUpdates; private final Method[] preDeletes; private final Method[] postDeletes; + private final Method[] preSoftDeletes; + private final Method[] postSoftDeletes; PersistMethodsHolder(MethodsHolder methodsHolder) { this.preInserts = toArray(methodsHolder.preInserts); this.preUpdates = toArray(methodsHolder.preUpdates); this.preDeletes = toArray(methodsHolder.preDeletes); + this.preSoftDeletes = toArray(methodsHolder.preSoftDeletes); this.postInserts = toArray(methodsHolder.postInserts); this.postUpdates = toArray(methodsHolder.postUpdates); this.postDeletes = toArray(methodsHolder.postDeletes); + this.postSoftDeletes = toArray(methodsHolder.postSoftDeletes); } } @@ -187,6 +203,12 @@ public class BeanLifecycleAdapterFactory { return true; } + @Override + public boolean preSoftDelete(BeanPersistRequest request) { + invoke(methodHolder.preSoftDeletes, request); + return true; + } + @Override public boolean preInsert(BeanPersistRequest request) { invoke(methodHolder.preInserts, request); @@ -204,6 +226,11 @@ public class BeanLifecycleAdapterFactory { invoke(methodHolder.postDeletes, request); } + @Override + public void postSoftDelete(BeanPersistRequest request) { + invoke(methodHolder.postSoftDeletes, request); + } + @Override public void postInsert(BeanPersistRequest request) { invoke(methodHolder.postInserts, request); diff --git a/src/test/java/com/avaje/tests/lifecycle/TestLifecycleAnnotatedBean.java b/src/test/java/com/avaje/tests/lifecycle/TestLifecycleAnnotatedBean.java index 81ddb2cf7..0ae59804c 100644 --- a/src/test/java/com/avaje/tests/lifecycle/TestLifecycleAnnotatedBean.java +++ b/src/test/java/com/avaje/tests/lifecycle/TestLifecycleAnnotatedBean.java @@ -87,8 +87,15 @@ public class TestLifecycleAnnotatedBean extends BaseTestCase { Ebean.save(bean); Ebean.delete(bean); + assertThat(bean.getBuffer()).contains("preSoftDelete"); + assertThat(bean.getBuffer()).contains("postSoftDelete"); + + Ebean.deletePermanent(bean); + assertThat(bean.getBuffer()).contains("preRemove1"); assertThat(bean.getBuffer()).contains("preRemove2"); + assertThat(bean.getBuffer()).contains("postRemove1"); + assertThat(bean.getBuffer()).contains("postRemove2"); } @Test @@ -98,7 +105,7 @@ public class TestLifecycleAnnotatedBean extends BaseTestCase { bean.setName("Persisted"); Ebean.save(bean); - Ebean.delete(bean); + Ebean.deletePermanent(bean); assertThat(bean.getBuffer()).contains("postRemove1"); assertThat(bean.getBuffer()).contains("postRemove2"); diff --git a/src/test/java/com/avaje/tests/model/basic/EBasicWithLifecycle.java b/src/test/java/com/avaje/tests/model/basic/EBasicWithLifecycle.java index 002c8d0b1..9dad6f02f 100644 --- a/src/test/java/com/avaje/tests/model/basic/EBasicWithLifecycle.java +++ b/src/test/java/com/avaje/tests/model/basic/EBasicWithLifecycle.java @@ -1,5 +1,9 @@ package com.avaje.tests.model.basic; +import com.avaje.ebean.annotation.PostSoftDelete; +import com.avaje.ebean.annotation.PreSoftDelete; +import com.avaje.ebean.annotation.SoftDelete; + import javax.annotation.PostConstruct; import javax.persistence.Entity; import javax.persistence.Id; @@ -22,6 +26,9 @@ public class EBasicWithLifecycle { String name; + @SoftDelete + boolean deleted; + @Version Long version; @@ -87,6 +94,16 @@ public class EBasicWithLifecycle { buffer.append("postRemove2"); } + @PostSoftDelete + public void postSoftDelete() { + buffer.append("postSoftDelete"); + } + + @PreSoftDelete + public void preSoftDelete() { + buffer.append("preSoftDelete"); + } + @PostLoad public void postLoad1() { buffer.append("postLoad1"); @@ -123,6 +140,14 @@ public class EBasicWithLifecycle { this.name = name; } + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + public Long getVersion() { return version; }