diff --git a/src/main/java/com/avaje/ebean/event/AbstractBeanPersistListener.java b/src/main/java/com/avaje/ebean/event/AbstractBeanPersistListener.java index 20af32c96..6f2c885c5 100644 --- a/src/main/java/com/avaje/ebean/event/AbstractBeanPersistListener.java +++ b/src/main/java/com/avaje/ebean/event/AbstractBeanPersistListener.java @@ -13,8 +13,7 @@ import java.util.Set; public abstract class AbstractBeanPersistListener implements BeanPersistListener { /** - * Notified that a bean has been inserted locally. Return true if you want the - * cluster to be notified of the event. + * Notified that a bean has been inserted. * * @param bean The bean that was inserted. */ @@ -23,8 +22,7 @@ public abstract class AbstractBeanPersistListener implements BeanPersistListener } /** - * Notified that a bean has been updated locally. Return true if you want the - * cluster to be notified of the event. + * Notified that a bean has been updated. * * @param bean The bean that was updated. * @param updatedProperties The properties that were modified by this update. @@ -34,8 +32,7 @@ public abstract class AbstractBeanPersistListener implements BeanPersistListener } /** - * Notified that a bean has been deleted locally. Return true if you want the - * cluster to be notified of the event. + * Notified that a bean has been deleted. * * @param bean The bean that was deleted. */ @@ -43,4 +40,12 @@ public abstract class AbstractBeanPersistListener implements BeanPersistListener public void deleted(Object bean) { } + /** + * Notified that a bean has been soft deleted. + * + * @param bean The bean that was deleted. + */ + @Override + public void softDeleted(Object bean) { + } } diff --git a/src/main/java/com/avaje/ebean/event/BeanPersistAdapter.java b/src/main/java/com/avaje/ebean/event/BeanPersistAdapter.java index 7cdab42ba..5d0412a49 100644 --- a/src/main/java/com/avaje/ebean/event/BeanPersistAdapter.java +++ b/src/main/java/com/avaje/ebean/event/BeanPersistAdapter.java @@ -46,6 +46,13 @@ public abstract class BeanPersistAdapter implements BeanPersistController { return true; } + /** + * Returns true indicating normal processing should continue. + */ + public boolean preSoftDelete(BeanPersistRequest request) { + return true; + } + /** * Does nothing by default. */ @@ -64,4 +71,10 @@ public abstract class BeanPersistAdapter implements BeanPersistController { public void postUpdate(BeanPersistRequest request) { } + /** + * Does nothing by default. + */ + public void postSoftDelete(BeanPersistRequest request) { + } + } diff --git a/src/main/java/com/avaje/ebean/event/BeanPersistController.java b/src/main/java/com/avaje/ebean/event/BeanPersistController.java index 84a53a79a..6896350d0 100644 --- a/src/main/java/com/avaje/ebean/event/BeanPersistController.java +++ b/src/main/java/com/avaje/ebean/event/BeanPersistController.java @@ -89,6 +89,12 @@ public interface BeanPersistController { */ boolean preDelete(BeanPersistRequest request); + /** + * Prior to a soft delete perform some action. Return true if you want the + * default functionality to continue. + */ + boolean preSoftDelete(BeanPersistRequest request); + /** * Called after the insert was performed. */ @@ -104,4 +110,8 @@ public interface BeanPersistController { */ void postDelete(BeanPersistRequest request); + /** + * Called after the soft delete was performed. + */ + void postSoftDelete(BeanPersistRequest request); } diff --git a/src/main/java/com/avaje/ebean/event/BeanPersistListener.java b/src/main/java/com/avaje/ebean/event/BeanPersistListener.java index 45389c83f..ad4c0eb66 100644 --- a/src/main/java/com/avaje/ebean/event/BeanPersistListener.java +++ b/src/main/java/com/avaje/ebean/event/BeanPersistListener.java @@ -67,4 +67,12 @@ public interface BeanPersistListener { */ void deleted(Object bean); + /** + * Notified that a bean has been soft deleted. + * + * @param bean + * The bean that was soft deleted. + */ + void softDeleted(Object bean); + } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestBean.java b/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestBean.java index 7fe283f0d..ac1886693 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestBean.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestBean.java @@ -373,6 +373,7 @@ public final class PersistRequestBean extends PersistRequest implements BeanP beanDescriptor.docStoreInsert(idValue, this, txn); break; case UPDATE: + case SOFT_DELETE: beanDescriptor.docStoreUpdate(idValue, this, txn); break; case DELETE: @@ -392,6 +393,7 @@ public final class PersistRequestBean extends PersistRequest implements BeanP docStoreUpdates.queueIndex(beanDescriptor.getDocStoreQueueId(), idValue); break; case UPDATE: + case SOFT_DELETE: docStoreUpdates.queueIndex(beanDescriptor.getDocStoreQueueId(), idValue); break; case DELETE: @@ -422,6 +424,10 @@ public final class PersistRequestBean extends PersistRequest implements BeanP beanPersistListener.deleted(bean); break; + case SOFT_DELETE: + beanPersistListener.softDeleted(bean); + break; + default: } } @@ -654,7 +660,7 @@ public final class PersistRequestBean extends PersistRequest implements BeanP case SOFT_DELETE: prepareForSoftDelete(); - persistExecute.executeUpdateBean(this); + persistExecute.executeSoftDeleteBean(this); return -1; case DELETE: @@ -787,13 +793,11 @@ public final class PersistRequestBean extends PersistRequest implements BeanP controller.postInsert(this); break; case UPDATE: - case SOFT_DELETE: - /* - * In the previous version, in case SOFT_DELETE the method controller.postDelete was called. However, - * this lead to an inconsistent situation, because first controller.preUpdate is called. - */ controller.postUpdate(this); break; + case SOFT_DELETE: + controller.postSoftDelete(this); + break; case DELETE: controller.postDelete(this); break; @@ -1047,4 +1051,32 @@ public final class PersistRequestBean extends PersistRequest implements BeanP public long getVersion() { return version; } + + public void executeInsert() { + if (controller == null || controller.preInsert(this)) { + beanManager.getBeanPersister().insert(this); + } + } + + public void executeUpdate() { + if (controller == null || controller.preUpdate(this)) { + postControllerPrepareUpdate(); + beanManager.getBeanPersister().update(this); + } + } + + public void executeSoftDelete() { + if (controller == null || controller.preSoftDelete(this)) { + postControllerPrepareUpdate(); + beanManager.getBeanPersister().update(this); + } + } + + public int executeDelete() { + if (controller == null || controller.preDelete(this)) { + return beanManager.getBeanPersister().delete(this); + } + // delete handled by the BeanController so return 0 + return 0; + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistController.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistController.java index e2b806d04..06f3218fa 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistController.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistController.java @@ -122,6 +122,13 @@ public class ChainedBeanPersistController implements BeanPersistController { } } + @Override + public void postSoftDelete(BeanPersistRequest request) { + for (int i = 0; i < chain.length; i++) { + chain[i].postSoftDelete(request); + } + } + @Override public boolean preDelete(BeanPersistRequest request) { for (int i = 0; i < chain.length; i++) { @@ -132,6 +139,16 @@ public class ChainedBeanPersistController implements BeanPersistController { return true; } + @Override + public boolean preSoftDelete(BeanPersistRequest request) { + for (int i = 0; i < chain.length; i++) { + if (!chain[i].preSoftDelete(request)) { + return false; + } + } + return true; + } + @Override public boolean preInsert(BeanPersistRequest request) { for (int i = 0; i < chain.length; i++) { diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistListener.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistListener.java index a5a211209..813caf459 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistListener.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistListener.java @@ -18,7 +18,7 @@ public class ChainedBeanPersistListener implements BeanPersistListener { /** * Construct adding 2 BeanPersistListener's. */ - public ChainedBeanPersistListener(BeanPersistListener c1, BeanPersistListener c2) { + ChainedBeanPersistListener(BeanPersistListener c1, BeanPersistListener c2) { this(addList(c1, c2)); } @@ -89,6 +89,12 @@ public class ChainedBeanPersistListener implements BeanPersistListener { } } + public void softDeleted(Object bean) { + for (int i = 0; i < chain.length; i++) { + chain[i].softDeleted(bean); + } + } + public void inserted(Object bean) { for (int i = 0; i < chain.length; i++) { chain[i].inserted(bean); diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersistExecute.java b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersistExecute.java index a9f59bae7..060be3afd 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersistExecute.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersistExecute.java @@ -1,9 +1,10 @@ package com.avaje.ebeaninternal.server.persist; -import com.avaje.ebean.event.BeanPersistController; import com.avaje.ebeaninternal.api.SpiTransaction; -import com.avaje.ebeaninternal.server.core.*; -import com.avaje.ebeaninternal.server.deploy.BeanManager; +import com.avaje.ebeaninternal.server.core.PersistRequestBean; +import com.avaje.ebeaninternal.server.core.PersistRequestCallableSql; +import com.avaje.ebeaninternal.server.core.PersistRequestOrmUpdate; +import com.avaje.ebeaninternal.server.core.PersistRequestUpdateSql; /** * Default PersistExecute implementation using DML statements. @@ -45,45 +46,26 @@ public final class DefaultPersistExecute implements PersistExecute { * execute the bean insert request. */ public void executeInsertBean(PersistRequestBean request) { - - BeanManager mgr = request.getBeanManager(); - BeanPersister persister = mgr.getBeanPersister(); - - BeanPersistController controller = request.getBeanController(); - if (controller == null || controller.preInsert(request)) { - persister.insert(request); - } + request.executeInsert(); } /** * execute the bean update request. */ public void executeUpdateBean(PersistRequestBean request) { - - BeanManager mgr = request.getBeanManager(); - BeanPersister persister = mgr.getBeanPersister(); - - BeanPersistController controller = request.getBeanController(); - if (controller == null || controller.preUpdate(request)) { - request.postControllerPrepareUpdate(); - persister.update(request); - } + request.executeUpdate(); } /** * execute the bean delete request. */ public int executeDeleteBean(PersistRequestBean request) { + return request.executeDelete(); + } - BeanManager mgr = request.getBeanManager(); - BeanPersister persister = mgr.getBeanPersister(); - - BeanPersistController controller = request.getBeanController(); - if (controller == null || controller.preDelete(request)) { - return persister.delete(request); - } - // delete handled by the BeanController so return 0 - return 0; + @Override + public void executeSoftDeleteBean(PersistRequestBean request) { + request.executeSoftDelete(); } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/PersistExecute.java b/src/main/java/com/avaje/ebeaninternal/server/persist/PersistExecute.java index c0183aa4b..b4655df6a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/PersistExecute.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/PersistExecute.java @@ -21,20 +21,25 @@ public interface PersistExecute { BatchControl createBatchControl(SpiTransaction t); /** - * Execute a Bean (or MapBean) insert. + * Execute a Bean insert. */ void executeInsertBean(PersistRequestBean request); /** - * Execute a Bean (or MapBean) update. + * Execute a Bean update. */ void executeUpdateBean(PersistRequestBean request); /** - * Execute a Bean (or MapBean) delete. + * Execute a Bean delete. */ int executeDeleteBean(PersistRequestBean request); + /** + * Execute soft delete. + */ + void executeSoftDeleteBean(PersistRequestBean request); + /** * Execute a Update. */