FileDocCategorySizeDatePackage
SnmpMibAgent.javaAPI DocJava SE 5 API26302Fri Aug 26 14:55:04 BST 2005com.sun.jmx.snmp.agent

SnmpMibAgent

public abstract class SnmpMibAgent extends Object implements Serializable, SnmpMibAgentMBean, MBeanRegistration
Abstract class for representing an SNMP agent. The class is used by the SNMP protocol adaptor as the entry point in the SNMP agent to query.

This API is a Sun Microsystems internal API and is subject to change without notice.

version
4.40 12/19/03
author
Sun Microsystems, Inc

Fields Summary
protected String
mibName
The object name of the MIB.
protected MBeanServer
server
The reference to the MBean server.
private ObjectName
adaptorName
The object name of the SNMP protocol adaptor.
private transient SnmpMibHandler
adaptor
The reference to the SNMP stack.
Constructors Summary
public SnmpMibAgent()
Default constructor.

    
Methods Summary
public abstract voidcheck(SnmpMibRequest req)
Checks if a set operation can be performed. If the operation can not be performed, the method should throw an SnmpStatusException. This method is called during the first phase of the SET two-phase commit.

param
req The SnmpMibRequest object holding the list of variable to be set. This list is composed of SnmpVarBind objects.
exception
SnmpStatusException The set operation cannot be performed.

private voidconcatVector(SnmpMibRequest req, java.util.Vector source)

        for(Enumeration e= source.elements(); e.hasMoreElements(); ) {
            SnmpVarBind var= (SnmpVarBind) e.nextElement();    
            // We need to duplicate the SnmpVarBind otherwise it is going 
	    // to be overloaded by the next get Next ...
            req.addVarBind(new SnmpVarBind(var.oid, var.value));
        }
    
private voidconcatVector(java.util.Vector target, java.util.Vector source)

        for(Enumeration e= source.elements(); e.hasMoreElements(); ) {
            SnmpVarBind var= (SnmpVarBind) e.nextElement();    
            // We need to duplicate the SnmpVarBind otherwise it is going 
	    // to be overloaded by the next get Next ...
            target.addElement(new SnmpVarBind(var.oid, var.value));
        }
    
public abstract voidget(SnmpMibRequest req)
Processes a get operation. This method must update the SnmpVarBinds contained in the {@link SnmpMibRequest} req parameter.

param
req The SnmpMibRequest object holding the list of variable to be retrieved. This list is composed of SnmpVarBind objects.
exception
SnmpStatusException An error occured during the operation.

public booleangetBindingState()
Indicates whether or not the MIB module is bound to a SNMP protocol adaptor. As a reminder, only bound MIBs can be accessed through SNMP protocol adaptor.

return
true if the MIB module is bound, false otherwise.

        if (adaptor == null) 
            return false;
        else
            return true;
    
public abstract voidgetBulk(SnmpMibRequest req, int nonRepeat, int maxRepeat)
Processes a getBulk operation. This method must update the SnmpVarBinds contained in the {@link SnmpMibRequest} req parameter.

param
req The SnmpMibRequest object holding the list of variable to be retrieved. This list is composed of SnmpVarBind objects.
param
nonRepeat The number of variables, starting with the first variable in the variable-bindings, for which a single lexicographic successor is requested.
param
maxRepeat The number of lexicographic successors requested for each of the last R variables. R is the number of variables following the first nonRepeat variables for which multiple lexicographic successors are requested.
exception
SnmpStatusException An error occured during the operation.

voidgetBulkWithGetNext(SnmpMibRequest req, int nonRepeat, int maxRepeat)
Processes a getBulk operation using call to getNext. The method implements the getBulk operation by calling appropriately the getNext method.

param
req The SnmpMibRequest containing the variable list to be retrieved.
param
nonRepeat The number of variables, starting with the first variable in the variable-bindings, for which a single lexicographic successor is requested.
param
maxRepeat The number of lexicographic successors requested for each of the last R variables. R is the number of variables following the first nonRepeat variables for which multiple lexicographic successors are requested.
return
The variable list containing returned values.
exception
SnmpStatusException An error occured during the operation.

	final Vector list = req.getSubList();

        // RFC 1905, Section 4.2.3, p14
        final int L = list.size() ;
        final int N = Math.max(Math.min(nonRepeat, L), 0) ;
        final int M = Math.max(maxRepeat, 0) ;
        final int R = L - N ;
    
        // Let's build the varBindList for the response pdu
        //
        // int errorStatus = SnmpDefinitions.snmpRspNoError ;
        // int errorIndex = 0 ;
        if (L != 0) {
      
            // Non-repeaters and first row of repeaters
            //
            getNext(req);
	
            // Now the remaining repeaters
            //
            Vector repeaters= splitFrom(list, N);
	    SnmpMibRequestImpl repeatedReq =
		new SnmpMibRequestImpl(req.getEngine(),
				       req.getPdu(),
				       repeaters,
				       SnmpDefinitions.snmpVersionTwo,
				       req.getUserData(),
				       req.getPrincipal(),
				       req.getSecurityLevel(),
				       req.getSecurityModel(),
				       req.getContextName(),
				       req.getAccessContextName());
            for (int i = 2 ; i <= M ; i++) {
                getNext(repeatedReq);
                concatVector(req, repeaters);
            }
        }
    
