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 2019/12/30 14:23:38 UTC

[maven] 02/06: MNG-6656: Keep xml version + encoding after transformation

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

commit d373d3a3d4419c0e15a8c37f28a92f3920fc61f6
Author: rfscholte <rf...@apache.org>
AuthorDate: Fri Dec 13 15:10:01 2019 +0100

    MNG-6656: Keep xml version + encoding after transformation
---
 .../DefaultRepositorySystemSessionFactory.java     | 82 +++++++++++++++++++---
 1 file changed, 73 insertions(+), 9 deletions(-)

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 526ed01..77581d6 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
@@ -20,7 +20,8 @@ package org.apache.maven.internal.aether;
  */
 
 import java.io.File;
-import java.io.FileReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PipedInputStream;
@@ -38,10 +39,18 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Provider;
 import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.FactoryConfigurationError;
+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.TransformerException;
-import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXResult;
 import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
 import javax.xml.transform.stream.StreamResult;
 
 import org.apache.maven.RepositoryUtils;
@@ -59,6 +68,7 @@ import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
 import org.apache.maven.settings.crypto.SettingsDecrypter;
 import org.apache.maven.settings.crypto.SettingsDecryptionResult;
 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.configuration.xml.XmlPlexusConfiguration;
 import org.codehaus.plexus.logging.Logger;
@@ -285,8 +295,9 @@ public class DefaultRepositorySystemSessionFactory
                 Collection<FileTransformer> transformers = new ArrayList<>();
                 if ( "pom".equals( artifact.getExtension() ) )
                 {
-                    final TransformerFactory transformerFactory = Factories.newTransformerFactory();
-
+                    final SAXTransformerFactory transformerFactory =
+                        (SAXTransformerFactory) Factories.newTransformerFactory();
+                    
                     transformers.add( new FileTransformer()
                     {
                         @Override
@@ -296,26 +307,33 @@ public class DefaultRepositorySystemSessionFactory
                             final PipedOutputStream pipedOutputStream  = new PipedOutputStream();
                             final PipedInputStream pipedInputStream  = new PipedInputStream( pipedOutputStream );
                             
+                            final TransformerHandler transformerHandler =
+                                getTransformerHandler( transformerFactory, file );
+                            
                             final SAXSource transformSource;
                             try
                             {
+                                AbstractSAXFilter filter = consumerPomXMLFilterFactory.get().get( file.toPath() );
+                                filter.setLexicalHandler( transformerHandler );
+                                
                                 transformSource =
-                                    new SAXSource( consumerPomXMLFilterFactory.get().get( file.toPath() ),
-                                                   new InputSource( new FileReader( file ) ) );
+                                    new SAXSource( filter, new InputSource( new FileInputStream( file ) ) );
                             }
                             catch ( SAXException | ParserConfigurationException | TransformerConfigurationException e )
                             {   
                                 throw new TransformException( "Failed to create a consumerPomXMLFilter", e );
                             }
                             
-                            final StreamResult result = new StreamResult( pipedOutputStream );
+                            transformerHandler.setResult( new StreamResult( pipedOutputStream ) );
+                            
+                            SAXResult transformResult = new SAXResult( transformerHandler );
                             
                             ExecutorService executorService = Executors.newSingleThreadExecutor();
                             executorService.execute( () -> 
                             {
                                 try ( PipedOutputStream out = pipedOutputStream )
                                 {
-                                    transformerFactory.newTransformer().transform( transformSource, result );
+                                    transformerFactory.newTransformer().transform( transformSource, transformResult );
                                 }
                                 catch ( TransformerException | IOException e )
                                 {
@@ -325,7 +343,7 @@ public class DefaultRepositorySystemSessionFactory
 
                             return pipedInputStream;
                         }
-
+                        
                         @Override
                         public Artifact transformArtifact( Artifact artifact )
                         {
@@ -338,6 +356,52 @@ public class DefaultRepositorySystemSessionFactory
         };
     }
     
+    private static TransformerHandler getTransformerHandler( SAXTransformerFactory transformerFactory,
+                                                      File file )
+        throws IOException, FileNotFoundException, TransformException
+    {
+        final TransformerHandler transformerHandler;
+        
+        // Keep same encoding+version
+        try ( FileInputStream input = new FileInputStream( file ) )
+        {
+            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 
+                        | FactoryConfigurationError
+                        | TransformerConfigurationException e )
+        {
+            throw new TransformException( "Failed to detect XML encoding and version", e );
+        }
+        return transformerHandler;
+    }
+
+    
     private String getUserAgent()
     {
         return "Apache-Maven/" + getMavenVersion() + " (Java " + System.getProperty( "java.version" ) + "; "