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

io.dropwizard.flyway.cli.AbstractFlywayCommand Maven / Gradle / Ivy

package io.dropwizard.flyway.cli;

import io.dropwizard.core.Configuration;
import io.dropwizard.core.cli.ConfiguredCommand;
import io.dropwizard.core.setup.Bootstrap;
import io.dropwizard.db.DatabaseConfiguration;
import io.dropwizard.db.PooledDataSourceFactory;
import io.dropwizard.flyway.FlywayConfiguration;
import io.dropwizard.flyway.FlywayFactory;
import net.sourceforge.argparse4j.inf.Namespace;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.FlywayException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

abstract class AbstractFlywayCommand extends ConfiguredCommand {
    private static final Logger LOG = LoggerFactory.getLogger(AbstractFlywayCommand.class);
    private final DatabaseConfiguration databaseConfiguration;
    private final FlywayConfiguration flywayConfiguration;
    private final Class configurationClass;

    AbstractFlywayCommand(final String name,
                          final String description,
                          final DatabaseConfiguration databaseConfiguration,
                          final FlywayConfiguration flywayConfiguration,
                          final Class configurationClass) {
        super(name, description);
        this.databaseConfiguration = databaseConfiguration;
        this.flywayConfiguration = flywayConfiguration;
        this.configurationClass = configurationClass;
    }

    @Override
    protected Class getConfigurationClass() {
        return configurationClass;
    }

    @Override
    protected void run(final Bootstrap bootstrap, final Namespace namespace, final T configuration) throws Exception {
        final PooledDataSourceFactory datasourceFactory = databaseConfiguration.getDataSourceFactory(configuration);
        final FlywayFactory flywayFactory = flywayConfiguration.getFlywayFactory(configuration);

        // Give subclasses an option to set additional config flags for flyway.
        setAdditionalOptions(flywayFactory, namespace);
        
        final Flyway flyway = flywayFactory.build(datasourceFactory.build(bootstrap.getMetricRegistry(), "Flyway"));

        try {
            run(namespace, flyway);
        } catch (FlywayException e) {
            LOG.error("Error while running database command", e);
            throw e;
        }
    }
    
    protected abstract void setAdditionalOptions(FlywayFactory flywayFactory, Namespace namespace);
    protected abstract void run(final Namespace namespace, final Flyway flyway) throws Exception;
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy