package net.lr.tutorial.db.service; 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.Liquibase; import liquibase.database.Database; import liquibase.database.DatabaseFactory; import liquibase.database.jvm.JdbcConnection; import liquibase.exception.DatabaseException; import liquibase.exception.LiquibaseException; import liquibase.lockservice.LockServiceFactory; import liquibase.lockservice.StandardLockService; import liquibase.resource.ClassLoaderResourceAccessor; import liquibase.resource.ResourceAccessor; /** * Uses liquibase to apply all changesets from the file db/changesetes.xml to the DataSource. * The PreeHook will be called by pax-jdbc-config before publishing the DataSource. */ @Component(property="name=persondb") public class Migrator implements PreHook { @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 { Database db = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection)); LockServiceFactory.getInstance().register(new StandardLockService()); ClassLoader classLoader = this.getClass().getClassLoader(); ResourceAccessor resourceAccessor = new ClassLoaderResourceAccessor(classLoader); Liquibase liquibase = new Liquibase("db/changesets.xml", resourceAccessor, db); liquibase.update(new Contexts()); } }