package gnu.classpath;

import java.util.Hashtable;
import java.util.IdentityHashMap;
import java.util.Map;

public class ClassLoaderCache
{
    private static IdentityHashMap bootClassLoaderCache = new IdentityHashMap();

    public final Object get(ClassLoader cl, Object key)
    {
        return getCache(cl).get(key);
    }
	
    public final Object put(ClassLoader cl, Object key, Object value)
    {
        return getCache(cl).put(key, value);
    }
	
    public final boolean containsKey(ClassLoader cl, Object key)
    {
        return getCache(cl).containsKey(key);
    }

    public final boolean containsValue(ClassLoader cl, Object value)
    {
        return getCache(cl).containsValue(value);
    }
	
    public final void clear(ClassLoader cl)
    {
        getCache(cl).clear();
    }

    protected Map newMap()
    {
        return new Hashtable();
    }

    private Map getCache(ClassLoader cl)
    {
        IdentityHashMap map;
        if (cl == null)
        {
            map = bootClassLoaderCache;
        }
        else
        {
            map = VMClassLoaderCache.getMap(cl);
        }
        synchronized (map)
        {
            Map h = (Map) map.get(this);
            if (h == null)
            {
                h = newMap();
                map.put(this, h);
            }
            return h;
        }
    }
}
