This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch test/document-datamapping-events in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 36e717a8462230a0791aef7474f54262cd44a8aa Author: Walter Duque de Estrada <[email protected]> AuthorDate: Fri Aug 14 10:30:16 2026 -0500 Remove dead event-argument-hook branch from DomainEventListener invokeEvent's eventMethod.getParameterTypes().length == 1 branch could never be taken: findAndCacheEvent caches hooks via Spring's ReflectionUtils.findMethod(Class, String), which only ever matches zero-argument methods (confirmed by decompiling spring-core), so a cached eventMethod can never have one parameter. Dropped the branch and the now-unused ApplicationEvent parameter it required, along with the argument at all 8 call sites. No behavior change; full module suite, jacoco, and codeStyle all clean. --- .../datastore/gorm/events/DomainEventListener.java | 31 +++++++++------------- .../gorm/events/DomainEventListenerSpec.groovy | 10 +++---- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DomainEventListener.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DomainEventListener.java index 4f800d779b..fca82d846f 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DomainEventListener.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DomainEventListener.java @@ -163,7 +163,7 @@ public class DomainEventListener extends AbstractPersistenceEventListener } } - return invokeEvent(EVENT_BEFORE_INSERT, entity, ea, event); + return invokeEvent(EVENT_BEFORE_INSERT, entity, ea); } protected void setVersion(final EntityAccess ea) { @@ -180,19 +180,19 @@ public class DomainEventListener extends AbstractPersistenceEventListener } public boolean beforeUpdate(final PersistentEntity entity, final EntityAccess ea) { - return invokeEvent(EVENT_BEFORE_UPDATE, entity, ea, null); + return invokeEvent(EVENT_BEFORE_UPDATE, entity, ea); } public boolean beforeUpdate(final PersistentEntity entity, final EntityAccess ea, PreUpdateEvent event) { - return invokeEvent(EVENT_BEFORE_UPDATE, entity, ea, event); + return invokeEvent(EVENT_BEFORE_UPDATE, entity, ea); } public boolean beforeDelete(final PersistentEntity entity, final EntityAccess ea) { - return invokeEvent(EVENT_BEFORE_DELETE, entity, ea, null); + return invokeEvent(EVENT_BEFORE_DELETE, entity, ea); } public boolean beforeDelete(final PersistentEntity entity, final EntityAccess ea, PreDeleteEvent event) { - return invokeEvent(EVENT_BEFORE_DELETE, entity, ea, event); + return invokeEvent(EVENT_BEFORE_DELETE, entity, ea); } public void beforeLoad(final PersistentEntity entity, final EntityAccess ea) { @@ -200,7 +200,7 @@ public class DomainEventListener extends AbstractPersistenceEventListener } public void beforeLoad(final PersistentEntity entity, final EntityAccess ea, PreLoadEvent event) { - invokeEvent(EVENT_BEFORE_LOAD, entity, ea, event); + invokeEvent(EVENT_BEFORE_LOAD, entity, ea); } public void afterDelete(final PersistentEntity entity, final EntityAccess ea) { @@ -208,7 +208,7 @@ public class DomainEventListener extends AbstractPersistenceEventListener } public void afterDelete(final PersistentEntity entity, final EntityAccess ea, PostDeleteEvent event) { - invokeEvent(EVENT_AFTER_DELETE, entity, ea, event); + invokeEvent(EVENT_AFTER_DELETE, entity, ea); } public void afterInsert(final PersistentEntity entity, final EntityAccess ea) { @@ -217,7 +217,7 @@ public class DomainEventListener extends AbstractPersistenceEventListener public void afterInsert(final PersistentEntity entity, final EntityAccess ea, PostInsertEvent event) { activateDirtyChecking(ea); - invokeEvent(EVENT_AFTER_INSERT, entity, ea, event); + invokeEvent(EVENT_AFTER_INSERT, entity, ea); } private void activateDirtyChecking(EntityAccess ea) { @@ -233,7 +233,7 @@ public class DomainEventListener extends AbstractPersistenceEventListener public void afterUpdate(final PersistentEntity entity, final EntityAccess ea, PostUpdateEvent event) { activateDirtyChecking(ea); // reset dirty checking - invokeEvent(EVENT_AFTER_UPDATE, entity, ea, event); + invokeEvent(EVENT_AFTER_UPDATE, entity, ea); } public void afterLoad(final PersistentEntity entity, final EntityAccess ea) { @@ -245,7 +245,7 @@ public class DomainEventListener extends AbstractPersistenceEventListener if (autowireEntities || (entity != null && entity.getMapping().getMappedForm().isAutowire())) { autowireBeanProperties(ea.getEntity()); } - invokeEvent(EVENT_AFTER_LOAD, entity, ea, event); + invokeEvent(EVENT_AFTER_LOAD, entity, ea); } protected void autowireBeanProperties(final Object entity) { @@ -274,7 +274,7 @@ public class DomainEventListener extends AbstractPersistenceEventListener return AbstractPersistenceEvent.class.isAssignableFrom(eventType); } - private boolean invokeEvent(String eventName, PersistentEntity entity, EntityAccess ea, ApplicationEvent event) { + private boolean invokeEvent(String eventName, PersistentEntity entity, EntityAccess ea) { final Map<String, Method> events = entityEvents.get(entity); if (events == null) { return true; @@ -287,14 +287,7 @@ public class DomainEventListener extends AbstractPersistenceEventListener final Object result; if (ea != null) { - final Object o = ea.getEntity(); - - if (eventMethod.getParameterTypes().length == 1) { - result = ReflectionUtils.invokeMethod(eventMethod, o, event); - } - else { - result = ReflectionUtils.invokeMethod(eventMethod, o); - } + result = ReflectionUtils.invokeMethod(eventMethod, ea.getEntity()); } else { result = null; diff --git a/grails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/events/DomainEventListenerSpec.groovy b/grails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/events/DomainEventListenerSpec.groovy index 3ddf2d0118..319f27100c 100644 --- a/grails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/events/DomainEventListenerSpec.groovy +++ b/grails-datamapping-core/src/test/groovy/org/grails/datastore/gorm/events/DomainEventListenerSpec.groovy @@ -60,14 +60,14 @@ import org.grails.datastore.mapping.model.config.GormProperties * - {@code invokeEvent}'s {@code ea != null} branch is always true through every public before- * and after-hook method, which never passes a null {@code EntityAccess}; the {@code ea == null} * path is unreachable via the public API. - * - {@code invokeEvent}'s {@code eventMethod.getParameterTypes().length == 1} branch can never be - * taken: {@code findAndCacheEvent} caches hooks via Spring's {@code ReflectionUtils.findMethod(Class, String)}, - * which (confirmed via decompiling spring-core) only ever matches zero-argument methods, so a - * cached {@code eventMethod} can never have one parameter. Event-argument-accepting hooks appear - * to be an unreachable, effectively dead capability. * - The protected {@code DomainEventListener(ConnectionSourcesProvider, MappingContext)} * constructor exists solely for subclassing (e.g. {@code grails.gorm.rx.events.DomainEventListener}), * which is covered by its own module's spec; exercising it here would duplicate that coverage. + * + * {@code invokeEvent} previously also branched on {@code eventMethod.getParameterTypes().length == 1} + * to invoke a hook with the triggering event as an argument. That branch was confirmed dead (via + * decompiling spring-core's {@code ReflectionUtils.findMethod(Class, String)}, which only ever + * matches zero-argument methods) and removed. */ class DomainEventListenerSpec extends Specification {
