Skip to content

Commit

Permalink
fix: Fix issues with field change hook for new entities (#20)
Browse files Browse the repository at this point in the history
  • Loading branch information
thewizkid87 authored Nov 4, 2024
1 parent 9c3f5a5 commit e296e79
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,15 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity creat

List<FieldChangeHook> fieldChangeHooks = crudHelper.getFieldChangeHooks(entity.getClass());
for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runPreChange(entity);
fieldChangeHook.runPreChange(entity, entity.generateEmptyEntity());
}

entity = crudCreateTransactionalHandler.createTransactional(entity, hooks.getOnHooks(), fieldChangeHooks);
for (CRUDPostCreateHook<ID, Entity> postHook : hooks.getPostHooks()) {
postHook.run(entity);
}
for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runPostChange(entity);
fieldChangeHook.runPostChange(entity, entity.generateEmptyEntity());
}

return entity;
Expand All @@ -86,11 +86,11 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> List<Entity>
hooks.forEach(hook -> entities.forEach(hook::preCreate));

List<FieldChangeHook> fieldChangeHooks = crudHelper.getFieldChangeHooks(entityClazz);
fieldChangeHooks.forEach(hook -> entities.forEach(hook::runPreChange));
fieldChangeHooks.forEach(hook -> entities.forEach(entity -> hook.runPreChange(entity, entity.generateEmptyEntity())));

List<Entity> createdEntities = crudCreateTransactionalHandler.bulkCreateTransactional(entities, hooks, fieldChangeHooks);
hooks.forEach(hook -> createdEntities.forEach(hook::postCreate));
fieldChangeHooks.forEach(hook -> createdEntities.forEach(hook::runPostChange));
fieldChangeHooks.forEach(hook -> createdEntities.forEach(entity -> hook.runPostChange(entity, entity.generateEmptyEntity())));
return createdEntities;
}

Expand Down Expand Up @@ -120,7 +120,7 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity creat
postHook.run(entity);
}
for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runPostChange(entity);
fieldChangeHook.runPostChange(entity, entity.generateEmptyEntity());
}

return entity;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity creat
}

for(FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runOnChange(entity);
fieldChangeHook.runOnChange(entity, entity.generateEmptyEntity());
}

return crudHelper.getCrudDaoForEntity(entity.getClass()).saveOrUpdate(entity);
Expand All @@ -49,7 +49,7 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity creat
}

for(FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runOnChange(entity);
fieldChangeHook.runOnChange(entity, entity.generateEmptyEntity());
}

return crudHelper.getCrudDaoForEntity(clazz).saveOrUpdate(entity);
Expand All @@ -59,7 +59,7 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity creat
@Transactional(readOnly = false)
public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> List<Entity> bulkCreateTransactional(List<Entity> entities, List<CreateHooks> hooks, List<FieldChangeHook> fieldChangeHooks) {
hooks.forEach(hook -> entities.forEach(hook::onCreate));
fieldChangeHooks.forEach(hook -> entities.forEach(hook::runOnChange));
fieldChangeHooks.forEach(hook -> entities.forEach(entity -> hook.runPreChange(entity, entity.generateEmptyEntity())));
return crudHelper.getCrudDaoForEntity(entities.get(0).getClass()).saveOrUpdate(entities);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

@WrapException(value = CrudUpdateException.class)
Expand Down Expand Up @@ -90,8 +92,13 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity updat
}

List<FieldChangeHook> fieldChangeHooks = crudHelper.getFieldChangeHooks(entity.getClass());
Entity original = null;
if (fieldChangeHooks != null && !fieldChangeHooks.isEmpty()) {
original = (Entity) entity.saveOrGetCopy();
}

for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runPreChange(entity);
fieldChangeHook.runPreChange(entity, original);
}

entity = crudUpdateTransactionalHandler.updateTransactional(entity, filter, hooks.getOnHooks(), fieldChangeHooks, applyPolicies);
Expand All @@ -103,7 +110,7 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity updat
}

for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runPostChange(entity);
fieldChangeHook.runPostChange(entity, original);
}

