Skip to content

Commit 43c4df9

Browse files
committed
#22 fix missing optional dependencies
1 parent d15cd98 commit 43c4df9

9 files changed

+121
-34
lines changed

embedded-database-spring-test/src/main/java/io/zonky/test/db/postgres/EmbeddedPostgresContextCustomizerFactory.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.springframework.test.context.ContextCustomizerFactory;
5858
import org.springframework.test.context.MergedContextConfiguration;
5959
import org.springframework.util.Assert;
60+
import org.springframework.util.ClassUtils;
6061
import org.springframework.util.ObjectUtils;
6162

6263
import javax.sql.DataSource;
@@ -192,10 +193,19 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) t
192193
ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) registry;
193194

194195
registerBeanIfMissing(registry, "defaultDatabaseProvider", PrefetchingDatabaseProvider.class);
195-
registerBeanIfMissing(registry, "dockerPostgresProvider", DockerPostgresDatabaseProvider.class);
196-
registerBeanIfMissing(registry, "zonkyPostgresProvider", ZonkyPostgresDatabaseProvider.class);
197-
registerBeanIfMissing(registry, "openTablePostgresProvider", OpenTablePostgresDatabaseProvider.class);
198-
registerBeanIfMissing(registry, "yandexPostgresProvider", YandexPostgresDatabaseProvider.class);
196+
197+
if (ClassUtils.isPresent("org.testcontainers.containers.PostgreSQLContainer", null)) {
198+
registerBeanIfMissing(registry, "dockerPostgresProvider", DockerPostgresDatabaseProvider.class);
199+
}
200+
if (ClassUtils.isPresent("io.zonky.test.db.postgres.embedded.EmbeddedPostgres", null)) {
201+
registerBeanIfMissing(registry, "zonkyPostgresProvider", ZonkyPostgresDatabaseProvider.class);
202+
}
203+
if (ClassUtils.isPresent("com.opentable.db.postgres.embedded.EmbeddedPostgres", null)) {
204+
registerBeanIfMissing(registry, "openTablePostgresProvider", OpenTablePostgresDatabaseProvider.class);
205+
}
206+
if (ClassUtils.isPresent("ru.yandex.qatools.embed.postgresql.EmbeddedPostgres", null)) {
207+
registerBeanIfMissing(registry, "yandexPostgresProvider", YandexPostgresDatabaseProvider.class);
208+
}
199209

