summaryrefslogtreecommitdiff
path: root/src/proguard/UpToDateChecker.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/proguard/UpToDateChecker.java')
-rw-r--r--src/proguard/UpToDateChecker.java219
1 files changed, 70 insertions, 149 deletions
diff --git a/src/proguard/UpToDateChecker.java b/src/proguard/UpToDateChecker.java
index c743af9..9fa5d16 100644
--- a/src/proguard/UpToDateChecker.java
+++ b/src/proguard/UpToDateChecker.java
@@ -2,7 +2,7 @@
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
- * Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -47,186 +47,107 @@ public class UpToDateChecker
*/
public boolean check()
{
- try
- {
- ModificationTimeChecker checker = new ModificationTimeChecker();
-
- checker.updateInputModificationTime(configuration.lastModified);
+ long inputLastModified = configuration.lastModified;
+ long outputLastModified = Long.MAX_VALUE;
- ClassPath programJars = configuration.programJars;
- ClassPath libraryJars = configuration.libraryJars;
+ ClassPath programJars = configuration.programJars;
+ ClassPath libraryJars = configuration.libraryJars;
- // Check the dates of the program jars, if any.
- if (programJars != null)
+ // Check the dates of the program jars, if any.
+ if (programJars != null)
+ {
+ for (int index = 0; index < programJars.size(); index++)
{
- for (int index = 0; index < programJars.size(); index++)
+ // Break early, if possible.
+ if (inputLastModified >= outputLastModified)
{
- // Update the input and output modification times.
- ClassPathEntry classPathEntry = programJars.get(index);
-
- checker.updateModificationTime(classPathEntry.getFile(),
- classPathEntry.isOutput());
+ break;
}
- }
- // Check the dates of the library jars, if any.
- if (libraryJars != null)
- {
- for (int index = 0; index < libraryJars.size(); index++)
+ // Update the input and output modification times.
+ ClassPathEntry classPathEntry = programJars.get(index);
+ if (classPathEntry.isOutput())
{
- // Update the input modification time.
- ClassPathEntry classPathEntry = libraryJars.get(index);
-
- checker.updateModificationTime(classPathEntry.getFile(),
- false);
+ long lastModified = lastModified(classPathEntry.getFile(), true);
+ if (outputLastModified > lastModified)
+ {
+ outputLastModified = lastModified;
+ }
+ }
+ else
+ {
+ long lastModified = lastModified(classPathEntry.getFile(), false);
+ if (inputLastModified < lastModified)
+ {
+ inputLastModified = lastModified;
+ }
}
- }
-
- // Check the dates of the auxiliary input files.
- checker.updateInputModificationTime(configuration.applyMapping);
- checker.updateInputModificationTime(configuration.obfuscationDictionary);
- checker.updateInputModificationTime(configuration.classObfuscationDictionary);
- checker.updateInputModificationTime(configuration.packageObfuscationDictionary);
-
- // Check the dates of the auxiliary output files.
- checker.updateOutputModificationTime(configuration.printSeeds);
- checker.updateOutputModificationTime(configuration.printUsage);
- checker.updateOutputModificationTime(configuration.printMapping);
- checker.updateOutputModificationTime(configuration.printConfiguration);
- checker.updateOutputModificationTime(configuration.dump);
- }
- catch (IllegalStateException e)
- {
- // The output is outdated.
- return false;
- }
-
- System.out.println("The output seems up to date");
-
- return true;
- }
-
-
- /**
- * This class maintains the modification times of input and output.
- * The methods throw an IllegalStateException if the output appears
- * outdated.
- */
- private static class ModificationTimeChecker {
-
- private long inputModificationTime = Long.MIN_VALUE;
- private long outputModificationTime = Long.MAX_VALUE;
-
-
- /**
- * Updates the input modification time based on the given file or
- * directory (recursively).
- */
- public void updateInputModificationTime(File file)
- {
- if (file != null)
- {
- updateModificationTime(file, false);
- }
- }
-
-
- /**
- * Updates the input modification time based on the given file or
- * directory (recursively).
- */
- public void updateOutputModificationTime(File file)
- {
- if (file != null && file.getName().length() > 0)
- {
- updateModificationTime(file, true);
}
}
-
- /**
- * Updates the specified modification time based on the given file or
- * directory (recursively).
- */
- public void updateModificationTime(File file, boolean isOutput)
+ // Check the dates of the library jars, if any.
+ if (libraryJars != null)
{
- // Is it a directory?
- if (file.isDirectory())
+ for (int index = 0; index < libraryJars.size(); index++)
{
- // Ignore the directory's modification time; just recurse on
- // its files.
- File[] files = file.listFiles();
-
- // Still, an empty output directory is probably a sign that it
- // is not up to date.
- if (files.length == 0 && isOutput)
+ // Break early, if possible.
+ if (inputLastModified >= outputLastModified)
{
- updateOutputModificationTime(Long.MIN_VALUE);
+ break;
}
- for (int index = 0; index < files.length; index++)
+ // Update the input modification time.
+ ClassPathEntry classPathEntry = libraryJars.get(index);
+ long lastModified = lastModified(classPathEntry.getFile(), false);
+ if (inputLastModified < lastModified)
{
- updateModificationTime(files[index], isOutput);
+ inputLastModified = lastModified;
}
}
- else
- {
- // Update with the file's modification time.
- updateModificationTime(file.lastModified(), isOutput);
- }
}
-
- /**
- * Updates the specified modification time.
- */
- public void updateModificationTime(long time, boolean isOutput)
+ boolean outputUpToDate = inputLastModified < outputLastModified;
+ if (outputUpToDate)
{
- if (isOutput)
- {
- updateOutputModificationTime(time);
- }
- else
- {
- updateInputModificationTime(time);
- }
+ System.out.println("The output is up to date");
}
+ return outputUpToDate;
+ }
- /**
- * Updates the input modification time.
- */
- public void updateInputModificationTime(long time)
- {
- if (inputModificationTime < time)
- {
- inputModificationTime = time;
- checkModificationTimes();
- }
- }
+ /**
+ * Returns the minimum or maximum modification time of the given file or
+ * of the files in the given directory (recursively).
+ */
+ private long lastModified(File file, boolean minimum)
+ {
+ // Is it a directory?
+ if (file.isDirectory())
+ {
+ // Ignore the directory's modification time; just recurse on its files.
+ File[] files = file.listFiles();
+ // Still, an empty output directory is probably a sign that it is
+ // not up to date.
+ long lastModified = files.length != 0 && minimum ?
+ Long.MAX_VALUE : 0L;
- /**
- * Updates the output modification time.
- */
- public void updateOutputModificationTime(long time)
- {
- if (outputModificationTime > time)
+ for (int index = 0; index < files.length; index++)
{
- outputModificationTime = time;
-
- checkModificationTimes();
+ long fileLastModified = lastModified(files[index], minimum);
+ if ((lastModified < fileLastModified) ^ minimum)
+ {
+ lastModified = fileLastModified;
+ }
}
- }
-
- private void checkModificationTimes()
+ return lastModified;
+ }
+ else
{
- if (inputModificationTime > outputModificationTime)
- {
- throw new IllegalStateException("The output is outdated");
- }
+ // Return the file's modification time.
+ return file.lastModified();
}
}
}