Module org.snmp4j
Package org.snmp4j

Class MessageDispatcherImpl

java.lang.Object
org.snmp4j.MessageDispatcherImpl
All Implemented Interfaces:
MessageDispatcher, TransportListener

public class MessageDispatcherImpl extends Object implements MessageDispatcher
The MessageDispatcherImpl decodes and dispatches incoming messages using MessageProcessingModel instances and encodes and sends outgoing messages using an appropriate TransportMapping instances.

The method processMessage(org.snmp4j.TransportMapping<? super A>, A, java.nio.ByteBuffer, org.snmp4j.TransportStateReference) will be called from a TransportMapping whereas the method sendPdu(org.snmp4j.Target<A>, org.snmp4j.PDU, boolean) will be called by the application.

Version:
3.0.3
Author:
Frank Fock
See Also:
  • Constructor Details

    • MessageDispatcherImpl

      public MessageDispatcherImpl()
      Default constructor creates a message dispatcher without any associated message processing models.
  • Method Details

    • 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 call removeMessageProcessingModel(org.snmp4j.mp.MessageProcessingModel) before to replace a message processing model.
      Specified by:
      addMessageProcessingModel in interface MessageDispatcher
      Parameters:
      model - a MessageProcessingModel instance.
    • removeMessageProcessingModel

      public void removeMessageProcessingModel(MessageProcessingModel model)
      Removes a message processing model from this message dispatcher.
      Specified by:
      removeMessageProcessingModel in interface MessageDispatcher
      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 interface MessageDispatcher
      Parameters:
      transport - a TransportMapping instance. If there is already another transport mapping registered that supports the same address class, then transport will 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:
      removeTransportMapping in interface MessageDispatcher
      Parameters:
      transport - a previously added TransportMapping instance.
      Returns:
      the supplied TransportMapping if it has been successfully removed, nullotherwise.
    • getTransportMappings

      public Collection<TransportMapping<? extends Address>> getTransportMappings()
      Gets a collection of all registered transport mappings.
      Specified by:
      getTransportMappings in interface MessageDispatcher
      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 interface MessageDispatcher
      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 IOException
      Sends a message using the TransportMapping that has been assigned for the supplied address type.
      Type Parameters:
      A - an Address class 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. The destAddress must be compatible with the supplied transport.
      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:
      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.
      Use getTransport(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. The getTransportMappings() known to this message dispatcher are searched for a matching transport mapping using the Address class hierarchy from the given address class to the root superclass. Each superclass is tested if it is compatible with the supplied address by calling Address.isTransportCompatible(Class) for that supper class. If that call returns true, then the first TransportMapping that returns true on TransportMapping.isAddressSupported(Address, boolean) (exactMatch = true) on the given destAddress is returned. If no such mapping can be found, the list is search again, but with exactMatch false. If still no supported mapping can be found, then null will be returned.
      Specified by:
      getTransport in interface MessageDispatcher
      Type Parameters:
      A - the Address type to get a TransportMapping for.
      Parameters:
      destAddress - an Address instance.
      Returns:
      a TransportMapping instance that can be used to sent a SNMP message to destAddress or null if 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. The getTransportMappings() known to this message dispatcher are searched for a matching transport mapping using the Address class hierarchy from the given address class to the root superclass. Each superclass is tested if it is compatible with the supplied address by calling Address.isTransportCompatible(Class) for that supper class. If that call returns true, then the first TransportMapping that returns true on TransportMapping.isAddressSupported(Address, boolean) (exactMatch = true) on the given destAddress is returned. If no such mapping can be found, the list is search again, but with exactMatch false. If still no supported mapping can be found, then null will be returned.
      Specified by:
      getTransport in interface MessageDispatcher
      Type Parameters:
      A - the Address type to get a TransportMapping for.
      Parameters:
      destAddress - an Address instance.
      transportType - specifies the SNMP application type that will use the returned transport mapping. transportType must be either TransportType.receiver or TransportType.sender. If TransportType.any is provided an IllegalArgumentException will be thrown.
      Returns:
      a TransportMapping instance that can be used to send an SNMP message to destAddress or null if such a transport mapping does not exist.
      Since:
      3.2.0
    • dispatchMessage

      protected <A extends Address> void dispatchMessage(TransportMapping<? super A> sourceTransport, MessageProcessingModel mp, A incomingAddress, BERInputStream wholeMessage, TransportStateReference tmStateReference) throws IOException
      Actually decodes and dispatches an incoming SNMP message using the supplied message processing model.
      Type Parameters:
      A - the Address type.
      Parameters:
      sourceTransport - a TransportMapping that matches the incomingAddress type.
      mp - a MessageProcessingModel to process the message.
      incomingAddress - the Address from the entity that sent this message.
      wholeMessage - the BERInputStream containing the SNMP message.
      tmStateReference - the transport model state reference as defined by RFC 5590.
      Throws:
      IOException - if the message cannot be decoded.
    • processMessage

      public <A extends Address> void processMessage(TransportMapping<? super A> sourceTransport, A incomingAddress, 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 interface MessageDispatcher
      Specified by:
      processMessage in interface TransportListener
      Type Parameters:
      A - the Address type.
      Parameters:
      sourceTransport - a TransportMapping instance denoting the transport that received the message and that will be used to send any responses to this message. The sourceTransport has to support the incomingAddress's implementation class.
      incomingAddress - the Address from which the message has been received.
      wholeMessage - an ByteBuffer containing 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: MessageDispatcher
      Sends a PDU to the supplied transport address. This method behaves like a call to MessageDispatcher.sendPdu(TransportMapping transportMapping, Target target, PDU pdu, boolean expectResponse) with transportMapping set to null.
      Specified by:
      sendPdu in interface MessageDispatcher
      Type Parameters:
      A - the target Address type.
      Parameters:
      target - the target which identifies, transport address, message processing model, security model, security name and level.
      pdu - the SNMP Protocol Data Unit
      expectResponse - 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 <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: MessageDispatcher
      Sends a PDU to the supplied transport address and returns the PduHandle that uniquely identifies the request as response after the request has been sent and optional, if a PduHandleCallback is given, it returns also the PduHandle just before the request is sent through the the callback interface.
      Specified by:
      sendPdu in interface MessageDispatcher
      Type Parameters:
      A - the target Address type.
      Parameters:
      transport - the TransportMapping to be used to send the PDU. If transportMapping is null 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 Unit
      expectResponse - 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 not null) 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 <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: MessageDispatcher
      Returns a response PDU to the sender of the corresponding request PDU.
      Specified by:
      returnResponsePdu in interface MessageDispatcher
      Type Parameters:
      A - the Address type.
      Parameters:
      messageProcessingModel - the message processing model, see MessageProcessingModel
      securityModel - the security model to use, see SecurityModel
      securityName - the security name
      securityLevel - the security level for the message to be returned, see SecurityLevel
      pdu - 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_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 supplied PduHandle in the specified message processing model.
      Specified by:
      releaseStateReference in interface MessageDispatcher
      Parameters:
      messageProcessingModel - a message processing model ID.
      pduHandle - the PduHandle that identifies a confirmed class message.
      See Also:
    • removeCommandResponder

      public void removeCommandResponder(CommandResponder l)
      Description copied from interface: MessageDispatcher
      Removes a previously added CommandResponder instance from the message dispatcher.
      Specified by:
      removeCommandResponder in interface MessageDispatcher
      Parameters:
      l - a CommandResponder instance.
    • addCommandResponder

      public void addCommandResponder(CommandResponder l)
      Description copied from interface: MessageDispatcher
      Adds a CommandResponder 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 the CommandResponderEvent.setProcessed(boolean processed) to set the processed status of the event to true.
      Specified by:
      addCommandResponder in interface MessageDispatcher
      Parameters:
      l - a CommandResponder instance.
    • fireProcessPdu

      protected void fireProcessPdu(CommandResponderEvent<?> e)
      Fires a CommandResponderEvent. Listeners are called in order of their registration until a listener has processed the PDU successfully.
      Parameters:
      e - a CommandResponderEvent event.
    • getMessageProcessingModel

      public MessageProcessingModel getMessageProcessingModel(int messageProcessingModel)
      Gets the MessageProcessingModel for the supplied message processing model ID.
      Specified by:
      getMessageProcessingModel in interface MessageDispatcher
      Parameters:
      messageProcessingModel - a message processing model ID (see MessageProcessingModel.getID()).
      Returns:
      a MessageProcessingModel instance if the ID is known, otherwise null
    • removeCounterListener

      public CounterListener removeCounterListener(CounterListener counterListener)
      Removes a CounterListener.
      Specified by:
      removeCounterListener in interface MessageDispatcher
      Parameters:
      counterListener - a previously added CounterListener.
      Returns:
      the CounterListener instance if it could be successfully removed, null otherwise.
    • addCounterListener

      public void addCounterListener(CounterListener counterListener)
      Adds a CounterListener.
      Specified by:
      addCounterListener in interface MessageDispatcher
      Parameters:
      counterListener - a CounterListener that will be informed when a counter needs to incremented.
    • fireIncrementCounter

      protected void fireIncrementCounter(CounterEvent event)
      Fires a counter incrementation event.
      Parameters:
      event - the CounterEvent 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 - if true outgoing messages are checked for consistency. Currently, only the PDU type will be checked against the used SNMP version. If false, 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. If false, no checks are performed.
    • addAuthenticationFailureListener

      public void addAuthenticationFailureListener(AuthenticationFailureListener l)
      Adds a listener for authentication failure events caused by unauthenticated incoming messages.
      Parameters:
      l - the AuthenticationFailureListener to add.
      Since:
      1.5
    • removeAuthenticationFailureListener

      public void removeAuthenticationFailureListener(AuthenticationFailureListener l)
      Removes an AuthenticationFailureListener.
      Parameters:
      l - the AuthenticationFailureListener to remove.
    • fireAuthenticationFailure

      protected void fireAuthenticationFailure(AuthenticationFailureEvent<?> event)
      Fires an AuthenticationFailureEvent to 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: MessageDispatcher
      Sends a PDU to the supplied transport address.
      Specified by:
      sendPdu in interface MessageDispatcher
      Type Parameters:
      A - the Address type.
      Parameters:
      transportMapping - the TransportMapping to be used to send the PDU. If transportMapping is null 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 Unit
      expectResponse - 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.