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>