200210
for (AutoConfigureEmbeddedDatabase databaseAnnotation : databaseAnnotations) {
201211
DatabaseDescriptor databaseDescriptor = resolveDatabaseDescriptor(environment, databaseAnnotation);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright 2019 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.zonky.test.db.provider;
18+
19+
public class MissingDatabaseProviderException extends IllegalStateException {
20+
21+
private final DatabaseDescriptor descriptor;
22+
23+
public MissingDatabaseProviderException(DatabaseDescriptor descriptor) {
24+
this.descriptor = descriptor;
25+
}
26+
27+
public DatabaseDescriptor getDescriptor() {
28+
return descriptor;
29+
}
30+
31+
@Override
32+
public String getMessage() {
33+
return String.format("Missing database provider for descriptor: %s", descriptor);
34+
}
35+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright 2019 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.zonky.test.db.provider;
18+
19+
public class MissingProviderDependencyException extends MissingDatabaseProviderException {
20+
21+
public MissingProviderDependencyException(DatabaseDescriptor descriptor) {
22+
super(descriptor);
23+
}
24+
25+
@Override
26+
public String getMessage() {
27+
ProviderType providerType = getDescriptor().getProviderType();
28+
String dependencyInfo = providerType.getDependencyInfo();
29+
30+
if (dependencyInfo != null) {
31+
return String.format("You must add the following Maven dependency: '%s'", dependencyInfo);
32+
} else {
33+
return String.format("You must add a Maven dependency for '%s' provider", providerType);
34+
}
35+
}
36+
}

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/ProviderType.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,42 @@
1919
import org.springframework.util.Assert;
2020

2121
import java.util.Objects;
22+
import java.util.stream.Stream;
2223

2324
public final class ProviderType {
2425

25-
public static final ProviderType DOCKER = ProviderType.valueOf("docker");
26-
public static final ProviderType ZONKY = ProviderType.valueOf("zonky");
27-
public static final ProviderType OPENTABLE = ProviderType.valueOf("opentable");
28-
public static final ProviderType YANDEX = ProviderType.valueOf("yandex");
26+
public static final ProviderType DOCKER = new ProviderType("docker", "org.testcontainers:postgresql");
27+
public static final ProviderType ZONKY = new ProviderType("zonky", "io.zonky.test:embedded-postgres");
28+
public static final ProviderType OPENTABLE = new ProviderType("opentable", "com.opentable.components:otj-pg-embedded");
29+
public static final ProviderType YANDEX = new ProviderType("yandex", "ru.yandex.qatools.embed:postgresql-embedded");
2930

3031
private final String name;
32+
private final String dependency;
3133

3234
public static ProviderType valueOf(String name) {
3335
Assert.notNull(name, "Provider name must not be null");
34-
return new ProviderType(name.toLowerCase());
36+
return Stream.of(DOCKER, ZONKY, OPENTABLE, YANDEX)
37+
.filter(type -> type.name().equals(name.toLowerCase()))
38+
.findFirst().orElse(new ProviderType(name.toLowerCase()));
3539
}
3640

3741
private ProviderType(String name) {
42+
this(name, null);
43+
}
44+
45+
private ProviderType(String name, String dependency) {
3846
this.name = name;
47+
this.dependency = dependency;
3948
}
4049

4150
public String name() {
4251
return name;
4352
}
4453

54+
String getDependencyInfo() {
55+
return dependency;
56+
}
57+
4558
@Override
4659
public boolean equals(Object o) {
4760
if (this == o) return true;

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/impl/DockerPostgresDatabaseProvider.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,7 @@ public class DockerPostgresDatabaseProvider implements DatabaseProvider {
6060
private static final LoadingCache<DatabaseConfig, DatabaseInstance> databases = CacheBuilder.newBuilder()
6161
.build(new CacheLoader<DatabaseConfig, DatabaseInstance>() {
6262
public DatabaseInstance load(DatabaseConfig config) {
63-
try {
64-
return new DatabaseInstance(config);
65-
} catch (NoClassDefFoundError e) {
66-
logger.error("\n\nHINT: You may have to add org.testcontainers:postgresql dependency!!!\n");
67-
throw e;
68-
}
63+
return new DatabaseInstance(config);
6964
}
7065
});
7166

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/impl/OpenTablePostgresDatabaseProvider.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,7 @@ public class OpenTablePostgresDatabaseProvider implements DatabaseProvider {
6060
private static final LoadingCache<DatabaseConfig, DatabaseInstance> databases = CacheBuilder.newBuilder()
6161
.build(new CacheLoader<DatabaseConfig, DatabaseInstance>() {
6262
public DatabaseInstance load(DatabaseConfig config) throws IOException {
63-
try {
64-
return new DatabaseInstance(config);
65-
} catch (NoClassDefFoundError e) {
66-
logger.error("\n\nHINT: You may have to add com.opentable.components:otj-pg-embedded dependency!!!\n");
67-
throw e;
68-
}
63+
return new DatabaseInstance(config);
6964
}
7065
});
7166

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/impl/PrefetchingDatabaseProvider.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import io.zonky.test.db.provider.DatabasePreparer;
2424
import io.zonky.test.db.provider.DatabaseProvider;
2525
import io.zonky.test.db.provider.GenericDatabaseProvider;
26+
import io.zonky.test.db.provider.MissingDatabaseProviderException;
27+
import io.zonky.test.db.provider.MissingProviderDependencyException;
2628
import org.slf4j.Logger;
2729
import org.slf4j.LoggerFactory;
2830
import org.springframework.beans.factory.ObjectProvider;
@@ -92,7 +94,7 @@ public DataSource getDatabase(DatabasePreparer preparer, DatabaseDescriptor desc
9294

9395
DatabaseProvider provider = databaseProviders.get(descriptor);
9496
if (provider == null) {
95-
throw new IllegalStateException(String.format("Missing database provider for descriptor: %s", descriptor));
97+
throw missingDatabaseProviderException(descriptor);
9698
}
9799

98100
PipelineKey key = new PipelineKey(preparer, descriptor, provider);
@@ -126,6 +128,17 @@ public DataSource getDatabase(DatabasePreparer preparer, DatabaseDescriptor desc
126128
return dataSource;
127129
}
128130

131+
protected MissingDatabaseProviderException missingDatabaseProviderException(DatabaseDescriptor descriptor) {
132+
boolean isProviderPresent = databaseProviders.keySet().stream()
133+
.map(DatabaseDescriptor::getProviderType)
134+
.anyMatch(p -> p.equals(descriptor.getProviderType()));
135+
if (isProviderPresent) {
136+
return new MissingDatabaseProviderException(descriptor);
137+
} else {
138+
return new MissingProviderDependencyException(descriptor);
139+
}
140+
}
141+
129142
private ListenableFutureTask<DataSource> prepareDatabase(PipelineKey key, int priority) {
130143
PrefetchingTask task = new PrefetchingTask(key.provider, key.preparer, priority);
131144
DatabasePipeline pipeline = pipelines.get(key);

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/impl/YandexPostgresDatabaseProvider.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,7 @@ public class YandexPostgresDatabaseProvider implements DatabaseProvider {
6464
private static final LoadingCache<DatabaseConfig, DatabaseInstance> databases = CacheBuilder.newBuilder()
6565
.build(new CacheLoader<DatabaseConfig, DatabaseInstance>() {
6666
public DatabaseInstance load(DatabaseConfig config) throws IOException {
67-
try {
68-
return new DatabaseInstance(config);
69-
} catch (NoClassDefFoundError e) {
70-
logger.error("\n\nHINT: You may have to add ru.yandex.qatools.embed:postgresql-embedded dependency!!!\n");
71-
throw e;
72-
}
67+
return new DatabaseInstance(config);
7368
}
7469
});
7570

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/impl/ZonkyPostgresDatabaseProvider.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,7 @@ public class ZonkyPostgresDatabaseProvider implements DatabaseProvider {
6060
private static final LoadingCache<DatabaseConfig, DatabaseInstance> databases = CacheBuilder.newBuilder()
6161
.build(new CacheLoader<DatabaseConfig, DatabaseInstance>() {
6262
public DatabaseInstance load(DatabaseConfig config) throws IOException {
63-
try {
64-
return new DatabaseInstance(config);
65-
} catch (NoClassDefFoundError e) {
66-
logger.error("\n\nHINT: You may have to add io.zonky.test:embedded-postgres dependency!!!\n");
67-
throw e;
68-
}
63+
return new DatabaseInstance(config);
6964
}
7065
});
7166

0 commit comments

Comments
 (0)