package devopsdistilled.operp.server.context;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableJpaRepositories(basePackages = "devopsdistilled.operp.server.data.repo", repositoryImplementationPostfix = "CustomImpl")
@EnableTransactionManagement
@PropertySource("server/application.properties")
@ComponentScan("devopsdistilled.operp.server.data")
public class DbTestContext {
@Value("devopsdistilled.operp.server.data.entity")
private String packagesToScan;
/**
*
* This will be setting up a datasource using HyperSQL (hsqldb) in memory
*/
@Bean
public DataSource hsqlDataSource() {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(org.hsqldb.jdbcDriver.class
.getName());
basicDataSource.setUsername("sa");
basicDataSource.setPassword("");
basicDataSource.setUrl("jdbc:hsqldb:mem:mydb");
return basicDataSource;
}
/**
*
* This setups the session factory
*/
@Bean
public LocalSessionFactoryBean sessionFactory(Environment environment,
DataSource dataSource) {
/**
*
* Getting packageOfModelBean from package of message bean
*
*/
LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean
.setHibernateProperties(buildHibernateProperties(environment));
factoryBean.setPackagesToScan(packagesToScan);
return factoryBean;
}
/**
*
* Loading all the hibernate properties from a properties file
*/
protected Properties buildHibernateProperties(Environment env) {
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect",
env.getProperty("hibernate.dialect"));
hibernateProperties.setProperty("hibernate.show_sql",
env.getProperty("hibernate.show_sql"));
hibernateProperties.setProperty("hibernate.use_sql_comments",
env.getProperty("hibernate.use_sql_comments"));
hibernateProperties.setProperty("hibernate.format_sql",
env.getProperty("hibernate.format_sql"));
hibernateProperties.setProperty("hibernate.hbm2ddl.auto",
env.getProperty("hibernate.hbm2ddl.auto"));
hibernateProperties.setProperty("hibernate.generate_statistics",
env.getProperty("hibernate.generate_statistics"));
hibernateProperties.setProperty("javax.persistence.validation.mode",
env.getProperty("javax.persistence.validation.mode"));
// Audit History flags
hibernateProperties.setProperty(
"org.hibernate.envers.store_data_at_delete",
env.getProperty("org.hibernate.envers.store_data_at_delete"));
hibernateProperties
.setProperty(
"org.hibernate.envers.global_with_modified_flag",
env.getProperty("org.hibernate.envers.global_with_modified_flag"));
return hibernateProperties;
}
/**
*
* This is setting up the hibernate transaction manager
*
*/
@Bean
public HibernateTransactionManager hibernateTransactionManager(
SessionFactory sessionFactory) {
return new HibernateTransactionManager(sessionFactory);
}
}