package org.lucci.madhoc.network.net;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Vector;
import org.lucci.madhoc.network.Connection;
import org.lucci.math.Utilities;
public final class NetworkInterface
{
public NetworkingTechnology networkType;
private double coverageRadius;
private double amplificationRatio = 1;
private Collection<Connection> connections = new HashSet<Connection>();
private NetworkingUnit networkingUnit;
private int macAddress = ++instanceCount;
private static int instanceCount = 0;
public int getMACAddress()
{
return macAddress;
}
protected void setMACAddress(int mac)
{
this.macAddress = mac;
}
public Collection<Connection> getConnections()
{
return connections;
}
public double getCoverageRadius()
{
return coverageRadius;
}
public void setCoverageRadius(double coverageRadius)
{
this.coverageRadius = coverageRadius * getAmplificationRatio();
}
public NetworkingUnit getNetworkingUnit()
{
return networkingUnit;
}
public void setNetworkingUnit(NetworkingUnit inut)
{
this.networkingUnit = inut;
}
public Collection<NetworkInterface> getNeighborhood()
{
Collection<NetworkInterface> neighborhood = new Vector<NetworkInterface>();
Iterator connectionIterator = getConnections().iterator();
while (connectionIterator.hasNext())
{
Connection c = (Connection) connectionIterator.next();
neighborhood.add(c.getSibbling(this));
}
return neighborhood;
}
public int hashCode()
{
return getMACAddress();
}
public double getAmplificationRatio()
{
return amplificationRatio;
}
public void setAmplificationRatio(double amplificationRatio)
{
this.amplificationRatio = amplificationRatio;
}
public NetworkingTechnology getNetworkingTechnology()
{
return networkType;
}
public void setNetworkingTechnology(NetworkingTechnology networkType)
{
this.networkType = networkType;
setCoverageRadius(Utilities.getRandomBetween(networkType.getMinimumCoverageRadius(), networkType.getMaximumCoverageRadius(), getNetworkingTechnology().getNetwork().getSimulation().getRandomNumberGenerator().getRandom()));
}
public boolean hasNeighborsAtTwoHops()
{
for (NetworkInterface ni : getNeighborhood())
{
if (ni.getNeighborhood().size() > 1)
{
return true;
}
}
return false;
}
public boolean canSyncTo(NetworkInterface surroundingNetworkAdapter)
{
if (getNeighborhood().isEmpty())
{
return !surroundingNetworkAdapter.hasNeighborsAtTwoHops();
}
else
{
for (NetworkInterface nb : getNeighborhood())
{
if (nb.getNeighborhood().contains(surroundingNetworkAdapter))
{
return true;
}
}
return false;
}
}
}