Adds getLastModified() to CompilationUnit and its dependencies.

Review by: bobv (postmortem)

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@3597 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
index b165935..826184d 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
@@ -149,6 +149,11 @@
   public abstract String getDisplayLocation();
 
   /**
+   * Returns the last modified time of the compilation unit.
+   */
+  public abstract long getLastModified();
+
+  /**
    * Returns the source code for this unit.
    */
   public abstract String getSource();
diff --git a/dev/core/src/com/google/gwt/dev/javac/JavaSourceFile.java b/dev/core/src/com/google/gwt/dev/javac/JavaSourceFile.java
index f73c2da..c1bf5f7 100644
--- a/dev/core/src/com/google/gwt/dev/javac/JavaSourceFile.java
+++ b/dev/core/src/com/google/gwt/dev/javac/JavaSourceFile.java
@@ -29,6 +29,11 @@
   }
 
   /**
+   * Returns the last modified time of the compilation unit.
+   */
+  public abstract long getLastModified();
+
+  /**
    * Returns the user-relevant location of the source file. No programmatic
    * assumptions should be made about the return value.
    */
diff --git a/dev/core/src/com/google/gwt/dev/javac/impl/FileCompilationUnit.java b/dev/core/src/com/google/gwt/dev/javac/impl/FileCompilationUnit.java
index 3194633..d2fee22 100644
--- a/dev/core/src/com/google/gwt/dev/javac/impl/FileCompilationUnit.java
+++ b/dev/core/src/com/google/gwt/dev/javac/impl/FileCompilationUnit.java
@@ -45,6 +45,11 @@
   }
 
   @Override
+  public long getLastModified() {
+    return file.lastModified();
+  }
+
+  @Override
   public String getSource() {
     return Util.readFileAsString(file);
   }
diff --git a/dev/core/src/com/google/gwt/dev/javac/impl/JavaSourceOracleImpl.java b/dev/core/src/com/google/gwt/dev/javac/impl/JavaSourceOracleImpl.java
index 820c214..88e2406 100644
--- a/dev/core/src/com/google/gwt/dev/javac/impl/JavaSourceOracleImpl.java
+++ b/dev/core/src/com/google/gwt/dev/javac/impl/JavaSourceOracleImpl.java
@@ -60,6 +60,11 @@
     }
 
     @Override
+    public long getLastModified() {
+      return resource.getLastModified();
+    }
+
+    @Override
     public String getLocation() {
       return location;
     }
diff --git a/dev/core/src/com/google/gwt/dev/javac/impl/SourceFileCompilationUnit.java b/dev/core/src/com/google/gwt/dev/javac/impl/SourceFileCompilationUnit.java
index 4ad2541..7f543af 100644
--- a/dev/core/src/com/google/gwt/dev/javac/impl/SourceFileCompilationUnit.java
+++ b/dev/core/src/com/google/gwt/dev/javac/impl/SourceFileCompilationUnit.java
@@ -36,6 +36,11 @@
   }
 
   @Override
+  public long getLastModified() {
+    return sourceFile.getLastModified();
+  }
+
+  @Override
   public String getSource() {
     if (sourceCode == null) {
       sourceCode = sourceFile.readSource();
@@ -61,5 +66,5 @@
   protected void dumpSource() {
     sourceCode = null;
   }
-  
+
 }
diff --git a/dev/core/src/com/google/gwt/dev/resource/Resource.java b/dev/core/src/com/google/gwt/dev/resource/Resource.java
index b5310df..6d61cce 100644
--- a/dev/core/src/com/google/gwt/dev/resource/Resource.java
+++ b/dev/core/src/com/google/gwt/dev/resource/Resource.java
@@ -32,6 +32,11 @@
   }
 
   /**
+   * Returns the last modified time of the compilation unit.
+   */
+  public abstract long getLastModified();
+
+  /**
    * Returns the user-relevant location of the resource. No programmatic
    * assumptions should be made about the return value.
    */
diff --git a/dev/core/src/com/google/gwt/dev/resource/impl/FileResource.java b/dev/core/src/com/google/gwt/dev/resource/impl/FileResource.java
index 74ba79f..dab8e71 100644
--- a/dev/core/src/com/google/gwt/dev/resource/impl/FileResource.java
+++ b/dev/core/src/com/google/gwt/dev/resource/impl/FileResource.java
@@ -47,6 +47,11 @@
   }
 
   @Override
+  public long getLastModified() {
+    return file.lastModified();
+  }
+
+  @Override
   public String getLocation() {
     return file.getAbsoluteFile().toURI().toString();
   }
diff --git a/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java b/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
index 814f9ac..b04fcf4 100644
--- a/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
+++ b/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
@@ -89,6 +89,11 @@
     }
 
     @Override
+    public long getLastModified() {
+      return resource.getLastModified();
+    }
+
+    @Override
     public String getLocation() {
       return resource.getLocation();
     }
