SNMP Stack 5_1

uk.co.westhawk.snmp.stack
Class SnmpContextPool

java.lang.Object
  |
  +--uk.co.westhawk.snmp.stack.SnmpContextPool
All Implemented Interfaces:
SnmpContextBasisFace, SnmpContextFace
Direct Known Subclasses:
SnmpContextv2cPool

public class SnmpContextPool
extends java.lang.Object
implements SnmpContextFace

This class contains the pool of SNMP v1 contexts. This class reuses the existings contexts instead of creating a new one every time.

Every time a property changes the pool is checked for a SnmpContext context that matches all the new properties of this class. If no such context exists, a new one is made. The PDUs associated with the old context remain associated with the old context.

A counter indicates the number of times the context is referenced. The counter is decreased when destroy() is called. When the counter reaches zero, the context is released.

Note that because the underlying context can change when a property is changed and the PDUs remain associated with the old context, all properties have to be set BEFORE a PDU is sent.

Thanks to Seon Lee (slee@virtc.com) for reporting thread safety problems.

Version:
$Revision: 3.20 $ $Date: 2006/06/19 13:58:52 $
Author:
Birgit Arkesteijn
See Also:
SnmpContext, SnmpContextv2cPool, SnmpContextv3Pool

Field Summary
protected  java.lang.String bindAddr
           
protected  java.lang.String community
           
protected  SnmpContext context
           
protected static java.util.Hashtable contextPool
           
protected  java.lang.String hostname
           
protected  int hostPort
           
protected  java.lang.String socketType
           
 
Fields inherited from interface uk.co.westhawk.snmp.stack.SnmpContextFace
DEFAULT_COMMUNITY, version_id
 
Fields inherited from interface uk.co.westhawk.snmp.stack.SnmpContextBasisFace
DEFAULT_PORT, KVM_SOCKET, MAXPDU, MSS, NETSCAPE_SOCKET, STANDARD_SOCKET, TCP_SOCKET
 
Constructor Summary
SnmpContextPool(java.lang.String host, int port)
          Constructor, using the Standard socket.
SnmpContextPool(java.lang.String host, int port, java.lang.String typeSocket)
          Constructor.
SnmpContextPool(java.lang.String host, int port, java.lang.String comm, java.lang.String typeSocket)
          Constructor.
SnmpContextPool(java.lang.String host, int port, java.lang.String comm, java.lang.String bindAddress, java.lang.String typeSocket)
          Constructor.
 
Method Summary
 boolean addPdu(Pdu pdu)
          Adds a PDU to the context.
 void addRequestPduListener(RequestPduListener l)
          Adds the specified request pdu listener to receive PDUs on the default request pdu port 161 from the host that matches this context.
 void addRequestPduListener(RequestPduListener l, int port)
          Adds the specified request pdu listener to receive PDUs on the specified port from the host that matches this context.
 void addRequestPduListener(RequestPduListener l, ListeningContextPool lcontext)
          Adds the specified request pdu listener to receive PDUs on the specified listening context that matches this context.
 void addTrapListener(TrapListener l)
          Adds the specified trap listener.
 void addTrapListener(TrapListener l, int port)
          Adds the specified trap listener to receive traps on the specified port from the host that matches this context.
 void addTrapListener(TrapListener l, ListeningContextPool lcontext)
          Adds the specified trap listener to receive traps on the specified listening context that matches this context.
 java.lang.Object clone()
          This method is not supported.
 void destroy()
          Releases the resources held by this context.
 void destroyPool()
          Destroys all the contexts (v1 and v2c) in the pool and empties the pool.
 void dumpContexts(java.lang.String title)
          Dumps the pool of contexts.
 byte[] encodePacket(byte msg_type, int rId, int errstat, int errind, java.util.Enumeration ve, java.lang.Object obj)
          Encodes a PDU packet.
 java.lang.String getBindAddress()
          Returns the local bind address.
 java.lang.String getCommunity()
          Returns the community name.
 java.lang.String getHashKey()
          Returns the hash key.
 java.lang.String getHost()
          Returns the host.
