package ch.rakudave.jnetmap.device;
import java.awt.Point;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import ch.rakudave.jnetmap.network.LogicalIF;
import ch.rakudave.jnetmap.network.NetworkIF;
import ch.rakudave.jnetmap.status.Status;
public class Host implements Device {
private String name = "", vendor = "", modelNr = "";
private Point location;
private Status status;
private Date lastSeen;
private LinkedList<NetworkIF> interfaces;
private LinkedList<DeviceListener> listeners;
public Host() {
interfaces = new LinkedList<NetworkIF>();
listeners = new LinkedList<DeviceListener>();
location = new Point();
status = Status.UNKNOWN;
}
public Host(Point location) {
this();
setLocation(location);
}
@Override
public void addInterface(NetworkIF i) {
if (i != null) interfaces.add(i);
}
@Override
public void addListener(DeviceListener listener) {
if (listener != null && !listeners.contains(listener)) listeners.add(listener);
}
@Override
@SuppressWarnings("unchecked")
public List<NetworkIF> getInterfaces() {
return (List<NetworkIF>) interfaces.clone();
}
@Override
public Date getLastSeen() {
return lastSeen;
}
@Override
public Point getLocation() {
return location;
}
@Override
public String getModelNr() {
return modelNr;
}
@Override
public String getName() {
return name;
}
@Override
public Status getStatus() {
return status;
}
@Override
public String getVendor() {
return vendor;
}
@Override
public void move(int dx, int dy) {
location.move(dx, dy);
}
@Override
public void notifyListeners(DeviceEvent e) {
for (DeviceListener l : listeners) l.itemChanged(e);
}
@Override
public void removeInterface(NetworkIF i) {
interfaces.remove(i);
}
@Override
public void removeListener(DeviceListener listener) {
listeners.remove(listener);
}
@Override
public void setLocation(Point p) {
if (p != null) location.setLocation(p);
}
@Override
public void setModelNr(String modelNr) {
this.modelNr = modelNr;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void setVendor(String vendor) {
this.vendor = vendor;
}
@Override
public void updateStatus() {
Status newStatus = Status.UNKNOWN;
for (NetworkIF i : interfaces) {
i.updateStatus();
if (newStatus.compareTo(i.getStatus()) > 0 && !(i instanceof LogicalIF)) newStatus = i.getStatus();
}
if (!status.equals(newStatus)) {
status = newStatus;
notifyListeners(new DeviceEvent(this, DeviceEvent.Type.STATUS_CHANGED));
}
if (status == Status.UP) lastSeen = new Date(System.currentTimeMillis());
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((interfaces == null) ? 0 : interfaces.hashCode());
result = prime * result + ((lastSeen == null) ? 0 : lastSeen.hashCode());
result = prime * result + ((location == null) ? 0 : location.hashCode());
result = prime * result + ((modelNr == null) ? 0 : modelNr.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((vendor == null) ? 0 : vendor.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Device) {
return hashCode() == obj.hashCode();
} else {
return false;
}
}
}