001: /*
002: * Copyright (c) 2003, Intracom S.A. - www.intracom.com
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: * This package and its source code is available at www.jboss.org
019: **/
020: package org.jboss.jmx.adaptor.snmp.agent;
021:
022: import java.util.Date;
023: import java.util.HashMap;
024: import java.util.Map;
025:
026: import org.jboss.logging.Logger;
027: import org.opennms.protocols.snmp.SnmpCounter64;
028: import org.opennms.protocols.snmp.SnmpInt32;
029: import org.opennms.protocols.snmp.SnmpObjectId;
030: import org.opennms.protocols.snmp.SnmpOctetString;
031: import org.opennms.protocols.snmp.SnmpVarBind;
032:
033: /**
034: * <tt>SnmpVarBindFactory</tt> implements the infrastructure required to
035: * generate SNMP variable bindings from generic Object instances.
036: * For each handled type (integer, string, e.t.c.) a corresponding maker class
037: * is present that "knows" how to make and populate the coresponding variable
038: * binding (SnmpInt32, SnmpOctetString). The mapping between types and makers
039: * is held in a hash map for optimised performance.
040: *
041: * @version $Revision: 23902 $
042: *
043: * @author <a href="mailto:spol@intracom.gr">Spyros Pollatos</a>
044: * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
045: **/
046: public class SnmpVarBindFactory {
047: /** The logger object */
048: private static final Logger log = Logger
049: .getLogger(SnmpVarBindFactory.class);
050:
051: /** Contains "type - maker" tupples */
052: private Map makers = new HashMap();
053:
054: /** Default Maker */
055: private final Maker defaultMaker = new SnmpObjectMaker();
056:
057: /**
058: * CTOR - Initialises the factory with the known handled types and maker
059: * instances
060: **/
061: public SnmpVarBindFactory() {
062: makers.put("java.lang.String", new SnmpOctetStringMaker());
063: makers.put("java.lang.Integer", new SnmpInt32Maker());
064: makers.put("java.lang.Long", new SnmpCounter64Maker());
065: makers.put("java.math.BigInteger", new SnmpCounter64Maker());
066: makers.put("java.util.Date", new SnmpDateMaker());
067: }
068:
069: /**
070: * The factory method. A lookup is performed based on the type of the
071: * provided value, as this is returned by "getClass().getName()". If a
072: * match is found the call is delegated to the returned maker.
073: **/
074: public SnmpVarBind make(String oid, Object value)
075: throws MappingFailedException {
076: // Get value type and locate the maker
077: String type = value.getClass().getName();
078: Maker m = (Maker) this .makers.get(type);
079:
080: // Delegate where type match is found. If not use generic varbind maker
081: if (m == null) {
082: log.warn("Value type \"" + type + "\" for OID " + oid
083: + " encountered. Using default VarBind maker");
084:
085: return defaultMaker.make(oid, value);
086: } else
087: return m.make(oid, value);
088: }
089:
090: /**
091: * The generic interface that should be implemented by all makers.
092: **/
093: interface Maker {
094: public SnmpVarBind make(String oid, Object value)
095: throws MappingFailedException;
096: }
097:
098: /**
099: * Generates unsigned integer SNMP variable bindings
100: **/
101: class SnmpInt32Maker implements Maker {
102: public SnmpVarBind make(String oid, Object value)
103: throws MappingFailedException {
104: Integer i = (Integer) value;
105:
106: return new SnmpVarBind(new SnmpObjectId(oid),
107: new SnmpInt32(i));
108: }
109: } // class SnmpInt32Maker
110:
111: /**
112: * Generates unsigned long integer SNMP variable bindings
113: **/
114: class SnmpCounter64Maker implements Maker {
115: public SnmpVarBind make(String oid, Object value)
116: throws MappingFailedException {
117: Long l = (Long) value;
118:
119: return new SnmpVarBind(new SnmpObjectId(oid),
120: new SnmpCounter64(l.longValue()));
121: }
122: } // class SnmpCounter64Maker
123:
124: /**
125: * Generates octet string SNMP variable bindings
126: **/
127: class SnmpOctetStringMaker implements Maker {
128: public SnmpVarBind make(String oid, Object value)
129: throws MappingFailedException {
130: String s = (String) value;
131:
132: return new SnmpVarBind(new SnmpObjectId(oid),
133: new SnmpOctetString(s.getBytes()));
134: }
135: } // class OctetStringMaker
136:
137: /**
138: * Generates octet string SNMP variable bindings from dates
139: **/
140: class SnmpDateMaker implements Maker {
141: public SnmpVarBind make(String oid, Object value)
142: throws MappingFailedException {
143: Date d = (Date) value;
144: SnmpOctetStringMaker sMaker = new SnmpOctetStringMaker();
145:
146: return sMaker.make(oid, d.toString());
147: }
148: } // class SnmpDateMaker
149:
150: /**
151: * Generates octet string SNMP variable bindings from objects
152: **/
153: class SnmpObjectMaker implements Maker {
154: public SnmpVarBind make(String oid, Object value)
155: throws MappingFailedException {
156: SnmpOctetStringMaker sMaker = new SnmpOctetStringMaker();
157:
158: return sMaker.make(oid, value.toString());
159: }
160: } // class SnmpDateMaker
161:
162: } // class SnmpVarBindFactory
|