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 2021/09/27 18:19:41 UTC

[maven] branch maven-3.8.x updated: [MNG-7235] Speed improvements when calculating the sorted project graph

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

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


The following commit(s) were added to refs/heads/maven-3.8.x by this push:
     new 0a6bbb8  [MNG-7235] Speed improvements when calculating the sorted project graph
0a6bbb8 is described below

commit 0a6bbb8301717d386e6588a7ea32e3e2451c7060
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Sep 9 16:10:25 2021 +0200

    [MNG-7235] Speed improvements when calculating the sorted project graph
    
    This closes #530
---
 .../maven/graph/DefaultProjectDependencyGraph.java | 49 ++++++++++++++++++----
 1 file changed, 41 insertions(+), 8 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java b/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java
index e0067f1..7804312 100644
--- a/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java
+++ b/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java
@@ -22,8 +22,11 @@ package org.apache.maven.graph;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 
@@ -42,9 +45,13 @@ public class DefaultProjectDependencyGraph
     implements ProjectDependencyGraph
 {
 
-    private ProjectSorter sorter;
+    private final ProjectSorter sorter;
 
-    private List<MavenProject> allProjects;
+    private final List<MavenProject> allProjects;
+
+    private final Map<MavenProject, Integer> order;
+
+    private final Map<String, MavenProject> projects;
 
     /**
      * Creates a new project dependency graph based on the specified projects.
@@ -59,6 +66,16 @@ public class DefaultProjectDependencyGraph
         super();
         this.allProjects = Collections.unmodifiableList( new ArrayList<>( projects ) );
         this.sorter = new ProjectSorter( projects );
+        List<MavenProject> sorted = this.sorter.getSortedProjects();
+        this.order = new HashMap<>( sorted.size() );
+        this.projects = new HashMap<>( sorted.size() );
+        int index = 0;
+        for ( MavenProject project : sorted )
+        {
+            String id = ProjectSorter.getId( project );
+            this.projects.put( id, project );
+            this.order.put( project, index++ );
+        }
     }
 
     /**
@@ -78,6 +95,16 @@ public class DefaultProjectDependencyGraph
         super();
         this.allProjects = Collections.unmodifiableList( new ArrayList<>( allProjects ) );
         this.sorter = new ProjectSorter( projects );
+        List<MavenProject> sorted = this.sorter.getSortedProjects();
+        this.order = new HashMap<>( sorted.size() );
+        this.projects = new HashMap<>( sorted.size() );
+        int index = 0;
+        for ( MavenProject project : sorted )
+        {
+            String id = ProjectSorter.getId( project );
+            this.projects.put( id, project );
+            this.order.put( project, index++ );
+        }
     }
 
     /**
@@ -140,15 +167,13 @@ public class DefaultProjectDependencyGraph
     private List<MavenProject> getSortedProjects( Set<String> projectIds )
     {
         List<MavenProject> result = new ArrayList<>( projectIds.size() );
-
-        for ( MavenProject mavenProject : sorter.getSortedProjects() )
+        for ( String projectId : projectIds )
         {
-            if ( projectIds.contains( ProjectSorter.getId( mavenProject ) ) )
-            {
-                result.add( mavenProject );
-            }
+            result.add( projects.get( projectId ) );
         }
 
+        Collections.sort( result, new MavenProjectComparator() );
+
         return result;
     }
 
@@ -158,4 +183,12 @@ public class DefaultProjectDependencyGraph
         return sorter.getSortedProjects().toString();
     }
 
+    private class MavenProjectComparator implements Comparator<MavenProject>
+    {
+        @Override
+        public int compare( MavenProject o1, MavenProject o2 )
+        {
+            return order.get( o1 ) - order.get( o2 );
+        }
+    }
 }