Changeset 10808


Ignore:
Timestamp:
05/07/11 15:42:06 (9 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.