#1063 - Add Event Listeners capable of being notified for delete by id

Adds BeanDeleteIdRequest and adds a method to BeanPersistController and BeanPersistAdapter
This commit is contained in:
Rob Bygrave
2018-02-23 14:34:08 +13:00
parent 8b18e907af
commit ff111eaf33
7 changed files with 120 additions and 3 deletions
@@ -0,0 +1,26 @@
package io.ebean.event;
import io.ebean.EbeanServer;
import io.ebean.Transaction;
/**
* A request to delete a bean by Id value.
*/
public interface BeanDeleteIdRequest {
/**
* Return the server processing the request.
*/
EbeanServer getEbeanServer();
/**
* Return the Transaction associated with this request.
*/
Transaction getTransaction();
/**
* Returns the Id value of the bean being deleted.
*/
Object getId();
}
@@ -87,4 +87,11 @@ public abstract class BeanPersistAdapter implements BeanPersistController {
public void postSoftDelete(BeanPersistRequest<?> request) {
}
/**
* Does nothing by default.
*/
@Override
public void preDelete(BeanDeleteIdRequest request) {
}
}
@@ -92,6 +92,11 @@ public interface BeanPersistController {
*/
boolean preSoftDelete(BeanPersistRequest<?> request);
/**
* Prior to a delete by id perform some action.
*/
void preDelete(BeanDeleteIdRequest request);
/**
* Called after the insert was performed.
*/
@@ -1,5 +1,6 @@
package io.ebeaninternal.server.deploy;
import io.ebean.event.BeanDeleteIdRequest;
import io.ebean.event.BeanPersistController;
import io.ebean.event.BeanPersistRequest;
@@ -147,6 +148,13 @@ public class ChainedBeanPersistController implements BeanPersistController {
return true;
}
@Override
public void preDelete(BeanDeleteIdRequest request) {
for (BeanPersistController aChain : chain) {
aChain.preDelete(request);
}
}
@Override
public boolean preInsert(BeanPersistRequest<?> request) {
for (BeanPersistController aChain : chain) {
@@ -9,6 +9,7 @@ import io.ebean.bean.BeanCollection;
import io.ebean.bean.BeanCollection.ModifyListenMode;
import io.ebean.bean.EntityBean;
import io.ebean.bean.PersistenceContext;
import io.ebean.event.BeanPersistController;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.api.SpiTransaction;
import io.ebeaninternal.api.SpiUpdate;
@@ -718,6 +719,7 @@ public final class DefaultPersister implements Persister {
}
// use Id's to update L2 cache rather than Bulk table event
notifyDeleteById(descriptor, id, idList, transaction);
deleteById.setAutoTableMod(false);
if (idList != null) {
t.getEvent().addDeleteByIdList(descriptor, idList);
@@ -738,6 +740,22 @@ public final class DefaultPersister implements Persister {
return rows;
}
private void notifyDeleteById(BeanDescriptor<?> descriptor, Object id, List<Object> idList, Transaction transaction) {
BeanPersistController controller = descriptor.getPersistController();
if (controller != null) {
DeleteIdRequest request = new DeleteIdRequest(server, transaction, id);
if (idList == null) {
controller.preDelete(request);
} else {
for (Object idValue : idList) {
request.setId(idValue);
controller.preDelete(request);
}
}
}
}
/**
* We need to create and execute a query to get the foreign key values as
* the delete cascades to them (foreign keys).
@@ -0,0 +1,37 @@
package io.ebeaninternal.server.persist;
import io.ebean.EbeanServer;
import io.ebean.Transaction;
import io.ebean.event.BeanDeleteIdRequest;
import io.ebeaninternal.api.SpiEbeanServer;
class DeleteIdRequest implements BeanDeleteIdRequest {
private final EbeanServer server;
private final Transaction transaction;
private Object id;
DeleteIdRequest(SpiEbeanServer server, Transaction transaction, Object id) {
this.server = server;
this.transaction = transaction;
}
void setId(Object id) {
this.id = id;
}
@Override
public EbeanServer getEbeanServer() {
return server;
}
@Override
public Transaction getTransaction() {
return transaction;
}
@Override
public Object getId() {
return id;
}
}