| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package com.sun.jmx.snmp.agent;  | 
 | 
 | 
 | 
import java.io.Serializable;  | 
 | 
import java.util.Enumeration;  | 
 | 
import java.util.logging.Level;  | 
 | 
 | 
 | 
import javax.management.ObjectName;  | 
 | 
import javax.management.MBeanServer;  | 
 | 
 | 
 | 
import static com.sun.jmx.defaults.JmxProperties.SNMP_ADAPTOR_LOGGER;  | 
 | 
import com.sun.jmx.snmp.SnmpStatusException;  | 
 | 
import com.sun.jmx.snmp.SnmpDefinitions;  | 
 | 
import com.sun.jmx.snmp.SnmpVarBind;  | 
 | 
 | 
 | 
/**  | 
 | 
 * A simple MIB agent that implements SNMP calls (get, set, getnext and getbulk) in a way that only errors or exceptions are returned. Every call done on this agent fails. Error handling is done according to the manager's SNMP protocol version.  | 
 | 
 * <P>It is used by <CODE>SnmpAdaptorServer</CODE> for its default agent behavior. When a received Oid doesn't match, this agent is called to fill the result list with errors.</P>  | 
 | 
 * <p><b>This API is a Sun Microsystems internal API  and is subject  | 
 | 
 * to change without notice.</b></p>  | 
 | 
 * @since 1.5  | 
 | 
 *  | 
 | 
 */  | 
 | 
 | 
 | 
