Class AbstractChannel

All Implemented Interfaces:
Closeable, AutoCloseable, Channel, AttributeRepository, AttributeStore, Channel, ChannelListenerManager, ChannelStreamWriterResolver, ChannelStreamWriterResolverManager, Closeable, PropertyResolver, SessionContextHolder, SessionHolder<Session>, ExecutorServiceCarrier
Direct Known Subclasses:
AbstractClientChannel, AbstractServerChannel

public abstract class AbstractChannel extends AbstractInnerCloseable implements Channel, ExecutorServiceCarrier
Provides common client/server channel functionality
  • Field Details

  • Constructor Details

  • Method Details

    • getRequestHandlers

      public List<RequestHandler<Channel>> getRequestHandlers()
      Specified by:
      getRequestHandlers in interface Channel
    • addRequestHandler

      public void addRequestHandler(RequestHandler<Channel> handler)
      Specified by:
      addRequestHandler in interface Channel
    • removeRequestHandler

      public void removeRequestHandler(RequestHandler<Channel> handler)
      Specified by:
      removeRequestHandler in interface Channel
    • getId

      public int getId()
      Specified by:
      getId in interface Channel
      Returns:
      Local channel identifier
    • getRecipient

      public int getRecipient()
      Specified by:
      getRecipient in interface Channel
      Returns:
      Remote channel identifier
    • setRecipient

      protected void setRecipient(int recipient)
    • getLocalWindow

      public Window getLocalWindow()
      Specified by:
      getLocalWindow in interface Channel
    • getRemoteWindow

      public Window getRemoteWindow()
      Specified by:
      getRemoteWindow in interface Channel
    • getSession

      public Session getSession()
      Specified by:
      getSession in interface SessionHolder<Session>
    • getParentPropertyResolver

      public PropertyResolver getParentPropertyResolver()
      Specified by:
      getParentPropertyResolver in interface PropertyResolver
      Returns:
      The parent resolver that can be used to query for missing properties - null if no parent
    • getExecutorService

      public CloseableExecutorService getExecutorService()
      Specified by:
      getExecutorService in interface ExecutorServiceCarrier
      Returns:
      The CloseableExecutorService to use
    • getChannelStreamWriterResolver

      public ChannelStreamWriterResolver getChannelStreamWriterResolver()
      Specified by:
      getChannelStreamWriterResolver in interface ChannelStreamWriterResolverManager
    • setChannelStreamWriterResolver

      public void setChannelStreamWriterResolver(ChannelStreamWriterResolver resolver)
      Specified by:
      setChannelStreamWriterResolver in interface ChannelStreamWriterResolverManager
    • resolveChannelStreamWriterResolver

      public ChannelStreamWriterResolver resolveChannelStreamWriterResolver()
      Specified by:
      resolveChannelStreamWriterResolver in interface ChannelStreamWriterResolverManager
    • addPendingRequest

      protected Date addPendingRequest(String request, boolean wantReply)
      Add a channel request to the tracked pending ones if reply is expected
      Parameters:
      request - The request type
      wantReply - true if reply is expected
      Returns:
      The allocated Date timestamp - null if no reply is expected (in which case the request is not tracked)
      Throws:
      IllegalArgumentException - If the request is already being tracked
      See Also:
    • removePendingRequest

      protected Date removePendingRequest(String request)
      Removes a channel request from the tracked ones
      Parameters:
      request - The request type
      Returns:
      The allocated Date timestamp - null if the specified request type is not being tracked or has not been added to the tracked ones to begin with
      See Also:
    • handleRequest

      public void handleRequest(Buffer buffer) throws IOException
      Description copied from interface: Channel
      Invoked when SSH_MSG_CHANNEL_REQUEST received
      Specified by:
      handleRequest in interface Channel
      Parameters:
      buffer - The rest of the message data Buffer after decoding the channel identifiers
      Throws:
      IOException - If failed to handle the message
    • handleChannelRequest

      protected void handleChannelRequest(String req, boolean wantReply, Buffer buffer) throws IOException
      Throws:
      IOException
    • handleUnknownChannelRequest

      protected void handleUnknownChannelRequest(String req, boolean wantReply, Buffer buffer) throws IOException
      Called when none of the register request handlers reported handling the request
      Parameters:
      req - The request type
      wantReply - Whether reply is requested
      buffer - The Buffer containing extra request-specific data
      Throws:
      IOException - If failed to send the response (if needed)
      See Also:
    • handleInternalRequest

      protected RequestHandler.Result handleInternalRequest(String req, boolean wantReply, Buffer buffer) throws IOException
      Called by handleUnknownChannelRequest(String, boolean, Buffer) in order to allow channel request handling if none of the registered handlers processed the request - last chance.
      Parameters:
      req - The request type
      wantReply - Whether reply is requested
      buffer - The Buffer containing extra request-specific data
      Returns:
      The handling result - if null or Unsupported and reply is required then a failure message will be sent
      Throws:
      IOException - If failed to process the request internally
    • sendResponse

      protected IoWriteFuture sendResponse(Buffer buffer, String req, RequestHandler.Result result, boolean wantReply) throws IOException
      Throws:
      IOException
    • init

      public void init(ConnectionService service, Session session, int id) throws IOException
      Description copied from interface: Channel
      Invoked when the local channel is initial created
      Specified by:
      init in interface Channel
      Parameters:
      service - The ConnectionService through which the channel is initialized
      session - The Session associated with the channel
      id - The locally assigned channel identifier
      Throws:
      IOException - If failed to process the initialization
    • signalChannelInitialized

      protected void signalChannelInitialized() throws IOException
      Throws:
      IOException
    • signalChannelInitialized

      protected void signalChannelInitialized(ChannelListener listener)
    • signalChannelOpenSuccess

      protected void signalChannelOpenSuccess()
    • signalChannelOpenSuccess

      protected void signalChannelOpenSuccess(ChannelListener listener)
    • isInitialized

      public boolean isInitialized()
      Specified by:
      isInitialized in interface Channel
      Returns:
      true if call to Channel.init(ConnectionService, Session, int) was successfully completed
    • handleChannelRegistrationResult

      public void handleChannelRegistrationResult(ConnectionService service, Session session, int channelId, boolean registered)
      Description copied from interface: Channel
      Invoked after being successfully registered by the connection service - should throw a RuntimeException if not registered
      Specified by:
      handleChannelRegistrationResult in interface Channel
      Parameters:
      service - The ConnectionService through which the channel is registered
      session - The Session associated with the channel
      channelId - The locally assigned channel identifier
      registered - Whether registration was successful or not
    • signalChannelOpenFailure

      protected void signalChannelOpenFailure(Throwable reason)
    • signalChannelOpenFailure

      protected void signalChannelOpenFailure(ChannelListener listener, Throwable reason)
    • notifyStateChanged

      protected void notifyStateChanged(String hint)
    • notifyStateChanged

      protected void notifyStateChanged(ChannelListener listener, String hint)
    • addChannelListener

      public void addChannelListener(ChannelListener listener)
      Description copied from interface: ChannelListenerManager
      Add a channel listener
      Specified by:
      addChannelListener in interface ChannelListenerManager
      Parameters:
      listener - The ChannelListener to add - not null
    • removeChannelListener

      public void removeChannelListener(ChannelListener listener)
      Description copied from interface: ChannelListenerManager
      Remove a channel listener
      Specified by:
      removeChannelListener in interface ChannelListenerManager
      Parameters:
      listener - The ChannelListener to remove
    • getChannelListenerProxy

      public ChannelListener getChannelListenerProxy()
      Specified by:
      getChannelListenerProxy in interface ChannelListenerManager
      Returns:
      A (never null proxy ChannelListener that represents all the currently registered listeners. Any method invocation on the proxy is replicated to the currently registered listeners
    • handleClose

      public void handleClose() throws IOException
      Description copied from interface: Channel
      Invoked when SSH_MSG_CHANNEL_CLOSE received
      Specified by:
      handleClose in interface Channel
      Throws:
      IOException - If failed to handle the message
    • getInnerCloseable

      protected Closeable getInnerCloseable()
      Specified by:
      getInnerCloseable in class AbstractInnerCloseable
    • preClose

      protected void preClose()
      Description copied from class: AbstractCloseable
      preClose is guaranteed to be called before doCloseGracefully or doCloseImmediately. When preClose() is called, isClosing() == true
      Overrides:
      preClose in class AbstractCloseable
    • handleChannelUnregistration

      public void handleChannelUnregistration(ConnectionService service)
      Description copied from interface: Channel
      Called by the connection service to inform the channel that it has bee unregistered.
      Specified by:
      handleChannelUnregistration in interface Channel
      Parameters:
      service - The ConnectionService through which the channel is unregistered
    • signalChannelClosed

      public void signalChannelClosed(Throwable reason)
    • signalChannelClosed

      protected void signalChannelClosed(ChannelListener listener, Throwable reason)
    • invokeChannelSignaller

      protected void invokeChannelSignaller(Invoker<ChannelListener,Void> invoker) throws Throwable
      Throws:
      Throwable
    • writePacket

      public IoWriteFuture writePacket(Buffer buffer) throws IOException
      Description copied from interface: Channel
      Encode and send the given buffer. Note: for session packets the buffer has to have 5 bytes free at the beginning to allow the encoding to take place. Also, the write position of the buffer has to be set to the position of the last byte to write.
      Specified by:
      writePacket in interface Channel
      Parameters:
      buffer - the buffer to encode and send. NOTE: the buffer must not be touched until the returned write future is completed.
      Returns:
      An IoWriteFuture that can be used to check when the packet has actually been sent
      Throws:
      IOException - if an error occurred when encoding or sending the packet
    • handleData

      public void handleData(Buffer buffer) throws IOException
      Description copied from interface: Channel
      Invoked when SSH_MSG_CHANNEL_DATA received
      Specified by:
      handleData in interface Channel
      Parameters:
      buffer - The rest of the message data Buffer after decoding the channel identifiers
      Throws:
      IOException - If failed to handle the message
    • handleExtendedData

      public void handleExtendedData(Buffer buffer) throws IOException
      Description copied from interface: Channel
      Invoked when SSH_MSG_CHANNEL_EXTENDED_DATA received
      Specified by:
      handleExtendedData in interface Channel
      Parameters:
      buffer - The rest of the message data Buffer after decoding the channel identifiers
      Throws:
      IOException - If failed to handle the message
    • validateIncomingDataSize

      protected long validateIncomingDataSize(int cmd, long len)
    • handleEof

      public void handleEof() throws IOException
      Description copied from interface: Channel
      Invoked when SSH_MSG_CHANNEL_EOF received
      Specified by:
      handleEof in interface Channel
      Throws:
      IOException - If failed to handle the message
    • isEofSignalled

      public boolean isEofSignalled()
      Specified by:
      isEofSignalled in interface Channel
      Returns:
      true if the peer signaled that it will not send any more data
      See Also:
    • handleWindowAdjust

      public void handleWindowAdjust(Buffer buffer) throws IOException
      Description copied from interface: Channel
      Invoked when SSH_MSG_CHANNEL_WINDOW_ADJUST received
      Specified by:
      handleWindowAdjust in interface Channel
      Parameters:
      buffer - The rest of the message data Buffer after decoding the channel identifiers
      Throws:
      IOException - If failed to handle the message
    • handleSuccess

      public void handleSuccess() throws IOException
      Description copied from interface: Channel
      Invoked when SSH_MSG_CHANNEL_SUCCESS received
      Specified by:
      handleSuccess in interface Channel
      Throws:
      IOException - If failed to handle the message
    • handleFailure

      public void handleFailure() throws IOException
      Description copied from interface: Channel
      Invoked when SSH_MSG_CHANNEL_FAILURE received
      Specified by:
      handleFailure in interface Channel
      Throws:
      IOException - If failed to handle the message
    • doWriteData

      protected abstract void doWriteData(byte[] data, int off, long len) throws IOException
      Throws:
      IOException
    • doWriteExtendedData

      protected abstract void doWriteExtendedData(byte[] data, int off, long len) throws IOException
      Throws:
      IOException
    • sendEof

      protected IoWriteFuture sendEof() throws IOException
      Sends SSH_MSG_CHANNEL_EOF provided not already sent and current channel state allows it.
      Returns:
      The IoWriteFuture of the sent packet - null if message not sent due to channel state (or already sent)
      Throws:
      IOException - If failed to send the packet
    • isEofSent

      public boolean isEofSent()
    • getProperties

      public Map<String,Object> getProperties()
      Description copied from interface: PropertyResolver

      A map of properties that can be used to configure the SSH server or client. This map will never be changed by either the server or client and is not supposed to be changed at runtime (changes are not bound to have any effect on a running client or server), though it may affect the creation of sessions later as these values are usually not cached.

      Note: the type of the mapped property should match the expected configuration value type - Long, Integer, Boolean, String, etc.... If it doesn't, the toString() result of the mapped value is used to convert it to the required type. E.g., if the mapped value is the string "1234" and the expected value is a long then it will be parsed into one. Also, if the mapped value is an Integer but a long is expected, then it will be converted into one.

      Specified by:
      getProperties in interface PropertyResolver
      Returns:
      a valid Map containing configuration values, never null. Note: may be immutable.
    • getAttributesCount

      public int getAttributesCount()
      Specified by:
      getAttributesCount in interface AttributeRepository
      Returns:
      Current number of user-defined attributes stored in the repository
    • getAttribute

      public <T> T getAttribute(AttributeRepository.AttributeKey<T> key)
      Description copied from interface: AttributeRepository
      Returns the value of the user-defined attribute.
      Specified by:
      getAttribute in interface AttributeRepository
      Type Parameters:
      T - The generic attribute type
      Parameters:
      key - The key of the attribute; must not be null.
      Returns:
      null if there is no value associated with the specified key
    • attributeKeys

      public Collection<AttributeRepository.AttributeKey<?>> attributeKeys()
      Specified by:
      attributeKeys in interface AttributeRepository
      Returns:
      A Collection snapshot of all the currently registered attributes in the repository
    • computeAttributeIfAbsent

      public <T> T computeAttributeIfAbsent(AttributeRepository.AttributeKey<T> key, Function<? super AttributeRepository.AttributeKey<T>,? extends T> resolver)
      Description copied from interface: AttributeStore
      If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null.
      Specified by:
      computeAttributeIfAbsent in interface AttributeStore
      Type Parameters:
      T - The generic attribute type
      Parameters:
      key - The key of the attribute; must not be null.
      resolver - The (never null) mapping function to use if value not already mapped. If returns null then value is not mapped to the provided key.
      Returns:
      The resolved value - null if value not mapped and resolver did not return a non-null value for it
    • setAttribute

      public <T> T setAttribute(AttributeRepository.AttributeKey<T> key, T value)
      Description copied from interface: AttributeStore
      Sets a user-defined attribute.
      Specified by:
      setAttribute in interface AttributeStore
      Type Parameters:
      T - The generic attribute type
      Parameters:
      key - The key of the attribute; must not be null.
      value - The value of the attribute; must not be null.
      Returns:
      The old value of the attribute; null if it is new.
    • removeAttribute

      public <T> T removeAttribute(AttributeRepository.AttributeKey<T> key)
      Description copied from interface: AttributeStore
      Removes the user-defined attribute
      Specified by:
      removeAttribute in interface AttributeStore
      Type Parameters:
      T - The generic attribute type
      Parameters:
      key - The key of the attribute; must not be null.
      Returns:
      The removed value; null if no previous value
    • clearAttributes

      public void clearAttributes()
      Description copied from interface: AttributeStore
      Removes all currently stored user-defined attributes
      Specified by:
      clearAttributes in interface AttributeStore
    • configureWindow

      protected void configureWindow()
    • sendWindowAdjust

      protected void sendWindowAdjust(long len) throws IOException
      Throws:
      IOException
    • toString

      public String toString()
      Overrides:
      toString in class Object