This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 10.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/10.0.x by this push:
new 1fac2707f3 Manually merge #535 - improve error message for duplicate
fragments
1fac2707f3 is described below
commit 1fac2707f3d9a6da64610333fcad310ee6d9b8a2
Author: Mark Thomas <[email protected]>
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 dd57b512d3..a84bc1fbe0 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 62b5ed7f28..f5300cf7dd 100644
--- a/java/org/apache/tomcat/util/descriptor/web/WebXml.java
+++ b/java/org/apache/tomcat/util/descriptor/web/WebXml.java
@@ -84,12 +84,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);
}
/**
@@ -2264,8 +2275,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 9e29c91699..24e5093097 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: [email protected]
For additional commands, e-mail: [email protected]