Skip to content

Commit

Permalink
making repo-sql-impl non-required for starting with another repo impl
Browse files Browse the repository at this point in the history
- MP still starts configured with old repo and audit, which is a must.
- new sqale-repo is not working at all yet
- task-impl does not fail on Spring bean deps, but on new repo
- SystemConfigurationChangeDispatcherImpl moved to repo-common
It was in repo-sql-impl previously, but it supports any repo impl.
- SqlAuditServiceFactory is conditionally created by @configuration
SqlRepositoryBeanConfig. Previous @conditional... on SASF did not work.
- bare SqaleRepositoryBeanConfig was introduced + new ctx-repository.xml
  • Loading branch information
virgo47 committed Jan 12, 2021
1 parent 30b2402 commit 61d75a8
Show file tree
Hide file tree
Showing 10 changed files with 195 additions and 22 deletions.
5 changes: 5 additions & 0 deletions repo/repo-common/pom.xml
Expand Up @@ -56,6 +56,11 @@
<artifactId>security-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.evolveum.midpoint.repo</groupId>
<artifactId>audit-api</artifactId>
<version>${project.version}</version>
</dependency>
<!--
TODO: this one is strange, it's the only repo non-api dependency and seems to be needed
for one line: RepositoryCache.enterLocalCaches... in AbstractSearchIterativeResultHandler
Expand Down
@@ -1,11 +1,10 @@
/*
* Copyright (c) 2010-2020 Evolveum and contributors
* Copyright (C) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.repo.sql;
package com.evolveum.midpoint.repo.common;

import java.util.Collection;
import java.util.Collections;
Expand Down
8 changes: 5 additions & 3 deletions repo/repo-sqale/pom.xml
Expand Up @@ -67,12 +67,12 @@
<artifactId>security-api</artifactId>
<version>${project.version}</version>
</dependency>
-->
<dependency>
<groupId>com.evolveum.midpoint.repo</groupId>
<artifactId>repo-sqlbase</artifactId>
<version>${project.version}</version>
</dependency>
-->

<dependency>
<groupId>org.apache.commons</groupId>
Expand Down Expand Up @@ -111,10 +111,9 @@
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
</dependency>
-->
-->

<!-- SPRING -->
<!--
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
Expand All @@ -123,6 +122,7 @@
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<!--
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
Expand All @@ -131,11 +131,13 @@
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

<!--
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
Expand Down
@@ -0,0 +1,119 @@
/*
* Copyright (C) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.repo.sqale;

import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext;

/**
* New SQL repository related configuration.
* {@link ConditionalOnMissingBean} annotations are used to avoid duplicate bean acquirement that
* would happen when combined with alternative configurations (e.g. context XMLs for test).
* {@link ConditionalOnExpression} class annotation activates this configuration only if midpoint
* {@code config.xml} specifies the repository factory class from SQL package.
*/
@Configuration
@ConditionalOnExpression("#{midpointConfiguration.getConfiguration('midpoint.repository')"
+ ".getString('repositoryServiceFactoryClass').startsWith('com.evolveum.midpoint.repo.sqale.')}")
@ComponentScan
public class SqaleRepositoryBeanConfig {

@Bean
public SqlRepoContext sqlRepoContext() {
// TODO fill in
return new SqlRepoContext(null, null);
}

/*
@Bean
@ConditionalOnMissingBean
public DataSourceFactory dataSourceFactory(SqlRepositoryFactory sqlRepositoryFactory) {
return new DataSourceFactory(sqlRepositoryFactory.getSqlConfiguration());
}
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DataSourceFactory dataSourceFactory)
throws RepositoryServiceFactoryException {
return dataSourceFactory.createDataSource();
}
@Bean
public MidPointImplicitNamingStrategy midPointImplicitNamingStrategy() {
return new MidPointImplicitNamingStrategy();
}
@Bean
public MidPointPhysicalNamingStrategy midPointPhysicalNamingStrategy() {
return new MidPointPhysicalNamingStrategy();
}
@Bean
public EntityStateInterceptor entityStateInterceptor() {
return new EntityStateInterceptor();
}
@Bean
public LocalSessionFactoryBean sessionFactory(
DataSource dataSource,
DataSourceFactory dataSourceFactory,
MidPointImplicitNamingStrategy midPointImplicitNamingStrategy,
MidPointPhysicalNamingStrategy midPointPhysicalNamingStrategy,
EntityStateInterceptor entityStateInterceptor) {
LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
SqlRepositoryConfiguration configuration = dataSourceFactory.configuration();
// While dataSource == dataSourceFactory.getDataSource(), we're using dataSource as
// parameter to assure, that Spring already called the factory method. Explicit is good.
bean.setDataSource(dataSource);
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", configuration.getHibernateDialect());
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", configuration.getHibernateHbm2ddl());
hibernateProperties.setProperty("hibernate.id.new_generator_mappings", "true");
hibernateProperties.setProperty("hibernate.jdbc.batch_size", "20");
hibernateProperties.setProperty("javax.persistence.validation.mode", "none");
hibernateProperties.setProperty("hibernate.transaction.coordinator_class", "jdbc");
hibernateProperties.setProperty("hibernate.hql.bulk_id_strategy",
"org.hibernate.hql.spi.id.inline.InlineIdsOrClauseBulkIdStrategy");
bean.setHibernateProperties(hibernateProperties);
bean.setImplicitNamingStrategy(midPointImplicitNamingStrategy);
bean.setPhysicalNamingStrategy(midPointPhysicalNamingStrategy);
bean.setAnnotatedPackages("com.evolveum.midpoint.repo.sql.type");
bean.setPackagesToScan(
"com.evolveum.midpoint.repo.sql.data.common",
"com.evolveum.midpoint.repo.sql.data.common.any",
"com.evolveum.midpoint.repo.sql.data.common.container",
"com.evolveum.midpoint.repo.sql.data.common.embedded",
"com.evolveum.midpoint.repo.sql.data.common.enums",
"com.evolveum.midpoint.repo.sql.data.common.id",
"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);
return bean;
}
@Bean
public TransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager htm = new HibernateTransactionManager();
htm.setSessionFactory(sessionFactory);
return htm;
}
*/

// TODO @Bean for AuditServiceFactory
}
Expand Up @@ -7,17 +7,22 @@
package com.evolveum.midpoint.repo.sqale;

