/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) 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 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) 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 OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.netmgt.snmp.snmp4j;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.opennms.netmgt.snmp.AbstractSnmpValue;
import org.opennms.netmgt.snmp.SnmpObjId;
import org.opennms.netmgt.snmp.SnmpValue;
import org.snmp4j.smi.Counter32;
import org.snmp4j.smi.Counter64;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.IpAddress;
import org.snmp4j.smi.Null;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.Opaque;
import org.snmp4j.smi.SMIConstants;
import org.snmp4j.smi.TimeTicks;
import org.snmp4j.smi.UnsignedInteger32;
import org.snmp4j.smi.Variable;
class Snmp4JValue extends AbstractSnmpValue {
Variable m_value;
Snmp4JValue(final Variable value) {
if (value == null) {
throw new NullPointerException("value attribute cannot be null");
}
m_value = value;
}
Snmp4JValue(final int syntax, final byte[] bytes) {
switch (syntax) {
case SMIConstants.SYNTAX_INTEGER: {
m_value = new Integer32(new BigInteger(bytes).intValue());
break;
}
case SMIConstants.SYNTAX_COUNTER32: {
m_value = new Counter32(new BigInteger(bytes).longValue());
break;
}
case SMIConstants.SYNTAX_COUNTER64: {
m_value = new Counter64(new BigInteger(bytes).longValue());
break;
}
case SMIConstants.SYNTAX_TIMETICKS: {
m_value = new TimeTicks(new BigInteger(bytes).longValue());
break;
}
case SMIConstants.SYNTAX_UNSIGNED_INTEGER32: {
m_value = new UnsignedInteger32(new BigInteger(bytes).longValue());
break;
}
case SMIConstants.SYNTAX_IPADDRESS: {
try {
m_value = new IpAddress(InetAddress.getByAddress(bytes));
} catch (final UnknownHostException e) {
throw new IllegalArgumentException("unable to create InetAddress from bytes: "+e.getMessage());
}
break;
}
case SMIConstants.SYNTAX_OBJECT_IDENTIFIER: {
m_value = new OID(new String(bytes));
break;
}
case SMIConstants.SYNTAX_OCTET_STRING: {
m_value = new OctetString(bytes);
break;
}
case SMIConstants.SYNTAX_OPAQUE: {
m_value = new Opaque(bytes);
break;
}
case SMIConstants.EXCEPTION_END_OF_MIB_VIEW: {
m_value = Null.endOfMibView;
break;
}
case SMIConstants.EXCEPTION_NO_SUCH_INSTANCE: {
m_value = Null.noSuchInstance;
break;
}
case SMIConstants.EXCEPTION_NO_SUCH_OBJECT: {
m_value = Null.noSuchObject;
break;
}
case SMIConstants.SYNTAX_NULL: {
m_value = new Null();
break;
}
default:
throw new IllegalArgumentException("invalid syntax "+syntax);
}
if (m_value == null) {
throw new IllegalArgumentException("value object created from syntax " + syntax + " is null");
}
}
public byte[] getBytes() {
switch (m_value.getSyntax()) {
case SMIConstants.SYNTAX_INTEGER:
case SMIConstants.SYNTAX_COUNTER32:
case SMIConstants.SYNTAX_COUNTER64:
case SMIConstants.SYNTAX_TIMETICKS:
case SMIConstants.SYNTAX_UNSIGNED_INTEGER32:
return toBigInteger().toByteArray();
case SMIConstants.SYNTAX_IPADDRESS:
return toInetAddress().getAddress();
case SMIConstants.SYNTAX_OBJECT_IDENTIFIER:
return toSnmpObjId().toString().getBytes();
case SMIConstants.SYNTAX_OCTET_STRING:
return ((OctetString)m_value).getValue();
case SMIConstants.SYNTAX_OPAQUE:
return((Opaque)m_value).getValue();
case SMIConstants.EXCEPTION_END_OF_MIB_VIEW:
case SMIConstants.EXCEPTION_NO_SUCH_INSTANCE:
case SMIConstants.EXCEPTION_NO_SUCH_OBJECT:
case SMIConstants.SYNTAX_NULL:
return new byte[0];
default:
throw new IllegalArgumentException("cannot convert "+m_value+" to a byte array");
}
}
public int getType() {
return m_value.getSyntax();
}
public boolean isEndOfMib() {
return m_value.getSyntax() == SMIConstants.EXCEPTION_END_OF_MIB_VIEW;
}
public boolean isNumeric() {
switch (m_value.getSyntax()) {
case SMIConstants.SYNTAX_INTEGER:
case SMIConstants.SYNTAX_COUNTER32:
case SMIConstants.SYNTAX_COUNTER64:
case SMIConstants.SYNTAX_TIMETICKS:
case SMIConstants.SYNTAX_UNSIGNED_INTEGER32:
return true;
default:
return false;
}
}
public int toInt() {
switch (m_value.getSyntax()) {
case SMIConstants.SYNTAX_COUNTER64:
return (int)((Counter64)m_value).getValue();
case SMIConstants.SYNTAX_INTEGER:
return ((Integer32)m_value).getValue();
case SMIConstants.SYNTAX_COUNTER32:
case SMIConstants.SYNTAX_TIMETICKS:
case SMIConstants.SYNTAX_UNSIGNED_INTEGER32:
return (int)((UnsignedInteger32)m_value).getValue();
default:
return Integer.parseInt(m_value.toString());
}
}
public long toLong() {
switch (m_value.getSyntax()) {
case SMIConstants.SYNTAX_COUNTER64:
return ((Counter64)m_value).getValue();
case SMIConstants.SYNTAX_INTEGER:
return ((Integer32)m_value).getValue();
case SMIConstants.SYNTAX_COUNTER32:
case SMIConstants.SYNTAX_TIMETICKS:
case SMIConstants.SYNTAX_UNSIGNED_INTEGER32:
return ((UnsignedInteger32)m_value).getValue();
case SMIConstants.SYNTAX_OCTET_STRING:
return (convertStringToLong());
default:
return Long.parseLong(m_value.toString());
}
}
private long convertStringToLong() {
return Double.valueOf(m_value.toString()).longValue();
}
public String toDisplayString() {
switch (m_value.getSyntax()) {
case SMIConstants.SYNTAX_OBJECT_IDENTIFIER :
return SnmpObjId.get(((OID)m_value).getValue()).toString();
case SMIConstants.SYNTAX_TIMETICKS :
return Long.toString(toLong());
case SMIConstants.SYNTAX_OCTET_STRING :
return toStringDottingCntrlChars(((OctetString)m_value).getValue());
case SMIConstants.SYNTAX_NULL:
return "";
default :
return m_value.toString();
}
}
private String toStringDottingCntrlChars(final byte[] value) {
final byte[] results = new byte[value.length];
for (int i = 0; i < value.length; i++) {
results[i] = Character.isISOControl((char)value[i]) ? (byte)'.' : value[i];
}
return new String(results);
}
public InetAddress toInetAddress() {
switch (m_value.getSyntax()) {
case SMIConstants.SYNTAX_IPADDRESS:
return ((IpAddress)m_value).getInetAddress();
default:
throw new IllegalArgumentException("cannot convert "+m_value+" to an InetAddress");
}
}
public String toHexString() {
switch (m_value.getSyntax()) {
case SMIConstants.SYNTAX_OCTET_STRING:
return ((OctetString)m_value).toHexString().replaceAll(":", "");
default:
throw new IllegalArgumentException("cannot convert "+m_value+" to a HexString");
}
}
public String toString() {
return toDisplayString();
}
public BigInteger toBigInteger() {
switch (m_value.getSyntax()) {
case SMIConstants.SYNTAX_COUNTER64:
final Counter64 cnt = (Counter64)m_value;
if (cnt.getValue() > 0) {
return BigInteger.valueOf(cnt.getValue());
} else {
return new BigInteger(cnt.toString());
}
case SMIConstants.SYNTAX_INTEGER:
return BigInteger.valueOf(((Integer32)m_value).getValue());
case SMIConstants.SYNTAX_COUNTER32:
case SMIConstants.SYNTAX_TIMETICKS:
case SMIConstants.SYNTAX_UNSIGNED_INTEGER32:
return BigInteger.valueOf(((UnsignedInteger32)m_value).getValue());
default:
return new BigInteger(m_value.toString());
}
}
public SnmpObjId toSnmpObjId() {
switch (m_value.getSyntax()) {
case SMIConstants.SYNTAX_OBJECT_IDENTIFIER:
return SnmpObjId.get(((OID)m_value).getValue());
default:
throw new IllegalArgumentException("cannot convert "+m_value+" to an SnmpObjId");
}
}
public boolean isDisplayable() {
if (isNumeric()) {
return true;
}
if (getType() == SnmpValue.SNMP_OBJECT_IDENTIFIER || getType() == SnmpValue.SNMP_IPADDRESS) {
return true;
}
if (getType() == SnmpValue.SNMP_OCTET_STRING) {
return allBytesDisplayable(getBytes());
}
return false;
}
public boolean isNull() {
return getType() == SnmpValue.SNMP_NULL;
}
public Variable getVariable() {
return m_value;
}
public boolean isError() {
switch (getType()) {
case SnmpValue.SNMP_NO_SUCH_INSTANCE:
case SnmpValue.SNMP_NO_SUCH_OBJECT:
return true;
default:
return false;
}
}
@Override
public int hashCode() {
if (m_value == null) return 5231;
return m_value.hashCode();
}
@Override
public boolean equals(final Object obj) {
if (obj == null) return false;
if (obj == this) return true;
if (obj.getClass() != getClass()) return false;
final Snmp4JValue that = (Snmp4JValue)obj;
return new EqualsBuilder()
.append(this.m_value, that.m_value)
.isEquals();
}
}