This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch 8.0.x-hibernate7-dev in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 45c7764f70a021cb5c29e455de1ab1d14dbb17a9 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Sun Mar 22 11:21:59 2026 -0500 hibernate 7: linting and EventListenerIntegrator tightening --- .../orm/hibernate/EventListenerIntegrator.java | 7 ++- .../hibernate/HibernatePersistentProperty.java | 17 +++----- .../secondpass/UnidirectionalOneToManyBinder.java | 19 ++++---- .../util/DefaultColumnNameFetcher.java | 16 +++---- .../hibernate/proxy/GrailsBytecodeProvider.java | 13 ++---- .../hibernate/EventListenerIntegratorSpec.groovy | 51 ++++++++++++++++++++++ 6 files changed, 83 insertions(+), 40 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/EventListenerIntegrator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/EventListenerIntegrator.java index 7574f08676..c4e470b0ce 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/EventListenerIntegrator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/EventListenerIntegrator.java @@ -44,7 +44,6 @@ public class EventListenerIntegrator implements Integrator { this.eventListeners = eventListeners; } - @SuppressWarnings("unchecked") protected static final List<EventType<?>> TYPES = Arrays.asList( EventType.AUTO_FLUSH, EventType.MERGE, @@ -83,6 +82,9 @@ public class EventListenerIntegrator implements Integrator { public void integrate(Metadata metadata, BootstrapContext bootstrapContext, SessionFactoryImplementor sfi) { EventListenerRegistry listenerRegistry = sfi.getServiceRegistry().getService(EventListenerRegistry.class); + if (listenerRegistry == null) { + throw new IllegalStateException("EventListenerRegistry not available from ServiceRegistry"); + } if (eventListeners != null) { for (Map.Entry<String, Object> entry : eventListeners.entrySet()) { @@ -115,7 +117,7 @@ public class EventListenerIntegrator implements Integrator { // since ClosureEventTriggeringInterceptor extends DefaultSaveOrUpdateEventListener we // want to override instead of append the listener here // to avoid there being 2 implementations which would impact performance too - group.clear(); + group.clearListeners(); group.appendListener(listener); } else { group.appendListener(listener); @@ -151,6 +153,7 @@ public class EventListenerIntegrator implements Integrator { } } + @Override public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { // nothing to do } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.java index 6ed7139205..f45c0071ff 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.java @@ -104,7 +104,7 @@ public interface HibernatePersistentProperty extends PersistentProperty<Property } default GrailsHibernatePersistentEntity getHibernateOwner() { - return (GrailsHibernatePersistentEntity )getOwner() ; + return (GrailsHibernatePersistentEntity) getOwner(); } @SuppressWarnings("PMD.DataflowAnomalyAnalysis") @@ -154,15 +154,15 @@ public interface HibernatePersistentProperty extends PersistentProperty<Property @Override default boolean isLazyAble() { - return this instanceof HibernateAssociation || - !(this instanceof Embedded) && !this.equals(this.getOwner().getIdentity()); + return this instanceof HibernateAssociation + || !(this instanceof Embedded) && !this.equals(this.getOwner().getIdentity()); } /** * @return The mapped form */ default PropertyConfig getHibernateMappedForm() { - return (PropertyConfig) getMappedForm(); + return getMappedForm(); } /** @@ -181,10 +181,7 @@ public interface HibernatePersistentProperty extends PersistentProperty<Property } default String getMappedColumnName() { - if (getMappedForm() != null) { - return getMappedForm().getColumn(); - } - return null; + return Optional.ofNullable(getMappedForm()).map(PropertyConfig::getColumn).orElse(null); } default String getColumnName(ColumnConfig cc) { @@ -228,10 +225,10 @@ public interface HibernatePersistentProperty extends PersistentProperty<Property } default Table getTable() { - return getPersistentClass().getTable(); + return getPersistentClass().getTable(); } - default PersistentClass getPersistentClass(){ + default PersistentClass getPersistentClass() { return getHibernateOwner().getPersistentClass(); } } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/UnidirectionalOneToManyBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/UnidirectionalOneToManyBinder.java index 79bdbbf293..321c7c4193 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/UnidirectionalOneToManyBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/UnidirectionalOneToManyBinder.java @@ -26,8 +26,7 @@ import org.hibernate.mapping.Collection; import org.hibernate.mapping.ManyToOne; import org.hibernate.mapping.OneToMany; import org.hibernate.mapping.Value; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty; @@ -38,7 +37,6 @@ import static org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsDomainBind /** Binds unidirectional one-to-many associations. */ public class UnidirectionalOneToManyBinder { - private static final Logger LOG = LoggerFactory.getLogger(UnidirectionalOneToManyBinder.class); private final CollectionWithJoinTableBinder collectionWithJoinTableBinder; private final BackticksRemover backticksRemover = new BackticksRemover(); private final InFlightMetadataCollector mappings; @@ -63,9 +61,9 @@ public class UnidirectionalOneToManyBinder { Value element = collection.getElement(); element.createForeignKey(); - String entityName = (element instanceof ManyToOne manyToOne) ? - manyToOne.getReferencedEntityName() : - ((OneToMany) element).getReferencedEntityName(); + String entityName = (element instanceof ManyToOne manyToOne) + ? manyToOne.getReferencedEntityName() + : ((OneToMany) element).getReferencedEntityName(); collection.setInverse(false); @@ -76,11 +74,10 @@ public class UnidirectionalOneToManyBinder { GrailsHibernatePersistentEntity owner = (GrailsHibernatePersistentEntity) property.getOwner(); Backref backref = new Backref(); backref.setEntityName(owner.getName()); - backref.setName(UNDERSCORE + - backticksRemover.apply(owner.getJavaClass().getSimpleName()) + - UNDERSCORE + - backticksRemover.apply(property.getName()) + - "Backref"); + backref.setName(UNDERSCORE + backticksRemover.apply(owner.getJavaClass().getSimpleName()) + + UNDERSCORE + + backticksRemover.apply(property.getName()) + + "Backref"); backref.setUpdatable(false); backref.setInsertable(true); backref.setCollectionRole(collection.getRole()); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/DefaultColumnNameFetcher.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/DefaultColumnNameFetcher.java index 8ca63530bb..7594cbd244 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/DefaultColumnNameFetcher.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/DefaultColumnNameFetcher.java @@ -65,20 +65,20 @@ public class DefaultColumnNameFetcher { if (!association.isBidirectional() && association instanceof HibernateOneToManyProperty) { String prefix = namingStrategyWrapper.resolveTableName( property.getOwner().getRootEntity().getJavaClass().getSimpleName()); - return backticksRemover.apply(prefix) + - UNDERSCORE + - backticksRemover.apply(columnName) + - FOREIGN_KEY_SUFFIX; + return backticksRemover.apply(prefix) + + UNDERSCORE + + backticksRemover.apply(columnName) + + FOREIGN_KEY_SUFFIX; } if (property.isInherited() && property.isBidirectionalManyToOne()) { return namingStrategyWrapper.resolveColumnName(property.getOwner() .getRootEntity() .getJavaClass() - .getSimpleName()) + - '_' + - columnName + - FOREIGN_KEY_SUFFIX; + .getSimpleName()) + + '_' + + columnName + + FOREIGN_KEY_SUFFIX; } return columnName + FOREIGN_KEY_SUFFIX; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/proxy/GrailsBytecodeProvider.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/proxy/GrailsBytecodeProvider.java index 43044f3fd7..e4548d09ae 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/proxy/GrailsBytecodeProvider.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/proxy/GrailsBytecodeProvider.java @@ -20,13 +20,13 @@ package org.grails.orm.hibernate.proxy; import java.util.Map; -import org.hibernate.bytecode.enhance.spi.Enhancer; import org.hibernate.bytecode.enhance.spi.EnhancementContext; +import org.hibernate.bytecode.enhance.spi.Enhancer; import org.hibernate.bytecode.spi.BytecodeProvider; import org.hibernate.bytecode.spi.ProxyFactoryFactory; import org.hibernate.bytecode.spi.ReflectionOptimizer; -import org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyHelper; import org.hibernate.property.access.spi.PropertyAccess; +import org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyHelper; /** * A {@link BytecodeProvider} implementation for Hibernate 7 that provides Groovy-aware proxies. @@ -53,17 +53,12 @@ public class GrailsBytecodeProvider implements BytecodeProvider { @Override public ReflectionOptimizer getReflectionOptimizer( - Class clazz, - String[] getterNames, - String[] setterNames, - Class[] types) { + Class clazz, String[] getterNames, String[] setterNames, Class[] types) { return null; } @Override - public ReflectionOptimizer getReflectionOptimizer( - Class<?> clazz, - Map<String, PropertyAccess> propertyAccessMap) { + public ReflectionOptimizer getReflectionOptimizer(Class<?> clazz, Map<String, PropertyAccess> propertyAccessMap) { return null; } diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/EventListenerIntegratorSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/EventListenerIntegratorSpec.groovy new file mode 100644 index 0000000000..1c6e21b298 --- /dev/null +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/EventListenerIntegratorSpec.groovy @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.grails.orm.hibernate + +import org.hibernate.boot.Metadata +import org.hibernate.boot.spi.BootstrapContext +import org.hibernate.engine.spi.SessionFactoryImplementor +import org.hibernate.event.service.spi.EventListenerRegistry +import org.hibernate.service.spi.SessionFactoryServiceRegistry +import spock.lang.Specification + +class EventListenerIntegratorSpec extends Specification { + + def "test that integrate throws IllegalStateException if EventListenerRegistry is not available"() { + given: + HibernateEventListeners hibernateEventListeners = Mock(HibernateEventListeners) + Map<String, Object> eventListeners = [:] + EventListenerIntegrator integrator = new EventListenerIntegrator(hibernateEventListeners, eventListeners) + + Metadata metadata = Mock(Metadata) + BootstrapContext bootstrapContext = Mock(BootstrapContext) + SessionFactoryImplementor sfi = Mock(SessionFactoryImplementor) + SessionFactoryServiceRegistry serviceRegistry = Mock(SessionFactoryServiceRegistry) + + when: + integrator.integrate(metadata, bootstrapContext, sfi) + + then: + 1 * sfi.getServiceRegistry() >> serviceRegistry + 1 * serviceRegistry.getService(EventListenerRegistry) >> null + + def e = thrown(IllegalStateException) + e.message == "EventListenerRegistry not available from ServiceRegistry" + } +}
