1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.mortbay.jetty.webapp;
18
19 import java.io.InputStream;
20 import java.net.URL;
21 import java.net.URLClassLoader;
22 import java.util.ArrayList;
23 import java.util.List;
24 import java.util.jar.JarEntry;
25 import java.util.jar.JarInputStream;
26 import java.util.regex.Pattern;
27
28 import org.mortbay.log.Log;
29 import org.mortbay.resource.Resource;
30
31
32
33
34
35
36
37
38
39
40
41
42
43 public abstract class JarScanner
44 {
45
46 public abstract void processEntry (URL jarUrl, JarEntry entry);
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 public void scan (Pattern pattern, ClassLoader loader, boolean isNullInclusive, boolean visitParent)
82 throws Exception
83 {
84 String[] patterns = (pattern==null?null:pattern.pattern().split(","));
85
86 List<Pattern> subPatterns = new ArrayList<Pattern>();
87 for (int i=0; patterns!=null && i<patterns.length;i++)
88 subPatterns.add(Pattern.compile(patterns[i]));
89 if (subPatterns.isEmpty())
90 subPatterns.add(pattern);
91
92
93 while (loader!=null)
94 {
95 if (loader instanceof URLClassLoader)
96 {
97 URL[] urls = ((URLClassLoader)loader).getURLs();
98
99 if (urls!=null)
100 {
101 if (subPatterns.isEmpty())
102 {
103 processJars(null, urls, isNullInclusive);
104 }
105 else
106 {
107
108 for (Pattern p : subPatterns)
109 {
110 processJars(p, urls, isNullInclusive);
111 }
112 }
113 }
114 }
115 if (visitParent)
116 loader=loader.getParent();
117 else
118 loader = null;
119 }
120 }
121
122
123
124 public void processJars (Pattern pattern, URL[] urls, boolean isNullInclusive)
125 throws Exception
126 {
127 for (int i=0; i<urls.length;i++)
128 {
129 if (urls[i].toString().toLowerCase().endsWith(".jar"))
130 {
131 String jar = urls[i].toString();
132 int slash=jar.lastIndexOf('/');
133 jar=jar.substring(slash+1);
134
135 if ((pattern == null && isNullInclusive)
136 ||
137 (pattern!=null && pattern.matcher(jar).matches()))
138 {
139 processJar(urls[i]);
140 }
141 }
142 }
143 }
144
145 public void processJar (URL url)
146 throws Exception
147 {
148 Log.debug("Search of {}",url);
149
150 InputStream in = Resource.newResource(url).getInputStream();
151 if (in==null)
152 return;
153
154 JarInputStream jar_in = new JarInputStream(in);
155 try
156 {
157 JarEntry entry = jar_in.getNextJarEntry();
158 while (entry!=null)
159 {
160 processEntry(url, entry);
161 entry = jar_in.getNextJarEntry();
162 }
163 }
164 finally
165 {
166 jar_in.close();
167 }
168 }
169 }