Make ExternalPermutationWorker bind sockets lazily.

Change-Id: I257681a903cba1dd77b41efd4343b10dcf527ffb
diff --git a/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java b/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java
index d221129..b6d4573 100644
--- a/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java
+++ b/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java
@@ -347,11 +347,12 @@
     }
   }
 
-  private ServerSocket sock;
+  private ServerSocket sock = null;
 
   @Override
   public Collection<PermutationWorker> getWorkers(TreeLogger logger,
       UnifiedAst unifiedAst, int numWorkers) throws UnableToCompleteException {
+    ensureSocket(logger);
     File astFile;
     try {
       astFile = File.createTempFile("externalPermutationWorkerFactory", ".ser");
@@ -379,7 +380,14 @@
   }
 
   @Override
-  public void init(TreeLogger logger) throws UnableToCompleteException {
+  public boolean isLocal() {
+    return true;
+  }
+
+  private synchronized void ensureSocket(TreeLogger logger) throws UnableToCompleteException {
+    if (sock != null) {
+      return;
+    }
     try {
       sock = new ServerSocket();
       /*
@@ -397,9 +405,4 @@
       throw new UnableToCompleteException();
     }
   }
-
-  @Override
-  public boolean isLocal() {
-    return true;
-  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java b/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java
index 5246fab..37475ec 100644
--- a/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java
+++ b/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java
@@ -297,7 +297,6 @@
         Class<? extends PermutationWorkerFactory> clazz = Class.forName(
             className).asSubclass(PermutationWorkerFactory.class);
         PermutationWorkerFactory factory = clazz.newInstance();
-        factory.init(logger);
         mutableFactories.add(factory);
         if (logger.isLoggable(TreeLogger.SPAM)) {
           logger.log(TreeLogger.SPAM, "Added PermutationWorkerFactory "
@@ -377,11 +376,6 @@
       UnifiedAst unifiedAst, int numWorkers) throws UnableToCompleteException;
 
   /**
-   * Initialize the PermutationWorkerFactory.
-   */
-  public abstract void init(TreeLogger logger) throws UnableToCompleteException;
-
-  /**
    * Indicates if the PermutationWorkers created by the factory consume
    * computational or memory resources on the local system, as opposed to the
    * per-permutation work being performed on a remote system.
diff --git a/dev/core/src/com/google/gwt/dev/ThreadedPermutationWorkerFactory.java b/dev/core/src/com/google/gwt/dev/ThreadedPermutationWorkerFactory.java
index 673be66..be4f28f 100644
--- a/dev/core/src/com/google/gwt/dev/ThreadedPermutationWorkerFactory.java
+++ b/dev/core/src/com/google/gwt/dev/ThreadedPermutationWorkerFactory.java
@@ -100,11 +100,6 @@
   }
 
   @Override
-  public void init(TreeLogger logger) throws UnableToCompleteException {
-    logger.log(TreeLogger.SPAM, "Initializing ThreadedPermutationWorkerFactory");
-  }
-
-  @Override
   public boolean isLocal() {
     return true;
   }