#846 - Add soft delete related callbacks

This commit is contained in:
Rob Bygrave
2016-11-03 23:27:39 +13:00
parent c1d6cc7b75
commit 8c500c5836
9 changed files with 123 additions and 45 deletions
@@ -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) {
}
}
@@ -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) {
}
}
@@ -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);
}
@@ -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);
}
@@ -373,6 +373,7 @@ public final class PersistRequestBean<T> 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<T> 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<T> extends PersistRequest implements BeanP
beanPersistListener.deleted(bean);
break;
case SOFT_DELETE:
beanPersistListener.softDeleted(bean);
break;
default:
}
}
@@ -654,7 +660,7 @@ public final class PersistRequestBean<T> 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<T> 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<T> 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;
}
}
@@ -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++) {
@@ -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);
@@ -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 <T> void executeInsertBean(PersistRequestBean<T> request) {
BeanManager<T> 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 <T> void executeUpdateBean(PersistRequestBean<T> request) {
BeanManager<T> 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 <T> int executeDeleteBean(PersistRequestBean<T> request) {
return request.executeDelete();
}
BeanManager<T> 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 <T> void executeSoftDeleteBean(PersistRequestBean<T> request) {
request.executeSoftDelete();
}
/**
@@ -21,20 +21,25 @@ public interface PersistExecute {
BatchControl createBatchControl(SpiTransaction t);
/**
* Execute a Bean (or MapBean) insert.
* Execute a Bean insert.
*/
<T> void executeInsertBean(PersistRequestBean<T> request);
/**
* Execute a Bean (or MapBean) update.
* Execute a Bean update.
*/
<T> void executeUpdateBean(PersistRequestBean<T> request);
/**
* Execute a Bean (or MapBean) delete.
* Execute a Bean delete.
*/
<T> int executeDeleteBean(PersistRequestBean<T> request);
/**
* Execute soft delete.
*/
<T> void executeSoftDeleteBean(PersistRequestBean<T> request);
/**
* Execute a Update.
*/