/* * Copyright (c) 2003, Intracom S.A. - www.intracom.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * This package and its source code is available at www.jboss.org **/ package org.jboss.jmx.adaptor.snmp.agent; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.jboss.logging.Logger; import org.opennms.protocols.snmp.SnmpCounter64; import org.opennms.protocols.snmp.SnmpInt32; import org.opennms.protocols.snmp.SnmpObjectId; import org.opennms.protocols.snmp.SnmpOctetString; import org.opennms.protocols.snmp.SnmpVarBind; /** * <tt>SnmpVarBindFactory</tt> implements the infrastructure required to * generate SNMP variable bindings from generic Object instances. * For each handled type (integer, string, e.t.c.) a corresponding maker class * is present that "knows" how to make and populate the coresponding variable * binding (SnmpInt32, SnmpOctetString). The mapping between types and makers * is held in a hash map for optimised performance. * * @version $Revision: 44604 $ * * @author <a href="mailto:spol@intracom.gr">Spyros Pollatos</a> * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a> **/ public class SnmpVarBindFactory { /** The logger object */ private static final Logger log = Logger.getLogger(SnmpVarBindFactory.class); /** Contains "type - maker" tupples */ private Map makers = new HashMap(); /** Default Maker */ private final Maker defaultMaker = new SnmpObjectMaker(); /** * CTOR - Initialises the factory with the known handled types and maker * instances **/ public SnmpVarBindFactory() { makers.put("java.lang.String", new SnmpOctetStringMaker()); makers.put("java.lang.Integer", new SnmpInt32Maker()); makers.put("java.lang.Long", new SnmpCounter64Maker()); makers.put("java.math.BigInteger", new SnmpCounter64Maker()); makers.put("java.util.Date", new SnmpDateMaker()); } /** * The factory method. A lookup is performed based on the type of the * provided value, as this is returned by "getClass().getName()". If a * match is found the call is delegated to the returned maker. **/ public SnmpVarBind make(String oid, Object value) throws MappingFailedException { // Get value type and locate the maker String type = value.getClass().getName(); Maker m = (Maker)this.makers.get(type); // Delegate where type match is found. If not use generic varbind maker if (m == null) { log.warn("Value type \"" + type + "\" for OID " + oid + " encountered. Using default VarBind maker"); return defaultMaker.make(oid, value); } else return m.make(oid, value); } /** * The generic interface that should be implemented by all makers. **/ interface Maker { public SnmpVarBind make(String oid, Object value) throws MappingFailedException; } /** * Generates unsigned integer SNMP variable bindings **/ class SnmpInt32Maker implements Maker { public SnmpVarBind make(String oid, Object value) throws MappingFailedException { Integer i = (Integer)value; return new SnmpVarBind(new SnmpObjectId(oid), new SnmpInt32(i)); } } // class SnmpInt32Maker /** * Generates unsigned long integer SNMP variable bindings **/ class SnmpCounter64Maker implements Maker { public SnmpVarBind make(String oid, Object value) throws MappingFailedException { Long l = (Long)value; return new SnmpVarBind(new SnmpObjectId(oid), new SnmpCounter64(l.longValue())); } } // class SnmpCounter64Maker /** * Generates octet string SNMP variable bindings **/ class SnmpOctetStringMaker implements Maker { public SnmpVarBind make(String oid, Object value) throws MappingFailedException { String s = (String)value; return new SnmpVarBind(new SnmpObjectId(oid), new SnmpOctetString(s.getBytes())); } } // class OctetStringMaker /** * Generates octet string SNMP variable bindings from dates **/ class SnmpDateMaker implements Maker { public SnmpVarBind make(String oid, Object value) throws MappingFailedException { Date d = (Date)value; SnmpOctetStringMaker sMaker = new SnmpOctetStringMaker(); return sMaker.make(oid, d.toString()); } } // class SnmpDateMaker /** * Generates octet string SNMP variable bindings from objects **/ class SnmpObjectMaker implements Maker { public SnmpVarBind make(String oid, Object value) throws MappingFailedException { SnmpOctetStringMaker sMaker = new SnmpOctetStringMaker(); return sMaker.make(oid, value.toString()); } } // class SnmpDateMaker } // class SnmpVarBindFactory