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/05 14:48:55 UTC

[maven] branch MNG-6656 updated: [MNG-6656] restore publishing valid consumer poms. Improve Exception Handling

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 f998d90  [MNG-6656] restore publishing valid consumer poms. Improve Exception Handling
f998d90 is described below

commit f998d903d346d833b16addf7dcefe02fc3bdd9f4
Author: rfscholte <rf...@apache.org>
AuthorDate: Sun Apr 5 16:48:35 2020 +0200

    [MNG-6656] restore publishing valid consumer poms.
    Improve Exception Handling
---
 .../aether/ConsumerModelSourceTransformer.java     | 110 +++++++++++++++++++++
 .../DefaultRepositorySystemSessionFactory.java     |  50 +++++++++-
 .../maven/project/DefaultProjectBuilder.java       |  54 ++--------
 .../building/AbstractModelSourceTransformer.java   |   2 +-
 .../building/DefaultBuildPomXMLFilterFactory.java  |  18 ----
 .../xml/sax/filter/BuildPomXMLFilterFactory.java   |  17 ----
 6 files changed, 166 insertions(+), 85 deletions(-)

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
new file mode 100644
index 0000000..0f92f66
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java
@@ -0,0 +1,110 @@
+package org.apache.maven.internal.aether;
+
+/*
+ * 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 java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+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.model.building.AbstractModelSourceTransformer;
+import org.apache.maven.model.building.DefaultBuildPomXMLFilterFactory;
+import org.apache.maven.model.building.TransformerContext;
+import org.apache.maven.xml.Factories;
+import org.apache.maven.xml.internal.DefaultConsumerPomXMLFilterFactory;
+import org.apache.maven.xml.sax.filter.AbstractSAXFilter;
+import org.xml.sax.SAXException;
+
+class ConsumerModelSourceTransformer extends AbstractModelSourceTransformer
+{
+    @Override
+    protected AbstractSAXFilter getSAXFilter( Path pomFile, TransformerContext context )
+        throws TransformerConfigurationException, SAXException, ParserConfigurationException
+    {
+        return new DefaultConsumerPomXMLFilterFactory( new DefaultBuildPomXMLFilterFactory( context ) ).get( pomFile );
+    }
+    
+    /**
+     * This transformer will ensure that encoding and version are kept.
+     * However, it cannot prevent:
+     * <ul>
+     *   <li>line-endings will be unix-style(LF)</li>
+     *   <li>attributes will be on one line</li>
+     *   <li>Unnecessary whitespace before the rootelement will be remove</li> 
+     * </ul>
+     */
+    @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;
+    }
+
+}
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 8973b20..d0dd442 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
@@ -24,6 +24,8 @@ import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.bridge.MavenRepositorySystem;
 import org.apache.maven.eventspy.internal.EventSpyDispatcher;
 import org.apache.maven.execution.MavenExecutionRequest;
+import org.apache.maven.feature.Features;
+import org.apache.maven.model.building.TransformerContext;
 import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.apache.maven.settings.Mirror;
 import org.apache.maven.settings.Proxy;
@@ -44,6 +46,8 @@ import org.eclipse.aether.repository.RepositoryPolicy;
 import org.eclipse.aether.repository.WorkspaceReader;
 import org.eclipse.aether.resolution.ResolutionErrorPolicy;
 import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
+import org.eclipse.aether.transform.FileTransformer;
+import org.eclipse.aether.transform.TransformException;
 import org.eclipse.aether.util.repository.AuthenticationBuilder;
 import org.eclipse.aether.util.repository.DefaultAuthenticationSelector;
 import org.eclipse.aether.util.repository.DefaultMirrorSelector;
@@ -53,8 +57,13 @@ import org.eclipse.sisu.Nullable;
 
 import javax.inject.Inject;
 import javax.inject.Named;
+
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Properties;
@@ -96,7 +105,6 @@ public class DefaultRepositorySystemSessionFactory
     public DefaultRepositorySystemSession newRepositorySession( MavenExecutionRequest request )
     {
         DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
-
         session.setCache( request.getRepositoryCache() );
 
         Map<Object, Object> configProps = new LinkedHashMap<>();
@@ -139,7 +147,6 @@ public class DefaultRepositorySystemSessionFactory
                 session.setLocalRepositoryManager( simpleLocalRepoMgrFactory.newInstance( session, localRepo ) );
                 logger.info( "Disabling enhanced local repository: using legacy is strongly discouraged to ensure"
                                  + " build reproducibility." );
-
             }
             catch ( NoLocalRepositoryManagerException e )
             {
@@ -238,6 +245,12 @@ public class DefaultRepositorySystemSessionFactory
         mavenRepositorySystem.injectProxy( session, request.getPluginArtifactRepositories() );
         mavenRepositorySystem.injectAuthentication( session, request.getPluginArtifactRepositories() );
 
+        if ( Features.buildConsumer().isActive() )
+        {
+            session.setFileTransformerManager( a -> getTransformersForArtifact( a,
+                          (TransformerContext) session.getData().get( TransformerContext.class ) ) );
+        }
+
         return session;
     }
 
@@ -266,5 +279,38 @@ public class DefaultRepositorySystemSessionFactory
 
         return props.getProperty( "version", "unknown-version" );
     }
+    
+    private Collection<FileTransformer> getTransformersForArtifact( final org.eclipse.aether.artifact.Artifact artifact,
+                                                                    TransformerContext context )
+    {
+        Collection<FileTransformer> transformers = new ArrayList<>();
+        if ( "pom".equals( artifact.getExtension() ) )
+        {
+            transformers.add( new FileTransformer()
+            {
+                @Override
+                public InputStream transformData( File pomFile )
+                    throws IOException, TransformException
+                {
+                    try
+                    {
+                        return new ConsumerModelSourceTransformer().transform( pomFile.toPath(), context );
+                    }
+                    catch ( org.apache.maven.model.building.TransformerException e )
+                    {
+                        throw new TransformException( e );
+                    }
+                }
+                
+                @Override
+                public org.eclipse.aether.artifact.Artifact transformArtifact( 
+                                                                   org.eclipse.aether.artifact.Artifact artifact )
+                {
+                    return artifact;
+                }
+            } );
+        }
+        return Collections.unmodifiableCollection( transformers );
+    }
 
 }
\ No newline at end of file
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 4b9821a..265633d 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
@@ -88,7 +88,6 @@ import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.util.Os;
 import org.codehaus.plexus.util.StringUtils;
-import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.RequestTrace;
 import org.eclipse.aether.impl.RemoteRepositoryManager;
@@ -97,8 +96,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.eclipse.aether.transform.FileTransformer;
-import org.eclipse.aether.transform.TransformException;
 import org.xml.sax.SAXException;
 
 /**
@@ -299,7 +296,6 @@ public class DefaultProjectBuilder
 
         RequestTrace trace = RequestTrace.newChild( null, configuration ).newChild( request );
 
-        RepositorySystemSession repoSession;
         if ( Features.buildConsumer().isActive() )
         {
             TransformerContext context = new TransformerContext()
@@ -313,27 +309,24 @@ public class DefaultProjectBuilder
                 @Override
                 public Model getRawModel( Path p )
                 {
-                    return config.modelPool.get( p );
+                    ReactorModelPool pool = config.modelPool;
+                    return pool != null ? pool.get( p ) : null;
                 }
 
                 @Override
                 public Model getRawModel( String groupId, String artifactId )
                 {
-                    return config.modelPool.get( groupId, artifactId, null );
+                    ReactorModelPool pool = config.modelPool;
+                    return pool != null ? pool.get( groupId, artifactId, null ) : null;
                 }
             };
-            request.setTransformerContext( context );
+            config.session.getData().set( TransformerContext.class, context );
             
-            repoSession = new DefaultRepositorySystemSession( config.session )
-                                        .setFileTransformerManager( a -> getTransformersForArtifact( a, context ) );
-        }
-        else
-        {
-            repoSession = config.session;
+            request.setTransformerContext( context );
         }
         
         ModelResolver resolver =
-            new ProjectModelResolver( repoSession, trace, repoSystem, repositoryManager, config.repositories,
+            new ProjectModelResolver( config.session, trace, repoSystem, repositoryManager, config.repositories,
                                       configuration.getRepositoryMerging(), config.modelPool );
 
         request.setValidationLevel( configuration.getValidationLevel() );
@@ -1104,39 +1097,6 @@ public class DefaultProjectBuilder
 
         return null;
     }
-    
-    private Collection<FileTransformer> getTransformersForArtifact( final org.eclipse.aether.artifact.Artifact artifact,
-                                                                    TransformerContext context )
-    {
-        Collection<FileTransformer> transformers = new ArrayList<>();
-        if ( "pom".equals( artifact.getExtension() ) )
-        {
-            transformers.add( new FileTransformer()
-            {
-                @Override
-                public InputStream transformData( File pomFile )
-                    throws IOException, TransformException
-                {
-                    try
-                    {
-                        return new ConsumerModelSourceTransformer().transform( pomFile.toPath(), context );
-                    }
-                    catch ( org.apache.maven.model.building.TransformerException e )
-                    {
-                        throw new TransformException( e );
-                    }
-                }
-                
-                @Override
-                public org.eclipse.aether.artifact.Artifact transformArtifact( 
-                                                                   org.eclipse.aether.artifact.Artifact artifact )
-                {
-                    return artifact;
-                }
-            } );
-        }
-        return Collections.unmodifiableCollection( transformers );
-    }
 
     /**
      * InternalConfig
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 db26715..e0767fb 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
@@ -164,7 +164,7 @@ public abstract class AbstractModelSourceTransformer
                 }
                 catch ( Throwable t )
                 {
-                    throw new AssertionError();
+                    throw new AssertionError( "Failed to transform pom", t );
                 }
             }
         }
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultBuildPomXMLFilterFactory.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultBuildPomXMLFilterFactory.java
index 9489e3b..3de90de 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultBuildPomXMLFilterFactory.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultBuildPomXMLFilterFactory.java
@@ -49,24 +49,6 @@ public class DefaultBuildPomXMLFilterFactory extends BuildPomXMLFilterFactory
     }
     
     @Override
-    protected Optional<String> getChangelist()
-    {
-        return Optional.ofNullable( context.getUserProperty( "changelist" ) );
-    }
-
-    @Override
-    protected Optional<String> getRevision()
-    {
-        return Optional.ofNullable( context.getUserProperty( "revision" ) );
-    }
-
-    @Override
-    protected Optional<String> getSha1()
-    {
-        return Optional.ofNullable( context.getUserProperty( "sha1" ) );
-    }
-
-    @Override
     protected Function<Path, Optional<RelativeProject>> getRelativePathMapper()
     {
         return p -> Optional.ofNullable( context.getRawModel( p ) ).map( m -> toRelativeProject( m ) );
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java
index d86200f..910bc16 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java
@@ -99,23 +99,6 @@ public class BuildPomXMLFilterFactory
             + " it is not an instance of SAXTransformerFactory" );
     }
     
-    // getters for the 3 magic properties of CIFriendly versions ( https://maven.apache.org/maven-ci-friendly.html )
-    
-    protected Optional<String> getChangelist()
-    {
-        return Optional.empty();
-    }
-        
-    protected Optional<String> getRevision()
-    {
-        return Optional.empty();
-    }
-    
-    protected Optional<String> getSha1()
-    {
-        return Optional.empty();
-    }
-    
     /**
      * @return the mapper or {@code null} if relativePaths don't need to be mapped
      */