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

[maven-dependency-analyzer] 01/01: [MSHARED-1036] Analyze project classes only once

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

sjaranowski pushed a commit to branch MSHARED-1036
in repository https://gitbox.apache.org/repos/asf/maven-dependency-analyzer.git

commit be58e8e1fbdce8f4f3522af5d8e60f2f14193e7a
Author: Slawomir Jaranowski <s....@gmail.com>
AuthorDate: Mon Feb 21 23:05:59 2022 +0100

    [MSHARED-1036] Analyze project classes only once
---
 .../analyzer/DefaultProjectDependencyAnalyzer.java | 77 +++++++---------------
 1 file changed, 25 insertions(+), 52 deletions(-)

diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
index dc0c6a2..63ebfd3 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
@@ -33,9 +33,11 @@ import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
+import java.util.stream.Collectors;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.project.MavenProject;
@@ -62,7 +64,9 @@ public class DefaultProjectDependencyAnalyzer
     @Inject
     private DependencyAnalyzer dependencyAnalyzer;
 
-    /** {@inheritDoc} */
+    /**
+     * {@inheritDoc}
+     */
     public ProjectDependencyAnalysis analyze( MavenProject project )
         throws ProjectDependencyAnalyzerException
     {
@@ -70,12 +74,15 @@ public class DefaultProjectDependencyAnalyzer
         {
             Map<Artifact, Set<String>> artifactClassMap = buildArtifactClassMap( project );
 
-            Set<String> dependencyClasses = buildDependencyClasses( project );
             Set<String> mainDependencyClasses = buildMainDependencyClasses( project );
+            Set<String> testDependencyClasses = buildTestDependencyClasses( project );
 
-            Set<String> testOnlyDependencyClasses = buildTestDependencyClasses( project );
+            Set<String> dependencyClasses = new HashSet<>();
+            dependencyClasses.addAll( mainDependencyClasses );
+            dependencyClasses.addAll( testDependencyClasses );
 
-            Set<Artifact> declaredArtifacts = buildDeclaredArtifacts( project );
+            Set<String> testOnlyDependencyClasses = buildTestOnlyDependencyClasses( mainDependencyClasses,
+                                                                                    testDependencyClasses );
 
             Map<Artifact, Set<String>> usedArtifacts = buildUsedArtifacts( artifactClassMap, dependencyClasses );
             Set<Artifact> mainUsedArtifacts = buildUsedArtifacts( artifactClassMap, mainDependencyClasses ).keySet();
@@ -83,6 +90,7 @@ public class DefaultProjectDependencyAnalyzer
             Set<Artifact> testArtifacts = buildUsedArtifacts( artifactClassMap, testOnlyDependencyClasses ).keySet();
             Set<Artifact> testOnlyArtifacts = removeAll( testArtifacts, mainUsedArtifacts );
 
+            Set<Artifact> declaredArtifacts = buildDeclaredArtifacts( project );
             Set<Artifact> usedDeclaredArtifacts = new LinkedHashSet<>( declaredArtifacts );
             usedDeclaredArtifacts.retainAll( usedArtifacts.keySet() );
 
@@ -97,7 +105,7 @@ public class DefaultProjectDependencyAnalyzer
             Set<Artifact> testArtifactsWithNonTestScope = getTestArtifactsWithNonTestScope( testOnlyArtifacts );
 
             return new ProjectDependencyAnalysis( usedDeclaredArtifacts, usedUndeclaredArtifactsWithClasses,
-                unusedDeclaredArtifacts, testArtifactsWithNonTestScope );
+                                                  unusedDeclaredArtifacts, testArtifactsWithNonTestScope );
         }
         catch ( IOException exception )
         {
@@ -201,68 +209,38 @@ public class DefaultProjectDependencyAnalyzer
         return artifactClassMap;
     }
 
-    private Set<String> buildTestDependencyClasses( MavenProject project ) throws IOException
+    private Set<String> buildTestOnlyDependencyClasses( Set<String> mainDependencyClasses,
+                                                        Set<String> testDependencyClasses )
     {
-        Set<String> testOnlyDependencyClasses = new HashSet<>();
-
-        String outputDirectory = project.getBuild().getOutputDirectory();
-        Set<String> nonTestDependencyClasses = new HashSet<>( buildDependencyClasses( outputDirectory ) );
-
-        String testOutputDirectory = project.getBuild().getTestOutputDirectory();
-        Set<String> testDependencyClasses = new HashSet<>( buildDependencyClasses( testOutputDirectory ) );
-
-        for ( String testString : testDependencyClasses )
-        {
-            if ( !nonTestDependencyClasses.contains( testString ) )
-            {
-                testOnlyDependencyClasses.add( testString );
-            }
-        }
-
-        return testOnlyDependencyClasses;
+        return testDependencyClasses.stream()
+            .filter( klass -> !mainDependencyClasses.contains( klass ) )
+            .collect( Collectors.toSet() );
     }
 
-    private Set<String> buildDependencyClasses( MavenProject project )
+    private Set<String> buildMainDependencyClasses( MavenProject project )
         throws IOException
     {
-
         String outputDirectory = project.getBuild().getOutputDirectory();
-        Set<String> dependencyClasses = new HashSet<>( buildDependencyClasses( outputDirectory ) );
-
-        String testOutputDirectory = project.getBuild().getTestOutputDirectory();
-        dependencyClasses.addAll( buildDependencyClasses( testOutputDirectory ) );
-
-        return dependencyClasses;
+        return buildDependencyClasses( outputDirectory );
     }
 
-    private Set<String> buildMainDependencyClasses( MavenProject project )
+    private Set<String> buildTestDependencyClasses( MavenProject project )
         throws IOException
     {
-
-        String outputDirectory = project.getBuild().getOutputDirectory();
-        Set<String> dependencyClasses = new HashSet<>( buildDependencyClasses( outputDirectory ) );
-
-        return dependencyClasses;
+        String testOutputDirectory = project.getBuild().getTestOutputDirectory();
+        return buildDependencyClasses( testOutputDirectory );
     }
 
     private Set<String> buildDependencyClasses( String path )
         throws IOException
     {
         URL url = new File( path ).toURI().toURL();
-
         return dependencyAnalyzer.analyze( url );
     }
 
     private Set<Artifact> buildDeclaredArtifacts( MavenProject project )
     {
-        Set<Artifact> declaredArtifacts = project.getDependencyArtifacts();
-
-        if ( declaredArtifacts == null )
-        {
-            declaredArtifacts = Collections.emptySet();
-        }
-
-        return declaredArtifacts;
+        return Optional.ofNullable( project.getDependencyArtifacts() ).orElseGet( Collections::emptySet );
     }
 
     private Map<Artifact, Set<String>> buildUsedArtifacts( Map<Artifact, Set<String>> artifactClassMap,
@@ -276,12 +254,7 @@ public class DefaultProjectDependencyAnalyzer
 
             if ( artifact != null )
             {
-                Set<String> classesFromArtifact = usedArtifacts.get( artifact );
-                if ( classesFromArtifact == null )
-                {
-                    classesFromArtifact = new HashSet<String>();
-                    usedArtifacts.put( artifact, classesFromArtifact );
-                }
+                Set<String> classesFromArtifact = usedArtifacts.computeIfAbsent( artifact, k -> new HashSet<>() );
                 classesFromArtifact.add( className );
             }
         }