public javax.management.MBeanServergetMBeanServer()
Gets the reference to the MBean server in which the SNMP MIB is registered.

return
The MBean server or null if the MIB is not registered in any MBean server.

        return server;
    
public java.lang.StringgetMibName()
Gets the MIB name.

return
The MIB name.

        return mibName;
    
public abstract voidgetNext(SnmpMibRequest req)
Processes a getNext operation. This method must update the SnmpVarBinds contained in the {@link SnmpMibRequest} req parameter.

param
req The SnmpMibRequest object holding the list of OIDs from which the next variables should be retrieved. This list is composed of SnmpVarBind objects.
exception
SnmpStatusException An error occured during the operation.

public abstract long[]getRootOid()
Gets the root object identifier of the MIB.

The root object identifier is the object identifier uniquely identifying the MIB.

return
The root object identifier.

private static intgetSecurityModel(int version)

	switch(version) {
	case SnmpDefinitions.snmpVersionOne: 
	    return SnmpDefinitions.snmpV1SecurityModel;
	default:
	    return SnmpDefinitions.snmpV2SecurityModel;
	}
    
public SnmpMibHandlergetSnmpAdaptor()
Gets the reference to the SNMP protocol adaptor to which the MIB is bound.

return
The SNMP MIB handler.

        return adaptor;
    
public javax.management.ObjectNamegetSnmpAdaptorName()
Gets the object name of the SNMP protocol adaptor to which the MIB is bound.

return
The name of the SNMP protocol adaptor.

        return adaptorName;
    
public abstract voidinit()
Initializes the MIB (with no registration of the MBeans into the MBean server).

exception
IllegalAccessException The MIB can not be initialized.

public static SnmpMibRequestnewMibRequest(com.sun.jmx.snmp.SnmpPdu reqPdu, java.util.Vector vblist, int version, java.lang.Object userData)
This is a factory method for creating new SnmpMibRequest objects.

param
reqPdu The received PDU.
param
vblist The vector of SnmpVarBind objects in which the MIB concerned by this request is involved.
param
version The protocol version of the SNMP request.
param
userData User allocated contextual data.
return
A new SnmpMibRequest object.
since
1.5

	return new SnmpMibRequestImpl(null,
				      reqPdu,
				      vblist,
				      version,
				      userData,
				      null,
				      SnmpDefinitions.noAuthNoPriv,
				      getSecurityModel(version),
				      null,null);
    
public static SnmpMibRequestnewMibRequest(com.sun.jmx.snmp.SnmpEngine engine, com.sun.jmx.snmp.SnmpPdu reqPdu, java.util.Vector vblist, int version, java.lang.Object userData, java.lang.String principal, int securityLevel, int securityModel, byte[] contextName, byte[] accessContextName)
This is a factory method for creating new SnmpMibRequest objects.

param
engine The local engine.
param
reqPdu The received pdu.
param
vblist The vector of SnmpVarBind objects in which the MIB concerned by this request is involved.
param
version The protocol version of the SNMP request.
param
userData User allocated contextual data.
return
A new SnmpMibRequest object.
since
1.5

	return new SnmpMibRequestImpl(engine,
				      reqPdu, 
				      vblist,
				      version,
				      userData,
				      principal,
				      securityLevel,
				      securityModel,
				      contextName,
				      accessContextName);
    
public voidpostDeregister()
Not used in this context.

    
public voidpostRegister(java.lang.Boolean registrationDone)
Not used in this context.

    
public voidpreDeregister()
Not used in this context.

    
public abstract javax.management.ObjectNamepreRegister(javax.management.MBeanServer server, javax.management.ObjectName name)
Initializes the MIB but each single MBean representing the MIB is inserted into the MBean server.

param
server The MBean server to register the service with.
param
name The object name.
return
The name of the SNMP MIB registered.
exception
java.lang.Exception

public abstract voidset(SnmpMibRequest req)
Processes a set operation. This method must update the SnmpVarBinds contained in the {@link SnmpMibRequest} req parameter. This method is called during the second phase of the SET two-phase commit.

