blob: 715f8d3a5646e71cb1977151fd8a5857b2c2ce8a [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.ui.actions;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.ui.LibraryUIPlugin;
import org.eclipse.epf.library.ui.LibraryUIResources;
import org.eclipse.epf.persistence.util.LibrarySchedulingRule;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
/**
* Runs operation that locks the library for the duration of its execution
*
* @author Phong Nguyen Le
* @since 1.0
*/
public class LibraryLockingOperationRunner implements IRunnableContext {
private IProgressMonitor progressMonitor;
public LibraryLockingOperationRunner() {
}
private void doRun(final IRunnableWithProgress runnable, final boolean workUnknown) throws InvocationTargetException,
InterruptedException {
final InvocationTargetException[] iteHolder = new InvocationTargetException[1];
try {
IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor pm) throws CoreException {
try {
if(workUnknown) {
pm.beginTask("", 2); //$NON-NLS-1$
pm.worked(1);
try {
runnable.run(pm);
pm.worked(2);
}
finally {
pm.done();
}
}
else {
runnable.run(pm);
}
} catch (InvocationTargetException e) {
// Pass it outside the workspace runnable
iteHolder[0] = e;
} catch (InterruptedException e) {
// Re-throw as OperationCanceledException, which will be
// caught and re-thrown as InterruptedException below.
throw new OperationCanceledException(e.getMessage());
}
// CoreException and OperationCanceledException are propagated
}
};
ResourcesPlugin.getWorkspace().run(workspaceRunnable,
new LibrarySchedulingRule(LibraryService.getInstance().getCurrentMethodLibrary()),
IWorkspace.AVOID_UPDATE, getProgressMonitor());
} catch (CoreException e) {
throw new InvocationTargetException(e);
} catch (OperationCanceledException e) {
throw new InterruptedException(e.getMessage());
}
// Re-throw the InvocationTargetException, if any occurred
if (iteHolder[0] != null) {
throw iteHolder[0];
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress)
*/
public void run(boolean fork, boolean cancelable,
final IRunnableWithProgress runnable) throws InvocationTargetException,
InterruptedException {
doRun(runnable, false);
}
public void run(IRunnableWithProgress runnable) {
try {
doRun(runnable, true);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
if(cause instanceof RuntimeException) {
throw (RuntimeException)cause;
}
else {
if(cause == null) {
cause = e;
}
LibraryUIPlugin.getDefault().getLogger().logError(cause);
try {
String msg = cause.getMessage() != null ? cause.getMessage() : cause.toString();
LibraryUIPlugin.getDefault().getMsgDialog().displayError(LibraryUIResources.errorDialog_title, msg, cause);
}
catch(Exception ex) {
}
}
} catch (InterruptedException e) {
return;
}
}
/**
* @return
*/
public IProgressMonitor getProgressMonitor() {
if(progressMonitor == null) {
progressMonitor = new NullProgressMonitor();
}
return progressMonitor;
}
/**
* @param progressMonitor the progressMonitor to set
*/
public void setProgressMonitor(IProgressMonitor progressMonitor) {
this.progressMonitor = progressMonitor;
}
}