Unify DevMode's startupModules and alreadySeen modules to simplify code.

Review by: rice

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7062 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/DevMode.java b/dev/core/src/com/google/gwt/dev/DevMode.java
index 379519d..6e6c309 100644
--- a/dev/core/src/com/google/gwt/dev/DevMode.java
+++ b/dev/core/src/com/google/gwt/dev/DevMode.java
@@ -38,6 +38,8 @@
 import java.io.File;
 import java.io.IOException;
 import java.net.BindException;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * The main executable class for the hosted mode shell. NOTE: the public API for
@@ -254,6 +256,8 @@
    */
   private ServletContainer server;
 
+  private final Map<String, ModuleDef> startupModules = new HashMap<String, ModuleDef>();
+
   /**
    * Tracks whether we created a temp workdir that we need to destroy.
    */
@@ -388,6 +392,16 @@
   }
 
   @Override
+  protected ModuleDef loadModule(TreeLogger logger, String moduleName,
+      boolean refresh) throws UnableToCompleteException {
+    if (startupModules.containsKey(moduleName)) {
+      // First load of a startup module; remove from list, no need to refresh.
+      return startupModules.remove(moduleName);
+    }
+    return super.loadModule(logger, moduleName, refresh);
+  }
+
+  @Override
   protected synchronized void produceOutput(TreeLogger logger,
       StandardLinkerContext linkerStack, ArtifactSet artifacts,
       ModuleDef module, boolean isRelink) throws UnableToCompleteException {
diff --git a/dev/core/src/com/google/gwt/dev/DevModeBase.java b/dev/core/src/com/google/gwt/dev/DevModeBase.java
index 17e8b29..e58db6f 100644
--- a/dev/core/src/com/google/gwt/dev/DevModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/DevModeBase.java
@@ -54,11 +54,9 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
-import java.util.Set;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -97,8 +95,6 @@
         // Try to find an existing loaded version of the module def.
         ModuleDef moduleDef = loadModule(logger, moduleName, true);
         assert (moduleDef != null);
-        // Release the hard reference to the module if it is present.
-        startupModules.remove(moduleDef.getName());
 
         ShellModuleSpaceHost host = doCreateShellModuleSpaceHost(logger,
             moduleDef.getCompilationState(logger), moduleDef);
@@ -575,8 +571,6 @@
     }
   }
 
-  protected static final Map<String, ModuleDef> startupModules = new HashMap<String, ModuleDef>();
-
   private static final Random RNG = new Random();
 
   private static final AtomicLong uniqueId = new AtomicLong();
@@ -656,14 +650,6 @@
   protected DevModeUI ui = null;
   protected TreeLogger.Type baseLogLevelForUI = null;
 
-  /**
-   * 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 final Semaphore blockUntilDone = new Semaphore(0);
 
   private BrowserWidgetHost browserHost = new UiBrowserWidgetHostImpl();
@@ -903,10 +889,8 @@
    */
   protected ModuleDef loadModule(TreeLogger logger, String moduleName,
       boolean refresh) throws UnableToCompleteException {
-    refresh &= alreadySeenModules.contains(moduleName);
     ModuleDef moduleDef = ModuleDefLoader.loadFromClassPath(logger, moduleName,
         refresh);
-    alreadySeenModules.add(moduleName);
     assert (moduleDef != null) : "Required module state is absent";
     return moduleDef;
   }