- 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
TheMessageDispatcherImpldecodes and dispatches incoming messages usingMessageProcessingModelinstances and encodes and sends outgoing messages using an appropriateTransportMappinginstances.The method
processMessage(org.snmp4j.TransportMapping<? super A>, A, java.nio.ByteBuffer, org.snmp4j.TransportStateReference)will be called from aTransportMappingwhereas the methodsendPdu(org.snmp4j.Target<A>, org.snmp4j.PDU, boolean)will be called by the application.- Version:
- 3.0.3
- 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 Deprecated Methods Modifier and Type Method Description voidaddAuthenticationFailureListener(AuthenticationFailureListener l)Adds a listener for authentication failure events caused by unauthenticated incoming messages.voidaddCommandResponder(CommandResponder l)Adds aCommandResponderinstance to the message dispatcher.voidaddCounterListener(CounterListener counterListener)Adds aCounterListener.voidaddMessageProcessingModel(MessageProcessingModel model)Adds a message processing model to this message dispatcher.voidaddTransportMapping(TransportMapping<?> transport)Adds a transport mapping.protected voidcheckOutgoingMsg(Address transportAddress, int messageProcessingModel, PDU pdu)Checks outgoing messages for consistency between PDU and target used.protected voidconfigureAuthoritativeEngineID(Target<?> target, MessageProcessingModel mp)protected PduHandlecreatePduHandle()protected <A extends Address>
voiddispatchMessage(TransportMapping<? super A> sourceTransport, MessageProcessingModel mp, A incomingAddress, BERInputStream wholeMessage, TransportStateReference tmStateReference)Actually decodes and dispatches an incoming SNMP message using the supplied message processing model.protected voidfireAuthenticationFailure(AuthenticationFailureEvent<?> event)Fires anAuthenticationFailureEventto all registered listeners.protected voidfireIncrementCounter(CounterEvent event)Fires a counter incrementation event.protected voidfireProcessPdu(CommandResponderEvent<?> e)Fires aCommandResponderEvent.MessageProcessingModelgetMessageProcessingModel(int messageProcessingModel)Gets theMessageProcessingModelfor the supplied message processing model ID.intgetNextRequestID()Gets the next unique request ID.<A extends Address>
TransportMapping<? super A>getTransport(A destAddress)Deprecated.UsegetTransport(Address, TransportType)instead to make sure that the returned mapping supports the intended SNMP application type usage (i.e.<A extends Address>
TransportMapping<? super A>getTransport(A destAddress, TransportType transportType)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.booleanisCheckOutgoingMsg()Returns whether consistency checks for outgoing messages are activated.<A extends Address>
voidprocessMessage(TransportMapping<? super A> sourceTransport, A incomingAddress, java.nio.ByteBuffer wholeMessage, TransportStateReference tmStateReference)Process an incoming SNMP message.<A extends Address>
voidprocessMessage(TransportMapping<? super A> sourceTransport, A incomingAddress, BERInputStream wholeMessage, TransportStateReference tmStateReference)voidreleaseStateReference(int messageProcessingModel, PduHandle pduHandle)Release any state references associated with the suppliedPduHandlein the specified message processing model.voidremoveAuthenticationFailureListener(AuthenticationFailureListener l)Removes anAuthenticationFailureListener.voidremoveCommandResponder(CommandResponder l)Removes a previously addedCommandResponderinstance from the message dispatcher.CounterListenerremoveCounterListener(CounterListener counterListener)Removes aCounterListener.voidremoveMessageProcessingModel(MessageProcessingModel model)Removes a message processing model from this message dispatcher.TransportMapping<? extends Address>removeTransportMapping(TransportMapping<?> transport)Removes a transport mapping.<A extends Address>
intreturnResponsePdu(int messageProcessingModel, int securityModel, byte[] securityName, int securityLevel, PDU pdu, int maxSizeResponseScopedPDU, StateReference<A> stateReference, StatusInformation statusInformation)Returns a response PDU to the sender of the corresponding request PDU.protected <A extends Address>
voidsendMessage(TransportMapping<? super A> transport, A destAddress, byte[] message, TransportStateReference tmStateReference, long timeoutMillis, int maxRetries)Sends a message using theTransportMappingthat has been assigned for the supplied address type.<A extends Address>
PduHandlesendPdu(Target<A> target, PDU pdu, boolean expectResponse)Sends a PDU to the supplied transport address.<A extends Address>
PduHandlesendPdu(TransportMapping<? super A> transportMapping, Target<A> target, PDU pdu, boolean expectResponse)Sends a PDU to the supplied transport address.<A extends Address>
PduHandlesendPdu(TransportMapping<? super A> transport, Target<A> target, PDU pdu, boolean expectResponse, PduHandleCallback<PDU> pduHandleCallback)Sends a PDU to the supplied transport address and returns thePduHandlethat uniquely identifies the request as response after the request has been sent and optional, if aPduHandleCallbackis given, it returns also thePduHandlejust before the request is sent through the the callback interface.voidsetCheckOutgoingMsg(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:
addMessageProcessingModelin interfaceMessageDispatcher- Parameters:
model- a MessageProcessingModel instance.
-
removeMessageProcessingModel
public void removeMessageProcessingModel(MessageProcessingModel model)
Removes a message processing model from this message dispatcher.- Specified by:
removeMessageProcessingModelin 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:
addTransportMappingin interfaceMessageDispatcher- Parameters:
transport- a TransportMapping instance. If there is already another transport mapping registered that supports the same address class, thentransportwill be registered but not used for messages without specific transport mapping.
-
removeTransportMapping
public TransportMapping<? extends Address> removeTransportMapping(TransportMapping<?> transport)
Removes a transport mapping.- Specified by:
removeTransportMappingin interfaceMessageDispatcher- Parameters:
transport- a previously added TransportMapping instance.- Returns:
- the supplied TransportMapping if it has been successfully removed,
nullotherwise.
-
getTransportMappings
public java.util.Collection<TransportMapping<? extends Address>> getTransportMappings()
Gets a collection of all registered transport mappings.- Specified by:
getTransportMappingsin interfaceMessageDispatcher- Returns:
- a Collection instance.
-
getNextRequestID
public int getNextRequestID()
Description copied from interface:MessageDispatcherGets the next unique request ID. The returned ID is unique across the last 2^31-1 IDs generated by this message dispatcher.- Specified by:
getNextRequestIDin 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 <A extends Address> void sendMessage(TransportMapping<? super A> transport, A destAddress, byte[] message, TransportStateReference tmStateReference, long timeoutMillis, int maxRetries) throws java.io.IOException
Sends a message using theTransportMappingthat has been assigned for the supplied address type.- Type Parameters:
A- anAddressclass that is the super class for the addresses supported by this transport mapping.- Parameters:
transport- the transport mapping to be used to send the message.destAddress- the transport address where to send the message. ThedestAddressmust 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
@Deprecated public <A extends Address> TransportMapping<? super A> getTransport(A destAddress)
Deprecated.UsegetTransport(Address, TransportType)instead to make sure that the returned mapping supports the intended SNMP application type usage (i.e. command/notification generator or command receiver).Returns a transport mapping that can handle the supplied address. ThegetTransportMappings()known to this message dispatcher are searched for a matching transport mapping using theAddressclass hierarchy from the given address class to the root superclass. Each superclass is tested if it is compatible with the supplied address by callingAddress.isTransportCompatible(Class)for that supper class. If that call returnstrue, then the firstTransportMappingthat returnstrueonTransportMapping.isAddressSupported(Address, boolean)(exactMatch =true) on the givendestAddressis returned. If no such mapping can be found, the list is search again, but withexactMatchfalse. If still no supported mapping can be found, thennullwill be returned.- Specified by:
getTransportin interfaceMessageDispatcher- Type Parameters:
A- theAddresstype to get aTransportMappingfor.- Parameters:
destAddress- an Address instance.- Returns:
- a
TransportMappinginstance that can be used to sent a SNMP message todestAddressornullif such a transport mapping does not exists. - Since:
- 1.6
-
getTransport
public <A extends Address> TransportMapping<? super A> getTransport(A destAddress, TransportType transportType)
Returns a transport mapping that can handle the supplied address. ThegetTransportMappings()known to this message dispatcher are searched for a matching transport mapping using theAddressclass hierarchy from the given address class to the root superclass. Each superclass is tested if it is compatible with the supplied address by callingAddress.isTransportCompatible(Class)for that supper class. If that call returnstrue, then the firstTransportMappingthat returnstrueonTransportMapping.isAddressSupported(Address, boolean)(exactMatch =true) on the givendestAddressis returned. If no such mapping can be found, the list is search again, but withexactMatchfalse. If still no supported mapping can be found, thennullwill be returned.- Specified by:
getTransportin interfaceMessageDispatcher- Type Parameters:
A- theAddresstype to get aTransportMappingfor.- Parameters:
destAddress- an Address instance.transportType- specifies the SNMP application type that will use the returned transport mapping.transportTypemust be eitherTransportType.receiverorTransportType.sender. IfTransportType.anyis provided anIllegalArgumentExceptionwill be thrown.- Returns:
- a
TransportMappinginstance that can be used to sent a SNMP message todestAddressornullif such a transport mapping does not exists. - Since:
- 3.2.0
-
dispatchMessage
protected <A extends Address> void dispatchMessage(TransportMapping<? super A> sourceTransport, MessageProcessingModel mp, A incomingAddress, BERInputStream wholeMessage, TransportStateReference tmStateReference) throws java.io.IOException
Actually decodes and dispatches an incoming SNMP message using the supplied message processing model.- Type Parameters:
A- theAddresstype.- Parameters:
sourceTransport- aTransportMappingthat matches the incomingAddress type.mp- aMessageProcessingModelto process the message.incomingAddress- theAddressfrom the entity that sent this message.wholeMessage- theBERInputStreamcontaining 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 <A extends Address> void processMessage(TransportMapping<? super A> sourceTransport, A incomingAddress, java.nio.ByteBuffer wholeMessage, TransportStateReference tmStateReference)
Description copied from interface:MessageDispatcherProcess 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:
processMessagein interfaceMessageDispatcher- Specified by:
processMessagein interfaceTransportListener- Type Parameters:
A- theAddresstype.- Parameters:
sourceTransport- aTransportMappinginstance denoting the transport that received the message and that will be used to send any responses to this message. ThesourceTransporthas to support theincomingAddress's implementation class.incomingAddress- theAddressfrom which the message has been received.wholeMessage- anByteBuffercontaining the received SNMP message.tmStateReference- the transport model state reference as defined by RFC 5590.
-
processMessage
public <A extends Address> void processMessage(TransportMapping<? super A> sourceTransport, A incomingAddress, BERInputStream wholeMessage, TransportStateReference tmStateReference)
-
sendPdu
public <A extends Address> PduHandle sendPdu(Target<A> target, PDU pdu, boolean expectResponse) throws MessageException
Description copied from interface:MessageDispatcherSends a PDU to the supplied transport address. This method behaves like a call toMessageDispatcher.sendPdu(TransportMapping transportMapping, Target target, PDU pdu, boolean expectResponse)withtransportMappingset tonull.- Specified by:
sendPduin interfaceMessageDispatcher- Type Parameters:
A- the targetAddresstype.- Parameters:
target- the target which identifies, transport address, message processing model, security model, security name and level.pdu- the SNMP Protocol Data UnitexpectResponse-trueif a response is expected and a state reference should be saved (if needed for the supplied message processing model).- Returns:
- an
PduHandlethat uniquely identifies this request. - Throws:
MessageException- if sending of the PDU failed.
-
sendPdu
public <A extends Address> PduHandle sendPdu(TransportMapping<? super A> transport, Target<A> target, PDU pdu, boolean expectResponse, PduHandleCallback<PDU> pduHandleCallback) throws MessageException
Description copied from interface:MessageDispatcherSends a PDU to the supplied transport address and returns thePduHandlethat uniquely identifies the request as response after the request has been sent and optional, if aPduHandleCallbackis given, it returns also thePduHandlejust before the request is sent through the the callback interface.- Specified by:
sendPduin interfaceMessageDispatcher- Type Parameters:
A- the targetAddresstype.- Parameters:
transport- theTransportMappingto be used to send the PDU. IftransportMappingisnullthe 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-trueif 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
PduHandlethat 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 <A extends Address> int returnResponsePdu(int messageProcessingModel, int securityModel, byte[] securityName, int securityLevel, PDU pdu, int maxSizeResponseScopedPDU, StateReference<A> stateReference, StatusInformation statusInformation) throws MessageException
Description copied from interface:MessageDispatcherReturns a response PDU to the sender of the corresponding request PDU.- Specified by:
returnResponsePduin interfaceMessageDispatcher- Type Parameters:
A- theAddresstype.- Parameters:
messageProcessingModel- the message processing model, seeMessageProcessingModelsecurityModel- the security model to use, seeSecurityModelsecurityName- the security namesecurityLevel- the security level for the message to be returned, seeSecurityLevelpdu- the protocol data unit (PDU) to send.maxSizeResponseScopedPDU- the maximum size agreed for the response scoped PDU.stateReference- the state reference to be used.statusInformation- the status information to be used.- Returns:
- an MP error status or
SnmpConstants.SNMP_MP_OKif 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:MessageDispatcherRelease any state references associated with the suppliedPduHandlein the specified message processing model.- Specified by:
releaseStateReferencein interfaceMessageDispatcher- Parameters:
messageProcessingModel- a message processing model ID.pduHandle- thePduHandlethat identifies a confirmed class message.- See Also:
MessageProcessingModel
-
removeCommandResponder
public void removeCommandResponder(CommandResponder l)
Description copied from interface:MessageDispatcherRemoves a previously addedCommandResponderinstance from the message dispatcher.- Specified by:
removeCommandResponderin interfaceMessageDispatcher- Parameters:
l- aCommandResponderinstance.
-
addCommandResponder
public void addCommandResponder(CommandResponder l)
Description copied from interface:MessageDispatcherAdds aCommandResponderinstance 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:
addCommandResponderin interfaceMessageDispatcher- Parameters:
l- aCommandResponderinstance.
-
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- aCommandResponderEventevent.
-
getMessageProcessingModel
public MessageProcessingModel getMessageProcessingModel(int messageProcessingModel)
Gets theMessageProcessingModelfor the supplied message processing model ID.- Specified by:
getMessageProcessingModelin 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:
removeCounterListenerin interfaceMessageDispatcher- Parameters:
counterListener- a previously addedCounterListener.- Returns:
- the
CounterListenerinstance if it could be successfully removed,nullotherwise.
-
addCounterListener
public void addCounterListener(CounterListener counterListener)
Adds aCounterListener.- Specified by:
addCounterListenerin interfaceMessageDispatcher- Parameters:
counterListener- aCounterListenerthat will be informed when a counter needs to incremented.
-
fireIncrementCounter
protected void fireIncrementCounter(CounterEvent event)
Fires a counter incrementation event.- Parameters:
event- theCounterEventcontaining 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- iftrueoutgoing 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
trueoutgoing 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- theAuthenticationFailureListenerto add.- Since:
- 1.5
-
removeAuthenticationFailureListener
public void removeAuthenticationFailureListener(AuthenticationFailureListener l)
Removes anAuthenticationFailureListener.- Parameters:
l- theAuthenticationFailureListenerto remove.
-
fireAuthenticationFailure
protected void fireAuthenticationFailure(AuthenticationFailureEvent<?> event)
Fires anAuthenticationFailureEventto all registered listeners.- Parameters:
event- the event to fire.
-
sendPdu
public <A extends Address> PduHandle sendPdu(TransportMapping<? super A> transportMapping, Target<A> target, PDU pdu, boolean expectResponse) throws MessageException
Description copied from interface:MessageDispatcherSends a PDU to the supplied transport address.- Specified by:
sendPduin interfaceMessageDispatcher- Type Parameters:
A- theAddresstype.- Parameters:
transportMapping- theTransportMappingto be used to send the PDU. IftransportMappingisnullthe 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-trueif a response is expected and a state reference should be saved (if needed for the supplied message processing model).- Returns:
- an
PduHandlethat uniquely identifies this request. - Throws:
MessageException- if sending of the PDU failed.
-
-