From 3666b18df436ac8f8108f5cdf19ebf1c18772b45 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Fri, 26 Jun 2020 18:22:07 +0200 Subject: [PATCH] SqlRepositoryBeanConfig: explicit bean dependencies as arguments 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. --- .../repo/sql/SqlRepositoryBeanConfig.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryBeanConfig.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryBeanConfig.java index 5867db5b2f9..76fc65d2847 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryBeanConfig.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryBeanConfig.java @@ -9,7 +9,7 @@ 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; @@ -17,6 +17,7 @@ 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; @@ -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; } @@ -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()); @@ -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", @@ -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; }