protected  SnmpContext getMatchingContext()
          Returns a context from the pool.
 int getPort()
          Returns the port number.
 java.lang.String getReceivedFromHostAddress()
          Returns the IP address string aaa.bbb.ccc.ddd (IPv4) or a:b:c:d:e:f:g:h (IPv6) of the (latest) host the packets where received from.
 java.lang.String getSendToHostAddress()
          Returns the IP address string aaa.bbb.ccc.ddd (IPv4) or a:b:c:d:e:f:g:h (IPv6) of the host the packets where sent to.
 java.lang.String getTypeSocket()
          Returns the type of socket.
 int getVersion()
          Returns the SNMP version of the context.
 boolean isDestroyed()
          Returns whether or not this context has been destroyed.
 Pdu processIncomingPdu(byte[] message)
          Processes the incoming PDU with the current context.
 boolean removePdu(int requestId)
          Removes a PDU from the context.
 void removeRequestPduListener(RequestPduListener l)
          Removes the specified request pdu listener from listening for packets on the default request pdu port 161.
 void removeRequestPduListener(RequestPduListener l, int port)
          Removes the specified request pdu listener from listening for packets on the specified port.
 void removeRequestPduListener(RequestPduListener l, ListeningContextPool lcontext)
          Removes the specified request pdu listener from listening for packets on the specified listening context.
 void removeTrapListener(TrapListener l)
          Removes the specified trap listener.
 void removeTrapListener(TrapListener l, int port)
          Removes the specified trap listener from listening for packets on the specified port.
 void removeTrapListener(TrapListener l, ListeningContextPool lcontext)
          Removes the specified trap listener from listening for packets on the specified listening context.
 void sendPacket(byte[] packet)
          Sends an encoded PDU.
 void setCommunity(java.lang.String newCommunity)
          Sets the community name.
 java.lang.String toString()
          Returns a string representation of the object.
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

contextPool

protected static java.util.Hashtable contextPool

context

protected SnmpContext context

hostname

protected java.lang.String hostname

socketType

protected java.lang.String socketType

bindAddr

protected java.lang.String bindAddr

hostPort

protected int hostPort

community

protected java.lang.String community
Constructor Detail

SnmpContextPool

public SnmpContextPool(java.lang.String host,
                       int port)
                throws java.io.IOException
Constructor, using the Standard socket.

Parameters:
host - The host to which the PDU will be sent
port - The port where the SNMP server will be
See Also:
SnmpContext.SnmpContext(String, int)

SnmpContextPool

public SnmpContextPool(java.lang.String host,
                       int port,
                       java.lang.String typeSocket)
                throws java.io.IOException
Constructor.

Parameters:
host - The host to which the PDU will be sent
port - The port where the SNMP server will be
typeSocket - The type of socket to use.
See Also:
SnmpContext.SnmpContext(String, int, String), SnmpContextBasisFace.STANDARD_SOCKET, SnmpContextBasisFace.TCP_SOCKET, SnmpContextBasisFace.NETSCAPE_SOCKET, SnmpContextBasisFace.KVM_SOCKET

SnmpContextPool

public SnmpContextPool(java.lang.String host,
                       int port,
                       java.lang.String comm,
                       java.lang.String typeSocket)
                throws java.io.IOException
Constructor.

Parameters:
host - The host to which the PDU will be sent
port - The port where the SNMP server will be
comm - The community name.
typeSocket - The type of socket to use.
Since:
4_12
See Also:
SnmpContextBasisFace.STANDARD_SOCKET, SnmpContextBasisFace.TCP_SOCKET, SnmpContextBasisFace.NETSCAPE_SOCKET, SnmpContextBasisFace.KVM_SOCKET

SnmpContextPool

