KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > proguard > UpToDateChecker


1 /*
2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
3  * of Java bytecode.
4  *
5  * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the Free
9  * Software Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */

21 package proguard;
22
23 import java.io.File JavaDoc;
24
25 /**
26  * This class checks whether the output is up to date.
27  *
28  * @author Eric Lafortune
29  */

30 public class UpToDateChecker
31 {
32     private Configuration configuration;
33
34
35     /**
36      * Creates a new UpToDateChecker with the given configuration.
37      */

38     public UpToDateChecker(Configuration configuration)
39     {
40         this.configuration = configuration;
41     }
42
43
44     /**
45      * Returns whether the output is up to date, based on the modification times
46      * of the input jars, output jars, and library jars (or directories).
47      */

48     public boolean check()
49     {
50         long inputLastModified = configuration.lastModified;
51         long outputLastModified = Long.MAX_VALUE;
52
53         ClassPath programJars = configuration.programJars;
54         ClassPath libraryJars = configuration.libraryJars;
55
56         // Check the dates of the program jars, if any.
57
if (programJars != null)
58         {
59             for (int index = 0; index < programJars.size(); index++)
60             {
61                 // Break early, if possible.
62
if (inputLastModified >= outputLastModified)
63                 {
64                     break;
65                 }
66
67                 // Update the input and output modification times.
68
ClassPathEntry classPathEntry = programJars.get(index);
69                 if (classPathEntry.isOutput())
70                 {
71                     long lastModified = lastModified(classPathEntry.getFile(), true);
72                     if (outputLastModified > lastModified)
73                     {
74                         outputLastModified = lastModified;
75                     }
76                 }
77                 else
78                 {
79                     long lastModified = lastModified(classPathEntry.getFile(), false);
80                     if (inputLastModified < lastModified)
81                     {
82                         inputLastModified = lastModified;
83                     }
84                 }
85             }
86         }
87
88         // Check the dates of the library jars, if any.
89
if (libraryJars != null)
90         {
91             for (int index = 0; index < libraryJars.size(); index++)
92             {
93                 // Break early, if possible.
94
if (inputLastModified >= outputLastModified)
95                 {
96                     break;
97                 }
98
99                 // Update the input modification time.
100
ClassPathEntry classPathEntry = libraryJars.get(index);
101                 long lastModified = lastModified(classPathEntry.getFile(), false);
102                 if (inputLastModified < lastModified)
103                 {
104                     inputLastModified = lastModified;
105                 }
106             }
107         }
108
109         boolean outputUpToDate = inputLastModified < outputLastModified;
110         if (outputUpToDate)
111         {
112             System.out.println("The output is up to date");
113         }
114
115         return outputUpToDate;
116     }
117
118
119     /**
120      * Returns the minimum or maximum modification time of the given file or
121      * of the files in the given directory (recursively).
122      */

123     private long lastModified(File JavaDoc file, boolean minimum)
124     {
125         // Is it a directory?
126
if (file.isDirectory())
127         {
128             // Ignore the directory's modification time; just recurse on its files.
129
long lastModified = minimum ? Long.MAX_VALUE : 0;
130
131             File JavaDoc[] files = file.listFiles();
132             for (int index = 0; index < files.length; index++)
133             {
134                 long fileLastModified = lastModified(files[index], minimum);
135                 if ((lastModified < fileLastModified) ^ minimum)
136                 {
137                     lastModified = fileLastModified;
138                 }
139             }
140
141             return lastModified;
142         }
143         else
144         {
145             // Return the file's modification time.
146
return file.lastModified();
147         }
148     }
149 }
150
Popular Tags