Prevent a module from refreshing twice on initial load.

Review by: bruce (TBR)


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2763 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/GWTShell.java b/dev/core/src/com/google/gwt/dev/GWTShell.java
index 61ba6ad..20d9a2d 100644
--- a/dev/core/src/com/google/gwt/dev/GWTShell.java
+++ b/dev/core/src/com/google/gwt/dev/GWTShell.java
@@ -57,6 +57,7 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -280,9 +281,12 @@
      * @return the loaded module
      * @throws UnableToCompleteException
      */
-    private ModuleDef loadModule(final String moduleName, TreeLogger logger)
+    private ModuleDef loadModule(String moduleName, TreeLogger logger)
         throws UnableToCompleteException {
-      ModuleDef moduleDef = doLoadModule(logger, moduleName);
+      boolean assumeFresh = !alreadySeenModules.contains(moduleName);
+      ModuleDef moduleDef = ModuleDefLoader.loadFromClassPath(logger,
+          moduleName, !assumeFresh);
+      alreadySeenModules.add(moduleName);
       assert (moduleDef != null) : "Required module state is absent";
       return moduleDef;
     }
@@ -364,6 +368,14 @@
 
   protected File outDir;
 
+  /**
+   * Cheat on the first load's refresh by assuming the module loaded by
+   * {@link com.google.gwt.dev.shell.GWTShellServlet} is still fresh. This
+   * prevents a double-refresh on startup. Subsequent refreshes will trigger a
+   * real refresh.
+   */
+  private Set<String> alreadySeenModules = new HashSet<String>();
+
   private BrowserWidgetHostImpl browserHost = new BrowserWidgetHostImpl();
 
   private final List<Shell> browserShells = new ArrayList<Shell>();
@@ -655,16 +667,6 @@
   }
 
   /**
-   * Loads a named module. This method can be overridden if the module def needs
-   * to be tweaked (or even created) programmatically -- JUnit integration does
-   * this, for example.
-   */
-  protected ModuleDef doLoadModule(TreeLogger logger, final String moduleName)
-      throws UnableToCompleteException {
-    return ModuleDefLoader.loadFromClassPath(logger, moduleName);
-  }
-
-  /**
    * Derived classes can override to prevent automatic update checking.
    */
   protected boolean doShouldCheckForUpdates() {
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index 0bd81e8..dbfaa08 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -490,7 +490,9 @@
 
   void compileForWebMode(String moduleName, String userAgentString)
       throws UnableToCompleteException {
-    ModuleDef module = doLoadModule(getTopLogger(), moduleName);
+    // Never fresh during JUnit.
+    ModuleDef module = ModuleDefLoader.loadFromClassPath(getTopLogger(),
+        moduleName, false);
     if (userAgentString != null) {
       Properties props = module.getProperties();
       Property userAgent = props.find("user.agent");