com.qcadoo.model.internal.sessionfactory.DynamicSessionFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.qcadoo.model.internal.sessionfactory.DynamicSessionFactory.java

Source

/**
 * ***************************************************************************
 * 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;
    }

}