/* * TileCache.java * * Created on January 2, 2007, 7:17 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package org.jdesktop.swingx.mapviewer; import java.awt.image.BufferedImage; import java.net.URI; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; /** * An implementation only class for now. For internal use only. * * @author joshua.marinacci@sun.com */ public class DefaultTileCache extends AbstractBufferedImageTileCache { private final Map<URI, BufferedImage> imgmap = new HashMap<URI, BufferedImage>(); private final LinkedList<URI> imgmapAccessQueue = new LinkedList<URI>(); private int imagesize = 0; // private Map<URI, byte[]> bytemap = new HashMap<URI, byte[]>(); // private LinkedList<URI> bytemapAccessQueue = new LinkedList<URI>(); // private int bytesize = 0; /** * Default constuctor. */ public DefaultTileCache() { } /** * @see AbstractBufferedImageTileCache#doPut(TileInfo, BufferedImage) */ @Override protected void doPut(TileInfo tile, BufferedImage image) { addToImageCache(tile.getIdentifier(), image); } /** * @see AbstractBufferedImageTileCache#doGet(TileInfo) */ @Override public BufferedImage doGet(TileInfo tile) { URI uri = tile.getIdentifier(); synchronized (imgmap) { if (imgmap.containsKey(uri)) { imgmapAccessQueue.remove(uri); imgmapAccessQueue.addLast(uri); return imgmap.get(uri); } } /* * synchronized (bytemap) { if (bytemap.containsKey(uri)) { p( * "retrieving from bytes"); bytemapAccessQueue.remove(uri); * bytemapAccessQueue.addLast(uri); BufferedImage img = ImageIO.read(new * ByteArrayInputStream(bytemap.get(uri))); addToImageCache(uri, img); * return img; } } */ return null; } /** * @see TileCache#clear() */ @Override public void clear() { imgmap.clear(); p("HACK! need more memory: freeing up memory"); } private void addToImageCache(final URI uri, final BufferedImage img) { if (img == null) return; synchronized (imgmap) { while (imagesize > 1000 * 1000 * 50 && !imgmapAccessQueue.isEmpty()) { URI olduri = imgmapAccessQueue.removeFirst(); BufferedImage oldimg = imgmap.remove(olduri); if (oldimg != null) { imagesize -= oldimg.getWidth() * oldimg.getHeight() * 4; } p("removed 1 img from image cache"); } imgmap.put(uri, img); imagesize += img.getWidth() * img.getHeight() * 4; imgmapAccessQueue.addLast(uri); } /* * p("added to cache: " + " uncompressed = " + imgmap.keySet().size() + * " / " + imagesize / 1000 + "k" + " compressed = " + * bytemap.keySet().size() + " / " + bytesize / 1000 + "k"); */ } @SuppressWarnings("unused") private void p(String string) { // System.out.println(string); } }