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/06/06 11:05:33 UTC

[maven] branch MNG-6656 updated: Fix lineseparator in comments

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 51b74ad  Fix lineseparator in comments
51b74ad is described below

commit 51b74adb8aea1f32b8db7584b4370f8424bb3ddd
Author: rfscholte <rf...@apache.org>
AuthorDate: Sat Jun 6 13:05:23 2020 +0200

    Fix lineseparator in comments
---
 apache-maven/maven-wrapper.pom                     |   5 +
 .../aether/ConsumerModelSourceTransformer.java     |   1 +
 .../DefaultRepositorySystemSessionFactory.java     |   2 +-
 .../maven/project/DefaultProjectBuilder.java       |  79 +--------------
 .../building/AbstractModelSourceTransformer.java   |   4 +-
 .../maven/model/building/TransformerContext.java   |   2 +
 maven-xml/pom.xml                                  |   8 +-
 .../maven/xml/sax/ext/CommentRenormalizer.java     | 108 +++++++++++++++++++++
 .../maven/xml/sax/ext/CommentRenormalizerTest.java |  84 ++++++++++++++++
 9 files changed, 213 insertions(+), 80 deletions(-)

diff --git a/apache-maven/maven-wrapper.pom b/apache-maven/maven-wrapper.pom
index f2bcc7f..fc6755c 100644
--- a/apache-maven/maven-wrapper.pom
+++ b/apache-maven/maven-wrapper.pom
@@ -33,7 +33,12 @@ under the License.
   <name>Apache Maven Wrapper Distribution</name>
   <description>The Apache Maven Wrapper distribution in zip and tar.gz formats.</description>
 
+  <properties>
+    <distributionFileName>${artifactId}-${project.version}</distributionFileName>
+  </properties>
+
   <build>
+    <finalName>${distributionFileName}</finalName>
     <pluginManagement>
       <plugins>
         <plugin>
diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java b/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java
index 0f92f66..8ca0ca6 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java
@@ -81,6 +81,7 @@ class ConsumerModelSourceTransformer extends AbstractModelSourceTransformer
             final String version = streamReader.getVersion();
             
             Transformer transformer = transformerHandler.getTransformer();
+            transformer.setOutputProperty( OutputKeys.METHOD, "xml" );
             if ( encoding == null && version == null )
             {
                 transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
index d0dd442..928d200 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
@@ -248,7 +248,7 @@ public class DefaultRepositorySystemSessionFactory
         if ( Features.buildConsumer().isActive() )
         {
             session.setFileTransformerManager( a -> getTransformersForArtifact( a,
-                          (TransformerContext) session.getData().get( TransformerContext.class ) ) );
+                          (TransformerContext) session.getData().get( TransformerContext.KEY ) ) );
         }
 
         return session;
diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index 0def9e3..f09941b 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -21,8 +21,6 @@ package org.apache.maven.project;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.AbstractMap;
 import java.util.ArrayList;
@@ -40,16 +38,6 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.InvalidArtifactRTException;
@@ -67,9 +55,7 @@ import org.apache.maven.model.Model;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.Profile;
 import org.apache.maven.model.ReportPlugin;
-import org.apache.maven.model.building.AbstractModelSourceTransformer;
 import org.apache.maven.model.building.ArtifactModelSource;
-import org.apache.maven.model.building.DefaultBuildPomXMLFilterFactory;
 import org.apache.maven.model.building.DefaultModelBuildingRequest;
 import org.apache.maven.model.building.DefaultModelProblem;
 import org.apache.maven.model.building.FileModelSource;
@@ -84,9 +70,6 @@ import org.apache.maven.model.building.StringModelSource;
 import org.apache.maven.model.building.TransformerContext;
 import org.apache.maven.model.resolution.ModelResolver;
 import org.apache.maven.repository.internal.ArtifactDescriptorUtils;
-import org.apache.maven.xml.Factories;
-import org.apache.maven.xml.sax.filter.AbstractSAXFilter;
-import org.apache.maven.xml.sax.filter.ConsumerPomXMLFilterFactory;
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.util.Os;
 import org.codehaus.plexus.util.StringUtils;
@@ -98,7 +81,6 @@ import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.repository.WorkspaceRepository;
 import org.eclipse.aether.resolution.ArtifactRequest;
 import org.eclipse.aether.resolution.ArtifactResult;
