package org.itsnat.droid.impl.util;
import org.itsnat.droid.ItsNatDroidException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* Created by jmarranz on 4/07/14.
*/
public class MapListReal<Key,Value> implements MapList<Key,Value>
{
protected Map<Key,List<Value>> map = new HashMap<Key,List<Value>>();
public MapListReal()
{
}
public Map<Key,List<Value>> getMap()
{
return map;
}
public List<Value> get(Key key)
{
return map.get(key);
}
public void add(Key key,Value value)
{
if (value == null) throw new ItsNatDroidException("Null value is not allowed");
List<Value> list = map.get(key);
if (list == null)
{
list = new LinkedList<Value>();
map.put(key,list);
}
list.add(value);
}
public void put(Key key,Value value)
{
if (value == null) throw new ItsNatDroidException("Null value is not allowed");
remove(key);
add(key,value);
}
public boolean remove(Key key)
{
// Si es null es que no existe porque no permitimos null, cuando no hay valores se devuelve null porque no permitimos una la lista nula
return map.remove(key) != null;
}
public boolean remove(Key key,Value value)
{
List<Value> valueList = map.get(key);
if (valueList == null) return false;
for(Iterator<Value> it = valueList.iterator(); it.hasNext(); )
{
Value currValue = it.next();
if (MiscUtil.equalsNullAllowed(value, currValue)) // currValue nunca va a ser nulo pero lo dejamos por si cambiamos de opinión y permitimos nulos y delegamos la decisión a una capa superior
{
it.remove();
if (valueList.isEmpty()) map.remove(key);
return true;
}
}
return false;
}
}