import org.apache.commons.configuration2.Configuration;
import org.springframework.beans.factory.annotation.Autowired;

import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.repo.api.RepositoryServiceFactory;
import com.evolveum.midpoint.repo.api.RepositoryServiceFactoryException;
import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;

public class SqaleRepositoryServiceFactory implements RepositoryServiceFactory {

private static final Trace LOGGER = TraceManager.getTrace(SqaleRepositoryServiceFactory.class);

@Autowired
private SqlRepoContext sqlRepoContext;

private SqaleRepositoryService repositoryService;

@Override
Expand Down
17 changes: 17 additions & 0 deletions repo/repo-sqale/src/main/resources/ctx-repository.xml
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (C) 2010-2021 Evolveum and contributors
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">

<!-- This @Configuration drives component-scan + can use @Conditional... -->
<bean id="sqaleRepositoryBeanConfig" class="com.evolveum.midpoint.repo.sqale.SqaleRepositoryBeanConfig"/>
</beans>
5 changes: 0 additions & 5 deletions repo/repo-sql-impl/pom.xml
Expand Up @@ -61,11 +61,6 @@
<artifactId>audit-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.evolveum.midpoint.repo</groupId>
<artifactId>security-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.evolveum.midpoint.repo</groupId>
<artifactId>repo-sqlbase</artifactId>
Expand Down
Expand Up @@ -23,29 +23,34 @@
import org.apache.commons.configuration2.tree.ImmutableNode;
import org.hibernate.SessionFactory;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;

import com.evolveum.midpoint.audit.api.AuditService;
import com.evolveum.midpoint.audit.api.AuditServiceFactory;
import com.evolveum.midpoint.audit.api.AuditServiceFactoryException;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.repo.api.RepositoryServiceFactoryException;
import com.evolveum.midpoint.repo.sql.audit.mapping.QAuditEventRecordMapping;
import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditEventRecord;
import com.evolveum.midpoint.repo.sql.helpers.BaseHelper;
import com.evolveum.midpoint.repo.sql.helpers.JdbcSession;
import com.evolveum.midpoint.repo.sqlbase.SqlTableMetadata;
import com.evolveum.midpoint.repo.sql.audit.querymodel.QAuditEventRecord;
import com.evolveum.midpoint.repo.sql.audit.mapping.QAuditEventRecordMapping;
import com.evolveum.midpoint.repo.sql.util.EntityStateInterceptor;
import com.evolveum.midpoint.repo.sql.util.MidPointImplicitNamingStrategy;
import com.evolveum.midpoint.repo.sql.util.MidPointPhysicalNamingStrategy;
import com.evolveum.midpoint.repo.sqlbase.SqlTableMetadata;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;

/**
* {@link AuditServiceFactory} for {@link SqlAuditServiceImpl}, that is DB-based auditing.
* <p>
* This works only if legacy repository is used, which is handled by ConditionalOnExpression.
* If this class is specified in config.xml as audit factory, without old repository it fails
* because it will not be found as a bean.
*/
//@ConditionalOnExpression("#{midpointConfiguration.getConfiguration('midpoint.repository')"
// + ".getString('repositoryServiceFactoryClass').startsWith('com.evolveum.midpoint.repo.sql.')}")
public class SqlAuditServiceFactory implements AuditServiceFactory {

private static final Trace LOGGER = TraceManager.getTrace(SqlAuditServiceFactory.class);
Expand All @@ -54,14 +59,27 @@ public class SqlAuditServiceFactory implements AuditServiceFactory {
private static final String CONF_AUDIT_SERVICE_COLUMN_NAME = "columnName";
private static final String CONF_AUDIT_SERVICE_EVENT_RECORD_PROPERTY_NAME = "eventRecordPropertyName";

@Autowired private BaseHelper defaultBaseHelper;
@Autowired private PrismContext prismContext;
@Autowired private MidPointImplicitNamingStrategy midPointImplicitNamingStrategy;
@Autowired private MidPointPhysicalNamingStrategy midPointPhysicalNamingStrategy;
@Autowired private EntityStateInterceptor entityStateInterceptor;
private final BaseHelper defaultBaseHelper;
private final PrismContext prismContext;
private final MidPointImplicitNamingStrategy midPointImplicitNamingStrategy;
private final MidPointPhysicalNamingStrategy midPointPhysicalNamingStrategy;
private final EntityStateInterceptor entityStateInterceptor;

private SqlAuditServiceImpl auditService;

public SqlAuditServiceFactory(
BaseHelper defaultBaseHelper,
PrismContext prismContext,
MidPointImplicitNamingStrategy midPointImplicitNamingStrategy,
MidPointPhysicalNamingStrategy midPointPhysicalNamingStrategy,
EntityStateInterceptor entityStateInterceptor) {
this.defaultBaseHelper = defaultBaseHelper;
this.prismContext = prismContext;
this.midPointImplicitNamingStrategy = midPointImplicitNamingStrategy;
this.midPointPhysicalNamingStrategy = midPointPhysicalNamingStrategy;
this.entityStateInterceptor = entityStateInterceptor;
}

@Override
public synchronized void init(@NotNull Configuration configuration) throws AuditServiceFactoryException {
LOGGER.info("Initializing Sql audit service factory.");
Expand Down
Expand Up @@ -19,8 +19,11 @@
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.TransactionManager;

import com.evolveum.midpoint.audit.api.AuditServiceFactory;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.repo.api.RepositoryServiceFactoryException;
import com.evolveum.midpoint.repo.sql.data.common.dictionary.ExtItemDictionary;
import com.evolveum.midpoint.repo.sql.helpers.BaseHelper;
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 Down Expand Up @@ -131,4 +134,16 @@ public TransactionManager transactionManager(SessionFactory sessionFactory) {

return htm;
}

@Bean
public AuditServiceFactory sqlAuditServiceFactory(
BaseHelper defaultBaseHelper,
PrismContext prismContext,
MidPointImplicitNamingStrategy midPointImplicitNamingStrategy,
MidPointPhysicalNamingStrategy midPointPhysicalNamingStrategy,
EntityStateInterceptor entityStateInterceptor) {
return new SqlAuditServiceFactory(
defaultBaseHelper, prismContext, midPointImplicitNamingStrategy,
midPointPhysicalNamingStrategy, entityStateInterceptor);
}
}
2 changes: 0 additions & 2 deletions repo/repo-sql-impl/src/main/resources/ctx-repository.xml
Expand Up @@ -14,6 +14,4 @@

<!-- This @Configuration drives component-scan + can use @Conditional... -->
<bean id="sqlRepositoryBeanConfig" class="com.evolveum.midpoint.repo.sql.SqlRepositoryBeanConfig"/>

<bean id="sqlAuditFactory" class="com.evolveum.midpoint.repo.sql.SqlAuditServiceFactory"/>
</beans>

0 comments on commit 61d75a8

Please sign in to comment.