package com.activequant.utils.snmp; import java.util.ArrayList; import java.util.List; import org.snmp4j.agent.MOAccess; import org.snmp4j.agent.mo.DefaultMOMutableRow2PC; import org.snmp4j.agent.mo.DefaultMOTable; import org.snmp4j.agent.mo.MOColumn; import org.snmp4j.agent.mo.MOMutableTableModel; import org.snmp4j.agent.mo.MOTable; import org.snmp4j.agent.mo.MOTableIndex; import org.snmp4j.agent.mo.MOTableSubIndex; import org.snmp4j.smi.OID; import org.snmp4j.smi.SMIConstants; import org.snmp4j.smi.Variable; /** * <p> * Utility class for adding dynamic data into an {@link MOTable} * </p> * * * <pre><code> MOTableBuilder builder = new MOTableBuilder(new OID(".1.3.6.1.2.1.2.2.1")) .addColumnType(SMIConstants.SYNTAX_INTEGER,MOAccessImpl.ACCESS_READ_ONLY) .addColumnType(SMIConstants.SYNTAX_OCTET_STRING,MOAccessImpl.ACCESS_READ_ONLY); for(MyObject o: myObjects) { builder.addRowValue(new Integer32(o.getId())) .addRowValue(new OctetString(o.getName())); } MOTable table = builder.build(); </code> * * <pre> * * @author johanrask * */ class MOTableBuilder { private MOTableSubIndex[] subIndexes = new MOTableSubIndex[] { new MOTableSubIndex(SMIConstants.SYNTAX_INTEGER) }; private MOTableIndex indexDef = new MOTableIndex(subIndexes, false); private final List<MOColumn> columns = new ArrayList<MOColumn>(); private final List<Variable[]> tableRows = new ArrayList<Variable[]>(); private int currentRow = 0; private int currentCol = 0; private OID tableRootOid; private int colTypeCnt = 0; /** * Specified oid is the root oid of this table */ MOTableBuilder(OID oid) { this.tableRootOid = oid; } /** * Adds all column types {@link MOColumn} to this table. Important to * understand that you must add all types here before adding any row values * * @param syntax * use {@link SMIConstants} * @param access * @return */ public MOTableBuilder addColumnType(int syntax, MOAccess access) { colTypeCnt++; columns.add(new MOColumn(colTypeCnt, syntax, access)); return this; } public MOTableBuilder addRowValue(Variable variable) { if (tableRows.size() == currentRow) { tableRows.add(new Variable[columns.size()]); } tableRows.get(currentRow)[currentCol] = variable; currentCol++; if (currentCol >= columns.size()) { currentRow++; currentCol = 0; } return this; } public MOTable build() { DefaultMOTable ifTable = new DefaultMOTable(tableRootOid, indexDef, columns.toArray(new MOColumn[0])); MOMutableTableModel model = (MOMutableTableModel) ifTable.getModel(); int i = 1; for (Variable[] variables : tableRows) { model.addRow(new DefaultMOMutableRow2PC(new OID(String.valueOf(i)), variables)); i++; } ifTable.setVolatile(true); return ifTable; } }