Package org.hibernate.testing.junit.functional

Source Code of org.hibernate.testing.junit.functional.ExecutionEnvironment$Settings

/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010, Red Hat Inc. or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors.  All third-party contributions are
* distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA  02110-1301  USA
*/
package org.hibernate.testing.junit.functional;

import java.util.Iterator;
import java.sql.Blob;
import java.sql.Clob;

import org.hibernate.dialect.Dialect;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.cfg.Mappings;
import org.hibernate.SessionFactory;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Collection;

/**
* {@inheritDoc}
*
* @author Steve Ebersole
*/
public class ExecutionEnvironment {

  public static final Dialect DIALECT = Dialect.getDialect();

  private final ExecutionEnvironment.Settings settings;

  private Configuration configuration;
  private SessionFactory sessionFactory;
  private boolean allowRebuild;

  public ExecutionEnvironment(ExecutionEnvironment.Settings settings) {
    this.settings = settings;
  }

  public boolean isAllowRebuild() {
    return allowRebuild;
  }

  public void setAllowRebuild(boolean allowRebuild) {
    this.allowRebuild = allowRebuild;
  }

  public Dialect getDialect() {
    return DIALECT;
  }

  public Configuration getConfiguration() {
    return configuration;
  }

  public SessionFactory getSessionFactory() {
    return sessionFactory;
  }

  public void initialize() {
    if ( sessionFactory != null ) {
      throw new IllegalStateException( "attempt to initialize already initialized ExecutionEnvironment" );
    }
    if ( ! settings.appliesTo( getDialect() ) ) {
      return;
    }

    Configuration configuration = new Configuration();
    configuration.setProperty( Environment.CACHE_PROVIDER, "org.hibernate.cache.HashtableCacheProvider" );

    settings.configure( configuration );

    if ( settings.createSchema() ) {
      configuration.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
    }

    // make sure we use the same dialect...
    configuration.setProperty( Environment.DIALECT, getDialect().getClass().getName() );

    applyMappings( configuration );
    configuration.buildMappings();

    applyCacheSettings( configuration );
    settings.afterConfigurationBuilt( configuration.createMappings(), getDialect() );

    SessionFactory sessionFactory = configuration.buildSessionFactory();
    this.configuration = configuration;
    this.sessionFactory = sessionFactory;

    settings.afterSessionFactoryBuilt( ( SessionFactoryImplementor ) sessionFactory );
  }

  private void applyMappings(Configuration configuration) {
    String[] mappings = settings.getMappings();
    for ( String mapping : mappings ) {
      configuration.addResource(
          settings.getBaseForMappings() + mapping,
          ExecutionEnvironment.class.getClassLoader()
      );
    }
  }

  private void applyCacheSettings(Configuration configuration) {
    if ( settings.getCacheConcurrencyStrategy() != null ) {
      Iterator iter = configuration.getClassMappings();
      while ( iter.hasNext() ) {
        PersistentClass clazz = (PersistentClass) iter.next();
        Iterator props = clazz.getPropertyClosureIterator();
        boolean hasLob = false;
        while ( props.hasNext() ) {
          Property prop = (Property) props.next();
          if ( prop.getValue().isSimpleValue() ) {
            String type = ( ( SimpleValue ) prop.getValue() ).getTypeName();
            if ( "blob".equals(type) || "clob".equals(type) ) {
              hasLob = true;
            }
            if ( Blob.class.getName().equals(type) || Clob.class.getName().equals(type) ) {
              hasLob = true;
            }
          }
        }
        if ( !hasLob && !clazz.isInherited() && settings.overrideCacheStrategy() ) {
          configuration.setCacheConcurrencyStrategy( clazz.getEntityName(), settings.getCacheConcurrencyStrategy() );
        }
      }
      iter = configuration.getCollectionMappings();
      while ( iter.hasNext() ) {
        Collection coll = (Collection) iter.next();
        configuration.setCollectionCacheConcurrencyStrategy( coll.getRole(), settings.getCacheConcurrencyStrategy() );
      }
    }
  }

  public void rebuild() {
    if ( !allowRebuild ) {
      return;
    }
    if ( sessionFactory != null ) {
      sessionFactory.close();
      sessionFactory = null;
    }
    sessionFactory = configuration.buildSessionFactory();
    settings.afterSessionFactoryBuilt( ( SessionFactoryImplementor ) sessionFactory );
  }

  public void complete() {
    if ( sessionFactory != null ) {
      sessionFactory.close();
      sessionFactory = null;
    }
    configuration = null;
  }

  public static interface Settings {
    public String[] getMappings();
    public String getBaseForMappings();
    public boolean createSchema();
    public boolean recreateSchemaAfterFailure();
    public void configure(Configuration cfg);
    public boolean overrideCacheStrategy();
    public String getCacheConcurrencyStrategy();
    public void afterSessionFactoryBuilt(SessionFactoryImplementor sfi);
    public void afterConfigurationBuilt(Mappings mappings, Dialect dialect);
    public boolean appliesTo(Dialect dialect);
  }
}
TOP

Related Classes of org.hibernate.testing.junit.functional.ExecutionEnvironment$Settings

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.