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

com.icthh.xm.commons.migration.db.XmMultiTenantSpringLiquibase Maven / Gradle / Ivy

There is a newer version: 4.0.21
Show newest version
package com.icthh.xm.commons.migration.db;

import liquibase.exception.LiquibaseException;
import liquibase.integration.spring.MultiTenantSpringLiquibase;
import liquibase.integration.spring.SpringLiquibase;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.CollectionUtils;

import javax.sql.DataSource;
import java.util.ArrayList;

@Slf4j
public class XmMultiTenantSpringLiquibase extends MultiTenantSpringLiquibase {

    private ResourceLoader resourceLoader;

    public XmMultiTenantSpringLiquibase() {
        super();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        if (getDataSource() == null && getSchemas() == null) {
            super.afterPropertiesSet();
        } else {
            if (getDataSource() == null && getSchemas() != null) {
                throw new LiquibaseException("When schemas are defined you should also define a base dataSource");
            }

            if (getDataSource() != null) {
                log.info("Schema based multitenancy enabled");
                if (CollectionUtils.isEmpty(getSchemas())) {
                    log.warn("Schemas not defined, using defaultSchema only");
                    setSchemas(new ArrayList<>());
                    getSchemas().add(getDefaultSchema());
                }

                runOnAllSchemasXm();
            }
        }
    }

    private void runOnAllSchemasXm() throws LiquibaseException {

        for (String schema : getSchemas()) {
            if (schema.equals("default")) {
                schema = null;
            }

            log.info("Initializing Liquibase for schema {}", schema);
            try {
                SpringLiquibase liquibase = getXmSpringLiquibase(getDataSource());
                liquibase.setDefaultSchema(schema);
                liquibase.afterPropertiesSet();
                log.info("Liquibase run for schema {}", schema);
            } catch (Exception e) {
                log.error("Failed to initialize Liquibase for schema {}", schema, e);
            }
        }

    }

    private SpringLiquibase getXmSpringLiquibase(DataSource dataSource) {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setChangeLog(getChangeLog());
        liquibase.setChangeLogParameters(getParameters());
        liquibase.setContexts(getContexts());
        liquibase.setLabels(getLabels());
        liquibase.setDropFirst(isDropFirst());
        liquibase.setShouldRun(isShouldRun());
        liquibase.setRollbackFile(getRollbackFile());
        liquibase.setResourceLoader(getResourceLoader());
        liquibase.setDataSource(dataSource);
        liquibase.setDefaultSchema(getDefaultSchema());
        return liquibase;
    }

    private  ResourceLoader getResourceLoader() {
        return resourceLoader;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        super.setResourceLoader(resourceLoader);
        this.resourceLoader = resourceLoader;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy