Skip to content

Commit 77f207a

Browse files
committed
Simplify BaseUrl code and cache resolved URLs
See gh-47680
1 parent d9fc89b commit 77f207a

File tree

13 files changed

+42
-79
lines changed

13 files changed

+42
-79
lines changed

core/spring-boot-test/src/main/java/org/springframework/boot/test/http/client/BaseUrlUriBuilderFactory.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public static UriBuilderFactory get(@Nullable BaseUrl baseUrl) {
5959

6060
@Override
6161
public UriBuilder uriString(String uriTemplate) {
62-
return createDelegate().uriString(uriTemplate);
62+
return this.baseUrl.getUriBuilderFactory().uriString(uriTemplate);
6363
}
6464

6565
@Override
@@ -69,16 +69,12 @@ public UriBuilder builder() {
6969

7070
@Override
7171
public URI expand(String uriTemplate, Map<String, ?> uriVariables) {
72-
return createDelegate().expand(uriTemplate, uriVariables);
72+
return this.baseUrl.getUriBuilderFactory().expand(uriTemplate, uriVariables);
7373
}
7474

7575
@Override
7676
public URI expand(String uriTemplate, @Nullable Object... uriVariables) {
77-
return createDelegate().expand(uriTemplate, uriVariables);
78-
}
79-
80-
private UriBuilderFactory createDelegate() {
81-
return this.baseUrl.getUriBuilderFactory();
77+
return this.baseUrl.getUriBuilderFactory().expand(uriTemplate, uriVariables);
8278
}
8379

8480
}

core/spring-boot-test/src/main/java/org/springframework/boot/test/http/server/BaseUrl.java

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import org.springframework.util.Assert;
2222
import org.springframework.util.StringUtils;
23+
import org.springframework.util.function.SingletonSupplier;
2324
import org.springframework.web.util.DefaultUriBuilderFactory;
2425
import org.springframework.web.util.UriBuilderFactory;
2526

@@ -30,38 +31,53 @@
3031
* @author Stephane Nicoll
3132
* @since 4.0.0
3233
*/
33-
public interface BaseUrl {
34+
public final class BaseUrl {
3435

3536
/**
36-
* Default base URL suitable for mock environments.
37+
* {@link BaseUrl} that resolves to {@code http://localhost}.
3738
*/
38-
BaseUrl DEFAULT = BaseUrl.of("http://localhost");
39+
public static final BaseUrl LOCALHOST = BaseUrl.of("http://localhost");
40+
41+
private final boolean https;
42+
43+
private final Supplier<String> resolver;
44+
45+
private BaseUrl(boolean https, Supplier<String> resolver) {
46+
this.https = https;
47+
this.resolver = SingletonSupplier.of(resolver);
48+
}
3949

4050
/**
4151
* Return if the URL will ultimately resolve to an HTTPS address.
4252
* @return if the URL is HTTPS
4353
*/
44-
boolean isHttps();
54+
public boolean isHttps() {
55+
return this.https;
56+
}
4557

4658
/**
4759
* Get a {@link UriBuilderFactory} that applies the base URL.
4860
* @return a {@link UriBuilderFactory}
4961
*/
50-
UriBuilderFactory getUriBuilderFactory();
62+
public UriBuilderFactory getUriBuilderFactory() {
63+
return new DefaultUriBuilderFactory(this.resolver.get());
64+
}
5165

5266
/**
5367
* Return a new instance that applies the given {@code path}.
5468
* @param path a path to append
5569
* @return a new instance with the path added
5670
*/
57-
BaseUrl withPath(String path);
71+
public BaseUrl withPath(String path) {
72+
return new BaseUrl(this.https, () -> this.resolver.get() + path);
73+
}
5874

5975
/**
6076
* Factory method to create a new {@link BaseUrl}.
6177
* @param url the URL to use
6278
* @return a new {@link BaseUrl} instance
6379
*/
64-
static BaseUrl of(String url) {
80+
public static BaseUrl of(String url) {
6581
Assert.notNull(url, "'url' must not be null");
6682
return of(StringUtils.startsWithIgnoreCase(url, "https"), () -> url);
6783
}
@@ -72,42 +88,9 @@ static BaseUrl of(String url) {
7288
* @param resolver the resolver used to supply the actual URL
7389
* @return a new {@link BaseUrl} instance
7490
*/
75-
static BaseUrl of(boolean https, Supplier<String> resolver) {
76-
return new DefaultBaseUrl(https, resolver);
77-
}
78-
79-
final class DefaultBaseUrl implements BaseUrl {
80-
81-
private final boolean https;
82-
83-
private final Supplier<String> resolver;
84-
85-
private DefaultBaseUrl(boolean https, Supplier<String> resolver) {
86-
Assert.notNull(resolver, "'resolver' must not be null");
87-
this.https = https;
88-
this.resolver = resolver;
89-
}
90-
91-
@Override
92-
public boolean isHttps() {
93-
return this.https;
94-
}
95-
96-
@Override
97-
public UriBuilderFactory getUriBuilderFactory() {
98-
return new DefaultUriBuilderFactory(resolve());
99-
}
100-
101-
String resolve() {
102-
return this.resolver.get();
103-
}
104-
105-
@Override
106-
public BaseUrl withPath(String path) {
107-
Supplier<String> updatedResolver = () -> this.resolver.get() + path;
108-
return new DefaultBaseUrl(this.https, updatedResolver);
109-
}
110-
91+
public static BaseUrl of(boolean https, Supplier<String> resolver) {
92+
Assert.notNull(resolver, "'resolver' must not be null");
93+
return new BaseUrl(https, resolver);
11194
}
11295

11396
}

core/spring-boot-test/src/main/java/org/springframework/boot/test/http/server/BaseUrlProviders.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,6 @@ public BaseUrlProviders(ApplicationContext applicationContext) {
4747
this.providers = providers;
4848
}
4949

50-
/**
51-
* Return the provided {@link BaseUrl} or {@link BaseUrl#DEFAULT}.
52-
* @return the base URL
53-
*/
54-
public BaseUrl getBaseUrlOrDefault() {
55-
return getBaseUrl(BaseUrl.DEFAULT);
56-
}
57-
5850
/**
5951
* Return the provided {@link BaseUrl} or {@code null}.
6052
* @return the base URL or {@code null}
@@ -75,7 +67,6 @@ public BaseUrl getBaseUrlOrDefault() {
7567
.filter(Objects::nonNull)
7668
.findFirst()
7769
.orElse(fallback);
78-
7970
}
8071

8172
}

core/spring-boot-test/src/test/java/org/springframework/boot/test/http/server/BaseUrlProvidersTests.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,6 @@
3333
*/
3434
class BaseUrlProvidersTests {
3535

36-
@Test
37-
void getBaseUrlOrDefaultWhenNoProvidedBaseUrlReturnsDefault() {
38-
assertThat(new BaseUrlProviders(Collections.emptyList()).getBaseUrlOrDefault()).isSameAs(BaseUrl.DEFAULT);
39-
}
40-
4136
@Test
4237
void getBaseUrlWhenNoProvidedBaseUrlReturnsNull() {
4338
assertThat(new BaseUrlProviders(Collections.emptyList()).getBaseUrl()).isNull();

core/spring-boot-test/src/test/java/org/springframework/boot/test/http/server/BaseUrlTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ void of() {
7070
assertThat(atomicInteger.get()).isZero();
7171
assertThat(baseUrl.isHttps()).isTrue();
7272
assertThat(resolve(baseUrl, "")).isEqualTo("1");
73-
assertThat(resolve(baseUrl, "")).isEqualTo("2");
73+
assertThat(resolve(baseUrl, "")).isEqualTo("1");
7474
}
7575

7676
@Test
@@ -94,7 +94,7 @@ void withPathInvokesParentResolver() {
9494
BaseUrl baseUrl = BaseUrl.of(true, () -> "https://example.com/" + atomicInteger.incrementAndGet());
9595
assertThat(resolve(baseUrl.withPath("/context"), "")).isEqualTo("https://example.com/1/context");
9696
assertThat(resolve(baseUrl.withPath("/context").withPath("/test"), "/path"))
97-
.isEqualTo("https://example.com/2/context/test/path");
97+
.isEqualTo("https://example.com/1/context/test/path");
9898
}
9999

100100
private String resolve(BaseUrl baseUrl, String path) {

module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/autoconfigure/tester/HttpGraphQlTesterAutoConfiguration.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,9 @@ HttpGraphQlTester webTestClientGraphQlTester(ApplicationContext applicationConte
6060
private WebTestClient configureGraphQlWebTestClient(WebTestClient webTestClient, @Nullable BaseUrl baseUrl,
6161
String graphQlPath) {
6262
WebTestClient.Builder builder = webTestClient.mutate();
63-
if (baseUrl != null) {
64-
return builder.uriBuilderFactory(BaseUrlUriBuilderFactory.get(baseUrl.withPath(graphQlPath))).build();
65-
}
66-
return builder.baseUrl(graphQlPath).build();
63+
return (baseUrl != null)
64+
? builder.uriBuilderFactory(BaseUrlUriBuilderFactory.get(baseUrl.withPath(graphQlPath))).build()
65+
: builder.baseUrl(graphQlPath).build();
6766
}
6867

6968
}

module/spring-boot-resttestclient/src/main/java/org/springframework/boot/resttestclient/autoconfigure/TestRestTemplateAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,9 @@ public final class TestRestTemplateAutoConfiguration {
4646
TestRestTemplate testRestTemplate(ObjectProvider<RestTemplateBuilder> builderProvider,
4747
ApplicationContext applicationContext) {
4848
RestTemplateBuilder builder = builderProvider.getIfAvailable(RestTemplateBuilder::new);
49-
BaseUrl baseUrl = new BaseUrlProviders(applicationContext).getBaseUrlOrDefault();
50-
boolean sslEnabled = baseUrl != null && baseUrl.isHttps();
49+
BaseUrl baseUrl = new BaseUrlProviders(applicationContext).getBaseUrl(BaseUrl.LOCALHOST);
5150
TestRestTemplate template = new TestRestTemplate(builder, null, null,
52-
sslEnabled ? SSL_OPTIONS : DEFAULT_OPTIONS);
51+
baseUrl.isHttps() ? SSL_OPTIONS : DEFAULT_OPTIONS);
5352
template.setUriTemplateHandler(BaseUrlUriBuilderFactory.get(baseUrl));
5453
return template;
5554
}

module/spring-boot-webmvc-test/src/main/java/org/springframework/boot/webmvc/test/autoconfigure/MockMvcWebClientAutoConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public final class MockMvcWebClientAutoConfiguration {
4646
@ConditionalOnMissingBean({ WebClient.class, MockMvcWebClientBuilder.class })
4747
@ConditionalOnBean(MockMvc.class)
4848
MockMvcWebClientBuilder mockMvcWebClientBuilder(MockMvc mockMvc, ApplicationContext applicationContext) {
49-
BaseUrl baseUrl = new BaseUrlProviders(applicationContext).getBaseUrlOrDefault();
49+
BaseUrl baseUrl = new BaseUrlProviders(applicationContext).getBaseUrl(BaseUrl.LOCALHOST);
5050
return MockMvcWebClientBuilder.mockMvcSetup(mockMvc).withDelegate(new BaseUrlWebClient(baseUrl));
5151
}
5252

module/spring-boot-webmvc-test/src/main/java/org/springframework/boot/webmvc/test/autoconfigure/MockMvcWebDriverAutoConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public final class MockMvcWebDriverAutoConfiguration {
4949
@ConditionalOnMissingBean({ WebDriver.class, MockMvcHtmlUnitDriverBuilder.class })
5050
@ConditionalOnBean(MockMvc.class)
5151
MockMvcHtmlUnitDriverBuilder mockMvcHtmlUnitDriverBuilder(MockMvc mockMvc, ApplicationContext applicationContext) {
52-
BaseUrl baseUrl = new BaseUrlProviders(applicationContext).getBaseUrlOrDefault();
52+
BaseUrl baseUrl = new BaseUrlProviders(applicationContext).getBaseUrl(BaseUrl.LOCALHOST);
5353
MockMvcHtmlUnitDriverBuilder builder = MockMvcHtmlUnitDriverBuilder.mockMvcSetup(mockMvc)
5454
.withDelegate(new BaseUrlWebConnectionHtmlUnitDriver(baseUrl, BrowserVersion.CHROME));
5555
return builder;

smoke-test/spring-boot-smoke-test-actuator-custom-security/src/test/java/smoketest/actuator/customsecurity/AbstractSampleActuatorCustomSecurityTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ TestRestTemplate beansRestTemplate() {
202202
}
203203

204204
private TestRestTemplate configure(TestRestTemplate restTemplate) {
205-
BaseUrl baseUrl = new BaseUrlProviders(getApplicationContext()).getBaseUrlOrDefault();
205+
BaseUrl baseUrl = new BaseUrlProviders(getApplicationContext()).getBaseUrl();
206206
restTemplate.setUriTemplateHandler(BaseUrlUriBuilderFactory.get(baseUrl));
207207
return restTemplate;
208208
}

0 commit comments

Comments
 (0)