📄 genericaddress.java
字号:
/*_############################################################################ _## _## SNMP4J - GenericAddress.java _## _## Copyright 2003-2006 Frank Fock and Jochen Katz (SNMP4J.org) _## _## Licensed under the Apache License, Version 2.0 (the "License"); _## you may not use this file except in compliance with the License. _## You may obtain a copy of the License at _## _## http://www.apache.org/licenses/LICENSE-2.0 _## _## Unless required by applicable law or agreed to in writing, software _## distributed under the License is distributed on an "AS IS" BASIS, _## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. _## See the License for the specific language governing permissions and _## limitations under the License. _## _##########################################################################*/package org.snmp4j.smi;import java.io.*;import java.util.*;import org.snmp4j.log.*;import org.snmp4j.asn1.BERInputStream;import org.snmp4j.SNMP4JSettings;/** * The <code>GenericAddress</code> implements the decorator and factory * design pattern to provide a generic address type. * <p> * To register address types other than the default, set the system property * {@link #ADDRESS_TYPES_PROPERTIES} before calling the {@link #parse} method * for the first time. * * @author Frank Fock * @version 1.7 */public class GenericAddress extends SMIAddress { static final long serialVersionUID = -6102594326202231511L; public static final String ADDRESS_TYPES_PROPERTIES = "org.snmp4j.addresses"; private static final String ADDRESS_TYPES_PROPERTIES_DEFAULT = "address.properties"; private static final LogAdapter logger = LogFactory.getLogger(GenericAddress.class); private SMIAddress address; private static Hashtable knownAddressTypes = null; public GenericAddress() { } public GenericAddress(SMIAddress address) { this.address = address; } public int getSyntax() { return address.getSyntax(); } public boolean isValid() { if (address == null) { return false; } return address.isValid(); } public String toString() { return address.toString(); } public int hashCode() { return address.hashCode(); } public int compareTo(Object o) { return address.compareTo(o); } public boolean equals(Object o) { return address.equals(o); } public void decodeBER(BERInputStream inputStream) throws java.io.IOException { throw new UnsupportedOperationException(); } public void encodeBER(OutputStream outputStream) throws java.io.IOException { address.encodeBER(outputStream); } public int getBERLength() { return address.getBERLength(); } public void setAddress(SMIAddress address) { this.address = address; } public Address getAddress() { return address; } /** * Register Address classes from a properties file. The registered * address types are used by the {@link parse} method to type-safe * instantiate sub-classes from <code>Address</code> from a * <code>String</code>. */ private synchronized static void registerAddressTypes() { if (SNMP4JSettings.isExtensibilityEnabled()) { String addresses = System.getProperty(ADDRESS_TYPES_PROPERTIES, ADDRESS_TYPES_PROPERTIES_DEFAULT); InputStream is = Variable.class.getResourceAsStream(addresses); if (is == null) { throw new InternalError("Could not read '" + addresses + "' from classpath!"); } Properties props = new Properties(); try { props.load(is); Hashtable h = new Hashtable(props.size() + 1); for (Enumeration en = props.propertyNames(); en.hasMoreElements(); ) { String id = (String) en.nextElement(); String className = props.getProperty(id); try { Class c = Class.forName(className); h.put(id, c); } catch (ClassNotFoundException cnfe) { logger.error(cnfe); } } knownAddressTypes = h; } catch (IOException iox) { String txt = "Could not read '" + addresses + "': " + iox.getMessage(); logger.error(txt); throw new InternalError(txt); } finally { try { is.close(); } catch (IOException ex) { // ignore logger.warn(ex); } } } else { Hashtable h = new Hashtable(3); h.put("udp", UdpAddress.class); h.put("tcp", TcpAddress.class); h.put("ip", IpAddress.class); knownAddressTypes = h; } } /** * Parses a given transport protocol dependent address string into an * <code>Address</code> instance that is subsumed by this * <code>GenericAddress</code> object. * * @param address * an address string with a leading type specifier as defined in the * "address.properties". The format is <code>"type:address"</code> where * the format of <code>address</code> depends on <code>type</code>. * Valid values for <code>type</code> are, for example, "udp" and "tcp". * @return * a <code>Address</code> instance of the address classes specified * in "address.properties" whose type ID matched the specified ID in * <code>address</code>. If <code>address</code> cannot be parsed, * <code>null</code> is returned. * @throws IllegalArgumentException * if the address type indicator supplied is not know. */ public static Address parse(String address) { if (knownAddressTypes == null) { registerAddressTypes(); } String type = "udp"; int sep = address.indexOf(':'); if (sep > 0) { type = address.substring(0, sep); address = address.substring(sep+1); } type = type.toLowerCase(); Class c = (Class)knownAddressTypes.get(type); if (c == null) { throw new IllegalArgumentException("Address type " + type + " unknown"); } try { Address addr = (Address)c.newInstance(); if (addr.parseAddress(address)) { return addr; } return null; } catch (Exception ex) { logger.warn(ex); } return null; } /** * Parse an address form the supplied string. * @param address * an address string known by the GenericAddress. * @return boolean * @see #parse(String address) */ public boolean parseAddress(String address) { Address addr = parse(address); if (addr instanceof SMIAddress) { setAddress((SMIAddress)addr); return true; } return false; } public Object clone() { return new GenericAddress(address); } public int toInt() { throw new UnsupportedOperationException(); } public long toLong() { throw new UnsupportedOperationException(); } public OID toSubIndex(boolean impliedLength) { throw new UnsupportedOperationException(); } public void fromSubIndex(OID subIndex, boolean impliedLength) { throw new UnsupportedOperationException(); } public void setValue(String value) { if (!parseAddress(value)) { throw new IllegalArgumentException(value + " cannot be parsed by " + getClass().getName()); } } @Override public Object getValue() { return address.toString(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -