This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push: new 0e323eb32b Manually merge #535 - improve error message for duplicate fragments 0e323eb32b is described below commit 0e323eb32b854f59ce56ee1cd8fdd88dd48f34b6 Author: Mark Thomas <ma...@apache.org> AuthorDate: Wed Aug 24 14:20:19 2022 +0100 Manually merge #535 - improve error message for duplicate fragments Now lists the JARs that contain the duplicates. PR by Mads Rolsdorph --- .../descriptor/web/FragmentJarScannerCallback.java | 2 +- .../util/descriptor/web/LocalStrings.properties | 2 +- .../apache/tomcat/util/descriptor/web/WebXml.java | 21 +++++++++++++---- .../util/descriptor/web/TestWebXmlOrdering.java | 27 ++++++++++++++++++++++ webapps/docs/changelog.xml | 6 +++++ 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java b/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java index 8782e26b6e..9455d4763c 100644 --- a/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java +++ b/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java @@ -136,7 +136,7 @@ public class FragmentJarScannerCallback implements JarScannerCallback { // this name as having a duplicate so Tomcat can handle it // correctly when the fragments are being ordered. String duplicateName = fragment.getName(); - fragments.get(duplicateName).setDuplicated(true); + fragments.get(duplicateName).addDuplicate(url.toString()); // Rename the current fragment so it doesn't clash fragment.setName(url.toString()); } diff --git a/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties b/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties index a48dac4448..55e40e0c12 100644 --- a/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties +++ b/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties @@ -32,7 +32,7 @@ webRuleSet.relativeOrderingCount=<ordering> element is limited to 1 occurrence webXml.duplicateEnvEntry=Duplicate env-entry name [{0}] webXml.duplicateFilter=Duplicate filter name [{0}] -webXml.duplicateFragment=More than one fragment with the name [{0}] was found. This is not legal with relative ordering. See section 8.2.2 2c of the Servlet specification for details. Consider using absolute ordering. +webXml.duplicateFragment=More than one fragment with the name [{0}] was found. This is not legal with relative ordering. See section 8.2.2 2c of the Servlet specification for details. Consider using absolute ordering. Duplicate fragments found in [{1}]. webXml.duplicateMessageDestination=Duplicate message-destination name [{0}] webXml.duplicateMessageDestinationRef=Duplicate message-destination-ref name [{0}] webXml.duplicateResourceEnvRef=Duplicate resource-env-ref name [{0}] diff --git a/java/org/apache/tomcat/util/descriptor/web/WebXml.java b/java/org/apache/tomcat/util/descriptor/web/WebXml.java index 3dc6a3ed28..3eb1a0f253 100644 --- a/java/org/apache/tomcat/util/descriptor/web/WebXml.java +++ b/java/org/apache/tomcat/util/descriptor/web/WebXml.java @@ -85,12 +85,23 @@ public class WebXml extends XmlEncodingBase implements DocumentProperties.Charse * to know as the action that the specification requires (see 8.2.2 1.e and * 2.c) varies depending on the ordering method used. */ - private boolean duplicated = false; + private final List<String> duplicates = new ArrayList<>(); public boolean isDuplicated() { - return duplicated; + return !duplicates.isEmpty(); } + @Deprecated public void setDuplicated(boolean duplicated) { - this.duplicated = duplicated; + if (duplicated) { + duplicates.add("unknown"); + } else { + duplicates.clear(); + } + } + public void addDuplicate(String duplicate) { + this.duplicates.add(duplicate); + } + public List<String> getDuplicates() { + return new ArrayList<>(this.duplicates); } /** @@ -2166,8 +2177,10 @@ public class WebXml extends XmlEncodingBase implements DocumentProperties.Charse // Stage 0. Check there were no fragments with duplicate names for (WebXml fragment : fragments.values()) { if (fragment.isDuplicated()) { + List<String> duplicates = fragment.getDuplicates(); + duplicates.add(0, fragment.getURL().toString()); throw new IllegalArgumentException( - sm.getString("webXml.duplicateFragment", fragment.getName())); + sm.getString("webXml.duplicateFragment", fragment.getName(), duplicates)); } } // Stage 1. Make all dependencies bi-directional - this makes the diff --git a/test/org/apache/tomcat/util/descriptor/web/TestWebXmlOrdering.java b/test/org/apache/tomcat/util/descriptor/web/TestWebXmlOrdering.java index e854965a79..5c221d19c1 100644 --- a/test/org/apache/tomcat/util/descriptor/web/TestWebXmlOrdering.java +++ b/test/org/apache/tomcat/util/descriptor/web/TestWebXmlOrdering.java @@ -16,6 +16,8 @@ */ package org.apache.tomcat.util.descriptor.web; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -348,6 +350,31 @@ public class TestWebXmlOrdering { WebXml.orderWebFragments(app, fragments, null); } + @Test(expected=IllegalArgumentException.class) + public void testOrderWebFragmentsRelativeDuplicate() throws MalformedURLException { + WebXml withDuplicate = new WebXml(); + withDuplicate.setURL(new URL("https://example.com/original.jar")); + withDuplicate.addDuplicate("https://example.com/duplicate.jar"); + + Map<String,WebXml> fragmentsWithDuplicate = new LinkedHashMap<>(); + fragmentsWithDuplicate.put("has-duplicate", withDuplicate); + + WebXml.orderWebFragments(app, fragmentsWithDuplicate, null); + } + + @SuppressWarnings("deprecation") + @Test(expected=IllegalArgumentException.class) + public void testOrderWebFragmentsRelativeDuplicateDeprecated() throws MalformedURLException { + WebXml withDuplicate = new WebXml(); + withDuplicate.setURL(new URL("https://example.com/original.jar")); + withDuplicate.setDuplicated(true); + + Map<String,WebXml> fragmentsWithDuplicate = new LinkedHashMap<>(); + fragmentsWithDuplicate.put("has-duplicate", withDuplicate); + + WebXml.orderWebFragments(app, fragmentsWithDuplicate, null); + } + private interface RelativeOrderingTestRunner { void init(); void validate(String order); diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index a9362be59f..fa05a1aa97 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -152,6 +152,12 @@ <bug>66233</bug>: Include an error message when sending a 400 response because a request has too many cookies. (markt) </fix> + <fix> + When web application deployment fails due to JARs with duplicate + fragment names, improve the error message by listing the JARs that + contain the duplicates. Based on pull request <pr>535</pr> by Mads + Rolsdorph. (markt) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org