Polish contribution

Closes gh-7004
This commit is contained in:
Stephane Nicoll
2016-10-06 13:28:23 +02:00
parent 7fcb197092
commit 03961e6692
6 changed files with 79 additions and 33 deletions

View File

@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.jdbc;
import java.nio.charset.Charset;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;
import javax.sql.DataSource;
@@ -58,9 +59,9 @@ public class DataSourceProperties
private String name = "testdb";
/**
* If <code>true</code> the database name is randomly generated.
* Generate a random datasource name.
*/
private boolean generateName = false;
private boolean generateUniqueName;
/**
* Fully qualified name of the connection pool implementation to use. By default, it
@@ -153,6 +154,8 @@ public class DataSourceProperties
private Xa xa = new Xa();
private String uniqueName;
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
@@ -188,12 +191,12 @@ public class DataSourceProperties
this.name = name;
}
public boolean isGenerateName() {
return this.generateName;
public boolean isGenerateUniqueName() {
return this.generateUniqueName;
}
public void setGenerateName(boolean generateName) {
this.generateName = generateName;
public void setGenerateUniqueName(boolean generateUniqueName) {
this.generateUniqueName = generateUniqueName;
}
public Class<? extends DataSource> getType() {
@@ -281,7 +284,7 @@ public class DataSourceProperties
if (StringUtils.hasText(this.url)) {
return this.url;
}
String url = this.embeddedDatabaseConnection.getUrl(this.name);
String url = this.embeddedDatabaseConnection.getUrl(determineDatabaseName());
if (!StringUtils.hasText(url)) {
throw new DataSourceBeanCreationException(this.embeddedDatabaseConnection,
this.environment, "url");
@@ -289,6 +292,16 @@ public class DataSourceProperties
return url;
}
private String determineDatabaseName() {
if (this.generateUniqueName) {
if (this.uniqueName == null) {
this.uniqueName = UUID.randomUUID().toString();
}
return this.uniqueName;
}
return this.name;
}
/**
* Return the configured username or {@code null} if none was configured.
* @return the configured username

View File

@@ -55,13 +55,8 @@ public class EmbeddedDataSourceConfiguration implements BeanClassLoaderAware {
public EmbeddedDatabase dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseConnection.get(this.classLoader).getType());
if (this.properties.isGenerateName()) {
builder.generateUniqueName(true);
}
else {
builder.setName(this.properties.getName());
}
this.database = builder.build();
this.database = builder.setName(this.properties.getName())
.generateUniqueName(this.properties.isGenerateUniqueName()).build();
return this.database;
}

View File

@@ -66,6 +66,19 @@ public class DataSourcePropertiesTests {
assertThat(properties.determineUrl()).isEqualTo("jdbc:mysql://mydb");
}
@Test
public void determineUrlWithGenerateUniqueName() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
properties.setGenerateUniqueName(true);
properties.afterPropertiesSet();
assertThat(properties.determineUrl()).isEqualTo(properties.determineUrl());
DataSourceProperties properties2 = new DataSourceProperties();
properties2.setGenerateUniqueName(true);
properties2.afterPropertiesSet();
assertThat(properties.determineUrl()).isNotEqualTo(properties2.determineUrl());
}
@Test
public void determineUsername() throws Exception {
DataSourceProperties properties = new DataSourceProperties();

View File

@@ -19,14 +19,14 @@ package org.springframework.boot.autoconfigure.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.junit.After;
import org.junit.Test;
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.PropertiesPropertySource;
import static org.assertj.core.api.Assertions.assertThat;
@@ -34,32 +34,40 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for {@link EmbeddedDataSourceConfiguration}.
*
* @author Dave Syer
* @author Stephane Nicoll
*/
public class EmbeddedDataSourceConfigurationTests {
private AnnotationConfigApplicationContext context;
@Test
public void testDefaultEmbeddedDatabase() throws Exception {
this.context = new AnnotationConfigApplicationContext();
this.context.register(EmbeddedDataSourceConfiguration.class);
this.context.refresh();
assertThat(this.context.getBean(DataSource.class)).isNotNull();
this.context.close();
@After
public void closeContext() {
if (this.context != null) {
this.context.close();
}
}
@Test
public void generatesUniqueDatabaseName() throws Exception {
Properties myProps = new Properties();
myProps.setProperty("spring.datasource.generate-name", "true");
public void defaultEmbeddedDatabase() {
this.context = load();
assertThat(this.context.getBean(DataSource.class)).isNotNull();
}
this.context = new AnnotationConfigApplicationContext();
this.context.register(EmbeddedDataSourceConfiguration.class);
this.context.getEnvironment().getPropertySources().addFirst(new PropertiesPropertySource("whatever", myProps));
this.context.refresh();
DataSource dataSource = this.context.getBean(DataSource.class);
assertThat(getDatabaseName(dataSource)).isNotEqualToIgnoringCase("testdb");
this.context.close();
@Test
public void generateUniqueName() throws Exception {
this.context = load("spring.datasource.generate-unique-name=true");
AnnotationConfigApplicationContext context2 =
load("spring.datasource.generate-unique-name=true");
try {
DataSource dataSource = this.context.getBean(DataSource.class);
DataSource dataSource2 = context2.getBean(DataSource.class);
assertThat(getDatabaseName(dataSource))
.isNotEqualTo(getDatabaseName(dataSource2));
System.out.println(dataSource2);
}
finally {
context2.close();
}
}
private String getDatabaseName(DataSource dataSource) throws SQLException {
@@ -78,4 +86,12 @@ public class EmbeddedDataSourceConfigurationTests {
}
}
private AnnotationConfigApplicationContext load(String... environment) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
EnvironmentTestUtils.addEnvironment(ctx, environment);
ctx.register(EmbeddedDataSourceConfiguration.class);
ctx.refresh();
return ctx;
}
}