package com.mossle.core.dbmigrate;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import org.flywaydb.core.Flyway;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class DatabaseMigrator implements ApplicationContextAware {
private static Logger logger = LoggerFactory
.getLogger(DatabaseMigrator.class);
private ApplicationContext applicationContext;
private boolean enabled;
private boolean clean;
private DataSource dataSource;
@PostConstruct
public void init() {
if (!enabled) {
logger.info("skip dbmigrate");
return;
}
long startTime = System.currentTimeMillis();
if (clean) {
logger.info("clean database");
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.clean();
}
Map<String, ModuleSpecification> map = applicationContext
.getBeansOfType(ModuleSpecification.class);
for (ModuleSpecification moduleSpecification : map.values()) {
if (!moduleSpecification.isEnabled()) {
logger.info("skip migrate : {}, {}",
moduleSpecification.getSchemaTable(),
moduleSpecification.getSchemaLocation());
continue;
}
this.doMigrate(moduleSpecification.getSchemaTable(),
moduleSpecification.getSchemaLocation());
if (moduleSpecification.isInitData()) {
this.doMigrate(moduleSpecification.getDataTable(),
moduleSpecification.getDataLocation());
}
}
long endTime = System.currentTimeMillis();
logger.info("dbmigrate cost : {} ms", (endTime - startTime));
}
public void doMigrate(String table, String location) {
logger.info("migrate : {}, {}", table, location);
Flyway flyway = new Flyway();
flyway.setPlaceholderPrefix("$${");
// flyway.setInitOnMigrate(true);
flyway.setBaselineOnMigrate(true);
// flyway.setInitVersion("0");
flyway.setBaselineVersionAsString("0");
flyway.setDataSource(dataSource);
flyway.setTable(table);
flyway.setLocations(new String[] { location });
try {
flyway.repair();
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
flyway.migrate();
}
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public void setClean(boolean clean) {
this.clean = clean;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}