From f224c6a38ac1e81614fe314a91b37596d9a3ce95 Mon Sep 17 00:00:00 2001 From: Torsten Walter Date: Fri, 1 Dec 2017 12:01:25 +0100 Subject: [PATCH 1/2] Allow generation of custom files To generate additional files, `doGenerateProjectStructure` should be overridden but doing so doesn't work as `ProjectGeneratedEvent` is publised as part as the base implementation. See gh-552 --- .../generator/ProjectGenerator.java | 10 +-- .../AbstractProjectGeneratorTests.java | 14 ++++- .../CustomProjectGeneratorTests.java | 63 +++++++++++++++++++ .../test/resources/project/maven/Jenkinsfile | 16 +++++ .../test/resources/templates/Jenkinsfile.tmpl | 16 +++++ 5 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java create mode 100644 initializr-generator/src/test/resources/project/maven/Jenkinsfile create mode 100644 initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java index 4ddb3553..30c3fb03 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java @@ -186,7 +186,9 @@ public class ProjectGenerator { */ public File generateProjectStructure(ProjectRequest request) { try { - return doGenerateProjectStructure(request); + File rootDir = doGenerateProjectStructure(request); + publishProjectGeneratedEvent(request); + return rootDir; } catch (InitializrException ex) { publishProjectFailedEvent(request, ex); @@ -254,9 +256,7 @@ public class ProjectGenerator { new File(dir, "src/main/resources/templates").mkdirs(); new File(dir, "src/main/resources/static").mkdirs(); } - publishProjectGeneratedEvent(request); return rootDir; - } /** @@ -566,11 +566,11 @@ public class ProjectGenerator { && !request.getJavaVersion().equals("1.7"); } - private static boolean isGradleBuild(ProjectRequest request) { + protected static boolean isGradleBuild(ProjectRequest request) { return "gradle".equals(request.getBuild()); } - private static boolean isMavenBuild(ProjectRequest request) { + protected static boolean isMavenBuild(ProjectRequest request) { return "maven".equals(request.getBuild()); } diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java index a1b34b51..83a25611 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java @@ -48,11 +48,19 @@ public abstract class AbstractProjectGeneratorTests { @Rule public final TemporaryFolder folder = new TemporaryFolder(); - protected final ProjectGenerator projectGenerator = new ProjectGenerator(); + protected final ProjectGenerator projectGenerator; - private final ApplicationEventPublisher eventPublisher = mock( + protected final ApplicationEventPublisher eventPublisher = mock( ApplicationEventPublisher.class); + public AbstractProjectGeneratorTests() { + this(new ProjectGenerator()); + } + + public AbstractProjectGeneratorTests(ProjectGenerator projectGenerator) { + this.projectGenerator = projectGenerator; + } + @Before public void setup() throws IOException { Dependency web = Dependency.withId("web"); @@ -104,7 +112,7 @@ public abstract class AbstractProjectGeneratorTests { verify(eventPublisher, times(1)).publishEvent(argThat(new ProjectFailedEventMatcher(request, ex))); } - private static class ProjectGeneratedEventMatcher + protected static class ProjectGeneratedEventMatcher extends ArgumentMatcher { private final ProjectRequest request; diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java new file mode 100644 index 00000000..346cc0de --- /dev/null +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java @@ -0,0 +1,63 @@ +package io.spring.initializr.generator; + +import io.spring.initializr.test.generator.ProjectAssert; +import org.junit.Test; +import org.mockito.InOrder; +import org.mockito.Mockito; +import org.springframework.core.io.ClassPathResource; + +import java.io.File; + +import static org.mockito.Matchers.argThat; +import static org.mockito.Mockito.times; + +public class CustomProjectGeneratorTests extends AbstractProjectGeneratorTests { + + public CustomProjectGeneratorTests() { + super(new MyProjectGenerator()); + } + + @Test + public void jenkinsfileMaven() { + ProjectRequest request = createProjectRequest(); + request.setType("maven-project"); + ProjectAssert project = generateProject(request); + project.sourceCodeAssert("Jenkinsfile") + .equalsTo(new ClassPathResource("project/maven/Jenkinsfile")); + } + + @Test + public void jenkinsfileGradle() { + ProjectRequest request = createProjectRequest(); + request.setType("gradle-build"); + ProjectAssert project = generateProject(request); + project.hasNoFile("Jenkinsfile"); + } + + @Test + public void projectGenerationEventAfterGeneratingAllFiles() throws Exception { + ProjectRequest request = createProjectRequest("web"); + generateProject(request); + verifyProjectSuccessfulEventFor(request); + + Runnable jenkinsfileGenerated = ((MyProjectGenerator) projectGenerator).jenkinsfileGenerated; + InOrder inOrder = Mockito.inOrder(eventPublisher, jenkinsfileGenerated); + + inOrder.verify(jenkinsfileGenerated, times(1)).run(); + inOrder.verify(eventPublisher, times(1)).publishEvent(argThat(new ProjectGeneratedEventMatcher(request))); + } + + private static class MyProjectGenerator extends ProjectGenerator { + protected final Runnable jenkinsfileGenerated = Mockito.mock(Runnable.class); + + @Override + protected File doGenerateProjectStructure(ProjectRequest request) { + File dir = super.doGenerateProjectStructure(request); + if (isMavenBuild(request)) { + write(new File(dir, "Jenkinsfile"), "Jenkinsfile.tmpl", resolveModel(request)); + jenkinsfileGenerated.run(); + } + return dir; + } + } +} diff --git a/initializr-generator/src/test/resources/project/maven/Jenkinsfile b/initializr-generator/src/test/resources/project/maven/Jenkinsfile new file mode 100644 index 00000000..847f0154 --- /dev/null +++ b/initializr-generator/src/test/resources/project/maven/Jenkinsfile @@ -0,0 +1,16 @@ +pipeline { + agent any + stages { + stage ('Build') { + steps { + echo "building com.example:demo:0.0.1-SNAPSHOT" + sh 'mvn -Dmaven.test.failure.ignore=true -B clean install' + } + post { + success { + junit 'target/surefire-reports/**/*.xml' + } + } + } + } +} \ No newline at end of file diff --git a/initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl b/initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl new file mode 100644 index 00000000..55c68a19 --- /dev/null +++ b/initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl @@ -0,0 +1,16 @@ +pipeline { + agent any + stages { + stage ('Build') { + steps { + echo "building {{groupId}}:{{artifactId}}:{{version}}" + sh 'mvn -Dmaven.test.failure.ignore=true -B clean install' + } + post { + success { + junit 'target/surefire-reports/**/*.xml' + } + } + } + } +} \ No newline at end of file From baf1022e6f1111e47868394192a284ca9dcfd1e9 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sun, 3 Dec 2017 02:00:42 +0000 Subject: [PATCH 2/2] Polish "Allow generation of custom files" Closes gh-552 --- .../generator/ProjectGenerator.java | 16 ++- .../AbstractProjectGeneratorTests.java | 4 +- .../CustomProjectGeneratorTests.java | 118 +++++++++++------- .../test/resources/project/custom/custom.txt | 4 + .../test/resources/project/maven/Jenkinsfile | 16 --- .../test/resources/templates/Jenkinsfile.tmpl | 16 --- .../src/test/resources/templates/custom.txt | 4 + 7 files changed, 96 insertions(+), 82 deletions(-) create mode 100644 initializr-generator/src/test/resources/project/custom/custom.txt delete mode 100644 initializr-generator/src/test/resources/project/maven/Jenkinsfile delete mode 100644 initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl create mode 100644 initializr-generator/src/test/resources/templates/custom.txt diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java index 30c3fb03..bdde4198 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java @@ -186,7 +186,8 @@ public class ProjectGenerator { */ public File generateProjectStructure(ProjectRequest request) { try { - File rootDir = doGenerateProjectStructure(request); + Map model = resolveModel(request); + File rootDir = generateProjectStructure(request, model); publishProjectGeneratedEvent(request); return rootDir; } @@ -196,9 +197,12 @@ public class ProjectGenerator { } } - protected File doGenerateProjectStructure(ProjectRequest request) { - Map model = resolveModel(request); - + /** + * Generate a project structure for the specified {@link ProjectRequest} and resolved + * model. + */ + protected File generateProjectStructure(ProjectRequest request, + Map model) { File rootDir; try { rootDir = File.createTempFile("tmp", "", getTemporaryDirectory()); @@ -566,11 +570,11 @@ public class ProjectGenerator { && !request.getJavaVersion().equals("1.7"); } - protected static boolean isGradleBuild(ProjectRequest request) { + private static boolean isGradleBuild(ProjectRequest request) { return "gradle".equals(request.getBuild()); } - protected static boolean isMavenBuild(ProjectRequest request) { + private static boolean isMavenBuild(ProjectRequest request) { return "maven".equals(request.getBuild()); } diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java index 83a25611..a7409d22 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java @@ -53,11 +53,11 @@ public abstract class AbstractProjectGeneratorTests { protected final ApplicationEventPublisher eventPublisher = mock( ApplicationEventPublisher.class); - public AbstractProjectGeneratorTests() { + protected AbstractProjectGeneratorTests() { this(new ProjectGenerator()); } - public AbstractProjectGeneratorTests(ProjectGenerator projectGenerator) { + protected AbstractProjectGeneratorTests(ProjectGenerator projectGenerator) { this.projectGenerator = projectGenerator; } diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java index 346cc0de..0ffa9164 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java @@ -1,63 +1,97 @@ +/* + * Copyright 2012-2017 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 + * + * http://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; +import java.io.File; +import java.util.Map; + import io.spring.initializr.test.generator.ProjectAssert; import org.junit.Test; import org.mockito.InOrder; import org.mockito.Mockito; + import org.springframework.core.io.ClassPathResource; -import java.io.File; - import static org.mockito.Matchers.argThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; +/** + * Test for custom {@link ProjectGenerator}. + * + * @author Torsten Walter + * @author Stephane Nicoll + */ public class CustomProjectGeneratorTests extends AbstractProjectGeneratorTests { - public CustomProjectGeneratorTests() { - super(new MyProjectGenerator()); - } + public CustomProjectGeneratorTests() { + super(new MyProjectGenerator()); + } - @Test - public void jenkinsfileMaven() { - ProjectRequest request = createProjectRequest(); - request.setType("maven-project"); - ProjectAssert project = generateProject(request); - project.sourceCodeAssert("Jenkinsfile") - .equalsTo(new ClassPathResource("project/maven/Jenkinsfile")); - } + @Test + public void generateCustomResource() { + ProjectRequest request = createProjectRequest(); + request.setType("maven-project"); + request.setGroupId("com.example.custom"); + ProjectAssert project = generateProject(request); + project.sourceCodeAssert("custom.txt") + .equalsTo(new ClassPathResource("project/custom/custom.txt")); + } - @Test - public void jenkinsfileGradle() { - ProjectRequest request = createProjectRequest(); - request.setType("gradle-build"); - ProjectAssert project = generateProject(request); - project.hasNoFile("Jenkinsfile"); - } + @Test + public void generateCustomResourceDisabled() { + ProjectRequest request = createProjectRequest(); + request.setType("gradle-build"); + request.setGroupId("com.example.custom"); + ProjectAssert project = generateProject(request); + project.hasNoFile("custom.txt"); + } - @Test - public void projectGenerationEventAfterGeneratingAllFiles() throws Exception { - ProjectRequest request = createProjectRequest("web"); - generateProject(request); - verifyProjectSuccessfulEventFor(request); + @Test + public void projectGenerationEventFiredAfterCustomization() { + ProjectRequest request = createProjectRequest(); + request.setType("maven-project"); + request.setGroupId("com.example.custom"); + generateProject(request); + verifyProjectSuccessfulEventFor(request); - Runnable jenkinsfileGenerated = ((MyProjectGenerator) projectGenerator).jenkinsfileGenerated; - InOrder inOrder = Mockito.inOrder(eventPublisher, jenkinsfileGenerated); + Runnable customFileGenerated = ((MyProjectGenerator) projectGenerator).customFileGenerated; + InOrder inOrder = Mockito.inOrder(eventPublisher, customFileGenerated); - inOrder.verify(jenkinsfileGenerated, times(1)).run(); - inOrder.verify(eventPublisher, times(1)).publishEvent(argThat(new ProjectGeneratedEventMatcher(request))); - } + inOrder.verify(customFileGenerated, times(1)).run(); + inOrder.verify(eventPublisher, times(1)).publishEvent( + argThat(new ProjectGeneratedEventMatcher(request))); + } - private static class MyProjectGenerator extends ProjectGenerator { - protected final Runnable jenkinsfileGenerated = Mockito.mock(Runnable.class); - @Override - protected File doGenerateProjectStructure(ProjectRequest request) { - File dir = super.doGenerateProjectStructure(request); - if (isMavenBuild(request)) { - write(new File(dir, "Jenkinsfile"), "Jenkinsfile.tmpl", resolveModel(request)); - jenkinsfileGenerated.run(); - } - return dir; - } - } + private static class MyProjectGenerator extends ProjectGenerator { + private Runnable customFileGenerated = mock(Runnable.class); + + @Override + protected File generateProjectStructure(ProjectRequest request, + Map model) { + model.put("customValue", 42); + File dir = super.generateProjectStructure(request, model); + if ("maven".equals(request.getBuild())) { + write(new File(dir, "custom.txt"), "custom.txt", model); + customFileGenerated.run(); + } + return dir; + } + } + } diff --git a/initializr-generator/src/test/resources/project/custom/custom.txt b/initializr-generator/src/test/resources/project/custom/custom.txt new file mode 100644 index 00000000..fdccaf98 --- /dev/null +++ b/initializr-generator/src/test/resources/project/custom/custom.txt @@ -0,0 +1,4 @@ +Custom resources + +com.example.custom +42 \ No newline at end of file diff --git a/initializr-generator/src/test/resources/project/maven/Jenkinsfile b/initializr-generator/src/test/resources/project/maven/Jenkinsfile deleted file mode 100644 index 847f0154..00000000 --- a/initializr-generator/src/test/resources/project/maven/Jenkinsfile +++ /dev/null @@ -1,16 +0,0 @@ -pipeline { - agent any - stages { - stage ('Build') { - steps { - echo "building com.example:demo:0.0.1-SNAPSHOT" - sh 'mvn -Dmaven.test.failure.ignore=true -B clean install' - } - post { - success { - junit 'target/surefire-reports/**/*.xml' - } - } - } - } -} \ No newline at end of file diff --git a/initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl b/initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl deleted file mode 100644 index 55c68a19..00000000 --- a/initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl +++ /dev/null @@ -1,16 +0,0 @@ -pipeline { - agent any - stages { - stage ('Build') { - steps { - echo "building {{groupId}}:{{artifactId}}:{{version}}" - sh 'mvn -Dmaven.test.failure.ignore=true -B clean install' - } - post { - success { - junit 'target/surefire-reports/**/*.xml' - } - } - } - } -} \ No newline at end of file diff --git a/initializr-generator/src/test/resources/templates/custom.txt b/initializr-generator/src/test/resources/templates/custom.txt new file mode 100644 index 00000000..40eca41b --- /dev/null +++ b/initializr-generator/src/test/resources/templates/custom.txt @@ -0,0 +1,4 @@ +Custom resources + +{{groupId}} +{{customValue}} \ No newline at end of file