/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo Framework
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.model.internal.sessionfactory;
import java.io.Serializable;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.naming.NamingException;
import javax.naming.Reference;
import javax.transaction.TransactionManager;
import org.hibernate.Cache;
import org.hibernate.ConnectionReleaseMode;
import org.hibernate.Interceptor;
import org.hibernate.SessionFactory;
import org.hibernate.SessionFactoryObserver;
import org.hibernate.StatelessSession;
import org.hibernate.TypeHelper;
import org.hibernate.cache.QueryCache;
import org.hibernate.cache.Region;
import org.hibernate.cache.UpdateTimestampsCache;
import org.hibernate.cfg.Settings;
import org.hibernate.classic.Session;
import org.hibernate.connection.ConnectionProvider;
import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.function.SQLFunctionRegistry;
import org.hibernate.engine.FilterDefinition;
import org.hibernate.engine.NamedQueryDefinition;
import org.hibernate.engine.NamedSQLQueryDefinition;
import org.hibernate.engine.ResultSetMappingDefinition;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.engine.profile.FetchProfile;
import org.hibernate.engine.query.QueryPlanCache;
import org.hibernate.exception.SQLExceptionConverter;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.metadata.CollectionMetadata;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.proxy.EntityNotFoundDelegate;
import org.hibernate.stat.Statistics;
import org.hibernate.stat.StatisticsImplementor;
import org.hibernate.type.Type;
import org.hibernate.type.TypeResolver;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.core.InfrastructureProxy;
public class DynamicSessionFactory implements SessionFactory, SessionFactoryImplementor, InfrastructureProxy {
private static final long serialVersionUID = -7254335636932770807L;
private final FactoryBean<SessionFactory> sessionFactoryBean;
private volatile SessionFactory sessionFactory;
public DynamicSessionFactory(final FactoryBean<SessionFactory> sessionFactoryBean) {
this.sessionFactoryBean = sessionFactoryBean;
}
private SessionFactory getSessionFactory(final boolean allowCreation) {
SessionFactory result = sessionFactory;
if (result == null) {
synchronized (this) {
result = sessionFactory;
if (result == null) {
if (!allowCreation) {
throw new IllegalStateException("DynamicSessionFactory is not ready to use");
}
try {
result = sessionFactory = sessionFactoryBean.getObject();
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
}
}
return result;
}
@Override
public Reference getReference() throws NamingException {
return getSessionFactory(true).getReference();
}
@Override
public Session openSession() {
return getSessionFactory(true).openSession();
}
@Override
public Session openSession(final Interceptor interceptor) {
return getSessionFactory(true).openSession(interceptor);
}
@Override
public Session openSession(final Connection connection) {
return getSessionFactory(true).openSession(connection);
}
@Override
public Session openSession(final Connection connection, final Interceptor interceptor) {
return getSessionFactory(true).openSession(connection, interceptor);
}
@Override
public Session getCurrentSession() {
return getSessionFactory(true).getCurrentSession();
}
@Override
public StatelessSession openStatelessSession() {
return getSessionFactory(true).openStatelessSession();
}
@Override
public StatelessSession openStatelessSession(final Connection connection) {
return getSessionFactory(true).openStatelessSession(connection);
}
@Override
@SuppressWarnings("rawtypes")
public ClassMetadata getClassMetadata(final Class entityClass) {
return getSessionFactory(true).getClassMetadata(entityClass);
}
@Override
public ClassMetadata getClassMetadata(final String entityName) {
return getSessionFactory(true).getClassMetadata(entityName);
}
@Override
public CollectionMetadata getCollectionMetadata(final String roleName) {
return getSessionFactory(true).getCollectionMetadata(roleName);
}
@Override
public Map<String, ClassMetadata> getAllClassMetadata() {
return getSessionFactory(true).getAllClassMetadata();
}
@Override
@SuppressWarnings("rawtypes")
public Map getAllCollectionMetadata() {
return getSessionFactory(true).getAllCollectionMetadata();
}
@Override
public Statistics getStatistics() {
return getSessionFactory(true).getStatistics();
}
@Override
public void close() {
getSessionFactory(true).close();
}
@Override
public boolean isClosed() {
return getSessionFactory(true).isClosed();
}
@Override
public Cache getCache() {
return getSessionFactory(true).getCache();
}
@Override
@SuppressWarnings({ "deprecation", "rawtypes" })
public void evict(final Class persistentClass) {
getSessionFactory(true).evict(persistentClass);
}
@Override
@SuppressWarnings({ "deprecation", "rawtypes" })
public void evict(final Class persistentClass, final Serializable id) {
getSessionFactory(true).evict(persistentClass, id);
}
@Override
@SuppressWarnings("deprecation")
public void evictEntity(final String entityName) {
getSessionFactory(true).evictEntity(entityName);
}
@Override
@SuppressWarnings("deprecation")
public void evictEntity(final String entityName, final Serializable id) {
getSessionFactory(true).evictEntity(entityName, id);
}
@Override
@SuppressWarnings("deprecation")
public void evictCollection(final String roleName) {
getSessionFactory(true).evictCollection(roleName);
}
@Override
@SuppressWarnings("deprecation")
public void evictCollection(final String roleName, final Serializable id) {
getSessionFactory(true).evictCollection(roleName, id);
}
@Override
@SuppressWarnings("deprecation")
public void evictQueries(final String cacheRegion) {
getSessionFactory(true).evictQueries(cacheRegion);
}
@Override
@SuppressWarnings("deprecation")
public void evictQueries() {
getSessionFactory(true).evictQueries();
}
@Override
@SuppressWarnings("rawtypes")
public Set getDefinedFilterNames() {
return getSessionFactory(true).getDefinedFilterNames();
}
@Override
public FilterDefinition getFilterDefinition(final String filterName) {
return getSessionFactory(true).getFilterDefinition(filterName);
}
@Override
public boolean containsFetchProfileDefinition(final String name) {
return getSessionFactory(true).containsFetchProfileDefinition(name);
}
@Override
public TypeHelper getTypeHelper() {
return getSessionFactory(true).getTypeHelper();
}
@Override
@SuppressWarnings("deprecation")
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getIdentifierGeneratorFactory();
}
@Override
public Type getIdentifierType(final String className) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getIdentifierType(className);
}
@Override
public String getIdentifierPropertyName(final String className) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getIdentifierPropertyName(className);
}
@Override
public Type getReferencedPropertyType(final String className, final String propertyName) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getReferencedPropertyType(className, propertyName);
}
@Override
public TypeResolver getTypeResolver() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getTypeResolver();
}
@Override
public Properties getProperties() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getProperties();
}
@Override
public EntityPersister getEntityPersister(final String entityName) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getEntityPersister(entityName);
}
@Override
public CollectionPersister getCollectionPersister(final String role) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getCollectionPersister(role);
}
@Override
public Dialect getDialect() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getDialect();
}
@Override
public Interceptor getInterceptor() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getInterceptor();
}
@Override
public QueryPlanCache getQueryPlanCache() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getQueryPlanCache();
}
@Override
public Type[] getReturnTypes(final String queryString) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getReturnTypes(queryString);
}
@Override
public String[] getReturnAliases(final String queryString) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getReturnAliases(queryString);
}
@Override
public ConnectionProvider getConnectionProvider() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getConnectionProvider();
}
@Override
public String[] getImplementors(final String className) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getImplementors(className);
}
@Override
public String getImportedClassName(final String name) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getImportedClassName(name);
}
@Override
public TransactionManager getTransactionManager() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getTransactionManager();
}
@Override
public QueryCache getQueryCache() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getQueryCache();
}
@Override
public QueryCache getQueryCache(final String regionName) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getQueryCache(regionName);
}
@Override
public UpdateTimestampsCache getUpdateTimestampsCache() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getUpdateTimestampsCache();
}
@Override
public StatisticsImplementor getStatisticsImplementor() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getStatisticsImplementor();
}
@Override
public NamedQueryDefinition getNamedQuery(final String queryName) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getNamedQuery(queryName);
}
@Override
public NamedSQLQueryDefinition getNamedSQLQuery(final String queryName) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getNamedSQLQuery(queryName);
}
@Override
public ResultSetMappingDefinition getResultSetMapping(final String name) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getResultSetMapping(name);
}
@Override
public IdentifierGenerator getIdentifierGenerator(final String rootEntityName) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getIdentifierGenerator(rootEntityName);
}
@Override
public Region getSecondLevelCacheRegion(final String regionName) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getSecondLevelCacheRegion(regionName);
}
@Override
@SuppressWarnings("rawtypes")
public Map getAllSecondLevelCacheRegions() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getAllSecondLevelCacheRegions();
}
@Override
public SQLExceptionConverter getSQLExceptionConverter() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getSQLExceptionConverter();
}
@Override
public Settings getSettings() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getSettings();
}
@Override
public Session openTemporarySession() {
return ((SessionFactoryImplementor) getSessionFactory(false)).openTemporarySession();
}
@Override
public Session openSession(final Connection connection, final boolean flushBeforeCompletionEnabled,
final boolean autoCloseSessionEnabled, final ConnectionReleaseMode connectionReleaseMode) {
return ((SessionFactoryImplementor) getSessionFactory(false)).openTemporarySession();
}
@Override
public Set<String> getCollectionRolesByEntityParticipant(final String entityName) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getCollectionRolesByEntityParticipant(entityName);
}
@Override
public EntityNotFoundDelegate getEntityNotFoundDelegate() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getEntityNotFoundDelegate();
}
@Override
public SQLFunctionRegistry getSqlFunctionRegistry() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getSqlFunctionRegistry();
}
@Override
public FetchProfile getFetchProfile(final String name) {
return ((SessionFactoryImplementor) getSessionFactory(false)).getFetchProfile(name);
}
@Override
public SessionFactoryObserver getFactoryObserver() {
return ((SessionFactoryImplementor) getSessionFactory(false)).getFactoryObserver();
}
@Override
public boolean equals(final Object obj) {
if (sessionFactory == null) {
return super.equals(obj);
}
return getSessionFactory(false).equals(obj);
}
@Override
public int hashCode() {
if (sessionFactory == null) {
return super.hashCode();
}
return getSessionFactory(false).hashCode();
}
@Override
public String toString() {
if (sessionFactory == null) {
return super.toString();
}
return getSessionFactory(false).toString();
}
@Override
public Object getWrappedObject() {
return sessionFactory;
}
}