public SnmpContextPool(java.lang.String host,
                       int port,
                       java.lang.String comm,
                       java.lang.String bindAddress,
                       java.lang.String typeSocket)
                throws java.io.IOException
Constructor.

Parameters:
host - The host to which the PDU will be sent
port - The port where the SNMP server will be
comm - The community name.
bindAddress - The local address the server will bind to
typeSocket - The type of socket to use.
Since:
4_14
See Also:
SnmpContextBasisFace.STANDARD_SOCKET, SnmpContextBasisFace.TCP_SOCKET, SnmpContextBasisFace.NETSCAPE_SOCKET, SnmpContextBasisFace.KVM_SOCKET
Method Detail

getVersion

public int getVersion()
Description copied from interface: SnmpContextBasisFace
Returns the SNMP version of the context.

Specified by:
getVersion in interface SnmpContextBasisFace
Returns:
The version
See Also:
SnmpConstants.SNMP_VERSION_1, SnmpConstants.SNMP_VERSION_2c, SnmpConstants.SNMP_VERSION_3

getHost

public java.lang.String getHost()
Description copied from interface: SnmpContextBasisFace
Returns the host.

Specified by:
getHost in interface SnmpContextBasisFace
Returns:
The host

getPort

public int getPort()
Description copied from interface: SnmpContextBasisFace
Returns the port number.

Specified by:
getPort in interface SnmpContextBasisFace
Returns:
The port no

getBindAddress

public java.lang.String getBindAddress()
Description copied from interface: SnmpContextBasisFace
Returns the local bind address. If bindAddress is null, then the system will pick up a valid local address to bind the socket.

Specified by:
getBindAddress in interface SnmpContextBasisFace
Returns:
The local bind address

getTypeSocket

public java.lang.String getTypeSocket()
Description copied from interface: SnmpContextBasisFace
Returns the type of socket.

Specified by:
getTypeSocket in interface SnmpContextBasisFace
Returns:
The type of socket
See Also:
SnmpContextBasisFace.STANDARD_SOCKET, SnmpContextBasisFace.TCP_SOCKET, SnmpContextBasisFace.NETSCAPE_SOCKET, SnmpContextBasisFace.KVM_SOCKET

getSendToHostAddress

public java.lang.String getSendToHostAddress()
Description copied from interface: SnmpContextBasisFace
Returns the IP address string aaa.bbb.ccc.ddd (IPv4) or a:b:c:d:e:f:g:h (IPv6) of the host the packets where sent to.

Specified by:
getSendToHostAddress in interface SnmpContextBasisFace
Returns:
The IP address of the host the packets where sent to.
See Also:
ContextSocketFace.getSendToHostAddress()

getReceivedFromHostAddress

public java.lang.String getReceivedFromHostAddress()
Description copied from interface: SnmpContextBasisFace
Returns the IP address string aaa.bbb.ccc.ddd (IPv4) or a:b:c:d:e:f:g:h (IPv6) of the (latest) host the packets where received from.

Specified by:
getReceivedFromHostAddress in interface SnmpContextBasisFace
Returns:
The IP address of the (latest) host the packets where received from.
See Also:
ContextSocketFace.getReceivedFromHostAddress()

getCommunity

public java.lang.String getCommunity()
Description copied from interface: SnmpContextFace
Returns the community name.

Specified by:
getCommunity in interface SnmpContextFace

setCommunity

public void setCommunity(java.lang.String newCommunity)
Description copied from interface: SnmpContextFace
Sets the community name. This community name will be used for all PDUs sent with this context. The default community name is public.

Specified by:
setCommunity in interface SnmpContextFace
See Also:
SnmpContextFace.DEFAULT_COMMUNITY

addPdu

public boolean addPdu(Pdu pdu)
               throws java.io.IOException,
                      PduException
Description copied from interface: SnmpContextBasisFace
Adds a PDU to the context. This is for internal use only and should NOT be called by the developer. This is called by the the Pdu itself and is added to the interface to cover the different kind of Contexts.

