This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch 8.0.x-hibernate7 in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 1be16cd4188a1599efdbe44e9305341c8c7c63f3 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Tue Feb 24 18:48:48 2026 -0600 removed unused code --- .../HibernateJtaTransactionManagerAdapter.java | 235 -------------------- grails-data-hibernate7/STATUS.md | 39 ++-- .../datasource/MultipleDataSourceSupport.java | 50 ----- .../HibernateJtaTransactionManagerAdapter.java | 236 --------------------- .../PlatformTransactionManagerProxy.java | 57 ----- 5 files changed, 27 insertions(+), 590 deletions(-) diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java deleted file mode 100644 index c861eaa5f7..0000000000 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java +++ /dev/null @@ -1,235 +0,0 @@ -/* - * 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.transaction; - -import javax.transaction.xa.XAResource; - -import jakarta.transaction.RollbackException; -import jakarta.transaction.Status; -import jakarta.transaction.Synchronization; -import jakarta.transaction.SystemException; -import jakarta.transaction.Transaction; -import jakarta.transaction.TransactionManager; - -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.support.DefaultTransactionDefinition; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -/** - * Adapter for adding transaction controlling hooks for supporting - * Hibernate's org.hibernate.engine.transaction.Isolater class's interaction with transactions - * - * This is required when there is no real JTA transaction manager in use and Spring's - * {@link org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy} is used. - * - * Without this solution, using Hibernate's TableGenerator identity strategies will fail to support transactions. - * The id generator will commit the current transaction and break transactional behaviour. - * - * The javadoc of Hibernate's {@code TableHiLoGenerator} states this. However this isn't mentioned in the javadocs of other TableGenerators. - * - * @author Lari Hotari - */ -public class HibernateJtaTransactionManagerAdapter implements TransactionManager { - PlatformTransactionManager springTransactionManager; - ThreadLocal<TransactionStatus> currentTransactionHolder = new ThreadLocal<>(); - - public HibernateJtaTransactionManagerAdapter(PlatformTransactionManager springTransactionManager) { - this.springTransactionManager = springTransactionManager; - } - - @Override - public void begin() { - TransactionDefinition definition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW); - currentTransactionHolder.set(springTransactionManager.getTransaction(definition)); - } - - @Override - public void commit() throws - SecurityException, IllegalStateException { - springTransactionManager.commit(getAndRemoveStatus()); - } - - @Override - public void rollback() throws IllegalStateException, SecurityException { - springTransactionManager.rollback(getAndRemoveStatus()); - } - - @Override - public void setRollbackOnly() throws IllegalStateException { - currentTransactionHolder.get().setRollbackOnly(); - } - - protected TransactionStatus getAndRemoveStatus() { - TransactionStatus status = currentTransactionHolder.get(); - currentTransactionHolder.remove(); - return status; - } - - @Override - public int getStatus() { - TransactionStatus status = currentTransactionHolder.get(); - return convertToJtaStatus(status); - } - - protected static int convertToJtaStatus(TransactionStatus status) { - if (status != null) { - if (status.isCompleted()) { - return Status.STATUS_UNKNOWN; - } else if (status.isRollbackOnly()) { - return Status.STATUS_MARKED_ROLLBACK; - } else { - return Status.STATUS_ACTIVE; - } - } else { - return Status.STATUS_NO_TRANSACTION; - } - } - - @Override - public Transaction getTransaction() { - return new TransactionAdapter(springTransactionManager, currentTransactionHolder); - } - - @Override - public void resume(Transaction tobj) throws IllegalStateException { - TransactionAdapter transaction = (TransactionAdapter) tobj; - // commit the PROPAGATION_NOT_SUPPORTED transaction returned in suspend - springTransactionManager.commit(transaction.transactionStatus); - } - - @Override - public Transaction suspend() { - currentTransactionHolder.set(springTransactionManager.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_NOT_SUPPORTED))); - return new TransactionAdapter(springTransactionManager, currentTransactionHolder); - } - - @Override - public void setTransactionTimeout(int seconds) { - - } - - private static class TransactionAdapter implements Transaction { - PlatformTransactionManager springTransactionManager; - TransactionStatus transactionStatus; - ThreadLocal<TransactionStatus> currentTransactionHolder; - - TransactionAdapter(PlatformTransactionManager springTransactionManager, ThreadLocal<TransactionStatus> currentTransactionHolder) { - this.springTransactionManager = springTransactionManager; - this.currentTransactionHolder = currentTransactionHolder; - this.transactionStatus = currentTransactionHolder.get(); - } - - @Override - public void commit() throws - SecurityException, IllegalStateException { - springTransactionManager.commit(transactionStatus); - currentTransactionHolder.remove(); - } - - @Override - public boolean delistResource(XAResource xaRes, int flag) throws IllegalStateException, SystemException { - return false; - } - - @Override - public boolean enlistResource(XAResource xaRes) throws RollbackException, IllegalStateException, - SystemException { - return false; - } - - @Override - public int getStatus() throws SystemException { - return convertToJtaStatus(transactionStatus); - } - - @Override - public void registerSynchronization(final Synchronization sync) throws RollbackException, IllegalStateException, - SystemException { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - @Override - public void beforeCompletion() { - sync.beforeCompletion(); - } - - @Override - public void afterCompletion(int status) { - int jtaStatus; - if (status == TransactionSynchronization.STATUS_COMMITTED) { - jtaStatus = Status.STATUS_COMMITTED; - } else if (status == TransactionSynchronization.STATUS_ROLLED_BACK) { - jtaStatus = Status.STATUS_ROLLEDBACK; - } else { - jtaStatus = Status.STATUS_UNKNOWN; - } - sync.afterCompletion(jtaStatus); - } - - public void suspend() { } - - public void resume() { } - - public void flush() { } - - public void beforeCommit(boolean readOnly) { } - - public void afterCommit() { } - }); - } - - @Override - public void rollback() throws IllegalStateException, SystemException { - springTransactionManager.rollback(transactionStatus); - currentTransactionHolder.remove(); - } - - @Override - public void setRollbackOnly() throws IllegalStateException, SystemException { - transactionStatus.setRollbackOnly(); - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } else if (obj == null) { - return false; - } else if (obj.getClass() == TransactionAdapter.class) { - TransactionAdapter other = (TransactionAdapter) obj; - if (other.transactionStatus == this.transactionStatus) { - return true; - } else if (other.transactionStatus != null) { - return other.transactionStatus.equals(this.transactionStatus); - } else { - return false; - } - } else { - return false; - } - } - - @Override - public int hashCode() { - return transactionStatus != null ? transactionStatus.hashCode() : System.identityHashCode(this); - } - } -} diff --git a/grails-data-hibernate7/STATUS.md b/grails-data-hibernate7/STATUS.md index e9b43be0f5..400d8bb359 100644 --- a/grails-data-hibernate7/STATUS.md +++ b/grails-data-hibernate7/STATUS.md @@ -70,17 +70,32 @@ Full detail: [`GORM-QUERY-SAFETY-AUDIT.md`](GORM-QUERY-SAFETY-AUDIT.md) ## Test Coverage -| Package | Coverage | Status | -|---------|----------|--------| -| `domainbinding/binder` | ~94% instructions | ✅ | -| `domainbinding/util` | ~93% instructions | ✅ | -| `compiler` | ~93% instructions | ✅ | -| `query` | ~84% instructions | ✅ | -| `grails.orm` | ~79% instructions | ⚠️ | -| `org.grails.orm.hibernate` | ~74% instructions / ~54% branches | ⚠️ | -| `transaction` | 0% | ❌ No tests at all | -| `datasource` | 0% | ❌ No tests at all | -| **Overall** | **80% instructions / 66% branches** | ⚠️ | +> Last measured: 2026-02-24 (after MultiTenantEventListenerSpec, TraitPropertyAccessStrategySpec, HqlQueryContextSpec) + +| Package | Instructions | Branches | Status | +|---------|-------------|----------|--------| +| `org.hibernate.proxy` | 100% | 100% | ✅ | +| `grails.gorm.hibernate.mapping` | 98% | 50% | ✅ | +| `org.grails.orm.hibernate.cfg.domainbinding.collectionType` | 97% | N/A | ✅ | +| `org.grails.orm.hibernate.cfg.domainbinding.binder` | 95% | 85% | ✅ | +| `org.grails.orm.hibernate.cfg.domainbinding.util` | 93% | 83% | ✅ | +| `org.grails.orm.hibernate.compiler` | 93% | 53% | ✅ | +| `org.grails.orm.hibernate.cfg.domainbinding.generator` | 90% | 59% | ✅ | +| `org.grails.orm.hibernate.cfg.domainbinding.hibernate` | 88% | 74% | ✅ | +| `org.grails.orm.hibernate.dirty` | 88% | 76% | ✅ | +| `org.grails.orm.hibernate.query` | 87% | 77% | ✅ | +| `org.grails.orm.hibernate.event.listener` | 84% | 59% | ✅ | +| `grails.orm` | 80% | 69% | ✅ | +| `org.grails.orm.hibernate.connections` | 78% | 59% | ⚠️ | +| `org.grails.orm.hibernate.cfg.domainbinding.secondpass` | 76% | 56% | ⚠️ | +| `org.grails.orm.hibernate.multitenancy` | 76% | 79% | ⚠️ | +| `org.grails.orm.hibernate` | 75% | 54% | ⚠️ | +| `org.grails.orm.hibernate.access` | 73% | 56% | ⚠️ | +| `org.grails.orm.hibernate.cfg` | 72% | 64% | ⚠️ | +| `org.grails.orm.hibernate.proxy` | 62% | 61% | ⚠️ | +| `org.grails.orm.hibernate.support` | 61% | 65% | ⚠️ | +| `org.grails.orm.hibernate.exceptions` | 11% | N/A | ℹ️ No functional code — 4 exception classes (constructors only); low coverage expected | +| **Overall** | **81%** | **68%** | ⚠️ | --- @@ -94,4 +109,4 @@ Full detail: [`GORM-QUERY-SAFETY-AUDIT.md`](GORM-QUERY-SAFETY-AUDIT.md) | 1.4 | Static compilation — core module | ✅ 94% | | 2.6 | GORM query safety audit | ✅ Done | | 4.1 | `methodMissing` elimination | ⚠️ 8.1+ scope | -| — | `transaction`/`datasource` test coverage | ❌ 0% | +| — | `transaction`/`datasource` test coverage | ❌ 0% (+ `exceptions` 11%) | diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/datasource/MultipleDataSourceSupport.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/datasource/MultipleDataSourceSupport.java deleted file mode 100644 index 816dd9bdec..0000000000 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/datasource/MultipleDataSourceSupport.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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.datasource; - -import java.util.List; -import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport; -import org.grails.datastore.mapping.model.PersistentEntity; - -/** - * Support methods for Multiple data source handling - * - * @author Graeme Rocher - * @since 5.0.2 - */ -public class MultipleDataSourceSupport { - /** - * If a domain class uses more than one datasource, we need to know which one to use when calling - * a method without a namespace qualifier. - * - * @param domainClass the domain class - * @return the default datasource name - */ - public static String getDefaultDataSource(PersistentEntity domainClass) { - return ConnectionSourcesSupport.getDefaultConnectionSourceName(domainClass); - } - - public static List<String> getDatasourceNames(PersistentEntity domainClass) { - return ConnectionSourcesSupport.getConnectionSourceNames(domainClass); - } - - public static boolean usesDatasource(PersistentEntity domainClass, String dataSourceName) { - return ConnectionSourcesSupport.usesConnectionSource(domainClass, dataSourceName); - } -} diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java deleted file mode 100644 index 6f4f46bfa1..0000000000 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * 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.transaction; - -import jakarta.transaction.*; -import javax.transaction.xa.XAResource; -import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.support.DefaultTransactionDefinition; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -/** - * Adapter for adding transaction controlling hooks for supporting Hibernate's - * org.hibernate.engine.transaction.Isolater class's interaction with transactions - * - * <p>This is required when there is no real JTA transaction manager in use and Spring's {@link - * TransactionAwareDataSourceProxy} is used. - * - * <p>Without this solution, using Hibernate's TableGenerator identity strategies will fail to - * support transactions. The id generator will commit the current transaction and break - * transactional behaviour. - * - * <p>The javadoc of Hibernate's {@code TableHiLoGenerator} states this. However this isn't - * mentioned in the javadocs of other TableGenerators. - * - * @author Lari Hotari - */ -public class HibernateJtaTransactionManagerAdapter implements TransactionManager { - PlatformTransactionManager springTransactionManager; - ThreadLocal<TransactionStatus> currentTransactionHolder = new ThreadLocal<>(); - - public HibernateJtaTransactionManagerAdapter( - PlatformTransactionManager springTransactionManager) { - this.springTransactionManager = springTransactionManager; - } - - @Override - public void begin() { - TransactionDefinition definition = - new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW); - currentTransactionHolder.set(springTransactionManager.getTransaction(definition)); - } - - @Override - public void commit() throws SecurityException, IllegalStateException { - springTransactionManager.commit(getAndRemoveStatus()); - } - - @Override - public void rollback() throws IllegalStateException, SecurityException { - springTransactionManager.rollback(getAndRemoveStatus()); - } - - @Override - public void setRollbackOnly() throws IllegalStateException { - currentTransactionHolder.get().setRollbackOnly(); - } - - protected TransactionStatus getAndRemoveStatus() { - TransactionStatus status = currentTransactionHolder.get(); - currentTransactionHolder.remove(); - return status; - } - - @Override - public int getStatus() { - TransactionStatus status = currentTransactionHolder.get(); - return convertToJtaStatus(status); - } - - protected static int convertToJtaStatus(TransactionStatus status) { - if (status != null) { - if (status.isCompleted()) { - return Status.STATUS_UNKNOWN; - } else if (status.isRollbackOnly()) { - return Status.STATUS_MARKED_ROLLBACK; - } else { - return Status.STATUS_ACTIVE; - } - } else { - return Status.STATUS_NO_TRANSACTION; - } - } - - @Override - public Transaction getTransaction() { - return new TransactionAdapter(springTransactionManager, currentTransactionHolder); - } - - @Override - public void resume(Transaction tobj) throws IllegalStateException { - TransactionAdapter transaction = (TransactionAdapter) tobj; - // commit the PROPAGATION_NOT_SUPPORTED transaction returned in suspend - springTransactionManager.commit(transaction.transactionStatus); - } - - @Override - public Transaction suspend() { - currentTransactionHolder.set( - springTransactionManager.getTransaction( - new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_NOT_SUPPORTED))); - return new TransactionAdapter(springTransactionManager, currentTransactionHolder); - } - - @Override - public void setTransactionTimeout(int seconds) {} - - private static class TransactionAdapter implements Transaction { - PlatformTransactionManager springTransactionManager; - TransactionStatus transactionStatus; - ThreadLocal<TransactionStatus> currentTransactionHolder; - - TransactionAdapter( - PlatformTransactionManager springTransactionManager, - ThreadLocal<TransactionStatus> currentTransactionHolder) { - this.springTransactionManager = springTransactionManager; - this.currentTransactionHolder = currentTransactionHolder; - this.transactionStatus = currentTransactionHolder.get(); - } - - @Override - public void commit() throws SecurityException, IllegalStateException { - springTransactionManager.commit(transactionStatus); - currentTransactionHolder.remove(); - } - - @Override - public boolean delistResource(XAResource xaRes, int flag) - throws IllegalStateException, SystemException { - return false; - } - - @Override - public boolean enlistResource(XAResource xaRes) - throws RollbackException, IllegalStateException, SystemException { - return false; - } - - @Override - public int getStatus() throws SystemException { - return convertToJtaStatus(transactionStatus); - } - - @Override - public void registerSynchronization(final Synchronization sync) - throws RollbackException, IllegalStateException, SystemException { - TransactionSynchronizationManager.registerSynchronization( - new TransactionSynchronization() { - @Override - public void beforeCompletion() { - sync.beforeCompletion(); - } - - @Override - public void afterCompletion(int status) { - int jtaStatus; - if (status == TransactionSynchronization.STATUS_COMMITTED) { - jtaStatus = Status.STATUS_COMMITTED; - } else if (status == TransactionSynchronization.STATUS_ROLLED_BACK) { - jtaStatus = Status.STATUS_ROLLEDBACK; - } else { - jtaStatus = Status.STATUS_UNKNOWN; - } - sync.afterCompletion(jtaStatus); - } - - public void suspend() {} - - public void resume() {} - - public void flush() {} - - public void beforeCommit(boolean readOnly) {} - - public void afterCommit() {} - }); - } - - @Override - public void rollback() throws IllegalStateException, SystemException { - springTransactionManager.rollback(transactionStatus); - currentTransactionHolder.remove(); - } - - @Override - public void setRollbackOnly() throws IllegalStateException, SystemException { - transactionStatus.setRollbackOnly(); - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } else if (obj == null) { - return false; - } else if (obj.getClass() == TransactionAdapter.class) { - TransactionAdapter other = (TransactionAdapter) obj; - if (other.transactionStatus == this.transactionStatus) { - return true; - } else if (other.transactionStatus != null) { - return other.transactionStatus.equals(this.transactionStatus); - } else { - return false; - } - } else { - return false; - } - } - - @Override - public int hashCode() { - return transactionStatus != null - ? transactionStatus.hashCode() - : System.identityHashCode(this); - } - } -} diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/transaction/PlatformTransactionManagerProxy.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/transaction/PlatformTransactionManagerProxy.java deleted file mode 100644 index 1b9114e865..0000000000 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/transaction/PlatformTransactionManagerProxy.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.transaction; - -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionException; -import org.springframework.transaction.TransactionStatus; - -/** - * A proxy for the {@link org.springframework.transaction.PlatformTransactionManager} instance - * - * @author Graeme Rocher - * @author Burt Beckwith - */ -public class PlatformTransactionManagerProxy implements PlatformTransactionManager { - private PlatformTransactionManager targetTransactionManager; - - public PlatformTransactionManagerProxy() {} - - public TransactionStatus getTransaction(TransactionDefinition definition) - throws TransactionException { - return targetTransactionManager.getTransaction(definition); - } - - public void commit(TransactionStatus status) throws TransactionException { - targetTransactionManager.commit(status); - } - - public void rollback(TransactionStatus status) throws TransactionException { - targetTransactionManager.rollback(status); - } - - public PlatformTransactionManager getTargetTransactionManager() { - return targetTransactionManager; - } - - public void setTargetTransactionManager(PlatformTransactionManager targetTransactionManager) { - this.targetTransactionManager = targetTransactionManager; - } -}