-import org.xml.sax.SAXException;
 
 /**
  * DefaultProjectBuilder
@@ -313,7 +295,7 @@ public class DefaultProjectBuilder
         request.setBuildStartTime( configuration.getBuildStartTime() );
         request.setModelResolver( resolver );
         request.setModelCache( config.modelCache );
-        request.setTransformerContext( (TransformerContext) config.session.getData().get( TransformerContext.class ) );
+        request.setTransformerContext( (TransformerContext) config.session.getData().get( TransformerContext.KEY ) );
 
         return request;
     }
@@ -426,7 +408,7 @@ public class DefaultProjectBuilder
                     return modelPool.get( groupId, artifactId, null );
                 }
             };
-            request.getRepositorySession().getData().set( TransformerContext.class, context );
+            request.getRepositorySession().getData().set( TransformerContext.KEY, context );
         }
 
         InternalConfig config = new InternalConfig( request, modelPool,
@@ -1127,63 +1109,6 @@ public class DefaultProjectBuilder
 
     }
 
-    static class ConsumerModelSourceTransformer extends AbstractModelSourceTransformer
-    {
-        @Override
-        protected AbstractSAXFilter getSAXFilter( Path pomFile, TransformerContext context )
-            throws TransformerConfigurationException, SAXException, ParserConfigurationException
-        {
-            return new ConsumerPomXMLFilterFactory( new DefaultBuildPomXMLFilterFactory( context ) ).get( pomFile );
-        }
-        
-        @Override
-        protected TransformerHandler getTransformerHandler( Path pomFile )
-            throws IOException, org.apache.maven.model.building.TransformerException
-        {
-            final TransformerHandler transformerHandler;
-            
-            final SAXTransformerFactory transformerFactory =
-                            (SAXTransformerFactory) Factories.newTransformerFactory();
-            
-            // Keep same encoding+version
-            try ( InputStream input = Files.newInputStream( pomFile ) )
-            {
-                XMLStreamReader streamReader =
-                    XMLInputFactory.newFactory().createXMLStreamReader( input );
-
-                transformerHandler = transformerFactory.newTransformerHandler();
-
-                final String encoding = streamReader.getCharacterEncodingScheme();
-                final String version = streamReader.getVersion();
-                
-                Transformer transformer = transformerHandler.getTransformer();
-                if ( encoding == null && version == null )
-                {
-                    transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
-                }
-                else
-                {
-                    transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "no" );
-
-                    if ( encoding != null )
-                    {
-                        transformer.setOutputProperty( OutputKeys.ENCODING, encoding );
-                    }
-                    if ( version != null )
-                    {
-                        transformer.setOutputProperty( OutputKeys.VERSION, version );
-                    }
-                }
-            }
-            catch ( XMLStreamException | TransformerConfigurationException e )
-            {
-                throw new org.apache.maven.model.building.TransformerException( 
-                                   "Failed to detect XML encoding and version", e );
-            }
-            return transformerHandler;
-        }
-    }
-
     private ReactorModelCache getModelCache()
     {
         return this.modelCache;
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/AbstractModelSourceTransformer.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/AbstractModelSourceTransformer.java
index e0767fb..6fedada 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/AbstractModelSourceTransformer.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/AbstractModelSourceTransformer.java
@@ -39,6 +39,7 @@ import javax.xml.transform.sax.TransformerHandler;
 import javax.xml.transform.stream.StreamResult;
 
 import org.apache.maven.xml.Factories;
+import org.apache.maven.xml.sax.ext.CommentRenormalizer;
 import org.apache.maven.xml.sax.filter.AbstractSAXFilter;
 import org.xml.sax.SAXException;
 
@@ -101,8 +102,9 @@ public abstract class AbstractModelSourceTransformer
         }
         else
         {
+            result = new SAXResult( transformerHandler );
+            ( (SAXResult) result ).setLexicalHandler( new CommentRenormalizer( transformerHandler ) );
             transformerHandler.setResult( new StreamResult( out ) );
-            result = new SAXResult( transformerHandler ); 
         }
 
         IOExceptionHandler eh = new IOExceptionHandler();
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/TransformerContext.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/TransformerContext.java
index cad2d25..f012220 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/TransformerContext.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/TransformerContext.java
@@ -30,6 +30,8 @@ import org.apache.maven.model.Model;
  */
 public interface TransformerContext
 {
+    Object KEY = TransformerContext.class;
+    
     String getUserProperty( String key );
     
     Model getRawModel( Path p );
diff --git a/maven-xml/pom.xml b/maven-xml/pom.xml
index eb285eb..6b98f12 100644
--- a/maven-xml/pom.xml
+++ b/maven-xml/pom.xml
@@ -30,12 +30,18 @@ under the License.
   </parent>
   <artifactId>maven-xml</artifactId>
   <name>Maven XML</name>
-  
+
   <dependencies>
     <dependency>
       <groupId>org.xmlunit</groupId>
       <artifactId>xmlunit-assertj</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/ext/CommentRenormalizer.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/ext/CommentRenormalizer.java
new file mode 100644
index 0000000..3ae19a4
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/ext/CommentRenormalizer.java
@@ -0,0 +1,108 @@
+package org.apache.maven.xml.sax.ext;
+
+/*
+ * 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.
+ */
+
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * During parsing the line separators are transformed to \n
+ * Unlike characters(), comments don't use the systems line separator for serialization.
+ * Hence use this class in the LexicalHandler chain to do so 
+ * 
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+public class CommentRenormalizer implements LexicalHandler
+{
+    private final LexicalHandler lexicalHandler;
+    
+    private final String lineSeparator;
+
+    public CommentRenormalizer( LexicalHandler lexicalHandler )
+    {
+        this( lexicalHandler,  System.lineSeparator() );
+    }
+
+    // for testing purpose
+    CommentRenormalizer( LexicalHandler lexicalHandler, String lineSeparator )
+    {
+        this.lexicalHandler = lexicalHandler;
+        this.lineSeparator = lineSeparator;
+    }
+
+    @Override
+    public void comment( char[] ch, int start, int length )
+        throws SAXException
+    {
+        if ( "\n".equals( lineSeparator ) )
+        {
+            lexicalHandler.comment( ch, start, length );
+        }
+        else
+        {
+            char[] ca = new String( ch, start, length ).replaceAll( "\n", lineSeparator ).toCharArray();
+            
+            lexicalHandler.comment( ca, 0, ca.length );
+        }
+    }
+
+    @Override
+    public void startDTD( String name, String publicId, String systemId )
+        throws SAXException
+    {
+        lexicalHandler.startDTD( name, publicId, systemId );
+    }
+
+    @Override
+    public void endDTD()
+        throws SAXException
+    {
+        lexicalHandler.endDTD();
+    }
+
+    @Override
+    public void startEntity( String name )
+        throws SAXException
+    {
+        lexicalHandler.startEntity( name );
+    }
+
+    @Override
+    public void endEntity( String name )
+        throws SAXException
+    {
+        lexicalHandler.endEntity( name );
+    }
+
+    @Override
+    public void startCDATA()
+        throws SAXException
+    {
+        lexicalHandler.startCDATA();
+    }
+
+    @Override
+    public void endCDATA()
+        throws SAXException
+    {
+        lexicalHandler.endCDATA();
+    }
+}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/ext/CommentRenormalizerTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/ext/CommentRenormalizerTest.java
new file mode 100644
index 0000000..b6bc381
--- /dev/null
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/ext/CommentRenormalizerTest.java
@@ -0,0 +1,84 @@
+package org.apache.maven.xml.sax.ext;
+
+/*
+ * 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.
+ */
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.xml.sax.ext.LexicalHandler;
+
+@RunWith( Parameterized.class )
+public class CommentRenormalizerTest
+{
+    private LexicalHandler lexicalHandler;
+    
+    private final String lineSeparator;
+    
+    @Parameters
+    public static Collection<Object[]> data() {
+        return Arrays.asList(new Object[][] {     
+                 { "\n" }, 
+                 { "\r\n" },  
+                 { "\r" }
+           });
+    }
+    
+    public CommentRenormalizerTest( String lineSeparator )
+    {
+        this.lineSeparator = lineSeparator;
+        this.lexicalHandler = mock( LexicalHandler.class );
+    }
+
+    @Test
+    public void singleLine()
+        throws Exception
+    {
+        CommentRenormalizer commentRenormalizer = new CommentRenormalizer( lexicalHandler, lineSeparator );
+
+        char[] ch = "single line".toCharArray();
+
+        commentRenormalizer.comment( ch, 0, ch.length );
+
+        verify( lexicalHandler ).comment( ch, 0, ch.length );
+    }
+    
+    @Test
+    public void multiLine()
+        throws Exception
+    {
+        CommentRenormalizer commentRenormalizer = new CommentRenormalizer( lexicalHandler, lineSeparator );
+
+        String text = "I%sam%sthe%sbest%s";
+
+        char[] chIn = String.format( text, "\n", "\n", "\n", "\n" ).toCharArray();
+        char[] chOut = String.format( text, lineSeparator, lineSeparator, lineSeparator, lineSeparator ).toCharArray();
+
+        commentRenormalizer.comment( chIn, 0, chIn.length );
+
+        verify( lexicalHandler ).comment( chOut, 0, chOut.length );
+    }
+}