Specified by:
addPdu in interface SnmpContextBasisFace
Parameters:
pdu - the PDU
Returns:
whether the PDU has been successfully added
java.io.IOException
PduException

removePdu

public boolean removePdu(int requestId)
Description copied from interface: SnmpContextBasisFace
Removes a PDU from the context. This is for internal use only and should NOT be called by the developer. This is called by the the PDU itself and is added to the interface to cover the different kind of Contexts.

Specified by:
removePdu in interface SnmpContextBasisFace
Returns:
whether the PDU has been successfully removed

encodePacket

public byte[] encodePacket(byte msg_type,
                           int rId,
                           int errstat,
                           int errind,
                           java.util.Enumeration ve,
                           java.lang.Object obj)
                    throws java.io.IOException,
                           EncodingException
Encodes a PDU packet.

Specified by:
encodePacket in interface SnmpContextBasisFace
Parameters:
msg_type - The message type
rId - The message id
errstat - The error status
errind - The error index
ve - The varbind list
obj - Additional object (only used in SNMPv3)
Returns:
The encoded packet
java.io.IOException
EncodingException

sendPacket

public void sendPacket(byte[] packet)
Description copied from interface: SnmpContextBasisFace
Sends an encoded PDU. This is for internal use only and should NOT be called by the developer. This is called by the the PDU itself and is added to the interface to cover the different kind of Contexts.

Specified by:
sendPacket in interface SnmpContextBasisFace
Parameters:
packet - The encoded packet

destroy

public void destroy()
Releases the resources held by this context. This method will decrement the reference counter. When the reference counter reaches zero the actual context is removed from the pool and destroyed.

Specified by:
destroy in interface SnmpContextBasisFace

destroyPool

public void destroyPool()
Destroys all the contexts (v1 and v2c) in the pool and empties the pool. The underlying implementation uses the same hashtable for both the v1 and the v2c contexts.

Since:
4_14
See Also:
destroy()

isDestroyed

public boolean isDestroyed()
Description copied from interface: SnmpContextBasisFace
Returns whether or not this context has been destroyed.

Specified by:
isDestroyed in interface SnmpContextBasisFace

getMatchingContext

protected SnmpContext getMatchingContext()
                                  throws java.io.IOException
Returns a context from the pool. This methods checks for an existing context that matches all our properties. If such a context does not exist, a new one is created and added to the pool.

Returns:
A context from the pool
java.io.IOException
See Also:
getHashKey()

dumpContexts

public void dumpContexts(java.lang.String title)
Dumps the pool of contexts. This is for debug purposes.

Parameters:
title - The title of the dump

getHashKey

public java.lang.String getHashKey()
Returns the hash key. This key is built out of all properties. It serves as key for the hashtable of (v1) contexts.

Specified by:
getHashKey in interface SnmpContextBasisFace
Returns:
The hash key

addTrapListener

public void addTrapListener(TrapListener l)
                     throws java.io.IOException
Adds the specified trap listener. The listener will be added to the current context, not to all the contexts in the hashtable.

Specified by:
addTrapListener in interface SnmpContextBasisFace
Parameters:
l - The trap listener
java.io.IOException
See Also:
AbstractSnmpContext.addTrapListener(uk.co.westhawk.snmp.event.TrapListener)

removeTrapListener

public void removeTrapListener(TrapListener l)
                        throws java.io.IOException
Removes the specified trap listener. The listener will be removed from the current context, not from all the contexts in the hashtable.

Specified by:
removeTrapListener in interface SnmpContextBasisFace
Parameters:
l - The trap listener
java.io.IOException
See Also:
AbstractSnmpContext.removeTrapListener(uk.co.westhawk.snmp.event.TrapListener)

addTrapListener

public void addTrapListener(TrapListener l,
                            int port)
                     throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Adds the specified trap listener to receive traps on the specified port from the host that matches this context.

