This file is indexed.

/usr/share/doc/libcobertura-java/api/src-html/net/sourceforge/cobertura/instrument/Main.html is in libcobertura-java-doc 1.9.4.1+dfsg-3.

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
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Cobertura - http://cobertura.sourceforge.net/<a name="line.2"></a>
<FONT color="green">003</FONT>     *<a name="line.3"></a>
<FONT color="green">004</FONT>     * Copyright (C) 2003 jcoverage ltd.<a name="line.4"></a>
<FONT color="green">005</FONT>     * Copyright (C) 2005 Mark Doliner<a name="line.5"></a>
<FONT color="green">006</FONT>     * Copyright (C) 2005 Joakim Erdfelt<a name="line.6"></a>
<FONT color="green">007</FONT>     * Copyright (C) 2005 Grzegorz Lukasik<a name="line.7"></a>
<FONT color="green">008</FONT>     * Copyright (C) 2006 John Lewis<a name="line.8"></a>
<FONT color="green">009</FONT>     * Copyright (C) 2006 Jiri Mares <a name="line.9"></a>
<FONT color="green">010</FONT>     * Contact information for the above is given in the COPYRIGHT file.<a name="line.10"></a>
<FONT color="green">011</FONT>     *<a name="line.11"></a>
<FONT color="green">012</FONT>     * Cobertura is free software; you can redistribute it and/or modify<a name="line.12"></a>
<FONT color="green">013</FONT>     * it under the terms of the GNU General Public License as published<a name="line.13"></a>
<FONT color="green">014</FONT>     * by the Free Software Foundation; either version 2 of the License,<a name="line.14"></a>
<FONT color="green">015</FONT>     * or (at your option) any later version.<a name="line.15"></a>
<FONT color="green">016</FONT>     *<a name="line.16"></a>
<FONT color="green">017</FONT>     * Cobertura is distributed in the hope that it will be useful, but<a name="line.17"></a>
<FONT color="green">018</FONT>     * WITHOUT ANY WARRANTY; without even the implied warranty of<a name="line.18"></a>
<FONT color="green">019</FONT>     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<a name="line.19"></a>
<FONT color="green">020</FONT>     * General Public License for more details.<a name="line.20"></a>
<FONT color="green">021</FONT>     *<a name="line.21"></a>
<FONT color="green">022</FONT>     * You should have received a copy of the GNU General Public License<a name="line.22"></a>
<FONT color="green">023</FONT>     * along with Cobertura; if not, write to the Free Software<a name="line.23"></a>
<FONT color="green">024</FONT>     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307<a name="line.24"></a>
<FONT color="green">025</FONT>     * USA<a name="line.25"></a>
<FONT color="green">026</FONT>     */<a name="line.26"></a>
<FONT color="green">027</FONT>    <a name="line.27"></a>
<FONT color="green">028</FONT>    package net.sourceforge.cobertura.instrument;<a name="line.28"></a>
<FONT color="green">029</FONT>    <a name="line.29"></a>
<FONT color="green">030</FONT>    import java.io.ByteArrayOutputStream;<a name="line.30"></a>
<FONT color="green">031</FONT>    import java.io.File;<a name="line.31"></a>
<FONT color="green">032</FONT>    import java.io.FileInputStream;<a name="line.32"></a>
<FONT color="green">033</FONT>    import java.io.FileNotFoundException;<a name="line.33"></a>
<FONT color="green">034</FONT>    import java.io.FileOutputStream;<a name="line.34"></a>
<FONT color="green">035</FONT>    import java.io.IOException;<a name="line.35"></a>
<FONT color="green">036</FONT>    import java.io.InputStream;<a name="line.36"></a>
<FONT color="green">037</FONT>    import java.io.OutputStream;<a name="line.37"></a>
<FONT color="green">038</FONT>    import java.util.ArrayList;<a name="line.38"></a>
<FONT color="green">039</FONT>    import java.util.Collection;<a name="line.39"></a>
<FONT color="green">040</FONT>    import java.util.Iterator;<a name="line.40"></a>
<FONT color="green">041</FONT>    import java.util.List;<a name="line.41"></a>
<FONT color="green">042</FONT>    import java.util.Vector;<a name="line.42"></a>
<FONT color="green">043</FONT>    import java.util.zip.ZipEntry;<a name="line.43"></a>
<FONT color="green">044</FONT>    import java.util.zip.ZipInputStream;<a name="line.44"></a>
<FONT color="green">045</FONT>    import java.util.zip.ZipOutputStream;<a name="line.45"></a>
<FONT color="green">046</FONT>    <a name="line.46"></a>
<FONT color="green">047</FONT>    import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;<a name="line.47"></a>
<FONT color="green">048</FONT>    import net.sourceforge.cobertura.coveragedata.ProjectData;<a name="line.48"></a>
<FONT color="green">049</FONT>    import net.sourceforge.cobertura.util.ArchiveUtil;<a name="line.49"></a>
<FONT color="green">050</FONT>    import net.sourceforge.cobertura.util.CommandLineBuilder;<a name="line.50"></a>
<FONT color="green">051</FONT>    import net.sourceforge.cobertura.util.Header;<a name="line.51"></a>
<FONT color="green">052</FONT>    import net.sourceforge.cobertura.util.IOUtil;<a name="line.52"></a>
<FONT color="green">053</FONT>    import net.sourceforge.cobertura.util.RegexUtil;<a name="line.53"></a>
<FONT color="green">054</FONT>    <a name="line.54"></a>
<FONT color="green">055</FONT>    import org.apache.log4j.Logger;<a name="line.55"></a>
<FONT color="green">056</FONT>    import org.objectweb.asm.ClassReader;<a name="line.56"></a>
<FONT color="green">057</FONT>    import org.objectweb.asm.ClassWriter;<a name="line.57"></a>
<FONT color="green">058</FONT>    <a name="line.58"></a>
<FONT color="green">059</FONT>    /**<a name="line.59"></a>
<FONT color="green">060</FONT>     * &lt;p&gt;<a name="line.60"></a>
<FONT color="green">061</FONT>     * Add coverage instrumentation to existing classes.<a name="line.61"></a>
<FONT color="green">062</FONT>     * &lt;/p&gt;<a name="line.62"></a>
<FONT color="green">063</FONT>     *<a name="line.63"></a>
<FONT color="green">064</FONT>     * &lt;h3&gt;What does that mean, exactly?&lt;/h3&gt;<a name="line.64"></a>
<FONT color="green">065</FONT>     * &lt;p&gt;<a name="line.65"></a>
<FONT color="green">066</FONT>     * It means Cobertura will look at each class you give it.  It<a name="line.66"></a>
<FONT color="green">067</FONT>     * loads the bytecode into memory.  For each line of source,<a name="line.67"></a>
<FONT color="green">068</FONT>     * Cobertura adds a few extra instructions.  These instructions <a name="line.68"></a>
<FONT color="green">069</FONT>     * do the following:<a name="line.69"></a>
<FONT color="green">070</FONT>     * &lt;/p&gt;<a name="line.70"></a>
<FONT color="green">071</FONT>     * <a name="line.71"></a>
<FONT color="green">072</FONT>     * &lt;ol&gt;<a name="line.72"></a>
<FONT color="green">073</FONT>     * &lt;li&gt;Get an instance of the ProjectData class.&lt;/li&gt;<a name="line.73"></a>
<FONT color="green">074</FONT>     * &lt;li&gt;Call a method in this ProjectData class that increments<a name="line.74"></a>
<FONT color="green">075</FONT>     * a counter for this line of code.<a name="line.75"></a>
<FONT color="green">076</FONT>     * &lt;/ol&gt;<a name="line.76"></a>
<FONT color="green">077</FONT>     *<a name="line.77"></a>
<FONT color="green">078</FONT>     * &lt;p&gt;<a name="line.78"></a>
<FONT color="green">079</FONT>     * After every line in a class has been "instrumented," Cobertura<a name="line.79"></a>
<FONT color="green">080</FONT>     * edits the bytecode for the class one more time and adds<a name="line.80"></a>
<FONT color="green">081</FONT>     * "implements net.sourceforge.cobertura.coveragedata.HasBeenInstrumented" <a name="line.81"></a>
<FONT color="green">082</FONT>     * This is basically just a flag used internally by Cobertura to<a name="line.82"></a>
<FONT color="green">083</FONT>     * determine whether a class has been instrumented or not, so<a name="line.83"></a>
<FONT color="green">084</FONT>     * as not to instrument the same class twice.<a name="line.84"></a>
<FONT color="green">085</FONT>     * &lt;/p&gt;<a name="line.85"></a>
<FONT color="green">086</FONT>     */<a name="line.86"></a>
<FONT color="green">087</FONT>    public class Main<a name="line.87"></a>
<FONT color="green">088</FONT>    {<a name="line.88"></a>
<FONT color="green">089</FONT>    <a name="line.89"></a>
<FONT color="green">090</FONT>            private static final Logger logger = Logger.getLogger(Main.class);<a name="line.90"></a>
<FONT color="green">091</FONT>    <a name="line.91"></a>
<FONT color="green">092</FONT>            private File destinationDirectory = null;<a name="line.92"></a>
<FONT color="green">093</FONT>    <a name="line.93"></a>
<FONT color="green">094</FONT>            private Collection ignoreRegexes = new Vector();<a name="line.94"></a>
<FONT color="green">095</FONT>    <a name="line.95"></a>
<FONT color="green">096</FONT>            private Collection ignoreBranchesRegexes = new Vector();<a name="line.96"></a>
<FONT color="green">097</FONT>    <a name="line.97"></a>
<FONT color="green">098</FONT>            private ClassPattern classPattern = new ClassPattern();<a name="line.98"></a>
<FONT color="green">099</FONT>    <a name="line.99"></a>
<FONT color="green">100</FONT>            private ProjectData projectData = null;<a name="line.100"></a>
<FONT color="green">101</FONT>    <a name="line.101"></a>
<FONT color="green">102</FONT>            /**<a name="line.102"></a>
<FONT color="green">103</FONT>             * @param entry A zip entry.<a name="line.103"></a>
<FONT color="green">104</FONT>             * @return True if the specified entry has "class" as its extension,<a name="line.104"></a>
<FONT color="green">105</FONT>             * false otherwise.<a name="line.105"></a>
<FONT color="green">106</FONT>             */<a name="line.106"></a>
<FONT color="green">107</FONT>            private static boolean isClass(ZipEntry entry)<a name="line.107"></a>
<FONT color="green">108</FONT>            {<a name="line.108"></a>
<FONT color="green">109</FONT>                    return entry.getName().endsWith(".class");<a name="line.109"></a>
<FONT color="green">110</FONT>            }<a name="line.110"></a>
<FONT color="green">111</FONT>    <a name="line.111"></a>
<FONT color="green">112</FONT>            private boolean addInstrumentationToArchive(CoberturaFile file, InputStream archive,<a name="line.112"></a>
<FONT color="green">113</FONT>                            OutputStream output) throws Exception<a name="line.113"></a>
<FONT color="green">114</FONT>            {<a name="line.114"></a>
<FONT color="green">115</FONT>                    ZipInputStream zis = null;<a name="line.115"></a>
<FONT color="green">116</FONT>                    ZipOutputStream zos = null;<a name="line.116"></a>
<FONT color="green">117</FONT>    <a name="line.117"></a>
<FONT color="green">118</FONT>                    try<a name="line.118"></a>
<FONT color="green">119</FONT>                    {<a name="line.119"></a>
<FONT color="green">120</FONT>                            zis = new ZipInputStream(archive);<a name="line.120"></a>
<FONT color="green">121</FONT>                            zos = new ZipOutputStream(output);<a name="line.121"></a>
<FONT color="green">122</FONT>                            return addInstrumentationToArchive(file, zis, zos);<a name="line.122"></a>
<FONT color="green">123</FONT>                    }<a name="line.123"></a>
<FONT color="green">124</FONT>                    finally<a name="line.124"></a>
<FONT color="green">125</FONT>                    {<a name="line.125"></a>
<FONT color="green">126</FONT>                            zis = (ZipInputStream)IOUtil.closeInputStream(zis);<a name="line.126"></a>
<FONT color="green">127</FONT>                            zos = (ZipOutputStream)IOUtil.closeOutputStream(zos);<a name="line.127"></a>
<FONT color="green">128</FONT>                    }<a name="line.128"></a>
<FONT color="green">129</FONT>            }<a name="line.129"></a>
<FONT color="green">130</FONT>    <a name="line.130"></a>
<FONT color="green">131</FONT>            private boolean addInstrumentationToArchive(CoberturaFile file, ZipInputStream archive,<a name="line.131"></a>
<FONT color="green">132</FONT>                            ZipOutputStream output) throws Exception<a name="line.132"></a>
<FONT color="green">133</FONT>            {<a name="line.133"></a>
<FONT color="green">134</FONT>                    /*<a name="line.134"></a>
<FONT color="green">135</FONT>                     * "modified" is returned and indicates that something was instrumented.<a name="line.135"></a>
<FONT color="green">136</FONT>                     * If nothing is instrumented, the original entry will be used by the<a name="line.136"></a>
<FONT color="green">137</FONT>                     * caller of this method.<a name="line.137"></a>
<FONT color="green">138</FONT>                     */<a name="line.138"></a>
<FONT color="green">139</FONT>                    boolean modified = false;<a name="line.139"></a>
<FONT color="green">140</FONT>                    ZipEntry entry;<a name="line.140"></a>
<FONT color="green">141</FONT>                    while ((entry = archive.getNextEntry()) != null)<a name="line.141"></a>
<FONT color="green">142</FONT>                    {<a name="line.142"></a>
<FONT color="green">143</FONT>                            try<a name="line.143"></a>
<FONT color="green">144</FONT>                            {<a name="line.144"></a>
<FONT color="green">145</FONT>                                    String entryName = entry.getName();<a name="line.145"></a>
<FONT color="green">146</FONT>    <a name="line.146"></a>
<FONT color="green">147</FONT>                                    /*<a name="line.147"></a>
<FONT color="green">148</FONT>                                     * If this is a signature file then don't copy it,<a name="line.148"></a>
<FONT color="green">149</FONT>                                     * but don't set modified to true.  If the only<a name="line.149"></a>
<FONT color="green">150</FONT>                                     * thing we do is strip the signature, just use<a name="line.150"></a>
<FONT color="green">151</FONT>                                     * the original entry.<a name="line.151"></a>
<FONT color="green">152</FONT>                                     */<a name="line.152"></a>
<FONT color="green">153</FONT>                                    if (ArchiveUtil.isSignatureFile(entry.getName()))<a name="line.153"></a>
<FONT color="green">154</FONT>                                    {<a name="line.154"></a>
<FONT color="green">155</FONT>                                            continue;<a name="line.155"></a>
<FONT color="green">156</FONT>                                    }<a name="line.156"></a>
<FONT color="green">157</FONT>                                    ZipEntry outputEntry = new ZipEntry(entry.getName());<a name="line.157"></a>
<FONT color="green">158</FONT>                                    outputEntry.setComment(entry.getComment());<a name="line.158"></a>
<FONT color="green">159</FONT>                                    outputEntry.setExtra(entry.getExtra());<a name="line.159"></a>
<FONT color="green">160</FONT>                                    outputEntry.setTime(entry.getTime());<a name="line.160"></a>
<FONT color="green">161</FONT>                                    output.putNextEntry(outputEntry);<a name="line.161"></a>
<FONT color="green">162</FONT>    <a name="line.162"></a>
<FONT color="green">163</FONT>                                    // Read current entry<a name="line.163"></a>
<FONT color="green">164</FONT>                                    byte[] entryBytes = IOUtil<a name="line.164"></a>
<FONT color="green">165</FONT>                                                    .createByteArrayFromInputStream(archive);<a name="line.165"></a>
<FONT color="green">166</FONT>    <a name="line.166"></a>
<FONT color="green">167</FONT>                                    // Instrument embedded archives if a classPattern has been specified<a name="line.167"></a>
<FONT color="green">168</FONT>                                    if ((classPattern.isSpecified()) &amp;&amp; ArchiveUtil.isArchive(entryName))<a name="line.168"></a>
<FONT color="green">169</FONT>                                    {<a name="line.169"></a>
<FONT color="green">170</FONT>                                            Archive archiveObj = new Archive(file, entryBytes);<a name="line.170"></a>
<FONT color="green">171</FONT>                                            addInstrumentationToArchive(archiveObj);<a name="line.171"></a>
<FONT color="green">172</FONT>                                            if (archiveObj.isModified())<a name="line.172"></a>
<FONT color="green">173</FONT>                                            {<a name="line.173"></a>
<FONT color="green">174</FONT>                                                    modified = true;<a name="line.174"></a>
<FONT color="green">175</FONT>                                                    entryBytes = archiveObj.getBytes();<a name="line.175"></a>
<FONT color="green">176</FONT>                                                    outputEntry.setTime(System.currentTimeMillis());<a name="line.176"></a>
<FONT color="green">177</FONT>                                            }<a name="line.177"></a>
<FONT color="green">178</FONT>                                    }<a name="line.178"></a>
<FONT color="green">179</FONT>                                    else if (isClass(entry) &amp;&amp; classPattern.matches(entryName))<a name="line.179"></a>
<FONT color="green">180</FONT>                                    {<a name="line.180"></a>
<FONT color="green">181</FONT>                                            try<a name="line.181"></a>
<FONT color="green">182</FONT>                                            {<a name="line.182"></a>
<FONT color="green">183</FONT>                                                    // Instrument class<a name="line.183"></a>
<FONT color="green">184</FONT>                                                    ClassReader cr = new ClassReader(entryBytes);<a name="line.184"></a>
<FONT color="green">185</FONT>                                                    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);<a name="line.185"></a>
<FONT color="green">186</FONT>                                                    ClassInstrumenter cv = new ClassInstrumenter(projectData,<a name="line.186"></a>
<FONT color="green">187</FONT>                                                                    cw, ignoreRegexes, ignoreBranchesRegexes);<a name="line.187"></a>
<FONT color="green">188</FONT>                                                    cr.accept(cv, 0);<a name="line.188"></a>
<FONT color="green">189</FONT>            <a name="line.189"></a>
<FONT color="green">190</FONT>                                                    // If class was instrumented, get bytes that define the<a name="line.190"></a>
<FONT color="green">191</FONT>                                                    // class<a name="line.191"></a>
<FONT color="green">192</FONT>                                                    if (cv.isInstrumented())<a name="line.192"></a>
<FONT color="green">193</FONT>                                                    {<a name="line.193"></a>
<FONT color="green">194</FONT>                                                            logger.debug("Putting instrumented entry: "<a name="line.194"></a>
<FONT color="green">195</FONT>                                                                            + entry.getName());<a name="line.195"></a>
<FONT color="green">196</FONT>                                                            entryBytes = cw.toByteArray();<a name="line.196"></a>
<FONT color="green">197</FONT>                                                            modified = true;<a name="line.197"></a>
<FONT color="green">198</FONT>                                                            outputEntry.setTime(System.currentTimeMillis());<a name="line.198"></a>
<FONT color="green">199</FONT>                                                    }<a name="line.199"></a>
<FONT color="green">200</FONT>                                            }<a name="line.200"></a>
<FONT color="green">201</FONT>                                            catch (Throwable t)<a name="line.201"></a>
<FONT color="green">202</FONT>                                            {<a name="line.202"></a>
<FONT color="green">203</FONT>                                                    if (entry.getName().endsWith("_Stub.class"))<a name="line.203"></a>
<FONT color="green">204</FONT>                                                    {<a name="line.204"></a>
<FONT color="green">205</FONT>                                                            //no big deal - it is probably an RMI stub, and they don't need to be instrumented<a name="line.205"></a>
<FONT color="green">206</FONT>                                                            logger.debug("Problems instrumenting archive entry: " + entry.getName(), t);<a name="line.206"></a>
<FONT color="green">207</FONT>                                                    }<a name="line.207"></a>
<FONT color="green">208</FONT>                                                    else<a name="line.208"></a>
<FONT color="green">209</FONT>                                                    {<a name="line.209"></a>
<FONT color="green">210</FONT>                                                            logger.warn("Problems instrumenting archive entry: " + entry.getName(), t);<a name="line.210"></a>
<FONT color="green">211</FONT>                                                    }<a name="line.211"></a>
<FONT color="green">212</FONT>                                            }<a name="line.212"></a>
<FONT color="green">213</FONT>                                    }<a name="line.213"></a>
<FONT color="green">214</FONT>    <a name="line.214"></a>
<FONT color="green">215</FONT>                                    // Add entry to the output<a name="line.215"></a>
<FONT color="green">216</FONT>                                    output.write(entryBytes);<a name="line.216"></a>
<FONT color="green">217</FONT>                                    output.closeEntry();<a name="line.217"></a>
<FONT color="green">218</FONT>                                    archive.closeEntry();<a name="line.218"></a>
<FONT color="green">219</FONT>                            }<a name="line.219"></a>
<FONT color="green">220</FONT>                            catch (Exception e)<a name="line.220"></a>
<FONT color="green">221</FONT>                            {<a name="line.221"></a>
<FONT color="green">222</FONT>                                    logger.warn("Problems with archive entry: " + entry.getName(), e);<a name="line.222"></a>
<FONT color="green">223</FONT>                            }<a name="line.223"></a>
<FONT color="green">224</FONT>                            catch (Throwable t)<a name="line.224"></a>
<FONT color="green">225</FONT>                            {<a name="line.225"></a>
<FONT color="green">226</FONT>                                    logger.warn("Problems with archive entry: " + entry.getName(), t);<a name="line.226"></a>
<FONT color="green">227</FONT>                            }<a name="line.227"></a>
<FONT color="green">228</FONT>                            output.flush();<a name="line.228"></a>
<FONT color="green">229</FONT>                    }<a name="line.229"></a>
<FONT color="green">230</FONT>                    return modified;<a name="line.230"></a>
<FONT color="green">231</FONT>            }<a name="line.231"></a>
<FONT color="green">232</FONT>    <a name="line.232"></a>
<FONT color="green">233</FONT>            private void addInstrumentationToArchive(Archive archive) throws Exception<a name="line.233"></a>
<FONT color="green">234</FONT>            {<a name="line.234"></a>
<FONT color="green">235</FONT>                    InputStream in = null;<a name="line.235"></a>
<FONT color="green">236</FONT>                    ByteArrayOutputStream out = null;<a name="line.236"></a>
<FONT color="green">237</FONT>                    try<a name="line.237"></a>
<FONT color="green">238</FONT>                    {<a name="line.238"></a>
<FONT color="green">239</FONT>                            in = archive.getInputStream();<a name="line.239"></a>
<FONT color="green">240</FONT>                            out = new ByteArrayOutputStream();<a name="line.240"></a>
<FONT color="green">241</FONT>                            boolean modified = addInstrumentationToArchive(archive.getCoberturaFile(), in, out);<a name="line.241"></a>
<FONT color="green">242</FONT>    <a name="line.242"></a>
<FONT color="green">243</FONT>                            if (modified)<a name="line.243"></a>
<FONT color="green">244</FONT>                            {<a name="line.244"></a>
<FONT color="green">245</FONT>                                    out.flush();<a name="line.245"></a>
<FONT color="green">246</FONT>                                    byte[] bytes = out.toByteArray();<a name="line.246"></a>
<FONT color="green">247</FONT>                                    archive.setModifiedBytes(bytes);<a name="line.247"></a>
<FONT color="green">248</FONT>                            }<a name="line.248"></a>
<FONT color="green">249</FONT>                    }<a name="line.249"></a>
<FONT color="green">250</FONT>                    finally<a name="line.250"></a>
<FONT color="green">251</FONT>                    {<a name="line.251"></a>
<FONT color="green">252</FONT>                            in = IOUtil.closeInputStream(in);<a name="line.252"></a>
<FONT color="green">253</FONT>                            out = (ByteArrayOutputStream)IOUtil.closeOutputStream(out);<a name="line.253"></a>
<FONT color="green">254</FONT>                    }<a name="line.254"></a>
<FONT color="green">255</FONT>            }<a name="line.255"></a>
<FONT color="green">256</FONT>    <a name="line.256"></a>
<FONT color="green">257</FONT>            private void addInstrumentationToArchive(CoberturaFile archive)<a name="line.257"></a>
<FONT color="green">258</FONT>            {<a name="line.258"></a>
<FONT color="green">259</FONT>                    logger.debug("Instrumenting archive " + archive.getAbsolutePath());<a name="line.259"></a>
<FONT color="green">260</FONT>    <a name="line.260"></a>
<FONT color="green">261</FONT>                    File outputFile = null;<a name="line.261"></a>
<FONT color="green">262</FONT>                    ZipInputStream input = null;<a name="line.262"></a>
<FONT color="green">263</FONT>                    ZipOutputStream output = null;<a name="line.263"></a>
<FONT color="green">264</FONT>                    boolean modified = false;<a name="line.264"></a>
<FONT color="green">265</FONT>                    try<a name="line.265"></a>
<FONT color="green">266</FONT>                    {<a name="line.266"></a>
<FONT color="green">267</FONT>                            // Open archive<a name="line.267"></a>
<FONT color="green">268</FONT>                            try<a name="line.268"></a>
<FONT color="green">269</FONT>                            {<a name="line.269"></a>
<FONT color="green">270</FONT>                                    input = new ZipInputStream(new FileInputStream(archive));<a name="line.270"></a>
<FONT color="green">271</FONT>                            }<a name="line.271"></a>
<FONT color="green">272</FONT>                            catch (FileNotFoundException e)<a name="line.272"></a>
<FONT color="green">273</FONT>                            {<a name="line.273"></a>
<FONT color="green">274</FONT>                                    logger.warn("Cannot open archive file: "<a name="line.274"></a>
<FONT color="green">275</FONT>                                                    + archive.getAbsolutePath(), e);<a name="line.275"></a>
<FONT color="green">276</FONT>                                    return;<a name="line.276"></a>
<FONT color="green">277</FONT>                            }<a name="line.277"></a>
<FONT color="green">278</FONT>    <a name="line.278"></a>
<FONT color="green">279</FONT>                            // Open output archive<a name="line.279"></a>
<FONT color="green">280</FONT>                            try<a name="line.280"></a>
<FONT color="green">281</FONT>                            {<a name="line.281"></a>
<FONT color="green">282</FONT>                                    // check if destination folder is set<a name="line.282"></a>
<FONT color="green">283</FONT>                                    if (destinationDirectory != null)<a name="line.283"></a>
<FONT color="green">284</FONT>                                    {<a name="line.284"></a>
<FONT color="green">285</FONT>                                            // if so, create output file in it<a name="line.285"></a>
<FONT color="green">286</FONT>                                            outputFile = new File(destinationDirectory, archive.getPathname());<a name="line.286"></a>
<FONT color="green">287</FONT>                                    }<a name="line.287"></a>
<FONT color="green">288</FONT>                                    else<a name="line.288"></a>
<FONT color="green">289</FONT>                                    {<a name="line.289"></a>
<FONT color="green">290</FONT>                                            // otherwise create output file in temporary location<a name="line.290"></a>
<FONT color="green">291</FONT>                                            outputFile = File.createTempFile(<a name="line.291"></a>
<FONT color="green">292</FONT>                                                            "CoberturaInstrumentedArchive", "jar");<a name="line.292"></a>
<FONT color="green">293</FONT>                                            outputFile.deleteOnExit();<a name="line.293"></a>
<FONT color="green">294</FONT>                                    }<a name="line.294"></a>
<FONT color="green">295</FONT>                                    output = new ZipOutputStream(new FileOutputStream(outputFile));<a name="line.295"></a>
<FONT color="green">296</FONT>                            }<a name="line.296"></a>
<FONT color="green">297</FONT>                            catch (IOException e)<a name="line.297"></a>
<FONT color="green">298</FONT>                            {<a name="line.298"></a>
<FONT color="green">299</FONT>                                    logger.warn("Cannot open file for instrumented archive: "<a name="line.299"></a>
<FONT color="green">300</FONT>                                                    + archive.getAbsolutePath(), e);<a name="line.300"></a>
<FONT color="green">301</FONT>                                    return;<a name="line.301"></a>
<FONT color="green">302</FONT>                            }<a name="line.302"></a>
<FONT color="green">303</FONT>    <a name="line.303"></a>
<FONT color="green">304</FONT>                            // Instrument classes in archive<a name="line.304"></a>
<FONT color="green">305</FONT>                            try<a name="line.305"></a>
<FONT color="green">306</FONT>                            {<a name="line.306"></a>
<FONT color="green">307</FONT>                                    modified = addInstrumentationToArchive(archive, input, output);<a name="line.307"></a>
<FONT color="green">308</FONT>                            }<a name="line.308"></a>
<FONT color="green">309</FONT>                            catch (Throwable e)<a name="line.309"></a>
<FONT color="green">310</FONT>                            {<a name="line.310"></a>
<FONT color="green">311</FONT>                                    logger.warn("Cannot instrument archive: "<a name="line.311"></a>
<FONT color="green">312</FONT>                                                    + archive.getAbsolutePath(), e);<a name="line.312"></a>
<FONT color="green">313</FONT>                                    return;<a name="line.313"></a>
<FONT color="green">314</FONT>                            }<a name="line.314"></a>
<FONT color="green">315</FONT>                    }<a name="line.315"></a>
<FONT color="green">316</FONT>                    finally<a name="line.316"></a>
<FONT color="green">317</FONT>                    {<a name="line.317"></a>
<FONT color="green">318</FONT>                            input = (ZipInputStream)IOUtil.closeInputStream(input);<a name="line.318"></a>
<FONT color="green">319</FONT>                            output = (ZipOutputStream)IOUtil.closeOutputStream(output);<a name="line.319"></a>
<FONT color="green">320</FONT>                    }<a name="line.320"></a>
<FONT color="green">321</FONT>    <a name="line.321"></a>
<FONT color="green">322</FONT>                    // If destination folder was not set, overwrite orginal archive with<a name="line.322"></a>
<FONT color="green">323</FONT>                    // instrumented one<a name="line.323"></a>
<FONT color="green">324</FONT>                    if (modified &amp;&amp; (destinationDirectory == null))<a name="line.324"></a>
<FONT color="green">325</FONT>                    {<a name="line.325"></a>
<FONT color="green">326</FONT>                            try<a name="line.326"></a>
<FONT color="green">327</FONT>                            {<a name="line.327"></a>
<FONT color="green">328</FONT>                                    logger.debug("Moving " + outputFile.getAbsolutePath() + " to "<a name="line.328"></a>
<FONT color="green">329</FONT>                                                    + archive.getAbsolutePath());<a name="line.329"></a>
<FONT color="green">330</FONT>                                    IOUtil.moveFile(outputFile, archive);<a name="line.330"></a>
<FONT color="green">331</FONT>                            }<a name="line.331"></a>
<FONT color="green">332</FONT>                            catch (IOException e)<a name="line.332"></a>
<FONT color="green">333</FONT>                            {<a name="line.333"></a>
<FONT color="green">334</FONT>                                    logger.warn("Cannot instrument archive: "<a name="line.334"></a>
<FONT color="green">335</FONT>                                                    + archive.getAbsolutePath(), e);<a name="line.335"></a>
<FONT color="green">336</FONT>                                    return;<a name="line.336"></a>
<FONT color="green">337</FONT>                            }<a name="line.337"></a>
<FONT color="green">338</FONT>                    }<a name="line.338"></a>
<FONT color="green">339</FONT>                    if ((destinationDirectory != null) &amp;&amp; (!modified))<a name="line.339"></a>
<FONT color="green">340</FONT>                    {<a name="line.340"></a>
<FONT color="green">341</FONT>                            outputFile.delete();<a name="line.341"></a>
<FONT color="green">342</FONT>                    }<a name="line.342"></a>
<FONT color="green">343</FONT>            }<a name="line.343"></a>
<FONT color="green">344</FONT>    <a name="line.344"></a>
<FONT color="green">345</FONT>            private void addInstrumentationToSingleClass(File file)<a name="line.345"></a>
<FONT color="green">346</FONT>            {<a name="line.346"></a>
<FONT color="green">347</FONT>                    logger.debug("Instrumenting class " + file.getAbsolutePath());<a name="line.347"></a>
<FONT color="green">348</FONT>    <a name="line.348"></a>
<FONT color="green">349</FONT>                    InputStream inputStream = null;<a name="line.349"></a>
<FONT color="green">350</FONT>                    ClassWriter cw;<a name="line.350"></a>
<FONT color="green">351</FONT>                    ClassInstrumenter cv;<a name="line.351"></a>
<FONT color="green">352</FONT>                    try<a name="line.352"></a>
<FONT color="green">353</FONT>                    {<a name="line.353"></a>
<FONT color="green">354</FONT>                            inputStream = new FileInputStream(file);<a name="line.354"></a>
<FONT color="green">355</FONT>                            ClassReader cr = new ClassReader(inputStream);<a name="line.355"></a>
<FONT color="green">356</FONT>                            cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);<a name="line.356"></a>
<FONT color="green">357</FONT>                            cv = new ClassInstrumenter(projectData, cw, ignoreRegexes, ignoreBranchesRegexes);<a name="line.357"></a>
<FONT color="green">358</FONT>                            cr.accept(cv, 0);<a name="line.358"></a>
<FONT color="green">359</FONT>                    }<a name="line.359"></a>
<FONT color="green">360</FONT>                    catch (Throwable t)<a name="line.360"></a>
<FONT color="green">361</FONT>                    {<a name="line.361"></a>
<FONT color="green">362</FONT>                            logger.warn("Unable to instrument file " + file.getAbsolutePath(),<a name="line.362"></a>
<FONT color="green">363</FONT>                                            t);<a name="line.363"></a>
<FONT color="green">364</FONT>                            return;<a name="line.364"></a>
<FONT color="green">365</FONT>                    }<a name="line.365"></a>
<FONT color="green">366</FONT>                    finally<a name="line.366"></a>
<FONT color="green">367</FONT>                    {<a name="line.367"></a>
<FONT color="green">368</FONT>                            inputStream = IOUtil.closeInputStream(inputStream);<a name="line.368"></a>
<FONT color="green">369</FONT>                    }<a name="line.369"></a>
<FONT color="green">370</FONT>    <a name="line.370"></a>
<FONT color="green">371</FONT>                    OutputStream outputStream = null;<a name="line.371"></a>
<FONT color="green">372</FONT>                    try<a name="line.372"></a>
<FONT color="green">373</FONT>                    {<a name="line.373"></a>
<FONT color="green">374</FONT>                            if (cv.isInstrumented())<a name="line.374"></a>
<FONT color="green">375</FONT>                            {<a name="line.375"></a>
<FONT color="green">376</FONT>                                    // If destinationDirectory is null, then overwrite<a name="line.376"></a>
<FONT color="green">377</FONT>                                    // the original, uninstrumented file.<a name="line.377"></a>
<FONT color="green">378</FONT>                                    File outputFile;<a name="line.378"></a>
<FONT color="green">379</FONT>                                    if (destinationDirectory == null)<a name="line.379"></a>
<FONT color="green">380</FONT>                                            outputFile = file;<a name="line.380"></a>
<FONT color="green">381</FONT>                                    else<a name="line.381"></a>
<FONT color="green">382</FONT>                                            outputFile = new File(destinationDirectory, cv<a name="line.382"></a>
<FONT color="green">383</FONT>                                                            .getClassName().replace('.', File.separatorChar)<a name="line.383"></a>
<FONT color="green">384</FONT>                                                            + ".class");<a name="line.384"></a>
<FONT color="green">385</FONT>    <a name="line.385"></a>
<FONT color="green">386</FONT>                                    File parentFile = outputFile.getParentFile();<a name="line.386"></a>
<FONT color="green">387</FONT>                                    if (parentFile != null)<a name="line.387"></a>
<FONT color="green">388</FONT>                                    {<a name="line.388"></a>
<FONT color="green">389</FONT>                                            parentFile.mkdirs();<a name="line.389"></a>
<FONT color="green">390</FONT>                                    }<a name="line.390"></a>
<FONT color="green">391</FONT>    <a name="line.391"></a>
<FONT color="green">392</FONT>                                    byte[] instrumentedClass = cw.toByteArray();<a name="line.392"></a>
<FONT color="green">393</FONT>                                    outputStream = new FileOutputStream(outputFile);<a name="line.393"></a>
<FONT color="green">394</FONT>                                    outputStream.write(instrumentedClass);<a name="line.394"></a>
<FONT color="green">395</FONT>                            }<a name="line.395"></a>
<FONT color="green">396</FONT>                    }<a name="line.396"></a>
<FONT color="green">397</FONT>                    catch (Throwable t)<a name="line.397"></a>
<FONT color="green">398</FONT>                    {<a name="line.398"></a>
<FONT color="green">399</FONT>                            logger.warn("Unable to instrument file " + file.getAbsolutePath(),<a name="line.399"></a>
<FONT color="green">400</FONT>                                            t);<a name="line.400"></a>
<FONT color="green">401</FONT>                            return;<a name="line.401"></a>
<FONT color="green">402</FONT>                    }<a name="line.402"></a>
<FONT color="green">403</FONT>                    finally<a name="line.403"></a>
<FONT color="green">404</FONT>                    {<a name="line.404"></a>
<FONT color="green">405</FONT>                            outputStream = IOUtil.closeOutputStream(outputStream);<a name="line.405"></a>
<FONT color="green">406</FONT>                    }<a name="line.406"></a>
<FONT color="green">407</FONT>            }<a name="line.407"></a>
<FONT color="green">408</FONT>    <a name="line.408"></a>
<FONT color="green">409</FONT>            // TODO: Don't attempt to instrument a file if the outputFile already<a name="line.409"></a>
<FONT color="green">410</FONT>            //       exists and is newer than the input file, and the output and<a name="line.410"></a>
<FONT color="green">411</FONT>            //       input file are in different locations?<a name="line.411"></a>
<FONT color="green">412</FONT>            private void addInstrumentation(CoberturaFile coberturaFile)<a name="line.412"></a>
<FONT color="green">413</FONT>            {<a name="line.413"></a>
<FONT color="green">414</FONT>                    if (coberturaFile.isClass() &amp;&amp; classPattern.matches(coberturaFile.getPathname()))<a name="line.414"></a>
<FONT color="green">415</FONT>                    {<a name="line.415"></a>
<FONT color="green">416</FONT>                            addInstrumentationToSingleClass(coberturaFile);<a name="line.416"></a>
<FONT color="green">417</FONT>                    }<a name="line.417"></a>
<FONT color="green">418</FONT>                    else if (coberturaFile.isDirectory())<a name="line.418"></a>
<FONT color="green">419</FONT>                    {<a name="line.419"></a>
<FONT color="green">420</FONT>                            String[] contents = coberturaFile.list();<a name="line.420"></a>
<FONT color="green">421</FONT>                            for (int i = 0; i &lt; contents.length; i++)<a name="line.421"></a>
<FONT color="green">422</FONT>                            {<a name="line.422"></a>
<FONT color="green">423</FONT>                                    File relativeFile = new File(coberturaFile.getPathname(), contents[i]);<a name="line.423"></a>
<FONT color="green">424</FONT>                                    CoberturaFile relativeCoberturaFile = new CoberturaFile(coberturaFile.getBaseDir(),<a name="line.424"></a>
<FONT color="green">425</FONT>                                                    relativeFile.toString());<a name="line.425"></a>
<FONT color="green">426</FONT>                                    //recursion!<a name="line.426"></a>
<FONT color="green">427</FONT>                                    addInstrumentation(relativeCoberturaFile);<a name="line.427"></a>
<FONT color="green">428</FONT>                            }<a name="line.428"></a>
<FONT color="green">429</FONT>                    }<a name="line.429"></a>
<FONT color="green">430</FONT>            }<a name="line.430"></a>
<FONT color="green">431</FONT>    <a name="line.431"></a>
<FONT color="green">432</FONT>            private void parseArguments(String[] args)<a name="line.432"></a>
<FONT color="green">433</FONT>            {<a name="line.433"></a>
<FONT color="green">434</FONT>                    File dataFile = CoverageDataFileHandler.getDefaultDataFile();<a name="line.434"></a>
<FONT color="green">435</FONT>    <a name="line.435"></a>
<FONT color="green">436</FONT>                    // Parse our parameters<a name="line.436"></a>
<FONT color="green">437</FONT>                    List filePaths = new ArrayList();<a name="line.437"></a>
<FONT color="green">438</FONT>                    String baseDir = null;<a name="line.438"></a>
<FONT color="green">439</FONT>                    for (int i = 0; i &lt; args.length; i++)<a name="line.439"></a>
<FONT color="green">440</FONT>                    {<a name="line.440"></a>
<FONT color="green">441</FONT>                            if (args[i].equals("--basedir"))<a name="line.441"></a>
<FONT color="green">442</FONT>                                    baseDir = args[++i];<a name="line.442"></a>
<FONT color="green">443</FONT>                            else if (args[i].equals("--datafile"))<a name="line.443"></a>
<FONT color="green">444</FONT>                                    dataFile = new File(args[++i]);<a name="line.444"></a>
<FONT color="green">445</FONT>                            else if (args[i].equals("--destination"))<a name="line.445"></a>
<FONT color="green">446</FONT>                                    destinationDirectory = new File(args[++i]);<a name="line.446"></a>
<FONT color="green">447</FONT>                            else if (args[i].equals("--ignore"))<a name="line.447"></a>
<FONT color="green">448</FONT>                            {<a name="line.448"></a>
<FONT color="green">449</FONT>                                    RegexUtil.addRegex(ignoreRegexes, args[++i]);<a name="line.449"></a>
<FONT color="green">450</FONT>                            }<a name="line.450"></a>
<FONT color="green">451</FONT>                            else if (args[i].equals("--ignoreBranches"))<a name="line.451"></a>
<FONT color="green">452</FONT>                            {<a name="line.452"></a>
<FONT color="green">453</FONT>                                    RegexUtil.addRegex(ignoreBranchesRegexes, args[++i]);<a name="line.453"></a>
<FONT color="green">454</FONT>                            }<a name="line.454"></a>
<FONT color="green">455</FONT>                            else if (args[i].equals("--includeClasses"))<a name="line.455"></a>
<FONT color="green">456</FONT>                            {<a name="line.456"></a>
<FONT color="green">457</FONT>                                    classPattern.addIncludeClassesRegex(args[++i]);<a name="line.457"></a>
<FONT color="green">458</FONT>                            }<a name="line.458"></a>
<FONT color="green">459</FONT>                            else if (args[i].equals("--excludeClasses"))<a name="line.459"></a>
<FONT color="green">460</FONT>                            {<a name="line.460"></a>
<FONT color="green">461</FONT>                                    classPattern.addExcludeClassesRegex(args[++i]);<a name="line.461"></a>
<FONT color="green">462</FONT>                            }<a name="line.462"></a>
<FONT color="green">463</FONT>                            else<a name="line.463"></a>
<FONT color="green">464</FONT>                            {<a name="line.464"></a>
<FONT color="green">465</FONT>                                    CoberturaFile coberturaFile = new CoberturaFile(baseDir, args[i]);<a name="line.465"></a>
<FONT color="green">466</FONT>                                    filePaths.add(coberturaFile);<a name="line.466"></a>
<FONT color="green">467</FONT>                            }<a name="line.467"></a>
<FONT color="green">468</FONT>                    }<a name="line.468"></a>
<FONT color="green">469</FONT>    <a name="line.469"></a>
<FONT color="green">470</FONT>                    // Load coverage data<a name="line.470"></a>
<FONT color="green">471</FONT>                    if (dataFile.isFile())<a name="line.471"></a>
<FONT color="green">472</FONT>                            projectData = CoverageDataFileHandler.loadCoverageData(dataFile);<a name="line.472"></a>
<FONT color="green">473</FONT>                    if (projectData == null)<a name="line.473"></a>
<FONT color="green">474</FONT>                            projectData = new ProjectData();<a name="line.474"></a>
<FONT color="green">475</FONT>                    <a name="line.475"></a>
<FONT color="green">476</FONT>                    // Instrument classes<a name="line.476"></a>
<FONT color="green">477</FONT>                    System.out.println("Instrumenting "     + filePaths.size() + " "<a name="line.477"></a>
<FONT color="green">478</FONT>                                    + (filePaths.size() == 1 ? "file" : "files")<a name="line.478"></a>
<FONT color="green">479</FONT>                                    + (destinationDirectory != null ? " to "<a name="line.479"></a>
<FONT color="green">480</FONT>                                                    + destinationDirectory.getAbsoluteFile() : ""));<a name="line.480"></a>
<FONT color="green">481</FONT>    <a name="line.481"></a>
<FONT color="green">482</FONT>                    Iterator iter = filePaths.iterator();<a name="line.482"></a>
<FONT color="green">483</FONT>                    while (iter.hasNext())<a name="line.483"></a>
<FONT color="green">484</FONT>                    {<a name="line.484"></a>
<FONT color="green">485</FONT>                            CoberturaFile coberturaFile = (CoberturaFile)iter.next();<a name="line.485"></a>
<FONT color="green">486</FONT>                            if (coberturaFile.isArchive())<a name="line.486"></a>
<FONT color="green">487</FONT>                            {<a name="line.487"></a>
<FONT color="green">488</FONT>                                    addInstrumentationToArchive(coberturaFile);<a name="line.488"></a>
<FONT color="green">489</FONT>                            }<a name="line.489"></a>
<FONT color="green">490</FONT>                            else<a name="line.490"></a>
<FONT color="green">491</FONT>                            {<a name="line.491"></a>
<FONT color="green">492</FONT>                                    addInstrumentation(coberturaFile);<a name="line.492"></a>
<FONT color="green">493</FONT>                            }<a name="line.493"></a>
<FONT color="green">494</FONT>                    }<a name="line.494"></a>
<FONT color="green">495</FONT>    <a name="line.495"></a>
<FONT color="green">496</FONT>                    // Save coverage data<a name="line.496"></a>
<FONT color="green">497</FONT>                    CoverageDataFileHandler.saveCoverageData(projectData, dataFile);<a name="line.497"></a>
<FONT color="green">498</FONT>            }<a name="line.498"></a>
<FONT color="green">499</FONT>    <a name="line.499"></a>
<FONT color="green">500</FONT>            public static void main(String[] args)<a name="line.500"></a>
<FONT color="green">501</FONT>            {<a name="line.501"></a>
<FONT color="green">502</FONT>                    Header.print(System.out);<a name="line.502"></a>
<FONT color="green">503</FONT>    <a name="line.503"></a>
<FONT color="green">504</FONT>                    long startTime = System.currentTimeMillis();<a name="line.504"></a>
<FONT color="green">505</FONT>    <a name="line.505"></a>
<FONT color="green">506</FONT>                    Main main = new Main();<a name="line.506"></a>
<FONT color="green">507</FONT>    <a name="line.507"></a>
<FONT color="green">508</FONT>                    try {<a name="line.508"></a>
<FONT color="green">509</FONT>                            args = CommandLineBuilder.preprocessCommandLineArguments( args);<a name="line.509"></a>
<FONT color="green">510</FONT>                    } catch( Exception ex) {<a name="line.510"></a>
<FONT color="green">511</FONT>                            System.err.println( "Error: Cannot process arguments: " + ex.getMessage());<a name="line.511"></a>
<FONT color="green">512</FONT>                            System.exit(1);<a name="line.512"></a>
<FONT color="green">513</FONT>                    }<a name="line.513"></a>
<FONT color="green">514</FONT>                    main.parseArguments(args);<a name="line.514"></a>
<FONT color="green">515</FONT>    <a name="line.515"></a>
<FONT color="green">516</FONT>                    long stopTime = System.currentTimeMillis();<a name="line.516"></a>
<FONT color="green">517</FONT>                    System.out.println("Instrument time: " + (stopTime - startTime) + "ms");<a name="line.517"></a>
<FONT color="green">518</FONT>            }<a name="line.518"></a>
<FONT color="green">519</FONT>    <a name="line.519"></a>
<FONT color="green">520</FONT>    }<a name="line.520"></a>




























































</PRE>
</BODY>
</HTML>