alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (SnmpMibAgent.java)

This example Java source code file (SnmpMibAgent.java) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

instancenotfoundexception, jmx, management, mbeanexception, object, objectname, override, reflectionexception, servicenotfoundexception, snmp, snmpmibhandler, snmpmibrequestimpl, snmpoid, snmpstatusexception, snmpvarbind, string, util, vector

The SnmpMibAgent.java Java example source code

/*
 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */


package com.sun.jmx.snmp.agent;



// java imports
//
import java.io.Serializable;
import java.util.Vector;
import java.util.Enumeration;

// jmx imports
//
import javax.management.MBeanServer;
import javax.management.MBeanRegistration;
import javax.management.ObjectName;
import javax.management.InstanceNotFoundException;
import javax.management.ServiceNotFoundException;
import javax.management.ReflectionException;
import javax.management.MBeanException;
import com.sun.jmx.snmp.SnmpVarBind;
import com.sun.jmx.snmp.SnmpDefinitions;
import com.sun.jmx.snmp.SnmpStatusException;
import com.sun.jmx.snmp.SnmpPdu;
import com.sun.jmx.snmp.SnmpOid;
import com.sun.jmx.snmp.SnmpEngine;

/**
 * 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.
 *
 * <p>This API is a Sun Microsystems internal API  and is subject
 * to change without notice.</b>

*/ public abstract class SnmpMibAgent implements SnmpMibAgentMBean, MBeanRegistration, Serializable { /** * Default constructor. */ public SnmpMibAgent() { } // --------------------------------------------------------------------- // PUBLIC METHODS //---------------------------------------------------------------------- /** * Initializes the MIB (with no registration of the MBeans into the * MBean server). * * @exception IllegalAccessException The MIB can not be initialized. */ public abstract void init() throws IllegalAccessException; /** * 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 */ @Override public abstract ObjectName preRegister(MBeanServer server, ObjectName name) throws java.lang.Exception; /** * Not used in this context. */ @Override public void postRegister (Boolean registrationDone) { } /** * Not used in this context. */ @Override public void preDeregister() throws java.lang.Exception { } /** * Not used in this context. */ @Override public void postDeregister() { } /** * Processes a <CODE>get operation. * This method must update the SnmpVarBinds contained in the * <var>{@link SnmpMibRequest} req parameter. * * @param req The SnmpMibRequest object holding the list of variable to * be retrieved. This list is composed of * <CODE>SnmpVarBind objects. * * @exception SnmpStatusException An error occurred during the operation. */ @Override public abstract void get(SnmpMibRequest req) throws SnmpStatusException; /** * Processes a <CODE>getNext operation. * This method must update the SnmpVarBinds contained in the * <var>{@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 <CODE>SnmpVarBind objects. * * @exception SnmpStatusException An error occurred during the operation. */ @Override public abstract void getNext(SnmpMibRequest req) throws SnmpStatusException; /** * Processes a <CODE>getBulk operation. * This method must update the SnmpVarBinds contained in the * <var>{@link SnmpMibRequest} req parameter. * * @param req The SnmpMibRequest object holding the list of variable to * be retrieved. This list is composed of * <CODE>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 <CODE>nonRepeat variables for which * multiple lexicographic successors are requested. * * @exception SnmpStatusException An error occurred during the operation. */ @Override public abstract void getBulk(SnmpMibRequest req, int nonRepeat, int maxRepeat) throws SnmpStatusException; /** * Processes a <CODE>set operation. * This method must update the SnmpVarBinds contained in the * <var>{@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 * <CODE>SnmpVarBind objects. * * @exception SnmpStatusException An error occurred 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. */ @Override public abstract void set(SnmpMibRequest req) throws SnmpStatusException; /** * Checks if a <CODE>set operation can be performed. * If the operation can not be performed, the method should throw an * <CODE>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 * <CODE>SnmpVarBind objects. * * @exception SnmpStatusException The <CODE>set operation * cannot be performed. */ @Override public abstract void check(SnmpMibRequest req) throws SnmpStatusException; /** * Gets the root object identifier of the MIB. * <P>The root object identifier is the object identifier uniquely * identifying the MIB. * * @return The root object identifier. */ public abstract long[] getRootOid(); // --------------------------------------------------------------------- // GETTERS AND SETTERS // --------------------------------------------------------------------- /** * 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. */ @Override public MBeanServer getMBeanServer() { return server; } /** * Gets the reference to the SNMP protocol adaptor to which the MIB is * bound. * * @return The SNMP MIB handler. */ @Override public SnmpMibHandler getSnmpAdaptor() { return adaptor; } /** * 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. */ @Override public void setSnmpAdaptor(SnmpMibHandler stack) { if (adaptor != null) { adaptor.removeMib(this); } adaptor = stack; if (adaptor != null) { adaptor.addMib(this); } } /** * 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 */ @Override public void setSnmpAdaptor(SnmpMibHandler stack, SnmpOid[] oids) { if (adaptor != null) { adaptor.removeMib(this); } adaptor = stack; if (adaptor != null) { adaptor.addMib(this, 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. * * @exception IllegalArgumentException If the parameter is null. * * @since 1.5 */ @Override public void setSnmpAdaptor(SnmpMibHandler stack, String contextName) { if (adaptor != null) { adaptor.removeMib(this, contextName); } adaptor = stack; if (adaptor != null) { adaptor.addMib(this, 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. * @param oids The set of OIDs this agent implements. * @exception IllegalArgumentException If the parameter is null. * * @since 1.5 */ @Override public void setSnmpAdaptor(SnmpMibHandler stack, String contextName, SnmpOid[] oids) { if (adaptor != null) { adaptor.removeMib(this, contextName); } adaptor = stack; if (adaptor != null) { adaptor.addMib(this, contextName, oids); } } /** * Gets the object name of the SNMP protocol adaptor to which the MIB * is bound. * * @return The name of the SNMP protocol adaptor. */ @Override public ObjectName getSnmpAdaptorName() { return adaptorName; } /** * 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 <CODE>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. */ @Override public void setSnmpAdaptorName(ObjectName name) throws InstanceNotFoundException, ServiceNotFoundException { 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; } /** * 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 <CODE>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 */ @Override public void setSnmpAdaptorName(ObjectName name, SnmpOid[] oids) throws InstanceNotFoundException, ServiceNotFoundException { 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; } /** * 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 <CODE>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 */ @Override public void setSnmpAdaptorName(ObjectName name, String contextName) throws InstanceNotFoundException, ServiceNotFoundException { 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; } /** * 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 <CODE>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 */ @Override public void setSnmpAdaptorName(ObjectName name, String contextName, SnmpOid[] oids) throws InstanceNotFoundException, ServiceNotFoundException { 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; } /** * 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 <CODE>true if the MIB module is bound, * <CODE>false otherwise. */ @Override public boolean getBindingState() { if (adaptor == null) return false; else return true; } /** * Gets the MIB name. * * @return The MIB name. */ @Override public String getMibName() { return mibName; } /** * 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 **/ public static SnmpMibRequest newMibRequest(SnmpPdu reqPdu, Vector<SnmpVarBind> vblist, int version, Object userData) { return new SnmpMibRequestImpl(null, reqPdu, vblist, version, userData, null, SnmpDefinitions.noAuthNoPriv, getSecurityModel(version), null,null); } /** * 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 **/ public static SnmpMibRequest newMibRequest(SnmpEngine engine, SnmpPdu reqPdu, Vector<SnmpVarBind> vblist, int version, Object userData, String principal, int securityLevel, int securityModel, byte[] contextName, byte[] accessContextName) { return new SnmpMibRequestImpl(engine, reqPdu, vblist, version, userData, principal, securityLevel, securityModel, contextName, accessContextName); } // --------------------------------------------------------------------- // PACKAGE METHODS // --------------------------------------------------------------------- /** * Processes a <CODE>getBulk operation using call to * <CODE>getNext. * The method implements the <CODE>getBulk operation by calling * appropriately the <CODE>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 occurred during the operation. */ void getBulkWithGetNext(SnmpMibRequest req, int nonRepeat, int maxRepeat) throws SnmpStatusException { final Vector<SnmpVarBind> 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<SnmpVarBind> 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); } } } // --------------------------------------------------------------------- // PRIVATE METHODS // --------------------------------------------------------------------- /** * 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. */ private Vector<SnmpVarBind> splitFrom(Vector original, int limit) { int max= original.size(); Vector<SnmpVarBind> 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<SnmpVarBind> e= original.elements(); e.hasMoreElements(); --i) { SnmpVarBind var= e.nextElement(); if (i >0) continue; result.addElement(new SnmpVarBind(var.oid, var.value)); } return result; } private void concatVector(SnmpMibRequest req, Vector<SnmpVarBind> source) { for(Enumeration<SnmpVarBind> e= source.elements(); e.hasMoreElements(); ) { SnmpVarBind var= 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 static int getSecurityModel(int version) { switch(version) { case SnmpDefinitions.snmpVersionOne: return SnmpDefinitions.snmpV1SecurityModel; default: return SnmpDefinitions.snmpV2SecurityModel; } } // --------------------------------------------------------------------- // PROTECTED VARIABLES // --------------------------------------------------------------------- /** * The object name of the MIB. * @serial */ protected String mibName; /** * The reference to the MBean server. * @serial */ protected MBeanServer server; // --------------------------------------------------------------------- // PRIVATE VARIABLES // --------------------------------------------------------------------- /** * The object name of the SNMP protocol adaptor. * @serial */ private ObjectName adaptorName; /** * The reference to the SNMP stack. */ private transient SnmpMibHandler adaptor; }

Other Java examples (source code examples)

Here is a short list of links related to this Java SnmpMibAgent.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.