Skip to content

Commit e9532ed

Browse files
dsyermhalbritter
authored andcommitted
Add support for processing instructions (e.g. m2e) in plugin
IDEs (Eclipse and VSCode) take hints from processing instructions in the plugin executions. This change adds support for processing instructions in the plugin configuration. See gh-1650 Signed-off-by: Dave Syer <david.syer@broadcom.com>
1 parent 74a74b6 commit e9532ed

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,10 @@ else if (setting.getValue() instanceof List) {
454454

455455
private void writePluginExecution(IndentingWriter writer, Execution execution) {
456456
writeElement(writer, "execution", () -> {
457+
List<String> processingInstructions = execution.getProcessingInstructions();
458+
for (String instruction : processingInstructions) {
459+
writeProcessingInstruction(writer, instruction);
460+
}
457461
writeSingleElement(writer, "id", execution.getId());
458462
writeSingleElement(writer, "phase", execution.getPhase());
459463
List<String> goals = execution.getGoals();
@@ -636,6 +640,10 @@ private void writeSingleElement(IndentingWriter writer, String name, Object valu
636640
}
637641
}
638642

643+
private void writeProcessingInstruction(IndentingWriter writer, String content) {
644+
writer.println(String.format("<?%s?>", content));
645+
}
646+
639647
private void writeElement(IndentingWriter writer, String name, Runnable withContent) {
640648
writer.println(String.format("<%s>", name));
641649
writer.indented(withContent);

initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenPlugin.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,8 @@ public static class ExecutionBuilder {
286286

287287
private final List<String> goals = new ArrayList<>();
288288

289+
private final List<String> processingInstructions = new ArrayList<>();
290+
289291
private ConfigurationBuilder configurationCustomization = null;
290292

291293
/**
@@ -298,7 +300,8 @@ public ExecutionBuilder(String id) {
298300

299301
Execution build() {
300302
return new Execution(this.id, this.phase, this.goals,
301-
(this.configurationCustomization == null) ? null : this.configurationCustomization.build());
303+
(this.configurationCustomization == null) ? null : this.configurationCustomization.build(),
304+
this.processingInstructions);
302305
}
303306

304307
/**
@@ -321,6 +324,25 @@ public ExecutionBuilder goal(String goal) {
321324
return this;
322325
}
323326

327+
/**
328+
* Add a processing instruction to invoke for this execution.
329+
* @param content the processing instruction to add
330+
* @return this for method chaining
331+
*/
332+
public ExecutionBuilder processingInstruction(String content) {
333+
this.processingInstructions.add(content);
334+
return this;
335+
}
336+
337+
/**
338+
* Add a m2e hint, e.g. "execute onConfiguration,onIncremental" or "ignore".
339+
* @param hint the hint to add
340+
* @return this for method chaining
341+
*/
342+
public ExecutionBuilder m2e(String hint) {
343+
return processingInstruction("m2e " + hint);
344+
}
345+
324346
/**
325347
* Customize the {@code configuration} of the execution using the specified
326348
* consumer.
@@ -487,11 +509,15 @@ public static final class Execution {
487509

488510
private final Configuration configuration;
489511

490-
private Execution(String id, String phase, List<String> goals, Configuration configuration) {
512+
private final List<String> processingInstructions;
513+
514+
private Execution(String id, String phase, List<String> goals, Configuration configuration,
515+
List<String> processingInstructions) {
491516
this.id = id;
492517
this.phase = phase;
493518
this.goals = Collections.unmodifiableList(goals);
494519
this.configuration = configuration;
520+
this.processingInstructions = processingInstructions;
495521
}
496522

497523
/**
@@ -526,6 +552,10 @@ public Configuration getConfiguration() {
526552
return this.configuration;
527553
}
528554

555+
public List<String> getProcessingInstructions() {
556+
return this.processingInstructions;
557+
}
558+
529559
}
530560

531561
/**

initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriterTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import io.spring.initializr.generator.version.VersionProperty;
3131
import io.spring.initializr.generator.version.VersionReference;
3232
import org.junit.jupiter.api.Test;
33+
import org.w3c.dom.Node;
3334

3435
import static org.assertj.core.api.Assertions.assertThat;
3536

@@ -685,6 +686,37 @@ void pomWithPluginWithExecution() {
685686
});
686687
}
687688

689+
@Test
690+
void pomWithPluginWithExecutionAndIDEHint() {
691+
MavenBuild build = new MavenBuild();
692+
build.settings().coordinates("com.example.demo", "demo");
693+
build.plugins().add("org.asciidoctor", "asciidoctor-maven-plugin", (plugin) -> {
694+
plugin.version("1.5.3");
695+
plugin.execution("generateProject-docs", (execution) -> {
696+
execution.m2e("ignore");
697+
execution.goal("process-asciidoc");
698+
});
699+
});
700+
generatePom(build, (pom) -> {
701+
NodeAssert plugin = pom.nodeAtPath("/project/build/plugins/plugin");
702+
assertThat(plugin).textAtPath("groupId").isEqualTo("org.asciidoctor");
703+
assertThat(plugin).textAtPath("artifactId").isEqualTo("asciidoctor-maven-plugin");
704+
assertThat(plugin).textAtPath("version").isEqualTo("1.5.3");
705+
NodeAssert execution = plugin.nodeAtPath("executions/execution");
706+
assertThat(execution).textAtPath("id").isEqualTo("generateProject-docs");
707+
assertThat(execution).matches((node) -> {
708+
Node child = node.getFirstChild();
709+
while (child != null) {
710+
if (child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) {
711+
return child.getNodeName().equals("m2e") && child.getTextContent().equals("ignore");
712+
}
713+
child = child.getNextSibling();
714+
}
715+
return false;
716+
}, "m2e:ignore");
717+
});
718+
}
719+
688720
@Test
689721
void pomWithPluginWithDependency() {
690722
MavenBuild build = new MavenBuild();

0 commit comments

Comments
 (0)