package org.lucci.madhoc.node_memory;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;

import org.lucci.madhoc.network.Station;
import org.lucci.madhoc.network.Application;

/*
 * Created on May 16, 2005
 */

/**
 * @author luc.hogie
 */
public class NodeMemory extends Application
{
    private Map<Station, Double> computerMap = new HashMap<Station, Double>();
    private double forgetAfter = 60000;
    
    /* (non-Javadoc)
     * @see org.lucci.madhoc.network.ComputerApplication#getName()
     */
    public String getName()
    {
        return "node_memory";
    }

    /* (non-Javadoc)
     * @see org.lucci.madhoc.network.ComputerApplication#doIt(double)
     */
    public void doIt(double time)
    {
            for (Station c : getComputer().getNetworkingUnit().getNeighborhood())
            {
                computerMap.put(c, getSimulatedTime());
            }
        
        {
            Iterator i = new HashSet(getKnownComputers()).iterator();
            
            while (i.hasNext())
            {
                double date = getLastMeetingData((Station) i.next());
                
                if (getSimulatedTime() - date > this.forgetAfter)
                {
                    i.remove();
                }
            }
        }
    }

    public boolean hasAlreadyMet(Station c)
    {
        return computerMap.get(c) != null;
    }
    
    public double getLastMeetingData(Station c)
    {
        return ((Double) computerMap.get(c)).doubleValue();
    }
    
    public Collection getKnownComputers()
    {
        return computerMap.keySet();
    }
    public void configure() throws Throwable
    {
        this.forgetAfter = Double.valueOf(getMonitor().getNetwork().getSimulation().getConfiguration().getConfigurationValue("neighbor_memory_forget_after")).doubleValue();
    }
}