package org.wikiwebserver.core;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

public final class ForgetfulMap<K, V> extends LinkedHashMap<K, V> {
        
    private static final long serialVersionUID = 1l;  
    
    private int maxEntries;        
    
    public ForgetfulMap(int maxEntries) {
        this(null, maxEntries);
    }
    
    @SuppressWarnings("unchecked")
	public ForgetfulMap(Map<K, V> initialEntries, int maxEntries) {
        super(100, 0.75f, true);
        this.maxEntries = maxEntries;
        if (initialEntries != null) {
            synchronized(initialEntries) {
                for (Map.Entry<K, V> entry : initialEntries.entrySet()) {
                    Object obj = entry.getValue();
                    if (obj == null) continue;                  
                    // Convert AtomicLongs to immutable Longs
                    if (obj instanceof AtomicLong) {
                        obj = ((AtomicLong)obj).get();
                    }
                    this.put(entry.getKey(), (V) obj);
                }
            }
        }
    }        

    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
       return size() > this.maxEntries;
    }
}

