/*
* Copyright (c) 2016 Fraunhofer IGD
*
* All rights reserved. This program and the accompanying materials are made
* available 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Fraunhofer IGD <http://www.igd.fraunhofer.de/>
*/
package de.fhg.igd.mapviewer.server;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdesktop.swingx.mapviewer.DefaultTileFactory;
import org.jdesktop.swingx.mapviewer.TileCache;
import org.jdesktop.swingx.mapviewer.TileInfo;
import org.jdesktop.swingx.mapviewer.TileProvider;
/**
* StatusTileFactory
*
* @author <a href="mailto:simon.templer@igd.fhg.de">Simon Templer</a>
*
* @version $Id$
*/
public class StatusTileFactory extends DefaultTileFactory {
/**
* Tile load listener
*/
public interface TileLoadListener {
/**
* Called when the tiles have been reseted
*/
public void reset();
/**
* Called when the loading of a tile has started
*
* @param tile the tile
*/
public void loadingStarted(TileInfo tile);
/**
* Called when the loading of a tile has finished
*
* @param tile the tile
*/
public void loadingFinished(TileInfo tile);
/**
* Called when the loading of a tile has failed
*
* @param tile the tile
* @param error the error
*/
public void loadingFailed(TileInfo tile, Throwable error);
/**
* Called when the loading of a tile is retried
*
* @param tile the tile
*/
public void loadingRetry(TileInfo tile);
}
private static final Log log = LogFactory.getLog(StatusTileFactory.class);
private static final Set<TileLoadListener> tileLoadListeners = new HashSet<TileLoadListener>();
/**
* Adds a tile load listener
*
* @param listener the listener
*/
public static void addTileLoadListener(TileLoadListener listener) {
tileLoadListeners.add(listener);
}
/**
* Removes a tile load listener
*
* @param listener the listener
*/
public static void removeTileLoadListener(TileLoadListener listener) {
tileLoadListeners.remove(listener);
}
private synchronized static void fireReset() {
log.debug("Tile load reset"); //$NON-NLS-1$
for (TileLoadListener l : tileLoadListeners) {
l.reset();
}
}
private synchronized static void fireLoadingStarted(final TileInfo tile) {
// log.debug("Tile loading started");
for (TileLoadListener l : tileLoadListeners) {
l.loadingStarted(tile);
}
}
private synchronized static void fireLoadingFinished(final TileInfo tile) {
// log.debug("Tile loading finished");
for (TileLoadListener l : tileLoadListeners) {
l.loadingFinished(tile);
}
}
private synchronized static void fireLoadingFailed(final TileInfo tile, final Throwable error) {
// log.warn("Tile loading failed", error);
for (TileLoadListener l : tileLoadListeners) {
l.loadingFailed(tile, error);
}
}
private synchronized static void fireLoadingRetry(final TileInfo tile) {
log.debug("Tile loading retry"); //$NON-NLS-1$
for (TileLoadListener l : tileLoadListeners) {
l.loadingRetry(tile);
}
}
/**
* Constructor
*
* @param tileProvider the tile provider
* @param cache the tile cache
*/
public StatusTileFactory(TileProvider tileProvider, TileCache cache) {
super(tileProvider, cache);
fireReset();
}
private class StatusTileRunner extends TileRunner {
@Override
protected void onFailed(TileInfo tile, Throwable error) {
super.onFailed(tile, error);
fireLoadingFailed(tile, error);
}
@Override
protected void onLoaded(TileInfo tile) {
super.onLoaded(tile);
fireLoadingFinished(tile);
}
@Override
protected void onOutOfMem(TileInfo tile) {
super.onOutOfMem(tile);
fireLoadingFailed(tile, null);
}
@Override
protected void onRetry(TileInfo tile, int triesLeft, Throwable error) {
super.onRetry(tile, triesLeft, error);
fireLoadingRetry(tile);
}
}
/**
* @see DefaultTileFactory#createTileRunner(TileInfo)
*/
@Override
protected Runnable createTileRunner(TileInfo tile) {
fireLoadingStarted(tile);
return new StatusTileRunner();
}
/**
* @see DefaultTileFactory#cleanup()
*/
@Override
public void clearCache() {
super.clearCache();
fireReset();
}
}