Reviewers: scheglov, jbrosenberg,

Description:
Better error handling when the cache is initialized with a directory
that does not exist and it cannot create.


Please review this at http://gwt-code-reviews.appspot.com/1380808/

Affected files:
  M dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java
  M dev/core/src/com/google/gwt/dev/javac/PersistentUnitCache.java
  M dev/core/src/com/google/gwt/dev/javac/UnitCacheFactory.java
  M dev/core/test/com/google/gwt/dev/javac/PersistentUnitCacheTest.java


Index: dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java
===================================================================
--- dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java (revision 9896) +++ dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java (working copy)
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.javac;

 import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.dev.javac.CompilationUnitBuilder.GeneratedCompilationUnitBuilder; import com.google.gwt.dev.javac.CompilationUnitBuilder.ResourceCompilationUnitBuilder;
 import com.google.gwt.dev.javac.JdtCompiler.AdditionalTypeProviderDelegate;
@@ -289,7 +290,8 @@
* Called to setup the directory where the persistent {@link ComplationUnit} * cache should be stored. Only the first call to init() will have an effect.
    */
- public static synchronized void init(TreeLogger logger, File cacheDirectory) { + public static synchronized void init(TreeLogger logger, File cacheDirectory)
+      throws UnableToCompleteException {
     instance.unitCache = UnitCacheFactory.get(logger, cacheDirectory);
   }

Index: dev/core/src/com/google/gwt/dev/javac/PersistentUnitCache.java
===================================================================
--- dev/core/src/com/google/gwt/dev/javac/PersistentUnitCache.java (revision 9896) +++ dev/core/src/com/google/gwt/dev/javac/PersistentUnitCache.java (working copy)
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.javac;

 import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.dev.util.log.speedtracer.DevModeEventType;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
@@ -284,14 +285,19 @@
    */
   private File currentCacheFile;

-  PersistentUnitCache(TreeLogger logger, File cacheDir) {
+ PersistentUnitCache(TreeLogger logger, File cacheDir) throws UnableToCompleteException {
     assert cacheDir != null;

     this.cacheDirectory = new File(cacheDir, UNIT_CACHE_PREFIX);
     logger.log(TreeLogger.TRACE, "Persistent unit cache dir set to: "
         + this.cacheDirectory.getAbsolutePath());

-    cacheDirectory.mkdir();
+    if (!cacheDirectory.exists() && !cacheDirectory.mkdir()) {
+ logger.log(TreeLogger.ERROR, "Unable to initialize cache. Couldn't create directory "
+          + cacheDirectory.getAbsolutePath() + ".");
+      throw new UnableToCompleteException();
+    }
+
     long timestamp = System.currentTimeMillis();
     do {
       currentCacheFile =
@@ -415,7 +421,7 @@
       Arrays.sort(retFiles);
       return retFiles;
     }
-    return null;
+    return new File[0];
   }

   /**
Index: dev/core/src/com/google/gwt/dev/javac/UnitCacheFactory.java
===================================================================
--- dev/core/src/com/google/gwt/dev/javac/UnitCacheFactory.java (revision 9896) +++ dev/core/src/com/google/gwt/dev/javac/UnitCacheFactory.java (working copy)
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.javac;

 import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;

 import java.io.File;

@@ -36,10 +37,11 @@
* into memory in a background thread. If the cache is not enabled, it clears
    * out any old cached files.
    *
- * Only one instance of the cache is instantiated. If a previously created cache
-   * exists, the previous instance is returned.
+ * Only one instance of the cache is instantiated. If a previously created
+   * cache exists, the previous instance is returned.
    */
- public static synchronized UnitCache get(TreeLogger logger, File cacheDir) { + public static synchronized UnitCache get(TreeLogger logger, File cacheDir)
+      throws UnableToCompleteException {
     assert logger != null;
     if (instance == null) {
       if (usePersistent) {
Index: dev/core/test/com/google/gwt/dev/javac/PersistentUnitCacheTest.java
===================================================================
--- dev/core/test/com/google/gwt/dev/javac/PersistentUnitCacheTest.java (revision 9896) +++ dev/core/test/com/google/gwt/dev/javac/PersistentUnitCacheTest.java (working copy)
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.javac;

 import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.dev.util.Util;

 import junit.framework.TestCase;
@@ -31,11 +32,13 @@
   File lastCacheDir = null;

   public void tearDown() {
-    Util.recursiveDelete(lastCacheDir, false);
+    if (lastCacheDir != null) {
+      Util.recursiveDelete(lastCacheDir, false);
+    }
     lastCacheDir = null;
   }

- public void testPersistentCache() throws IOException, InterruptedException { + public void testPersistentCache() throws IOException, InterruptedException, UnableToCompleteException {
     TreeLogger logger = TreeLogger.NULL;

     File cacheDir = null;
@@ -63,8 +66,7 @@
     result = cache.find(bar1.getContentId());
     assertNotNull(result);
     assertEquals("com.example.Bar", result.getTypeName());
-    System.err.println("resource loc: " + bar1.getResourceLocation());
-
+
     // Find by type name
     result = cache.find("/mock/com/example/Foo.java");
     assertNotNull(result);
@@ -167,6 +169,21 @@
     assertNumCacheFiles(unitCacheDir, 1);
   }

+  public void testBadDir() {
+    TreeLogger logger = TreeLogger.NULL;
+    File badDir = new File("sHoUlDnOtExi57");
+    boolean caught = false;
+    try {
+      PersistentUnitCache puc = new PersistentUnitCache(logger, badDir);
+    } catch (UnableToCompleteException ex) {
+      // expected
+      caught = true;
+    } finally {
+      assertTrue("Did not catch UnableToCompleteException", caught);
+    }
+
+  }
+
   private void assertNumCacheFiles(File unitCacheDir, int expected) {
     assertEquals(expected, unitCacheDir.list().length);
   }


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to