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

Java example source code file (SnmpMsg.java)

This example Java source code file (SnmpMsg.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

berdecoder, berexception, data, invalid, jmx, net, network, snmp, snmpdefinitions, snmpnull, snmpoid, snmpstatusexception, snmptimeticks, snmptoobigexception, snmpvalue, snmpvarbind, stringbuffer, util, vector

The SnmpMsg.java Java example source code

/*
 * Copyright (c) 2001, 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;

import com.sun.jmx.snmp.SnmpSecurityParameters;
// java imports
//
import java.util.Vector;
import java.net.InetAddress;


import com.sun.jmx.snmp.SnmpStatusException;
/**
 * A partially decoded representation of an SNMP packet. It contains
 * the information contained in any SNMP message (SNMPv1, SNMPv2 or
 * SNMPv3).
 * <p>This API is a Sun Microsystems internal API  and is subject
 * to change without notice.</b>

* @since 1.5 */ public abstract class SnmpMsg implements SnmpDefinitions { /** * The protocol version. * <P>decodeMessage and encodeMessage do not * perform any check on this value. * <BR>decodeSnmpPdu and encodeSnmpPdu only * accept the values 0 (for SNMPv1), 1 (for SNMPv2) and 3 (for SNMPv3). */ public int version = 0; /** * Encoding of the PDU. * <P>This is usually the BER encoding of the PDU's syntax * defined in RFC1157 and RFC1902. However, this can be authenticated * or encrypted data (but you need to implemented your own * <CODE>SnmpPduFactory class). */ public byte[] data = null; /** * Number of useful bytes in the <CODE>data field. */ public int dataLength = 0; /** * Source or destination address. * <BR>For an incoming message it's the source. * For an outgoing message it's the destination. */ public InetAddress address = null; /** * Source or destination port. * <BR>For an incoming message it's the source. * For an outgoing message it's the destination. */ public int port = 0; /** * Security parameters. Contain informations according to Security Model (Usm, community string based, ...). */ public SnmpSecurityParameters securityParameters = null; /** * Returns the encoded SNMP version present in the passed byte array. * @param data The unmarshalled SNMP message. * @return The SNMP version (0, 1 or 3). */ public static int getProtocolVersion(byte[] data) throws SnmpStatusException { int version = 0; BerDecoder bdec = null; try { bdec = new BerDecoder(data); bdec.openSequence(); version = bdec.fetchInteger(); } catch(BerException x) { throw new SnmpStatusException("Invalid encoding") ; } try { bdec.closeSequence(); } catch(BerException x) { } return version; } /** * Returns the associated request ID. * @param data The flat message. * @return The request ID. */ public abstract int getRequestId(byte[] data) throws SnmpStatusException; /** * Encodes this message and puts the result in the specified byte array. * For internal use only. * * @param outputBytes An array to receive the resulting encoding. * * @exception ArrayIndexOutOfBoundsException If the result does not fit * into the specified array. */ public abstract int encodeMessage(byte[] outputBytes) throws SnmpTooBigException; /** * Decodes the specified bytes and initializes this message. * For internal use only. * * @param inputBytes The bytes to be decoded. * * @exception SnmpStatusException If the specified bytes are not a valid encoding. */ public abstract void decodeMessage(byte[] inputBytes, int byteCount) throws SnmpStatusException; /** * Initializes this message with the specified <CODE>pdu. * <P> * This method initializes the data field with an array of * <CODE>maxDataLength bytes. It encodes the pdu. * The resulting encoding is stored in the data field * and the length of the encoding is stored in <CODE>dataLength. * <p> * If the encoding length exceeds <CODE>maxDataLength, * the method throws an exception. * * @param pdu The PDU to be encoded. * @param maxDataLength The maximum length permitted for the data field. * * @exception SnmpStatusException If the specified <CODE>pdu is not valid. * @exception SnmpTooBigException If the resulting encoding does not fit * into <CODE>maxDataLength bytes. * @exception ArrayIndexOutOfBoundsException If the encoding exceeds <CODE>maxDataLength. */ public abstract void encodeSnmpPdu(SnmpPdu pdu, int maxDataLength) throws SnmpStatusException, SnmpTooBigException; /** * Gets the PDU encoded in this message. * <P> * This method decodes the data field and returns the resulting PDU. * * @return The resulting PDU. * @exception SnmpStatusException If the encoding is not valid. */ public abstract SnmpPdu decodeSnmpPdu() throws SnmpStatusException; /** * Dumps the content of a byte buffer using hexadecimal form. * * @param b The buffer to dump. * @param offset The position of the first byte to be dumped. * @param len The number of bytes to be dumped starting from offset. * * @return The string containing the dump. */ public static String dumpHexBuffer(byte [] b, int offset, int len) { StringBuffer buf = new StringBuffer(len << 1) ; int k = 1 ; int flen = offset + len ; for (int i = offset; i < flen ; i++) { int j = b[i] & 0xFF ; buf.append(Character.forDigit((j >>> 4) , 16)) ; buf.append(Character.forDigit((j & 0x0F), 16)) ; k++ ; if (k%16 == 0) { buf.append('\n') ; k = 1 ; } else buf.append(' ') ; } return buf.toString() ; } /** * Dumps this message in a string. * * @return The string containing the dump. */ public String printMessage() { StringBuffer sb = new StringBuffer() ; sb.append("Version: ") ; sb.append(version) ; sb.append("\n") ; if (data == null) { sb.append("Data: null") ; } else { sb.append("Data: {\n") ; sb.append(dumpHexBuffer(data, 0, dataLength)) ; sb.append("\n}\n") ; } return sb.toString() ; } /** * For SNMP Runtime private use only. */ public void encodeVarBindList(BerEncoder benc, SnmpVarBind[] varBindList) throws SnmpStatusException, SnmpTooBigException { // // Remember: the encoder does backward encoding // int encodedVarBindCount = 0 ; try { benc.openSequence() ; if (varBindList != null) { for (int i = varBindList.length - 1 ; i >= 0 ; i--) { SnmpVarBind bind = varBindList[i] ; if (bind != null) { benc.openSequence() ; encodeVarBindValue(benc, bind.value) ; benc.putOid(bind.oid.longValue()) ; benc.closeSequence() ; encodedVarBindCount++ ; } } } benc.closeSequence() ; } catch(ArrayIndexOutOfBoundsException x) { throw new SnmpTooBigException(encodedVarBindCount) ; } } /** * For SNMP Runtime private use only. */ void encodeVarBindValue(BerEncoder benc, SnmpValue v)throws SnmpStatusException { if (v == null) { benc.putNull() ; } else if (v instanceof SnmpIpAddress) { benc.putOctetString(((SnmpIpAddress)v).byteValue(), SnmpValue.IpAddressTag) ; } else if (v instanceof SnmpCounter) { benc.putInteger(((SnmpCounter)v).longValue(), SnmpValue.CounterTag) ; } else if (v instanceof SnmpGauge) { benc.putInteger(((SnmpGauge)v).longValue(), SnmpValue.GaugeTag) ; } else if (v instanceof SnmpTimeticks) { benc.putInteger(((SnmpTimeticks)v).longValue(), SnmpValue.TimeticksTag) ; } else if (v instanceof SnmpOpaque) { benc.putOctetString(((SnmpOpaque)v).byteValue(), SnmpValue.OpaqueTag) ; } else if (v instanceof SnmpInt) { benc.putInteger(((SnmpInt)v).intValue()) ; } else if (v instanceof SnmpString) { benc.putOctetString(((SnmpString)v).byteValue()) ; } else if (v instanceof SnmpOid) { benc.putOid(((SnmpOid)v).longValue()) ; } else if (v instanceof SnmpCounter64) { if (version == snmpVersionOne) { throw new SnmpStatusException("Invalid value for SNMP v1 : " + v) ; } benc.putInteger(((SnmpCounter64)v).longValue(), SnmpValue.Counter64Tag) ; } else if (v instanceof SnmpNull) { int tag = ((SnmpNull)v).getTag() ; if ((version == snmpVersionOne) && (tag != SnmpValue.NullTag)) { throw new SnmpStatusException("Invalid value for SNMP v1 : " + v) ; } if ((version == snmpVersionTwo) && (tag != SnmpValue.NullTag) && (tag != SnmpVarBind.errNoSuchObjectTag) && (tag != SnmpVarBind.errNoSuchInstanceTag) && (tag != SnmpVarBind.errEndOfMibViewTag)) { throw new SnmpStatusException("Invalid value " + v) ; } benc.putNull(tag) ; } else { throw new SnmpStatusException("Invalid value " + v) ; } } /** * For SNMP Runtime private use only. */ public SnmpVarBind[] decodeVarBindList(BerDecoder bdec) throws BerException { bdec.openSequence() ; Vector<SnmpVarBind> tmp = new Vector() ; while (bdec.cannotCloseSequence()) { SnmpVarBind bind = new SnmpVarBind() ; bdec.openSequence() ; bind.oid = new SnmpOid(bdec.fetchOid()) ; bind.setSnmpValue(decodeVarBindValue(bdec)) ; bdec.closeSequence() ; tmp.addElement(bind) ; } bdec.closeSequence() ; SnmpVarBind[] varBindList= new SnmpVarBind[tmp.size()] ; tmp.copyInto(varBindList); return varBindList ; } /** * For SNMP Runtime private use only. */ SnmpValue decodeVarBindValue(BerDecoder bdec) throws BerException { SnmpValue result = null ; int tag = bdec.getTag() ; // bugId 4641696 : RuntimeExceptions must be transformed in // BerException. switch(tag) { // // Simple syntax // case BerDecoder.IntegerTag : try { result = new SnmpInt(bdec.fetchInteger()) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpInt from decoded value."); } break ; case BerDecoder.OctetStringTag : try { result = new SnmpString(bdec.fetchOctetString()) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpString from decoded value."); } break ; case BerDecoder.OidTag : try { result = new SnmpOid(bdec.fetchOid()) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpOid from decoded value."); } break ; case BerDecoder.NullTag : bdec.fetchNull() ; try { result = new SnmpNull() ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpNull from decoded value."); } break ; // // Application syntax // case SnmpValue.IpAddressTag : try { result = new SnmpIpAddress(bdec.fetchOctetString(tag)) ; } catch (RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpIpAddress from decoded value."); } break ; case SnmpValue.CounterTag : try { result = new SnmpCounter(bdec.fetchIntegerAsLong(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpCounter from decoded value."); } break ; case SnmpValue.GaugeTag : try { result = new SnmpGauge(bdec.fetchIntegerAsLong(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpGauge from decoded value."); } break ; case SnmpValue.TimeticksTag : try { result = new SnmpTimeticks(bdec.fetchIntegerAsLong(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpTimeticks from decoded value."); } break ; case SnmpValue.OpaqueTag : try { result = new SnmpOpaque(bdec.fetchOctetString(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpOpaque from decoded value."); } break ; // // V2 syntaxes // case SnmpValue.Counter64Tag : if (version == snmpVersionOne) { throw new BerException(BerException.BAD_VERSION) ; } try { result = new SnmpCounter64(bdec.fetchIntegerAsLong(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpCounter64 from decoded value."); } break ; case SnmpVarBind.errNoSuchObjectTag : if (version == snmpVersionOne) { throw new BerException(BerException.BAD_VERSION) ; } bdec.fetchNull(tag) ; result = SnmpVarBind.noSuchObject ; break ; case SnmpVarBind.errNoSuchInstanceTag : if (version == snmpVersionOne) { throw new BerException(BerException.BAD_VERSION) ; } bdec.fetchNull(tag) ; result = SnmpVarBind.noSuchInstance ; break ; case SnmpVarBind.errEndOfMibViewTag : if (version == snmpVersionOne) { throw new BerException(BerException.BAD_VERSION) ; } bdec.fetchNull(tag) ; result = SnmpVarBind.endOfMibView ; break ; default: throw new BerException() ; } return result ; } }

Other Java examples (source code examples)

Here is a short list of links related to this Java SnmpMsg.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.