Skip to content

Commit e8b7601

Browse files
committed
Resolve boot version wildcards in requests
Signed-off-by: sijun-yang <yangsijun5528@gmail.com>
1 parent fc20fe3 commit e8b7601

6 files changed

Lines changed: 44 additions & 14 deletions

File tree

initializr-metadata/src/main/java/io/spring/initializr/metadata/InitializrMetadata.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,10 @@
2020
import java.util.List;
2121
import java.util.Map;
2222

23-
import io.spring.initializr.generator.version.Version;
2423
import io.spring.initializr.generator.version.VersionParser;
2524
import io.spring.initializr.generator.version.VersionProperty;
2625
import org.jspecify.annotations.Nullable;
2726

28-
import org.springframework.util.Assert;
29-
3027
/**
3128
* Meta-data used to generate a project.
3229
*
@@ -41,7 +38,7 @@ public class InitializrMetadata {
4138

4239
private final TypeCapability types = new TypeCapability();
4340

44-
private final SingleSelectCapability bootVersions = new SingleSelectCapability("bootVersion", "Spring Boot Version",
41+
private final VersionCapability bootVersions = new VersionCapability("bootVersion", "Spring Boot Version",
4542
"spring boot version");
4643

4744
private final SingleSelectCapability packagings = new SingleSelectCapability("packaging", "Packaging",
@@ -88,7 +85,7 @@ public TypeCapability getTypes() {
8885
return this.types;
8986
}
9087

91-
public SingleSelectCapability getBootVersions() {
88+
public VersionCapability getBootVersions() {
9289
return this.bootVersions;
9390
}
9491

@@ -211,12 +208,7 @@ public void validate() {
211208
*/
212209
public void updateSpringBootVersions(List<DefaultMetadataElement> versionsMetadata) {
213210
this.bootVersions.setContent(versionsMetadata);
214-
List<Version> bootVersions = this.bootVersions.getContent().stream().map((it) -> {
215-
String id = it.getId();
216-
Assert.state(id != null, "'id' must not be null");
217-
return Version.parse(id);
218-
}).toList();
219-
VersionParser parser = new VersionParser(bootVersions);
211+
VersionParser parser = this.bootVersions.getVersionParser();
220212
this.dependencies.updateCompatibilityRange(parser);
221213
this.configuration.getEnv().updateCompatibilityRange(parser);
222214
}

initializr-metadata/src/test/java/io/spring/initializr/metadata/InitializrMetadataTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,19 @@ void updateSpringBootVersions() {
191191
.resolveKotlinVersion(Version.parse("1.3.7.BUILD-SNAPSHOT"))).isEqualTo("1.2");
192192
}
193193

