ervu-business-metrics/backend/src/main/java/AppConfig.java
2025-06-12 19:47:43 +03:00

145 lines
5.1 KiB
Java

import java.lang.invoke.MethodHandles;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.Duration;
import java.util.Collections;
import javax.sql.DataSource;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import ervu_business_metrics.deserializer.ReferenceEntityDeserializer;
import ervu_business_metrics.model.ReferenceEntity;
import exception.AppInitializeException;
import liquibase.integration.spring.SpringLiquibase;
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import net.javacrumbs.shedlock.spring.ScheduledLockConfiguration;
import net.javacrumbs.shedlock.spring.ScheduledLockConfigurationBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
/**
* Root application context This context imports XML configs from all the other jars, and is created
* by {@link WebAppInitializer} NB: modules are excluded from component scan since
* spring-context.xml sometimes holds important parameters and / or annotations
*
* @author krylov
*/
@Configuration
@ComponentScan(basePackages = {
"service",
"dao",
"bpmn",
"i18n",
"errorhandling",
"database",
"component.addresses",
"gen",
"ru.cg",
"ru.micord",
"ervu_business_metrics"
}, excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "security.WebSecurityConfig"),
@ComponentScan.Filter(type = FilterType.REGEX,
pattern = "ru.cg.webbpm.modules.database.impl.DatabaseConfiguration"),
})
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableWebMvc
@EnableScheduling
public class AppConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(
MethodHandles.lookup().lookupClass());
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean
public ScheduledLockConfiguration taskScheduler(LockProvider lockProvider) {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(12);
scheduler.initialize();
return ScheduledLockConfigurationBuilder
.withLockProvider(lockProvider)
.withTaskScheduler(scheduler)
.withDefaultLockAtMostFor(Duration.ofHours(4))
.build();
}
@Bean
public LockProvider lockProvider(@Qualifier("datasource") DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource, "ervu_business_metrics.shedlock");
}
@Bean
public SpringLiquibase liquibase(@Qualifier("datasource") DataSource dataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
createErvuMetricsSchema(dataSource);
liquibase.setDataSource(dataSource);
liquibase.setChangeLog("classpath:config/changelog-master.xml");
liquibase.setChangeLogParameters(
Collections.singletonMap("projectUser", getProjectDbUserName(dataSource)));
liquibase.setDefaultSchema("ervu_business_metrics");
return liquibase;
}
private void createErvuMetricsSchema(DataSource dataSource) {
try (Connection connection = dataSource.getConnection()) {
LOGGER.info("Start creating ervu_business_metrics schema");
String sql = "CREATE SCHEMA IF NOT EXISTS ervu_business_metrics;";
try (Statement statement = connection.createStatement()) {
connection.setAutoCommit(false);
statement.execute(sql);
connection.commit();
LOGGER.info("ervu_business_metrics schema was created");
}
catch (SQLException e) {
connection.rollback();
throw new AppInitializeException(e);
}
}
catch (SQLException e) {
throw new AppInitializeException(e);
}
}
private String getProjectDbUserName(DataSource dataSource) {
try (Connection connection = dataSource.getConnection()) {
return connection.getMetaData().getUserName();
}
catch (SQLException e) {
throw new AppInitializeException(e);
}
}
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(ReferenceEntity.class, new ReferenceEntityDeserializer());
objectMapper.registerModule(module);
return objectMapper;
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}