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));
+    }
+}

Reply via email to