Merge branch '1.5.x'

This commit is contained in:
Stephane Nicoll
2017-03-02 12:13:51 +01:00
5 changed files with 115 additions and 47 deletions

View File

@@ -54,15 +54,45 @@ public class MongoClientFactory {
}
/**
* Creates a {@link MongoClient} using the given {@code options}. If the configured
* port is zero, the value of the {@code local.mongo.port} property is used to
* configure the client.
* Creates a {@link MongoClient} using the given {@code options}. If the environment
* contains a {@code local.mongo.port} property, it is used to configure a client
* to an embedded MongoDB instance.
* @param options the options
* @return the Mongo client
* @throws UnknownHostException if the configured host is unknown
*/
public MongoClient createMongoClient(MongoClientOptions options)
throws UnknownHostException {
Integer embeddedPort = getEmbeddedPort();
if (embeddedPort != null) {
return createEmbeddedMongoClient(options, embeddedPort);
}
return createNetworkMongoClient(options);
}
private Integer getEmbeddedPort() {
if (this.environment != null) {
String localPort = this.environment.getProperty("local.mongo.port");
if (localPort != null) {
return Integer.valueOf(localPort);
}
}
return null;
}
private MongoClient createEmbeddedMongoClient(MongoClientOptions options, int port) {
if (options == null) {
options = MongoClientOptions.builder().build();
}
String host = this.properties.getHost() == null ? "localhost"
: this.properties.getHost();
return new MongoClient(
Collections.singletonList(new ServerAddress(host, port)),
Collections.emptyList(), options);
}
private MongoClient createNetworkMongoClient(MongoClientOptions options)
throws UnknownHostException {
if (hasCustomAddress() || hasCustomCredentials()) {
if (this.properties.getUri() != null) {
@@ -83,7 +113,8 @@ public class MongoClientFactory {
}
String host = this.properties.getHost() == null ? "localhost"
: this.properties.getHost();
int port = determinePort();
int port = this.properties.getPort() != null ? this.properties.getPort()
: MongoProperties.DEFAULT_PORT;
return new MongoClient(
Collections.singletonList(new ServerAddress(host, port)),
credentials, options);
@@ -102,24 +133,6 @@ public class MongoClientFactory {
&& this.properties.getPassword() != null;
}
private int determinePort() {
if (this.properties.getPort() == null) {
return MongoProperties.DEFAULT_PORT;
}
if (this.properties.getPort() == 0) {
if (this.environment != null) {
String localPort = this.environment.getProperty("local.mongo.port");
if (localPort != null) {
return Integer.valueOf(localPort);
}
}
throw new IllegalStateException(
"spring.data.mongodb.port=0 and no local mongo port configuration "
+ "is available");
}
return this.properties.getPort();
}
private Builder builder(MongoClientOptions options) {
if (options != null) {
return MongoClientOptions.builder(options);

View File

@@ -55,13 +55,43 @@ public class ReactiveMongoClientFactory {
}
/**
* Creates a {@link MongoClient} using the given {@code options}. If the configured
* port is zero, the value of the {@code local.mongo.port} property is used to
* configure the client.
* Creates a {@link MongoClient} using the given {@code settings}. If the environment
* contains a {@code local.mongo.port} property, it is used to configure a client
* to an embedded MongoDB instance.
* @param settings the settings
* @return the Mongo client
*/
public MongoClient createMongoClient(MongoClientSettings settings) {
Integer embeddedPort = getEmbeddedPort();
if (embeddedPort != null) {
return createEmbeddedMongoClient(settings, embeddedPort);
}
return createNetworkMongoClient(settings);
}
private Integer getEmbeddedPort() {
if (this.environment != null) {
String localPort = this.environment.getProperty("local.mongo.port");
if (localPort != null) {
return Integer.valueOf(localPort);
}
}
return null;
}
private MongoClient createEmbeddedMongoClient(MongoClientSettings settings,
int port) {
Builder builder = builder(settings);
String host = this.properties.getHost() == null ? "localhost"
: this.properties.getHost();
ClusterSettings clusterSettings = ClusterSettings.builder()
.hosts(Collections.singletonList(new ServerAddress(host, port)))
.build();
builder.clusterSettings(clusterSettings);
return MongoClients.create(builder.build());
}
private MongoClient createNetworkMongoClient(MongoClientSettings settings) {
if (hasCustomAddress() || hasCustomCredentials()) {
if (this.properties.getUri() != null) {
throw new IllegalStateException("Invalid mongo configuration, "
@@ -81,7 +111,8 @@ public class ReactiveMongoClientFactory {
}
String host = this.properties.getHost() == null ? "localhost"
: this.properties.getHost();
int port = determinePort();
int port = this.properties.getPort() != null ? this.properties.getPort()
: MongoProperties.DEFAULT_PORT;
ClusterSettings clusterSettings = ClusterSettings.builder()
.hosts(Collections.singletonList(new ServerAddress(host, port)))
.build();
@@ -136,24 +167,6 @@ public class ReactiveMongoClientFactory {
&& this.properties.getPassword() != null;
}
private int determinePort() {
if (this.properties.getPort() == null) {
return MongoProperties.DEFAULT_PORT;
}
if (this.properties.getPort() == 0) {
if (this.environment != null) {
String localPort = this.environment.getProperty("local.mongo.port");
if (localPort != null) {
return Integer.valueOf(localPort);
}
}
throw new IllegalStateException(
"spring.data.mongodb.port=0 and no local mongo port configuration "
+ "is available");
}
return this.properties.getPort();
}
private Builder builder(MongoClientSettings settings) {
if (settings == null) {
return MongoClientSettings.builder();

View File

@@ -161,7 +161,6 @@ public class EmbeddedMongoAutoConfiguration {
}
private void setEmbeddedPort(int port) {
this.properties.setPort(port);
setPortProperty(this.context, port);
}

View File

@@ -30,6 +30,8 @@ import org.junit.rules.ExpectedException;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.mock.env.MockEnvironment;
import org.springframework.test.util.ReflectionTestUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -47,6 +49,8 @@ public class MongoClientFactoryTests {
@Rule
public ExpectedException thrown = ExpectedException.none();
private MockEnvironment environment = new MockEnvironment();
@Test
public void portCanBeCustomized() throws UnknownHostException {
MongoProperties properties = new MongoProperties();
@@ -138,9 +142,26 @@ public class MongoClientFactoryTests {
createMongoClient(properties);
}
@Test
public void uriIsIgnoredInEmbeddedMode() throws UnknownHostException {
MongoProperties properties = new MongoProperties();
properties.setUri("mongodb://mongo.example.com:1234/mydb");
this.environment.setProperty("local.mongo.port", "4000");
MongoClient client = createMongoClient(properties, this.environment);
List<ServerAddress> allAddresses = extractServerAddresses(client);
assertThat(allAddresses).hasSize(1);
assertServerAddress(allAddresses.get(0), "localhost", 4000);
}
private MongoClient createMongoClient(MongoProperties properties)
throws UnknownHostException {
return new MongoClientFactory(properties, null).createMongoClient(null);
return createMongoClient(properties, null);
}
private MongoClient createMongoClient(MongoProperties properties,
Environment environment)
throws UnknownHostException {
return new MongoClientFactory(properties, environment).createMongoClient(null);
}
private List<ServerAddress> extractServerAddresses(MongoClient client) {

View File

@@ -28,18 +28,24 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.core.env.Environment;
import org.springframework.mock.env.MockEnvironment;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ReactiveMongoClientFactory}.
*
* @author Mark Paluch
* @author Stephane Nicoll
*/
public class ReactiveMongoClientFactoryTests {
@Rule
public ExpectedException thrown = ExpectedException.none();
private MockEnvironment environment = new MockEnvironment();
@Test
public void portCanBeCustomized() throws UnknownHostException {
MongoProperties properties = new MongoProperties();
@@ -131,8 +137,24 @@ public class ReactiveMongoClientFactoryTests {
createMongoClient(properties);
}
@Test
public void uriIsIgnoredInEmbeddedMode() throws UnknownHostException {
MongoProperties properties = new MongoProperties();
properties.setUri("mongodb://mongo.example.com:1234/mydb");
this.environment.setProperty("local.mongo.port", "4000");
MongoClient client = createMongoClient(properties, this.environment);
List<ServerAddress> allAddresses = extractServerAddresses(client);
assertThat(allAddresses).hasSize(1);
assertServerAddress(allAddresses.get(0), "localhost", 4000);
}
private MongoClient createMongoClient(MongoProperties properties) {
return new ReactiveMongoClientFactory(properties, null).createMongoClient(null);
return createMongoClient(properties, this.environment);
}
private MongoClient createMongoClient(MongoProperties properties,
Environment environment) {
return new ReactiveMongoClientFactory(properties, environment).createMongoClient(null);
}
private List<ServerAddress> extractServerAddresses(MongoClient client) {