public class SnmpErrorHandlerAgent extends SnmpMibAgent  | 
 | 
        implements Serializable { | 
 | 
    private static final long serialVersionUID = 7751082923508885650L;  | 
 | 
 | 
 | 
    public SnmpErrorHandlerAgent() {} | 
 | 
 | 
 | 
    /**  | 
 | 
     * Initializes the MIB (with no registration of the MBeans into the  | 
 | 
     * MBean server). Does nothing.  | 
 | 
     *  | 
 | 
     * @exception IllegalAccessException The MIB cannot be initialized.  | 
 | 
     */  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public 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 passed name parameter.  | 
 | 
     *  | 
 | 
     * @exception java.lang.Exception  | 
 | 
     */  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public ObjectName preRegister(MBeanServer server, ObjectName name)  | 
 | 
        throws Exception { | 
 | 
        return name;  | 
 | 
    }  | 
 | 
 | 
 | 
    /**  | 
 | 
     * Gets the root object identifier of the MIB.  | 
 | 
     * <P>The root object identifier is the object identifier uniquely  | 
 | 
     * identifying the MIB.  | 
 | 
     *  | 
 | 
     * @return The returned oid is null.  | 
 | 
     */  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public long[] getRootOid() { | 
 | 
        return null;  | 
 | 
    }  | 
 | 
 | 
 | 
    /**  | 
 | 
     * Processes a <CODE>get</CODE> operation. It will throw an exception for V1 requests or it will set exceptions within the list for V2 requests.  | 
 | 
     *  | 
 | 
     * @param inRequest The SnmpMibRequest object holding the list of variable to be retrieved.  | 
 | 
     *  | 
 | 
     * @exception SnmpStatusException An error occurred during the operation.  | 
 | 
     */  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public void get(SnmpMibRequest inRequest) throws SnmpStatusException { | 
 | 
 | 
 | 
        SNMP_ADAPTOR_LOGGER.logp(Level.FINEST,  | 
 | 
                SnmpErrorHandlerAgent.class.getName(),  | 
 | 
                "get", "Get in Exception");  | 
 | 
 | 
 | 
        if(inRequest.getVersion() == SnmpDefinitions.snmpVersionOne)  | 
 | 
            throw new SnmpStatusException(SnmpStatusException.noSuchName);  | 
 | 
 | 
 | 
        Enumeration<SnmpVarBind> l = inRequest.getElements();  | 
 | 
        while(l.hasMoreElements()) { | 
 | 
            SnmpVarBind varbind = l.nextElement();  | 
 | 
            varbind.setNoSuchObject();  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    /**  | 
 | 
     * Checks if a <CODE>set</CODE> operation can be performed.  | 
 | 
     * If the operation can not be performed, the method should emit a  | 
 | 
     * <CODE>SnmpStatusException</CODE>.  | 
 | 
     *  | 
 | 
     * @param inRequest The SnmpMibRequest object holding the list of variables to  | 
 | 
     *            be set. This list is composed of  | 
 | 
     *            <CODE>SnmpVarBind</CODE> objects.  | 
 | 
     *  | 
 | 
     * @exception SnmpStatusException The <CODE>set</CODE> operation  | 
 | 
     *    cannot be performed.  | 
 | 
     */  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public void check(SnmpMibRequest inRequest) throws SnmpStatusException { | 
 | 
 | 
 | 
        SNMP_ADAPTOR_LOGGER.logp(Level.FINEST,  | 
 | 
                SnmpErrorHandlerAgent.class.getName(),  | 
 | 
                "check", "Check in Exception");  | 
 | 
 | 
 | 
        throw new SnmpStatusException(SnmpDefinitions.snmpRspNotWritable);  | 
 | 
    }  | 
 | 
 | 
 | 
    /**  | 
 | 
     * Processes a <CODE>set</CODE> operation. Should never be called (check previously called having failed).  | 
 | 
     *  | 
 | 
     * @param inRequest The SnmpMibRequest object holding the list of variable to be set.  | 
 | 
     *  | 
 | 
     * @exception SnmpStatusException An error occurred during the operation.  | 
 | 
     */  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public void set(SnmpMibRequest inRequest) throws SnmpStatusException { | 
 | 
 | 
 | 
        SNMP_ADAPTOR_LOGGER.logp(Level.FINEST,  | 
 | 
                SnmpErrorHandlerAgent.class.getName(),  | 
 | 
                "set", "Set in Exception, CANNOT be called");  | 
 | 
 | 
 | 
        throw new SnmpStatusException(SnmpDefinitions.snmpRspNotWritable);  | 
 | 
    }  | 
 | 
 | 
 | 
    /**  | 
 | 
     * Processes a <CODE>getNext</CODE> operation. It will throw an exception for V1 requests or it will set exceptions within the list for V2 requests..  | 
 | 
     *  | 
 | 
     * @param inRequest The SnmpMibRequest object holding the list of variables to be retrieved.  | 
 | 
     *  | 
 | 
     * @exception SnmpStatusException An error occurred during the operation.  | 
 | 
     */  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public void getNext(SnmpMibRequest inRequest) throws SnmpStatusException { | 
 | 
 | 
 | 
        SNMP_ADAPTOR_LOGGER.logp(Level.FINEST,  | 
 | 
                SnmpErrorHandlerAgent.class.getName(),  | 
 | 
                "getNext", "GetNext in Exception");  | 
 | 
 | 
 | 
        if(inRequest.getVersion() == SnmpDefinitions.snmpVersionOne)  | 
 | 
            throw new SnmpStatusException(SnmpStatusException.noSuchName);  | 
 | 
 | 
 | 
        Enumeration<SnmpVarBind> l = inRequest.getElements();  | 
 | 
        while(l.hasMoreElements()) { | 
 | 
            SnmpVarBind varbind = l.nextElement();  | 
 | 
            varbind.setEndOfMibView();  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    /**  | 
 | 
     * Processes a <CODE>getBulk</CODE> operation. It will throw an exception if the request is a V1 one or it will set exceptions within the list for V2 ones.  | 
 | 
     *  | 
 | 
     * @param inRequest The SnmpMibRequest object holding the list of variable to be retrieved.  | 
 | 
     *  | 
 | 
     * @exception SnmpStatusException An error occurred during the operation.  | 
 | 
     */  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public void getBulk(SnmpMibRequest inRequest, int nonRepeat, int maxRepeat)  | 
 | 
        throws SnmpStatusException { | 
 | 
 | 
 | 
        SNMP_ADAPTOR_LOGGER.logp(Level.FINEST,  | 
 | 
                SnmpErrorHandlerAgent.class.getName(),  | 
 | 
                "getBulk", "GetBulk in Exception");  | 
 | 
 | 
 | 
        if(inRequest.getVersion() == SnmpDefinitions.snmpVersionOne)  | 
 | 
            throw new SnmpStatusException(SnmpDefinitions.snmpRspGenErr, 0);  | 
 | 
 | 
 | 
        Enumeration<SnmpVarBind> l = inRequest.getElements();  | 
 | 
        while(l.hasMoreElements()) { | 
 | 
            SnmpVarBind varbind = l.nextElement();  | 
 | 
            varbind.setEndOfMibView();  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
}  |