Skip to content

Commit

Permalink
Add support for multiple beans in the Flyway and Liquibase endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
eddumelendez committed Aug 13, 2016
1 parent b2420be commit 6df59f4
Show file tree
Hide file tree
Showing 7 changed files with 155 additions and 30 deletions.
Expand Up @@ -184,7 +184,7 @@ static class FlywayEndpointConfiguration {

@Bean
@ConditionalOnMissingBean
public FlywayEndpoint flywayEndpoint(Flyway flyway) {
public FlywayEndpoint flywayEndpoint(List<Flyway> flyway) {
return new FlywayEndpoint(flyway);
}

Expand All @@ -197,7 +197,7 @@ static class LiquibaseEndpointConfiguration {

@Bean
@ConditionalOnMissingBean
public LiquibaseEndpoint liquibaseEndpoint(SpringLiquibase liquibase) {
public LiquibaseEndpoint liquibaseEndpoint(List<SpringLiquibase> liquibase) {
return new LiquibaseEndpoint(liquibase);
}

Expand Down
Expand Up @@ -16,9 +16,13 @@

package org.springframework.boot.actuate.endpoint;

import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.MigrationInfo;
Expand All @@ -38,21 +42,32 @@
* @since 1.3.0
*/
@ConfigurationProperties(prefix = "endpoints.flyway")
public class FlywayEndpoint extends AbstractEndpoint<List<FlywayMigration>> {
public class FlywayEndpoint extends AbstractEndpoint<Map<String, List<FlywayMigration>>> {

private final Flyway flyway;
private final List<Flyway> flyway;

public FlywayEndpoint(Flyway flyway) {
public FlywayEndpoint(List<Flyway> flyway) {
super("flyway");
Assert.notNull(flyway, "Flyway must not be null");
this.flyway = flyway;
}

@Override
public List<FlywayMigration> invoke() {
List<FlywayMigration> migrations = new ArrayList<FlywayMigration>();
for (MigrationInfo info : this.flyway.info().all()) {
migrations.add(new FlywayMigration(info));
public Map<String, List<FlywayMigration>> invoke() {
Map<String, List<FlywayMigration>> migrations = new HashMap<String, List<FlywayMigration>>();
for (Flyway flyway : this.flyway) {
try {
DatabaseMetaData metaData = flyway.getDataSource().getConnection().getMetaData();

List<FlywayMigration> migration = new ArrayList<FlywayMigration>();
for (MigrationInfo info : flyway.info().all()) {
migration.add(new FlywayMigration(info));
}
migrations.put(metaData.getURL(), migration);
}
catch (SQLException e) {
//Continue
}
}
return migrations;
}
Expand Down
Expand Up @@ -16,6 +16,9 @@

package org.springframework.boot.actuate.endpoint;

import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

Expand All @@ -25,6 +28,7 @@
import liquibase.database.Database;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.DatabaseException;
import liquibase.integration.spring.SpringLiquibase;

import org.springframework.boot.context.properties.ConfigurationProperties;
Expand All @@ -37,34 +41,45 @@
* @since 1.3.0
*/
@ConfigurationProperties(prefix = "endpoints.liquibase")
public class LiquibaseEndpoint extends AbstractEndpoint<List<Map<String, ?>>> {
public class LiquibaseEndpoint extends AbstractEndpoint<Map<String, List<Map<String, ?>>>> {

private final SpringLiquibase liquibase;
private final List<SpringLiquibase> liquibase;

public LiquibaseEndpoint(SpringLiquibase liquibase) {
public LiquibaseEndpoint(List<SpringLiquibase> liquibase) {
super("liquibase");
Assert.notNull(liquibase, "Liquibase must not be null");
this.liquibase = liquibase;
}

@Override
public List<Map<String, ?>> invoke() {
StandardChangeLogHistoryService service = new StandardChangeLogHistoryService();
try {
DatabaseFactory factory = DatabaseFactory.getInstance();
DataSource dataSource = this.liquibase.getDataSource();
JdbcConnection connection = new JdbcConnection(dataSource.getConnection());
public Map<String, List<Map<String, ?>>> invoke() {
Map<String, List<Map<String, ?>>> services = new HashMap<String, List<Map<String, ?>>>();

for (SpringLiquibase liquibase : this.liquibase) {
StandardChangeLogHistoryService service = new StandardChangeLogHistoryService();
try {
Database database = factory.findCorrectDatabaseImplementation(connection);
return service.queryDatabaseChangeLogTable(database);
DatabaseMetaData metaData = liquibase.getDataSource().getConnection().getMetaData();
try {
DatabaseFactory factory = DatabaseFactory.getInstance();
DataSource dataSource = liquibase.getDataSource();
JdbcConnection connection = new JdbcConnection(dataSource.getConnection());
try {
Database database = factory.findCorrectDatabaseImplementation(connection);
services.put(metaData.getURL(), service.queryDatabaseChangeLogTable(database));
}
finally {
connection.close();
}
}
catch (DatabaseException ex) {
throw new IllegalStateException("Unable to get Liquibase changelog", ex);
}
}
finally {
connection.close();
catch (SQLException e) {
//Continue
}
}
catch (Exception ex) {
throw new IllegalStateException("Unable to get Liquibase changelog", ex);
}
return services;
}

}
Expand Up @@ -23,6 +23,10 @@
import java.util.Map;
import java.util.Properties;

import javax.sql.DataSource;

import liquibase.integration.spring.SpringLiquibase;
import org.flywaydb.core.Flyway;
import org.junit.After;
import org.junit.Test;

Expand All @@ -47,6 +51,7 @@
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
import org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration;
import org.springframework.boot.autoconfigure.info.ProjectInfoProperties;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
import org.springframework.boot.bind.PropertySourcesBinder;
Expand Down Expand Up @@ -206,6 +211,20 @@ public void testFlywayEndpoint() {
assertThat(endpoint.invoke()).hasSize(1);
}

@Test
public void testTwoFlywayEndpoint() {
this.context = new AnnotationConfigApplicationContext();
this.context.register(EmbeddedDataSourceConfiguration.class,
FlywayConfig.class, FlywayAutoConfiguration.class,
EndpointAutoConfiguration.class);
this.context.refresh();
String[] flywayBeans = this.context.getBeanNamesForType(Flyway.class);
assertThat(flywayBeans).hasSize(2);
FlywayEndpoint endpoint = this.context.getBean(FlywayEndpoint.class);
assertThat(endpoint).isNotNull();
assertThat(endpoint.invoke()).hasSize(2);
}

@Test
public void testLiquibaseEndpoint() {
this.context = new AnnotationConfigApplicationContext();
Expand All @@ -217,6 +236,20 @@ public void testLiquibaseEndpoint() {
assertThat(endpoint.invoke()).hasSize(1);
}

@Test
public void testTwoLiquibaseEndpoint() {
this.context = new AnnotationConfigApplicationContext();
this.context.register(EmbeddedDataSourceConfiguration.class,
LiquibaseConfig.class, LiquibaseAutoConfiguration.class,
EndpointAutoConfiguration.class);
this.context.refresh();
String[] liquibaseBeans = this.context.getBeanNamesForType(SpringLiquibase.class);
assertThat(liquibaseBeans).hasSize(2);
LiquibaseEndpoint endpoint = this.context.getBean(LiquibaseEndpoint.class);
assertThat(endpoint).isNotNull();
assertThat(endpoint.invoke()).hasSize(2);
}

private void load(Class<?>... config) {
this.context = new AnnotationConfigApplicationContext();
this.context.register(config);
Expand Down Expand Up @@ -287,4 +320,60 @@ public void contribute(Info.Builder builder) {

}

static class DataSourceConfig {

@Bean
public DataSource customDataSource() {
return DataSourceBuilder.create().url("jdbc:hsqldb:mem:changelogdbtest")
.username("sa").build();
}

@Bean
public DataSource customDataSource2() {
return DataSourceBuilder.create().url("jdbc:hsqldb:mem:changelogdbtest2")
.username("sa").build();
}

}

@Configuration
static class LiquibaseConfig extends DataSourceConfig {

@Bean
public SpringLiquibase customLiquibase() {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setChangeLog("classpath:/db/changelog/db.changelog-master.yaml");
liquibase.setDataSource(customDataSource());
return liquibase;
}

@Bean
public SpringLiquibase customLiquibase2() {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setChangeLog("classpath:/db/changelog/db.changelog-master.yaml");
liquibase.setDataSource(customDataSource2());
return liquibase;
}

}

@Configuration
static class FlywayConfig extends DataSourceConfig {

@Bean
public Flyway customFlyway() {
Flyway flyway = new Flyway();
flyway.setDataSource(customDataSource());
return flyway;
}

@Bean
public Flyway customFlyway2() {
Flyway flyway = new Flyway();
flyway.setDataSource(customDataSource2());
return flyway;
}

}

}
Expand Up @@ -16,6 +16,8 @@

package org.springframework.boot.actuate.autoconfigure;

import java.util.Arrays;

import liquibase.integration.spring.SpringLiquibase;
import org.flywaydb.core.Flyway;
import org.junit.After;
Expand Down Expand Up @@ -153,12 +155,12 @@ public ConditionEvaluationReport conditionEvaluationReport(

@Bean
public FlywayEndpoint flyway() {
return new FlywayEndpoint(new Flyway());
return new FlywayEndpoint(Arrays.asList(new Flyway()));
}

@Bean
public LiquibaseEndpoint liquibase() {
return new LiquibaseEndpoint(new SpringLiquibase());
return new LiquibaseEndpoint(Arrays.asList(new SpringLiquibase()));
}

@Bean
Expand Down
Expand Up @@ -16,6 +16,8 @@

package org.springframework.boot.actuate.endpoint;

import java.util.List;

import org.flywaydb.core.Flyway;
import org.junit.Test;

Expand Down Expand Up @@ -48,7 +50,7 @@ public void invoke() throws Exception {
public static class Config {

@Bean
public FlywayEndpoint endpoint(Flyway flyway) {
public FlywayEndpoint endpoint(List<Flyway> flyway) {
return new FlywayEndpoint(flyway);
}

Expand Down
Expand Up @@ -16,6 +16,8 @@

package org.springframework.boot.actuate.endpoint;

import java.util.List;

import liquibase.integration.spring.SpringLiquibase;
import org.junit.Test;

Expand Down Expand Up @@ -48,9 +50,9 @@ public void invoke() throws Exception {
@Import({ EmbeddedDataSourceConfiguration.class, LiquibaseAutoConfiguration.class })
public static class Config {

private final SpringLiquibase liquibase;
private final List<SpringLiquibase> liquibase;

public Config(SpringLiquibase liquibase) {
public Config(List<SpringLiquibase> liquibase) {
this.liquibase = liquibase;
}

Expand Down

0 comments on commit 6df59f4

Please sign in to comment.