package org.wikiwebserver.core;

import java.util.LinkedHashMap;
import java.util.Map;

public class WikiCacheMap extends LinkedHashMap<String, WikiCacheItem> {

    private static final long serialVersionUID = 1L;

    private static final int MAX_CACHE_SIZE = ConfigManager.getInt("wiki-cache-max-size");  
    
    private static long cacheSize;
    
    @Override    
    public void clear() {
        cacheSize = 0;
        super.clear();
    }
    
    @Override
    public WikiCacheItem remove(Object key) {
        WikiCacheItem oldItem = super.remove(key);
        if (oldItem != null) {
            cacheSize -= oldItem.getDataStream().size();
        }
        return oldItem;
    }     
    
    @Override
    public WikiCacheItem put(String key, WikiCacheItem item) {
        cacheSize += item.getDataStream().size();
        WikiCacheItem oldItem = super.put(key, item);
        if (oldItem != null) {
            cacheSize -= oldItem.getDataStream().size();
        }
        return oldItem;
    }
    
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, WikiCacheItem> eldest) {
        boolean cacheOverMaximum = cacheSize > MAX_CACHE_SIZE;
        if (cacheOverMaximum) {
            cacheSize -= eldest.getValue().getDataStream().size();
        }
        return cacheOverMaximum;
    }    
    
    long sizeInBytes() {
        return cacheSize;
    }
}

