This file is indexed.

/usr/share/doc/libcobertura-java/api/src-html/net/sourceforge/cobertura/util/FileFinder.JarZipFilter.html is in libcobertura-java-doc 1.9.4.1+dfsg-4.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 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
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Cobertura - http://cobertura.sourceforge.net/<a name="line.2"></a>
<span class="sourceLineNo">003</span> *<a name="line.3"></a>
<span class="sourceLineNo">004</span> * Copyright (C) 2005 Jeremy Thomerson<a name="line.4"></a>
<span class="sourceLineNo">005</span> * Copyright (C) 2005 Grzegorz Lukasik<a name="line.5"></a>
<span class="sourceLineNo">006</span> * Copyright (C) 2009 Charlie Squires<a name="line.6"></a>
<span class="sourceLineNo">007</span> * Copyright (C) 2009 John Lewis<a name="line.7"></a>
<span class="sourceLineNo">008</span> *<a name="line.8"></a>
<span class="sourceLineNo">009</span> * Cobertura is free software; you can redistribute it and/or modify<a name="line.9"></a>
<span class="sourceLineNo">010</span> * it under the terms of the GNU General Public License as published<a name="line.10"></a>
<span class="sourceLineNo">011</span> * by the Free Software Foundation; either version 2 of the License,<a name="line.11"></a>
<span class="sourceLineNo">012</span> * or (at your option) any later version.<a name="line.12"></a>
<span class="sourceLineNo">013</span> *<a name="line.13"></a>
<span class="sourceLineNo">014</span> * Cobertura is distributed in the hope that it will be useful, but<a name="line.14"></a>
<span class="sourceLineNo">015</span> * WITHOUT ANY WARRANTY; without even the implied warranty of<a name="line.15"></a>
<span class="sourceLineNo">016</span> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<a name="line.16"></a>
<span class="sourceLineNo">017</span> * General Public License for more details.<a name="line.17"></a>
<span class="sourceLineNo">018</span> *<a name="line.18"></a>
<span class="sourceLineNo">019</span> * You should have received a copy of the GNU General Public License<a name="line.19"></a>
<span class="sourceLineNo">020</span> * along with Cobertura; if not, write to the Free Software<a name="line.20"></a>
<span class="sourceLineNo">021</span> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307<a name="line.21"></a>
<span class="sourceLineNo">022</span> * USA<a name="line.22"></a>
<span class="sourceLineNo">023</span> */<a name="line.23"></a>
<span class="sourceLineNo">024</span>package net.sourceforge.cobertura.util;<a name="line.24"></a>
<span class="sourceLineNo">025</span><a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.io.File;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.io.FileInputStream;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.io.FilenameFilter;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.io.IOException;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.util.ArrayList;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import java.util.Enumeration;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.util.HashMap;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import java.util.HashSet;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import java.util.Iterator;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import java.util.List;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import java.util.Map;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import java.util.Set;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import java.util.jar.JarEntry;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import java.util.jar.JarFile;<a name="line.39"></a>
<span class="sourceLineNo">040</span><a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.apache.log4j.Logger;<a name="line.41"></a>
<span class="sourceLineNo">042</span><a name="line.42"></a>
<span class="sourceLineNo">043</span><a name="line.43"></a>
<span class="sourceLineNo">044</span>/**<a name="line.44"></a>
<span class="sourceLineNo">045</span> * Maps source file names to existing files. After adding description<a name="line.45"></a>
<span class="sourceLineNo">046</span> * of places files can be found in, it can be used to localize <a name="line.46"></a>
<span class="sourceLineNo">047</span> * the files. <a name="line.47"></a>
<span class="sourceLineNo">048</span> * <a name="line.48"></a>
<span class="sourceLineNo">049</span> * &lt;p&gt;<a name="line.49"></a>
<span class="sourceLineNo">050</span> * FileFinder supports two types of source files locations:<a name="line.50"></a>
<span class="sourceLineNo">051</span> * &lt;ul&gt;<a name="line.51"></a>
<span class="sourceLineNo">052</span> *     &lt;li&gt;source root directory, defines the directory under <a name="line.52"></a>
<span class="sourceLineNo">053</span> *     which source files are located,&lt;/li&gt;<a name="line.53"></a>
<span class="sourceLineNo">054</span> *     &lt;li&gt;pair (base directory, file path relative to base directory).&lt;/li&gt;<a name="line.54"></a>
<span class="sourceLineNo">055</span> * &lt;/ul&gt;<a name="line.55"></a>
<span class="sourceLineNo">056</span> * The difference between these two is that in case of the first you add all<a name="line.56"></a>
<span class="sourceLineNo">057</span> * source files under the specified root directory, and in the second you add<a name="line.57"></a>
<span class="sourceLineNo">058</span> * exactly one file. In both cases file to be found has to be located under <a name="line.58"></a>
<span class="sourceLineNo">059</span> * subdirectory that maps to package definition provided with the source file name.      <a name="line.59"></a>
<span class="sourceLineNo">060</span> *  <a name="line.60"></a>
<span class="sourceLineNo">061</span> * @author Jeremy Thomerson<a name="line.61"></a>
<span class="sourceLineNo">062</span> */<a name="line.62"></a>
<span class="sourceLineNo">063</span>public class FileFinder {<a name="line.63"></a>
<span class="sourceLineNo">064</span><a name="line.64"></a>
<span class="sourceLineNo">065</span>        private static Logger LOGGER = Logger.getLogger(FileFinder.class);<a name="line.65"></a>
<span class="sourceLineNo">066</span>        <a name="line.66"></a>
<span class="sourceLineNo">067</span>        // Contains Strings with directory paths<a name="line.67"></a>
<span class="sourceLineNo">068</span>        private Set sourceDirectories = new HashSet();<a name="line.68"></a>
<span class="sourceLineNo">069</span>        <a name="line.69"></a>
<span class="sourceLineNo">070</span>        // Contains pairs (String directoryRoot, Set fileNamesRelativeToRoot)<a name="line.70"></a>
<span class="sourceLineNo">071</span>        private Map sourceFilesMap = new HashMap();<a name="line.71"></a>
<span class="sourceLineNo">072</span><a name="line.72"></a>
<span class="sourceLineNo">073</span>        /**<a name="line.73"></a>
<span class="sourceLineNo">074</span>         * Adds directory that is a root of sources. A source file<a name="line.74"></a>
<span class="sourceLineNo">075</span>         * that is under this directory will be found if relative<a name="line.75"></a>
<span class="sourceLineNo">076</span>         * path to the file from root matches package name.<a name="line.76"></a>
<span class="sourceLineNo">077</span>         * &lt;p&gt;<a name="line.77"></a>
<span class="sourceLineNo">078</span>         * Example:<a name="line.78"></a>
<span class="sourceLineNo">079</span>         * &lt;pre&gt;<a name="line.79"></a>
<span class="sourceLineNo">080</span>         * fileFinder.addSourceDirectory( "C:/MyProject/src/main");<a name="line.80"></a>
<span class="sourceLineNo">081</span>         * fileFinder.addSourceDirectory( "C:/MyProject/src/test");<a name="line.81"></a>
<span class="sourceLineNo">082</span>         * &lt;/pre&gt;<a name="line.82"></a>
<span class="sourceLineNo">083</span>         * In path both / and \ can be used.<a name="line.83"></a>
<span class="sourceLineNo">084</span>         * &lt;/p&gt; <a name="line.84"></a>
<span class="sourceLineNo">085</span>         * <a name="line.85"></a>
<span class="sourceLineNo">086</span>         * @param directory The root of source files <a name="line.86"></a>
<span class="sourceLineNo">087</span>         * @throws NullPointerException if &lt;code&gt;directory&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt;<a name="line.87"></a>
<span class="sourceLineNo">088</span>         */<a name="line.88"></a>
<span class="sourceLineNo">089</span>        public void addSourceDirectory( String directory) {<a name="line.89"></a>
<span class="sourceLineNo">090</span>                if( LOGGER.isDebugEnabled())<a name="line.90"></a>
<span class="sourceLineNo">091</span>                        LOGGER.debug( "Adding sourceDirectory=[" + directory + "]");<a name="line.91"></a>
<span class="sourceLineNo">092</span><a name="line.92"></a>
<span class="sourceLineNo">093</span>                // Change \ to / in case of Windows users<a name="line.93"></a>
<span class="sourceLineNo">094</span>                directory = getCorrectedPath(directory);<a name="line.94"></a>
<span class="sourceLineNo">095</span>                sourceDirectories.add(directory);<a name="line.95"></a>
<span class="sourceLineNo">096</span>        }<a name="line.96"></a>
<span class="sourceLineNo">097</span><a name="line.97"></a>
<span class="sourceLineNo">098</span>        /**<a name="line.98"></a>
<span class="sourceLineNo">099</span>         * Adds file by specifying root directory and relative path to the<a name="line.99"></a>
<span class="sourceLineNo">100</span>         * file in it. Adds exactly one file, relative path should match<a name="line.100"></a>
<span class="sourceLineNo">101</span>         * package that the source file is in, otherwise it will be not<a name="line.101"></a>
<span class="sourceLineNo">102</span>         * found later.<a name="line.102"></a>
<span class="sourceLineNo">103</span>         * &lt;p&gt;<a name="line.103"></a>
<span class="sourceLineNo">104</span>         * Example:<a name="line.104"></a>
<span class="sourceLineNo">105</span>         * &lt;pre&gt;<a name="line.105"></a>
<span class="sourceLineNo">106</span>         * fileFinder.addSourceFile( "C:/MyProject/src/main", "com/app/MyClass.java");<a name="line.106"></a>
<span class="sourceLineNo">107</span>         * fileFinder.addSourceFile( "C:/MyProject/src/test", "com/app/MyClassTest.java");<a name="line.107"></a>
<span class="sourceLineNo">108</span>         * &lt;/pre&gt;<a name="line.108"></a>
<span class="sourceLineNo">109</span>         * In paths both / and \ can be used.<a name="line.109"></a>
<span class="sourceLineNo">110</span>         * &lt;/p&gt;<a name="line.110"></a>
<span class="sourceLineNo">111</span>         * <a name="line.111"></a>
<span class="sourceLineNo">112</span>         * @param baseDir sources root directory<a name="line.112"></a>
<span class="sourceLineNo">113</span>         * @param file path to source file relative to &lt;code&gt;baseDir&lt;/code&gt;<a name="line.113"></a>
<span class="sourceLineNo">114</span>         * @throws NullPointerException if either &lt;code&gt;baseDir&lt;/code&gt; or &lt;code&gt;file&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt;<a name="line.114"></a>
<span class="sourceLineNo">115</span>         */<a name="line.115"></a>
<span class="sourceLineNo">116</span>        public void addSourceFile( String baseDir, String file) {<a name="line.116"></a>
<span class="sourceLineNo">117</span>                if( LOGGER.isDebugEnabled())<a name="line.117"></a>
<span class="sourceLineNo">118</span>                        LOGGER.debug( "Adding sourceFile baseDir=[" + baseDir + "] file=[" + file + "]");<a name="line.118"></a>
<span class="sourceLineNo">119</span><a name="line.119"></a>
<span class="sourceLineNo">120</span>                if( baseDir==null || file==null)<a name="line.120"></a>
<span class="sourceLineNo">121</span>                        throw new NullPointerException();<a name="line.121"></a>
<span class="sourceLineNo">122</span>        <a name="line.122"></a>
<span class="sourceLineNo">123</span>                // Change \ to / in case of Windows users<a name="line.123"></a>
<span class="sourceLineNo">124</span>                file = getCorrectedPath( file);<a name="line.124"></a>
<span class="sourceLineNo">125</span>                baseDir = getCorrectedPath( baseDir);<a name="line.125"></a>
<span class="sourceLineNo">126</span>                <a name="line.126"></a>
<span class="sourceLineNo">127</span>                // Add file to sourceFilesMap<a name="line.127"></a>
<span class="sourceLineNo">128</span>                Set container = (Set) sourceFilesMap.get(baseDir);<a name="line.128"></a>
<span class="sourceLineNo">129</span>                if( container==null) {<a name="line.129"></a>
<span class="sourceLineNo">130</span>                        container = new HashSet();<a name="line.130"></a>
<span class="sourceLineNo">131</span>                        sourceFilesMap.put( baseDir, container);<a name="line.131"></a>
<span class="sourceLineNo">132</span>                }<a name="line.132"></a>
<span class="sourceLineNo">133</span>                container.add( file);<a name="line.133"></a>
<span class="sourceLineNo">134</span>        }<a name="line.134"></a>
<span class="sourceLineNo">135</span><a name="line.135"></a>
<span class="sourceLineNo">136</span>        /**<a name="line.136"></a>
<span class="sourceLineNo">137</span>         * Maps source file name to existing file.<a name="line.137"></a>
<span class="sourceLineNo">138</span>         * When mapping file name first values that were added with<a name="line.138"></a>
<span class="sourceLineNo">139</span>         * {@link #addSourceDirectory} and later added with {@link #addSourceFile} are checked.<a name="line.139"></a>
<span class="sourceLineNo">140</span>         * <a name="line.140"></a>
<span class="sourceLineNo">141</span>         * @param fileName source file to be mapped<a name="line.141"></a>
<span class="sourceLineNo">142</span>         * @return existing file that maps to passed sourceFile <a name="line.142"></a>
<span class="sourceLineNo">143</span>         * @throws IOException if cannot map source file to existing file<a name="line.143"></a>
<span class="sourceLineNo">144</span>         * @throws NullPointerException if fileName is null<a name="line.144"></a>
<span class="sourceLineNo">145</span>         */<a name="line.145"></a>
<span class="sourceLineNo">146</span>        public File getFileForSource(String fileName) throws IOException {<a name="line.146"></a>
<span class="sourceLineNo">147</span>                // Correct file name<a name="line.147"></a>
<span class="sourceLineNo">148</span>                if( LOGGER.isDebugEnabled())<a name="line.148"></a>
<span class="sourceLineNo">149</span>                        LOGGER.debug( "Searching for file, name=[" + fileName + "]");<a name="line.149"></a>
<span class="sourceLineNo">150</span>                fileName = getCorrectedPath( fileName);<a name="line.150"></a>
<span class="sourceLineNo">151</span><a name="line.151"></a>
<span class="sourceLineNo">152</span>                // Check inside sourceDirectories<a name="line.152"></a>
<span class="sourceLineNo">153</span>                for( Iterator it=sourceDirectories.iterator(); it.hasNext();) {<a name="line.153"></a>
<span class="sourceLineNo">154</span>                        String directory = (String)it.next();<a name="line.154"></a>
<span class="sourceLineNo">155</span>                        File file = new File( directory, fileName);<a name="line.155"></a>
<span class="sourceLineNo">156</span>                        if( file.isFile()) {<a name="line.156"></a>
<span class="sourceLineNo">157</span>                                LOGGER.debug( "Found inside sourceDirectories");<a name="line.157"></a>
<span class="sourceLineNo">158</span>                                return file;<a name="line.158"></a>
<span class="sourceLineNo">159</span>                        }<a name="line.159"></a>
<span class="sourceLineNo">160</span>                }<a name="line.160"></a>
<span class="sourceLineNo">161</span>                <a name="line.161"></a>
<span class="sourceLineNo">162</span>                // Check inside sourceFilesMap<a name="line.162"></a>
<span class="sourceLineNo">163</span>                for( Iterator it=sourceFilesMap.keySet().iterator(); it.hasNext();) {<a name="line.163"></a>
<span class="sourceLineNo">164</span>                        String directory = (String)it.next();<a name="line.164"></a>
<span class="sourceLineNo">165</span>                        Set container = (Set) sourceFilesMap.get(directory);<a name="line.165"></a>
<span class="sourceLineNo">166</span>                        if( !container.contains( fileName))<a name="line.166"></a>
<span class="sourceLineNo">167</span>                                continue;<a name="line.167"></a>
<span class="sourceLineNo">168</span>                        File file = new File( directory, fileName);<a name="line.168"></a>
<span class="sourceLineNo">169</span>                        if( file.isFile()) {<a name="line.169"></a>
<span class="sourceLineNo">170</span>                                LOGGER.debug( "Found inside sourceFilesMap");<a name="line.170"></a>
<span class="sourceLineNo">171</span>                                return file;<a name="line.171"></a>
<span class="sourceLineNo">172</span>                        }<a name="line.172"></a>
<span class="sourceLineNo">173</span>                }<a name="line.173"></a>
<span class="sourceLineNo">174</span><a name="line.174"></a>
<span class="sourceLineNo">175</span>                // Have not found? Throw an error.<a name="line.175"></a>
<span class="sourceLineNo">176</span>                LOGGER.debug( "File not found");<a name="line.176"></a>
<span class="sourceLineNo">177</span>                throw new IOException( "Cannot find source file, name=["+fileName+"]");<a name="line.177"></a>
<span class="sourceLineNo">178</span>        }<a name="line.178"></a>
<span class="sourceLineNo">179</span>        <a name="line.179"></a>
<span class="sourceLineNo">180</span>        /**<a name="line.180"></a>
<span class="sourceLineNo">181</span>         * Maps source file name to existing file or source archive.<a name="line.181"></a>
<span class="sourceLineNo">182</span>         * When mapping file name first values that were added with<a name="line.182"></a>
<span class="sourceLineNo">183</span>         * {@link #addSourceDirectory} and later added with {@link #addSourceFile} are checked.<a name="line.183"></a>
<span class="sourceLineNo">184</span>         * <a name="line.184"></a>
<span class="sourceLineNo">185</span>         * @param fileName source file to be mapped<a name="line.185"></a>
<span class="sourceLineNo">186</span>         * @return Source that maps to passed sourceFile or null if it can't be found<a name="line.186"></a>
<span class="sourceLineNo">187</span>         * @throws NullPointerException if fileName is null<a name="line.187"></a>
<span class="sourceLineNo">188</span>         */<a name="line.188"></a>
<span class="sourceLineNo">189</span>        public Source getSource(String fileName) {<a name="line.189"></a>
<span class="sourceLineNo">190</span>                File file = null;<a name="line.190"></a>
<span class="sourceLineNo">191</span>                try<a name="line.191"></a>
<span class="sourceLineNo">192</span>                {<a name="line.192"></a>
<span class="sourceLineNo">193</span>                        file = getFileForSource(fileName);<a name="line.193"></a>
<span class="sourceLineNo">194</span>                        return new Source(new FileInputStream(file), file);<a name="line.194"></a>
<span class="sourceLineNo">195</span>                }<a name="line.195"></a>
<span class="sourceLineNo">196</span>                catch (IOException e)<a name="line.196"></a>
<span class="sourceLineNo">197</span>                {<a name="line.197"></a>
<span class="sourceLineNo">198</span>                        //Source file wasn't found. Try searching archives.<a name="line.198"></a>
<span class="sourceLineNo">199</span>                        return searchJarsForSource(fileName);<a name="line.199"></a>
<span class="sourceLineNo">200</span>                }<a name="line.200"></a>
<span class="sourceLineNo">201</span>                <a name="line.201"></a>
<span class="sourceLineNo">202</span>        }<a name="line.202"></a>
<span class="sourceLineNo">203</span><a name="line.203"></a>
<span class="sourceLineNo">204</span>        /**<a name="line.204"></a>
<span class="sourceLineNo">205</span>         * Gets a BufferedReader for a file within a jar.<a name="line.205"></a>
<span class="sourceLineNo">206</span>         * <a name="line.206"></a>
<span class="sourceLineNo">207</span>         * @param fileName source file to get an input stream for<a name="line.207"></a>
<span class="sourceLineNo">208</span>         * @return Source for existing file inside a jar that maps to passed sourceFile <a name="line.208"></a>
<span class="sourceLineNo">209</span>         * or null if cannot map source file to existing file<a name="line.209"></a>
<span class="sourceLineNo">210</span>         */<a name="line.210"></a>
<span class="sourceLineNo">211</span>        private Source searchJarsForSource(String fileName) {<a name="line.211"></a>
<span class="sourceLineNo">212</span>                //Check inside jars in sourceDirectories<a name="line.212"></a>
<span class="sourceLineNo">213</span>                for( Iterator it=sourceDirectories.iterator(); it.hasNext();) {<a name="line.213"></a>
<span class="sourceLineNo">214</span>                        String directory = (String)it.next();<a name="line.214"></a>
<span class="sourceLineNo">215</span>                        File file = new File(directory);<a name="line.215"></a>
<span class="sourceLineNo">216</span>                        //Get a list of jars and zips in the directory<a name="line.216"></a>
<span class="sourceLineNo">217</span>                        String[] jars = file.list(new JarZipFilter());<a name="line.217"></a>
<span class="sourceLineNo">218</span>                        if(jars != null) {<a name="line.218"></a>
<span class="sourceLineNo">219</span>                                for(String jar : jars) {<a name="line.219"></a>
<span class="sourceLineNo">220</span>                                        try<a name="line.220"></a>
<span class="sourceLineNo">221</span>                                        {<a name="line.221"></a>
<span class="sourceLineNo">222</span>                                                LOGGER.debug("Looking for: " + fileName + " in "+ jar);<a name="line.222"></a>
<span class="sourceLineNo">223</span>                                                JarFile jf = new JarFile(directory + "/" + jar);<a name="line.223"></a>
<span class="sourceLineNo">224</span>        <a name="line.224"></a>
<span class="sourceLineNo">225</span>                                                //Get a list of files in the jar<a name="line.225"></a>
<span class="sourceLineNo">226</span>                                                Enumeration&lt;JarEntry&gt; files = jf.entries();<a name="line.226"></a>
<span class="sourceLineNo">227</span>                                                //See if the jar has the class we need<a name="line.227"></a>
<span class="sourceLineNo">228</span>                                                while(files.hasMoreElements()) {<a name="line.228"></a>
<span class="sourceLineNo">229</span>                                                        JarEntry entry = files.nextElement();<a name="line.229"></a>
<span class="sourceLineNo">230</span>                                                        if(entry.getName().equals(fileName)) {<a name="line.230"></a>
<span class="sourceLineNo">231</span>                                                                return new Source(jf.getInputStream(entry), jf);<a name="line.231"></a>
<span class="sourceLineNo">232</span>                                                        }<a name="line.232"></a>
<span class="sourceLineNo">233</span>                                                }<a name="line.233"></a>
<span class="sourceLineNo">234</span>                                        }<a name="line.234"></a>
<span class="sourceLineNo">235</span>                                        catch (Throwable t)<a name="line.235"></a>
<span class="sourceLineNo">236</span>                                        {<a name="line.236"></a>
<span class="sourceLineNo">237</span>                                                LOGGER.warn("Error while reading " + jar, t);<a name="line.237"></a>
<span class="sourceLineNo">238</span>                                        }<a name="line.238"></a>
<span class="sourceLineNo">239</span>                                }<a name="line.239"></a>
<span class="sourceLineNo">240</span>                        }<a name="line.240"></a>
<span class="sourceLineNo">241</span>                }<a name="line.241"></a>
<span class="sourceLineNo">242</span>                return null;<a name="line.242"></a>
<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
<span class="sourceLineNo">244</span><a name="line.244"></a>
<span class="sourceLineNo">245</span>        /**<a name="line.245"></a>
<span class="sourceLineNo">246</span>         * Returns a list with string for all source directories.<a name="line.246"></a>
<span class="sourceLineNo">247</span>         * Example: &lt;code&gt;[C:/MyProject/src/main,C:/MyProject/src/test]&lt;/code&gt;<a name="line.247"></a>
<span class="sourceLineNo">248</span>         * <a name="line.248"></a>
<span class="sourceLineNo">249</span>         * @return list with Strings for all source roots, or empty list if no source roots were specified <a name="line.249"></a>
<span class="sourceLineNo">250</span>         */<a name="line.250"></a>
<span class="sourceLineNo">251</span>        public List getSourceDirectoryList() {<a name="line.251"></a>
<span class="sourceLineNo">252</span>                // Get names from sourceDirectories<a name="line.252"></a>
<span class="sourceLineNo">253</span>                List result = new ArrayList();<a name="line.253"></a>
<span class="sourceLineNo">254</span>                for( Iterator it=sourceDirectories.iterator(); it.hasNext();) {<a name="line.254"></a>
<span class="sourceLineNo">255</span>                        result.add( it.next());<a name="line.255"></a>
<span class="sourceLineNo">256</span>                }<a name="line.256"></a>
<span class="sourceLineNo">257</span>                <a name="line.257"></a>
<span class="sourceLineNo">258</span>                // Get names from sourceFilesMap<a name="line.258"></a>
<span class="sourceLineNo">259</span>                for( Iterator it=sourceFilesMap.keySet().iterator(); it.hasNext();) {<a name="line.259"></a>
<span class="sourceLineNo">260</span>                        result.add(it.next());<a name="line.260"></a>
<span class="sourceLineNo">261</span>                }<a name="line.261"></a>
<span class="sourceLineNo">262</span>                <a name="line.262"></a>
<span class="sourceLineNo">263</span>                // Return combined names<a name="line.263"></a>
<span class="sourceLineNo">264</span>                return result;<a name="line.264"></a>
<span class="sourceLineNo">265</span>        }<a name="line.265"></a>
<span class="sourceLineNo">266</span><a name="line.266"></a>
<span class="sourceLineNo">267</span>    private String getCorrectedPath(String path) {<a name="line.267"></a>
<span class="sourceLineNo">268</span>        return path.replace('\\', '/');<a name="line.268"></a>
<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
<span class="sourceLineNo">270</span><a name="line.270"></a>
<span class="sourceLineNo">271</span>    /**<a name="line.271"></a>
<span class="sourceLineNo">272</span>     * Returns string representation of FileFinder.<a name="line.272"></a>
<span class="sourceLineNo">273</span>     */<a name="line.273"></a>
<span class="sourceLineNo">274</span>    public String toString() {<a name="line.274"></a>
<span class="sourceLineNo">275</span>        return "FileFinder, source directories: " + getSourceDirectoryList().toString();<a name="line.275"></a>
<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
<span class="sourceLineNo">277</span>    <a name="line.277"></a>
<span class="sourceLineNo">278</span>    /**<a name="line.278"></a>
<span class="sourceLineNo">279</span>     * A filter that accepts files that end in .jar or .zip<a name="line.279"></a>
<span class="sourceLineNo">280</span>     */<a name="line.280"></a>
<span class="sourceLineNo">281</span>    private class JarZipFilter implements FilenameFilter {<a name="line.281"></a>
<span class="sourceLineNo">282</span>                public boolean accept(File dir, String name) {<a name="line.282"></a>
<span class="sourceLineNo">283</span>                        return(name.endsWith(".jar") || name.endsWith(".zip"));<a name="line.283"></a>
<span class="sourceLineNo">284</span>                }<a name="line.284"></a>
<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
<span class="sourceLineNo">286</span>}<a name="line.286"></a>




























































</pre>
</div>
</body>
</html>