Package org.shiftone.cache.util

Source Code of org.shiftone.cache.util.WeakMap

package org.shiftone.cache.util;



import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.*;


/**
* @version $Revision: 1.5 $
* @author <a href="mailto:jeff@shiftone.org">Jeff Drost</a>
*/
public class WeakMap implements Map
{

    private static final Log LOG            = new Log(WeakMap.class);
    private ReferenceQueue   referenceQueue = new ReferenceQueue();
    private Map              referenceMap   = new TreeMap();

    public Object put(Object key, Object value)
    {

        purge();

        return referenceMap.put(key, new KeyedWeakReference(key, value));
    }


    public void putAll(Map map)
    {

        Set      set      = map.entrySet();
        Iterator iterator = set.iterator();

        while (iterator.hasNext())
        {
            Map.Entry entry = (Map.Entry) iterator.next();

            put(entry.getKey(), entry.getValue());
        }
    }


    public Object get(Object key)
    {

        purge();

        Reference ref = (Reference) referenceMap.get(key);

        return (ref != null)
               ? ref.get()
               : null;
    }


    public void clear()
    {
        purge();
        referenceMap.clear();
    }


    public Object remove(Object key)
    {

        purge();

        return referenceMap.remove(key);
    }


    public Set keySet()
    {

        purge();

        return referenceMap.keySet();
    }


    public boolean containsKey(Object key)
    {

        purge();

        return referenceMap.containsKey(key);
    }


    public int size()
    {

        purge();

        return referenceMap.size();
    }


    public boolean isEmpty()
    {

        purge();

        return referenceMap.isEmpty();
    }


    public void purge()
    {

        KeyedWeakReference ref;

        while ((ref = (KeyedWeakReference) referenceQueue.poll()) != null)
        {
            LOG.info("referenceQueue purge : " + ref.getKey() + " ; size=" + size());
            referenceMap.remove(ref.getKey());
        }
    }


    public boolean containsValue(Object value)
    {
        throw new UnsupportedOperationException("containsValue");
    }


    public Collection values()
    {
        throw new UnsupportedOperationException("values");
    }


    public Set entrySet()
    {
        throw new UnsupportedOperationException("entrySet");
    }


    class KeyedWeakReference extends WeakReference
    {

        private final Object key;

        public KeyedWeakReference(Object key, Object referent)
        {

            super(referent, referenceQueue);

            this.key = key;
        }


        public Object getKey()
        {
            return key;
        }
    }
}
TOP

Related Classes of org.shiftone.cache.util.WeakMap

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.