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 try
98 {
99 JarEntry entry = null;
100
101 while ( ( entry = in.getNextJarEntry() ) != null )
102 {
103 String name = entry.getName();
104
105 if ( name.endsWith( ".class" ) )
106 {
107 visitClass( name, in, visitor );
108 }
109 }
110 }
111 finally
112 {
113 in.close();
114 }
115 }
116
117 private static void acceptDirectory( File directory, ClassFileVisitor visitor )
118 throws IOException
119 {
120 if ( !directory.isDirectory() )
121 {
122 throw new IllegalArgumentException( "File is not a directory" );
123 }
124
125 DirectoryScanner scanner = new DirectoryScanner();
126
127 scanner.setBasedir( directory );
128 scanner.setIncludes( CLASS_INCLUDES );
129
130 scanner.scan();
131
132 String[] paths = scanner.getIncludedFiles();
133
134 for ( String path : paths )
135 {
136 path = path.replace( File.separatorChar, '/' );
137
138 File file = new File( directory, path );
139 FileInputStream in = new FileInputStream( file );
140
141 try
142 {
143 visitClass( path, in, visitor );
144 }
145 finally
146 {
147 in.close();
148 }
149 }
150 }
151
152 private static void visitClass( String path, InputStream in, ClassFileVisitor visitor )
153 {
154 if ( !path.endsWith( ".class" ) )
155 {
156 throw new IllegalArgumentException( "Path is not a class" );
157 }
158
159 String className = path.substring( 0, path.length() - 6 );
160
161 className = className.replace( '/', '.' );
162
163 visitor.visitClass( className, in );
164 }
165 }