Changeset 10808


Ignore:
Timestamp:
May 7, 2011, 3:42:06 PM (10 years ago)
Author:
mlg
Message:

Adds a maximum size for the cache
Will limit memory consumption.

Location:
extensions/jiwigo/trunk/src/main/java/fr/mael/jiwigo/transverse
Files:
2 added
1 edited

Legend:

Unmodified
Added
Removed
  • extensions/jiwigo/trunk/src/main/java/fr/mael/jiwigo/transverse/ImagesManagement.java

    r10697 r10808  
    33import java.awt.image.BufferedImage;
    44import java.net.URL;
     5import java.util.ArrayList;
     6import java.util.Collections;
     7import java.util.Date;
    58import java.util.HashMap;
     9import java.util.Iterator;
    610import java.util.List;
     11import java.util.Map;
    712
    813import javax.imageio.ImageIO;
     
    6469     * cache allows to keep the images in the ram
    6570     */
    66     private HashMap<Integer, BufferedImage> imageCache = new HashMap<Integer, BufferedImage>();
     71    private HashMap<Integer, CacheObjectManagement> imageCache = new HashMap<Integer, CacheObjectManagement>();
    6772
    6873    /**
    6974     * cache allows to keep the thumbnails in the ram
    7075     */
    71     private HashMap<Integer, BufferedImage> thumbnailsCache = new HashMap<Integer, BufferedImage>();
     76    private HashMap<Integer, CacheObjectManagement> thumbnailsCache = new HashMap<Integer, CacheObjectManagement>();
    7277
    7378    /**
     
    96101     */
    97102    private Integer currentCategory = -1;
     103
     104    private static Integer IMAGE_CACHE_SIZE = 20;
    98105
    99106    /**
     
    170177
    171178    /**
     179     * Method that allows to keep a maximum number of images in the cache
     180     * @param cache
     181     * @param maxSize
     182     */
     183    private void checkCache(HashMap<Integer, CacheObjectManagement> cache, Integer maxSize) {
     184        if (cache.size() == maxSize) {
     185            Integer objectsToRemove = (maxSize / 4);
     186            if (LOG.isDebugEnabled()) {
     187                LOG.debug("Cache has reached max size cleaning " + objectsToRemove + " objects");
     188            }
     189            ArrayList as = new ArrayList(cache.entrySet());
     190
     191            Collections.sort(as, new CacheObjectManagementComparator());
     192            Iterator i = as.iterator();
     193            for (int j = 0; j < objectsToRemove; j++) {
     194                Integer key = (Integer) ((Map.Entry) i.next()).getKey();
     195                if (LOG.isDebugEnabled()) {
     196                    CacheObjectManagement cacheObject = cache.get(key);
     197                    String debugStr = "";
     198                    for (Integer id : cache.keySet()) {
     199                        debugStr += "\t" + id + " : " + cache.get(id).getLastAccessDate() + "\n";
     200                    }
     201                    LOG.debug("Available object : \n" + debugStr);
     202                    LOG.debug("Removed object : " + key + " : " + cacheObject.getLastAccessDate());
     203                }
     204
     205                CacheObjectManagement object = cache.remove(key);
     206                object = null;
     207            }
     208            if (LOG.isDebugEnabled()) {
     209                String debugStr = "";
     210                for (Integer id : cache.keySet()) {
     211                    debugStr += "\t" + id + " : " + cache.get(id).getLastAccessDate() + "\n";
     212                }
     213                LOG.debug("Cache size is now " + cache.size() + ". Cache now contains : \n" + debugStr);
     214            }
     215        }
     216    }
     217
     218    /**
    172219     * Function that allows to load images once
    173220     * to decrease response delays
     
    177224        if (imageCache.get(currentImage.getIdentifier()) == null) {
    178225            try {
     226                checkCache(imageCache, IMAGE_CACHE_SIZE);
    179227                BufferedImage img = ImageIO.read(new URL(currentImage.getUrl()));
    180                 imageCache.put(currentImage.getIdentifier(), img);
     228                CacheObjectManagement cacheObject = new CacheObjectManagement(img, new Date());
     229                imageCache.put(currentImage.getIdentifier(), cacheObject);
     230                if (LOG.isDebugEnabled()) {
     231                    LOG.debug("Adding image to cache : " + currentImage.getIdentifier() + " : "
     232                            + cacheObject.getLastAccessDate());
     233                }
    181234            } catch (Exception e) {
    182235                LOG.error(Tools.getStackTrace(e));
    183236            }
    184237        }
    185         return imageCache.get(currentImage.getIdentifier());
     238        CacheObjectManagement cacheObject = imageCache.get(currentImage.getIdentifier());
     239        cacheObject.setLastAccessDate(new Date());
     240        return cacheObject.getImage();
    186241    }
    187242
     
    195250            try {
    196251                BufferedImage img = ImageIO.read(new URL(image.getThumbnailUrl()));
    197                 thumbnailsCache.put(image.getIdentifier(), img);
     252                CacheObjectManagement cacheObject = new CacheObjectManagement(img, new Date());
     253                thumbnailsCache.put(image.getIdentifier(), cacheObject);
    198254            } catch (Exception e) {
    199255                LOG.error(Tools.getStackTrace(e));
    200256            }
    201257        }
    202 
    203         return thumbnailsCache.get(image.getIdentifier());
     258        CacheObjectManagement cacheObject = thumbnailsCache.get(image.getIdentifier());
     259        cacheObject.setLastAccessDate(new Date());
     260        return cacheObject.getImage();
    204261    }
    205262
Note: See TracChangeset for help on using the changeset viewer.