package com.github.jarlakxen.scala.sbt.jobs; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.core.ILaunch; import com.github.jarlakxen.scala.sbt.SbtPlugin; import com.github.jarlakxen.scala.sbt.action.UpdateProjectConfigurationAction; import com.github.jarlakxen.scala.sbt.util.ProjectUtils; import com.github.jarlakxen.scala.sbt.util.UIUtil; public class UpdateProjectJob extends WorkspaceJob { private IProject project; public UpdateProjectJob(IProject project) { super("Updating SBT Project"); this.project = project; } @Override public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { try { ISchedulingRule rules = ProjectUtils.mutexRuleFor(project); Job.getJobManager().beginRule(rules, monitor); monitor.beginTask("Updating SBT Project", 4); ILaunch launch = new UpdateProjectConfigurationAction().runFor(project); while (!launch.getProcesses()[0].isTerminated()) { Thread.sleep(500); } Job.getJobManager().endRule(rules); monitor.worked(1); if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } // refresh monitor.setTaskName("Refreshing the project..."); project.refreshLocal(IResource.DEPTH_INFINITE, null); monitor.worked(1); monitor.setTaskName("Update project nature..."); SbtPlugin.addProjectNatures(project); monitor.worked(1); monitor.setTaskName("Refreshing the project..."); project.refreshLocal(IResource.DEPTH_INFINITE, null); monitor.worked(1); monitor.done(); return Status.OK_STATUS; } catch (Exception ex) { UIUtil.showErrorDialog(ex.toString()); SbtPlugin.logException(ex); return Status.CANCEL_STATUS; } } }