return entity;
Expand Down Expand Up @@ -145,7 +152,7 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity updat
postHook.run(entity);
}
for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runPostChange(entity);
fieldChangeHook.runPostChange(entity, entity.saveOrGetCopy());
}

return entity;
Expand Down Expand Up @@ -179,6 +186,8 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> List<Entity>
}
}

Map<ID, Entity> originals = new HashMap<>();

for (Entity entity : entities) {
Objects.requireNonNull(entity, "Entity cannot be null");
Objects.requireNonNull(entity.getId(), "Entity ID cannot be null");
Expand All @@ -190,8 +199,12 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> List<Entity>
preHook.run(entity);
}

if (fieldChangeHooks != null && !fieldChangeHooks.isEmpty()) {
originals.put(entity.getId(), (Entity) entity.saveOrGetCopy());
}

for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runPreChange(entity);
fieldChangeHook.runPreChange(entity, originals.get(entity.getId()));
}
}

Expand All @@ -205,7 +218,7 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> List<Entity>
}

for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runPostChange(entity);
fieldChangeHook.runPostChange(entity, originals.get(entity.getId()));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity updat
onHook.run(entity);
}
for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runOnChange(entity);
fieldChangeHook.runOnChange(entity, entity.saveOrGetCopy());
}

return crudHelper.getCrudDaoForEntity(entity.getClass()).saveOrUpdate(entity);
Expand All @@ -66,7 +66,7 @@ public <ID extends Serializable, Entity extends BaseCrudEntity<ID>> Entity updat
onHook.run(entity, object);
}
for (FieldChangeHook fieldChangeHook : fieldChangeHooks) {
fieldChangeHook.runOnChange(entity);
fieldChangeHook.runOnChange(entity, entity.saveOrGetCopy());
}

return crudHelper.getCrudDaoForEntity(clazz).saveOrUpdate(entity);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,31 +8,27 @@ abstract class FieldChangeHook<PropertyType, Entity : BaseCrudEntity<*>>(val pro
open fun onChange(originalValue: PropertyType?, newValue: PropertyType?, entity: Entity) {}
open fun postChange(originalValue: PropertyType?, newValue: PropertyType?, entity: Entity) {}

fun shouldTrigger(entity: Entity): Boolean {
val original = entity.saveOrGetCopy() as Entity
fun shouldTrigger(entity: Entity, original: Entity): Boolean {
val originalValue = property.get(original) as PropertyType?
val newValue = property.get(entity) as PropertyType?
return originalValue != newValue
}

fun runPreChange(entity: Entity) {
val original = entity.saveOrGetCopy() as Entity
fun runPreChange(entity: Entity, original: Entity) {
val originalValue = property.get(original) as PropertyType?
val newValue = property.get(entity) as PropertyType?
if(originalValue == newValue) return
preChange(originalValue, newValue, entity)
}

fun runOnChange(entity: Entity) {
val original = entity.saveOrGetCopy() as Entity
fun runOnChange(entity: Entity, original: Entity) {
val originalValue = property.get(original) as PropertyType?
val newValue = property.get(entity) as PropertyType?
if(originalValue == newValue) return
onChange(originalValue, newValue, entity)
}

fun runPostChange(entity: Entity) {
val original = entity.saveOrGetCopy() as Entity
fun runPostChange(entity: Entity, original: Entity) {
val originalValue = property.get(original) as PropertyType?
val newValue = property.get(entity) as PropertyType?
if(originalValue == newValue) return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,17 @@ abstract class BaseCrudEntity<ID : Serializable> : PersistentEntity, Serializabl
return copy
}

fun generateEmptyEntity(): BaseCrudEntity<ID>? {
try {
val emptyEntity = javaClass.newInstance()
emptyEntity.isCopy = true
return emptyEntity // ImmutableBean.create(internalCopy) as BaseCrudEntity<ID>
} catch (e: Exception) {
e.printStackTrace()
return null
}
}

open fun getCacheKey(): String? {
return getCacheKey(javaClass, id)
}
Expand Down

0 comments on commit e296e79

Please sign in to comment.