From b5e5ab9a92713c73613d82f96741b65f87587aa3 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Sun, 2 Aug 2026 11:34:57 +0000 Subject: [PATCH 1/2] Skip malformed supplemental model entries instead of failing with NPE (#266) --- .../AbstractProcessRemoteResourcesMojo.java | 4 +++ .../remote/RemoteResourcesMojoTest.java | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java b/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java index f57f6d1..d69f516 100644 --- a/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java +++ b/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java @@ -1080,6 +1080,10 @@ private Map loadSupplements(String[] models) throws MojoExecution Xpp3Dom dom = (Xpp3Dom) sd.getProject(); Model m = getSupplement(dom); + if (m == null) { + getLog().warn("Skipping malformed supplemental model entry."); + continue; + } supplementMap.put(generateSupplementMapKey(m.getGroupId(), m.getArtifactId()), m); } diff --git a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java index 583732b..b6e08e9 100644 --- a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java +++ b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java @@ -91,6 +91,31 @@ public void testNoBundles() throws Exception { mojo.execute(); } + public void testMalformedSupplementalModelDoesNotBreakBuild() throws Exception { + final MavenProjectResourcesStub project = createTestProject("default-malformedsupplement"); + final ProcessRemoteResourcesMojo mojo = lookupProcessMojoWithDefaultSettings(project); + + setupDefaultProject(project); + + File supplementalModelsFile = new File(project.getBasedir(), "supplemental-models.xml"); + FileUtils.fileWrite( + supplementalModelsFile.getAbsolutePath(), + "" + + "" + + "" + + "test" + + "test" + + "1.0" + + "whatever" + + "" + + "" + + ""); + + setVariableValueToObject(mojo, "supplementalModels", new String[] {supplementalModelsFile.getAbsolutePath()}); + + mojo.execute(); + } + public void testCreateBundle() throws Exception { List resources = Arrays.asList("FILTER.txt.vm", "ISO-8859-1.bin.vm", "PROPERTIES.txt.vm", "SIMPLE.txt", "UTF-8.bin.vm"); From 8c50d3ffc508cc163466939d4c3dd1cce42e7fbb Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Sun, 2 Aug 2026 11:37:31 +0000 Subject: [PATCH 2/2] Fail with MojoExecutionException on malformed supplemental model (#266) --- .../remote/AbstractProcessRemoteResourcesMojo.java | 10 +++------- .../resources/remote/RemoteResourcesMojoTest.java | 10 ++++++++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java b/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java index d69f516..4d13907 100644 --- a/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java +++ b/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java @@ -1007,7 +1007,7 @@ private void verifyRequiredProperties(RemoteResourcesBundle bundle, URL url) thr protected Model getSupplement(Xpp3Dom supplementModelXml) throws MojoExecutionException { MavenXpp3Reader modelReader = new MavenXpp3Reader(); - Model model = null; + Model model; try { model = modelReader.read(new StringReader(supplementModelXml.toString())); @@ -1024,9 +1024,9 @@ protected Model getSupplement(Xpp3Dom supplementModelXml) throws MojoExecutionEx "Supplemental project XML " + "requires that a element be present."); } } catch (IOException e) { - getLog().warn("Unable to read supplemental XML: " + e.getMessage(), e); + throw new MojoExecutionException("Unable to read supplemental XML: " + e.getMessage(), e); } catch (XmlPullParserException e) { - getLog().warn("Unable to parse supplemental XML: " + e.getMessage(), e); + throw new MojoExecutionException("Unable to parse supplemental XML: " + e.getMessage(), e); } return model; @@ -1080,10 +1080,6 @@ private Map loadSupplements(String[] models) throws MojoExecution Xpp3Dom dom = (Xpp3Dom) sd.getProject(); Model m = getSupplement(dom); - if (m == null) { - getLog().warn("Skipping malformed supplemental model entry."); - continue; - } supplementMap.put(generateSupplementMapKey(m.getGroupId(), m.getArtifactId()), m); } diff --git a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java index b6e08e9..fd60364 100644 --- a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java +++ b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java @@ -41,6 +41,7 @@ import org.apache.maven.execution.DefaultMavenExecutionRequest; import org.apache.maven.execution.DefaultMavenExecutionResult; import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.resources.remote.stub.MavenProjectBuildStub; import org.apache.maven.plugin.resources.remote.stub.MavenProjectResourcesStub; import org.apache.maven.plugin.testing.AbstractMojoTestCase; @@ -91,7 +92,7 @@ public void testNoBundles() throws Exception { mojo.execute(); } - public void testMalformedSupplementalModelDoesNotBreakBuild() throws Exception { + public void testMalformedSupplementalModelFailsWithMojoExecutionException() throws Exception { final MavenProjectResourcesStub project = createTestProject("default-malformedsupplement"); final ProcessRemoteResourcesMojo mojo = lookupProcessMojoWithDefaultSettings(project); @@ -113,7 +114,12 @@ public void testMalformedSupplementalModelDoesNotBreakBuild() throws Exception { setVariableValueToObject(mojo, "supplementalModels", new String[] {supplementalModelsFile.getAbsolutePath()}); - mojo.execute(); + try { + mojo.execute(); + fail("Expected a MojoExecutionException for a malformed supplemental model entry"); + } catch (MojoExecutionException e) { + assertTrue(e.getMessage(), e.getMessage().contains("Unable to parse supplemental XML")); + } } public void testCreateBundle() throws Exception {