All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.vendigo.acetest.db.DatasourceContext Maven / Gradle / Ivy

package com.github.vendigo.acetest.db;

import com.github.vendigo.acetest.config.Config;
import com.github.vendigo.acetest.config.DatasourceConfig;
import com.github.vendigo.acetest.db.dao.CrudMapper;
import com.github.vendigo.acetest.utils.Utils;
import liquibase.integration.spring.SpringLiquibase;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Component
@Slf4j
public class DatasourceContext {
    public static final String H2_DRIVER_CLASS_NAME = "org.h2.Driver";
    private static final String H2_DEFAULT_SCHEMA = "PUBLIC";
    private Map sessionFactories = new HashMap<>();
    private SqlFileRunner sqlFileRunner = new SqlFileRunner();
    private final Config config;

    @Autowired
    public DatasourceContext(Config config) {
        this.config = config;
    }

    @PostConstruct
    public void init() {
        log.info("Init datasource");
        for (DatasourceConfig dsConfig : config.getDatasources()) {
            DataSource datasource = createDatasource(dsConfig);
            if (dsConfig.getSchemaFile() != null) {
                log.info("Applying {} to {}", dsConfig.getSchemaFile(), dsConfig.getDbName());
                sqlFileRunner.applySchemaFile(dsConfig.getSchemaFile(), datasource);
            }

            if (dsConfig.getLiquibaseConfig() != null) {
                applyLiquibase(dsConfig, datasource);
            }

            createSqlSessionFactory(dsConfig, datasource);
        }
    }

    @SneakyThrows
    private void applyLiquibase(DatasourceConfig dsConfig, DataSource datasource) {
        log.info("Applying {} to {}", dsConfig.getLiquibaseConfig(), dsConfig.getDbName());
        SpringLiquibase springLiquibase = new SpringLiquibase();
        springLiquibase.setDataSource(datasource);
        springLiquibase.setChangeLog(dsConfig.getLiquibaseConfig());
        String liquibaseContexts = dsConfig.getLiquibaseContexts();
        if (!StringUtils.isEmpty(liquibaseContexts)) {
            springLiquibase.setContexts(liquibaseContexts);
        }
        springLiquibase.setResourceLoader(new DefaultResourceLoader());
        springLiquibase.setDefaultSchema(H2_DEFAULT_SCHEMA);
        springLiquibase.afterPropertiesSet();
    }

    @SneakyThrows
    private void createSqlSessionFactory(DatasourceConfig dsConfig, DataSource datasource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(datasource);
        Configuration configuration = new Configuration();
        configuration.addMapper(CrudMapper.class);
        sqlSessionFactoryBean.setConfiguration(configuration);
        sessionFactories.put(dsConfig.getDbName(), sqlSessionFactoryBean.getObject());
    }

    private DataSource createDatasource(DatasourceConfig dsConfig) {
        log.info("Creating dataSource {}", dsConfig.getDbName());
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(H2_DRIVER_CLASS_NAME);
        dataSource.setUrl(dsConfig.getUrl());
        return dataSource;
    }

    public SqlSessionFactory getSqlSessionFactory(String dbName) {
        return sessionFactories.get(dbName);
    }

    public String getOnlyDbName() {
        return Utils.getOnlyElement(sessionFactories.keySet());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy