You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/04/08 19:22:32 UTC

[maven] 01/01: Use of the propsed ArtifactTransformer in Maven

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

cstamas pushed a commit to branch artifact-transformer
in repository https://gitbox.apache.org/repos/asf/maven.git

commit b756ed2eb9282cf4e5a5dcb0626027a0f6e5d9c0
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Fri Apr 8 21:20:05 2022 +0200

    Use of the propsed ArtifactTransformer in Maven
    
    To implement Consumer POM. There are a lot of shortcuts but
    the code is not worse that master had (left few TODOs).
    
    All the ITs locally pass with this build.
    To work, requires resolver artifact-transformer branch.
---
 .../aether/ConsumerPomArtifactTransformer.java     | 94 ++++++++++++++++++++++
 .../DefaultRepositorySystemSessionFactory.java     | 57 ++-----------
 pom.xml                                            |  2 +-
 3 files changed, 103 insertions(+), 50 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerPomArtifactTransformer.java b/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerPomArtifactTransformer.java
new file mode 100644
index 000000000..2cf2a9569
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerPomArtifactTransformer.java
@@ -0,0 +1,94 @@
+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 javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+import javax.inject.Singleton;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.building.TransformerContext;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.transform.ArtifactTransformer;
+
+@Named( ConsumerPomArtifactTransformer.NAME )
+@Singleton
+public class ConsumerPomArtifactTransformer implements ArtifactTransformer
+{
+    public static final String NAME = "consumer-pom";
+
+    private final Provider<MavenSession> mavenSessionProvider;
+
+    @Inject
+    public ConsumerPomArtifactTransformer( Provider<MavenSession> mavenSessionProvider )
+    {
+        this.mavenSessionProvider = mavenSessionProvider;
+    }
+
+    @Override
+    public Collection<Artifact> transformArtifact( Artifact artifact )
+    {
+        MavenSession mavenSession = mavenSessionProvider.get();
+        TransformerContext context = (TransformerContext) mavenSession
+                .getRepositorySession().getData().get( TransformerContext.KEY );
+        if ( "pom".equals( artifact.getExtension() ) && context != null )
+        {
+            // TODO: fix this, make it target rather
+            Path buildOutputDirectory = Paths.get(
+                    mavenSession.getCurrentProject().getBuild().getTestOutputDirectory() );
+            Path transformedPom = buildOutputDirectory.resolve( NAME + ".xml" );
+            try
+            {
+                Files.createDirectories( transformedPom.getParent() );
+                try ( InputStream inputStream = new ConsumerModelSourceTransformer()
+                        .transform( artifact.getFile().toPath(), context ) )
+                {
+                    // TODO: detect changes, do nothing if all ok
+                    Files.copy( inputStream, transformedPom, StandardCopyOption.REPLACE_EXISTING );
+                }
+                return Collections.singleton( artifact.setFile( transformedPom.toFile() ) );
+            }
+            catch ( XmlPullParserException e )
+            {
+                throw new IllegalStateException( e );
+            }
+            catch ( IOException e )
+            {
+                throw new UncheckedIOException( e );
+            }
+        }
+        else
+        {
+            return Collections.singleton( artifact );
+        }
+    }
+}
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 d157e7621..ac6eb38dc 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
@@ -19,12 +19,6 @@ package org.apache.maven.internal.aether;
  * under the License.
  */
 
-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;
 
@@ -37,7 +31,6 @@ 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.rtinfo.RuntimeInformation;
 import org.apache.maven.settings.Mirror;
@@ -49,20 +42,16 @@ import org.apache.maven.settings.crypto.SettingsDecrypter;
 import org.apache.maven.settings.crypto.SettingsDecryptionResult;
 import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 import org.eclipse.aether.ConfigurationProperties;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
