/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Eclipse Public License, Version 1.0, * which accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html * */ package net.rim.ejde.internal.imports; import java.lang.reflect.InvocationTargetException; import net.rim.ejde.internal.ui.wizards.BlackBerryElementWizard; import org.apache.log4j.Logger; 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.OperationCanceledException; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.operation.IThreadListener; /** * This class is a help class to create a workspace runnable task which can batch workspace resource change events and broadcast * them after the job is done. * * */ public class WorkspaceRunnableAdapter implements IRunnableWithProgress, IThreadListener { static private final Logger _log = Logger.getLogger( BlackBerryElementWizard.class ); private IWorkspaceRunnable _runnable; private ISchedulingRule _rule; private boolean _transfer; /** * Runs a workspace runnable with the workspace lock. * * @param runnable * the runnable */ public WorkspaceRunnableAdapter( IWorkspaceRunnable runnable ) { this( runnable, ResourcesPlugin.getWorkspace().getRoot() ); } /** * Runs a workspace runnable with the given lock or <code>null</code> to run with no lock at all. * * @param runnable * the runnable * @param rule * the scheduling rule, or <code>null</code> */ public WorkspaceRunnableAdapter( IWorkspaceRunnable runnable, ISchedulingRule rule ) { _runnable = runnable; _rule = rule; } /** * Runs a workspace runnable with the given lock or <code>null</code> to run with no lock at all. * * @param runnable * the runnable * @param rule * the scheduling rule, or <code>null</code> * @param transfer * <code>true</code> if the rule is to be transfered to the modal context thread */ public WorkspaceRunnableAdapter( IWorkspaceRunnable runnable, ISchedulingRule rule, boolean transfer ) { _runnable = runnable; _rule = rule; _transfer = transfer; } public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException { try { JavaCore.run( _runnable, _rule, monitor ); } catch( OperationCanceledException e ) { _log.error( e ); throw new InterruptedException( e.getMessage() ); } catch( CoreException e ) { _log.error( e ); throw new InvocationTargetException( e ); } } public void threadChange( Thread thread ) { if( _transfer ) { Job.getJobManager().transferRule( _rule, thread ); } } }