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