- java.lang.Object
-
- org.snmp4j.MessageDispatcherImpl
-
- All Implemented Interfaces:
MessageDispatcher
,TransportListener
- Direct Known Subclasses:
SnmpCommand.SnmpCommandMessageDispatcher
public class MessageDispatcherImpl extends java.lang.Object implements MessageDispatcher
TheMessageDispatcherImpl
decodes and dispatches incoming messages usingMessageProcessingModel
instances and encodes and sends outgoing messages using an appropriateTransportMapping
instances.The method
processMessage(org.snmp4j.TransportMapping, org.snmp4j.smi.Address, java.nio.ByteBuffer, org.snmp4j.TransportStateReference)
will be called from aTransportMapping
whereas the methodsendPdu(org.snmp4j.Target, org.snmp4j.PDU, boolean)
will be called by the application.- Version:
- 3.0
- Author:
- Frank Fock
- See Also:
Snmp
,TransportMapping
,MessageProcessingModel
,MPv1
,MPv2c
,MPv3
-
-
Constructor Summary
Constructors Constructor Description MessageDispatcherImpl()
Default constructor creates a message dispatcher without any associated message processing models.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addAuthenticationFailureListener(AuthenticationFailureListener l)
Adds a listener for authentication failure events caused by unauthenticated incoming messages.void
addCommandResponder(CommandResponder l)
Adds aCommandResponder
instance to the message dispatcher.void
addCounterListener(CounterListener counterListener)
Adds aCounterListener
.void
addMessageProcessingModel(MessageProcessingModel model)
Adds a message processing model to this message dispatcher.void
addTransportMapping(TransportMapping transport)
Adds a transport mapping.protected void
checkOutgoingMsg(Address transportAddress, int messageProcessingModel, PDU pdu)
Checks outgoing messages for consistency between PDU and target used.protected void
configureAuthoritativeEngineID(Target target, MessageProcessingModel mp)
protected PduHandle
createPduHandle()
protected void
dispatchMessage(TransportMapping sourceTransport, MessageProcessingModel mp, Address incomingAddress, BERInputStream wholeMessage, TransportStateReference tmStateReference)
Actually decodes and dispatches an incoming SNMP message using the supplied message processing model.protected void
fireAuthenticationFailure(AuthenticationFailureEvent event)
Fires anAuthenticationFailureEvent
to all registered listeners.protected void
fireIncrementCounter(CounterEvent event)
Fires a counter incrementation event.protected void
fireProcessPdu(CommandResponderEvent e)
Fires aCommandResponderEvent
.MessageProcessingModel
getMessageProcessingModel(int messageProcessingModel)
Gets theMessageProcessingModel
for the supplied message processing model ID.int
getNextRequestID()
Gets the next unique request ID.TransportMapping
getTransport(Address destAddress)
Returns a transport mapping that can handle the supplied address.java.util.Collection<TransportMapping<? extends Address>>
getTransportMappings()
Gets a collection of all registered transport mappings.boolean
isCheckOutgoingMsg()
Returns whether consistency checks for outgoing messages are activated.void
processMessage(TransportMapping sourceTransport, Address incomingAddress, java.nio.ByteBuffer wholeMessage, TransportStateReference tmStateReference)
Process an incoming SNMP message.void
processMessage(TransportMapping sourceTransport, Address incomingAddress, BERInputStream wholeMessage, TransportStateReference tmStateReference)
void
releaseStateReference(int messageProcessingModel, PduHandle pduHandle)
Release any state references associated with the suppliedPduHandle
in the specified message processing model.void
removeAuthenticationFailureListener(AuthenticationFailureListener l)
Removes anAuthenticationFailureListener
.void
removeCommandResponder(CommandResponder l)
Removes a previously addedCommandResponder
instance from the message dispatcher.CounterListener
removeCounterListener(CounterListener counterListener)
Removes aCounterListener
.void
removeMessageProcessingModel(MessageProcessingModel model)
Removes a message processing model from this message dispatcher.TransportMapping
removeTransportMapping(TransportMapping transport)
Removes a transport mapping.int
returnResponsePdu(int messageProcessingModel, int securityModel, byte[] securityName, int securityLevel, PDU pdu, int maxSizeResponseScopedPDU, StateReference stateReference, StatusInformation statusInformation)
Returns a response PDU to the sender of the corresponding request PDU.protected void
sendMessage(TransportMapping transport, Address destAddress, byte[] message, TransportStateReference tmStateReference, long timeoutMillis, int maxRetries)
Sends a message using theTransportMapping
that has been assigned for the supplied address type.PduHandle
sendPdu(Target target, PDU pdu, boolean expectResponse)
Sends a PDU to the supplied transport address.PduHandle
sendPdu(TransportMapping transportMapping, Target target, PDU pdu, boolean expectResponse)
Sends a PDU to the supplied transport address.PduHandle
sendPdu(TransportMapping transport, Target target, PDU pdu, boolean expectResponse, PduHandleCallback<PDU> pduHandleCallback)
Sends a PDU to the supplied transport address and returns thePduHandle
that uniquely identifies the request as response after the request has been sent and optional, if aPduHandleCallback
is given, it returns also thePduHandle
just before the request is sent through the the callback interface.void
setCheckOutgoingMsg(boolean checkOutgoingMsg)
Enables or disables the consistency checks for outgoing messages.
-
-
-
Method Detail
-
addMessageProcessingModel
public void addMessageProcessingModel(MessageProcessingModel model)
Adds a message processing model to this message dispatcher. If a message processing model with the same ID as the supplied one already exists it will not be changed. Please callremoveMessageProcessingModel(org.snmp4j.mp.MessageProcessingModel)
before to replace a message processing model.- Specified by:
addMessageProcessingModel
in interfaceMessageDispatcher
- Parameters:
model
- a MessageProcessingModel instance.
-
removeMessageProcessingModel
public void removeMessageProcessingModel(MessageProcessingModel model)
Removes a message processing model from this message dispatcher.- Specified by:
removeMessageProcessingModel
in interfaceMessageDispatcher
- Parameters:
model
- a previously added MessageProcessingModel instance.
-
addTransportMapping
public void addTransportMapping(TransportMapping transport)
Adds a transport mapping. When an outgoing message is processed where no specific transport mapping has been specified, then the message dispatcher will use the transport mapping that supports the supplied address class of the target.- Specified by:
addTransportMapping
in interfaceMessageDispatcher
- Parameters:
transport
- a TransportMapping instance. If there is already another transport mapping registered that supports the same address class, thentransport
will be registered but not used for messages without specific transport mapping.
-
removeTransportMapping
public TransportMapping removeTransportMapping(TransportMapping transport)
Removes a transport mapping.- Specified by:
removeTransportMapping
in interfaceMessageDispatcher
- Parameters:
transport
- a previously added TransportMapping instance.- Returns:
- the supplied TransportMapping if it has been successfully removed,
null
otherwise.
-
getTransportMappings
public java.util.Collection<TransportMapping<? extends Address>> getTransportMappings()
Gets a collection of all registered transport mappings.- Specified by:
getTransportMappings
in interfaceMessageDispatcher
- Returns:
- a Collection instance.
-
getNextRequestID
public int getNextRequestID()
Description copied from interface:MessageDispatcher
Gets the next unique request ID. The returned ID is unique across the last 2^31-1 IDs generated by this message dispatcher.- Specified by:
getNextRequestID
in interfaceMessageDispatcher
- Returns:
- an integer value in the range 1..2^31-1. The returned ID can be used to map responses to requests send through this message dispatcher.
-
createPduHandle
protected PduHandle createPduHandle()
-
sendMessage
protected void sendMessage(TransportMapping transport, Address destAddress, byte[] message, TransportStateReference tmStateReference, long timeoutMillis, int maxRetries) throws java.io.IOException
Sends a message using theTransportMapping
that has been assigned for the supplied address type.- Parameters:
transport
- the transport mapping to be used to send the message.destAddress
- the transport address where to send the message. ThedestAddress
must be compatible with the suppliedtransport
.message
- the SNMP message to send.tmStateReference
- the transport state reference that holds transport state information for this message.timeoutMillis
- maximum number of milli seconds the connection creation might take (if connection based).maxRetries
- maximum retries during connection creation.- Throws:
java.io.IOException
- if an I/O error occurred while sending the message or if there is no transport mapping defined for the supplied address type.
-
getTransport
public TransportMapping getTransport(Address destAddress)
Returns a transport mapping that can handle the supplied address.- Specified by:
getTransport
in interfaceMessageDispatcher
- Parameters:
destAddress
- an Address instance.- Returns:
- a
TransportMapping
instance that can be used to sent a SNMP message todestAddress
ornull
if such a transport mapping does not exists. - Since:
- 1.6
-
dispatchMessage
protected void dispatchMessage(TransportMapping sourceTransport, MessageProcessingModel mp, Address incomingAddress, BERInputStream wholeMessage, TransportStateReference tmStateReference) throws java.io.IOException
Actually decodes and dispatches an incoming SNMP message using the supplied message processing model.- Parameters:
sourceTransport
- aTransportMapping
that matches the incomingAddress type.mp
- aMessageProcessingModel
to process the message.incomingAddress
- theAddress
from the entity that sent this message.wholeMessage
- theBERInputStream
containing the SNMP message.tmStateReference
- the transport model state reference as defined by RFC 5590.- Throws:
java.io.IOException
- if the message cannot be decoded.
-
processMessage
public void processMessage(TransportMapping sourceTransport, Address incomingAddress, java.nio.ByteBuffer wholeMessage, TransportStateReference tmStateReference)
Description copied from interface:MessageDispatcher
Process an incoming SNMP message. The message is processed and dispatched according to the message's content, the message processing models, and the command responder available to the dispatcher.- Specified by:
processMessage
in interfaceMessageDispatcher
- Specified by:
processMessage
in interfaceTransportListener
- Parameters:
sourceTransport
- aTransportMapping
instance denoting the transport that received the message and that will be used to send any responses to this message. ThesourceTransport
has to support theincomingAddress
's implementation class.incomingAddress
- theAddress
from which the message has been received.wholeMessage
- anByteBuffer
containing the received SNMP message.tmStateReference
- the transport model state reference as defined by RFC 5590.
-
processMessage
public void processMessage(TransportMapping sourceTransport, Address incomingAddress, BERInputStream wholeMessage, TransportStateReference tmStateReference)
-
sendPdu
public PduHandle sendPdu(Target target, PDU pdu, boolean expectResponse) throws MessageException
Description copied from interface:MessageDispatcher
Sends a PDU to the supplied transport address. This method behaves like a call toMessageDispatcher.sendPdu(TransportMapping transportMapping, Target target, PDU pdu, boolean expectResponse)
withtransportMapping
set tonull
.- Specified by:
sendPdu
in interfaceMessageDispatcher
- Parameters:
target
- the target which identifies, transport address, message processing model, security model, security name and level.pdu
- the SNMP Protocol Data UnitexpectResponse
-true
if a response is expected and a state reference should be saved (if needed for the supplied message processing model).- Returns:
- an
PduHandle
that uniquely identifies this request. - Throws:
MessageException
- if sending of the PDU failed.
-
sendPdu
public PduHandle sendPdu(TransportMapping transport, Target target, PDU pdu, boolean expectResponse, PduHandleCallback<PDU> pduHandleCallback) throws MessageException
Description copied from interface:MessageDispatcher
Sends a PDU to the supplied transport address and returns thePduHandle
that uniquely identifies the request as response after the request has been sent and optional, if aPduHandleCallback
is given, it returns also thePduHandle
just before the request is sent through the the callback interface.- Specified by:
sendPdu
in interfaceMessageDispatcher
- Parameters:
transport
- theTransportMapping
to be used to send the PDU. IftransportMapping
isnull
the message dispatcher will determine the appropriate transport mapping for the given transport address.target
- the target which identifies, transport address, message processing model, security model, security name and level.pdu
- the SNMP Protocol Data UnitexpectResponse
-true
if a response is expected and a state reference should be saved (if needed for the supplied message processing model).pduHandleCallback
- an optional callback instance that is informed (if notnull
) about the newly assigned PduHandle just before the message is sent out.- Returns:
- an
PduHandle
that uniquely identifies this request. - Throws:
MessageException
- if sending of the PDU failed.
-
configureAuthoritativeEngineID
protected void configureAuthoritativeEngineID(Target target, MessageProcessingModel mp)
-
checkOutgoingMsg
protected void checkOutgoingMsg(Address transportAddress, int messageProcessingModel, PDU pdu) throws MessageException
Checks outgoing messages for consistency between PDU and target used.- Parameters:
transportAddress
- the target address.messageProcessingModel
- the message processing model to be used.pdu
- the PDU to be sent.- Throws:
MessageException
- if unrecoverable inconsistencies have been detected.
-
returnResponsePdu
public int returnResponsePdu(int messageProcessingModel, int securityModel, byte[] securityName, int securityLevel, PDU pdu, int maxSizeResponseScopedPDU, StateReference stateReference, StatusInformation statusInformation) throws MessageException
Description copied from interface:MessageDispatcher
Returns a response PDU to the sender of the corresponding request PDU.- Specified by:
returnResponsePdu
in interfaceMessageDispatcher
- Parameters:
messageProcessingModel
- intsecurityModel
- intsecurityName
- byte[]securityLevel
- intpdu
- PDUmaxSizeResponseScopedPDU
- intstateReference
- StateReferencestatusInformation
- StatusInformation- Returns:
- an MP error status or
SnmpConstants.SNMP_MP_OK
if the operation was successful. - Throws:
MessageException
- if message processing fails with a fatal error.
-
releaseStateReference
public void releaseStateReference(int messageProcessingModel, PduHandle pduHandle)
Description copied from interface:MessageDispatcher
Release any state references associated with the suppliedPduHandle
in the specified message processing model.- Specified by:
releaseStateReference
in interfaceMessageDispatcher
- Parameters:
messageProcessingModel
- a message processing model ID.pduHandle
- thePduHandle
that identifies a confirmed class message.- See Also:
MessageProcessingModel
-
removeCommandResponder
public void removeCommandResponder(CommandResponder l)
Description copied from interface:MessageDispatcher
Removes a previously addedCommandResponder
instance from the message dispatcher.- Specified by:
removeCommandResponder
in interfaceMessageDispatcher
- Parameters:
l
- aCommandResponder
instance.
-
addCommandResponder
public void addCommandResponder(CommandResponder l)
Description copied from interface:MessageDispatcher
Adds aCommandResponder
instance to the message dispatcher. Successfully processed SNMP messages will be presented to all command responder (in the order in which they have been added) until a responder uses theCommandResponderEvent.setProcessed(boolean processed)
to set the processed status of the event totrue
.- Specified by:
addCommandResponder
in interfaceMessageDispatcher
- Parameters:
l
- aCommandResponder
instance.
-
fireProcessPdu
protected void fireProcessPdu(CommandResponderEvent e)
Fires aCommandResponderEvent
. Listeners are called in order of their registration until a listener has processed the PDU successfully.- Parameters:
e
- aCommandResponderEvent
event.
-
getMessageProcessingModel
public MessageProcessingModel getMessageProcessingModel(int messageProcessingModel)
Gets theMessageProcessingModel
for the supplied message processing model ID.- Specified by:
getMessageProcessingModel
in interfaceMessageDispatcher
- Parameters:
messageProcessingModel
- a message processing model ID (seeMessageProcessingModel.getID()
).- Returns:
- a MessageProcessingModel instance if the ID is known, otherwise
null
-
removeCounterListener
public CounterListener removeCounterListener(CounterListener counterListener)
Removes aCounterListener
.- Specified by:
removeCounterListener
in interfaceMessageDispatcher
- Parameters:
counterListener
- a previously addedCounterListener
.- Returns:
- the
CounterListener
instance if it could be successfully removed,null
otherwise.
-
addCounterListener
public void addCounterListener(CounterListener counterListener)
Adds aCounterListener
.- Specified by:
addCounterListener
in interfaceMessageDispatcher
- Parameters:
counterListener
- aCounterListener
that will be informed when a counter needs to incremented.
-
fireIncrementCounter
protected void fireIncrementCounter(CounterEvent event)
Fires a counter incrementation event.- Parameters:
event
- theCounterEvent
containing the OID of the counter that needs to be incremented.
-
setCheckOutgoingMsg
public void setCheckOutgoingMsg(boolean checkOutgoingMsg)
Enables or disables the consistency checks for outgoing messages. If the checks are enabled, then GETBULK messages sent to SNMPv1 targets will be converted to GETNEXT messages.In general, if an automatically conversion is not possible, an error is thrown when such a message is to be sent.
The default is consistency checks enabled.
- Parameters:
checkOutgoingMsg
- iftrue
outgoing messages are checked for consistency. Currently, only the PDU type will be checked against the used SNMP version. Iffalse
, no checks will be performed.
-
isCheckOutgoingMsg
public boolean isCheckOutgoingMsg()
Returns whether consistency checks for outgoing messages are activated.- Returns:
- if
true
outgoing messages are checked for consistency. Iffalse
, no checks are performed.
-
addAuthenticationFailureListener
public void addAuthenticationFailureListener(AuthenticationFailureListener l)
Adds a listener for authentication failure events caused by unauthenticated incoming messages.- Parameters:
l
- theAuthenticationFailureListener
to add.- Since:
- 1.5
-
removeAuthenticationFailureListener
public void removeAuthenticationFailureListener(AuthenticationFailureListener l)
Removes anAuthenticationFailureListener
.- Parameters:
l
- theAuthenticationFailureListener
to remove.
-
fireAuthenticationFailure
protected void fireAuthenticationFailure(AuthenticationFailureEvent event)
Fires anAuthenticationFailureEvent
to all registered listeners.- Parameters:
event
- the event to fire.
-
sendPdu
public PduHandle sendPdu(TransportMapping transportMapping, Target target, PDU pdu, boolean expectResponse) throws MessageException
Description copied from interface:MessageDispatcher
Sends a PDU to the supplied transport address.- Specified by:
sendPdu
in interfaceMessageDispatcher
- Parameters:
transportMapping
- theTransportMapping
to be used to send the PDU. IftransportMapping
isnull
the message dispatcher will determine the appropriate transport mapping for the given transport address.target
- the target which identifies, transport address, message processing model, security model, security name and level.pdu
- the SNMP Protocol Data UnitexpectResponse
-true
if a response is expected and a state reference should be saved (if needed for the supplied message processing model).- Returns:
- an
PduHandle
that uniquely identifies this request. - Throws:
MessageException
- if sending of the PDU failed.
-
-