272 lines · 11.0 KB · Java
RawDownload
/* * Copyright (c) 1998, 2006, 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.daemon; // java imports//import java.util.logging.Level;import java.util.Vector; // jmx imports//import com.sun.jmx.snmp.SnmpEngine;import com.sun.jmx.snmp.SnmpPdu;import com.sun.jmx.snmp.SnmpValue;import com.sun.jmx.snmp.SnmpVarBind;import com.sun.jmx.snmp.SnmpVarBindList;import com.sun.jmx.snmp.SnmpOid;import com.sun.jmx.snmp.SnmpDefinitions;import com.sun.jmx.snmp.SnmpStatusException;// SNMP Runtime import//import static com.sun.jmx.defaults.JmxProperties.SNMP_ADAPTOR_LOGGER;import com.sun.jmx.snmp.agent.SnmpMibAgent;import com.sun.jmx.snmp.agent.SnmpMibRequest;import com.sun.jmx.snmp.daemon.SnmpAdaptorServer;import com.sun.jmx.snmp.internal.SnmpIncomingRequest; /* NPCTE fix for bugId 4492741, esc 0 */import com.sun.jmx.snmp.ThreadContext;/* end of NPCTE fix for bugId 4492741 */ class SnmpSubNextRequestHandler extends SnmpSubRequestHandler {    private SnmpAdaptorServer server = null;    /**     * The constuctor initialize the subrequest with the whole varbind     * list contained in the original request.     */    protected SnmpSubNextRequestHandler(SnmpAdaptorServer server,                                        SnmpMibAgent agent,                                        SnmpPdu req) {        super(agent,req);        init(req, server);    }     protected SnmpSubNextRequestHandler(SnmpEngine engine,                                        SnmpAdaptorServer server,                                        SnmpIncomingRequest incRequest,                                        SnmpMibAgent agent,                                        SnmpPdu req) {        super(engine, incRequest, agent, req);        init(req, server);        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpSubNextRequestHandler.class.getName(),                "SnmpSubNextRequestHandler", "Constructor : " + this);        }    }     private void init(SnmpPdu req, SnmpAdaptorServer server) {        this.server = server;         // The translation table is easy in this case ...        //        final int max= translation.length;        final SnmpVarBind[] list= req.varBindList;        final NonSyncVector<SnmpVarBind> nonSyncVarBind =                ((NonSyncVector<SnmpVarBind>)varBind);        for(int i=0; i < max; i++) {            translation[i]= i;            // we need to allocate a new SnmpVarBind. Otherwise the first            // sub request will modify the list...            //            final SnmpVarBind newVarBind =                new SnmpVarBind(list[i].oid, list[i].value);            nonSyncVarBind.addNonSyncElement(newVarBind);        }    }     public void run() {         try {            /* NPCTE fix for bugId 4492741, esc 0, 16-August-2001 */            final ThreadContext oldContext =                ThreadContext.push("SnmpUserData",data);            try {                if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINER)) {                    SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpSubRequestHandler.class.getName(),                        "run", "[" + Thread.currentThread() +                          "]:getNext operation on " + agent.getMibName());                }                 // Always call with V2. So the merge of the responses will                // be easier.                //                agent.getNext(createMibRequest(varBind, snmpVersionTwo, data));            } finally {                ThreadContext.restore(oldContext);            }            /* end of NPCTE fix for bugId 4492741 */          } catch(SnmpStatusException x) {            errorStatus = x.getStatus() ;            errorIndex=  x.getErrorIndex();            if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {                SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpSubRequestHandler.class.getName(),                    "run", "[" + Thread.currentThread() +                      "]:an Snmp error occured during the operation", x);            }        }        catch(Exception x) {            errorStatus = SnmpDefinitions.snmpRspGenErr ;            if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {                SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpSubRequestHandler.class.getName(),                    "run", "[" + Thread.currentThread() +                      "]:a generic error occured during the operation", x);            }        }        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINER)) {            SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpSubRequestHandler.class.getName(),                "run", "[" + Thread.currentThread() +  "]:operation completed");        }    }     /**     * The method updates the varbind list of the subrequest.     */    protected  void updateRequest(SnmpVarBind var, int pos) {        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpSubRequestHandler.class.getName(),                "updateRequest", "Copy :" + var);        }        int size= varBind.size();        translation[size]= pos;        final SnmpVarBind newVarBind =            new SnmpVarBind(var.oid, var.value);        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpSubRequestHandler.class.getName(),                "updateRequest", "Copied :" + newVarBind);        }         varBind.addElement(newVarBind);    }    /**     * The method updates a given var bind list with the result of a     * previsouly invoked operation.     * Prior to calling the method, one must make sure that the operation was     * successful. As such the method getErrorIndex or getErrorStatus should be     * called.     */    protected void updateResult(SnmpVarBind[] result) {         final int max=varBind.size();        for(int i= 0; i< max ; i++) {            // May be we should control the position ...            //            final int index= translation[i];            final SnmpVarBind elmt=                (SnmpVarBind)((NonSyncVector)varBind).elementAtNonSync(i);             final SnmpVarBind vb= result[index];            if (vb == null) {                result[index]= elmt;                /* NPCTE fix for bugid 4381195 esc 0. <J.C.> < 17-Oct-2000> */                // if ((elmt != null) &&  (elmt.value == null) &&                //    (version == snmpVersionTwo))                //    elmt.value = SnmpVarBind.endOfMibView;                /* end of NPCTE fix for bugid 4381195 */                continue;            }             final SnmpValue val= vb.value;            if ((val == null)|| (val == SnmpVarBind.endOfMibView)){                /* NPCTE fix for bugid 4381195 esc 0. <J.C.> < 17-Oct-2000> */                if ((elmt != null) &&                    (elmt.value != SnmpVarBind.endOfMibView))                    result[index]= elmt;                // else if ((val == null) && (version == snmpVersionTwo))                //    vb.value = SnmpVarBind.endOfMibView;                continue;                /* end of NPCTE fix for bugid 4381195 */            }             /* NPCTE fix for bugid 4381195 esc 0. <J.C.> < 17-Oct-2000> */            if (elmt == null) continue;            /* end of NPCTE fix for bugid 4381195 */             if (elmt.value == SnmpVarBind.endOfMibView) continue;              // Now we need to take the smallest oid ...            //            int comp = elmt.oid.compareTo(vb.oid);            if (comp < 0) {              // Take the smallest (lexicographically)                //                result[index]= elmt;            }            else {                if(comp == 0) {                    // Must compare agent used for reply                    // Take the deeper within the reply                    if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINER)) {                        SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpSubRequestHandler.class.getName(),                            "updateResult"," oid overlapping. Oid : " +                              elmt.oid + "value :" + elmt.value);                        SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpSubRequestHandler.class.getName(),                            "updateResult","Already present varBind : " +                              vb);                    }                     SnmpOid oid = vb.oid;                    SnmpMibAgent deeperAgent = server.getAgentMib(oid);                     if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINER)) {                        SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpSubRequestHandler.class.getName(),                            "updateResult","Deeper agent : " + deeperAgent);                    }                    if(deeperAgent == agent) {                        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINER)) {                            SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpSubRequestHandler.class.getName(),                                "updateResult","The current agent is the deeper one. Update the value with the current one");                        }                        result[index].value = elmt.value;                    }                     /*                      Vector v = new Vector();                      SnmpMibRequest getReq = createMibRequest(v,                      version,                      null);                      SnmpVarBind realValue = new SnmpVarBind(oid);                      getReq.addVarBind(realValue);                      try {                      deeperAgent.get(getReq);                      } catch(SnmpStatusException e) {                      e.printStackTrace();                      }                       if(isDebugOn())                      trace("updateResult", "Biggest priority value is : " +                      realValue.value);                       result[index].value = realValue.value;                    */                }            }        }    }}