/*
* SimpleRefreshManager.java
*
* Copyright (C) 2010 Leo Osvald <leo.osvald@gmail.com>
*
* This file is part of SGLJ.
*
* SGLJ is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* SGLJ is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
package org.sglj.sync;
/**
* <p>Simple refresh manager which behaves in the following manner:
* Each registered refreshable component for which auto-refresh
* is enabled is kept refreshed so that no more than
* {@link Refreshable#getMaxRefreshInterval()} milliseconds
* elapse since last refresh. Generally, automatic refreshes occur
* at fixed time intervals, but they are postoponed each time
* a manual refresh occurs.<br>
* For example, if some refreshable component has max refresh interval of 2 s,
* each time {@link Refreshable#refresh()} method is called on it (including
* automatic call from this manager), a new refresh will be scheduled
* automatically so that it occurs exactly 2 seconds later. In case that,
* in the meantime, manual refresh occurs, this refresh will be rescheduled
* so that it occurs again 2 seconds later than last refresh occured.</p>
* <p><b>Note</b>: this manager completely relies on the correct usage
* of the following two methods (by some refreshable components):
* <ul>
* <li> {@link RefreshListener#refreshStarted(RefreshEvent)} </li>
* <li> {@link RefreshListener#refreshed(RefreshEvent)}</li>
* </ul></p>
*
* @author Leo Osvald
* @version 0.82
*/
public class SimpleRefreshManager extends AbstractRefreshManager {
/**
* Constructor.<br>Auto-refresh is on, by default.
*/
public SimpleRefreshManager() {
this(true);
}
/**
* Constructor.
* @param autoRefresh initial autorefresh state
*/
public SimpleRefreshManager(boolean autoRefresh) {
setAutoRefreshEnabled(autoRefresh);
}
@Override
protected boolean decideToProceed(RefreshTimerTask task) {
return !task.refreshable().isRefreshInProgress();
}
@Override
protected RefreshTimerTask scheduleForAutoRefresh(Refreshable refreshable) {
RefreshTimerTask timerTask = new RefreshTimerTask(refreshable);
timer.schedule(timerTask, refreshable.getMaxRefreshInterval());
return timerTask;
}
@Override
public void maxRefreshIntervalChanged(RefreshEvent e) {
//do nothing, just wait for next schedule
}
@Override
public void minRefreshIntervalChanged(RefreshEvent e) {
//do nothing, just wait for next schedule
}
@Override
public void refreshStarted(RefreshEvent e) {
}
@Override
public void refreshed(RefreshEvent e) {
if(!isAutoRefreshEnabled())
return;
Refreshable refreshable = e.getRefreshable();
//just in case, see if refresh task is already scheduled
//and try to cancel it
RefreshTimerTask task = timerTasks.get(refreshable);
if(task != null) {
task.cancel();
}
if(!refreshable.isRefreshInProgress()) {
synchronized (scheduleMutex) {
timerTasks.put(refreshable,
scheduleForAutoRefresh(refreshable));
}
} else {
// System.err.println("Refresh is already in progress"
// +" so DIDN'T schedule!");
}
}
@Override
public void refreshCanceled(RefreshEvent e) {
}
@Override
protected void refreshRejected(RefreshTimerTask task) {
}
}