Package cn.dreampie.common.plugin.db

Source Code of cn.dreampie.common.plugin.db.FlywayPlugin

package cn.dreampie.common.plugin.db;

import com.google.common.collect.Maps;
import com.jfinal.plugin.IPlugin;
import org.apache.commons.lang3.StringUtils;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.MigrationInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Map;

/**
* Created by wangrenhui on 14-4-21.
*/
public class FlywayPlugin implements IPlugin {

  private Logger logger = LoggerFactory.getLogger(getClass());

  private String flywayPrefixToMigrationScript = "/db/migration/";


  private DbConfig dbConfig;

  public FlywayPlugin() {
    dbConfig = new DbConfig();
  }

  public FlywayPlugin(String config) {
    dbConfig = new DbConfig(config);
  }


  @Override
  public boolean start() {
    List<String> dbNames = dbConfig.getAllDbNames();
    boolean dev = dbConfig.isDev();
    for (String dbName : dbNames) {
      boolean auto = dbConfig.migrateAuto(dbName);
      if (dev || auto) {
        migrateAutomatically(dbName);
      } else {
        checkState(dbName);
      }
    }
    logger.info("flyway inited!");
    return true;
  }

  @Override
  public boolean stop() {
    List<String> dbNames = dbConfig.getAllDbNames();
    for (String dbName : dbNames) {
      cleanAutomatically(dbName);
    }
    logger.info("flyway stoped!");
    return true;
  }

  private Map<String, Flyway> flyways() {
    Map<String, Flyway> flywayMap = Maps.newHashMap();
    Map<String, DbSource> dbSourceMap = dbConfig.getAllDbSources();
    DbSource dbSource = null;
    String migrationFilesLocation = null;
    Flyway flyway = null;
    for (String dbName : dbSourceMap.keySet()) {
      migrationFilesLocation = flywayPrefixToMigrationScript + dbName;
      if (dbConfig.migrationFileDirectoryExists(migrationFilesLocation)) {
        dbSource = dbSourceMap.get(dbName);
        flyway = new Flyway();
        flyway.setDataSource(dbSource.url, dbSource.user, dbSource.password);
        flyway.setLocations(migrationFilesLocation);
        if (dbConfig.isClean(dbName)) {
          flyway.setCleanOnValidationError(true);
        }
        if (dbConfig.initOnMigrate(dbName)) {
          flyway.setInitOnMigrate(true);
        }
        flywayMap.put(dbName, flyway);
      }
    }
    return flywayMap;
  }

  private void migrateAutomatically(String dbName) {
    Map<String, Flyway> flywayMap = flyways();
    flywayMap.get(dbName).migrate();
  }

  private void cleanAutomatically(String dbName) {
    Map<String, Flyway> flywayMap = flyways();
    flywayMap.get(dbName).clean();
  }

  private void checkState(String dbName) {
    Map<String, Flyway> flywayMap = flyways();

    MigrationInfo[] pendingMigrations = flywayMap.get(dbName).info().pending();

    if (pendingMigrations != null) {
      throw new RuntimeException(dbName + "-" + StringUtils.join(pendingMigrations, ","));
    }
  }
}
TOP

Related Classes of cn.dreampie.common.plugin.db.FlywayPlugin

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.