You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ol...@apache.org on 2014/04/29 01:40:10 UTC

svn commit: r1590843 - /maven/shared/trunk/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java

Author: olamy
Date: Mon Apr 28 23:40:09 2014
New Revision: 1590843

URL: http://svn.apache.org/r1590843
Log:
[MSHARED-307] Performance: The implementation of DefaultClassAnalyzer unnecessarily scans jar files bodies

Modified:
    maven/shared/trunk/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java

Modified: maven/shared/trunk/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java?rev=1590843&r1=1590842&r2=1590843&view=diff
==============================================================================
--- maven/shared/trunk/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java (original)
+++ maven/shared/trunk/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java Mon Apr 28 23:40:09 2014
@@ -19,28 +19,29 @@ package org.apache.maven.shared.dependen
  * under the License.
  */
 
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
 import java.util.Collections;
+import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
 
 /**
- * 
- * 
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  * @version $Id$
  */
-@Component( role = ProjectDependencyAnalyzer.class )
+@Component(role = ProjectDependencyAnalyzer.class)
 public class DefaultProjectDependencyAnalyzer
     implements ProjectDependencyAnalyzer
 {
@@ -98,11 +99,9 @@ public class DefaultProjectDependencyAna
      * This method defines a new way to remove the artifacts by using the
      * conflict id. We don't care about the version here because there can be
      * only 1 for a given artifact anyway.
-     * 
-     * @param start
-     *            initial set
-     * @param remove
-     *            set to exclude
+     *
+     * @param start  initial set
+     * @param remove set to exclude
      * @return set with remove excluded
      */
     private Set<Artifact> removeAll( Set<Artifact> start, Set<Artifact> remove )
@@ -138,18 +137,35 @@ public class DefaultProjectDependencyAna
     {
         Map<Artifact, Set<String>> artifactClassMap = new LinkedHashMap<Artifact, Set<String>>();
 
-        @SuppressWarnings( "unchecked" )
-        Set<Artifact> dependencyArtifacts = project.getArtifacts();
+        @SuppressWarnings( "unchecked" ) Set<Artifact> dependencyArtifacts = project.getArtifacts();
 
         for ( Artifact artifact : dependencyArtifacts )
         {
             File file = artifact.getFile();
 
-            if ( file != null && (file.getName().endsWith( ".jar" ) || file.isDirectory()))
+            if ( file != null && ( file.getName().endsWith( ".jar" ) || file.isDirectory() ) )
             {
-                URL url = file.toURI().toURL();
+                //URL url = file.toURI().toURL();
 
-                Set<String> classes = classAnalyzer.analyze( url );
+                JarFile jarFile = new JarFile( file );
+
+                Enumeration<JarEntry> jarEntries = jarFile.entries();
+
+                Set<String> classes = new HashSet<String>();
+
+                while ( jarEntries.hasMoreElements() )
+                {
+                    String entry = jarEntries.nextElement().getName();
+                    if ( entry.endsWith( ".class" ) )
+                    {
+                        String className =  entry.replace( '/', '.' );
+                        className = className.substring( 0, className.length() - ".class".length() );
+                        classes.add( className );
+
+                    }
+                }
+                // to slow
+                //Set<String> classes = classAnalyzer.analyze( url );
 
                 artifactClassMap.put( artifact, classes );
             }
@@ -171,7 +187,7 @@ public class DefaultProjectDependencyAna
 
         return dependencyClasses;
     }
-    
+
     private Set<String> buildDependencyClasses( String path )
         throws IOException
     {
@@ -179,11 +195,10 @@ public class DefaultProjectDependencyAna
 
         return dependencyAnalyzer.analyze( url );
     }
-    
+
     private Set<Artifact> buildDeclaredArtifacts( MavenProject project )
     {
-        @SuppressWarnings( "unchecked" )
-        Set<Artifact> declaredArtifacts = project.getDependencyArtifacts();
+        @SuppressWarnings( "unchecked" ) Set<Artifact> declaredArtifacts = project.getDependencyArtifacts();
 
         if ( declaredArtifacts == null )
         {
@@ -192,8 +207,9 @@ public class DefaultProjectDependencyAna
 
         return declaredArtifacts;
     }
-    
-    private Set<Artifact> buildUsedArtifacts( Map<Artifact, Set<String>> artifactClassMap, Set<String> dependencyClasses )
+
+    private Set<Artifact> buildUsedArtifacts( Map<Artifact, Set<String>> artifactClassMap,
+                                              Set<String> dependencyClasses )
     {
         Set<Artifact> usedArtifacts = new HashSet<Artifact>();