Bug 572128: Move startup code into Workspace

The start code for the plugin can be migrated to run inside Workspace
without changing existing behaviour.

Change-Id: Ifef1711b809344a6ddee0f9f68c9c6deee81f671
Signed-off-by: Alex Blewitt <alex.blewitt@gmail.com>
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
index 8d9ecab..9c4b4a6 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
@@ -30,6 +30,7 @@
 import org.eclipse.core.filesystem.URIUtil;
 import org.eclipse.core.internal.events.*;
 import org.eclipse.core.internal.localstore.FileSystemResourceManager;
+import org.eclipse.core.internal.preferences.PreferencesService;
 import org.eclipse.core.internal.properties.IPropertyManager;
 import org.eclipse.core.internal.properties.PropertyManager2;
 import org.eclipse.core.internal.refresh.RefreshManager;
@@ -1848,6 +1849,20 @@
 		}
 	}
 
+	/*
+	 * Add the project scope to the preference service's default look-up order so
+	 * people get it for free
+	 */
+	private void initializePreferenceLookupOrder() {
+		PreferencesService service = PreferencesService.getDefault();
+		String[] original = service.getDefaultDefaultLookupOrder();
+		List<String> newOrder = new ArrayList<>();
+		// put the project scope first on the list
+		newOrder.add(ProjectScope.SCOPE);
+		newOrder.addAll(Arrays.asList(original));
+		service.setDefaultDefaultLookupOrder(newOrder.toArray(new String[newOrder.size()]));
+	}
+
 	/**
 	 * A team hook hasn't been initialized. Check the extension point and
 	 * try to create a new hook if a user has one defined as an extension.
@@ -2186,6 +2201,12 @@
 	 * @see ResourcesPlugin#getWorkspace()
 	 */
 	public IStatus open(IProgressMonitor monitor) throws CoreException {
+		if (!localMetaArea.hasSavedWorkspace()) {
+			localMetaArea.createMetaArea();
+		}
+		PlatformURLResourceConnection.startup(getRoot().getLocation());
+		initializePreferenceLookupOrder();
+
 		// This method is not inside an operation because it is the one responsible for
 		// creating the WorkManager object (who takes care of operations).
 		String message = Messages.resources_workspaceOpen;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/ResourcesPlugin.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/ResourcesPlugin.java
index 636b3a8..0b06c2f 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/ResourcesPlugin.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/ResourcesPlugin.java
@@ -18,9 +18,9 @@
  *******************************************************************************/
 package org.eclipse.core.resources;
 
-import java.util.*;
-import org.eclipse.core.internal.preferences.PreferencesService;
-import org.eclipse.core.internal.resources.*;
+import java.util.Hashtable;
+import org.eclipse.core.internal.resources.CheckMissingNaturesListener;
+import org.eclipse.core.internal.resources.Workspace;
 import org.eclipse.core.internal.utils.Messages;
 import org.eclipse.core.internal.utils.Policy;
 import org.eclipse.core.runtime.*;
@@ -373,24 +373,6 @@
 	}
 
 	/**
-	 * Constructs a brand new workspace structure at the location in the local file system
-	 * identified by the given path and returns a new workspace object.
-	 *
-	 * @exception CoreException if the workspace structure could not be constructed.
-	 * Reasons include:
-	 * <ul>
-	 * <li> There is an existing workspace structure on at the given location
-	 *      in the local file system.
-	 * <li> A file exists at the given location in the local file system.
-	 * <li> A directory could not be created at the given location in the
-	 *      local file system.
-	 * </ul>
-	 */
-	private static void constructWorkspace() throws CoreException {
-		new LocalMetaArea().createMetaArea();
-	}
-
-	/**
 	 * Returns the encoding to use when reading text files in the workspace.
 	 * This is the value of the <code>PREF_ENCODING</code> preference, or the
 	 * file system encoding (<code>System.getProperty("file.encoding")</code>)
@@ -477,15 +459,9 @@
 		Hashtable<String, String> properties = new Hashtable<>(2);
 		properties.put(DebugOptions.LISTENER_SYMBOLICNAME, PI_RESOURCES);
 		debugRegistration = context.registerService(DebugOptionsListener.class, Policy.RESOURCES_DEBUG_OPTIONS_LISTENER, properties);
-
-		if (!new LocalMetaArea().hasSavedWorkspace()) {
-			constructWorkspace();
-		}
 		// Remember workspace before opening, to
 		// make it easier to debug cases where open() is failing.
 		workspace = new Workspace();
-		PlatformURLResourceConnection.startup(workspace.getRoot().getLocation());
-		initializePreferenceLookupOrder();
 		IStatus result = workspace.open(null);
 		if (!result.isOK())
 			getLog().log(result);
@@ -495,17 +471,4 @@
 		InstanceScope.INSTANCE.getNode(PI_RESOURCES).addPreferenceChangeListener(checkMissingNaturesListener);
 	}
 
-	/*
-	 * Add the project scope to the preference service's default look-up order so
-	 * people get it for free
-	 */
-	private void initializePreferenceLookupOrder() {
-		PreferencesService service = PreferencesService.getDefault();
-		String[] original = service.getDefaultDefaultLookupOrder();
-		List<String> newOrder = new ArrayList<>();
-		// put the project scope first on the list
-		newOrder.add(ProjectScope.SCOPE);
-		newOrder.addAll(Arrays.asList(original));
-		service.setDefaultDefaultLookupOrder(newOrder.toArray(new String[newOrder.size()]));
-	}
 }