This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/master by this push:
new c5f9b74f2 [MNG-7805] Make the modelVersion optional when using build
pom (#1148)
c5f9b74f2 is described below
commit c5f9b74f28adf5db791b6927e1c5d29993fd6fee
Author: Guillaume Nodet <[email protected]>
AuthorDate: Mon Jun 19 17:06:57 2023 +0200
[MNG-7805] Make the modelVersion optional when using build pom (#1148)
---
.../transform/BuildToRawPomXMLFilterFactory.java | 2 +
.../model/transform/ModelVersionXMLFilter.java | 77 ++++++++++++++++++++++
.../model/transform/pull/BufferingParser.java | 60 ++++++++++++++++-
.../model/transform/pull/NodeBufferingParser.java | 5 ++
.../model/transform/ModelVersionXMLFilterTest.java | 71 ++++++++++++++++++++
5 files changed, 212 insertions(+), 3 deletions(-)
diff --git
a/maven-model-transform/src/main/java/org/apache/maven/model/transform/BuildToRawPomXMLFilterFactory.java
b/maven-model-transform/src/main/java/org/apache/maven/model/transform/BuildToRawPomXMLFilterFactory.java
index 6dc83351b..1a4a5022a 100644
---
a/maven-model-transform/src/main/java/org/apache/maven/model/transform/BuildToRawPomXMLFilterFactory.java
+++
b/maven-model-transform/src/main/java/org/apache/maven/model/transform/BuildToRawPomXMLFilterFactory.java
@@ -65,6 +65,8 @@ public class BuildToRawPomXMLFilterFactory {
getSha1().ifPresent(ciFriendlyFilter::setSha1);
parser = ciFriendlyFilter;
+ parser = new ModelVersionXMLFilter(parser);
+
return parser;
}
diff --git
a/maven-model-transform/src/main/java/org/apache/maven/model/transform/ModelVersionXMLFilter.java
b/maven-model-transform/src/main/java/org/apache/maven/model/transform/ModelVersionXMLFilter.java
new file mode 100644
index 000000000..c0e71eb65
--- /dev/null
+++
b/maven-model-transform/src/main/java/org/apache/maven/model/transform/ModelVersionXMLFilter.java
@@ -0,0 +1,77 @@
+/*
+ * 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;
+
+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;
+
+public class ModelVersionXMLFilter extends NodeBufferingParser {
+
+ private static final Pattern S_FILTER = Pattern.compile("\\s+");
+ public static final String NAMESPACE_PREFIX =
"http://maven.apache.org/POM/";
+
+ public ModelVersionXMLFilter(XmlPullParser xmlPullParser) {
+ super(xmlPullParser, "project");
+ }
+
+ @Override
+ protected void process(List<Event> buffer) {
+ if (buffer.stream().noneMatch(e -> e.event == XmlPullParser.START_TAG
&& "modelVersion".equals(e.name))) {
+ String namespace = null;
+ for (int pos = 0; pos < buffer.size(); pos++) {
+ Event e = buffer.get(pos);
+ if (namespace != null) {
+ if (e.event == XmlPullParser.START_TAG) {
+ Event prev = buffer.get(pos - 1);
+ if (prev.event != TEXT ||
!S_FILTER.matcher(prev.text).matches()) {
+ prev = null;
+ }
+ Event pmse = new Event();
+ pmse.event = START_TAG;
+ pmse.name = "modelVersion";
+ pmse.namespace = namespace;
+ buffer.add(pos++, pmse);
+ Event pmve = new Event();
+ pmve.event = TEXT;
+ pmve.text =
namespace.substring(NAMESPACE_PREFIX.length());
+ buffer.add(pos++, pmve);
+ Event pmee = new Event();
+ pmee.event = END_TAG;
+ pmee.name = "modelVersion";
+ pmee.namespace = namespace;
+ buffer.add(pos++, pmee);
+ if (prev != null) {
+ buffer.add(pos++, prev);
+ }
+ break;
+ }
+ } else if (e.event == XmlPullParser.START_TAG
+ && "project".equals(e.name)
+ && e.namespace != null
+ && e.namespace.startsWith(NAMESPACE_PREFIX)) {
+ namespace = e.namespace;
+ }
+ }
+ }
+ buffer.forEach(this::pushEvent);
+ }
+}
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
index a1aba62ba..b283a3931 100644
---
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
@@ -22,6 +22,7 @@ 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;
@@ -54,6 +55,55 @@ public class BufferingParser implements XmlPullParser {
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")
@@ -149,7 +199,7 @@ public class BufferingParser implements XmlPullParser {
@Override
public String getPositionDescription() {
if (current != null) {
- throw new IllegalStateException("Not supported during events
replay");
+ return current.positionDescription();
}
return xmlPullParser.getPositionDescription();
}
@@ -157,7 +207,7 @@ public class BufferingParser implements XmlPullParser {
@Override
public int getLineNumber() {
if (current != null) {
- throw new IllegalStateException("Not supported during events
replay");
+ return current.lineNumber;
}
return xmlPullParser.getLineNumber();
}
@@ -165,7 +215,7 @@ public class BufferingParser implements XmlPullParser {
@Override
public int getColumnNumber() {
if (current != null) {
- throw new IllegalStateException("Not supported during events
replay");
+ return current.columnNumber;
}
return xmlPullParser.getColumnNumber();
}
@@ -385,6 +435,8 @@ public class BufferingParser implements XmlPullParser {
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:
@@ -415,6 +467,8 @@ public class BufferingParser implements XmlPullParser {
case TEXT:
case COMMENT:
case IGNORABLE_WHITESPACE:
+ case CDSECT:
+ case ENTITY_REF:
event.text = pp.getText();
break;
default:
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/pull/NodeBufferingParser.java
index 40d9be4be..ba9d5f9b6 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/pull/NodeBufferingParser.java
@@ -67,5 +67,10 @@ public abstract class NodeBufferingParser extends
BufferingParser {
return true;
}
+ @Override
+ public boolean bypass() {
+ return !buffering && super.bypass();
+ }
+
protected abstract void process(List<Event> buffer);
}
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
new file mode 100644
index 000000000..2dee39540
--- /dev/null
+++
b/maven-model-transform/src/test/java/org/apache/maven/model/transform/ModelVersionXMLFilterTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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;
+
+import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class ModelVersionXMLFilterTest extends AbstractXMLFilterTests {
+ @Override
+ protected XmlPullParser getFilter(XmlPullParser parser) {
+ return new ModelVersionXMLFilter(parser);
+ }
+
+ @Test
+ void modelVersionWithDefaultPrefix() throws Exception {
+ String input = "<project xmlns='http://maven.apache.org/POM/4.0.0'>"
+ + " <groupId>GROUPID</groupId>"
+ + " <artifactId>ARTIFACTID</artifactId>"
+ + " <version>VERSION</version>"
+ + "</project>";
+ String expected = "<project
xmlns=\"http://maven.apache.org/POM/4.0.0\">"
+ + " <modelVersion>4.0.0</modelVersion>"
+ + " <groupId>GROUPID</groupId>"
+ + " <artifactId>ARTIFACTID</artifactId>"
+ + " <version>VERSION</version>"
+ + "</project>";
+
+ // Check that the modelVersion is added
+ assertEquals(expected, transform(input));
+ // Check that the transformed POM is stable (modelVersion not added
twice)
+ assertEquals(expected, transform(expected));
+ }
+
+ @Test
+ void modelVersionWithPrefix() throws Exception {
+ String input = "<maven:project
xmlns:maven='http://maven.apache.org/POM/4.0.0'>"
+ + " <maven:groupId>GROUPID</maven:groupId>"
+ + " <maven:artifactId>ARTIFACTID</maven:artifactId>"
+ + " <maven:version>VERSION</maven:version>"
+ + "</maven:project>";
+ String expected = "<maven:project
xmlns:maven=\"http://maven.apache.org/POM/4.0.0\">"
+ + " <maven:modelVersion>4.0.0</maven:modelVersion>"
+ + " <maven:groupId>GROUPID</maven:groupId>"
+ + " <maven:artifactId>ARTIFACTID</maven:artifactId>"
+ + " <maven:version>VERSION</maven:version>"
+ + "</maven:project>";
+
+ // Check that the modelVersion is added
+ assertEquals(expected, transform(input));
+ // Check that the transformed POM is stable (modelVersion not added
twice)
+ assertEquals(expected, transform(expected));
+ }
+}