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 08:46:47 UTC

[maven] branch master updated: [MNG-7432] Resolver session contains non-MavenWorkspaceReader

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

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


The following commit(s) were added to refs/heads/master by this push:
     new bdb35f2de [MNG-7432] Resolver session contains non-MavenWorkspaceReader
bdb35f2de is described below

commit bdb35f2deb01148eb56edc49f1c21ee0ffd6d694
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Fri Apr 8 10:46:30 2022 +0200

    [MNG-7432] Resolver session contains non-MavenWorkspaceReader
    
    As Resolver session contains non-MavenWorkspaceReader, the reactor models (already resolved w/ profiles applied) are re-built when using Resolver within Mojo, instead to get them via ReactorReader as expected. The rebuilt models will lack explicit (-P on CLI) profiles applied, as resolver itself is not maven aware, hence there is no way to "tell" resolver to apply them. Building reactor models w/ profiles applied is NOT done using resolver, but by Maven when loading up reactor, as pro [...]
    
    Signed-off-by: Christoph Läubrich <ch...@laeubi-soft.de>
    Co-authored-by: Christoph Läubrich <ch...@laeubi-soft.de>
    Co-authored-by: Tamas Cservenak <ta...@cservenak.net>
---
 .../main/java/org/apache/maven/DefaultMaven.java   |   6 +-
 .../aether/MavenChainedWorkspaceReader.java        | 106 +++++++++++++++++++++
 .../java/org/apache/maven/DefaultMavenTest.java    |  36 ++++++-
 .../src/test/projects/default-maven/simple/pom.xml |  10 ++
 4 files changed, 153 insertions(+), 5 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
index 56a42b724..14b613899 100644
--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
@@ -33,6 +33,7 @@ import org.apache.maven.execution.ProjectDependencyGraph;
 import org.apache.maven.graph.GraphBuilder;
 import org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory;
 import org.apache.maven.lifecycle.LifecycleExecutionException;
+import org.apache.maven.internal.aether.MavenChainedWorkspaceReader;
 import org.apache.maven.lifecycle.internal.ExecutionEventCatapult;
 import org.apache.maven.lifecycle.internal.LifecycleStarter;
 import org.apache.maven.model.Model;
@@ -51,7 +52,6 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupExcepti
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.repository.WorkspaceReader;
-import org.eclipse.aether.util.repository.ChainedWorkspaceReader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -377,9 +377,7 @@ public class DefaultMaven
             }
             workspaceReaders.add( workspaceReader );
         }
-        WorkspaceReader[] readers = workspaceReaders.toArray( new WorkspaceReader[0] );
-        repoSession.setWorkspaceReader( new ChainedWorkspaceReader( readers ) );
-
+        repoSession.setWorkspaceReader( MavenChainedWorkspaceReader.of( workspaceReaders ) );
     }
 
     private void afterSessionStart( MavenSession session )
diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/MavenChainedWorkspaceReader.java b/maven-core/src/main/java/org/apache/maven/internal/aether/MavenChainedWorkspaceReader.java
new file mode 100644
index 000000000..4bc16a927
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/internal/aether/MavenChainedWorkspaceReader.java
@@ -0,0 +1,106 @@
+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.File;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.repository.internal.MavenWorkspaceReader;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.repository.WorkspaceReader;
+import org.eclipse.aether.repository.WorkspaceRepository;
+import org.eclipse.aether.util.repository.ChainedWorkspaceReader;
+
+/**
+ * A maven workspace reader that delegates to a chain of other readers, effectively aggregating their contents.
+ */
+public final class MavenChainedWorkspaceReader
+    implements MavenWorkspaceReader
+{
+
+    private ChainedWorkspaceReader delegate;
+
+    private WorkspaceReader[] readers;
+
+    /**
+     * Creates a new workspace reader by chaining the specified readers.
+     * 
+     * @param readers The readers to chain must not be {@code null}.
+     */
+    private MavenChainedWorkspaceReader( WorkspaceReader... readers )
+    {
+        this.delegate = new ChainedWorkspaceReader( readers );
+        this.readers = readers;
+    }
+
+    @Override
+    public Model findModel( Artifact artifact )
+    {
+        for ( WorkspaceReader workspaceReader : readers )
+        {
+            if ( workspaceReader instanceof MavenWorkspaceReader )
+            {
+                Model model = ( (MavenWorkspaceReader) workspaceReader ).findModel( artifact );
+                if ( model != null )
+                {
+                    return model;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public WorkspaceRepository getRepository()
+    {
+        return delegate.getRepository();
+    }
+
+    @Override
+    public File findArtifact( Artifact artifact )
+    {
+        return delegate.findArtifact( artifact );
+    }
+
+    @Override
+    public List<String> findVersions( Artifact artifact )
+    {
+        return delegate.findVersions( artifact );
+    }
+
+    /**
+     * chains a collection of {@link WorkspaceReader}s
+     * @param workspaceReaderCollection the collection of readers, might be empty but never <code>null</code>
+     * @return if the collection contains only one item returns the single item, otherwise creates a new
+     *         {@link MavenChainedWorkspaceReader} chaining all readers in the order of the given collection.
+     */
+    public static WorkspaceReader of( Collection<WorkspaceReader> workspaceReaderCollection )
+    {
+        WorkspaceReader[] readers = workspaceReaderCollection.toArray( new WorkspaceReader[0] );
+        if ( readers.length == 1 )
+        {
+            return readers[0];
+        }
+        return new MavenChainedWorkspaceReader( readers );
+    }
+
+}
diff --git a/maven-core/src/test/java/org/apache/maven/DefaultMavenTest.java b/maven-core/src/test/java/org/apache/maven/DefaultMavenTest.java
index b65d38f47..9075e79c7 100644
--- a/maven-core/src/test/java/org/apache/maven/DefaultMavenTest.java
+++ b/maven-core/src/test/java/org/apache/maven/DefaultMavenTest.java
@@ -20,23 +20,42 @@ package org.apache.maven;
 
 import java.io.File;
 import java.nio.file.Files;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.execution.MavenExecutionRequest;
 import org.apache.maven.execution.MavenExecutionResult;
+import org.apache.maven.execution.MavenSession;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
+import org.apache.maven.repository.internal.MavenWorkspaceReader;
 import org.junit.jupiter.api.Test;
 
 import static java.util.Arrays.asList;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class DefaultMavenTest
-    extends AbstractCoreMavenComponentTestCase
+        extends AbstractCoreMavenComponentTestCase
 {
+    @Singleton
+    @Named( "WsrClassCatcher" )
+    private static final class WsrClassCatcher extends AbstractMavenLifecycleParticipant
+    {
+        private final AtomicReference<Class<?>> wsrClassRef = new AtomicReference<>( null );
+
+        @Override
+        public void afterProjectsRead( MavenSession session ) throws MavenExecutionException
+        {
+            wsrClassRef.set( session.getRepositorySession().getWorkspaceReader().getClass() );
+        }
+    }
 
     @Inject
     private Maven maven;
@@ -47,6 +66,21 @@ public class DefaultMavenTest
         return "src/test/projects/default-maven";
     }
 
+    @Test
+    public void testEnsureResolverSessionHasMavenWorkspaceReader()
+            throws Exception
+    {
+        WsrClassCatcher wsrClassCatcher = ( WsrClassCatcher ) getContainer()
+                .lookup( AbstractMavenLifecycleParticipant.class, "WsrClassCatcher" );
+        Maven maven = getContainer().lookup( Maven.class );
+        MavenExecutionRequest request = createMavenExecutionRequest( getProject( "simple" ) ).setGoals( asList("validate") );
+
+        MavenExecutionResult result = maven.execute( request );
+
+        Class<?> wsrClass = wsrClassCatcher.wsrClassRef.get();
+        assertNotNull( wsrClass, "wsr cannot be null" );
+        assertTrue( MavenWorkspaceReader.class.isAssignableFrom( wsrClass ), String.valueOf( wsrClass ) );
+    }
 
     @Test
     public void testThatErrorDuringProjectDependencyGraphCreationAreStored()
diff --git a/maven-core/src/test/projects/default-maven/simple/pom.xml b/maven-core/src/test/projects/default-maven/simple/pom.xml
new file mode 100644
index 000000000..0221f8208
--- /dev/null
+++ b/maven-core/src/test/projects/default-maven/simple/pom.xml
@@ -0,0 +1,10 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>simple</groupId>
+  <artifactId>simple</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+</project>