/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.store.support;
import java.util.Properties;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
import com.enonic.cms.framework.cache.CacheManager;
import com.enonic.cms.framework.jdbc.dialect.Db2Dialect;
import com.enonic.cms.framework.jdbc.dialect.Dialect;
import com.enonic.cms.framework.jdbc.dialect.H2Dialect;
import com.enonic.cms.framework.jdbc.dialect.MySqlDialect;
import com.enonic.cms.framework.jdbc.dialect.OracleDialect;
import com.enonic.cms.framework.jdbc.dialect.PostgreSqlDialect;
import com.enonic.cms.framework.jdbc.dialect.SqlServerDialect;
import com.enonic.cms.store.hibernate.cache.HibernateCacheBootstrap;
/**
* This class implements the hibernate configurator.
*/
public final class HibernateConfigurator
extends LocalSessionFactoryBean
{
/**
* Shared instance.
*/
private static HibernateConfigurator INSTANCE;
/**
* Dialect.
*/
private Dialect dialect;
/**
* Cache manager.
*/
private CacheManager cacheManager;
/**
* Construc the configurator.
*/
public HibernateConfigurator()
{
INSTANCE = this;
}
/**
* Set the dialect name.
*/
public void setDialect( Dialect dialect )
{
this.dialect = dialect;
}
/**
* Set the cache manager.
*/
@Autowired
public void setCacheManager( CacheManager cacheManager )
{
this.cacheManager = cacheManager;
}
public Configuration getHibernateConfiguration()
{
return getConfiguration();
}
/**
* After set properties.
*/
public void afterPropertiesSet()
throws Exception
{
HibernateCacheBootstrap cacheBootstrap = new HibernateCacheBootstrap();
cacheBootstrap.setCacheManager( this.cacheManager );
setHibernateDialect( getHibernateProperties() );
super.afterPropertiesSet();
}
public void setLogging( boolean logging )
{
getHibernateProperties().setProperty( Environment.SHOW_SQL, String.valueOf( logging ) );
}
/**
* Set the hibernate dialect.
*/
private void setHibernateDialect( Properties props )
{
String dialectClass = resolveDialectClass();
if ( ( props != null ) && ( dialectClass != null ) )
{
props.setProperty( Environment.DIALECT, dialectClass );
}
}
/**
* Resolve the dialect class.
*/
private String resolveDialectClass()
{
if ( this.dialect instanceof Db2Dialect )
{
return org.hibernate.dialect.DB2Dialect.class.getName();
}
else if ( this.dialect instanceof SqlServerDialect )
{
return org.hibernate.dialect.SQLServerDialect.class.getName();
}
else if ( this.dialect instanceof MySqlDialect )
{
return org.hibernate.dialect.MySQLDialect.class.getName();
}
else if ( this.dialect instanceof OracleDialect )
{
return org.hibernate.dialect.Oracle10gDialect.class.getName();
}
else if ( this.dialect instanceof PostgreSqlDialect )
{
return org.hibernate.dialect.PostgreSQLDialect.class.getName();
}
else if ( this.dialect instanceof H2Dialect )
{
return org.hibernate.dialect.H2Dialect.class.getName();
}
else
{
return null;
}
}
/**
* Return the instance.
*/
public static HibernateConfigurator getInstance()
{
return INSTANCE;
}
}