buffer) {
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/ParentXMLFilter.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/ParentXMLFilter.java
index 37160fd352..d483405f99 100644
--- a/maven-model-transform/src/main/java/org/apache/maven/model/transform/ParentXMLFilter.java
+++ b/maven-model-transform/src/main/java/org/apache/maven/model/transform/ParentXMLFilter.java
@@ -18,6 +18,8 @@
*/
package org.apache.maven.model.transform;
+import javax.xml.stream.XMLStreamReader;
+
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -27,8 +29,7 @@
import java.util.function.Function;
import java.util.regex.Pattern;
-import org.apache.maven.model.transform.pull.NodeBufferingParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import org.apache.maven.model.transform.stax.NodeBufferingParser;
/**
*
@@ -54,8 +55,8 @@ class ParentXMLFilter extends NodeBufferingParser {
* @param relativePathMapper
*/
ParentXMLFilter(
- XmlPullParser parser, Function> relativePathMapper, Path projectPath) {
- super(parser, "parent");
+ XMLStreamReader delegate, Function> relativePathMapper, Path projectPath) {
+ super(delegate, "parent");
this.relativePathMapper = relativePathMapper;
this.projectPath = projectPath;
}
@@ -71,11 +72,11 @@ protected void process(List buffer) {
boolean hasRelativePath = false;
for (int i = 0; i < buffer.size(); i++) {
Event event = buffer.get(i);
- if (event.event == START_TAG) {
+ if (event.event == START_ELEMENT) {
tagName = event.name;
hasVersion |= "version".equals(tagName);
hasRelativePath |= "relativePath".equals(tagName);
- } else if (event.event == TEXT) {
+ } else if (event.event == CHARACTERS) {
if (S_FILTER.matcher(event.text).matches()) {
if (whitespaceAfterParentStart.isEmpty()) {
whitespaceAfterParentStart = event.text;
@@ -89,7 +90,7 @@ protected void process(List buffer) {
} else if ("version".equals(tagName)) {
version = nullSafeAppend(version, event.text);
}
- } else if (event.event == END_TAG && "parent".equals(event.name)) {
+ } else if (event.event == END_ELEMENT && "parent".equals(event.name)) {
Optional resolvedParent;
if (!hasVersion && (!hasRelativePath || relativePath != null)) {
Path relPath = Paths.get(Objects.toString(relativePath, "../pom.xml"));
@@ -98,23 +99,23 @@ protected void process(List buffer) {
resolvedParent = Optional.empty();
}
if (!hasVersion && resolvedParent.isPresent()) {
- int pos = buffer.get(i - 1).event == TEXT ? i - 1 : i;
+ int pos = buffer.get(i - 1).event == CHARACTERS ? i - 1 : i;
Event e = new Event();
- e.event = TEXT;
+ e.event = CHARACTERS;
e.text = whitespaceAfterParentStart;
buffer.add(pos++, e);
e = new Event();
- e.event = START_TAG;
+ e.event = START_ELEMENT;
e.namespace = buffer.get(0).namespace;
e.prefix = buffer.get(0).prefix;
e.name = "version";
buffer.add(pos++, e);
e = new Event();
- e.event = TEXT;
+ e.event = CHARACTERS;
e.text = resolvedParent.get().getVersion();
buffer.add(pos++, e);
e = new Event();
- e.event = END_TAG;
+ e.event = END_ELEMENT;
e.name = "version";
e.namespace = buffer.get(0).namespace;
e.prefix = buffer.get(0).prefix;
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/RawToConsumerPomXMLFilterFactory.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/RawToConsumerPomXMLFilterFactory.java
index 617d7d91f0..9b10654acd 100644
--- a/maven-model-transform/src/main/java/org/apache/maven/model/transform/RawToConsumerPomXMLFilterFactory.java
+++ b/maven-model-transform/src/main/java/org/apache/maven/model/transform/RawToConsumerPomXMLFilterFactory.java
@@ -18,9 +18,9 @@
*/
package org.apache.maven.model.transform;
-import java.nio.file.Path;
+import javax.xml.stream.XMLStreamReader;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import java.nio.file.Path;
/**
* @author Guillaume Nodet
@@ -34,9 +34,9 @@ public RawToConsumerPomXMLFilterFactory(BuildToRawPomXMLFilterFactory buildPomXM
this.buildPomXMLFilterFactory = buildPomXMLFilterFactory;
}
- public final XmlPullParser get(XmlPullParser orgParser, Path projectPath) {
+ public final XMLStreamReader get(XMLStreamReader orgParser, Path projectPath) {
// Ensure that xs:any elements aren't touched by next filters
- XmlPullParser parser = orgParser instanceof FastForwardFilter ? orgParser : new FastForwardFilter(orgParser);
+ XMLStreamReader parser = orgParser instanceof FastForwardFilter ? orgParser : new FastForwardFilter(orgParser);
parser = buildPomXMLFilterFactory.get(parser, projectPath);
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/ReactorDependencyXMLFilter.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/ReactorDependencyXMLFilter.java
index 186383f1c2..269b921788 100644
--- a/maven-model-transform/src/main/java/org/apache/maven/model/transform/ReactorDependencyXMLFilter.java
+++ b/maven-model-transform/src/main/java/org/apache/maven/model/transform/ReactorDependencyXMLFilter.java
@@ -18,12 +18,13 @@
*/
package org.apache.maven.model.transform;
+import javax.xml.stream.XMLStreamReader;
+
import java.util.List;
import java.util.function.BiFunction;
import java.util.regex.Pattern;
-import org.apache.maven.model.transform.pull.NodeBufferingParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import org.apache.maven.model.transform.stax.NodeBufferingParser;
/**
* Will apply the version if the dependency is part of the reactor
@@ -38,8 +39,8 @@ public class ReactorDependencyXMLFilter extends NodeBufferingParser {
private static final Pattern S_FILTER = Pattern.compile("\\s+");
public ReactorDependencyXMLFilter(
- XmlPullParser xmlPullParser, BiFunction reactorVersionMapper) {
- super(xmlPullParser, "dependency");
+ XMLStreamReader delegate, BiFunction reactorVersionMapper) {
+ super(delegate, "dependency");
this.reactorVersionMapper = reactorVersionMapper;
}
@@ -52,10 +53,10 @@ protected void process(List buffer) {
String tagName = null;
for (int i = 0; i < buffer.size(); i++) {
Event event = buffer.get(i);
- if (event.event == START_TAG) {
+ if (event.event == START_ELEMENT) {
tagName = event.name;
hasVersion |= "version".equals(tagName);
- } else if (event.event == TEXT) {
+ } else if (event.event == CHARACTERS) {
if (S_FILTER.matcher(event.text).matches()) {
if (dependencyWhitespace.isEmpty()) {
dependencyWhitespace = event.text;
@@ -65,26 +66,26 @@ protected void process(List buffer) {
} else if ("artifactId".equals(tagName)) {
artifactId = nullSafeAppend(artifactId, event.text);
}
- } else if (event.event == END_TAG && "dependency".equals(event.name)) {
+ } else if (event.event == END_ELEMENT && "dependency".equals(event.name)) {
String version = reactorVersionMapper.apply(groupId, artifactId);
if (!hasVersion && version != null) {
- int pos = buffer.get(i - 1).event == TEXT ? i - 1 : i;
+ int pos = buffer.get(i - 1).event == CHARACTERS ? i - 1 : i;
Event e = new Event();
- e.event = TEXT;
+ e.event = CHARACTERS;
e.text = dependencyWhitespace;
buffer.add(pos++, e);
e = new Event();
- e.event = START_TAG;
+ e.event = START_ELEMENT;
e.namespace = buffer.get(0).namespace;
e.prefix = buffer.get(0).prefix;
e.name = "version";
buffer.add(pos++, e);
e = new Event();
- e.event = TEXT;
+ e.event = CHARACTERS;
e.text = version;
buffer.add(pos++, e);
e = new Event();
- e.event = END_TAG;
+ e.event = END_ELEMENT;
e.name = "version";
e.namespace = buffer.get(0).namespace;
e.prefix = buffer.get(0).prefix;
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/RelativePathXMLFilter.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/RelativePathXMLFilter.java
index f785ab3498..b40d7d2bce 100644
--- a/maven-model-transform/src/main/java/org/apache/maven/model/transform/RelativePathXMLFilter.java
+++ b/maven-model-transform/src/main/java/org/apache/maven/model/transform/RelativePathXMLFilter.java
@@ -18,11 +18,12 @@
*/
package org.apache.maven.model.transform;
+import javax.xml.stream.XMLStreamReader;
+
import java.util.List;
import java.util.regex.Pattern;
-import org.apache.maven.model.transform.pull.NodeBufferingParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import org.apache.maven.model.transform.stax.NodeBufferingParser;
/**
* Remove relativePath element, has no value for consumer pom
@@ -35,23 +36,23 @@ public class RelativePathXMLFilter extends NodeBufferingParser {
private static final Pattern S_FILTER = Pattern.compile("\\s+");
- public RelativePathXMLFilter(XmlPullParser xmlPullParser) {
- super(xmlPullParser, "parent");
+ public RelativePathXMLFilter(XMLStreamReader delegate) {
+ super(delegate, "parent");
}
protected void process(List buffer) {
boolean skip = false;
Event prev = null;
for (Event event : buffer) {
- if (event.event == START_TAG && "relativePath".equals(event.name)) {
+ if (event.event == START_ELEMENT && "relativePath".equals(event.name)) {
skip = true;
if (prev != null
- && prev.event == TEXT
+ && prev.event == CHARACTERS
&& S_FILTER.matcher(prev.text).matches()) {
prev = null;
}
event = null;
- } else if (event.event == END_TAG && "relativePath".equals(event.name)) {
+ } else if (event.event == END_ELEMENT && "relativePath".equals(event.name)) {
skip = false;
event = null;
} else if (skip) {
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/RootXMLFilter.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/RootXMLFilter.java
index af40c5c54d..d506ff23b9 100644
--- a/maven-model-transform/src/main/java/org/apache/maven/model/transform/RootXMLFilter.java
+++ b/maven-model-transform/src/main/java/org/apache/maven/model/transform/RootXMLFilter.java
@@ -18,12 +18,14 @@
*/
package org.apache.maven.model.transform;
-import java.io.IOException;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
import java.util.stream.Stream;
-import org.apache.maven.model.transform.pull.BufferingParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.apache.maven.model.transform.stax.BufferingParser;
/**
* Remove the root attribute on the model
@@ -32,14 +34,18 @@
* @since 4.0.0
*/
class RootXMLFilter extends BufferingParser {
- RootXMLFilter(XmlPullParser xmlPullParser) {
- super(xmlPullParser);
+
+ final Deque elements = new ArrayDeque<>();
+
+ RootXMLFilter(XMLStreamReader delegate) {
+ super(delegate);
}
@Override
- protected boolean accept() throws XmlPullParserException, IOException {
- if (xmlPullParser.getEventType() == XmlPullParser.START_TAG) {
- if (xmlPullParser.getDepth() == 1 && "project".equals(xmlPullParser.getName())) {
+ protected boolean accept() throws XMLStreamException {
+ if (delegate.getEventType() == START_ELEMENT) {
+ elements.push(delegate.getLocalName());
+ if (elements.size() == 1 && "project".equals(delegate.getLocalName())) {
Event event = bufferEvent();
event.attributes = Stream.of(event.attributes)
.filter(a -> !"root".equals(a.name))
@@ -47,6 +53,8 @@ protected boolean accept() throws XmlPullParserException, IOException {
pushEvent(event);
return false;
}
+ } else if (delegate.getEventType() == END_ELEMENT) {
+ elements.pop();
}
return true;
}
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/BufferingParser.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/BufferingParser.java
deleted file mode 100644
index b283a39319..0000000000
--- a/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/BufferingParser.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.model.transform.pull;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.util.ArrayDeque;
-import java.util.Arrays;
-import java.util.Deque;
-import java.util.Objects;
-import java.util.regex.Pattern;
-
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-
-/**
- * An xml pull parser filter base implementation.
- *
- * @author Guillaume Nodet
- * @since 4.0.0
- */
-public class BufferingParser implements XmlPullParser {
-
- private static final Pattern WHITESPACE_REGEX = Pattern.compile("[ \r\t\n]+");
-
- protected XmlPullParser xmlPullParser;
- protected Deque events;
- protected Event current;
- protected boolean bypass;
-
- @SuppressWarnings("checkstyle:VisibilityModifier")
- public static class Event {
- public int event;
- public String name;
- public String prefix;
- public String namespace;
- public boolean empty;
- public String text;
- public Attribute[] attributes;
- public Namespace[] namespaces;
- public int columnNumber;
- public int lineNumber;
-
- public String positionDescription() {
- return " " + TYPES[event] + " @" + lineNumber + ":" + columnNumber;
- }
-
- @Override
- public String toString() {
- switch (event) {
- case START_DOCUMENT:
- case END_DOCUMENT:
- return "Event{event=" + TYPES[event] + "'}";
- case PROCESSING_INSTRUCTION:
- case TEXT:
- case CDSECT:
- case ENTITY_REF:
- case COMMENT:
- case IGNORABLE_WHITESPACE:
- return "Event{event=" + TYPES[event] + ", text='" + text + "'}";
- case START_TAG:
- return "Event{" + "event=START_TAG"
- + ", name='"
- + name + '\'' + ", prefix='"
- + prefix + '\'' + ", namespace='"
- + namespace + '\'' + ", empty="
- + empty + ", attributes="
- + Arrays.toString(attributes) + ", namespaces="
- + Arrays.toString(namespaces) + '}';
- case END_TAG:
- return "Event{" + "event=END_TAG"
- + ", name='"
- + name + '\'' + ", prefix='"
- + prefix + '\'' + ", namespace='"
- + namespace + '\'' + ", empty="
- + empty + ", namespaces="
- + Arrays.toString(namespaces) + '}';
- default:
- return "Event{" + "event="
- + TYPES[event] + ", name='"
- + name + '\'' + ", prefix='"
- + prefix + '\'' + ", namespace='"
- + namespace + '\'' + ", empty="
- + empty + ", text='"
- + text + '\'' + ", attributes="
- + Arrays.toString(attributes) + ", namespaces="
- + Arrays.toString(namespaces) + '}';
- }
- }
- }
-
- @SuppressWarnings("checkstyle:VisibilityModifier")
- public static class Namespace {
- public String prefix;
- public String uri;
- }
-
- @SuppressWarnings("checkstyle:VisibilityModifier")
- public static class Attribute {
- public String name;
- public String prefix;
- public String namespace;
- public String type;
- public String value;
- public boolean isDefault;
- }
-
- public BufferingParser(XmlPullParser xmlPullParser) {
- this.xmlPullParser = xmlPullParser;
- }
-
- @Override
- public void setFeature(String name, boolean state) throws XmlPullParserException {
- xmlPullParser.setFeature(name, state);
- }
-
- @Override
- public boolean getFeature(String name) {
- return xmlPullParser.getFeature(name);
- }
-
- @Override
- public void setProperty(String name, Object value) throws XmlPullParserException {
- xmlPullParser.setProperty(name, value);
- }
-
- @Override
- public Object getProperty(String name) {
- return xmlPullParser.getProperty(name);
- }
-
- @Override
- public void setInput(Reader in) throws XmlPullParserException {
- xmlPullParser.setInput(in);
- }
-
- @Override
- public void setInput(InputStream inputStream, String inputEncoding) throws XmlPullParserException {
- xmlPullParser.setInput(inputStream, inputEncoding);
- }
-
- @Override
- public String getInputEncoding() {
- return xmlPullParser.getInputEncoding();
- }
-
- @Override
- public void defineEntityReplacementText(String entityName, String replacementText) throws XmlPullParserException {
- xmlPullParser.defineEntityReplacementText(entityName, replacementText);
- }
-
- @Override
- public int getNamespaceCount(int depth) throws XmlPullParserException {
- // TODO: if (current != null) throw new IllegalStateException("Not supported during events replay");
- return xmlPullParser.getNamespaceCount(depth);
- }
-
- @Override
- public String getNamespacePrefix(int pos) throws XmlPullParserException {
- // TODO: if (current != null) throw new IllegalStateException("Not supported during events replay");
- return xmlPullParser.getNamespacePrefix(pos);
- }
-
- @Override
- public String getNamespaceUri(int pos) throws XmlPullParserException {
- // TODO: if (current != null) throw new IllegalStateException("Not supported during events replay");
- return xmlPullParser.getNamespaceUri(pos);
- }
-
- @Override
- public String getNamespace(String prefix) {
- // TODO: if (current != null) throw new IllegalStateException("Not supported during events replay");
- return xmlPullParser.getNamespace(prefix);
- }
-
- @Override
- public int getDepth() {
- // TODO: if (current != null) throw new IllegalStateException("Not supported during events replay");
- return xmlPullParser.getDepth();
- }
-
- @Override
- public String getPositionDescription() {
- if (current != null) {
- return current.positionDescription();
- }
- return xmlPullParser.getPositionDescription();
- }
-
- @Override
- public int getLineNumber() {
- if (current != null) {
- return current.lineNumber;
- }
- return xmlPullParser.getLineNumber();
- }
-
- @Override
- public int getColumnNumber() {
- if (current != null) {
- return current.columnNumber;
- }
- return xmlPullParser.getColumnNumber();
- }
-
- @Override
- public boolean isWhitespace() throws XmlPullParserException {
- if (current != null) {
- if (current.event == TEXT || current.event == CDSECT) {
- return WHITESPACE_REGEX.matcher(current.text).matches();
- } else if (current.event == IGNORABLE_WHITESPACE) {
- return true;
- } else {
- throw new XmlPullParserException("no content available to check for whitespaces");
- }
- }
- return xmlPullParser.isWhitespace();
- }
-
- @Override
- public String getText() {
- return current != null ? current.text : xmlPullParser.getText();
- }
-
- @Override
- public char[] getTextCharacters(int[] holderForStartAndLength) {
- if (current != null) {
- throw new IllegalStateException("Not supported during events replay");
- }
- return xmlPullParser.getTextCharacters(holderForStartAndLength);
- }
-
- @Override
- public String getNamespace() {
- return current != null ? current.namespace : xmlPullParser.getNamespace();
- }
-
- @Override
- public String getName() {
- return current != null ? current.name : xmlPullParser.getName();
- }
-
- @Override
- public String getPrefix() {
- return current != null ? current.prefix : xmlPullParser.getPrefix();
- }
-
- @Override
- public boolean isEmptyElementTag() throws XmlPullParserException {
- return current != null ? current.empty : xmlPullParser.isEmptyElementTag();
- }
-
- @Override
- public int getAttributeCount() {
- if (current != null) {
- return current.attributes != null ? current.attributes.length : 0;
- } else {
- return xmlPullParser.getAttributeCount();
- }
- }
-
- @Override
- public String getAttributeNamespace(int index) {
- if (current != null) {
- return current.attributes[index].namespace;
- } else {
- return xmlPullParser.getAttributeNamespace(index);
- }
- }
-
- @Override
- public String getAttributeName(int index) {
- if (current != null) {
- return current.attributes[index].name;
- } else {
- return xmlPullParser.getAttributeName(index);
- }
- }
-
- @Override
- public String getAttributePrefix(int index) {
- if (current != null) {
- return current.attributes[index].prefix;
- } else {
- return xmlPullParser.getAttributePrefix(index);
- }
- }
-
- @Override
- public String getAttributeType(int index) {
- if (current != null) {
- return current.attributes[index].type;
- } else {
- return xmlPullParser.getAttributeType(index);
- }
- }
-
- @Override
- public boolean isAttributeDefault(int index) {
- if (current != null) {
- return current.attributes[index].isDefault;
- } else {
- return xmlPullParser.isAttributeDefault(index);
- }
- }
-
- @Override
- public String getAttributeValue(int index) {
- if (current != null) {
- return current.attributes[index].value;
- } else {
- return xmlPullParser.getAttributeValue(index);
- }
- }
-
- @Override
- public String getAttributeValue(String namespace, String name) {
- if (current != null) {
- if (current.attributes != null) {
- for (Attribute attr : current.attributes) {
- if (Objects.equals(namespace, attr.namespace) && Objects.equals(name, attr.name)) {
- return attr.value;
- }
- }
- }
- return null;
- } else {
- return xmlPullParser.getAttributeValue(namespace, name);
- }
- }
-
- @Override
- public void require(int type, String namespace, String name) throws XmlPullParserException, IOException {
- if (current != null) {
- throw new IllegalStateException("Not supported during events replay");
- }
- xmlPullParser.require(type, namespace, name);
- }
-
- @Override
- public int getEventType() throws XmlPullParserException {
- return current != null ? current.event : xmlPullParser.getEventType();
- }
-
- @Override
- public int next() throws XmlPullParserException, IOException {
- while (true) {
- if (events != null && !events.isEmpty()) {
- current = events.removeFirst();
- return current.event;
- } else {
- current = null;
- }
- if (getEventType() == END_DOCUMENT) {
- throw new XmlPullParserException("already reached end of XML input", this, null);
- }
- int currentEvent = xmlPullParser.next();
- if (bypass() || accept()) {
- return currentEvent;
- }
- }
- }
-
- @Override
- public int nextToken() throws XmlPullParserException, IOException {
- while (true) {
- if (events != null && !events.isEmpty()) {
- current = events.removeFirst();
- return current.event;
- } else {
- current = null;
- }
- if (getEventType() == END_DOCUMENT) {
- throw new XmlPullParserException("already reached end of XML input", this, null);
- }
- int currentEvent = xmlPullParser.nextToken();
- if (bypass() || accept()) {
- return currentEvent;
- }
- }
- }
-
- @Override
- public int nextTag() throws XmlPullParserException, IOException {
- int eventType = next();
- if (eventType == TEXT && isWhitespace()) { // skip whitespace
- eventType = next();
- }
- if (eventType != START_TAG && eventType != END_TAG) {
- throw new XmlPullParserException("expected START_TAG or END_TAG not " + TYPES[getEventType()], this, null);
- }
- return eventType;
- }
-
- @Override
- public String nextText() throws XmlPullParserException, IOException {
- int eventType = getEventType();
- if (eventType != START_TAG) {
- throw new XmlPullParserException("parser must be on START_TAG to read next text", this, null);
- }
- eventType = next();
- if (eventType == TEXT) {
- final String result = getText();
- eventType = next();
- if (eventType != END_TAG) {
- throw new XmlPullParserException(
- "TEXT must be immediately followed by END_TAG and not " + TYPES[getEventType()], this, null);
- }
- return result;
- } else if (eventType == END_TAG) {
- return "";
- } else {
- throw new XmlPullParserException("parser must be on START_TAG or TEXT to read text", this, null);
- }
- }
-
- protected Event bufferEvent() throws XmlPullParserException {
- Event event = new Event();
- XmlPullParser pp = xmlPullParser;
- event.event = xmlPullParser.getEventType();
- event.columnNumber = xmlPullParser.getColumnNumber();
- event.lineNumber = xmlPullParser.getLineNumber();
- switch (event.event) {
- case START_DOCUMENT:
- case END_DOCUMENT:
- break;
- case START_TAG:
- event.name = pp.getName();
- event.namespace = pp.getNamespace();
- event.prefix = pp.getPrefix();
- event.empty = pp.isEmptyElementTag();
- event.text = pp.getText();
- event.attributes = new Attribute[pp.getAttributeCount()];
- for (int i = 0; i < pp.getAttributeCount(); i++) {
- Attribute attr = new Attribute();
- attr.name = pp.getAttributeName(i);
- attr.namespace = pp.getAttributeNamespace(i);
- attr.value = pp.getAttributeValue(i);
- attr.type = pp.getAttributeType(i);
- attr.isDefault = pp.isAttributeDefault(i);
- event.attributes[i] = attr;
- }
- break;
- case END_TAG:
- event.name = pp.getName();
- event.namespace = pp.getNamespace();
- event.prefix = pp.getPrefix();
- event.text = pp.getText();
- break;
- case TEXT:
- case COMMENT:
- case IGNORABLE_WHITESPACE:
- case CDSECT:
- case ENTITY_REF:
- event.text = pp.getText();
- break;
- default:
- break;
- }
- return event;
- }
-
- protected void pushEvent(Event event) {
- if (events == null) {
- events = new ArrayDeque<>();
- }
- events.add(event);
- }
-
- protected boolean accept() throws XmlPullParserException, IOException {
- return true;
- }
-
- public void bypass(boolean bypass) {
- if (bypass && events != null && !events.isEmpty()) {
- throw new IllegalStateException("Can not disable filter while processing");
- }
- this.bypass = bypass;
- }
-
- public boolean bypass() {
- return bypass || (xmlPullParser instanceof BufferingParser && ((BufferingParser) xmlPullParser).bypass());
- }
-
- protected static String nullSafeAppend(String originalValue, String charSegment) {
- if (originalValue == null) {
- return charSegment;
- } else {
- return originalValue + charSegment;
- }
- }
-}
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/XmlUtils.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/XmlUtils.java
deleted file mode 100644
index a2f71aa55a..0000000000
--- a/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/XmlUtils.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.model.transform.pull;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-
-import org.codehaus.plexus.util.xml.XmlStreamReader;
-import org.codehaus.plexus.util.xml.pull.MXSerializer;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.codehaus.plexus.util.xml.pull.XmlSerializer;
-
-public class XmlUtils {
-
- public static ByteArrayInputStream writeDocument(XmlStreamReader reader, XmlPullParser parser)
- throws IOException, XmlPullParserException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- Writer writer = newWriter(reader, baos);
- writeDocument(parser, writer);
- return new ByteArrayInputStream(baos.toByteArray());
- }
-
- public static void writeDocument(XmlPullParser parser, Writer writer) throws IOException, XmlPullParserException {
- XmlSerializer serializer = new MXSerializer();
- serializer.setOutput(writer);
-
- while (parser.nextToken() != XmlPullParser.END_DOCUMENT) {
- switch (parser.getEventType()) {
- case XmlPullParser.START_DOCUMENT:
- serializer.startDocument(parser.getInputEncoding(), true);
- break;
- case XmlPullParser.END_DOCUMENT:
- serializer.endDocument();
- case XmlPullParser.START_TAG:
- int nsStart = parser.getNamespaceCount(parser.getDepth() - 1);
- int nsEnd = parser.getNamespaceCount(parser.getDepth());
- for (int i = nsStart; i < nsEnd; i++) {
- String prefix = parser.getNamespacePrefix(i);
- String ns = parser.getNamespaceUri(i);
- serializer.setPrefix(prefix, ns);
- }
- serializer.startTag(parser.getNamespace(), parser.getName());
- for (int i = 0; i < parser.getAttributeCount(); i++) {
- serializer.attribute(
- parser.getAttributeNamespace(i),
- parser.getAttributeName(i),
- parser.getAttributeValue(i));
- }
- break;
- case XmlPullParser.END_TAG:
- serializer.endTag(parser.getNamespace(), parser.getName());
- break;
- case XmlPullParser.TEXT:
- serializer.text(normalize(parser.getText()));
- break;
- case XmlPullParser.CDSECT:
- serializer.cdsect(parser.getText());
- break;
- case XmlPullParser.ENTITY_REF:
- serializer.entityRef(parser.getName());
- break;
- case XmlPullParser.IGNORABLE_WHITESPACE:
- serializer.ignorableWhitespace(normalize(parser.getText()));
- break;
- case XmlPullParser.PROCESSING_INSTRUCTION:
- serializer.processingInstruction(parser.getText());
- break;
- case XmlPullParser.COMMENT:
- serializer.comment(normalize(parser.getText()));
- break;
- case XmlPullParser.DOCDECL:
- serializer.docdecl(normalize(parser.getText()));
- break;
- default:
- break;
- }
- }
-
- serializer.endDocument();
- }
-
- private static OutputStreamWriter newWriter(XmlStreamReader reader, ByteArrayOutputStream baos)
- throws UnsupportedEncodingException {
- if (reader.getEncoding() != null) {
- return new OutputStreamWriter(baos, reader.getEncoding());
- } else {
- return new OutputStreamWriter(baos);
- }
- }
-
- private static String normalize(String input) {
- if (input.indexOf('\n') >= 0 && !"\n".equals(System.lineSeparator())) {
- return input.replace("\n", System.lineSeparator());
- }
- return input;
- }
-}
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/stax/BufferingParser.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/stax/BufferingParser.java
new file mode 100644
index 0000000000..a83458f66d
--- /dev/null
+++ b/maven-model-transform/src/main/java/org/apache/maven/model/transform/stax/BufferingParser.java
@@ -0,0 +1,523 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.model.transform.stax;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import java.util.ArrayDeque;
+import java.util.Arrays;
+import java.util.Deque;
+import java.util.Objects;
+import java.util.regex.Pattern;
+
+import org.codehaus.stax2.XMLStreamReader2;
+
+public class BufferingParser implements XMLStreamReader {
+
+ private static final Pattern WHITESPACE_REGEX = Pattern.compile("[ \r\t\n]+");
+
+ private static final String[] TYPES = new String[] {
+ "",
+ "START_ELEMENT",
+ "END_ELEMENT",
+ "PROCESSING_INSTRUCTION",
+ "CHARACTERS",
+ "COMMENT",
+ "SPACE",
+ "START_DOCUMENT",
+ "END_DOCUMENT",
+ "ENTITY_REFERENCE",
+ "ATTRIBUTE",
+ "DTD",
+ "CDATA",
+ "NAMESPACE",
+ "NOTATION_DECLARATION",
+ "ENTITY_DECLARATION"
+ };
+
+ protected XMLStreamReader delegate;
+ protected Deque events;
+ protected Event current;
+ protected boolean bypass;
+
+ @SuppressWarnings("checkstyle:VisibilityModifier")
+ public static class Event {
+ public int event;
+ public String name;
+ public String prefix;
+ public String namespace;
+ public boolean empty;
+ public String text;
+ public Attribute[] attributes;
+ public Namespace[] namespaces;
+ public int columnNumber;
+ public int lineNumber;
+
+ public String positionDescription() {
+ return " " + TYPES[event] + " @" + lineNumber + ":" + columnNumber;
+ }
+
+ @Override
+ public String toString() {
+ switch (event) {
+ case START_DOCUMENT:
+ case END_DOCUMENT:
+ return "Event{event=" + TYPES[event] + "'}";
+ case PROCESSING_INSTRUCTION:
+ case CHARACTERS:
+ case CDATA:
+ case ENTITY_REFERENCE:
+ case COMMENT:
+ case SPACE:
+ return "Event{event=" + TYPES[event] + ", text='" + text + "'}";
+ case START_ELEMENT:
+ return "Event{" + "event=START_TAG"
+ + ", name='"
+ + name + '\'' + ", prefix='"
+ + prefix + '\'' + ", namespace='"
+ + namespace + '\'' + ", empty="
+ + empty + ", attributes="
+ + Arrays.toString(attributes) + ", namespaces="
+ + Arrays.toString(namespaces) + '}';
+ case END_ELEMENT:
+ return "Event{" + "event=END_TAG"
+ + ", name='"
+ + name + '\'' + ", prefix='"
+ + prefix + '\'' + ", namespace='"
+ + namespace + '\'' + ", empty="
+ + empty + ", namespaces="
+ + Arrays.toString(namespaces) + '}';
+ default:
+ return "Event{" + "event="
+ + TYPES[event] + ", name='"
+ + name + '\'' + ", prefix='"
+ + prefix + '\'' + ", namespace='"
+ + namespace + '\'' + ", empty="
+ + empty + ", text='"
+ + text + '\'' + ", attributes="
+ + Arrays.toString(attributes) + ", namespaces="
+ + Arrays.toString(namespaces) + '}';
+ }
+ }
+ }
+
+ @SuppressWarnings("checkstyle:VisibilityModifier")
+ public static class Namespace {
+ public String prefix;
+ public String uri;
+ }
+
+ @SuppressWarnings("checkstyle:VisibilityModifier")
+ public static class Attribute {
+ public String name;
+ public String prefix;
+ public String namespace;
+ public String type;
+ public String value;
+ }
+
+ public BufferingParser(XMLStreamReader delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public Object getProperty(String name) throws IllegalArgumentException {
+ return delegate.getProperty(name);
+ }
+
+ @Override
+ public String getElementText() throws XMLStreamException {
+ return delegate.getElementText();
+ }
+
+ @Override
+ public boolean hasNext() throws XMLStreamException {
+ return delegate.hasNext();
+ }
+
+ @Override
+ public void close() throws XMLStreamException {
+ delegate.close();
+ }
+
+ @Override
+ public String getNamespaceURI(String prefix) {
+ return delegate.getNamespaceURI(prefix);
+ }
+
+ @Override
+ public boolean isStartElement() {
+ return delegate.isStartElement();
+ }
+
+ @Override
+ public boolean isEndElement() {
+ return delegate.isEndElement();
+ }
+
+ @Override
+ public boolean isCharacters() {
+ return delegate.isCharacters();
+ }
+
+ @Override
+ public boolean isWhiteSpace() {
+ return delegate.isWhiteSpace();
+ }
+
+ @Override
+ public QName getAttributeName(int index) {
+ return delegate.getAttributeName(index);
+ }
+
+ @Override
+ public boolean isAttributeSpecified(int index) {
+ return delegate.isAttributeSpecified(index);
+ }
+
+ @Override
+ public int getNamespaceCount() {
+ return current != null
+ ? current.namespaces != null ? current.namespaces.length : 0
+ : delegate.getNamespaceCount();
+ }
+
+ @Override
+ public String getNamespacePrefix(int index) {
+ return current != null ? current.namespaces[index].prefix : delegate.getNamespacePrefix(index);
+ }
+
+ @Override
+ public String getNamespaceURI(int index) {
+ return current != null ? current.namespaces[index].uri : delegate.getNamespaceURI(index);
+ }
+
+ @Override
+ public NamespaceContext getNamespaceContext() {
+ return delegate.getNamespaceContext();
+ }
+
+ @Override
+ public char[] getTextCharacters() {
+ return delegate.getTextCharacters();
+ }
+
+ @Override
+ public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length)
+ throws XMLStreamException {
+ return delegate.getTextCharacters(sourceStart, target, targetStart, length);
+ }
+
+ @Override
+ public int getTextStart() {
+ return delegate.getTextStart();
+ }
+
+ @Override
+ public int getTextLength() {
+ return delegate.getTextLength();
+ }
+
+ @Override
+ public String getEncoding() {
+ return delegate.getEncoding();
+ }
+
+ @Override
+ public boolean hasText() {
+ return delegate.hasText();
+ }
+
+ @Override
+ public Location getLocation() {
+ return delegate.getLocation();
+ }
+
+ @Override
+ public QName getName() {
+ return delegate.getName();
+ }
+
+ @Override
+ public boolean hasName() {
+ return delegate.hasName();
+ }
+
+ @Override
+ public String getVersion() {
+ return delegate.getVersion();
+ }
+
+ @Override
+ public boolean isStandalone() {
+ return delegate.isStandalone();
+ }
+
+ @Override
+ public boolean standaloneSet() {
+ return delegate.standaloneSet();
+ }
+
+ @Override
+ public String getCharacterEncodingScheme() {
+ return delegate.getCharacterEncodingScheme();
+ }
+
+ @Override
+ public String getPITarget() {
+ return delegate.getPITarget();
+ }
+
+ @Override
+ public String getPIData() {
+ return delegate.getPIData();
+ }
+
+ @Override
+ public String getText() {
+ return current != null ? current.text : delegate.getText();
+ }
+
+ @Override
+ public String getNamespaceURI() {
+ return current != null ? current.namespace : delegate.getNamespaceURI();
+ }
+
+ @Override
+ public String getLocalName() {
+ return current != null ? current.name : delegate.getLocalName();
+ }
+
+ @Override
+ public String getPrefix() {
+ return current != null ? current.prefix : delegate.getPrefix();
+ }
+
+ @Override
+ public int getAttributeCount() {
+ if (current != null) {
+ return current.attributes != null ? current.attributes.length : 0;
+ } else {
+ return delegate.getAttributeCount();
+ }
+ }
+
+ @Override
+ public String getAttributeNamespace(int index) {
+ if (current != null) {
+ return current.attributes[index].namespace;
+ } else {
+ return delegate.getAttributeNamespace(index);
+ }
+ }
+
+ @Override
+ public String getAttributeLocalName(int index) {
+ if (current != null) {
+ return current.attributes[index].name;
+ } else {
+ return delegate.getAttributeLocalName(index);
+ }
+ }
+
+ @Override
+ public String getAttributePrefix(int index) {
+ if (current != null) {
+ return current.attributes[index].prefix;
+ } else {
+ return delegate.getAttributePrefix(index);
+ }
+ }
+
+ @Override
+ public String getAttributeType(int index) {
+ if (current != null) {
+ return current.attributes[index].type;
+ } else {
+ return delegate.getAttributeType(index);
+ }
+ }
+
+ @Override
+ public String getAttributeValue(int index) {
+ if (current != null) {
+ return current.attributes[index].value;
+ } else {
+ return delegate.getAttributeValue(index);
+ }
+ }
+
+ @Override
+ public String getAttributeValue(String namespace, String name) {
+ if (current != null) {
+ if (current.attributes != null) {
+ for (Attribute attr : current.attributes) {
+ if (Objects.equals(namespace, attr.namespace) && Objects.equals(name, attr.name)) {
+ return attr.value;
+ }
+ }
+ }
+ return null;
+ } else {
+ return delegate.getAttributeValue(namespace, name);
+ }
+ }
+
+ @Override
+ public void require(int type, String namespace, String name) throws XMLStreamException {
+ if (current != null) {
+ throw new IllegalStateException("Not supported during events replay");
+ }
+ delegate.require(type, namespace, name);
+ }
+
+ @Override
+ public int getEventType() {
+ return current != null ? current.event : delegate.getEventType();
+ }
+
+ @Override
+ public int next() throws XMLStreamException {
+ while (true) {
+ if (events != null && !events.isEmpty()) {
+ current = events.removeFirst();
+ return current.event;
+ } else {
+ current = null;
+ }
+ if (getEventType() == END_DOCUMENT) {
+ throw new XMLStreamException("already reached end of XML input", getLocation(), null);
+ }
+ int currentEvent = delegate.next();
+ if (bypass() || accept()) {
+ return currentEvent;
+ }
+ }
+ }
+
+ @Override
+ public int nextTag() throws XMLStreamException {
+ int eventType = next();
+ while (eventType == CHARACTERS && isWhitespace() // skip whitespace
+ || eventType == COMMENT) { // skip comments
+ eventType = next();
+ }
+ if (eventType != START_ELEMENT && eventType != END_ELEMENT) {
+ throw new XMLStreamException(
+ "expected START_TAG or END_TAG not " + TYPES[getEventType()], getLocation(), null);
+ }
+ return eventType;
+ }
+
+ public boolean isWhitespace() throws XMLStreamException {
+ if (getEventType() == CHARACTERS || getEventType() == CDATA) {
+ return WHITESPACE_REGEX.matcher(getText()).matches();
+ } else if (getEventType() == SPACE) {
+ return true;
+ } else {
+ throw new XMLStreamException("no content available to check for whitespaces");
+ }
+ }
+
+ protected Event bufferEvent() throws XMLStreamException {
+ Event event = new Event();
+ XMLStreamReader pp = delegate;
+ event.event = delegate.getEventType();
+ event.columnNumber = delegate.getLocation().getColumnNumber();
+ event.lineNumber = delegate.getLocation().getLineNumber();
+ switch (event.event) {
+ case START_DOCUMENT:
+ case END_DOCUMENT:
+ break;
+ case START_ELEMENT:
+ event.name = pp.getLocalName();
+ event.namespace = pp.getNamespaceURI();
+ event.prefix = pp.getPrefix();
+ event.empty = (pp instanceof XMLStreamReader2) && ((XMLStreamReader2) pp).isEmptyElement();
+ // event.text = pp.getText();
+ event.attributes = new Attribute[pp.getAttributeCount()];
+ for (int i = 0; i < pp.getAttributeCount(); i++) {
+ Attribute attr = new Attribute();
+ attr.name = pp.getAttributeLocalName(i);
+ attr.namespace = pp.getAttributeNamespace(i);
+ attr.value = pp.getAttributeValue(i);
+ attr.type = pp.getAttributeType(i);
+ event.attributes[i] = attr;
+ }
+ event.namespaces = new Namespace[pp.getNamespaceCount()];
+ for (int i = 0; i < pp.getNamespaceCount(); i++) {
+ Namespace ns = new Namespace();
+ ns.uri = pp.getNamespaceURI(i);
+ ns.prefix = pp.getNamespacePrefix(i);
+ event.namespaces[i] = ns;
+ }
+ break;
+ case END_ELEMENT:
+ event.name = pp.getLocalName();
+ event.namespace = pp.getNamespaceURI();
+ event.prefix = pp.getPrefix();
+ // event.text = pp.getText();
+ break;
+ case CHARACTERS:
+ case COMMENT:
+ case SPACE:
+ case CDATA:
+ case ENTITY_REFERENCE:
+ event.text = pp.getText();
+ break;
+ default:
+ break;
+ }
+ return event;
+ }
+
+ protected void pushEvent(Event event) {
+ if (events == null) {
+ events = new ArrayDeque<>();
+ }
+ events.add(event);
+ }
+
+ protected boolean accept() throws XMLStreamException {
+ return true;
+ }
+
+ public void bypass(boolean bypass) {
+ if (bypass && events != null && !events.isEmpty()) {
+ throw new IllegalStateException("Can not disable filter while processing");
+ }
+ this.bypass = bypass;
+ }
+
+ public boolean bypass() {
+ return bypass || (delegate instanceof BufferingParser && ((BufferingParser) delegate).bypass());
+ }
+
+ protected static String nullSafeAppend(String originalValue, String charSegment) {
+ if (originalValue == null) {
+ return charSegment;
+ } else {
+ return originalValue + charSegment;
+ }
+ }
+}
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/NodeBufferingParser.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/stax/NodeBufferingParser.java
similarity index 64%
rename from maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/NodeBufferingParser.java
rename to maven-model-transform/src/main/java/org/apache/maven/model/transform/stax/NodeBufferingParser.java
index ba9d5f9b62..b3742b9c3c 100644
--- a/maven-model-transform/src/main/java/org/apache/maven/model/transform/pull/NodeBufferingParser.java
+++ b/maven-model-transform/src/main/java/org/apache/maven/model/transform/stax/NodeBufferingParser.java
@@ -16,16 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.model.transform.pull;
+package org.apache.maven.model.transform.stax;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-
/**
* Buffer events while parsing a given element to allow some post-processing.
*
@@ -40,31 +39,29 @@ public abstract class NodeBufferingParser extends BufferingParser {
private boolean buffering;
- public NodeBufferingParser(XmlPullParser xmlPullParser, String nodeName) {
+ public NodeBufferingParser(XMLStreamReader xmlPullParser, String nodeName) {
super(xmlPullParser);
this.nodeName = Objects.requireNonNull(nodeName);
}
@Override
- protected boolean accept() throws XmlPullParserException, IOException {
- if (nodeName.equals(xmlPullParser.getName())) {
- if (xmlPullParser.getEventType() == START_TAG && !buffering) {
- buffer.add(bufferEvent());
- buffering = true;
- return false;
- }
- if (xmlPullParser.getEventType() == END_TAG && buffering) {
- buffer.add(bufferEvent());
- process(buffer);
- buffering = false;
- buffer.clear();
- return false;
- }
+ protected boolean accept() throws XMLStreamException {
+ if (!buffering && delegate.getEventType() == START_ELEMENT && nodeName.equals(delegate.getLocalName())) {
+ buffer.add(bufferEvent());
+ buffering = true;
+ return false;
+ } else if (buffering && delegate.getEventType() == END_ELEMENT && nodeName.equals(delegate.getLocalName())) {
+ buffer.add(bufferEvent());
+ process(buffer);
+ buffering = false;
+ buffer.clear();
+ return false;
} else if (buffering) {
buffer.add(bufferEvent());
return false;
+ } else {
+ return true;
}
- return true;
}
@Override
diff --git a/maven-model-transform/src/main/java/org/apache/maven/model/transform/stax/XmlUtils.java b/maven-model-transform/src/main/java/org/apache/maven/model/transform/stax/XmlUtils.java
new file mode 100644
index 0000000000..48e7a9b14d
--- /dev/null
+++ b/maven-model-transform/src/main/java/org/apache/maven/model/transform/stax/XmlUtils.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.model.transform.stax;
+
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayDeque;
+import java.util.Deque;
+
+import com.ctc.wstx.api.WstxOutputProperties;
+
+public class XmlUtils {
+
+ public static InputStream writeDocument(XMLStreamReader parser) throws XMLStreamException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ writeDocument(parser, baos);
+ return new ByteArrayInputStream(baos.toByteArray());
+ }
+
+ public static void writeDocument(XMLStreamReader parser, OutputStream output) throws XMLStreamException {
+ XMLOutputFactory factory = new com.ctc.wstx.stax.WstxOutputFactory();
+ factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, false);
+ factory.setProperty(WstxOutputProperties.P_USE_DOUBLE_QUOTES_IN_XML_DECL, true);
+ factory.setProperty(WstxOutputProperties.P_ADD_SPACE_AFTER_EMPTY_ELEM, true);
+ XMLStreamWriter serializer = factory.createXMLStreamWriter(output, parser.getCharacterEncodingScheme());
+ copy(parser, serializer);
+ }
+
+ private static String normalize(String input) {
+ if (input != null) {
+ return input.replace("\r\n", "\n");
+ }
+ return input;
+ }
+
+ /**
+ * Copies the reader to the writer. The start and end document methods must
+ * be handled on the writer manually.
+ */
+ public static void copy(XMLStreamReader reader, XMLStreamWriter writer) throws XMLStreamException {
+ copy(reader, writer, false, false);
+ }
+
+ public static void copy(XMLStreamReader reader, XMLStreamWriter writer, boolean fragment)
+ throws XMLStreamException {
+ copy(reader, writer, fragment, false);
+ }
+
+ public static void copy(XMLStreamReader reader, XMLStreamWriter writer, boolean fragment, boolean isThreshold)
+ throws XMLStreamException {
+ // number of elements read in
+ int read = 0;
+ int elementCount = 0;
+ final Deque countStack = new ArrayDeque<>();
+ int event = reader.getEventType();
+
+ while (true) {
+ switch (event) {
+ case XMLStreamConstants.START_ELEMENT:
+ read++;
+ if (isThreshold) {
+ elementCount++;
+ countStack.push(elementCount);
+ elementCount = 0;
+ }
+ writeStartElement(reader, writer);
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ if (read > 0) {
+ writer.writeEndElement();
+ }
+ read--;
+ if (read < 0 && fragment) {
+ return;
+ }
+ if (isThreshold && !countStack.isEmpty()) {
+ elementCount = countStack.pop();
+ }
+ break;
+ case XMLStreamConstants.CHARACTERS:
+ writer.writeCharacters(normalize(reader.getText()));
+ break;
+ case XMLStreamConstants.SPACE:
+ writer.writeCharacters(normalize(reader.getText()));
+ break;
+ case XMLStreamConstants.ENTITY_REFERENCE:
+ writer.writeEntityRef(reader.getLocalName());
+ break;
+ case XMLStreamConstants.COMMENT:
+ writer.writeComment(normalize(reader.getText()));
+ break;
+ case XMLStreamConstants.CDATA:
+ writer.writeCData(normalize(reader.getText()));
+ break;
+ case XMLStreamConstants.START_DOCUMENT:
+ if (reader.getVersion() != null) {
+ writer.writeStartDocument(reader.getCharacterEncodingScheme(), reader.getVersion());
+ }
+ break;
+ case XMLStreamConstants.END_DOCUMENT:
+ writer.writeEndDocument();
+ return;
+ default:
+ break;
+ }
+ event = reader.next();
+ }
+ }
+
+ private static void writeStartElement(XMLStreamReader reader, XMLStreamWriter writer) throws XMLStreamException {
+ String uri = reader.getNamespaceURI();
+ String prefix = reader.getPrefix();
+ String local = reader.getLocalName();
+
+ if (prefix == null) {
+ prefix = "";
+ }
+
+ // Write out the element name
+ if (uri != null) {
+ if (prefix.isEmpty() && isEmpty(uri)) {
+ writer.writeStartElement(local);
+ } else {
+ writer.writeStartElement(prefix, local, uri);
+ }
+ } else {
+ writer.writeStartElement(local);
+ }
+
+ // Write out the namespaces
+ for (int i = 0; i < reader.getNamespaceCount(); i++) {
+ String nsURI = reader.getNamespaceURI(i);
+ String nsPrefix = reader.getNamespacePrefix(i);
+ if (nsURI == null) {
+ nsURI = "";
+ }
+ writer.writeNamespace(nsPrefix, nsURI);
+ writer.setPrefix(nsPrefix, nsURI);
+ }
+
+ // Write out attributes
+ for (int i = 0; i < reader.getAttributeCount(); i++) {
+ String ns = reader.getAttributeNamespace(i);
+ String nsPrefix = reader.getAttributePrefix(i);
+ if (ns == null || ns.isEmpty()) {
+ writer.writeAttribute(reader.getAttributeLocalName(i), reader.getAttributeValue(i));
+ } else if (nsPrefix == null || nsPrefix.isEmpty()) {
+ writer.writeAttribute(
+ reader.getAttributeNamespace(i), reader.getAttributeLocalName(i), reader.getAttributeValue(i));
+ } else {
+ writer.writeAttribute(
+ reader.getAttributePrefix(i),
+ reader.getAttributeNamespace(i),
+ reader.getAttributeLocalName(i),
+ reader.getAttributeValue(i));
+ }
+ }
+ }
+
+ private static boolean isEmpty(String s) {
+ return s == null || s.isEmpty();
+ }
+}
diff --git a/maven-model-transform/src/test/java/org/apache/maven/model/transform/AbstractXMLFilterTests.java b/maven-model-transform/src/test/java/org/apache/maven/model/transform/AbstractXMLFilterTests.java
index b1d146a45a..9ed0e731d2 100644
--- a/maven-model-transform/src/test/java/org/apache/maven/model/transform/AbstractXMLFilterTests.java
+++ b/maven-model-transform/src/test/java/org/apache/maven/model/transform/AbstractXMLFilterTests.java
@@ -18,34 +18,32 @@
*/
package org.apache.maven.model.transform;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
-import java.io.StringWriter;
-import org.apache.maven.model.transform.pull.XmlUtils;
-import org.codehaus.plexus.util.xml.pull.MXParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.apache.maven.model.transform.stax.XmlUtils;
public abstract class AbstractXMLFilterTests {
- protected XmlPullParser getFilter(XmlPullParser parser) {
+ protected XMLStreamReader getFilter(XMLStreamReader parser) {
throw new UnsupportedOperationException("Override one of the getFilter() methods");
}
- protected String transform(String input) throws XmlPullParserException, IOException {
+ protected String transform(String input) throws XMLStreamException, IOException {
return transform(new StringReader(input));
}
- protected String transform(Reader input) throws XmlPullParserException, IOException {
+ protected String transform(Reader input) throws XMLStreamException, IOException {
+ XMLStreamReader parser = XMLInputFactory.newFactory().createXMLStreamReader(input);
+ XMLStreamReader filter = getFilter(parser);
- MXParser parser = new MXParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- parser.setInput(input);
- XmlPullParser filter = getFilter(parser);
-
- StringWriter writer = new StringWriter();
- XmlUtils.writeDocument(filter, writer);
- return writer.toString();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ XmlUtils.writeDocument(filter, baos);
+ return baos.toString();
}
}
diff --git a/maven-model-transform/src/test/java/org/apache/maven/model/transform/CiFriendlyXMLFilterTest.java b/maven-model-transform/src/test/java/org/apache/maven/model/transform/CiFriendlyXMLFilterTest.java
index 6a276376f2..e33b35e72e 100644
--- a/maven-model-transform/src/test/java/org/apache/maven/model/transform/CiFriendlyXMLFilterTest.java
+++ b/maven-model-transform/src/test/java/org/apache/maven/model/transform/CiFriendlyXMLFilterTest.java
@@ -18,14 +18,15 @@
*/
package org.apache.maven.model.transform;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import javax.xml.stream.XMLStreamReader;
+
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class CiFriendlyXMLFilterTest extends AbstractXMLFilterTests {
@Override
- protected CiFriendlyXMLFilter getFilter(XmlPullParser parser) {
+ protected CiFriendlyXMLFilter getFilter(XMLStreamReader parser) {
CiFriendlyXMLFilter filter = new CiFriendlyXMLFilter(parser, true);
filter.setChangelist("CHANGELIST");
diff --git a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ConsumerPomXMLFilterTest.java b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ConsumerPomXMLFilterTest.java
index a3d3d9cb9f..9352984fe9 100644
--- a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ConsumerPomXMLFilterTest.java
+++ b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ConsumerPomXMLFilterTest.java
@@ -18,20 +18,21 @@
*/
package org.apache.maven.model.transform;
+import javax.xml.stream.XMLStreamReader;
+
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Function;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
import org.junit.jupiter.api.Test;
import static org.xmlunit.assertj.XmlAssert.assertThat;
class ConsumerPomXMLFilterTest extends AbstractXMLFilterTests {
@Override
- protected XmlPullParser getFilter(XmlPullParser orgParser) {
+ protected XMLStreamReader getFilter(XMLStreamReader orgParser) {
final BuildToRawPomXMLFilterFactory buildPomXMLFilterFactory = new BuildToRawPomXMLFilterFactory(true) {
@Override
protected Function> getRelativePathMapper() {
@@ -59,7 +60,7 @@ protected Optional getChangelist() {
}
};
- XmlPullParser parser =
+ XMLStreamReader parser =
new RawToConsumerPomXMLFilterFactory(buildPomXMLFilterFactory).get(orgParser, Paths.get("pom.xml"));
return parser;
}
diff --git a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ModelVersionXMLFilterTest.java b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ModelVersionXMLFilterTest.java
index 2dee395405..c1b7120702 100644
--- a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ModelVersionXMLFilterTest.java
+++ b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ModelVersionXMLFilterTest.java
@@ -18,14 +18,15 @@
*/
package org.apache.maven.model.transform;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import javax.xml.stream.XMLStreamReader;
+
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ModelVersionXMLFilterTest extends AbstractXMLFilterTests {
@Override
- protected XmlPullParser getFilter(XmlPullParser parser) {
+ protected XMLStreamReader getFilter(XMLStreamReader parser) {
return new ModelVersionXMLFilter(parser);
}
diff --git a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ModulesXMLFilterTest.java b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ModulesXMLFilterTest.java
index 39323a4bc5..a1e3601e3d 100644
--- a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ModulesXMLFilterTest.java
+++ b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ModulesXMLFilterTest.java
@@ -18,7 +18,8 @@
*/
package org.apache.maven.model.transform;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import javax.xml.stream.XMLStreamReader;
+
import org.junit.jupiter.api.Test;
import static org.xmlunit.assertj.XmlAssert.assertThat;
@@ -26,7 +27,7 @@
class ModulesXMLFilterTest extends AbstractXMLFilterTests {
@Override
- protected ModulesXMLFilter getFilter(XmlPullParser parser) {
+ protected ModulesXMLFilter getFilter(XMLStreamReader parser) {
return new ModulesXMLFilter(parser);
}
diff --git a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ParentXMLFilterTest.java b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ParentXMLFilterTest.java
index 2e253b7cdd..d27d604bed 100644
--- a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ParentXMLFilterTest.java
+++ b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ParentXMLFilterTest.java
@@ -18,19 +18,20 @@
*/
package org.apache.maven.model.transform;
+import javax.xml.stream.XMLStreamReader;
+
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.function.Function;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ParentXMLFilterTest extends AbstractXMLFilterTests {
- private Function filterCreator;
+ private Function filterCreator;
@BeforeEach
void reset() {
@@ -38,21 +39,21 @@ void reset() {
}
@Override
- protected XmlPullParser getFilter(XmlPullParser parser) {
- Function filterCreator =
+ protected XMLStreamReader getFilter(XMLStreamReader parser) {
+ Function filterCreator =
(this.filterCreator != null ? this.filterCreator : this::createFilter);
return filterCreator.apply(parser);
}
- protected XmlPullParser createFilter(XmlPullParser parser) {
+ protected XMLStreamReader createFilter(XMLStreamReader parser) {
return createFilter(
parser,
x -> Optional.of(new RelativeProject("GROUPID", "ARTIFACTID", "1.0.0")),
Paths.get("pom.xml").toAbsolutePath());
}
- protected XmlPullParser createFilter(
- XmlPullParser parser, Function> pathMapper, Path projectPath) {
+ protected XMLStreamReader createFilter(
+ XMLStreamReader parser, Function> pathMapper, Path projectPath) {
return new ParentXMLFilter(new FastForwardFilter(parser), pathMapper, projectPath);
}
@@ -154,12 +155,12 @@ void testDefaultRelativePath() throws Exception {
+ " ARTIFACTID\n"
+ " \n"
+ "";
- String expected = "" + System.lineSeparator()
- + " " + System.lineSeparator()
- + " GROUPID" + System.lineSeparator()
- + " ARTIFACTID" + System.lineSeparator()
- + " 1.0.0" + System.lineSeparator()
- + " " + System.lineSeparator()
+ String expected = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " ARTIFACTID\n"
+ + " 1.0.0\n"
+ + " \n"
+ "";
String actual = transform(input);
@@ -299,13 +300,13 @@ void testIndent() throws Exception {
+ " \n"
+ " \n"
+ "";
- String expected = "" + System.lineSeparator()
- + " " + System.lineSeparator()
- + " GROUPID" + System.lineSeparator()
- + " ARTIFACTID" + System.lineSeparator()
- + " " + System.lineSeparator()
- + " 1.0.0" + System.lineSeparator()
- + " " + System.lineSeparator()
+ String expected = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " ARTIFACTID\n"
+ + " \n"
+ + " 1.0.0\n"
+ + " \n"
+ "";
String actual = transform(input);
diff --git a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ReactorDependencyXMLFilterTest.java b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ReactorDependencyXMLFilterTest.java
index 4bad0e75a0..0621d8b844 100644
--- a/maven-model-transform/src/test/java/org/apache/maven/model/transform/ReactorDependencyXMLFilterTest.java
+++ b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ReactorDependencyXMLFilterTest.java
@@ -18,9 +18,10 @@
*/
package org.apache.maven.model.transform;
+import javax.xml.stream.XMLStreamReader;
+
import java.util.function.BiFunction;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -35,7 +36,7 @@ protected void reset() {
}
@Override
- protected ReactorDependencyXMLFilter getFilter(XmlPullParser parser) {
+ protected ReactorDependencyXMLFilter getFilter(XMLStreamReader parser) {
return new ReactorDependencyXMLFilter(
parser, reactorVersionMapper != null ? reactorVersionMapper : (g, a) -> "1.0.0");
}
diff --git a/maven-model-transform/src/test/java/org/apache/maven/model/transform/RelativePathXMLFilterTest.java b/maven-model-transform/src/test/java/org/apache/maven/model/transform/RelativePathXMLFilterTest.java
index 6b114cfd10..2388521870 100644
--- a/maven-model-transform/src/test/java/org/apache/maven/model/transform/RelativePathXMLFilterTest.java
+++ b/maven-model-transform/src/test/java/org/apache/maven/model/transform/RelativePathXMLFilterTest.java
@@ -18,14 +18,15 @@
*/
package org.apache.maven.model.transform;
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import javax.xml.stream.XMLStreamReader;
+
import org.junit.jupiter.api.Test;
import static org.xmlunit.assertj.XmlAssert.assertThat;
class RelativePathXMLFilterTest extends AbstractXMLFilterTests {
@Override
- protected RelativePathXMLFilter getFilter(XmlPullParser parser) {
+ protected RelativePathXMLFilter getFilter(XMLStreamReader parser) {
return new RelativePathXMLFilter(parser);
}
diff --git a/maven-model/pom.xml b/maven-model/pom.xml
index a1f9b108bc..95cfaafa27 100644
--- a/maven-model/pom.xml
+++ b/maven-model/pom.xml
@@ -46,6 +46,22 @@ under the License.
org.codehaus.plexus
plexus-xml