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
30
31
32
33
34
35
36
37
38
39
40
41
42 public abstract class JarScanner
43 {
44
45 public abstract void processEntry (URL jarUrl, JarEntry entry);
46
47 WebAppContext _context;
48
49
50
51 public void setWebAppContext(WebAppContext context)
52 {
53 _context=context;
54 }
55
56
57 public WebAppContext getWebAppContext()
58 {
59 return _context;
60 }
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 public void scan (Pattern pattern, ClassLoader loader, boolean isNullInclusive, boolean visitParent)
96 throws Exception
97 {
98 String[] patterns = (pattern==null?null:pattern.pattern().split(","));
99 List<Pattern> subPatterns = new ArrayList<Pattern>();
100 for (int i=0; patterns!=null && i<patterns.length;i++)
101 subPatterns.add(Pattern.compile(patterns[i]));
102
103
104 while (loader!=null)
105 {
106 if (loader instanceof URLClassLoader)
107 {
108 URL[] urls = ((URLClassLoader)loader).getURLs();
109
110 if (urls!=null)
111 {
112 if (subPatterns.isEmpty())
113 {
114 processJars(null, urls, isNullInclusive);
115 }
116 else
117 {
118
119 for (Pattern p : subPatterns)
120 {
121 processJars(p, urls, isNullInclusive);
122 }
123 }
124 }
125 }
126 if (visitParent)
127 loader=loader.getParent();
128 else
129 loader = null;
130 }
131 }
132
133
134
135 public void processJars (Pattern pattern, URL[] urls, boolean isNullInclusive)
136 throws Exception
137 {
138 for (int i=0; i<urls.length;i++)
139 {
140 if (urls[i].toString().toLowerCase().endsWith(".jar"))
141 {
142 String jar = urls[i].toString();
143 int slash=jar.lastIndexOf('/');
144 jar=jar.substring(slash+1);
145
146 if ((pattern == null && isNullInclusive)
147 ||
148 (pattern!=null && pattern.matcher(jar).matches()))
149 {
150 processJar(urls[i]);
151 }
152 }
153 }
154 }
155
156 public void processJar (URL url)
157 throws Exception
158 {
159 Log.debug("Search of {}",url);
160
161 InputStream in = _context.newResource(url).getInputStream();
162 if (in==null)
163 return;
164
165 JarInputStream jar_in = new JarInputStream(in);
166 try
167 {
168 JarEntry entry = jar_in.getNextJarEntry();
169 while (entry!=null)
170 {
171 processEntry(url, entry);
172 entry = jar_in.getNextJarEntry();
173 }
174 }
175 finally
176 {
177 jar_in.close();
178 }
179 }
180 }