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 20a717512ecabbc6aab6fc01b486ff194291aa37 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Sun Mar 1 12:35:19 2026 -0600 fix: restore 4-space indentation in hibernate7 grails-plugin support classes The Spotless Apply commit reformatted these Java files using Google Java Format (2-space indentation), which violated the project's Checkstyle rules that require 4-space indentation. Restore the 5 affected files to 4-space indentation and fix the off-by-one space in HibernatePersistenceContextInterceptor.java line 107. Co-authored-by: Copilot <[email protected]> --- ...urceAggregatePersistenceContextInterceptor.java | 137 ++++--- .../AggregatePersistenceContextInterceptor.java | 31 +- .../GrailsOpenSessionInViewInterceptor.java | 83 ++--- .../HibernatePersistenceContextInterceptor.java | 395 +++++++++++---------- ...nFactoryAwarePersistenceContextInterceptor.java | 11 +- 5 files changed, 326 insertions(+), 331 deletions(-) diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java index 6aa3f446b7..8fda4e23b4 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java @@ -18,107 +18,102 @@ */ package org.grails.plugin.hibernate.support; -import grails.persistence.support.PersistenceContextInterceptor; import java.util.ArrayList; import java.util.List; + +import org.hibernate.SessionFactory; + +import grails.persistence.support.PersistenceContextInterceptor; import org.grails.datastore.mapping.core.connections.ConnectionSource; import org.grails.datastore.mapping.core.connections.ConnectionSources; import org.grails.orm.hibernate.AbstractHibernateDatastore; import org.grails.orm.hibernate.connections.HibernateConnectionSourceSettings; -import org.hibernate.SessionFactory; /** - * Abstract implementation of the {@link grails.persistence.support.PersistenceContextInterceptor} - * interface that supports multiple data sources + * Abstract implementation of the {@link grails.persistence.support.PersistenceContextInterceptor} interface that supports multiple data sources * * @author Graeme Rocher * @since 2.0.7 */ -public abstract class AbstractMultipleDataSourceAggregatePersistenceContextInterceptor - implements PersistenceContextInterceptor { - - protected final List<PersistenceContextInterceptor> interceptors = new ArrayList<>(); - protected final AbstractHibernateDatastore hibernateDatastore; - - public AbstractMultipleDataSourceAggregatePersistenceContextInterceptor( - AbstractHibernateDatastore hibernateDatastore) { - this.hibernateDatastore = hibernateDatastore; - ConnectionSources<SessionFactory, HibernateConnectionSourceSettings> connectionSources = - hibernateDatastore.getConnectionSources(); - Iterable<ConnectionSource<SessionFactory, HibernateConnectionSourceSettings>> - allConnectionSources = connectionSources.getAllConnectionSources(); - for (ConnectionSource<SessionFactory, HibernateConnectionSourceSettings> connectionSource : - allConnectionSources) { - SessionFactoryAwarePersistenceContextInterceptor interceptor = - createPersistenceContextInterceptor(connectionSource.getName()); - this.interceptors.add(interceptor); +public abstract class AbstractMultipleDataSourceAggregatePersistenceContextInterceptor implements PersistenceContextInterceptor { + + protected final List<PersistenceContextInterceptor> interceptors = new ArrayList<>(); + protected final AbstractHibernateDatastore hibernateDatastore; + + public AbstractMultipleDataSourceAggregatePersistenceContextInterceptor(AbstractHibernateDatastore hibernateDatastore) { + this.hibernateDatastore = hibernateDatastore; + ConnectionSources<SessionFactory, HibernateConnectionSourceSettings> connectionSources = hibernateDatastore.getConnectionSources(); + Iterable<ConnectionSource<SessionFactory, HibernateConnectionSourceSettings>> allConnectionSources = connectionSources.getAllConnectionSources(); + for (ConnectionSource<SessionFactory, HibernateConnectionSourceSettings> connectionSource : allConnectionSources) { + SessionFactoryAwarePersistenceContextInterceptor interceptor = createPersistenceContextInterceptor(connectionSource.getName()); + this.interceptors.add(interceptor); + } } - } - - public boolean isOpen() { - for (PersistenceContextInterceptor interceptor : interceptors) { - if (interceptor.isOpen()) { - // true at least one is true - return true; - } + + public boolean isOpen() { + for (PersistenceContextInterceptor interceptor : interceptors) { + if (interceptor.isOpen()) { + // true at least one is true + return true; + } + } + return false; } - return false; - } - public void reconnect() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.reconnect(); + public void reconnect() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.reconnect(); + } } - } - public void destroy() { - for (PersistenceContextInterceptor interceptor : interceptors) { - try { - if (interceptor.isOpen()) { - interceptor.destroy(); + public void destroy() { + for (PersistenceContextInterceptor interceptor : interceptors) { + try { + if (interceptor.isOpen()) { + interceptor.destroy(); + } + } catch (Exception e) { + // ignore exception + } } - } catch (Exception e) { - // ignore exception - } } - } - public void clear() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.clear(); + public void clear() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.clear(); + } } - } - public void disconnect() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.disconnect(); + public void disconnect() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.disconnect(); + } } - } - public void flush() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.flush(); + public void flush() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.flush(); + } } - } - public void init() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.init(); + public void init() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.init(); + } } - } - public void setReadOnly() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.setReadOnly(); + public void setReadOnly() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.setReadOnly(); + } } - } - public void setReadWrite() { - for (PersistenceContextInterceptor interceptor : interceptors) { - interceptor.setReadWrite(); + public void setReadWrite() { + for (PersistenceContextInterceptor interceptor : interceptors) { + interceptor.setReadWrite(); + } } - } - protected abstract SessionFactoryAwarePersistenceContextInterceptor - createPersistenceContextInterceptor(String dataSourceName); + protected abstract SessionFactoryAwarePersistenceContextInterceptor createPersistenceContextInterceptor(String dataSourceName); + } diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AggregatePersistenceContextInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AggregatePersistenceContextInterceptor.java index 49a336dbcc..060681f57d 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AggregatePersistenceContextInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AggregatePersistenceContextInterceptor.java @@ -16,32 +16,29 @@ * specific language governing permissions and limitations * under the License. */ + package org.grails.plugin.hibernate.support; import org.grails.orm.hibernate.AbstractHibernateDatastore; /** - * Concrete implementation of the {@link - * AbstractMultipleDataSourceAggregatePersistenceContextInterceptor} class for Hibernate 4 + * Concrete implementation of the {@link AbstractMultipleDataSourceAggregatePersistenceContextInterceptor} class for Hibernate 4 * * @author Graeme Rocher * @author Burt Beckwith */ -public class AggregatePersistenceContextInterceptor - extends AbstractMultipleDataSourceAggregatePersistenceContextInterceptor { +public class AggregatePersistenceContextInterceptor extends AbstractMultipleDataSourceAggregatePersistenceContextInterceptor { + + public AggregatePersistenceContextInterceptor(AbstractHibernateDatastore hibernateDatastore) { + super(hibernateDatastore); + } - public AggregatePersistenceContextInterceptor(AbstractHibernateDatastore hibernateDatastore) { - super(hibernateDatastore); - } + @Override + protected SessionFactoryAwarePersistenceContextInterceptor createPersistenceContextInterceptor(String dataSourceName) { + HibernatePersistenceContextInterceptor interceptor = new HibernatePersistenceContextInterceptor(dataSourceName); + AbstractHibernateDatastore datastoreForConnection = hibernateDatastore.getDatastoreForConnection(dataSourceName); + interceptor.setHibernateDatastore(datastoreForConnection); + return interceptor; + } - @Override - protected SessionFactoryAwarePersistenceContextInterceptor createPersistenceContextInterceptor( - String dataSourceName) { - HibernatePersistenceContextInterceptor interceptor = - new HibernatePersistenceContextInterceptor(dataSourceName); - AbstractHibernateDatastore datastoreForConnection = - hibernateDatastore.getDatastoreForConnection(dataSourceName); - interceptor.setHibernateDatastore(datastoreForConnection); - return interceptor; - } } diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java index 46502d0671..62bc0fdf0d 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java @@ -18,9 +18,9 @@ */ package org.grails.plugin.hibernate.support; -import org.grails.orm.hibernate.AbstractHibernateDatastore; import org.hibernate.FlushMode; import org.hibernate.Session; + import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.orm.hibernate5.SessionHolder; @@ -29,57 +29,60 @@ import org.springframework.transaction.support.TransactionSynchronizationManager import org.springframework.ui.ModelMap; import org.springframework.web.context.request.WebRequest; +import org.grails.orm.hibernate.AbstractHibernateDatastore; + /** - * Extends the default spring OSIV and doesn't flush the session if it has been set to MANUAL on the - * session itself. + * Extends the default spring OSIV and doesn't flush the session if it has been set + * to MANUAL on the session itself. * * @author Graeme Rocher * @since 0.5 */ public class GrailsOpenSessionInViewInterceptor extends OpenSessionInViewInterceptor { - protected FlushMode hibernateFlushMode = FlushMode.MANUAL; + protected FlushMode hibernateFlushMode = FlushMode.MANUAL; - @Override - protected Session openSession() throws DataAccessResourceFailureException { - Session session = super.openSession(); - applyFlushMode(session); - return session; - } + @Override + protected Session openSession() throws DataAccessResourceFailureException { + Session session = super.openSession(); + applyFlushMode(session); + return session; + } - protected void applyFlushMode(Session session) { - session.setHibernateFlushMode(hibernateFlushMode); - } + protected void applyFlushMode(Session session) { + session.setHibernateFlushMode(hibernateFlushMode); + } - @Override - public void postHandle(WebRequest request, ModelMap model) throws DataAccessException { - SessionHolder sessionHolder = - (SessionHolder) TransactionSynchronizationManager.getResource(getSessionFactory()); - Session session = sessionHolder != null ? sessionHolder.getSession() : null; - try { - super.postHandle(request, model); - FlushMode flushMode = session != null ? session.getHibernateFlushMode() : null; - boolean isNotManual = flushMode != FlushMode.MANUAL && flushMode != FlushMode.COMMIT; - if (session != null && isNotManual) { - if (logger.isDebugEnabled()) { - logger.debug("Eagerly flushing Hibernate session"); + @Override + public void postHandle(WebRequest request, ModelMap model) throws DataAccessException { + SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(getSessionFactory()); + Session session = sessionHolder != null ? sessionHolder.getSession() : null; + try { + super.postHandle(request, model); + FlushMode flushMode = session != null ? session.getHibernateFlushMode() : null; + boolean isNotManual = flushMode != FlushMode.MANUAL && flushMode != FlushMode.COMMIT; + if (session != null && isNotManual) { + if (logger.isDebugEnabled()) { + logger.debug("Eagerly flushing Hibernate session"); + } + session.flush(); + } + } + finally { + if (session != null) { + session.setHibernateFlushMode(FlushMode.MANUAL); + } } - session.flush(); - } - } finally { - if (session != null) { - session.setHibernateFlushMode(FlushMode.MANUAL); - } } - } - public void setHibernateDatastore(AbstractHibernateDatastore hibernateDatastore) { - String defaultFlushModeName = hibernateDatastore.getDefaultFlushModeName(); - if (hibernateDatastore.isOsivReadOnly()) { - this.hibernateFlushMode = FlushMode.MANUAL; - } else { - this.hibernateFlushMode = FlushMode.valueOf(defaultFlushModeName); + public void setHibernateDatastore(AbstractHibernateDatastore hibernateDatastore) { + String defaultFlushModeName = hibernateDatastore.getDefaultFlushModeName(); + if (hibernateDatastore.isOsivReadOnly()) { + this.hibernateFlushMode = FlushMode.MANUAL; + } + else { + this.hibernateFlushMode = FlushMode.valueOf(defaultFlushModeName); + } + setSessionFactory(hibernateDatastore.getSessionFactory()); } - setSessionFactory(hibernateDatastore.getSessionFactory()); - } } diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java index d822c404be..bd8b2f41e5 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java @@ -16,227 +16,228 @@ * specific language governing permissions and limitations * under the License. */ + package org.grails.plugin.hibernate.support; -import grails.persistence.support.PersistenceContextInterceptor; -import grails.validation.DeferredBindingActions; import java.sql.Connection; import java.util.Deque; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentLinkedDeque; -import org.grails.core.lifecycle.ShutdownOperations; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.orm.hibernate.AbstractHibernateDatastore; -import org.grails.orm.hibernate.support.HibernateRuntimeUtils; + import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.orm.hibernate5.SessionFactoryUtils; import org.springframework.orm.hibernate5.SessionHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; +import grails.persistence.support.PersistenceContextInterceptor; +import grails.validation.DeferredBindingActions; +import org.grails.core.lifecycle.ShutdownOperations; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.orm.hibernate.AbstractHibernateDatastore; +import org.grails.orm.hibernate.support.HibernateRuntimeUtils; + /** * @author Graeme Rocher * @since 0.4 */ -public class HibernatePersistenceContextInterceptor - implements PersistenceContextInterceptor, SessionFactoryAwarePersistenceContextInterceptor { +public class HibernatePersistenceContextInterceptor implements PersistenceContextInterceptor, SessionFactoryAwarePersistenceContextInterceptor { - private static final Logger LOG = - LoggerFactory.getLogger(HibernatePersistenceContextInterceptor.class); - private AbstractHibernateDatastore hibernateDatastore; + private static final Logger LOG = LoggerFactory.getLogger(HibernatePersistenceContextInterceptor.class); + private AbstractHibernateDatastore hibernateDatastore; - private static ThreadLocal<Map<String, Boolean>> participate = - ThreadLocal.withInitial(HashMap::new); + private static ThreadLocal<Map<String, Boolean>> participate = ThreadLocal.withInitial(HashMap::new); - private static ThreadLocal<Map<String, Integer>> nestingCount = - ThreadLocal.withInitial(HashMap::new); + private static ThreadLocal<Map<String, Integer>> nestingCount = ThreadLocal.withInitial(HashMap::new); - private String dataSourceName; + private String dataSourceName; - static { - ShutdownOperations.addOperation( - () -> { - participate.remove(); - nestingCount.remove(); + static { + ShutdownOperations.addOperation(() -> { + participate.remove(); + nestingCount.remove(); }); - } - - private Deque<Connection> disconnected = new ConcurrentLinkedDeque<>(); - private final boolean transactionRequired; - - public HibernatePersistenceContextInterceptor() { - this(ConnectionSource.DEFAULT); - } - - /** - * @param dataSourceName a name of dataSource - */ - public HibernatePersistenceContextInterceptor(String dataSourceName) { - this.dataSourceName = dataSourceName; - this.transactionRequired = true; - } - - /* (non-Javadoc) - * @see org.apache.groovy.grails.support.PersistenceContextInterceptor#destroy() - */ - public void destroy() { - DeferredBindingActions.clear(); - if (!disconnected.isEmpty()) { - disconnected.pop(); - } - if (getSessionFactory() == null || decNestingCount() > 0 || getParticipate()) { - return; - } - - // single session mode - SessionHolder holder = - (SessionHolder) TransactionSynchronizationManager.unbindResource(getSessionFactory()); - LOG.debug("Closing single Hibernate session in GrailsDispatcherServlet"); - try { - disconnected.clear(); - SessionFactoryUtils.closeSession(holder.getSession()); - } catch (RuntimeException ex) { - LOG.error("Unexpected exception on closing Hibernate Session", ex); - } - } - - public void disconnect() { - throw new UnsupportedOperationException("disconnect is not supported by Hibernate 6"); - } - - public void reconnect() { - throw new UnsupportedOperationException("reconnect is not supported by Hibernate 6"); - } - - public void flush() { - if (getSessionFactory() == null) return; - if (!getParticipate()) { - if (!transactionRequired) { - getSession().flush(); - } else if (TransactionSynchronizationManager.isSynchronizationActive()) { - getSession().flush(); - } - } - } - - public void clear() { - if (getSessionFactory() == null) return; - getSession().clear(); - } - - public void setReadOnly() { - if (getSessionFactory() == null) return; - getSession().setHibernateFlushMode(FlushMode.MANUAL); - } - - public void setReadWrite() { - if (getSessionFactory() == null) return; - getSession().setHibernateFlushMode(FlushMode.AUTO); - } - - public boolean isOpen() { - if (getSessionFactory() == null) return false; - try { - return getSession(false).isOpen(); - } catch (Exception e) { - return false; - } - } - - /* (non-Javadoc) - * @see org.apache.groovy.grails.support.PersistenceContextInterceptor#init() - */ - public void init() { - if (incNestingCount() > 1) { - return; - } - SessionFactory sf = getSessionFactory(); - if (sf == null) { - return; - } - if (TransactionSynchronizationManager.hasResource(sf)) { - // Do not modify the Session: just set the participate flag. - setParticipate(true); - } else { - setParticipate(false); - LOG.debug("Opening single Hibernate session in HibernatePersistenceContextInterceptor"); - Session session = getSession(); - HibernateRuntimeUtils.enableDynamicFilterEnablerIfPresent(sf, session); - TransactionSynchronizationManager.bindResource(sf, new SessionHolder(session)); - } - } - - private Session getSession() { - return getSession(true); - } - - private Session getSession(boolean allowCreate) { - - Object value = TransactionSynchronizationManager.getResource(getSessionFactory()); - if (value instanceof Session) { - return (Session) value; - } - - if (value instanceof SessionHolder) { - SessionHolder sessionHolder = (SessionHolder) value; - return sessionHolder.getSession(); - } - - if (allowCreate && hibernateDatastore != null) { - return hibernateDatastore.openSession(); - } - - throw new IllegalStateException( - "No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here"); - } - - /** - * @return the sessionFactory - */ - public SessionFactory getSessionFactory() { - return hibernateDatastore.getSessionFactory(); - } - - public void setHibernateDatastore(AbstractHibernateDatastore hibernateDatastore) { - this.hibernateDatastore = hibernateDatastore; - } - - @Override - public void setSessionFactory(SessionFactory sessionFactory) { - // ignore - } - - private int incNestingCount() { - Map<String, Integer> map = nestingCount.get(); - Integer current = map.get(dataSourceName); - int value = (current != null) ? current + 1 : 1; - map.put(dataSourceName, value); - return value; - } - - private int decNestingCount() { - Map<String, Integer> map = nestingCount.get(); - Integer current = map.get(dataSourceName); - int value = (current != null) ? current - 1 : 0; - if (value < 0) { - value = 0; - } - map.put(dataSourceName, value); - return value; - } - - private void setParticipate(boolean flag) { - Map<String, Boolean> map = participate.get(); - map.put(dataSourceName, flag); - } - - private boolean getParticipate() { - Map<String, Boolean> map = participate.get(); - Boolean ret = map.get(dataSourceName); - return (ret != null) ? ret : false; - } + } + + private Deque<Connection> disconnected = new ConcurrentLinkedDeque<>(); + private final boolean transactionRequired; + + public HibernatePersistenceContextInterceptor() { + this(ConnectionSource.DEFAULT); + } + + /** + * @param dataSourceName a name of dataSource + */ + public HibernatePersistenceContextInterceptor(String dataSourceName) { + this.dataSourceName = dataSourceName; + this.transactionRequired = true; + } + + /* (non-Javadoc) + * @see org.apache.groovy.grails.support.PersistenceContextInterceptor#destroy() + */ + public void destroy() { + DeferredBindingActions.clear(); + if (!disconnected.isEmpty()) { + disconnected.pop(); + } + if (getSessionFactory() == null || decNestingCount() > 0 || getParticipate()) { + return; + } + + // single session mode + SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.unbindResource(getSessionFactory()); + LOG.debug("Closing single Hibernate session in GrailsDispatcherServlet"); + try { + disconnected.clear(); + SessionFactoryUtils.closeSession(holder.getSession()); + } + catch (RuntimeException ex) { + LOG.error("Unexpected exception on closing Hibernate Session", ex); + } + } + + public void disconnect() { + throw new UnsupportedOperationException("disconnect is not supported by Hibernate 6"); + } + + public void reconnect() { + throw new UnsupportedOperationException("reconnect is not supported by Hibernate 6"); + } + + public void flush() { + if (getSessionFactory() == null) return; + if (!getParticipate()) { + if (!transactionRequired) { + getSession().flush(); + } + else if (TransactionSynchronizationManager.isSynchronizationActive()) { + getSession().flush(); + } + } + } + + public void clear() { + if (getSessionFactory() == null) return; + getSession().clear(); + } + + public void setReadOnly() { + if (getSessionFactory() == null) return; + getSession().setHibernateFlushMode(FlushMode.MANUAL); + } + + public void setReadWrite() { + if (getSessionFactory() == null) return; + getSession().setHibernateFlushMode(FlushMode.AUTO); + } + + public boolean isOpen() { + if (getSessionFactory() == null) return false; + try { + return getSession(false).isOpen(); + } + catch (Exception e) { + return false; + } + } + + /* (non-Javadoc) + * @see org.apache.groovy.grails.support.PersistenceContextInterceptor#init() + */ + public void init() { + if (incNestingCount() > 1) { + return; + } + SessionFactory sf = getSessionFactory(); + if (sf == null) { + return; + } + if (TransactionSynchronizationManager.hasResource(sf)) { + // Do not modify the Session: just set the participate flag. + setParticipate(true); + } + else { + setParticipate(false); + LOG.debug("Opening single Hibernate session in HibernatePersistenceContextInterceptor"); + Session session = getSession(); + HibernateRuntimeUtils.enableDynamicFilterEnablerIfPresent(sf, session); + TransactionSynchronizationManager.bindResource(sf, new SessionHolder(session)); + } + } + + private Session getSession() { + return getSession(true); + } + + private Session getSession(boolean allowCreate) { + + Object value = TransactionSynchronizationManager.getResource(getSessionFactory()); + if (value instanceof Session) { + return (Session) value; + } + + if (value instanceof SessionHolder) { + SessionHolder sessionHolder = (SessionHolder) value; + return sessionHolder.getSession(); + } + + if (allowCreate && hibernateDatastore != null) { + return hibernateDatastore.openSession(); + } + + throw new IllegalStateException("No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here"); + } + + /** + * @return the sessionFactory + */ + public SessionFactory getSessionFactory() { + return hibernateDatastore.getSessionFactory(); + } + + public void setHibernateDatastore(AbstractHibernateDatastore hibernateDatastore) { + this.hibernateDatastore = hibernateDatastore; + } + + @Override + public void setSessionFactory(SessionFactory sessionFactory) { + // ignore + } + + private int incNestingCount() { + Map<String, Integer> map = nestingCount.get(); + Integer current = map.get(dataSourceName); + int value = (current != null) ? current + 1 : 1; + map.put(dataSourceName, value); + return value; + } + + private int decNestingCount() { + Map<String, Integer> map = nestingCount.get(); + Integer current = map.get(dataSourceName); + int value = (current != null) ? current - 1 : 0; + if (value < 0) { + value = 0; + } + map.put(dataSourceName, value); + return value; + } + + private void setParticipate(boolean flag) { + Map<String, Boolean> map = participate.get(); + map.put(dataSourceName, flag); + } + + private boolean getParticipate() { + Map<String, Boolean> map = participate.get(); + Boolean ret = map.get(dataSourceName); + return (ret != null) ? ret : false; + } } diff --git a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java index 762d70c095..41ec12ebf9 100644 --- a/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java +++ b/grails-data-hibernate7/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java @@ -18,18 +18,17 @@ */ package org.grails.plugin.hibernate.support; -import grails.persistence.support.PersistenceContextInterceptor; import org.hibernate.SessionFactory; +import grails.persistence.support.PersistenceContextInterceptor; + /** - * Interface for {@link grails.persistence.support.PersistenceContextInterceptor} instances that are - * aware of the {@link org.hibernate.SessionFactory} + * Interface for {@link grails.persistence.support.PersistenceContextInterceptor} instances that are aware of the {@link org.hibernate.SessionFactory} * * @author Graeme Rocher * @since 2.0.7 */ -public interface SessionFactoryAwarePersistenceContextInterceptor - extends PersistenceContextInterceptor { +public interface SessionFactoryAwarePersistenceContextInterceptor extends PersistenceContextInterceptor { - void setSessionFactory(SessionFactory sessionFactory); + void setSessionFactory(SessionFactory sessionFactory); }
