package net.lr.tutorial.db.migration;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.ops4j.pax.jdbc.hook.PreHook;
import org.osgi.service.component.annotations.Component;
import liquibase.Contexts;
import liquibase.LabelExpression;
import liquibase.Liquibase;
import liquibase.database.Database;
import liquibase.database.DatabaseConnection;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.DatabaseException;
import liquibase.exception.LiquibaseException;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.resource.ResourceAccessor;
@Component(property="name=mydb")
public class Migrator implements PreHook {
private String changeLog = "changesets.xml";
private String tag;
@Override
public void prepare(DataSource ds) throws SQLException {
try (Connection connection = ds.getConnection()) {
prepare(connection);
} catch (LiquibaseException e) {
throw new RuntimeException(e);
}
}
private void prepare(Connection connection) throws DatabaseException, LiquibaseException {
DatabaseConnection databaseConnection = new JdbcConnection(connection);
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(databaseConnection);
ClassLoader classLoader = this.getClass().getClassLoader();
ResourceAccessor resourceAccessor = new ClassLoaderResourceAccessor(classLoader);
Liquibase liquibase = new Liquibase(changeLog, resourceAccessor, database);
liquibase.update(tag, new Contexts(), new LabelExpression());
}
public void setChangeLog(String changeLog) {
this.changeLog = changeLog;
}
public void setTag(String tag) {
this.tag = tag;
}
}