Add support for Maven resources

See gh-967
This commit is contained in:
Leonardo Ramos
2019-07-30 09:54:34 -03:00
committed by Stephane Nicoll
parent c2886679d6
commit df62424c0e
4 changed files with 206 additions and 2 deletions

View File

@@ -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<String, ResourceBuilder> 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<ResourceBuilder> customizer) {
customizer.accept(this.resources.computeIfAbsent(directory, (key) -> new ResourceBuilder(directory)));
}
public List<Resource> 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<String> includes = new ArrayList<>();
private List<String> 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 <resource>} of a {@link MavenBuild}.
*
*
*/
public static final class Resource {
private String directory;
private String targetPath;
private boolean filtering;
private List<String> includes = new ArrayList<>();
private List<String> excludes = new ArrayList<>();
public Resource(String directory, String targetPath, boolean filtering, List<String> includes,
List<String> 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<String> getIncludes() {
return this.includes;
}
public String getTargetPath() {
return this.targetPath;
}
public boolean isFiltering() {
return this.filtering;
}
public List<String> getExcludes() {
return this.excludes;
}
}
}

View File

@@ -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;

View File

@@ -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<Resource> resources = build.getResources();
assertThat(resources).isEmpty();
}
}

View File

@@ -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<NodeAssert> consumer) throws Exception {
MavenBuildWriter writer = new MavenBuildWriter();
StringWriter out = new StringWriter();