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);
 }

Reply via email to