package org.infosec.ismp.poller.pollable;
import java.net.InetAddress;
import java.util.Date;
import org.infosec.ismp.model.event.Event;
import org.infosec.ismp.model.poller.PollStatus;
/**
* Represents a PollableNetwork
*
*/
public class PollableNetwork extends PollableContainer {
private final PollContext m_context;
public PollableNetwork(PollContext context) {
super(null, Scope.NETWORK);
m_context = context;
}
@Override
public PollContext getContext() {
return m_context;
}
public PollableNode createNode(int nodeId, String nodeLabel) {
PollableNode node = new PollableNode(this, nodeId, nodeLabel);
addMember(node);
return node;
}
public PollableNode createNodeIfNecessary(int nodeId, String nodeLabel) {
synchronized (this) {
PollableNode node = getNode(nodeId);
return (node != null ? node : createNode(nodeId, nodeLabel));
}
}
public PollableNode getNode(int nodeId) {
return (PollableNode) getMember(new Integer(nodeId));
}
public int getNodeCount() {
return getMemberCount();
}
public PollableInterface createInterface(int nodeId, String nodeLabel,
InetAddress addr) {
return createNodeIfNecessary(nodeId, nodeLabel).createInterface(addr);
}
public PollableInterface getInterface(int nodeId, InetAddress addr) {
PollableNode node = getNode(nodeId);
return (node == null ? null : node.getInterface(addr));
}
public PollableService createService(int nodeId, String nodeLabel,
InetAddress addr, String svcName) {
return createNodeIfNecessary(nodeId, nodeLabel).createService(addr,
svcName);
}
public PollableService getService(int nodeId, InetAddress addr,
String svcName) {
PollableNode node = getNode(nodeId);
return (node == null ? null : node.getService(addr, svcName));
}
@Override
protected Object createMemberKey(PollableElement member) {
PollableNode node = (PollableNode) member;
return new Integer(node.getNodeId());
}
@Override
protected void visitThis(PollableVisitor v) {
super.visitThis(v);
v.visitNetwork(this);
}
@Override
public PollStatus pollRemainingMembers(PollableElement member) {
return getMemberStatus();
}
@Override
public Event createDownEvent(Date date) {
throw new UnsupportedOperationException("No down event for the network");
}
@Override
public Event createUpEvent(Date date) {
throw new UnsupportedOperationException("No up event for the network");
}
// class DumpVisitor extends PollableVisitorAdaptor {
//
// private final ThreadCategory m_log;
//
// public DumpVisitor(ThreadCategory log) {
// m_log = log;
// }
//
// @Override
// public void visitNode(PollableNode pNode) {
// m_log.debug(" nodeid=" + pNode.getNodeId() + " status="
// + getStatusString(pNode));
// }
//
// @Override
// public void visitInterface(PollableInterface pIf) {
// ;
// m_log.debug(" interface=" + pIf.getIpAddr() + " status="
// + getStatusString(pIf));
// }
//
// @Override
// public void visitService(PollableService pSvc) {
// m_log.debug(" service=" + pSvc.getSvcName() + " status="
// + getStatusString(pSvc));
// }
//
// private String getStatusString(PollableElement e) {
// PollStatus status = e.getStatus();
// boolean up = status.isUp();
// String statusDesc = status.toString();
// PollEvent cause = e.getCause();
// int eventId = cause == null ? 0 : cause.getEventId();
// return (up ? statusDesc : statusDesc + "(" + eventId + ")");
// }
// }
//
// public void dump() {
// final ThreadCategory log = ThreadCategory.getInstance(getClass());
//
// DumpVisitor dumper = new DumpVisitor(log);
// visit(dumper);
//
// }
@Override
public void delete() {
throw new UnsupportedOperationException(
"Can't delete the entire network");
}
@Override
public PollStatus poll(PollableElement elem) {
PollableElement member = findMemberWithDescendent(elem);
return member.poll(elem);
}
@Override
public void processStatusChange(Date date) {
// no need to process status changes for the network itself
processMemberStatusChanges(date);
}
@Override
public void recalculateStatus() {
Iter iter = new Iter() {
@Override
public void forEachElement(PollableElement elem) {
elem.recalculateStatus();
}
};
forEachMember(iter);
}
@Override
public void resetStatusChanged() {
super.resetStatusChanged();
Iter iter = new Iter() {
@Override
public void forEachElement(PollableElement elem) {
elem.resetStatusChanged();
}
};
forEachMember(iter);
}
@Override
public PollableElement getLockRoot() {
return this;
}
@Override
public void obtainTreeLock(long timeout) {
}
@Override
public void releaseTreeLock() {
}
@Override
public PollEvent extrapolateCause() {
Iter iter = new Iter() {
@Override
public void forEachElement(PollableElement elem) {
elem.extrapolateCause();
}
};
forEachMember(iter);
return null;
}
public void propagateInitialCause() {
extrapolateCause();
inheritParentalCause();
}
}