From 7cb3462d1b86632721f926b7ff60b2d6fa2a005e Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Sun, 14 Jul 2019 08:45:10 +0100 Subject: [PATCH] Add support for mapping a dependency's starter setting Closes gh-955 --- .../DependencyRangesInfoContributorTests.java | 13 +-- .../initializr/metadata/Dependency.java | 17 +++- .../initializr/metadata/DependencyTests.java | 82 ++++++++++++------- .../metadata/InitializrMetadataTests.java | 5 +- .../MetadataBuildItemResolverTests.java | 6 +- ...efaultDependencyMetadataProviderTests.java | 6 +- 6 files changed, 86 insertions(+), 43 deletions(-) diff --git a/initializr-actuator/src/test/java/io/spring/initializr/actuate/info/DependencyRangesInfoContributorTests.java b/initializr-actuator/src/test/java/io/spring/initializr/actuate/info/DependencyRangesInfoContributorTests.java index 38189ebf..0dbee574 100755 --- a/initializr-actuator/src/test/java/io/spring/initializr/actuate/info/DependencyRangesInfoContributorTests.java +++ b/initializr-actuator/src/test/java/io/spring/initializr/actuate/info/DependencyRangesInfoContributorTests.java @@ -56,7 +56,8 @@ class DependencyRangesInfoContributorTests { @Test void dependencyWithRangeOnArtifact() { Dependency dependency = Dependency.withId("foo", "com.example", "foo", "1.2.3.RELEASE"); - dependency.getMappings().add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, "foo2", null)); + dependency.getMappings() + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, "foo2", null, null)); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults().addDependencyGroup("foo", dependency) .build(); Info info = getInfo(metadata); @@ -68,7 +69,7 @@ class DependencyRangesInfoContributorTests { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "1.0.0"); Dependency dependency = Dependency.withId("foo", "com.example", "foo", "1.2.3.RELEASE"); dependency.getMappings() - .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE")); + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE", null)); dependency.setBom("bom"); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults().addBom("bom", bom) .addDependencyGroup("foo", dependency).build(); @@ -96,8 +97,8 @@ class DependencyRangesInfoContributorTests { void dependencyWithMappingAndOpenRange() { Dependency dependency = Dependency.withId("foo", null, null, "0.3.0.RELEASE"); dependency.getMappings() - .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE")); - dependency.getMappings().add(Dependency.Mapping.create("1.2.0.RELEASE", null, null, "0.2.0.RELEASE")); + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE", null)); + dependency.getMappings().add(Dependency.Mapping.create("1.2.0.RELEASE", null, null, "0.2.0.RELEASE", null)); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() .addDependencyGroup("test", dependency).build(); Info info = getInfo(metadata); @@ -111,9 +112,9 @@ class DependencyRangesInfoContributorTests { void dependencyWithMappingAndNoOpenRange() { Dependency dependency = Dependency.withId("foo", null, null, "0.3.0.RELEASE"); dependency.getMappings() - .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE")); + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE", null)); dependency.getMappings() - .add(Dependency.Mapping.create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, null, "0.2.0.RELEASE")); + .add(Dependency.Mapping.create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, null, "0.2.0.RELEASE", null)); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() .addDependencyGroup("test", dependency).build(); Info info = getInfo(metadata); diff --git a/initializr-metadata/src/main/java/io/spring/initializr/metadata/Dependency.java b/initializr-metadata/src/main/java/io/spring/initializr/metadata/Dependency.java index e23da00a..cb65ae73 100644 --- a/initializr-metadata/src/main/java/io/spring/initializr/metadata/Dependency.java +++ b/initializr-metadata/src/main/java/io/spring/initializr/metadata/Dependency.java @@ -249,6 +249,7 @@ public class Dependency extends MetadataElement implements Describable { dependency.groupId = (mapping.groupId != null) ? mapping.groupId : this.groupId; dependency.artifactId = (mapping.artifactId != null) ? mapping.artifactId : this.artifactId; dependency.version = (mapping.version != null) ? mapping.version : this.version; + dependency.starter = (mapping.starter != null) ? mapping.starter : this.starter; dependency.versionRequirement = mapping.range.toString(); dependency.mappings = null; return dependency; @@ -499,6 +500,11 @@ public class Dependency extends MetadataElement implements Describable { */ private String version; + /** + * The starter setting to use for the mapping or {@code null} to use the default. + */ + private Boolean starter; + @JsonIgnore private VersionRange range; @@ -526,6 +532,14 @@ public class Dependency extends MetadataElement implements Describable { this.version = version; } + public Boolean getStarter() { + return this.starter; + } + + public void setStarter(Boolean starter) { + this.starter = starter; + } + public VersionRange getRange() { return this.range; } @@ -538,12 +552,13 @@ public class Dependency extends MetadataElement implements Describable { this.versionRange = versionRange; } - public static Mapping create(String range, String groupId, String artifactId, String version) { + public static Mapping create(String range, String groupId, String artifactId, String version, Boolean starter) { Mapping mapping = new Mapping(); mapping.versionRange = range; mapping.groupId = groupId; mapping.artifactId = artifactId; mapping.version = version; + mapping.starter = starter; return mapping; } diff --git a/initializr-metadata/src/test/java/io/spring/initializr/metadata/DependencyTests.java b/initializr-metadata/src/test/java/io/spring/initializr/metadata/DependencyTests.java index 04ab8299..5f468cba 100755 --- a/initializr-metadata/src/test/java/io/spring/initializr/metadata/DependencyTests.java +++ b/initializr-metadata/src/test/java/io/spring/initializr/metadata/DependencyTests.java @@ -149,7 +149,7 @@ class DependencyTests { @Test void resolveInvalidMapping() { Dependency dependency = Dependency.withId("web"); - dependency.getMappings().add(Dependency.Mapping.create("foo-bar", null, null, "0.1.0.RELEASE")); + dependency.getMappings().add(Dependency.Mapping.create("foo-bar", null, null, "0.1.0.RELEASE", null)); assertThatExceptionOfType(InvalidInitializrMetadataException.class).isThrownBy(dependency::resolve) .withMessageContaining("foo-bar"); } @@ -158,7 +158,7 @@ class DependencyTests { void resolveVersionRequirement() { Dependency dependency = Dependency.withId("web"); dependency.getMappings() - .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE")); + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE", null)); dependency.resolve(); Dependency resolved = dependency.resolve(Version.parse("1.1.5.RELEASE")); assertThat(resolved.getVersionRequirement()).isEqualTo(">=1.1.0.RELEASE and <1.2.0.RELEASE"); @@ -172,17 +172,17 @@ class DependencyTests { dependency.getAliases().add("the-web"); dependency.getFacets().add("web"); dependency.getMappings() - .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE")); + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE", null)); dependency.getMappings() - .add(Dependency.Mapping.create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, null, "0.2.0.RELEASE")); + .add(Dependency.Mapping.create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, null, "0.2.0.RELEASE", null)); dependency.resolve(); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "org.springframework.boot", - "spring-boot-starter-web", "0.1.0.RELEASE"); + "spring-boot-starter-web", "0.1.0.RELEASE", true); validateResolvedWebDependency(dependency.resolve(Version.parse("1.2.0.RELEASE")), "org.springframework.boot", - "spring-boot-starter-web", "0.2.0.RELEASE"); + "spring-boot-starter-web", "0.2.0.RELEASE", true); validateResolvedWebDependency(dependency.resolve(Version.parse("2.1.3.M1")), "org.springframework.boot", - "spring-boot-starter-web", "0.3.0.RELEASE"); // default + "spring-boot-starter-web", "0.3.0.RELEASE", true); // default } @Test @@ -193,17 +193,17 @@ class DependencyTests { dependency.getAliases().add("the-web"); dependency.getFacets().add("web"); dependency.getMappings() - .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", "org.spring.boot", null, null)); + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", "org.spring.boot", null, null, null)); dependency.getMappings() - .add(Dependency.Mapping.create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, "starter-web", null)); + .add(Dependency.Mapping.create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, "starter-web", null, null)); dependency.resolve(); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "org.spring.boot", - "spring-boot-starter-web", "0.3.0.RELEASE"); + "spring-boot-starter-web", "0.3.0.RELEASE", true); validateResolvedWebDependency(dependency.resolve(Version.parse("1.2.0.RELEASE")), "org.springframework.boot", - "starter-web", "0.3.0.RELEASE"); + "starter-web", "0.3.0.RELEASE", true); validateResolvedWebDependency(dependency.resolve(Version.parse("2.1.3.M1")), "org.springframework.boot", - "spring-boot-starter-web", "0.3.0.RELEASE"); // default + "spring-boot-starter-web", "0.3.0.RELEASE", true); // default } @Test @@ -214,43 +214,65 @@ class DependencyTests { dependency.getAliases().add("the-web"); dependency.getFacets().add("web"); dependency.getMappings() - .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.1.x.RELEASE]", null, null, "0.1.0.RELEASE")); - dependency.getMappings() - .add(Dependency.Mapping.create("[1.1.x.BUILD-SNAPSHOT, 1.2.0.RELEASE)", null, null, "0.2.0.RELEASE")); + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.1.x.RELEASE]", null, null, "0.1.0.RELEASE", null)); + dependency.getMappings().add( + Dependency.Mapping.create("[1.1.x.BUILD-SNAPSHOT, 1.2.0.RELEASE)", null, null, "0.2.0.RELEASE", null)); dependency.resolve(); dependency.updateVersionRanges(new VersionParser( Arrays.asList(Version.parse("1.1.5.RELEASE"), Version.parse("1.1.6.BUILD-SNAPSHOT")))); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "org.springframework.boot", - "spring-boot-starter-web", "0.1.0.RELEASE"); + "spring-boot-starter-web", "0.1.0.RELEASE", true); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.6.BUILD-SNAPSHOT")), - "org.springframework.boot", "spring-boot-starter-web", "0.2.0.RELEASE"); + "org.springframework.boot", "spring-boot-starter-web", "0.2.0.RELEASE", true); validateResolvedWebDependency(dependency.resolve(Version.parse("2.1.3.M1")), "org.springframework.boot", - "spring-boot-starter-web", "0.3.0.RELEASE"); // default + "spring-boot-starter-web", "0.3.0.RELEASE", true); // default dependency.updateVersionRanges(new VersionParser( Arrays.asList(Version.parse("1.1.6.RELEASE"), Version.parse("1.1.7.BUILD-SNAPSHOT")))); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "org.springframework.boot", - "spring-boot-starter-web", "0.1.0.RELEASE"); + "spring-boot-starter-web", "0.1.0.RELEASE", true); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.6.RELEASE")), "org.springframework.boot", - "spring-boot-starter-web", "0.1.0.RELEASE"); + "spring-boot-starter-web", "0.1.0.RELEASE", true); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.7.BUILD-SNAPSHOT")), - "org.springframework.boot", "spring-boot-starter-web", "0.2.0.RELEASE"); + "org.springframework.boot", "spring-boot-starter-web", "0.2.0.RELEASE", true); validateResolvedWebDependency(dependency.resolve(Version.parse("2.1.3.M1")), "org.springframework.boot", - "spring-boot-starter-web", "0.3.0.RELEASE"); // default + "spring-boot-starter-web", "0.3.0.RELEASE", true); // default } @Test void resolveMatchingWithCustomGroupId() { Dependency dependency = Dependency.withId("foo", "com.acme", "foo", "0.3.0.RELEASE"); dependency.getMappings() - .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "1.0.0.RELEASE")); - dependency.getMappings().add(Dependency.Mapping.create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, "bar", null)); + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "1.0.0.RELEASE", null)); + dependency.getMappings() + .add(Dependency.Mapping.create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, "bar", null, null)); dependency.resolve(); validateResolvedDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "foo", "com.acme", "foo", - "1.0.0.RELEASE"); + "1.0.0.RELEASE", true); validateResolvedDependency(dependency.resolve(Version.parse("1.2.5.RELEASE")), "foo", "com.acme", "bar", - "0.3.0.RELEASE"); + "0.3.0.RELEASE", true); + } + + @Test + void resolveMatchingWithMappingThatDisablesStarter() { + Dependency dependency = Dependency.withId("foo", "com.acme", "foo", "0.3.0.RELEASE"); + dependency.getMappings() + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "1.0.0.RELEASE", false)); + dependency.resolve(); + validateResolvedDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "foo", "com.acme", "foo", + "1.0.0.RELEASE", false); + } + + @Test + void resolveMatchingWithMappingThatEnablesStarter() { + Dependency dependency = Dependency.withId("foo", "com.acme", "foo", "0.3.0.RELEASE"); + dependency.setStarter(false); + dependency.getMappings() + .add(Dependency.Mapping.create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "1.0.0.RELEASE", true)); + dependency.resolve(); + validateResolvedDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "foo", "com.acme", "foo", + "1.0.0.RELEASE", true); } @Test @@ -270,19 +292,21 @@ class DependencyTests { } private static void validateResolvedWebDependency(Dependency dependency, String expectedGroupId, - String expectedArtifactId, String expectedVersion) { - validateResolvedDependency(dependency, "web", expectedGroupId, expectedArtifactId, expectedVersion); + String expectedArtifactId, String expectedVersion, boolean expectedStarter) { + validateResolvedDependency(dependency, "web", expectedGroupId, expectedArtifactId, expectedVersion, + expectedStarter); assertThat(dependency.getKeywords()).hasSize(2); assertThat(dependency.getAliases()).hasSize(1); assertThat(dependency.getFacets()).hasSize(1); } private static void validateResolvedDependency(Dependency dependency, String id, String expectedGroupId, - String expectedArtifactId, String expectedVersion) { + String expectedArtifactId, String expectedVersion, boolean expectedStarter) { assertThat(dependency.getId()).isEqualTo(id); assertThat(dependency.getGroupId()).isEqualTo(expectedGroupId); assertThat(dependency.getArtifactId()).isEqualTo(expectedArtifactId); assertThat(dependency.getVersion()).isEqualTo(expectedVersion); + assertThat(dependency.isStarter()).isEqualTo(expectedStarter); } } diff --git a/initializr-metadata/src/test/java/io/spring/initializr/metadata/InitializrMetadataTests.java b/initializr-metadata/src/test/java/io/spring/initializr/metadata/InitializrMetadataTests.java index 089b464d..9b0b2062 100755 --- a/initializr-metadata/src/test/java/io/spring/initializr/metadata/InitializrMetadataTests.java +++ b/initializr-metadata/src/test/java/io/spring/initializr/metadata/InitializrMetadataTests.java @@ -138,8 +138,9 @@ class InitializrMetadataTests { bom.getMappings().add(Mapping.create("1.3.x.BUILD-SNAPSHOT", "1.1.0-BUILD-SNAPSHOT")); Dependency dependency = Dependency.withId("bar"); dependency.getMappings() - .add(Dependency.Mapping.create("[1.3.0.RELEASE, 1.3.x.RELEASE]", null, null, "0.1.0.RELEASE")); - dependency.getMappings().add(Dependency.Mapping.create("1.3.x.BUILD-SNAPSHOT", null, null, "0.2.0.RELEASE")); + .add(Dependency.Mapping.create("[1.3.0.RELEASE, 1.3.x.RELEASE]", null, null, "0.1.0.RELEASE", null)); + dependency.getMappings() + .add(Dependency.Mapping.create("1.3.x.BUILD-SNAPSHOT", null, null, "0.2.0.RELEASE", null)); addTestDependencyGroup(metadata, dependency); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); 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 dfdd1917..6e48bce6 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 @@ -61,8 +61,10 @@ class MetadataBuildItemResolverTests { 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)); + dependency.getMappings() + .add(Mapping.create("[1.0.0.RELEASE, 2.0.0.RELEASE)", null, null, "1.0.0.RELEASE", null)); + dependency.getMappings() + .add(Mapping.create("2.0.0.RELEASE", "com.example.override", "test-override", null, null)); group.getContent().add(dependency); metadata.getDependencies().getContent().add(group); metadata.validate(); diff --git a/initializr-web/src/test/java/io/spring/initializr/web/support/DefaultDependencyMetadataProviderTests.java b/initializr-web/src/test/java/io/spring/initializr/web/support/DefaultDependencyMetadataProviderTests.java index 0a375047..d2e17c3c 100755 --- a/initializr-web/src/test/java/io/spring/initializr/web/support/DefaultDependencyMetadataProviderTests.java +++ b/initializr-web/src/test/java/io/spring/initializr/web/support/DefaultDependencyMetadataProviderTests.java @@ -54,9 +54,9 @@ class DefaultDependencyMetadataProviderTests { @Test void resolveDependencies() { Dependency first = Dependency.withId("first", "org.foo", "first"); - first.getMappings() - .add(Dependency.Mapping.create("[1.0.0.RELEASE, 1.1.0.RELEASE)", "org.bar", "second", "0.1.0.RELEASE")); - first.getMappings().add(Dependency.Mapping.create("1.1.0.RELEASE", "org.biz", "third", "0.2.0.RELEASE")); + first.getMappings().add(Dependency.Mapping.create("[1.0.0.RELEASE, 1.1.0.RELEASE)", "org.bar", "second", + "0.1.0.RELEASE", null)); + first.getMappings().add(Dependency.Mapping.create("1.1.0.RELEASE", "org.biz", "third", "0.2.0.RELEASE", null)); Dependency second = Dependency.withId("second", "org.foo", "second"); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() .addDependencyGroup("test", first, second).build();