/******************************************************************************* * Copyright (c) 2014 Red Hat. * 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: * Red Hat - Initial Contribution *******************************************************************************/ package org.eclipse.linuxtools.internal.docker.core; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; public class ProgressJob extends Job { private int percentageDone = 0; private int percentageChange = 0; private Object lockObject = new Object(); private String jobName; public ProgressJob(String name, String jobName) { super(name); this.jobName = jobName; } @Override protected IStatus run(IProgressMonitor monitor) { monitor.beginTask(jobName, 100); boolean done = false; while (!done) { if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } // if work percentage has changed...add new amount int change = getPercentageChange(); if (change > 0) { monitor.worked(change); setPercentageChange(0); } // if we are 100% or more done, then we are done if (percentageDone >= 100) { done = true; } // otherwise, sleep and then loop again try { Thread.sleep(500); } catch (InterruptedException e) { done = true; } } monitor.done(); return Status.OK_STATUS; } private int getPercentageChange() { synchronized (lockObject) { return percentageChange; } } private void setPercentageChange(int percentChange) { synchronized (lockObject) { this.percentageChange = percentChange; } } public void setPercentageDone(int percentage) { synchronized (lockObject) { if (percentage > percentageDone) { percentageChange = percentage - percentageDone; percentageDone = percentage; } } } }