Skip to content

Commit

Permalink
SqlRepositoryBeanConfig: explicit bean dependencies as arguments
Browse files Browse the repository at this point in the history
DataSourceFactory.createDataSource() is called directly for dsf bean,
not later in sessionFactory(), otherwise it was possible to obtain DSF
without initialized datasource, which is not helpful.
This wasn't problem because ORM is initialized too, but if for whatever
reason sessionFactory() is not called (e.g. in test), DSF fails to give
us SQL connection.
  • Loading branch information
virgo47 committed Jun 26, 2020
1 parent 56ffc5c commit 3666b18
Showing 1 changed file with 15 additions and 10 deletions.
Expand Up @@ -9,14 +9,15 @@

import java.util.Properties;

import com.evolveum.midpoint.repo.sql.data.common.dictionary.ExtItemDictionary;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;

import com.evolveum.midpoint.repo.api.RepositoryServiceFactoryException;
import com.evolveum.midpoint.repo.sql.data.common.dictionary.ExtItemDictionary;
import com.evolveum.midpoint.repo.sql.util.EntityStateInterceptor;
import com.evolveum.midpoint.repo.sql.util.MidPointImplicitNamingStrategy;
import com.evolveum.midpoint.repo.sql.util.MidPointPhysicalNamingStrategy;
Expand All @@ -36,9 +37,10 @@ public ExtItemDictionary extItemDictionary() {
}

@Bean
public DataSourceFactory dataSourceFactory() {
public DataSourceFactory dataSourceFactory() throws RepositoryServiceFactoryException {
DataSourceFactory df = new DataSourceFactory();
df.setConfiguration(sqlRepositoryFactory.getSqlConfiguration());
df.createDataSource();

return df;
}
Expand All @@ -59,13 +61,16 @@ public EntityStateInterceptor entityStateInterceptor() {
}

@Bean
public LocalSessionFactoryBean sessionFactory() throws RepositoryServiceFactoryException {
public LocalSessionFactoryBean sessionFactory(
DataSourceFactory dataSourceFactory,
MidPointImplicitNamingStrategy midPointImplicitNamingStrategy,
MidPointPhysicalNamingStrategy midPointPhysicalNamingStrategy,
EntityStateInterceptor entityStateInterceptor) {
LocalSessionFactoryBean bean = new LocalSessionFactoryBean();

DataSourceFactory dataSourceFactory = dataSourceFactory();
SqlRepositoryConfiguration configuration = sqlRepositoryFactory.getSqlConfiguration();

bean.setDataSource(dataSourceFactory.createDataSource());
bean.setDataSource(dataSourceFactory.getDataSource());

Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", configuration.getHibernateDialect());
Expand All @@ -77,8 +82,8 @@ public LocalSessionFactoryBean sessionFactory() throws RepositoryServiceFactoryE
hibernateProperties.setProperty("hibernate.hql.bulk_id_strategy", "org.hibernate.hql.spi.id.inline.InlineIdsOrClauseBulkIdStrategy");

bean.setHibernateProperties(hibernateProperties);
bean.setImplicitNamingStrategy(midPointImplicitNamingStrategy());
bean.setPhysicalNamingStrategy(midPointPhysicalNamingStrategy());
bean.setImplicitNamingStrategy(midPointImplicitNamingStrategy);
bean.setPhysicalNamingStrategy(midPointPhysicalNamingStrategy);
bean.setAnnotatedPackages("com.evolveum.midpoint.repo.sql.type");
bean.setPackagesToScan(
"com.evolveum.midpoint.repo.sql.data.common",
Expand All @@ -90,15 +95,15 @@ public LocalSessionFactoryBean sessionFactory() throws RepositoryServiceFactoryE
"com.evolveum.midpoint.repo.sql.data.common.other",
"com.evolveum.midpoint.repo.sql.data.common.type",
"com.evolveum.midpoint.repo.sql.data.audit");
bean.setEntityInterceptor(entityStateInterceptor());
bean.setEntityInterceptor(entityStateInterceptor);

return bean;
}

@Bean
public HibernateTransactionManager transactionManager() throws RepositoryServiceFactoryException {
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager htm = new HibernateTransactionManager();
htm.setSessionFactory(sessionFactory().getObject());
htm.setSessionFactory(sessionFactory);

return htm;
}
Expand Down

0 comments on commit 3666b18

Please sign in to comment.