/**
*
*/
package org.minnal.migrations.plugin;
import java.net.URI;
import org.minnal.core.Application;
import org.minnal.core.MinnalException;
import org.minnal.core.Plugin;
import org.minnal.core.config.ApplicationConfiguration;
import org.minnal.core.config.DatabaseConfiguration;
import com.google.common.base.Strings;
import com.googlecode.flyway.core.Flyway;
/**
* @author ganeshs
*
*/
public class MigrationsPlugin implements Plugin {
protected Flyway flyway;
public MigrationsPlugin() {
this(new Flyway());
}
public MigrationsPlugin(Flyway flyway) {
this.flyway = flyway;
this.flyway.setInitOnMigrate(true);
this.flyway.setSchemas("PUBLIC");
}
public void init(Application<? extends ApplicationConfiguration> application) {
DatabaseConfiguration dbConfig = application.getConfiguration().getDatabaseConfiguration();
URI uri = getUri(dbConfig.getUrl());
if (Strings.isNullOrEmpty(uri.getPath())) {
flyway.setDataSource(dbConfig.getUrl(), dbConfig.getUsername(), dbConfig.getPassword());
} else {
flyway.setDataSource(getUrl(uri, false), dbConfig.getUsername(), dbConfig.getPassword());
flyway.setSchemas(uri.getPath().substring(1));
}
flyway.migrate();
}
public void destroy() {
}
private URI getUri(String jdbcUrl) {
if (Strings.isNullOrEmpty(jdbcUrl)) {
throw new MinnalException("Invalid jdbc url");
}
String cleanURI = jdbcUrl.substring(5);
try {
return new URI(cleanURI);
} catch (Exception e) {
throw new MinnalException("Invalid jdbc url");
}
}
private String getUrl(URI uri, boolean includeSchema) {
StringBuffer buffer = new StringBuffer();
buffer.append("jdbc:");
buffer.append(uri.getScheme());
buffer.append(":");
if (! Strings.isNullOrEmpty(uri.getHost())) {
buffer.append("//").append(uri.getHost());
}
if (uri.getPort() > 0) {
buffer.append(":").append(uri.getPort());
}
if (!Strings.isNullOrEmpty(uri.getPath()) && includeSchema) {
buffer.append(uri.getPath());
}
if (Strings.isNullOrEmpty(uri.getPath())) {
buffer.append(".");
}
return buffer.toString();
}
}