You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2026/06/16 10:19:17 UTC
(maven) branch cherry-pick-12147-to-master created (now 59bfe2ba42)
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a change to branch cherry-pick-12147-to-master
in repository https://gitbox.apache.org/repos/asf/maven.git
at 59bfe2ba42 Forward-port #12147: Avoid reflective InputSource modelId mutation
This branch includes the following new commits:
new 59bfe2ba42 Forward-port #12147: Avoid reflective InputSource modelId mutation
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(maven) 01/01: Forward-port #12147: Avoid reflective InputSource modelId mutation
Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch cherry-pick-12147-to-master
in repository https://gitbox.apache.org/repos/asf/maven.git
commit 59bfe2ba42cb0c67946e13b1bc4d8f3bc4e68f4f
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Sat Jun 13 22:27:29 2026 +0000
Forward-port #12147: Avoid reflective InputSource modelId mutation
---
.../apache/maven/impl/DefaultModelXmlFactory.java | 35 +++++++++-------------
1 file changed, 14 insertions(+), 21 deletions(-)
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelXmlFactory.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelXmlFactory.java
index 49324026ce..575d35e230 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelXmlFactory.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelXmlFactory.java
@@ -98,7 +98,6 @@ private Model doRead(XmlReaderRequest request) throws XmlReaderException {
throw new IllegalArgumentException("path, url, reader or inputStream must be non null");
}
try {
- // If modelId is not provided and we're reading from a file, try to extract it
String modelId = request.getModelId();
String location = request.getLocation();
@@ -206,33 +205,28 @@ static class InputFactoryHolder {
* @param inputStream the input stream to read from
* @return the modelId in format "groupId:artifactId:version" or null if not determinable
*/
- private String extractModelId(InputStream inputStream) {
+ private static String extractModelId(InputStream inputStream) {
try {
- XMLStreamReader reader = InputFactoryHolder.XML_INPUT_FACTORY.createXMLStreamReader(inputStream);
+ XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(inputStream);
try {
- return extractModelId(reader);
+ return extractModelId(xmlReader);
} finally {
- reader.close();
+ xmlReader.close();
}
} catch (Exception e) {
- // If extraction fails, return null and let the normal parsing handle it
- // This is not a critical failure
return null;
}
}
- private String extractModelId(Reader reader) {
+ private static String extractModelId(Reader reader) {
try {
- // Use a buffered stream to allow efficient reading
- XMLStreamReader xmlReader = InputFactoryHolder.XML_INPUT_FACTORY.createXMLStreamReader(reader);
+ XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(reader);
try {
return extractModelId(xmlReader);
} finally {
xmlReader.close();
}
} catch (Exception e) {
- // If extraction fails, return null and let the normal parsing handle it
- // This is not a critical failure
return null;
}
}
@@ -244,6 +238,7 @@ private static String extractModelId(XMLStreamReader reader) throws XMLStreamExc
String parentGroupId = null;
String parentVersion = null;
+ int depth = 0;
boolean inProject = false;
boolean inParent = false;
String currentElement = null;
@@ -252,13 +247,15 @@ private static String extractModelId(XMLStreamReader reader) throws XMLStreamExc
int event = reader.next();
if (event == XMLStreamConstants.START_ELEMENT) {
+ depth++;
String localName = reader.getLocalName();
- if ("project".equals(localName)) {
+ if (depth == 1 && "project".equals(localName)) {
inProject = true;
- } else if ("parent".equals(localName) && inProject) {
+ } else if (inProject && depth == 2 && "parent".equals(localName)) {
inParent = true;
} else if (inProject
+ && (depth == 2 || (depth == 3 && inParent))
&& ("groupId".equals(localName)
|| "artifactId".equals(localName)
|| "version".equals(localName))) {
@@ -270,9 +267,10 @@ private static String extractModelId(XMLStreamReader reader) throws XMLStreamExc
if ("parent".equals(localName)) {
inParent = false;
} else if ("project".equals(localName)) {
- break; // We've processed the main project element
+ break;
}
currentElement = null;
+ depth--;
} else if (event == XMLStreamConstants.CHARACTERS && currentElement != null) {
String text = reader.getText().trim();
if (!text.isEmpty()) {
@@ -285,7 +283,6 @@ private static String extractModelId(XMLStreamReader reader) throws XMLStreamExc
parentVersion = text;
break;
default:
- // Ignore other elements
break;
}
} else {
@@ -300,20 +297,17 @@ private static String extractModelId(XMLStreamReader reader) throws XMLStreamExc
version = text;
break;
default:
- // Ignore other elements
break;
}
}
}
}
- // Early exit if we have enough information
- if (artifactId != null && groupId != null && version != null) {
+ if (groupId != null && artifactId != null && version != null) {
break;
}
}
- // Use parent values as fallback
if (groupId == null) {
groupId = parentGroupId;
}
@@ -321,7 +315,6 @@ private static String extractModelId(XMLStreamReader reader) throws XMLStreamExc
version = parentVersion;
}
- // Return modelId if we have all required components
if (groupId != null && artifactId != null && version != null) {
return groupId + ":" + artifactId + ":" + version;
}