platform35/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceTreeReader_1.java
changeset 40 eb3c938c7fef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/platform35/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkspaceTreeReader_1.java	Thu Jul 30 11:56:23 2009 -0500
@@ -0,0 +1,260 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.core.internal.resources;
+
+import java.io.*;
+import java.util.*;
+import org.eclipse.core.internal.events.BuilderPersistentInfo;
+import org.eclipse.core.internal.utils.Messages;
+import org.eclipse.core.internal.utils.Policy;
+import org.eclipse.core.internal.watson.ElementTree;
+import org.eclipse.core.internal.watson.ElementTreeReader;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.runtime.*;
+
+/**
+ * Reads version 1 of the workspace tree file format.
+ */
+public class WorkspaceTreeReader_1 extends WorkspaceTreeReader {
+	protected Workspace workspace;
+
+	public WorkspaceTreeReader_1(Workspace workspace) {
+		this.workspace = workspace;
+	}
+
+	protected int getVersion() {
+		return ICoreConstants.WORKSPACE_TREE_VERSION_1;
+	}
+
+	protected void linkBuildersToTrees(List buildersToBeLinked, ElementTree[] trees, int index, IProgressMonitor monitor) {
+		monitor = Policy.monitorFor(monitor);
+		try {
+			ArrayList infos = null;
+			String projectName = null;
+			for (int i = 0; i < buildersToBeLinked.size(); i++) {
+				BuilderPersistentInfo info = (BuilderPersistentInfo) buildersToBeLinked.get(i);
+				if (!info.getProjectName().equals(projectName)) {
+					if (infos != null) { // if it is not the first iteration
+						IProject project = workspace.getRoot().getProject(projectName);
+						workspace.getBuildManager().setBuildersPersistentInfo(project, infos);
+					}
+					projectName = info.getProjectName();
+					infos = new ArrayList(5);
+				}
+				info.setLastBuildTree(trees[index++]);
+				infos.add(info);
+			}
+			if (infos != null) {
+				IProject project = workspace.getRoot().getProject(projectName);
+				workspace.getBuildManager().setBuildersPersistentInfo(project, infos);
+			}
+		} finally {
+			monitor.done();
+		}
+	}
+
+	protected void linkPluginsSavedStateToTrees(List states, ElementTree[] trees, IProgressMonitor monitor) {
+		monitor = Policy.monitorFor(monitor);
+		try {
+			for (int i = 0; i < states.size(); i++) {
+				SavedState state = (SavedState) states.get(i);
+				// If the tree is too old (depends on the policy), the plug-in should not
+				// get it back as a delta. It is expensive to maintain this information too long.
+				final SaveManager saveManager = workspace.getSaveManager();
+				if (!saveManager.isOldPluginTree(state.pluginId)) {
+					state.oldTree = trees[i];
+				} else {
+					//clear information for this plugin from master table
+					saveManager.clearDeltaExpiration(state.pluginId);
+				}
+			}
+		} finally {
+			monitor.done();
+		}
+	}
+
+	protected BuilderPersistentInfo readBuilderInfo(IProject project, DataInputStream input, int index) throws IOException {
+		//read the project name
+		String projectName = input.readUTF();
+		//use the name of the project handle if available
+		if (project != null)
+			projectName = project.getName();
+		String builderName = input.readUTF();
+		return new BuilderPersistentInfo(projectName, builderName, index);
+	}
+
+	protected void readBuildersPersistentInfo(IProject project, DataInputStream input, List builders, IProgressMonitor monitor) throws IOException {
+		monitor = Policy.monitorFor(monitor);
+		try {
+			int builderCount = input.readInt();
+			for (int i = 0; i < builderCount; i++)
+				builders.add(readBuilderInfo(project, input, i));
+		} finally {
+			monitor.done();
+		}
+	}
+
+	protected void readPluginsSavedStates(DataInputStream input, HashMap savedStates, List plugins, IProgressMonitor monitor) throws IOException, CoreException {
+		monitor = Policy.monitorFor(monitor);
+		try {
+			int stateCount = input.readInt();
+			for (int i = 0; i < stateCount; i++) {
+				String pluginId = input.readUTF();
+				SavedState state = new SavedState(workspace, pluginId, null, null);
+				savedStates.put(pluginId, state);
+				plugins.add(state);
+			}
+		} finally {
+			monitor.done();
+		}
+	}
+
+	public ElementTree readSnapshotTree(DataInputStream input, ElementTree complete, IProgressMonitor monitor) throws CoreException {
+		monitor = Policy.monitorFor(monitor);
+		String message;
+		try {
+			message = Messages.resources_readingSnap;
+			monitor.beginTask(message, Policy.totalWork);
+			ElementTreeReader reader = new ElementTreeReader(workspace.getSaveManager());
+			while (input.available() > 0) {
+				readWorkspaceFields(input, Policy.subMonitorFor(monitor, Policy.totalWork / 2));
+				complete = reader.readDelta(complete, input);
+				try {
+					// make sure each snapshot is read by the correct reader
+					int version = input.readInt();
+					if (version != getVersion())
+						return WorkspaceTreeReader.getReader(workspace, version).readSnapshotTree(input, complete, monitor);
+				} catch (EOFException e) {
+					break;
+				}
+			}
+			return complete;
+		} catch (IOException e) {
+			message = Messages.resources_readWorkspaceSnap;
+			throw new ResourceException(IResourceStatus.FAILED_READ_METADATA, null, message, e);
+		} finally {
+			monitor.done();
+		}
+	}
+
+	public void readTree(DataInputStream input, IProgressMonitor monitor) throws CoreException {
+		monitor = Policy.monitorFor(monitor);
+		String message;
+		try {
+			message = Messages.resources_reading;
+			monitor.beginTask(message, Policy.totalWork);
+			readWorkspaceFields(input, Policy.subMonitorFor(monitor, Policy.opWork * 20 / 100));
+
+			HashMap savedStates = new HashMap(20);
+			List pluginsToBeLinked = new ArrayList(20);
+			readPluginsSavedStates(input, savedStates, pluginsToBeLinked, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100));
+			workspace.getSaveManager().setPluginsSavedState(savedStates);
+
+			List buildersToBeLinked = new ArrayList(20);
+			readBuildersPersistentInfo(null, input, buildersToBeLinked, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100));
+
+			ElementTree[] trees = readTrees(Path.ROOT, input, Policy.subMonitorFor(monitor, Policy.opWork * 40 / 100));
+			linkPluginsSavedStateToTrees(pluginsToBeLinked, trees, Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100));
+			linkBuildersToTrees(buildersToBeLinked, trees, pluginsToBeLinked.size(), Policy.subMonitorFor(monitor, Policy.opWork * 10 / 100));
+
+		} catch (IOException e) {
+			message = Messages.resources_readWorkspaceTree;
+			throw new ResourceException(IResourceStatus.FAILED_READ_METADATA, null, message, e);
+		} finally {
+			monitor.done();
+		}
+	}
+
+	public void readTree(IProject project, DataInputStream input, IProgressMonitor monitor) throws CoreException {
+		monitor = Policy.monitorFor(monitor);
+		String message;
+		try {
+			message = Messages.resources_reading;
+			monitor.beginTask(message, 10);
+			/* read the number of builders */
+			int numBuilders = input.readInt();
+
+			/* read in the list of builder names */
+			String[] builderNames = new String[numBuilders];
+			for (int i = 0; i < numBuilders; i++) {
+				String builderName = input.readUTF();
+				builderNames[i] = builderName;
+			}
+			monitor.worked(1);
+
+			/* read and link the trees */
+			ElementTree[] trees = readTrees(project.getFullPath(), input, Policy.subMonitorFor(monitor, 8));
+
+			/* map builder names to trees */
+			if (numBuilders > 0) {
+				ArrayList infos = new ArrayList(trees.length * 2 + 1);
+				for (int i = 0; i < numBuilders; i++) {
+					BuilderPersistentInfo info = new BuilderPersistentInfo(project.getName(), builderNames[i], -1);
+					info.setLastBuildTree(trees[i]);
+					infos.add(info);
+				}
+				workspace.getBuildManager().setBuildersPersistentInfo(project, infos);
+			}
+			monitor.worked(1);
+
+		} catch (IOException e) {
+			message = Messages.resources_readProjectTree;
+			throw new ResourceException(IResourceStatus.FAILED_READ_METADATA, null, message, e);
+		} finally {
+			monitor.done();
+		}
+	}
+
+	/**
+	 * Read trees from disk and link them to the workspace tree.
+	 */
+	protected ElementTree[] readTrees(IPath root, DataInputStream input, IProgressMonitor monitor) throws IOException {
+		monitor = Policy.monitorFor(monitor);
+		try {
+			String message = Messages.resources_reading;
+			monitor.beginTask(message, 4);
+			ElementTreeReader treeReader = new ElementTreeReader(workspace.getSaveManager());
+			ElementTree[] trees = treeReader.readDeltaChain(input);
+			monitor.worked(3);
+			if (root.isRoot()) {
+				//Don't need to link because we're reading the whole workspace.
+				//The last tree in the chain is the complete tree.
+				ElementTree newTree = trees[trees.length - 1];
+				newTree.setTreeData(workspace.tree.getTreeData());
+				workspace.tree = newTree;
+			} else {
+				//splice the restored tree into the current set of trees
+				workspace.linkTrees(root, trees);
+			}
+			monitor.worked(1);
+			return trees;
+		} finally {
+			monitor.done();
+		}
+	}
+
+	protected void readWorkspaceFields(DataInputStream input, IProgressMonitor monitor) throws IOException, CoreException {
+		monitor = Policy.monitorFor(monitor);
+		try {
+			// read the node id 
+			workspace.nextNodeId = input.readLong();
+			// read the modification stamp (no longer used)
+			input.readLong();
+			// read the next marker id
+			workspace.nextMarkerId = input.readLong();
+			// read the synchronizer's registered sync partners
+			((Synchronizer) workspace.getSynchronizer()).readPartners(input);
+		} finally {
+			monitor.done();
+		}
+	}
+}