//
// This file is part of the OpenNMS(R) Application.
//
// OpenNMS(R) is Copyright (C) 2005 The OpenNMS Group, Inc. All rights reserved.
// OpenNMS(R) is a derivative work, containing both original code, included code and modified
// code that was published under the GNU General Public License. Copyrights for modified
// and included code are below.
//
// OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
//
// Original code base Copyright (C) 1999-2001 Oculan Corp. All rights reserved.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program 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 for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// For more information contact:
// OpenNMS Licensing <license@opennms.org>
// http://www.opennms.org/
// http://www.opennms.com/
//
package org.infosec.ismp.snmp;
import org.infosec.ismp.util.ThreadCategory;
public class SingleInstanceTracker extends CollectionTracker {
private final SnmpObjId m_base;
private final SnmpInstId m_inst;
private final SnmpObjId m_oid;
public SingleInstanceTracker(SnmpObjId base, SnmpInstId inst) {
this(base, inst, null);
}
public SingleInstanceTracker(String baseOid, String instId) {
this(SnmpObjId.get(baseOid), new SnmpInstId(instId));
}
public SingleInstanceTracker(SnmpObjId base, SnmpInstId inst,
CollectionTracker parent) {
super(parent);
m_base = base;
m_inst = inst;
m_oid = SnmpObjId.get(m_base, m_inst);
}
@Override
public void setMaxRepetitions(int maxRepititions) {
// do nothing since we are not a repeater
}
@Override
public ResponseProcessor buildNextPdu(PduBuilder pduBuilder) {
if (pduBuilder.getMaxVarsPerPdu() < 1) {
throw new IllegalArgumentException("maxVarsPerPdu < 1");
}
SnmpObjId requestOid = m_oid.decrement();
log().debug("Requesting oid following: " + requestOid);
pduBuilder.addOid(requestOid);
pduBuilder.setNonRepeaters(1);
pduBuilder.setMaxRepetitions(1);
ResponseProcessor rp = new ResponseProcessor() {
@Override
public void processResponse(SnmpObjId responseObjId, SnmpValue val) {
log().debug(
"Processing varBind: " + responseObjId + " = " + val);
if (val.isEndOfMib()) {
receivedEndOfMib();
}
if (m_oid.equals(responseObjId)) {
storeResult(new SnmpResult(m_base, m_inst, val));
}
setFinished(true);
}
@Override
public boolean processErrors(int errorStatus, int errorIndex) {
if (errorStatus == NO_ERR) {
return false;
} else if (errorStatus == TOO_BIG_ERR) {
throw new IllegalArgumentException(
"Unable to handle tooBigError for oid request "
+ m_oid.decrement());
} else if (errorStatus == GEN_ERR) {
reportGenErr("Received genErr reqeusting oid "
+ m_oid.decrement()
+ ". Marking column is finished.");
errorOccurred();
return true;
} else if (errorStatus == NO_SUCH_NAME_ERR) {
reportNoSuchNameErr("Received noSuchName reqeusting oid "
+ m_oid.decrement()
+ ". Marking column is finished.");
errorOccurred();
return true;
} else {
throw new IllegalArgumentException(
"Unexpected error processing oid "
+ m_oid.decrement() + ". Aborting!");
}
}
};
return rp;
}
protected ThreadCategory log() {
return ThreadCategory.getInstance(getClass());
}
protected void errorOccurred() {
setFinished(true);
}
protected void receivedEndOfMib() {
setFinished(true);
}
}