Makes StandardGeneratedResource portable.

Patch by: spoon
Review by: me


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6494 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardGeneratedResource.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardGeneratedResource.java
index c27a7af..5283ed6 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardGeneratedResource.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardGeneratedResource.java
@@ -19,37 +19,62 @@
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.linker.GeneratedResource;
+import com.google.gwt.dev.util.DiskCache;
+import com.google.gwt.dev.util.Util;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
 
 /**
  * The standard implementation of {@link GeneratedResource}.
  */
 public class StandardGeneratedResource extends GeneratedResource {
-  private final File file;
+  private static final DiskCache diskCache = new DiskCache();
+
+  private final long lastModified;
+
+  private transient long token;
 
   public StandardGeneratedResource(Class<? extends Generator> generatorType,
       String partialPath, File file) {
     super(StandardLinkerContext.class, generatorType, partialPath);
-    this.file = file;
+    this.lastModified = file.lastModified();
+    this.token = diskCache.writeByteArray(Util.readFileAsBytes(file));
   }
 
   @Override
   public InputStream getContents(TreeLogger logger)
       throws UnableToCompleteException {
-    try {
-      return new FileInputStream(file);
-    } catch (IOException e) {
-      logger.log(TreeLogger.ERROR, "Unable to open file", e);
-      throw new UnableToCompleteException();
-    }
+    return new ByteArrayInputStream(diskCache.readByteArray(token));
   }
 
   @Override
   public long getLastModified() {
-    return file.lastModified();
+    return lastModified;
+  }
+
+  @Override
+  public void writeTo(TreeLogger logger, OutputStream out)
+      throws UnableToCompleteException {
+    diskCache.writeTo(token, out);
+  }
+
+  private void readObject(ObjectInputStream stream) throws IOException,
+      ClassNotFoundException {
+    stream.defaultReadObject();
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    Util.copyNoClose(stream, baos);
+    token = diskCache.writeByteArray(baos.toByteArray());
+  }
+
+  private void writeObject(ObjectOutputStream stream) throws IOException {
+    stream.defaultWriteObject();
+    diskCache.writeTo(token, stream);
   }
 }