/******************************************************************************* * Copyright (c) 2010, 2011 Tasktop Technologies 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: * Tasktop Technologies - initial API and implementation * Itema AS - Automatic refresh when a new repo has been added; bug 330910 *******************************************************************************/ package org.eclipse.mylyn.internal.builds.ui; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.mylyn.builds.internal.core.operations.BuildJob; import org.eclipse.mylyn.builds.internal.core.operations.RefreshOperation; import org.eclipse.mylyn.builds.internal.core.util.BuildScheduler; import org.eclipse.mylyn.commons.core.operations.IOperationMonitor; import org.eclipse.mylyn.commons.core.operations.IOperationMonitor.OperationFlag; /** * @author Steffen Pingel * @author Torkild U. Resheim */ public class BuildRefresher implements IPropertyChangeListener { private static final long STARTUP_DELAY = 5 * 1000; private class RefreshJob extends BuildJob { public RefreshJob() { super("Background Builds Refresh"); setUser(false); } @Override protected IStatus doExecute(IOperationMonitor progress) { RefreshOperation refreshOperation = BuildsUiInternal.getFactory().getRefreshOperation(); refreshOperation.addFlag(OperationFlag.BACKGROUND); return refreshOperation.doExecute(progress); } }; private boolean running; private final IPreferenceStore preferenceStore; private final BuildScheduler scheduler; public BuildRefresher(IPreferenceStore preferenceStore, BuildScheduler scheduler) { this.preferenceStore = preferenceStore; this.scheduler = scheduler; } private RefreshJob refreshJob; private long getInterval() { return preferenceStore.getLong(BuildsUiInternal.PREF_AUTO_REFRESH_INTERVAL); } public boolean isEnabled() { return running && preferenceStore.getBoolean(BuildsUiInternal.PREF_AUTO_REFRESH_ENABLED); } public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(BuildsUiInternal.PREF_AUTO_REFRESH_ENABLED) || event.getProperty().equals(BuildsUiInternal.PREF_AUTO_REFRESH_INTERVAL)) { reschedule(0L); } } public void start() { if (running) { throw new IllegalStateException(); } preferenceStore.addPropertyChangeListener(this); running = true; reschedule(STARTUP_DELAY); } /** * Performs an immediate one-shot refresh of build server data regardless of the automatic refresh preference * setting. */ void refresh() { if (refreshJob == null) { refreshJob = new RefreshJob(); refreshJob.setSystem(true); } scheduler.schedule(refreshJob, 0); } private synchronized void reschedule(long delay) { if (isEnabled()) { if (refreshJob == null) { refreshJob = new RefreshJob(); refreshJob.setSystem(true); refreshJob.addJobChangeListener(new JobChangeAdapter() { @Override public void done(IJobChangeEvent event) { if (running) { reschedule(getInterval()); } } }); } scheduler.schedule(refreshJob, delay); } else { if (refreshJob != null) { refreshJob.cancel(); } } } public synchronized void stop() { if (!running) { return; } running = false; preferenceStore.removePropertyChangeListener(this); if (refreshJob != null) { refreshJob.cancel(); } } }