Move workspace initialization out of BlazeRuntime.Builder.

Require all callers to call initWorkspace after BlazeRuntime construction.

--
MOS_MIGRATED_REVID=129842292
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index bdc8652..4362c00 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -176,6 +176,7 @@
 
   public void initWorkspace(BlazeDirectories directories, BinTools binTools)
       throws AbruptExitException {
+    Preconditions.checkState(this.workspace == null);
     boolean watchFS = startupOptionsProvider != null
         && startupOptionsProvider.getOptions(BlazeServerStartupOptions.class).watchFS;
     WorkspaceBuilder builder = new WorkspaceBuilder(directories, binTools, watchFS);
@@ -919,27 +920,11 @@
 
     ServerDirectories serverDirectories =
         new ServerDirectories(installBasePath, outputBasePath, startupOptions.installMD5);
-    BlazeDirectories directories =
-        new BlazeDirectories(
-            serverDirectories, workspaceDirectoryPath, startupOptions.deepExecRoot, productName);
-
     Clock clock = BlazeClock.instance();
-
-    BinTools binTools;
-    try {
-      binTools = BinTools.forProduction(directories);
-    } catch (IOException e) {
-      throw new AbruptExitException(
-          "Cannot enumerate embedded binaries: " + e.getMessage(),
-          ExitCode.LOCAL_ENVIRONMENTAL_ERROR);
-    }
-
     BlazeRuntime.Builder runtimeBuilder = new BlazeRuntime.Builder()
         .setProductName(productName)
         .setServerDirectories(serverDirectories)
-        .setDirectories(directories)
         .setStartupOptionsProvider(options)
-        .setBinTools(binTools)
         .setClock(clock)
         // TODO(bazel-team): Make BugReportingExceptionHandler the default.
         // See bug "Make exceptions in EventBus subscribers fatal"
@@ -959,6 +944,20 @@
     }
 
     BlazeRuntime runtime = runtimeBuilder.build();
+
+    BlazeDirectories directories =
+        new BlazeDirectories(
+            serverDirectories, workspaceDirectoryPath, startupOptions.deepExecRoot, productName);
+    BinTools binTools;
+    try {
+      binTools = BinTools.forProduction(directories);
+    } catch (IOException e) {
+      throw new AbruptExitException(
+          "Cannot enumerate embedded binaries: " + e.getMessage(),
+          ExitCode.LOCAL_ENVIRONMENTAL_ERROR);
+    }
+    runtime.initWorkspace(directories, binTools);
+
     AutoProfiler.setClock(runtime.getClock());
     BugReport.setRuntime(runtime);
     return runtime;
@@ -1031,19 +1030,16 @@
    */
   public static class Builder {
     private ServerDirectories serverDirectories;
-    private BlazeDirectories directories;
     private Clock clock;
     private OptionsProvider startupOptionsProvider;
     private final List<BlazeModule> blazeModules = new ArrayList<>();
     private SubscriberExceptionHandler eventBusExceptionHandler = new RemoteExceptionHandler();
-    private BinTools binTools;
     private UUID instanceId;
     private String productName;
 
     public BlazeRuntime build() throws AbruptExitException {
       Preconditions.checkNotNull(productName);
       Preconditions.checkNotNull(serverDirectories);
-      Preconditions.checkNotNull(directories);
       Preconditions.checkNotNull(startupOptionsProvider);
       Clock clock = (this.clock == null) ? BlazeClock.instance() : this.clock;
       UUID instanceId =  (this.instanceId == null) ? UUID.randomUUID() : this.instanceId;
@@ -1110,22 +1106,19 @@
         }
       }
 
-      BlazeRuntime runtime =
-          new BlazeRuntime(
-              serverBuilder.getQueryEnvironmentFactory(),
-              packageFactory,
-              ruleClassProvider,
-              configurationFactory,
-              clock,
-              startupOptionsProvider,
-              ImmutableList.copyOf(blazeModules),
-              eventBusExceptionHandler,
-              projectFileProvider,
-              serverBuilder.getInvocationPolicy(),
-              serverBuilder.getCommands(),
-              productName);
-      runtime.initWorkspace(directories, binTools);
-      return runtime;
+      return new BlazeRuntime(
+          serverBuilder.getQueryEnvironmentFactory(),
+          packageFactory,
+          ruleClassProvider,
+          configurationFactory,
+          clock,
+          startupOptionsProvider,
+          ImmutableList.copyOf(blazeModules),
+          eventBusExceptionHandler,
+          projectFileProvider,
+          serverBuilder.getInvocationPolicy(),
+          serverBuilder.getCommands(),
+          productName);
     }
 
     public Builder setProductName(String productName) {
@@ -1133,27 +1126,11 @@
       return this;
     }
 
-    public Builder setBinTools(BinTools binTools) {
-      this.binTools = binTools;
-      return this;
-    }
-
     public Builder setServerDirectories(ServerDirectories serverDirectories) {
       this.serverDirectories = serverDirectories;
       return this;
     }
 
-    public Builder setDirectories(BlazeDirectories directories) {
-      this.directories = directories;
-      return this;
-    }
-
-    /** Creates and sets a new {@link BlazeDirectories} instance with the given parameters. */
-    public Builder setDirectories(
-        Path installBase, Path outputBase, Path workspace, String productName) {
-      return setDirectories(new BlazeDirectories(installBase, outputBase, workspace, productName));
-    }
-
     public Builder setClock(Clock clock) {
       this.clock = clock;
       return this;