param
req The SnmpMibRequest object holding the list of variable to be set. This list is composed of SnmpVarBind objects.
exception
SnmpStatusException An error occured during the operation. Throwing an exception in this method will break the atomicity of the SET operation. Care must be taken so that the exception is thrown in the {@link #check(SnmpMibRequest)} method instead.

public voidsetSnmpAdaptor(SnmpMibHandler stack)
Sets the reference to the SNMP protocol adaptor through which the MIB will be SNMP accessible and add this new MIB in the SNMP MIB handler.

param
stack The SNMP MIB handler.

        if (adaptor != null) {
            adaptor.removeMib(this);
        }
        adaptor = stack;
        if (adaptor != null) {
            adaptor.addMib(this);
        }
    
public voidsetSnmpAdaptor(SnmpMibHandler stack, com.sun.jmx.snmp.SnmpOid[] oids)
Sets the reference to the SNMP protocol adaptor through which the MIB will be SNMP accessible and add this new MIB in the SNMP MIB handler. This method is to be called to set a specific agent to a specific OID. This can be useful when dealing with MIB overlapping. Some OID can be implemented in more than one MIB. In this case, the OID nearest the agent will be used on SNMP operations.

param
stack The SNMP MIB handler.
param
oids The set of OIDs this agent implements.
since
1.5

    
        if (adaptor != null) {
            adaptor.removeMib(this);
        }
        adaptor = stack;
        if (adaptor != null) {
            adaptor.addMib(this, oids);
        }
    
public voidsetSnmpAdaptor(SnmpMibHandler stack, java.lang.String contextName)
Sets the reference to the SNMP protocol adaptor through which the MIB will be SNMP accessible and adds this new MIB in the SNMP MIB handler. Adds a new contextualized MIB in the SNMP MIB handler.

param
stack The SNMP MIB handler.
param
contextName The MIB context name. If null is passed, will be registered in the default context.
exception
IllegalArgumentException If the parameter is null.
since
1.5

    
        if (adaptor != null) {
            adaptor.removeMib(this, contextName);
        }
        adaptor = stack;
        if (adaptor != null) {
            adaptor.addMib(this, contextName);
        }
    
public voidsetSnmpAdaptor(SnmpMibHandler stack, java.lang.String contextName, com.sun.jmx.snmp.SnmpOid[] oids)
Sets the reference to the SNMP protocol adaptor through which the MIB will be SNMP accessible and adds this new MIB in the SNMP MIB handler. Adds a new contextualized MIB in the SNMP MIB handler.

param
stack The SNMP MIB handler.
param
contextName The MIB context name. If null is passed, will be registered in the default context.
param
oids The set of OIDs this agent implements.
exception
IllegalArgumentException If the parameter is null.
since
1.5

    
        if (adaptor != null) {
            adaptor.removeMib(this, contextName);
        }
        adaptor = stack;
        if (adaptor != null) {
            adaptor.addMib(this, contextName, oids);
        }
    
public voidsetSnmpAdaptorName(javax.management.ObjectName name)
Sets the reference to the SNMP protocol adaptor through which the MIB will be SNMP accessible and add this new MIB in the SNMP MIB handler associated to the specified name.

param
name The name of the SNMP protocol adaptor.
exception
InstanceNotFoundException The SNMP protocol adaptor does not exist in the MBean server.
exception
ServiceNotFoundException This SNMP MIB is not registered in the MBean server or the requested service is not supported.

              
        if (server == null) {
            throw new ServiceNotFoundException(mibName + " is not registered in the MBean server");
        }
        // First remove the reference on the old adaptor server.
        //
        if (adaptor != null) {
            adaptor.removeMib(this);
        }        
        
        // Then update the reference to the new adaptor server.
        //
        Object[] params = {this};
        String[] signature = {"com.sun.jmx.snmp.agent.SnmpMibAgent"};
        try {
            adaptor = (SnmpMibHandler)(server.invoke(name, "addMib", params, 
						     signature));
        } catch (InstanceNotFoundException e) {
            throw new InstanceNotFoundException(name.toString());
        } catch (ReflectionException e) {
            throw new ServiceNotFoundException(name.toString());
        } catch (MBeanException e) {
            // Should never occur...
        }
        
        adaptorName = name; 
    
public voidsetSnmpAdaptorName(javax.management.ObjectName name, com.sun.jmx.snmp.SnmpOid[] oids)
Sets the reference to the SNMP protocol adaptor through which the MIB will be SNMP accessible and add this new MIB in the SNMP MIB handler associated to the specified name. This method is to be called to set a specific agent to a specific OID. This can be useful when dealing with MIB overlapping. Some OID can be implemented in more than one MIB. In this case, the OID nearer agent will be used on SNMP operations.

param
name The name of the SNMP protocol adaptor.
param
oids The set of OIDs this agent implements.
exception
InstanceNotFoundException The SNMP protocol adaptor does not exist in the MBean server.
exception
ServiceNotFoundException This SNMP MIB is not registered in the MBean server or the requested service is not supported.
since
1.5

              
        if (server == null) {
            throw new ServiceNotFoundException(mibName + " is not registered in the MBean server");
        }
        // First remove the reference on the old adaptor server.
        //
        if (adaptor != null) {
            adaptor.removeMib(this);
        }        
        
        // Then update the reference to the new adaptor server.
        //
        Object[] params = {this, oids};
        String[] signature = {"com.sun.jmx.snmp.agent.SnmpMibAgent",
	oids.getClass().getName()};
        try {
            adaptor = (SnmpMibHandler)(server.invoke(name, "addMib", params, 
						     signature));
        } catch (InstanceNotFoundException e) {
            throw new InstanceNotFoundException(name.toString());
        } catch (ReflectionException e) {
            throw new ServiceNotFoundException(name.toString());
        } catch (MBeanException e) {
            // Should never occur...
        }
        
        adaptorName = name; 
    
public voidsetSnmpAdaptorName(javax.management.ObjectName name, java.lang.String contextName)
Sets the reference to the SNMP protocol adaptor through which the MIB will be SNMP accessible and add this new MIB in the SNMP MIB handler associated to the specified name.

param
name The name of the SNMP protocol adaptor.
param
contextName The MIB context name. If null is passed, will be registered in the default context.
exception
InstanceNotFoundException The SNMP protocol adaptor does not exist in the MBean server.
exception
ServiceNotFoundException This SNMP MIB is not registered in the MBean server or the requested service is not supported.
since
1.5

              
        if (server == null) {
            throw new ServiceNotFoundException(mibName + " is not registered in the MBean server");
        }
        
        // First remove the reference on the old adaptor server.
        //
        if (adaptor != null) {
            adaptor.removeMib(this, contextName);
        }        
        
        // Then update the reference to the new adaptor server.
        //
        Object[] params = {this, contextName};
        String[] signature = {"com.sun.jmx.snmp.agent.SnmpMibAgent", "java.lang.String"};
        try {
            adaptor = (SnmpMibHandler)(server.invoke(name, "addMib", params, 
						     signature));
        } catch (InstanceNotFoundException e) {
            throw new InstanceNotFoundException(name.toString());
        } catch (ReflectionException e) {
            throw new ServiceNotFoundException(name.toString());
        } catch (MBeanException e) {
            // Should never occur...
        }
        
        adaptorName = name; 
    
public voidsetSnmpAdaptorName(javax.management.ObjectName name, java.lang.String contextName, com.sun.jmx.snmp.SnmpOid[] oids)
Sets the reference to the SNMP protocol adaptor through which the MIB will be SNMP accessible and add this new MIB in the SNMP MIB handler associated to the specified name.

param
name The name of the SNMP protocol adaptor.
param
contextName The MIB context name. If null is passed, will be registered in the default context.
param
oids The set of OIDs this agent implements.
exception
InstanceNotFoundException The SNMP protocol adaptor does not exist in the MBean server.
exception
ServiceNotFoundException This SNMP MIB is not registered in the MBean server or the requested service is not supported.
since
1.5

	
        if (server == null) {
            throw new ServiceNotFoundException(mibName + " is not registered in the MBean server");
        }
        
        // First remove the reference on the old adaptor server.
        //
        if (adaptor != null) {
            adaptor.removeMib(this, contextName);
        }        
        
        // Then update the reference to the new adaptor server.
        //
        Object[] params = {this, contextName, oids};
        String[] signature = {"com.sun.jmx.snmp.agent.SnmpMibAgent", "java.lang.String", oids.getClass().getName()};
        try {
            adaptor = (SnmpMibHandler)(server.invoke(name, "addMib", params, 
						     signature));
        } catch (InstanceNotFoundException e) {
            throw new InstanceNotFoundException(name.toString());
        } catch (ReflectionException e) {
            throw new ServiceNotFoundException(name.toString());
        } catch (MBeanException e) {
            // Should never occur...
        }
        
        adaptorName = name; 
    
private java.util.VectorsplitFrom(java.util.Vector original, int limit)
This method creates a new Vector which does not contain the first element up to the specified limit.

param
original The original vector.
param
limit The limit.

        
        int max= original.size();
        Vector result= new Vector(max - limit);
        int i= limit;
        
        // Ok the loop looks a bit strange. But in order to improve the 
	// perf, we try to avoid reference to the limit variable from 
	// within the loop ...
        //
        for(Enumeration e= original.elements(); e.hasMoreElements(); --i) {
            SnmpVarBind var= (SnmpVarBind) e.nextElement();
            if (i >0)
                continue;
            result.addElement(new SnmpVarBind(var.oid, var.value));
        }
        return result;
    
private static java.util.Vectorvector(java.util.Enumeration e)

	if (e == null) return null;
	Vector v = new Vector();
	while (e.hasMoreElements()) v.addElement(e.nextElement());
	return v;