You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2022/02/12 20:13:04 UTC

[maven] 01/01: [MNG-7400] Allow more WorkspaceReaders to participate

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

michaelo pushed a commit to branch MNG-7400
in repository https://gitbox.apache.org/repos/asf/maven.git

commit c1b020762aeab7d04508c84adf4b1f4759148cb1
Author: Christoph Läubrich <ch...@laeubi-soft.de>
AuthorDate: Sat Jan 29 17:03:00 2022 +0100

    [MNG-7400] Allow more WorkspaceReaders to participate
    
    This closes #667
---
 .../main/java/org/apache/maven/DefaultMaven.java   | 103 ++++++++++++++-------
 1 file changed, 67 insertions(+), 36 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 142dc13..01cd4e2 100644
--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
@@ -266,28 +266,15 @@ public class DefaultMaven
             return addExceptionToResult( result, e );
         }
 
-        WorkspaceReader reactorWorkspace;
         try
         {
-            reactorWorkspace = container.lookup( WorkspaceReader.class, ReactorReader.HINT );
+            setupWorkspaceReader( session, repoSession );
         }
         catch ( ComponentLookupException e )
         {
             return addExceptionToResult( result, e );
         }
-
-        //
-        // Desired order of precedence for local artifact repositories
-        //
-        // Reactor
-        // Workspace
-        // User Local Repository
-        //
-        repoSession.setWorkspaceReader( ChainedWorkspaceReader.newInstance( reactorWorkspace,
-                                                                            repoSession.getWorkspaceReader() ) );
-
         repoSession.setReadOnly();
-
         try
         {
             afterProjectsRead( session );
@@ -367,11 +354,40 @@ public class DefaultMaven
         return result;
     }
 
+    private void setupWorkspaceReader( MavenSession session, DefaultRepositorySystemSession repoSession )
+        throws ComponentLookupException
+    {
+        // Desired order of precedence for workspace readers before querying the local artifact repositories
+        List<WorkspaceReader> workspaceReaders = new ArrayList<WorkspaceReader>();
+        // 1) Reactor workspace reader
+        workspaceReaders.add( container.lookup( WorkspaceReader.class, ReactorReader.HINT ) );
+        // 2) Repository system session-scoped workspace reader
+        WorkspaceReader repoWorkspaceReader = repoSession.getWorkspaceReader();
+        if ( repoWorkspaceReader != null )
+        {
+            workspaceReaders.add( repoWorkspaceReader );
+        }
+        // 3) .. n) project-scoped workspace readers
+        for ( WorkspaceReader workspaceReader : getProjectScopedExtensionComponents( session.getProjects(),
+                                                                                     WorkspaceReader.class ) )
+        {
+            if ( workspaceReaders.contains( workspaceReader ) )
+            {
+                continue;
+            }
+            workspaceReaders.add( workspaceReader );
+        }
+        WorkspaceReader[] readers = workspaceReaders.toArray( new WorkspaceReader[0] );
+        repoSession.setWorkspaceReader( new ChainedWorkspaceReader( readers ) );
+
+    }
+
     private void afterSessionStart( MavenSession session )
         throws MavenExecutionException
     {
         // CHECKSTYLE_OFF: LineLength
-        for ( AbstractMavenLifecycleParticipant listener : getLifecycleParticipants( Collections.emptyList() ) )
+        for ( AbstractMavenLifecycleParticipant listener : getExtensionComponents( Collections.emptyList(),
+                                                                                   AbstractMavenLifecycleParticipant.class ) )
         // CHECKSTYLE_ON: LineLength
         {
             listener.afterSessionStart( session );
@@ -384,7 +400,10 @@ public class DefaultMaven
         ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
         try
         {
-            for ( AbstractMavenLifecycleParticipant listener : getLifecycleParticipants( session.getProjects() ) )
+            // CHECKSTYLE_OFF: LineLength
+            for ( AbstractMavenLifecycleParticipant listener : getExtensionComponents( session.getProjects(),
+                                                                                       AbstractMavenLifecycleParticipant.class ) )
+            // CHECKSTYLE_ON: LineLength
             {
                 Thread.currentThread().setContextClassLoader( listener.getClass().getClassLoader() );
 
@@ -403,7 +422,10 @@ public class DefaultMaven
         ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
         try
         {
-            for ( AbstractMavenLifecycleParticipant listener : getLifecycleParticipants( projects ) )
+            // CHECKSTYLE_OFF: LineLength
+            for ( AbstractMavenLifecycleParticipant listener : getExtensionComponents( projects,
+                                                                                       AbstractMavenLifecycleParticipant.class ) )
+            // CHECKSTYLE_ON: LineLength
             {
                 Thread.currentThread().setContextClassLoader( listener.getClass().getClassLoader() );
 
@@ -463,51 +485,60 @@ public class DefaultMaven
         }
     }
 
-    private Collection<AbstractMavenLifecycleParticipant> getLifecycleParticipants( Collection<MavenProject> projects )
+    private <T> Collection<T> getExtensionComponents( Collection<MavenProject> projects, Class<T> role )
     {
-        Collection<AbstractMavenLifecycleParticipant> lifecycleListeners = new LinkedHashSet<>();
+        Collection<T> foundComponents = new LinkedHashSet<>();
 
-        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
         try
         {
-            try
-            {
-                lifecycleListeners.addAll( container.lookupList( AbstractMavenLifecycleParticipant.class ) );
-            }
-            catch ( ComponentLookupException e )
-            {
-                // this is just silly, lookupList should return an empty list!
-                logger.warn( "Failed to lookup lifecycle participants: " + e.getMessage() );
-            }
+            foundComponents.addAll( container.lookupList( role ) );
+        }
+        catch ( ComponentLookupException e )
+        {
+            // this is just silly, lookupList should return an empty list!
+            logger.warn( "Failed to lookup " + role + ": " + e.getMessage() );
+        }
 
-            Collection<ClassLoader> scannedRealms = new HashSet<>();
+        foundComponents.addAll( getProjectScopedExtensionComponents( projects, role ) );
 
+        return foundComponents;
+    }
+
+    protected <T> Collection<T> getProjectScopedExtensionComponents( Collection<MavenProject> projects, Class<T> role )
+    {
+
+        Collection<T> foundComponents = new LinkedHashSet<>();
+        Collection<ClassLoader> scannedRealms = new HashSet<>();
+
+        Thread currentThread = Thread.currentThread();
+        ClassLoader originalContextClassLoader = currentThread.getContextClassLoader();
+        try
+        {
             for ( MavenProject project : projects )
             {
                 ClassLoader projectRealm = project.getClassRealm();
 
                 if ( projectRealm != null && scannedRealms.add( projectRealm ) )
                 {
-                    Thread.currentThread().setContextClassLoader( projectRealm );
+                    currentThread.setContextClassLoader( projectRealm );
 
                     try
                     {
-                        lifecycleListeners.addAll( container.lookupList( AbstractMavenLifecycleParticipant.class ) );
+                        foundComponents.addAll( container.lookupList( role ) );
                     }
                     catch ( ComponentLookupException e )
                     {
                         // this is just silly, lookupList should return an empty list!
-                        logger.warn( "Failed to lookup lifecycle participants: " + e.getMessage() );
+                        logger.warn( "Failed to lookup " + role + ": " + e.getMessage() );
                     }
                 }
             }
+            return foundComponents;
         }
         finally
         {
-            Thread.currentThread().setContextClassLoader( originalClassLoader );
+            currentThread.setContextClassLoader( originalContextClassLoader );
         }
-
-        return lifecycleListeners;
     }
 
     private MavenExecutionResult addExceptionToResult( MavenExecutionResult result, Throwable e )