📄 snmpmiboid.java
字号:
/* * @(#)file SnmpMibOid.java * @(#)author Sun Microsystems, Inc. * @(#)version 4.22 * @(#)date 08/09/12 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */package com.sun.jmx.snmp.agent;// java imports//import java.io.Serializable;import java.util.Vector;import java.util.Enumeration;// jmx imports//import com.sun.jmx.snmp.SnmpOid;import com.sun.jmx.snmp.SnmpValue;import com.sun.jmx.snmp.SnmpVarBind;import com.sun.jmx.snmp.SnmpStatusException;/** * Represents a node in an SNMP MIB which is neither a group nor a variable. * This class defines a list of sub-nodes and the methods that allow to * manipulate the sub-nodes. * <P> * This class is used internally and by the class generated by * <CODE>mibgen</CODE>. * You should not need to use this class directly. * * <p><b>This API is a Sun Microsystems internal API and is subject * to change without notice.</b></p> * @version 4.22 11/17/05 * @author Sun Microsystems, Inc */public class SnmpMibOid extends SnmpMibNode implements Serializable { /** * Default constructor. */ public SnmpMibOid() { } // PUBLIC METHODS //--------------- /** * Generic handling of the <CODE>get</CODE> operation. * * <p> This method should be overridden in subclasses. * <p> * * @param req The sub-request that must be handled by this node. * * @param depth The depth reached in the OID tree. * * @exception SnmpStatusException The default implementation (if not * overridden) is to generate a SnmpStatusException. */ public void get(SnmpMibSubRequest req, int depth) throws SnmpStatusException { for (Enumeration e= req.getElements(); e.hasMoreElements();) { SnmpVarBind var= (SnmpVarBind) e.nextElement(); SnmpStatusException x = new SnmpStatusException(SnmpStatusException.noSuchObject); req.registerGetException(var,x); } } /** * Generic handling of the <CODE>set</CODE> operation. * * <p> This method should be overridden in subclasses. * <p> * * @param req The sub-request that must be handled by this node. * * @param depth The depth reached in the OID tree. * * @exception SnmpStatusException The default implementation (if not * overridden) is to generate a SnmpStatusException. */ public void set(SnmpMibSubRequest req, int depth) throws SnmpStatusException { for (Enumeration e= req.getElements(); e.hasMoreElements();) { SnmpVarBind var= (SnmpVarBind) e.nextElement(); SnmpStatusException x = new SnmpStatusException(SnmpStatusException.noAccess); req.registerSetException(var,x); } } /** * Generic handling of the <CODE>check</CODE> operation. * * <p> This method should be overridden in subclasses. * <p> * * @param req The sub-request that must be handled by this node. * * @param depth The depth reached in the OID tree. * * @exception SnmpStatusException The default implementation (if not * overriden) is to generate a SnmpStatusException. */ public void check(SnmpMibSubRequest req, int depth) throws SnmpStatusException { for (Enumeration e= req.getElements(); e.hasMoreElements();) { SnmpVarBind var= (SnmpVarBind) e.nextElement(); SnmpStatusException x = new SnmpStatusException(SnmpStatusException.noAccess); req.registerCheckException(var,x); } } // --------------------------------------------------------------------- // // Implements the method defined in SnmpMibNode. // // --------------------------------------------------------------------- // void findHandlingNode(SnmpVarBind varbind, long[] oid, int depth, SnmpRequestTree handlers) throws SnmpStatusException { final int length = oid.length; SnmpMibNode node = null; if (handlers == null) throw new SnmpStatusException(SnmpStatusException.snmpRspGenErr); if (depth > length) { // Nothing is left... the oid is not valid throw noSuchObjectException; } else if (depth == length) { // The oid is not complete... throw noSuchInstanceException; } else { // Some children variable or subobject is being querried // getChild() will raise an exception if no child is found. // final SnmpMibNode child= getChild(oid[depth]); // XXXX zzzz : what about null children? // (variables for nested groups) // if child==null, then we're dealing with a variable or // a table: we register this node. // This behaviour should be overriden in subclasses, // in particular in group meta classes: the group // meta classes that hold tables should take care // of forwarding this call to all the tables involved. // if (child == null) handlers.add(this,depth,varbind); else child.findHandlingNode(varbind,oid,depth+1,handlers); } } // --------------------------------------------------------------------- // // Implements the method defined in SnmpMibNode. // // --------------------------------------------------------------------- // long[] findNextHandlingNode(SnmpVarBind varbind, long[] oid, int pos, int depth, SnmpRequestTree handlers, AcmChecker checker) throws SnmpStatusException { final int length = oid.length; SnmpMibNode node = null; long[] result = null; if (handlers == null) // This should be considered as a genErr, but we do not want to // abort the whole request, so we're going to throw // a noSuchObject... // throw noSuchObjectException; final Object data = handlers.getUserData(); final int pduVersion = handlers.getRequestPduVersion(); if (pos >= length) { long[] newOid= new long[1]; newOid[0]= getNextVarId(-1,data,pduVersion); result = findNextHandlingNode(varbind,newOid,0,depth,handlers, checker); return result; } // search the element specified in the oid // long[] newOid= new long[1]; long index= oid[pos]; while (true) { try { final SnmpMibNode child = getChild(index); // SnmpOid result = null; if (child == null) { // shouldn't happen throw noSuchObjectException; // validateVarId(index); // handlers.add(this,varbind,depth); // result = new SnmpOid(0); } else { checker.add(depth, index); try { result = child.findNextHandlingNode(varbind,oid,pos+1, depth+1,handlers, checker); } finally { checker.remove(depth); } } // Build up the leaf OID result[depth] = index; return result; } catch(SnmpStatusException e) { // If there is no such element go one level up ... // index= getNextVarId(index,data,pduVersion); // There is no need to carry the original oid ... newOid[0]=index; pos= 1; oid=newOid; } } } /** * Computes the root OID of the MIB. */ public void getRootOid(Vector result) { // If a node has several children, let assume that we are one step to // far in order to get the MIB root. // if (nbChildren != 1) return; result.addElement(new Integer(varList[0])); // Now query our child. // ((SnmpMibNode)children.firstElement()).getRootOid(result); } /** * Registers a specific node in the tree.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -