From d32b2f6a20aaaaddc37840d92513ef9e0a56eca7 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 31 May 2019 09:35:43 +0200 Subject: [PATCH] Model that a Maven dependency is optional Closes gh-913 --- .../generator/buildsystem/Dependency.java | 38 ++++++----- .../buildsystem/DependencyContainer.java | 2 +- .../buildsystem/maven/MavenBuildWriter.java | 12 ++-- .../buildsystem/maven/MavenDependency.java | 68 +++++++++++++++++++ .../maven/MavenBuildWriterTests.java | 22 ++++++ 5 files changed, 121 insertions(+), 21 deletions(-) create mode 100644 initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenDependency.java diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/Dependency.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/Dependency.java index 3bf77deb..f136a146 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/Dependency.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/Dependency.java @@ -45,7 +45,7 @@ public class Dependency { private final Set exclusions; - Dependency(Builder builder) { + protected Dependency(Builder builder) { this.groupId = builder.groupId; this.artifactId = builder.artifactId; this.version = builder.version; @@ -54,7 +54,7 @@ public class Dependency { this.exclusions = new LinkedHashSet<>(builder.exclusions); } - public static Builder withCoordinates(String groupId, String artifactId) { + public static Builder withCoordinates(String groupId, String artifactId) { return new Builder(groupId, artifactId); } @@ -111,9 +111,10 @@ public class Dependency { /** * Builder for a dependency. * + * @param builder type * @see Dependency#withCoordinates(String, String) */ - public static final class Builder { + public static class Builder { private String groupId; @@ -127,39 +128,44 @@ public class Dependency { private Set exclusions = new LinkedHashSet<>(); - private Builder(String groupId, String artifactId) { + protected Builder(String groupId, String artifactId) { this.groupId = groupId; this.artifactId = artifactId; } - public Builder groupId(String groupId) { + public B groupId(String groupId) { this.groupId = groupId; - return this; + return self(); } - public Builder artifactId(String artifactId) { + public B artifactId(String artifactId) { this.artifactId = artifactId; - return this; + return self(); } - public Builder version(VersionReference version) { + public B version(VersionReference version) { this.version = version; - return this; + return self(); } - public Builder scope(DependencyScope scope) { + public B scope(DependencyScope scope) { this.scope = scope; - return this; + return self(); } - public Builder type(String type) { + public B type(String type) { this.type = type; - return this; + return self(); } - public Builder exclusions(Exclusion... exclusions) { + public B exclusions(Exclusion... exclusions) { this.exclusions = new LinkedHashSet<>(Arrays.asList(exclusions)); - return this; + return self(); + } + + @SuppressWarnings("unchecked") + protected B self() { + return (B) this; } public Dependency build() { diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/DependencyContainer.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/DependencyContainer.java index 302173fd..2636ee19 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/DependencyContainer.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/DependencyContainer.java @@ -47,7 +47,7 @@ public class DependencyContainer extends BuildItemContainer * @param id the id of the dependency * @param builder the state of the dependency */ - public void add(String id, Dependency.Builder builder) { + public void add(String id, Dependency.Builder builder) { add(id, builder.build()); } diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriter.java index f942db2c..37084104 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriter.java @@ -155,7 +155,7 @@ public class MavenBuildWriter { writeSingleElement(writer, "version", determineVersion(dependency.getVersion())); writeSingleElement(writer, "scope", scopeForType(dependency.getScope())); - if (isOptional(dependency.getScope())) { + if (isOptional(dependency)) { writeSingleElement(writer, "optional", Boolean.toString(true)); } writeSingleElement(writer, "type", dependency.getType()); @@ -202,9 +202,13 @@ public class MavenBuildWriter { } } - private boolean isOptional(DependencyScope type) { - return (type == DependencyScope.ANNOTATION_PROCESSOR - || type == DependencyScope.COMPILE_ONLY); + private boolean isOptional(Dependency dependency) { + if (dependency instanceof MavenDependency + && ((MavenDependency) dependency).isOptional()) { + return true; + } + return (dependency.getScope() == DependencyScope.ANNOTATION_PROCESSOR + || dependency.getScope() == DependencyScope.COMPILE_ONLY); } private void writeDependencyManagement(IndentingWriter writer, MavenBuild build) { diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenDependency.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenDependency.java new file mode 100644 index 00000000..562883e5 --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenDependency.java @@ -0,0 +1,68 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.initializr.generator.buildsystem.maven; + +import io.spring.initializr.generator.buildsystem.Dependency; + +/** + * A {@link Dependency} with specific settings for the Maven build system. + * + * @author Stephane Nicoll + */ +public class MavenDependency extends Dependency { + + protected final boolean optional; + + protected MavenDependency(Builder builder) { + super(builder); + this.optional = builder.optional; + } + + public static Builder withCoordinates(String groupId, String artifactId) { + return new Builder(groupId, artifactId); + } + + public boolean isOptional() { + return this.optional; + } + + /** + * Builder for a Maven dependency. + * + * @see MavenDependency#withCoordinates(String, String) + */ + public static class Builder extends Dependency.Builder { + + private boolean optional; + + protected Builder(String groupId, String artifactId) { + super(groupId, artifactId); + } + + public Builder optional(boolean optional) { + this.optional = optional; + return self(); + } + + @Override + public Dependency build() { + return new MavenDependency(this); + } + + } + +} diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriterTests.java index d1885549..5231ac41 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriterTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriterTests.java @@ -287,6 +287,28 @@ class MavenBuildWriterTests { }); } + @Test + void pomWithOptionalDependency() throws Exception { + MavenBuild build = new MavenBuild(); + build.setGroup("com.example.demo"); + build.setArtifact("demo"); + build.dependencies().add("annotation-processor", + MavenDependency + .withCoordinates("org.springframework.boot", + "spring-boot-configuration-processor") + .scope(DependencyScope.COMPILE).optional(true)); + generatePom(build, (pom) -> { + NodeAssert dependency = pom.nodeAtPath("/project/dependencies/dependency"); + assertThat(dependency).textAtPath("groupId") + .isEqualTo("org.springframework.boot"); + assertThat(dependency).textAtPath("artifactId") + .isEqualTo("spring-boot-configuration-processor"); + assertThat(dependency).textAtPath("version").isNullOrEmpty(); + assertThat(dependency).textAtPath("scope").isNullOrEmpty(); + assertThat(dependency).textAtPath("optional").isEqualTo("true"); + }); + } + @Test void pomWithNonNullArtifactTypeDependency() throws Exception { MavenBuild build = new MavenBuild();