diff --git a/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileResource.java b/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileResource.java
index 87df4fd..1920e86 100644
--- a/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileResource.java
+++ b/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileResource.java
@@ -41,8 +41,16 @@
   }
 
   @Override
+  public long getLastModified() {
+    // Questionable: maybe we should do something with the jar's time instead.
+    return zipEntry.getTime();
+  }
+
+  @Override
   public String getLocation() {
+    // CHECKSTYLE_OFF
     String proto = zipEntry instanceof JarEntry ? "jar:" : "zip:";
+    // CHECKSTYLE_ON
     return proto + classPathEntry.getLocation() + "!/" + getPath();
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java b/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java
index 1a3dfcc..332f7de 100644
--- a/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java
+++ b/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java
@@ -60,6 +60,8 @@
    */
   private static class GeneratedUnitWithFile extends CompilationUnit {
 
+    private long creationTime;
+
     private File file;
 
     private PrintWriter pw;
@@ -83,6 +85,7 @@
       source = sw.toString();
       pw = null;
       sw = null;
+      creationTime = System.currentTimeMillis();
     }
 
     @Override
@@ -95,6 +98,11 @@
     }
 
     @Override
+    public long getLastModified() {
+      return creationTime;
+    }
+
+    @Override
     public String getSource() {
       if (source == null && file == null) {
         throw new IllegalStateException("source not committed");
diff --git a/dev/core/test/com/google/gwt/dev/javac/MockCompilationUnit.java b/dev/core/test/com/google/gwt/dev/javac/MockCompilationUnit.java
index 9f07db9..4014c8d 100644
--- a/dev/core/test/com/google/gwt/dev/javac/MockCompilationUnit.java
+++ b/dev/core/test/com/google/gwt/dev/javac/MockCompilationUnit.java
@@ -35,6 +35,11 @@
   }
 
   @Override
+  public long getLastModified() {
+    return 0;
+  }
+
+  @Override
   public String getSource() {
     assert source != null;
     return source;
@@ -47,4 +52,4 @@
   public boolean isGenerated() {
     return true;
   }
-}
\ No newline at end of file
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/impl/MockJavaSourceFile.java b/dev/core/test/com/google/gwt/dev/javac/impl/MockJavaSourceFile.java
index 1225e50..1018edb 100644
--- a/dev/core/test/com/google/gwt/dev/javac/impl/MockJavaSourceFile.java
+++ b/dev/core/test/com/google/gwt/dev/javac/impl/MockJavaSourceFile.java
@@ -45,6 +45,11 @@
   }
 
   @Override
+  public long getLastModified() {
+    return 0;
+  }
+
+  @Override
   public String getLocation() {
     return location;
   }
diff --git a/dev/core/test/com/google/gwt/dev/javac/impl/MockResource.java b/dev/core/test/com/google/gwt/dev/javac/impl/MockResource.java
index a0fbc94..b35cfda 100644
--- a/dev/core/test/com/google/gwt/dev/javac/impl/MockResource.java
+++ b/dev/core/test/com/google/gwt/dev/javac/impl/MockResource.java
@@ -33,6 +33,11 @@
   }
 
   @Override
+  public long getLastModified() {
+    return 0;
+  }
+
+  @Override
   public String getLocation() {
     return "/mock/" + path;
   }
diff --git a/dev/core/test/com/google/gwt/dev/resource/impl/MockAbstractResource.java b/dev/core/test/com/google/gwt/dev/resource/impl/MockAbstractResource.java
index 25de30f..992fdcb 100644
--- a/dev/core/test/com/google/gwt/dev/resource/impl/MockAbstractResource.java
+++ b/dev/core/test/com/google/gwt/dev/resource/impl/MockAbstractResource.java
@@ -36,6 +36,11 @@
   }
 
   @Override
+  public long getLastModified() {
+    return 0;
+  }
+
+  @Override
   public String getLocation() {
     return this.mockClassPathEntry.pathRoot + "/" + path;
   }
diff --git a/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java b/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java
index 7b06e39..09c8f21 100644
--- a/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java
+++ b/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java
@@ -100,6 +100,11 @@
         return new Resource() {
 
           @Override
+          public long getLastModified() {
+            return 0;
+          }
+
+          @Override
           public String getLocation() {
             return "/mock/onPublicPath.txt";
           }
diff --git a/tools/api-checker/test/com/google/gwt/tools/apichecker/ApiContainerTest.java b/tools/api-checker/test/com/google/gwt/tools/apichecker/ApiContainerTest.java
index b851a4b..76b50c3 100644
--- a/tools/api-checker/test/com/google/gwt/tools/apichecker/ApiContainerTest.java
+++ b/tools/api-checker/test/com/google/gwt/tools/apichecker/ApiContainerTest.java
@@ -50,6 +50,11 @@
     }
 
     @Override
+    public long getLastModified() {
+      return 0;
+    }
+
+    @Override
     public String getSource() {
       return String.valueOf(source);
     }