The ListeningContext class will do the actual listening for traps. This context will add itself to a ListeningContextPool object and will only pass the event to its listeners if the pdu matches this context and is a trap pdu.

Specified by:
addTrapListener in interface SnmpContextBasisFace
Parameters:
l - The trap listener
port - The port the traps are received on
java.io.IOException
See Also:
ListeningContextPool.ListeningContextPool(int, String, String), ListeningContextPool.addRawPduListener(RawPduListener)

removeTrapListener

public void removeTrapListener(TrapListener l,
                               int port)
                        throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Removes the specified trap listener from listening for packets on the specified port.

The listener will not be removed from all ListeningContext objects that are in the ListeningContextPool. In order to do that, use ListeningContextPool.removeTrapListenerFromPool()

Specified by:
removeTrapListener in interface SnmpContextBasisFace
Parameters:
l - The trap listener
port - The port the traps are received on
java.io.IOException
See Also:
ListeningContextPool.ListeningContextPool(int, String, String), ListeningContextPool.removeRawPduListener(RawPduListener), ListeningContextPool.removeRawPduListenerFromPool(RawPduListener)

addTrapListener

public void addTrapListener(TrapListener l,
                            ListeningContextPool lcontext)
                     throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Adds the specified trap listener to receive traps on the specified listening context that matches this context.

The ListeningContext class will do the actual listening for traps. This context will add itself to a ListeningContextPool object and will only pass the event to its listeners if the pdu matches this context and is a trap pdu.

Specified by:
addTrapListener in interface SnmpContextBasisFace
Parameters:
l - The trap listener
lcontext - The listening context
java.io.IOException
See Also:
ListeningContextPool.ListeningContextPool(int, String, String), ListeningContextPool.addRawPduListener(RawPduListener)

removeTrapListener

public void removeTrapListener(TrapListener l,
                               ListeningContextPool lcontext)
                        throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Removes the specified trap listener from listening for packets on the specified listening context.

The listener will not be removed from all ListeningContext objects that are in the ListeningContextPool. In order to do that, use ListeningContextPool.removeTrapListenerFromPool()

Specified by:
removeTrapListener in interface SnmpContextBasisFace
Parameters:
l - The trap listener
lcontext - The listening context
java.io.IOException
See Also:
ListeningContextPool.ListeningContextPool(int, String, String), ListeningContextPool.removeRawPduListener(RawPduListener), ListeningContextPool.removeRawPduListenerFromPool(RawPduListener)

addRequestPduListener

public void addRequestPduListener(RequestPduListener l)
                           throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Adds the specified request pdu listener to receive PDUs on the default request pdu port 161 from the host that matches this context.

The ListeningContext class will do the actual listening for PDUs. This context will add itself to a ListeningContextPool object and will only pass the event to its listeners if the pdu matches this context and is a request pdu.

Don't use the TCP_SOCKET when listening for request PDUs. It doesn't provide functionality to send a response back.

Specified by:
addRequestPduListener in interface SnmpContextBasisFace
Parameters:
l - The request PDU listener
java.io.IOException
See Also:
SnmpContextBasisFace.addRequestPduListener(RequestPduListener, int), SnmpContextBasisFace.DEFAULT_PORT

removeRequestPduListener

public void removeRequestPduListener(RequestPduListener l)
                              throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Removes the specified request pdu listener from listening for packets on the default request pdu port 161.

The listener will not be removed from all ListeningContext objects that are in the ListeningContextPool. In order to do that, use ListeningContextPool.removeRequestPduListenerFromPool()

Specified by:
removeRequestPduListener in interface SnmpContextBasisFace
Parameters:
l - The request PDU listener
java.io.IOException
See Also:
SnmpContextBasisFace.removeRequestPduListener(RequestPduListener, int), SnmpContextBasisFace.DEFAULT_PORT

addRequestPduListener

