package org.gmod.schema.cfg;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Interceptor;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;
import org.hibernate.classic.Session;
import org.hibernate.engine.FilterDefinition;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.metadata.CollectionMetadata;
import org.hibernate.stat.Statistics;
import java.io.Serializable;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.naming.NamingException;
import javax.naming.Reference;
/**
* This class wraps a Hibernate SessionFactory object, and delegates to it.
* When a new session is created, the specified filters will be enabled for
* that session. This makes it possible to have filters that are enabled by
* default. Currently only unparameterised filters are supported: there is no
* way to set filter parameters.
* <p>
* Although this class could be used on its own, it's currently used only
* by the Spring class {@link ChadoSessionFactoryBean}, which wraps the
* session factory it returns in a <code>FilteringSessionFactory</code>,
* configured with whatever default filters were defined in the configuration.
*
* @author rh11
*
*/
public class FilteringSessionFactory implements SessionFactory {
private static final Logger logger = Logger.getLogger(FilteringSessionFactory.class);
private SessionFactory underlyingSessionFactory;
private Set<String> filters = new HashSet<String>();
/**
* Create a new <code>FilteringSessionFactory</code> that wraps
* the supplied underlying session factory.
* @param underlyingSessionFactory the session factory to wrap
*/
public FilteringSessionFactory(SessionFactory underlyingSessionFactory) {
this.underlyingSessionFactory = underlyingSessionFactory;
}
/**
* Add a filter to the list of filters that are enabled by default.
* @param filterName the name of the filter to add
*/
public void addFilter(String filterName) {
filters.add(filterName);
}
private Session enableFilters(Session session) {
for (String filterName: filters) {
logger.debug(String.format("Enabling filter '%s' on session", filterName));
session.enableFilter(filterName);
}
return session;
}
/* openSession methods */
public Session openSession() throws HibernateException {
return enableFilters(underlyingSessionFactory.openSession());
}
public Session openSession(Connection connection, Interceptor interceptor) {
return enableFilters(underlyingSessionFactory.openSession(connection, interceptor));
}
public Session openSession(Connection connection) {
return enableFilters(underlyingSessionFactory.openSession(connection));
}
public Session openSession(Interceptor interceptor) throws HibernateException {
return enableFilters(underlyingSessionFactory.openSession(interceptor));
}
/* Delegated methods */
public void close() throws HibernateException {
underlyingSessionFactory.close();
}
@SuppressWarnings("unchecked")
public void evict(Class persistentClass, Serializable id) throws HibernateException {
underlyingSessionFactory.evict(persistentClass, id);
}
@SuppressWarnings("unchecked")
public void evict(Class persistentClass) throws HibernateException {
underlyingSessionFactory.evict(persistentClass);
}
public void evictCollection(String roleName, Serializable id) throws HibernateException {
underlyingSessionFactory.evictCollection(roleName, id);
}
public void evictCollection(String roleName) throws HibernateException {
underlyingSessionFactory.evictCollection(roleName);
}
public void evictEntity(String entityName, Serializable id) throws HibernateException {
underlyingSessionFactory.evictEntity(entityName, id);
}
public void evictEntity(String entityName) throws HibernateException {
underlyingSessionFactory.evictEntity(entityName);
}
public void evictQueries() throws HibernateException {
underlyingSessionFactory.evictQueries();
}
public void evictQueries(String cacheRegion) throws HibernateException {
underlyingSessionFactory.evictQueries(cacheRegion);
}
@SuppressWarnings("unchecked")
public Map getAllClassMetadata() throws HibernateException {
return underlyingSessionFactory.getAllClassMetadata();
}
@SuppressWarnings("unchecked")
public Map getAllCollectionMetadata() throws HibernateException {
return underlyingSessionFactory.getAllCollectionMetadata();
}
@SuppressWarnings("unchecked")
public ClassMetadata getClassMetadata(Class persistentClass) throws HibernateException {
return underlyingSessionFactory.getClassMetadata(persistentClass);
}
public ClassMetadata getClassMetadata(String entityName) throws HibernateException {
return underlyingSessionFactory.getClassMetadata(entityName);
}
public CollectionMetadata getCollectionMetadata(String roleName) throws HibernateException {
return underlyingSessionFactory.getCollectionMetadata(roleName);
}
public Session getCurrentSession() throws HibernateException {
return underlyingSessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
public Set getDefinedFilterNames() {
return underlyingSessionFactory.getDefinedFilterNames();
}
public FilterDefinition getFilterDefinition(String filterName) throws HibernateException {
return underlyingSessionFactory.getFilterDefinition(filterName);
}
public Reference getReference() throws NamingException {
return underlyingSessionFactory.getReference();
}
public Statistics getStatistics() {
return underlyingSessionFactory.getStatistics();
}
public boolean isClosed() {
return underlyingSessionFactory.isClosed();
}
public StatelessSession openStatelessSession() {
return underlyingSessionFactory.openStatelessSession();
}
public StatelessSession openStatelessSession(Connection connection) {
return underlyingSessionFactory.openStatelessSession(connection);
}
}