[MSHARED-307] Performance: The implementation of DefaultClassAnalyzer unnecessarily scans jar files bodies

git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@1590843 13f79535-47bb-0310-9956-ffa450edef68
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 5f5ca1a..cb8f86d 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
@@ -19,28 +19,29 @@
  * under the License.
  */
 
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collections;
-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.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 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 @@
      * 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 @@
     {
         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 @@
 
         return dependencyClasses;
     }
-    
+
     private Set<String> buildDependencyClasses( String path )
         throws IOException
     {
@@ -179,11 +195,10 @@
 
         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 @@
 
         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>();