DemandMapper.java

package eu.javaexperience.collection.map;

import java.util.concurrent.ConcurrentHashMap;

import eu.javaexperience.asserts.AssertArgument;
import eu.javaexperience.interfaces.simple.getBy.GetBy1;

public class DemandMapper<K,V> extends ConcurrentHashMap<K, V>
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	protected final GetBy1<V, K> get;

	public DemandMapper(GetBy1<V, K> get)
	{
		AssertArgument.assertNotNull(this.get = get, "get");
	}
	
	@Override
	public V get(Object inkey)
	{
		K key = (K) inkey;
		V ret = super.get(key);
		if(ret == null)
		{
			V getted = get.getBy(key);
			if(getted == null)
				return null;
			
			V in = super.putIfAbsent(key, getted);
			if(in != null)
				return in;
			
			return getted;
		}
		
		return ret;
	}
}