platform35/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/InternalWorkspaceJob.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/InternalWorkspaceJob.java	Thu Jul 30 11:56:23 2009 -0500
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 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 - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.core.internal.resources;
+
+import org.eclipse.core.internal.utils.Policy;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * Batches the activity of a job as a single operation, without obtaining the workspace
+ * lock.
+ */
+public abstract class InternalWorkspaceJob extends Job {
+	private Workspace workspace;
+
+	public InternalWorkspaceJob(String name) {
+		super(name);
+		this.workspace = (Workspace) ResourcesPlugin.getWorkspace();
+	}
+
+	public final IStatus run(IProgressMonitor monitor) {
+		monitor = Policy.monitorFor(monitor);
+		try {
+			int depth = -1;
+			try {
+				workspace.prepareOperation(null, monitor);
+				workspace.beginOperation(true);
+				depth = workspace.getWorkManager().beginUnprotected();
+				return runInWorkspace(monitor);
+			} catch (OperationCanceledException e) {
+				workspace.getWorkManager().operationCanceled();
+				return Status.CANCEL_STATUS;
+			} finally {
+				if (depth >= 0)
+					workspace.getWorkManager().endUnprotected(depth);
+				workspace.endOperation(null, false, monitor);
+			}
+		} catch (CoreException e) {
+			return e.getStatus();
+		}
+	}
+
+	protected abstract IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException;
+}