-import org.eclipse.aether.SessionData;
-import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.repository.LocalRepository;
 import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
 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.transform.ArtifactTransformer;
 import org.eclipse.aether.util.repository.AuthenticationBuilder;
 import org.eclipse.aether.util.repository.DefaultAuthenticationSelector;
 import org.eclipse.aether.util.repository.DefaultMirrorSelector;
@@ -96,6 +85,8 @@ public class DefaultRepositorySystemSessionFactory
 
     private final RuntimeInformation runtimeInformation;
 
+    private final Map<String, ArtifactTransformer> artifactTransformers;
+
     @Inject
     public DefaultRepositorySystemSessionFactory(
             ArtifactHandlerManager artifactHandlerManager,
@@ -105,7 +96,8 @@ public class DefaultRepositorySystemSessionFactory
             SettingsDecrypter settingsDecrypter,
             EventSpyDispatcher eventSpyDispatcher,
             MavenRepositorySystem mavenRepositorySystem,
-            RuntimeInformation runtimeInformation )
+            RuntimeInformation runtimeInformation,
+            Map<String, ArtifactTransformer> artifactTransformers )
     {
         this.artifactHandlerManager = artifactHandlerManager;
         this.repoSystem = repoSystem;
@@ -115,6 +107,7 @@ public class DefaultRepositorySystemSessionFactory
         this.eventSpyDispatcher = eventSpyDispatcher;
         this.mavenRepositorySystem = mavenRepositorySystem;
         this.runtimeInformation = runtimeInformation;
+        this.artifactTransformers = artifactTransformers;
     }
 
     public DefaultRepositorySystemSession newRepositorySession( MavenExecutionRequest request )
@@ -263,7 +256,8 @@ public class DefaultRepositorySystemSessionFactory
 
         if ( Features.buildConsumer( request.getUserProperties() ).isActive() )
         {
-            session.setFileTransformerManager( a -> getTransformersForArtifact( a, session.getData() ) );
+            // TODO: this is ugly, we could do it smarter but will do it for now
+            session.setArtifactTransformerManager( a -> artifactTransformers.values() );
         }
 
         return session;
@@ -277,39 +271,4 @@ public class DefaultRepositorySystemSessionFactory
             + System.getProperty( "os.name" ) + " " + System.getProperty( "os.version" ) + ")";
     }
 
-    private Collection<FileTransformer> getTransformersForArtifact( final Artifact artifact,
-                                                                    final SessionData sessionData )
-    {
-        TransformerContext context = (TransformerContext) sessionData.get( TransformerContext.KEY );
-        Collection<FileTransformer> transformers = new ArrayList<>();
-
-        // In case of install:install-file there's no transformer context, as the goal is unrelated to the lifecycle.
-        if ( "pom".equals( artifact.getExtension() ) && context != null )
-        {
-            transformers.add( new FileTransformer()
-            {
-                @Override
-                public InputStream transformData( File pomFile )
-                    throws IOException, TransformException
-                {
-                    try
-                    {
-                        return new ConsumerModelSourceTransformer().transform( pomFile.toPath(), context );
-                    }
-                    catch ( XmlPullParserException e )
-                    {
-                        throw new TransformException( e );
-                    }
-                }
-
-                @Override
-                public Artifact transformArtifact( Artifact artifact )
-                {
-                    return artifact;
-                }
-            } );
-        }
-        return Collections.unmodifiableCollection( transformers );
-    }
-
 }
diff --git a/pom.xml b/pom.xml
index 4c2c09c74..f3829205a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,7 +65,7 @@ under the License.
     <cipherVersion>2.0</cipherVersion>
     <modelloVersion>2.0.0</modelloVersion>
     <jxpathVersion>1.3</jxpathVersion>
-    <resolverVersion>1.7.2</resolverVersion>
+    <resolverVersion>1.8.0-SNAPSHOT</resolverVersion>
     <slf4jVersion>1.7.32</slf4jVersion>
     <xmlunitVersion>2.6.4</xmlunitVersion>
     <maven.test.redirectTestOutputToFile>true</maven.test.redirectTestOutputToFile>