diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/AbstractComplianceTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/AbstractComplianceTests.java index beb0382c..508ce24d 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/AbstractComplianceTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/AbstractComplianceTests.java @@ -26,6 +26,7 @@ import io.spring.initializr.generator.io.SimpleIndentStrategy; import io.spring.initializr.generator.language.Language; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationContext; +import io.spring.initializr.generator.project.ResolvedProjectDescription; import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder; import io.spring.initializr.generator.spring.test.ProjectAssert; import io.spring.initializr.generator.test.project.ProjectGeneratorTester; @@ -107,8 +108,9 @@ public abstract class AbstractComplianceTests { private void setupProjectGenerationContext(InitializrMetadata metadata, ProjectGenerationContext context) { context.registerBean(InitializrMetadata.class, () -> metadata); - context.registerBean(BuildItemResolver.class, - () -> new MetadataBuildItemResolver(metadata)); + context.registerBean(BuildItemResolver.class, () -> new MetadataBuildItemResolver( + metadata, + context.getBean(ResolvedProjectDescription.class).getPlatformVersion())); context.registerBean(IndentingWriterFactory.class, () -> IndentingWriterFactory.create(new SimpleIndentStrategy("\t"))); } diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/BuildMetadataResolverTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/BuildMetadataResolverTests.java index ad8db4e2..ee82b289 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/BuildMetadataResolverTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/BuildMetadataResolverTests.java @@ -22,6 +22,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.MetadataElement; @@ -79,7 +80,8 @@ class BuildMetadataResolverTests { } private Build createBuild(InitializrMetadata metadata) { - return new MavenBuild(new MetadataBuildItemResolver(metadata)); + return new MavenBuild( + new MetadataBuildItemResolver(metadata, Version.parse("2.0.0.RELEASE"))); } } diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/DefaultStarterBuildCustomizerTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/DefaultStarterBuildCustomizerTests.java index 3394d809..912a4576 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/DefaultStarterBuildCustomizerTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/DefaultStarterBuildCustomizerTests.java @@ -19,6 +19,7 @@ package io.spring.initializr.generator.spring.build; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.support.MetadataBuildItemResolver; @@ -70,7 +71,8 @@ class DefaultStarterBuildCustomizerTests { } private Build createBuild(InitializrMetadata metadata) { - return new MavenBuild(new MetadataBuildItemResolver(metadata)); + return new MavenBuild( + new MetadataBuildItemResolver(metadata, Version.parse("2.0.0.RELEASE"))); } } diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/DependencyManagementBuildCustomizerTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/DependencyManagementBuildCustomizerTests.java index eb40565c..79a393cc 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/DependencyManagementBuildCustomizerTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/DependencyManagementBuildCustomizerTests.java @@ -73,7 +73,8 @@ class DependencyManagementBuildCustomizerTests { } private MavenBuild createBuild(InitializrMetadata metadata) { - return new MavenBuild(new MetadataBuildItemResolver(metadata)); + return new MavenBuild( + new MetadataBuildItemResolver(metadata, Version.parse("2.0.0.RELEASE"))); } private void customizeBuild(Build build, InitializrMetadata metadata) { diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/WarPackagingWebStarterBuildCustomizerTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/WarPackagingWebStarterBuildCustomizerTests.java index a90b5844..47ba0c75 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/WarPackagingWebStarterBuildCustomizerTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/WarPackagingWebStarterBuildCustomizerTests.java @@ -21,6 +21,7 @@ import java.util.Collections; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.support.MetadataBuildItemResolver; @@ -68,14 +69,15 @@ class WarPackagingWebStarterBuildCustomizerTests { dependency.setFacets(Collections.singletonList("web")); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() .addDependencyGroup("test", dependency).build(); - Build build = new MavenBuild(new MetadataBuildItemResolver(metadata)); + Build build = createBuild(metadata); build.dependencies().add("test"); new WarPackagingWebStarterBuildCustomizer(metadata).customize(build); assertThat(build.dependencies().ids()).containsOnly("test", "tomcat"); } private Build createBuild(InitializrMetadata metadata) { - return new MavenBuild(new MetadataBuildItemResolver(metadata)); + return new MavenBuild( + new MetadataBuildItemResolver(metadata, Version.parse("2.0.0.RELEASE"))); } } diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinJpaGradleBuildCustomizerTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinJpaGradleBuildCustomizerTests.java index c638116e..6a0d2462 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinJpaGradleBuildCustomizerTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinJpaGradleBuildCustomizerTests.java @@ -20,6 +20,7 @@ import java.util.Collections; import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.support.MetadataBuildItemResolver; @@ -60,7 +61,8 @@ class KotlinJpaGradleBuildCustomizerTests { SimpleKotlinProjectSettings settings = new SimpleKotlinProjectSettings("1.2.70"); KotlinJpaGradleBuildCustomizer customizer = new KotlinJpaGradleBuildCustomizer( metadata, settings); - GradleBuild build = new GradleBuild(new MetadataBuildItemResolver(metadata)); + GradleBuild build = new GradleBuild( + new MetadataBuildItemResolver(metadata, Version.parse("2.0.0.RELEASE"))); build.dependencies().add("foo"); customizer.customize(build); return build; diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinJpaMavenBuildCustomizerTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinJpaMavenBuildCustomizerTests.java index 67719c39..5cdb764a 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinJpaMavenBuildCustomizerTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/code/kotlin/KotlinJpaMavenBuildCustomizerTests.java @@ -21,6 +21,7 @@ import java.util.Collections; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.buildsystem.maven.MavenPlugin; import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.support.MetadataBuildItemResolver; @@ -68,7 +69,8 @@ class KotlinJpaMavenBuildCustomizerTests { .addDependencyGroup("test", dependency).build(); KotlinJpaMavenBuildCustomizer customizer = new KotlinJpaMavenBuildCustomizer( metadata); - MavenBuild build = new MavenBuild(new MetadataBuildItemResolver(metadata)); + MavenBuild build = new MavenBuild( + new MetadataBuildItemResolver(metadata, Version.parse("2.0.0.RELEASE"))); build.dependencies().add("foo"); customizer.customize(build); return build; diff --git a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/configuration/WebFoldersContributorTests.java b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/configuration/WebFoldersContributorTests.java index 6d6c020f..1bd219a8 100644 --- a/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/configuration/WebFoldersContributorTests.java +++ b/initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/configuration/WebFoldersContributorTests.java @@ -23,6 +23,7 @@ import java.util.Collections; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.support.MetadataBuildItemResolver; @@ -80,7 +81,8 @@ class WebFoldersContributorTests { } private Build createBuild(InitializrMetadata metadata) { - return new MavenBuild(new MetadataBuildItemResolver(metadata)); + return new MavenBuild( + new MetadataBuildItemResolver(metadata, Version.parse("2.0.0.RELEASE"))); } private Path contribute(Build build, InitializrMetadata metadata) throws IOException { diff --git a/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemMapper.java b/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemMapper.java index 1f7f3feb..c9ad5550 100644 --- a/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemMapper.java +++ b/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemMapper.java @@ -43,9 +43,10 @@ public final class MetadataBuildItemMapper { if (dependency == null) { return null; } + VersionReference versionReference = (dependency.getVersion() != null) + ? VersionReference.ofValue(dependency.getVersion()) : null; return new io.spring.initializr.generator.buildsystem.Dependency( - dependency.getGroupId(), dependency.getArtifactId(), - VersionReference.ofValue(dependency.getVersion()), + dependency.getGroupId(), dependency.getArtifactId(), versionReference, toDependencyScope(dependency.getScope()), dependency.getType()); } diff --git a/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemResolver.java b/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemResolver.java index c49b7f55..8aeec98c 100644 --- a/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemResolver.java +++ b/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemResolver.java @@ -20,11 +20,12 @@ import io.spring.initializr.generator.buildsystem.BillOfMaterials; import io.spring.initializr.generator.buildsystem.BuildItemResolver; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.MavenRepository; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.InitializrMetadata; /** * A {@link BuildItemResolver} that uses the {@link InitializrMetadata} to resolve build - * items. + * items against a given platform {@link Version}. * * @author Stephane Nicoll */ @@ -32,20 +33,39 @@ public final class MetadataBuildItemResolver implements BuildItemResolver { private final InitializrMetadata metadata; - public MetadataBuildItemResolver(InitializrMetadata metadata) { + private final Version platformVersion; + + /** + * Creates an instance for the specified {@link InitializrMetadata} and {@link Version + * platform version}. + * @param metadata the metadata to use + * @param platformVersion the platform version to consider + */ + public MetadataBuildItemResolver(InitializrMetadata metadata, + Version platformVersion) { this.metadata = metadata; + this.platformVersion = platformVersion; } @Override public Dependency resolveDependency(String id) { - return MetadataBuildItemMapper - .toDependency(this.metadata.getDependencies().get(id)); + io.spring.initializr.metadata.Dependency dependency = this.metadata + .getDependencies().get(id); + if (dependency != null) { + return MetadataBuildItemMapper + .toDependency(dependency.resolve(this.platformVersion)); + } + return null; } @Override public BillOfMaterials resolveBom(String id) { - return MetadataBuildItemMapper - .toBom(this.metadata.getConfiguration().getEnv().getBoms().get(id)); + io.spring.initializr.metadata.BillOfMaterials bom = this.metadata + .getConfiguration().getEnv().getBoms().get(id); + if (bom != null) { + return MetadataBuildItemMapper.toBom(bom.resolve(this.platformVersion)); + } + return null; } @Override diff --git a/initializr-metadata/src/test/java/io/spring/initializr/metadata/support/MetadataBuildItemResolverTests.java b/initializr-metadata/src/test/java/io/spring/initializr/metadata/support/MetadataBuildItemResolverTests.java index 46b7a560..1f7dfea2 100644 --- a/initializr-metadata/src/test/java/io/spring/initializr/metadata/support/MetadataBuildItemResolverTests.java +++ b/initializr-metadata/src/test/java/io/spring/initializr/metadata/support/MetadataBuildItemResolverTests.java @@ -21,8 +21,10 @@ import java.net.URL; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.buildsystem.MavenRepository; +import io.spring.initializr.generator.version.Version; import io.spring.initializr.metadata.BillOfMaterials; import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.metadata.Dependency.Mapping; import io.spring.initializr.metadata.DependencyGroup; import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.Repository; @@ -37,6 +39,8 @@ import static org.assertj.core.api.Assertions.assertThat; */ class MetadataBuildItemResolverTests { + private static final Version VERSION_2_0_0 = Version.parse("2.0.0.RELEASE"); + @Test void resoleDependencyWithMatchingEntry() { InitializrMetadata metadata = new InitializrMetadata(); @@ -45,7 +49,8 @@ class MetadataBuildItemResolverTests { Dependency.withId("test-dep", "com.example", "test", "1.0.0", "runtime")); metadata.getDependencies().getContent().add(group); metadata.validate(); - MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata); + MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata, + VERSION_2_0_0); io.spring.initializr.generator.buildsystem.Dependency dependency = resolver .resolveDependency("test-dep"); assertThat(dependency.getGroupId()).isEqualTo("com.example"); @@ -54,6 +59,28 @@ class MetadataBuildItemResolverTests { assertThat(dependency.getScope()).isEqualTo(DependencyScope.RUNTIME); } + @Test + void resoleDependencyWithMatchingEntryAndVersionRange() { + InitializrMetadata metadata = new InitializrMetadata(); + DependencyGroup group = DependencyGroup.create("test"); + Dependency dependency = Dependency.withId("test-dep", "com.example", "test"); + dependency.getMappings().add(Mapping.create("[1.0.0.RELEASE, 2.0.0.RELEASE)", + null, null, "1.0.0.RELEASE")); + dependency.getMappings().add(Mapping.create("2.0.0.RELEASE", + "com.example.override", "test-override", null)); + group.getContent().add(dependency); + metadata.getDependencies().getContent().add(group); + metadata.validate(); + MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata, + VERSION_2_0_0); + io.spring.initializr.generator.buildsystem.Dependency resolveDependency = resolver + .resolveDependency("test-dep"); + assertThat(resolveDependency.getGroupId()).isEqualTo("com.example.override"); + assertThat(resolveDependency.getArtifactId()).isEqualTo("test-override"); + assertThat(resolveDependency.getVersion()).isNull(); + assertThat(resolveDependency.getScope()).isEqualTo(DependencyScope.COMPILE); + } + @Test void resoleDependencyWithNotMatchingEntry() { InitializrMetadata metadata = new InitializrMetadata(); @@ -62,7 +89,8 @@ class MetadataBuildItemResolverTests { Dependency.withId("test-dep", "com.example", "test", "1.0.0", "runtime")); metadata.getDependencies().getContent().add(group); metadata.validate(); - MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata); + MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata, + VERSION_2_0_0); assertThat(resolver.resolveDependency("does-not-exist")).isNull(); } @@ -72,7 +100,8 @@ class MetadataBuildItemResolverTests { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "2.0.0"); metadata.getConfiguration().getEnv().getBoms().put("test-bom", bom); metadata.validate(); - MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata); + MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata, + VERSION_2_0_0); io.spring.initializr.generator.buildsystem.BillOfMaterials resolvedBom = resolver .resolveBom("test-bom"); assertThat(resolvedBom.getGroupId()).isEqualTo("com.example"); @@ -80,13 +109,34 @@ class MetadataBuildItemResolverTests { assertThat(resolvedBom.getVersion()).hasToString("2.0.0"); } + @Test + void resoleBomWithMatchingEntryAndVersionRange() throws MalformedURLException { + InitializrMetadata metadata = new InitializrMetadata(); + BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "0.0.1"); + bom.getMappings().add(BillOfMaterials.Mapping + .create("[1.0.0.RELEASE, 2.0.0.RELEASE)", "1.0.0")); + bom.getMappings().add(BillOfMaterials.Mapping.create("2.0.0.RELEASE", "1.1.0")); + metadata.getConfiguration().getEnv().getBoms().put("test-bom", bom); + metadata.getConfiguration().getEnv().getRepositories().put("test-repo", + new Repository("test", new URL("https://example.com/repo"), false)); + metadata.validate(); + MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata, + VERSION_2_0_0); + io.spring.initializr.generator.buildsystem.BillOfMaterials resolvedBom = resolver + .resolveBom("test-bom"); + assertThat(resolvedBom.getGroupId()).isEqualTo("com.example"); + assertThat(resolvedBom.getArtifactId()).isEqualTo("bom"); + assertThat(resolvedBom.getVersion()).hasToString("1.1.0"); + } + @Test void resoleBomWithNotMatchingEntry() { InitializrMetadata metadata = new InitializrMetadata(); BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "2.0.0"); metadata.getConfiguration().getEnv().getBoms().put("test-bom", bom); metadata.validate(); - MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata); + MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata, + VERSION_2_0_0); assertThat(resolver.resolveBom("does-not-exost")).isNull(); } @@ -96,7 +146,8 @@ class MetadataBuildItemResolverTests { metadata.getConfiguration().getEnv().getRepositories().put("test-repo", new Repository("test", new URL("https://example.com/repo"), false)); metadata.validate(); - MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata); + MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata, + VERSION_2_0_0); MavenRepository repository = resolver.resolveRepository("test-repo"); assertThat(repository.getId()).isEqualTo("test-repo"); assertThat(repository.getName()).isEqualTo("test"); @@ -110,7 +161,8 @@ class MetadataBuildItemResolverTests { metadata.getConfiguration().getEnv().getRepositories().put("test-repo", new Repository("test", new URL("https://example.com/repo"), false)); metadata.validate(); - MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata); + MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata, + VERSION_2_0_0); assertThat(resolver.resolveRepository("does-not-exist")).isNull(); } diff --git a/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectGenerationInvoker.java b/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectGenerationInvoker.java index 46b0114e..6aea7b98 100644 --- a/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectGenerationInvoker.java +++ b/initializr-web/src/main/java/io/spring/initializr/web/project/ProjectGenerationInvoker.java @@ -194,8 +194,9 @@ public class ProjectGenerationInvoker { AnnotationConfigApplicationContext context, InitializrMetadata metadata) { context.setParent(this.parentApplicationContext); context.registerBean(InitializrMetadata.class, () -> metadata); - context.registerBean(BuildItemResolver.class, - () -> new MetadataBuildItemResolver(metadata)); + context.registerBean(BuildItemResolver.class, () -> new MetadataBuildItemResolver( + metadata, + context.getBean(ResolvedProjectDescription.class).getPlatformVersion())); } private void publishProjectGeneratedEvent(ProjectRequest request,