You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2020/04/06 18:17:39 UTC

[maven] branch MNG-6656 updated: [MNG-6656] Align version in parent

This is an automated email from the ASF dual-hosted git repository.

rfscholte pushed a commit to branch MNG-6656
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/MNG-6656 by this push:
     new cc5e28e  [MNG-6656] Align version in parent
cc5e28e is described below

commit cc5e28e935f6fae1b1ccc5116b4d0462022fb621
Author: rfscholte <rf...@apache.org>
AuthorDate: Mon Apr 6 20:17:31 2020 +0200

    [MNG-6656] Align version in parent
---
 .../xml/sax/filter/AbstractEventXMLFilter.java     | 43 +++++++++++++++-----
 .../maven/xml/sax/filter/ParentXMLFilter.java      | 46 +++++++++++-----------
 .../maven/xml/sax/filter/ParentXMLFilterTest.java  | 23 +++++++++++
 3 files changed, 80 insertions(+), 32 deletions(-)

diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java
index f718103..d23bdec 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java
@@ -20,8 +20,6 @@ package org.apache.maven.xml.sax.filter;
  */
 
 import java.util.ArrayDeque;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Queue;
 
 import org.apache.maven.xml.sax.SAXEvent;
@@ -45,11 +43,10 @@ abstract class AbstractEventXMLFilter extends AbstractSAXFilter
     private SAXEventFactory eventFactory;
     
     // characters BEFORE startElement must get state of startingElement
-    // this way removing based on state keeps formatting
+    // this way removing based on state keeps correct formatting
     private SAXEvent characters;
     
-    // map of characters AFTER starting element, will be cleaned up after closeElement
-    private Map<String, SAXEvent> charactersMap = new HashMap<>();
+    private boolean lockCharacters = false;
     
     protected abstract boolean isParsing();
     
@@ -87,7 +84,7 @@ abstract class AbstractEventXMLFilter extends AbstractSAXFilter
             final String eventState = getState();
             final SAXEvent charactersEvent = characters;
             
-            if ( charactersEvent != null )
+            if ( !lockCharacters && charactersEvent != null )
             {
                 saxEvents.add( () -> 
                 {
@@ -112,7 +109,20 @@ abstract class AbstractEventXMLFilter extends AbstractSAXFilter
             event.execute();
         }
     }
-    
+
+    /**
+     * Should be used to include extra events before a closing element.
+     * This is a lightweight solution to keep the correct indentation.
+     * 
+     * @return
+     */
+    protected Includer include() 
+    {
+        this.lockCharacters = true;
+        
+        return () -> lockCharacters = false;
+    }
+
     protected final void executeEvents() throws SAXException
     {
         final String eventState = getState();
@@ -188,10 +198,13 @@ abstract class AbstractEventXMLFilter extends AbstractSAXFilter
     @Override
     public void characters( char[] ch, int start, int length ) throws SAXException
     {
-        if ( isParsing() )
+        if ( lockCharacters )
+        {
+            processEvent( getEventFactory().characters( ch, start, length ) );
+        }
+        else if ( isParsing() )
         {
             this.characters = getEventFactory().characters( ch, start, length );
-            this.charactersMap.put( getState(), characters );
         }
         else
         {
@@ -261,4 +274,16 @@ abstract class AbstractEventXMLFilter extends AbstractSAXFilter
     {
         processEvent( getEventFactory().comment( ch, start, length ) );
     }
+    
+    /**
+     * AutoCloseable with a close method that doesn't throw an exception
+     * 
+     * @author Robert Scholte
+     *
+     */
+    @FunctionalInterface
+    protected interface Includer extends AutoCloseable
+    {
+        void close();
+    }
 }
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ParentXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ParentXMLFilter.java
index 2531798..df43ec1 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ParentXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ParentXMLFilter.java
@@ -49,6 +49,9 @@ class ParentXMLFilter
     // states
     private String state;
 
+    // whiteSpace after <parent>, to be used to position <version>
+    private String parentWhitespace = "";
+    
     private String groupId;
 
     private String artifactId;
@@ -120,15 +123,7 @@ class ParentXMLFilter
             switch ( eventState )
             {
                 case "parent":
-                    int l;
-                    for ( l = length ; l >= 0; l-- )
-                    {
-                        int i = start + l - 1; 
-                        if ( ch[i] == '\n' || ch[i] == '\r' )
-                        {
-                            break;
-                        }
-                    }
+                    parentWhitespace = new String( ch, start, length );
                     break;
                 case "relativePath":
                     relativePath = new String( ch, start, length );
@@ -164,30 +159,35 @@ class ParentXMLFilter
                     
                     if ( !hasVersion && resolvedParent.isPresent() )
                     {
-                        String versionQName = SAXEventUtils.renameQName( qName, "version" );
-                        
-                        super.startElement( uri, "version", versionQName, null );
-                        
-                        String resolvedParentVersion = resolvedParent.get().getVersion();
-                        
-                        super.characters( resolvedParentVersion.toCharArray(), 0,
-                                                      resolvedParentVersion.length() );
-                        
-                        super.endElement( uri, "version", versionQName );
+                        try ( Includer i = super.include() )
+                        {
+                            super.characters( parentWhitespace.toCharArray(), 0,
+                                              parentWhitespace.length() );
+                            
+                            String versionQName = SAXEventUtils.renameQName( qName, "version" );
+                            
+                            super.startElement( uri, "version", versionQName, null );
+                            
+                            String resolvedParentVersion = resolvedParent.get().getVersion();
+                            
+                            super.characters( resolvedParentVersion.toCharArray(), 0,
+                                                          resolvedParentVersion.length() );
+                            
+                            super.endElement( uri, "version", versionQName );
+                        }
                     }
-                    executeEvents();
+                    super.executeEvents();
                     
                     parsingParent = false;
                     break;
                 default:
+                    // marker?
                     break;
             }
         }
         
         super.endElement( uri, localName, qName );
-
-        // for this simple structure resetting to parent it sufficient
-        state = "parent";
+        state = "";
     }
 
     protected Optional<RelativeProject> resolveRelativePath( Path relativePath )
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java
index f98f4dd..bb00222 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java
@@ -189,4 +189,27 @@ public class ParentXMLFilterTest extends AbstractXMLFilterTests
         assertEquals( expected, actual );
     }
     
+    @Test
+    public void testIndent() throws Exception
+    {
+        String input = "<project>\n"
+            + "  <parent>\n"
+            + "    <groupId>GROUPID</groupId>\n"
+            + "    <artifactId>ARTIFACTID</artifactId>\n"
+            + "    <!--version here-->\n"
+            + "  </parent>\n"
+            + "</project>";
+        String expected = "<project>" + System.lineSeparator()
+            + "  <parent>" + System.lineSeparator()
+            + "    <groupId>GROUPID</groupId>" + System.lineSeparator()
+            + "    <artifactId>ARTIFACTID</artifactId>" + System.lineSeparator()
+            + "    <!--version here-->" + System.lineSeparator()
+            + "    <version>1.0.0</version>" + System.lineSeparator()
+            + "  </parent>" + System.lineSeparator()
+            + "</project>";
+
+        String actual = transform( input );
+
+        assertEquals( expected, actual );
+    }
 }