diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuild.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuild.java index 0a0a3901..1608be0c 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuild.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuild.java @@ -16,9 +16,13 @@ package io.spring.initializr.generator.buildsystem.maven; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Map; import java.util.TreeMap; +import java.util.function.Consumer; +import java.util.stream.Collectors; import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.BuildItemResolver; @@ -44,6 +48,8 @@ public class MavenBuild extends Build { private MavenPluginContainer plugins = new MavenPluginContainer(); + private final Map resources = new LinkedHashMap<>(); + private String packaging; public MavenBuild(BuildItemResolver buildItemResolver) { @@ -115,4 +121,110 @@ public class MavenBuild extends Build { return this.packaging; } + public void resource(String directory, Consumer customizer) { + customizer.accept(this.resources.computeIfAbsent(directory, (key) -> new ResourceBuilder(directory))); + } + + public List getResources() { + return this.resources.values().stream().map(ResourceBuilder::build).collect(Collectors.toList()); + } + + /** + * + * Builder to create a {@link Resource}. + * + * + */ + public static final class ResourceBuilder { + + private String directory; + + private String targetPath; + + private boolean filtering; + + private List includes = new ArrayList<>(); + + private List excludes = new ArrayList<>(); + + public ResourceBuilder(String directory) { + this.directory = directory; + } + + Resource build() { + return new Resource(this.directory, this.targetPath, this.filtering, this.includes, this.excludes); + } + + public ResourceBuilder include(String... includes) { + this.includes = Arrays.asList(includes); + return this; + } + + public ResourceBuilder targetPath(String targetPath) { + this.targetPath = targetPath; + return this; + } + + public ResourceBuilder filtering(Boolean filtering) { + this.filtering = filtering; + return this; + } + + public ResourceBuilder excludes(String... excludes) { + this.excludes = Arrays.asList(excludes); + return this; + } + + } + + /** + * + * An {@code } of a {@link MavenBuild}. + * + * + */ + public static final class Resource { + + private String directory; + + private String targetPath; + + private boolean filtering; + + private List includes = new ArrayList<>(); + + private List excludes = new ArrayList<>(); + + public Resource(String directory, String targetPath, boolean filtering, List includes, + List excludes) { + super(); + this.directory = directory; + this.targetPath = targetPath; + this.filtering = filtering; + this.includes = includes; + this.excludes = excludes; + } + + public String getDirectory() { + return this.directory; + } + + public List getIncludes() { + return this.includes; + } + + public String getTargetPath() { + return this.targetPath; + } + + public boolean isFiltering() { + return this.filtering; + } + + public List getExcludes() { + return this.excludes; + } + + } + } 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 0915027d..063669d0 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 @@ -33,6 +33,7 @@ import io.spring.initializr.generator.buildsystem.DependencyComparator; import io.spring.initializr.generator.buildsystem.DependencyContainer; import io.spring.initializr.generator.buildsystem.DependencyScope; import io.spring.initializr.generator.buildsystem.MavenRepository; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild.Resource; import io.spring.initializr.generator.buildsystem.maven.MavenPlugin.Configuration; import io.spring.initializr.generator.buildsystem.maven.MavenPlugin.Execution; import io.spring.initializr.generator.buildsystem.maven.MavenPlugin.Setting; @@ -240,18 +241,41 @@ public class MavenBuildWriter { } private void writeBuild(IndentingWriter writer, MavenBuild build) { - if (build.getSourceDirectory() == null && build.getTestSourceDirectory() == null && build.plugins().isEmpty()) { + if (build.getSourceDirectory() == null && build.getTestSourceDirectory() == null && build.plugins().isEmpty() + && build.getResources().isEmpty()) { return; } writer.println(); writeElement(writer, "build", () -> { writeSingleElement(writer, "sourceDirectory", build.getSourceDirectory()); writeSingleElement(writer, "testSourceDirectory", build.getTestSourceDirectory()); + writeResources(writer, build); writePlugins(writer, build); }); } + private void writeResources(IndentingWriter writer, MavenBuild build) { + if (build.getResources().isEmpty()) { + return; + } + writeElement(writer, "resources", () -> writeCollection(writer, build.getResources(), this::writeResource)); + } + + private void writeResource(IndentingWriter writer, Resource resource) { + writeElement(writer, "resource", () -> { + writeSingleElement(writer, "directory", resource.getDirectory()); + if (!resource.getIncludes().isEmpty()) { + writeElement(writer, "includes", + () -> writeCollection(writer, resource.getIncludes(), this::writeResourceInclude)); + } + }); + } + + private void writeResourceInclude(IndentingWriter writer, String include) { + writeSingleElement(writer, "include", include); + } + private void writePlugins(IndentingWriter writer, MavenBuild build) { if (build.plugins().isEmpty()) { return; diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildTests.java index 2321bf83..6625459b 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildTests.java @@ -16,9 +16,13 @@ package io.spring.initializr.generator.buildsystem.maven; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; +import io.spring.initializr.generator.buildsystem.maven.MavenBuild.Resource; /** * Tests for {@link MavenBuild}. @@ -110,4 +114,52 @@ class MavenBuildTests { .hasOnlyOneElementSatisfying((testPlugin) -> assertThat(testPlugin.isExtensions()).isTrue()); } + @Test + void mavenResourcesCanBeLoaded() { + + MavenBuild build = new MavenBuild(); + + build.resource("src/main/resources", (resource) -> { + resource.include("**/*.yml"); + resource.filtering(true); + resource.targetPath("targetPath"); + resource.excludes("**/*.properties"); + }); + + Resource resource = build.getResources().get(0); + + assertThat(resource.getIncludes().get(0)).isEqualTo("**/*.yml"); + assertThat(resource.getExcludes().get(0)).isEqualTo("**/*.properties"); + assertThat(resource.isFiltering()).isTrue(); + assertThat(resource.getTargetPath()).isEqualTo("targetPath"); + assertThat(resource.getDirectory()).isEqualTo("src/main/resources"); + + } + + @Test + void mavenResourcesFilteringFalseByDefault() { + + MavenBuild build = new MavenBuild(); + + build.resource("src/main/resources", (resource) -> { + }); + + Resource resource = build.getResources().get(0); + + assertThat(resource.isFiltering()).isFalse(); + + } + + @Test + void mavenResourcesNotLoadedByDefault() { + + MavenBuild build = new MavenBuild(); + build.plugin("com.example", "test-plugin"); + + List resources = build.getResources(); + + assertThat(resources).isEmpty(); + + } + } 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 c1fcb3e4..0d400184 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 @@ -546,6 +546,22 @@ class MavenBuildWriterTests { generatePom(build, (pom) -> assertThat(pom).textAtPath("/project/version").isEqualTo("1.2.4.RELEASE")); } + @Test + void pomWithResources() throws Exception { + + MavenBuild build = new MavenBuild(); + + build.resource("src/main/resources", (resource) -> resource.include("**/*.properties")); + + generatePom(build, (pom) -> { + assertThat(pom).textAtPath("/project/build/resources/resource/includes/include") + .isEqualTo("**/*.properties"); + + assertThat(pom).textAtPath("/project/build/resources/resource/directory").isEqualTo("src/main/resources"); + }); + + } + private void generatePom(MavenBuild mavenBuild, Consumer consumer) throws Exception { MavenBuildWriter writer = new MavenBuildWriter(); StringWriter out = new StringWriter();