1 package org.apache.maven.shared.dependency.analyzer;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.codehaus.plexus.util.DirectoryScanner;
23
24 import java.io.File;
25 import java.io.FileInputStream;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.net.URI;
29 import java.net.URISyntaxException;
30 import java.net.URL;
31 import java.util.jar.JarEntry;
32 import java.util.jar.JarInputStream;
33
34
35
36
37
38
39
40
41 public final class ClassFileVisitorUtils
42 {
43
44
45 private static final String[] CLASS_INCLUDES = { "**/*.class" };
46
47
48
49 private ClassFileVisitorUtils()
50 {
51
52 }
53
54
55
56 public static void accept( URL url, ClassFileVisitor visitor )
57 throws IOException
58 {
59 if ( url.getPath().endsWith( ".jar" ) )
60 {
61 acceptJar( url, visitor );
62 }
63 else if ( url.getProtocol().equalsIgnoreCase( "file" ) )
64 {
65 try
66 {
67 File file = new File( new URI( url.toString() ) );
68
69 if ( file.isDirectory() )
70 {
71 acceptDirectory( file, visitor );
72 }
73 else if ( file.exists() )
74 {
75 throw new IllegalArgumentException( "Cannot accept visitor on URL: " + url );
76 }
77 }
78 catch ( URISyntaxException exception )
79 {
80 IllegalArgumentException e = new IllegalArgumentException( "Cannot accept visitor on URL: " + url );
81 e.initCause( exception );
82 throw e;
83 }
84 }
85 else
86 {
87 throw new IllegalArgumentException( "Cannot accept visitor on URL: " + url );
88 }
89 }
90
91
92
93 private static void acceptJar( URL url, ClassFileVisitor visitor )
94 throws IOException
95 {
96 JarInputStream in = new JarInputStream( url.openStream() );
97
98 JarEntry entry = null;
99
100 while ( ( entry = in.getNextJarEntry() ) != null )
101 {
102 String name = entry.getName();
103
104 if ( name.endsWith( ".class" ) )
105 {
106 visitClass( name, in, visitor );
107 }
108 }
109
110 in.close();
111 }
112
113 private static void acceptDirectory( File directory, ClassFileVisitor visitor )
114 throws IOException
115 {
116 if ( !directory.isDirectory() )
117 {
118 throw new IllegalArgumentException( "File is not a directory" );
119 }
120
121 DirectoryScanner scanner = new DirectoryScanner();
122
123 scanner.setBasedir( directory );
124 scanner.setIncludes( CLASS_INCLUDES );
125
126 scanner.scan();
127
128 String[] paths = scanner.getIncludedFiles();
129
130 for ( String path : paths )
131 {
132 path = path.replace( File.separatorChar, '/' );
133
134 File file = new File( directory, path );
135 FileInputStream in = new FileInputStream( file );
136
137 visitClass( path, in, visitor );
138
139 in.close();
140 }
141 }
142
143 private static void visitClass( String path, InputStream in, ClassFileVisitor visitor )
144 {
145 if ( !path.endsWith( ".class" ) )
146 {
147 throw new IllegalArgumentException( "Path is not a class" );
148 }
149
150 String className = path.substring( 0, path.length() - 6 );
151
152 className = className.replace( '/', '.' );
153
154 visitor.visitClass( className, in );
155 }
156 }