| //------------------------------------------------------------------------------ |
| // 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; |
| } |
| } |