From d293df6617c709a68bb8aa0c45d679c01861b5e6 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 28 Apr 2023 11:25:12 +0100 Subject: [PATCH] Derive FlywayConnectionDetails from JdbcConnectionDetails Rather than implementing factories for FlywayConnectionDetails for each supported SQL database, we instead use a factory to takes JdbcConnectionDetails as a source and produces FlywayConnectionDetails. Closes gh-35138 --- ...ServiceConnectionsApplicationListener.java | 9 ++- ...daptingFlywayConnectionDetailsFactory.java | 59 +++++++++++++++++++ .../connection/flyway/package-info.java | 20 +++++++ .../main/resources/META-INF/spring.factories | 4 +- ...nectionDetailsFactoryIntegrationTests.java | 45 ++++++++++++++ .../connection/flyway/flyway-compose.yaml | 9 +++ 6 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/flyway/JdbcAdaptingFlywayConnectionDetailsFactory.java create mode 100644 spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/flyway/package-info.java create mode 100644 spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/flyway/JdbcAdaptingFlywayConnectionDetailsFactoryIntegrationTests.java create mode 100644 spring-boot-project/spring-boot-docker-compose/src/test/resources/org/springframework/boot/docker/compose/service/connection/flyway/flyway-compose.yaml diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/DockerComposeServiceConnectionsApplicationListener.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/DockerComposeServiceConnectionsApplicationListener.java index 93338c8eed..03efb04de0 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/DockerComposeServiceConnectionsApplicationListener.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/DockerComposeServiceConnectionsApplicationListener.java @@ -65,9 +65,12 @@ class DockerComposeServiceConnectionsApplicationListener private void registerConnectionDetails(BeanDefinitionRegistry registry, List runningServices) { for (RunningService runningService : runningServices) { DockerComposeConnectionSource source = new DockerComposeConnectionSource(runningService); - this.factories.getConnectionDetails(source, false) - .forEach((connectionDetailsType, connectionDetails) -> register(registry, runningService, - connectionDetailsType, connectionDetails)); + this.factories.getConnectionDetails(source, false).forEach((connectionDetailsType, connectionDetails) -> { + register(registry, runningService, connectionDetailsType, connectionDetails); + this.factories.getConnectionDetails(connectionDetails, false) + .forEach((adaptedType, adaptedDetails) -> register(registry, runningService, adaptedType, + adaptedDetails)); + }); } } diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/flyway/JdbcAdaptingFlywayConnectionDetailsFactory.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/flyway/JdbcAdaptingFlywayConnectionDetailsFactory.java new file mode 100644 index 0000000000..c3e5f122f7 --- /dev/null +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/flyway/JdbcAdaptingFlywayConnectionDetailsFactory.java @@ -0,0 +1,59 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.docker.compose.service.connection.flyway; + +import org.springframework.boot.autoconfigure.flyway.FlywayConnectionDetails; +import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails; +import org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory; + +/** + * {@link ConnectionDetailsFactory} that produces {@link FlywayConnectionDetails} by + * adapting {@link JdbcConnectionDetails}. + * + * @author Andy Wilkinson + */ +class JdbcAdaptingFlywayConnectionDetailsFactory + implements ConnectionDetailsFactory { + + @Override + public FlywayConnectionDetails getConnectionDetails(JdbcConnectionDetails input) { + return new FlywayConnectionDetails() { + + @Override + public String getUsername() { + return input.getUsername(); + } + + @Override + public String getPassword() { + return input.getPassword(); + } + + @Override + public String getJdbcUrl() { + return input.getJdbcUrl(); + } + + @Override + public String getDriverClassName() { + return input.getDriverClassName(); + } + + }; + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/flyway/package-info.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/flyway/package-info.java new file mode 100644 index 0000000000..11d3a5d149 --- /dev/null +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/flyway/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Auto-configuration for docker compose Flyway service connections. + */ +package org.springframework.boot.docker.compose.service.connection.flyway; diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-docker-compose/src/main/resources/META-INF/spring.factories index 8459f612d2..0629fa3c78 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot-docker-compose/src/main/resources/META-INF/spring.factories @@ -3,10 +3,11 @@ org.springframework.context.ApplicationListener=\ org.springframework.boot.docker.compose.lifecycle.DockerComposeListener,\ org.springframework.boot.docker.compose.service.connection.DockerComposeServiceConnectionsApplicationListener -# Connection Detail Factories +# Connection Details Factories org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory=\ org.springframework.boot.docker.compose.service.connection.cassandra.CassandraDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.elasticsearch.ElasticsearchDockerComposeConnectionDetailsFactory,\ +org.springframework.boot.docker.compose.service.connection.flyway.JdbcAdaptingFlywayConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.mariadb.MariaDbJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.mariadb.MariaDbR2dbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.mongo.MongoDockerComposeConnectionDetailsFactory,\ @@ -21,3 +22,4 @@ org.springframework.boot.docker.compose.service.connection.redis.RedisDockerComp org.springframework.boot.docker.compose.service.connection.sqlserver.SqlServerJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.sqlserver.SqlServerR2dbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.zipkin.ZipkinDockerComposeConnectionDetailsFactory + diff --git a/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/flyway/JdbcAdaptingFlywayConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/flyway/JdbcAdaptingFlywayConnectionDetailsFactoryIntegrationTests.java new file mode 100644 index 0000000000..16bfb98cf9 --- /dev/null +++ b/spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/flyway/JdbcAdaptingFlywayConnectionDetailsFactoryIntegrationTests.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.docker.compose.service.connection.flyway; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.flyway.FlywayConnectionDetails; +import org.springframework.boot.docker.compose.service.connection.test.AbstractDockerComposeIntegrationTests; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for {@link JdbcAdaptingFlywayConnectionDetailsFactory}. + * + * @author Andy Wilkinson + */ +class JdbcAdaptingFlywayConnectionDetailsFactoryIntegrationTests extends AbstractDockerComposeIntegrationTests { + + JdbcAdaptingFlywayConnectionDetailsFactoryIntegrationTests() { + super("flyway-compose.yaml"); + } + + @Test + void runCreatesConnectionDetails() { + FlywayConnectionDetails connectionDetails = run(FlywayConnectionDetails.class); + assertThat(connectionDetails.getUsername()).isEqualTo("myuser"); + assertThat(connectionDetails.getPassword()).isEqualTo("secret"); + assertThat(connectionDetails.getJdbcUrl()).startsWith("jdbc:postgresql://").endsWith("/mydatabase"); + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose/src/test/resources/org/springframework/boot/docker/compose/service/connection/flyway/flyway-compose.yaml b/spring-boot-project/spring-boot-docker-compose/src/test/resources/org/springframework/boot/docker/compose/service/connection/flyway/flyway-compose.yaml new file mode 100644 index 0000000000..5f781d980f --- /dev/null +++ b/spring-boot-project/spring-boot-docker-compose/src/test/resources/org/springframework/boot/docker/compose/service/connection/flyway/flyway-compose.yaml @@ -0,0 +1,9 @@ +services: + database: + image: 'postgres:15.2' + ports: + - '5432' + environment: + - 'POSTGRES_USER=myuser' + - 'POSTGRES_DB=mydatabase' + - 'POSTGRES_PASSWORD=secret'