194+
@Test
195+
void bootVersionsParseWildcardToLatestMatchingVersion() {
196+
InitializrMetadata metadata = initializeMetadata();
197+
List<DefaultMetadataElement> bootVersions = Arrays.asList(DefaultMetadataElement.create("1.3.6", false),
198+
DefaultMetadataElement.create("1.3.7", false), DefaultMetadataElement.create("1.4.0", false));
199+
metadata.updateSpringBootVersions(bootVersions);
200+
assertThat(metadata.getBootVersions().parseVersion("1.3.x")).hasToString("1.3.7");
201+
202+
metadata.updateSpringBootVersions(List.of(DefaultMetadataElement.create("1.3.8", false)));
203+
assertThat(metadata.getBootVersions().parseVersion("1.3.x")).hasToString("1.3.8");
204+
assertThat(metadata.getBootVersions().safeParseVersion("2.x.x")).isNull();
205+
}
206+
194207
@Test
195208
void invalidParentMissingVersion() {
196209
InitializrMetadata metadata = initializeMetadata();

initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectMetadataController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ protected CacheControl determineCacheControlFor(InitializrMetadata metadata) {
150150
protected ResponseEntity<String> dependenciesFor(InitializrMetadataVersion metadataVersion,
151151
@Nullable String bootVersion) {
152152
InitializrMetadata metadata = this.metadataProvider.get();
153-
Version effectiveBootVersion = (bootVersion != null) ? Version.parse(bootVersion)
153+
Version effectiveBootVersion = (bootVersion != null) ? metadata.getBootVersions().parseVersion(bootVersion)
154154
: getDefaultBootVersion(metadata);
155155
Platform platform = metadata.getConfiguration().getEnv().getPlatform();
156156
if (!platform.isCompatibleVersion(effectiveBootVersion)) {

initializr-web/src/main/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ private void validate(ProjectRequest request, InitializrMetadata metadata) {
128128
}
129129

130130
private void validatePlatformVersion(ProjectRequest request, InitializrMetadata metadata) {
131-
Version platformVersion = Version.safeParse(request.getBootVersion());
131+
Version platformVersion = metadata.getBootVersions().safeParseVersion(request.getBootVersion());
132132
Platform platform = metadata.getConfiguration().getEnv().getPlatform();
133133
if (platformVersion != null && !platform.isCompatibleVersion(platformVersion)) {
134134
throw new InvalidProjectRequestException("Invalid Spring Boot version '" + platformVersion
@@ -213,7 +213,7 @@ private BuildSystem getBuildSystem(ProjectRequest request, InitializrMetadata me
213213
private Version getPlatformVersion(ProjectRequest request, InitializrMetadata metadata) {
214214
String versionText = (request.getBootVersion() != null) ? request.getBootVersion()
215215
: getDefaultBootVersion(metadata);
216-
Version version = Version.parse(versionText);
216+
Version version = metadata.getBootVersions().parseVersion(versionText);
217217
return this.platformVersionTransformer.transform(version, metadata);
218218
}
219219

initializr-web/src/test/java/io/spring/initializr/web/controller/ProjectMetadataControllerIntegrationTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ void metadataWithInvalidPlatformVersion() {
9191
}
9292
}
9393

94+
@Test
95+
void dependenciesWithWildcardBootVersion() {
96+
ResponseEntity<String> response = execute("/dependencies?bootVersion=2.4.x", String.class, null,
97+
"application/vnd.initializr.v2.1+json");
98+
assertThat(response.getBody()).contains("\"bootVersion\":\"2.4.4\"");
99+
}
100+
94101
@Test
95102
void metadataWithCurrentAcceptHeader() {
96103
getRequests().setFields("_links.maven-project", "dependencies.values[0]", "type.values[0]",

initializr-web/src/test/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverterTests.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem;
2222
import io.spring.initializr.generator.project.ProjectDescription;
2323
import io.spring.initializr.generator.test.InitializrMetadataTestBuilder;
24+
import io.spring.initializr.generator.version.InvalidVersionException;
2425
import io.spring.initializr.generator.version.Version;
2526
import io.spring.initializr.generator.version.VersionRange;
2627
import io.spring.initializr.metadata.Dependency;
@@ -159,6 +160,15 @@ void convertWhenSpringBootVersionInvalidShouldThrowException() {
159160
"Invalid Spring Boot version '1.5.9.RELEASE', Spring Boot compatibility range is >=2.0.0.RELEASE and <2.3.0.M1");
160161
}
161162

163+
@Test
164+
void convertWhenWildcardSpringBootVersionDoesNotMatchShouldThrowException() {
165+
ProjectRequest request = createProjectRequest();
166+
request.setBootVersion("2.6.x");
167+
assertThatExceptionOfType(InvalidVersionException.class)
168+
.isThrownBy(() -> this.converter.convert(request, this.metadata))
169+
.withMessage("Could not determine latest version based on '2.6.x'");
170+
}
171+
162172
@Test
163173
void convertWhenPackagingIsInvalidShouldThrowException() {
164174
ProjectRequest request = createProjectRequest();
@@ -271,6 +281,14 @@ void convertShouldSetPlatformVersionFromRequest() {
271281
assertThat(description.getPlatformVersion()).isEqualTo(Version.parse("2.0.3"));
272282
}
273283

284+
@Test
285+
void convertShouldSetLatestMatchingPlatformVersionFromWildcardBootVersion() {
286+
ProjectRequest request = createProjectRequest();
287+
request.setBootVersion("2.4.x");
288+
ProjectDescription description = this.converter.convert(request, this.metadata);
289+
assertThat(description.getPlatformVersion()).isEqualTo(Version.parse("2.4.1"));
290+
}
291+
274292
@Test
275293
void convertShouldSetLanguageForProjectDescriptionFromRequest() {
276294
ProjectRequest request = createProjectRequest();

0 commit comments

Comments
 (0)