|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
package com.sun.jmx.snmp.daemon; |
|
|
|
|
|
|
|
// java imports |
|
|
|
import java.util.Vector; |
|
import java.util.Enumeration; |
|
|
|
// jmx imports |
|
|
|
import com.sun.jmx.snmp.SnmpOid; |
|
|
|
// SNMP Runtime imports |
|
|
|
import com.sun.jmx.snmp.agent.SnmpMibAgent; |
|
|
|
|
|
|
|
|
|
*/ |
|
final class SnmpMibTree { |
|
|
|
public SnmpMibTree() { |
|
defaultAgent= null; |
|
root= new TreeNode(-1, null, null); |
|
} |
|
|
|
public void setDefaultAgent(SnmpMibAgent def) { |
|
defaultAgent= def; |
|
root.agent= def; |
|
} |
|
|
|
public SnmpMibAgent getDefaultAgent() { |
|
return defaultAgent; |
|
} |
|
|
|
public void register(SnmpMibAgent agent) { |
|
root.registerNode(agent); |
|
} |
|
|
|
public void register(SnmpMibAgent agent, long[] oid) { |
|
root.registerNode(oid, 0, agent); |
|
} |
|
|
|
public SnmpMibAgent getAgentMib(SnmpOid oid) { |
|
TreeNode node= root.retrieveMatchingBranch(oid.longValue(), 0); |
|
if (node == null) |
|
return defaultAgent; |
|
else |
|
if(node.getAgentMib() == null) |
|
return defaultAgent; |
|
else |
|
return node.getAgentMib(); |
|
} |
|
|
|
public void unregister(SnmpMibAgent agent, SnmpOid[] oids) { |
|
for(int i = 0; i < oids.length; i++) { |
|
long[] oid = oids[i].longValue(); |
|
TreeNode node = root.retrieveMatchingBranch(oid, 0); |
|
if (node == null) |
|
continue; |
|
node.removeAgent(agent); |
|
} |
|
} |
|
|
|
|
|
public void unregister(SnmpMibAgent agent) { |
|
|
|
root.removeAgentFully(agent); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void printTree() { |
|
root.printTree(">"); |
|
} |
|
|
|
private SnmpMibAgent defaultAgent; |
|
private TreeNode root; |
|
|
|
// A SnmpMibTree object is a tree of TreeNode |
|
|
|
final class TreeNode { |
|
|
|
void registerNode(SnmpMibAgent agent) { |
|
long[] oid= agent.getRootOid(); |
|
registerNode(oid, 0, agent); |
|
} |
|
|
|
TreeNode retrieveMatchingBranch(long[] oid, int cursor) { |
|
TreeNode node= retrieveChild(oid, cursor); |
|
if (node == null) |
|
return this; |
|
if (children.isEmpty()) { |
|
// In this case, the node does not have any children. So no point to |
|
|
|
return node; |
|
} |
|
if( cursor + 1 == oid.length) { |
|
// In this case, the oid does not have any more element. So the search |
|
|
|
return node; |
|
} |
|
|
|
TreeNode n = node.retrieveMatchingBranch(oid, cursor + 1); |
|
//If the returned node got a null agent, we have to replace it by |
|
//the current one (in case it is not null) |
|
|
|
return n.agent == null ? this : n; |
|
} |
|
|
|
SnmpMibAgent getAgentMib() { |
|
return agent; |
|
} |
|
|
|
public void printTree(String ident) { |
|
|
|
StringBuilder buff= new StringBuilder(); |
|
if (agents == null) { |
|
return; |
|
} |
|
|
|
for(Enumeration<SnmpMibAgent> e= agents.elements(); e.hasMoreElements(); ) { |
|
SnmpMibAgent mib= e.nextElement(); |
|
if (mib == null) |
|
buff.append("empty "); |
|
else |
|
buff.append(mib.getMibName()).append(" "); |
|
} |
|
ident+= " "; |
|
if (children == null) { |
|
return; |
|
} |
|
for(Enumeration<TreeNode> e= children.elements(); e.hasMoreElements(); ) { |
|
TreeNode node= e.nextElement(); |
|
node.printTree(ident); |
|
} |
|
} |
|
|
|
// PRIVATE STUFF |
|
//-------------- |
|
|
|
|
|
|
|
|
|
*/ |
|
private TreeNode(long nodeValue, SnmpMibAgent agent, TreeNode sup) { |
|
this.nodeValue= nodeValue; |
|
this.parent= sup; |
|
agents.addElement(agent); |
|
} |
|
|
|
private void removeAgentFully(SnmpMibAgent agent) { |
|
Vector<TreeNode> v = new Vector<>(); |
|
for(Enumeration<TreeNode> e= children.elements(); |
|
e.hasMoreElements(); ) { |
|
|
|
TreeNode node= e.nextElement(); |
|
node.removeAgentFully(agent); |
|
if(node.agents.isEmpty()) |
|
v.add(node); |
|
|
|
} |
|
for(Enumeration<TreeNode> e= v.elements(); e.hasMoreElements(); ) { |
|
children.removeElement(e.nextElement()); |
|
} |
|
removeAgent(agent); |
|
|
|
} |
|
|
|
private void removeAgent(SnmpMibAgent mib) { |
|
if (!agents.contains(mib)) |
|
return; |
|
agents.removeElement(mib); |
|
|
|
if (!agents.isEmpty()) |
|
agent= agents.firstElement(); |
|
|
|
} |
|
|
|
private void setAgent(SnmpMibAgent agent) { |
|
this.agent = agent; |
|
} |
|
|
|
private void registerNode(long[] oid, int cursor, SnmpMibAgent agent) { |
|
|
|
if (cursor >= oid.length) |
|
//That's it ! |
|
|
|
return; |
|
TreeNode child = retrieveChild(oid, cursor); |
|
if (child == null) { |
|
// Create a child and register it ! |
|
|
|
long theValue= oid[cursor]; |
|
child= new TreeNode(theValue, agent, this); |
|
children.addElement(child); |
|
} |
|
else |
|
if (agents.contains(agent) == false) { |
|
agents.addElement(agent); |
|
} |
|
|
|
// We have to set the agent attribute |
|
|
|
if(cursor == (oid.length - 1)) { |
|
child.setAgent(agent); |
|
} |
|
else |
|
child.registerNode(oid, cursor+1, agent); |
|
} |
|
|
|
private TreeNode retrieveChild(long[] oid, int current) { |
|
long theValue= oid[current]; |
|
|
|
for(Enumeration<TreeNode> e= children.elements(); e.hasMoreElements(); ) { |
|
TreeNode node= e.nextElement(); |
|
if (node.match(theValue)) |
|
return node; |
|
} |
|
return null; |
|
} |
|
|
|
private boolean match(long value) { |
|
return (nodeValue == value) ? true : false; |
|
} |
|
|
|
private Vector<TreeNode> children= new Vector<>(); |
|
private Vector<SnmpMibAgent> agents= new Vector<>(); |
|
private long nodeValue; |
|
private SnmpMibAgent agent; |
|
private TreeNode parent; |
|
|
|
}; // end of class TreeNode |
|
} |