public void addRequestPduListener(RequestPduListener l,
                                  int port)
                           throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Adds the specified request pdu listener to receive PDUs on the specified port from the host that matches this context.

The ListeningContext class will do the actual listening for PDUs. This context will add itself to a ListeningContextPool object and will only pass the event to its listeners if the pdu matches this context and is a request pdu.

Don't use the TCP_SOCKET when listening for request PDUs. It doesn't provide functionality to send a response back.

Specified by:
addRequestPduListener in interface SnmpContextBasisFace
Parameters:
l - The request PDU listener
port - The port the request PDUs are received on
java.io.IOException
See Also:
ListeningContextPool.ListeningContextPool(int, String, String), ListeningContextPool.addRawPduListener(RawPduListener)

removeRequestPduListener

public void removeRequestPduListener(RequestPduListener l,
                                     int port)
                              throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Removes the specified request pdu listener from listening for packets on the specified port.

The listener will not be removed from all ListeningContext objects that are in the ListeningContextPool. In order to do that, use ListeningContextPool.removeRequestPduListenerFromPool()

Specified by:
removeRequestPduListener in interface SnmpContextBasisFace
Parameters:
l - The request PDU listener
port - The port the request PDUs are received on
java.io.IOException
See Also:
ListeningContextPool.ListeningContextPool(int, String, String), ListeningContextPool.removeRawPduListener(RawPduListener), ListeningContextPool.removeRawPduListenerFromPool(RawPduListener)

addRequestPduListener

public void addRequestPduListener(RequestPduListener l,
                                  ListeningContextPool lcontext)
                           throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Adds the specified request pdu listener to receive PDUs on the specified listening context that matches this context.

The ListeningContext class will do the actual listening for PDUs. This context will add itself to a ListeningContextPool object and will only pass the event to its listeners if the pdu matches this context and is a request pdu.

Don't use the TCP_SOCKET when listening for request PDUs. It doesn't provide functionality to send a response back.

Specified by:
addRequestPduListener in interface SnmpContextBasisFace
Parameters:
l - The request PDU listener
lcontext - The listening context
java.io.IOException
See Also:
ListeningContextPool.ListeningContextPool(int, String, String), ListeningContextPool.addRawPduListener(RawPduListener)

removeRequestPduListener

public void removeRequestPduListener(RequestPduListener l,
                                     ListeningContextPool lcontext)
                              throws java.io.IOException
Description copied from interface: SnmpContextBasisFace
Removes the specified request pdu listener from listening for packets on the specified listening context.

The listener will not be removed from all ListeningContext objects that are in the ListeningContextPool. In order to do that, use ListeningContextPool.removeRequestPduListenerFromPool()

Specified by:
removeRequestPduListener in interface SnmpContextBasisFace
Parameters:
l - The request PDU listener
lcontext - The listening context
java.io.IOException
See Also:
ListeningContextPool.ListeningContextPool(int, String, String), ListeningContextPool.removeRawPduListener(RawPduListener), ListeningContextPool.removeRawPduListenerFromPool(RawPduListener)

processIncomingPdu

public Pdu processIncomingPdu(byte[] message)
                       throws DecodingException,
                              java.io.IOException
Processes the incoming PDU with the current context.

Specified by:
processIncomingPdu in interface SnmpContextBasisFace
DecodingException
java.io.IOException
See Also:
SnmpContext.processIncomingPdu(byte[])

toString

public java.lang.String toString()
Returns a string representation of the object.

Overrides:
toString in class java.lang.Object
Returns:
The string

clone

public java.lang.Object clone()
                       throws java.lang.CloneNotSupportedException
This method is not supported. It will throw a CloneNotSupportedException.

Specified by:
clone in interface SnmpContextBasisFace
Overrides:
clone in class java.lang.Object
Throws:
java.lang.CloneNotSupportedException - Thrown when the constructor generates an IOException or when in one of the Pool classes.
Since:
4_14

SNMP Stack 5_1