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 56a42b7244..14b613899d 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 0000000000..4bc16a9271 --- /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 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 null + * @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 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 b65d38f472..9075e79c7a 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> 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 0000000000..0221f8208f --- /dev/null +++ b/maven-core/src/test/projects/default-maven/simple/pom.xml @@ -0,0 +1,10 @@ + + 4.0.0 + + simple + simple + 1.0-SNAPSHOT + pom + +