Package org.apache.sshd.common.channel
Class AbstractChannel
-
- All Implemented Interfaces:
Closeable
,AutoCloseable
,Channel
,AttributeRepository
,AttributeStore
,Channel
,ChannelIdentifier
,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- Author:
- Apache MINA SSHD Project
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description class
AbstractChannel.GracefulChannelCloseable
protected static class
AbstractChannel.GracefulState
-
Nested classes/interfaces inherited from class org.apache.sshd.common.util.closeable.AbstractCloseable
AbstractCloseable.State
-
Nested classes/interfaces inherited from interface org.apache.sshd.common.AttributeRepository
AttributeRepository.AttributeKey<T extends Object>
-
-
Field Summary
Fields Modifier and Type Field Description protected ChannelListener
channelListenerProxy
protected Collection<ChannelListener>
channelListeners
Channel events listenerprotected AtomicBoolean
closeSignaled
protected AtomicBoolean
eofReceived
protected AtomicBoolean
eofSent
protected DefaultCloseFuture
gracefulFuture
protected AtomicReference<AbstractChannel.GracefulState>
gracefulState
protected AtomicBoolean
initialized
static IntUnaryOperator
RESPONSE_BUFFER_GROWTH_FACTOR
Default growth factor function used to resize response buffersprotected ConnectionService
service
protected AtomicBoolean
unregisterSignaled
-
Fields inherited from class org.apache.sshd.common.util.closeable.AbstractCloseable
closeFuture, futureLock, state
-
Fields inherited from class org.apache.sshd.common.util.logging.AbstractLoggingBean
log
-
Fields inherited from interface org.apache.sshd.common.channel.Channel
CHANNEL_EXEC, CHANNEL_SHELL, CHANNEL_SUBSYSTEM
-
Fields inherited from interface org.apache.sshd.common.channel.throttle.ChannelStreamWriterResolver
NONE
-
Fields inherited from interface org.apache.sshd.common.PropertyResolver
EMPTY
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractChannel(boolean client)
protected
AbstractChannel(boolean client, Collection<? extends RequestHandler<Channel>> handlers)
protected
AbstractChannel(String discriminator, boolean client)
protected
AbstractChannel(String discriminator, boolean client, Collection<? extends RequestHandler<Channel>> handlers, CloseableExecutorService executorService)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description void
addChannelListener(ChannelListener listener)
Add a channel listenerprotected Date
addPendingRequest(String request, boolean wantReply)
Add a channel request to the tracked pending ones if reply is expectedvoid
addRequestHandler(RequestHandler<Channel> handler)
Collection<AttributeRepository.AttributeKey<?>>
attributeKeys()
void
clearAttributes()
<T> T
computeAttributeIfAbsent(AttributeRepository.AttributeKey<T> key, Function<? super AttributeRepository.AttributeKey<T>,? extends T> resolver)
protected void
configureWindow()
protected abstract void
doWriteData(byte[] data, int off, long len)
protected abstract void
doWriteExtendedData(byte[] data, int off, long len)
<T> T
getAttribute(AttributeRepository.AttributeKey<T> key)
int
getAttributesCount()
long
getChannelId()
ChannelListener
getChannelListenerProxy()
ChannelStreamWriterResolver
getChannelStreamWriterResolver()
CloseableExecutorService
getExecutorService()
protected Closeable
getInnerCloseable()
Window
getLocalWindow()
PropertyResolver
getParentPropertyResolver()
Map<String,Object>
getProperties()
long
getRecipient()
Window
getRemoteWindow()
List<RequestHandler<Channel>>
getRequestHandlers()
Session
getSession()
void
handleChannelRegistrationResult(ConnectionService service, Session session, long channelId, boolean registered)
Invoked after being successfully registered by the connection service - should throw aRuntimeException
if not registeredprotected void
handleChannelRequest(String req, boolean wantReply, Buffer buffer)
void
handleChannelUnregistration(ConnectionService service)
Called by the connection service to inform the channel that it has bee unregistered.void
handleClose()
Invoked whenSSH_MSG_CHANNEL_CLOSE
receivedvoid
handleData(Buffer buffer)
Invoked whenSSH_MSG_CHANNEL_DATA
receivedvoid
handleEof()
Invoked whenSSH_MSG_CHANNEL_EOF
receivedvoid
handleExtendedData(Buffer buffer)
Invoked whenSSH_MSG_CHANNEL_EXTENDED_DATA
receivedvoid
handleFailure()
Invoked whenSSH_MSG_CHANNEL_FAILURE
receivedprotected RequestHandler.Result
handleInternalRequest(String req, boolean wantReply, Buffer buffer)
Called byhandleUnknownChannelRequest(String, boolean, Buffer)
in order to allow channel request handling if none of the registered handlers processed the request - last chance.void
handleRequest(Buffer buffer)
Invoked whenSSH_MSG_CHANNEL_REQUEST
receivedvoid
handleSuccess()
Invoked whenSSH_MSG_CHANNEL_SUCCESS
receivedprotected void
handleUnknownChannelRequest(String req, boolean wantReply, Buffer buffer)
Called when none of the register request handlers reported handling the requestvoid
handleWindowAdjust(Buffer buffer)
Invoked whenSSH_MSG_CHANNEL_WINDOW_ADJUST
receivedvoid
init(ConnectionService service, Session session, long id)
Invoked when the local channel is initial createdprotected void
invokeChannelSignaller(Invoker<ChannelListener,Void> invoker)
boolean
isEofSent()
boolean
isEofSignalled()
boolean
isInitialized()
protected void
notifyStateChanged(String hint)
protected void
notifyStateChanged(ChannelListener listener, String hint)
protected void
preClose()
<T> T
removeAttribute(AttributeRepository.AttributeKey<T> key)
void
removeChannelListener(ChannelListener listener)
Remove a channel listenerprotected Date
removePendingRequest(String request)
Removes a channel request from the tracked onesvoid
removeRequestHandler(RequestHandler<Channel> handler)
ChannelStreamWriterResolver
resolveChannelStreamWriterResolver()
protected IoWriteFuture
sendEof()
SendsSSH_MSG_CHANNEL_EOF
provided not already sent and current channel state allows it.protected IoWriteFuture
sendResponse(Buffer buffer, String req, RequestHandler.Result result, boolean wantReply)
protected void
sendWindowAdjust(long len)
<T> T
setAttribute(AttributeRepository.AttributeKey<T> key, T value)
void
setChannelStreamWriterResolver(ChannelStreamWriterResolver resolver)
protected void
setRecipient(long recipient)
void
signalChannelClosed(Throwable reason)
protected void
signalChannelClosed(ChannelListener listener, Throwable reason)
protected void
signalChannelInitialized()
protected void
signalChannelInitialized(ChannelListener listener)
protected void
signalChannelOpenFailure(Throwable reason)
protected void
signalChannelOpenFailure(ChannelListener listener, Throwable reason)
protected void
signalChannelOpenSuccess()
protected void
signalChannelOpenSuccess(ChannelListener listener)
String
toString()
protected long
validateIncomingDataSize(int cmd, long len)
IoWriteFuture
writePacket(Buffer buffer)
Encode and send the given buffer.-
Methods inherited from class org.apache.sshd.common.util.closeable.AbstractInnerCloseable
doCloseGracefully, doCloseImmediately
-
Methods inherited from class org.apache.sshd.common.util.closeable.AbstractCloseable
addCloseFutureListener, builder, close, getFutureLock, isClosed, isClosing, removeCloseFutureListener
-
Methods inherited from class org.apache.sshd.common.util.logging.AbstractLoggingBean
debug, debug, debug, debug, debug, error, error, error, error, error, getSimplifiedLogger, info, info, warn, warn, warn, warn, warn, warn, warn, warn
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.apache.sshd.common.channel.Channel
addRequestHandlers, handleOpenFailure, handleOpenSuccess, open, removeRequestHandlers, resolveAttribute
-
Methods inherited from interface org.apache.sshd.common.channel.throttle.ChannelStreamWriterResolverManager
resolveChannelStreamWriter
-
Methods inherited from interface org.apache.sshd.common.Closeable
addCloseFutureListener, close, close, isClosed, isClosing, isOpen, removeCloseFutureListener
-
Methods inherited from interface org.apache.sshd.common.PropertyResolver
getBoolean, getBooleanProperty, getCharset, getInteger, getIntProperty, getLong, getLongProperty, getObject, getString, getStringProperty, isEmpty
-
Methods inherited from interface org.apache.sshd.common.session.SessionHolder
getSessionContext
-
-
-
-
Field Detail
-
RESPONSE_BUFFER_GROWTH_FACTOR
public static final IntUnaryOperator RESPONSE_BUFFER_GROWTH_FACTOR
Default growth factor function used to resize response buffers
-
service
protected ConnectionService service
-
initialized
protected final AtomicBoolean initialized
-
eofReceived
protected final AtomicBoolean eofReceived
-
eofSent
protected final AtomicBoolean eofSent
-
unregisterSignaled
protected final AtomicBoolean unregisterSignaled
-
closeSignaled
protected final AtomicBoolean closeSignaled
-
gracefulState
protected AtomicReference<AbstractChannel.GracefulState> gracefulState
-
gracefulFuture
protected final DefaultCloseFuture gracefulFuture
-
channelListeners
protected final Collection<ChannelListener> channelListeners
Channel events listener
-
channelListenerProxy
protected final ChannelListener channelListenerProxy
-
-
Constructor Detail
-
AbstractChannel
protected AbstractChannel(boolean client)
-
AbstractChannel
protected AbstractChannel(boolean client, Collection<? extends RequestHandler<Channel>> handlers)
-
AbstractChannel
protected AbstractChannel(String discriminator, boolean client)
-
AbstractChannel
protected AbstractChannel(String discriminator, boolean client, Collection<? extends RequestHandler<Channel>> handlers, CloseableExecutorService executorService)
-
-
Method Detail
-
getRequestHandlers
public List<RequestHandler<Channel>> getRequestHandlers()
- Specified by:
getRequestHandlers
in interfaceChannel
-
addRequestHandler
public void addRequestHandler(RequestHandler<Channel> handler)
- Specified by:
addRequestHandler
in interfaceChannel
-
removeRequestHandler
public void removeRequestHandler(RequestHandler<Channel> handler)
- Specified by:
removeRequestHandler
in interfaceChannel
-
getChannelId
public long getChannelId()
- Specified by:
getChannelId
in interfaceChannelIdentifier
- Returns:
- Local channel UINT32 identifier
-
getRecipient
public long getRecipient()
- Specified by:
getRecipient
in interfaceChannel
- Returns:
- Remote channel UITN32 identifier
-
setRecipient
protected void setRecipient(long recipient)
-
getLocalWindow
public Window getLocalWindow()
- Specified by:
getLocalWindow
in interfaceChannel
-
getRemoteWindow
public Window getRemoteWindow()
- Specified by:
getRemoteWindow
in interfaceChannel
-
getSession
public Session getSession()
- Specified by:
getSession
in interfaceSessionHolder<Session>
-
getParentPropertyResolver
public PropertyResolver getParentPropertyResolver()
- Specified by:
getParentPropertyResolver
in interfacePropertyResolver
-
getExecutorService
public CloseableExecutorService getExecutorService()
- Specified by:
getExecutorService
in interfaceExecutorServiceCarrier
-
getChannelStreamWriterResolver
public ChannelStreamWriterResolver getChannelStreamWriterResolver()
- Specified by:
getChannelStreamWriterResolver
in interfaceChannelStreamWriterResolverManager
-
setChannelStreamWriterResolver
public void setChannelStreamWriterResolver(ChannelStreamWriterResolver resolver)
- Specified by:
setChannelStreamWriterResolver
in interfaceChannelStreamWriterResolverManager
-
resolveChannelStreamWriterResolver
public ChannelStreamWriterResolver resolveChannelStreamWriterResolver()
- Specified by:
resolveChannelStreamWriterResolver
in interfaceChannelStreamWriterResolverManager
-
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 typewantReply
-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(String)
-
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:
addPendingRequest(String, boolean)
-
handleRequest
public void handleRequest(Buffer buffer) throws IOException
Description copied from interface:Channel
Invoked whenSSH_MSG_CHANNEL_REQUEST
received- Specified by:
handleRequest
in interfaceChannel
- Parameters:
buffer
- The rest of the message dataBuffer
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 typewantReply
- Whether reply is requestedbuffer
- TheBuffer
containing extra request-specific data- Throws:
IOException
- If failed to send the response (if needed)- See Also:
handleInternalRequest(String, boolean, Buffer)
-
handleInternalRequest
protected RequestHandler.Result handleInternalRequest(String req, boolean wantReply, Buffer buffer) throws IOException
Called byhandleUnknownChannelRequest(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 typewantReply
- Whether reply is requestedbuffer
- TheBuffer
containing extra request-specific data- Returns:
- The handling result - if
null
orUnsupported
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, long id) throws IOException
Description copied from interface:Channel
Invoked when the local channel is initial created- Specified by:
init
in interfaceChannel
- Parameters:
service
- TheConnectionService
through which the channel is initializedsession
- TheSession
associated with the channelid
- The locally assigned channel identifier (UINT32 represented as along
)- 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 interfaceChannel
- Returns:
true
if call toChannel.init(ConnectionService, Session, long)
was successfully completed
-
handleChannelRegistrationResult
public void handleChannelRegistrationResult(ConnectionService service, Session session, long channelId, boolean registered)
Description copied from interface:Channel
Invoked after being successfully registered by the connection service - should throw aRuntimeException
if not registered- Specified by:
handleChannelRegistrationResult
in interfaceChannel
- Parameters:
service
- TheConnectionService
through which the channel is registeredsession
- TheSession
associated with the channelchannelId
- The locally assigned channel identifier (UINT32 represented as along
)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 interfaceChannelListenerManager
- Parameters:
listener
- TheChannelListener
to add - notnull
-
removeChannelListener
public void removeChannelListener(ChannelListener listener)
Description copied from interface:ChannelListenerManager
Remove a channel listener- Specified by:
removeChannelListener
in interfaceChannelListenerManager
- Parameters:
listener
- TheChannelListener
to remove
-
getChannelListenerProxy
public ChannelListener getChannelListenerProxy()
- Specified by:
getChannelListenerProxy
in interfaceChannelListenerManager
- Returns:
- A (never
null
proxyChannelListener
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 whenSSH_MSG_CHANNEL_CLOSE
received- Specified by:
handleClose
in interfaceChannel
- Throws:
IOException
- If failed to handle the message
-
getInnerCloseable
protected Closeable getInnerCloseable()
- Specified by:
getInnerCloseable
in classAbstractInnerCloseable
-
preClose
protected void preClose()
- Overrides:
preClose
in classAbstractCloseable
-
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 interfaceChannel
- Parameters:
service
- TheConnectionService
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 interfaceChannel
- 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 whenSSH_MSG_CHANNEL_DATA
received- Specified by:
handleData
in interfaceChannel
- Parameters:
buffer
- The rest of the message dataBuffer
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 whenSSH_MSG_CHANNEL_EXTENDED_DATA
received- Specified by:
handleExtendedData
in interfaceChannel
- Parameters:
buffer
- The rest of the message dataBuffer
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 whenSSH_MSG_CHANNEL_EOF
received- Specified by:
handleEof
in interfaceChannel
- Throws:
IOException
- If failed to handle the message
-
isEofSignalled
public boolean isEofSignalled()
- Specified by:
isEofSignalled
in interfaceChannel
- Returns:
true
if the peer signaled that it will not send any more data- See Also:
- RFC 4254 - section 5.3 - SSH_MSG_CHANNEL_EOF
-
handleWindowAdjust
public void handleWindowAdjust(Buffer buffer) throws IOException
Description copied from interface:Channel
Invoked whenSSH_MSG_CHANNEL_WINDOW_ADJUST
received- Specified by:
handleWindowAdjust
in interfaceChannel
- Parameters:
buffer
- The rest of the message dataBuffer
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 whenSSH_MSG_CHANNEL_SUCCESS
received- Specified by:
handleSuccess
in interfaceChannel
- Throws:
IOException
- If failed to handle the message
-
handleFailure
public void handleFailure() throws IOException
Description copied from interface:Channel
Invoked whenSSH_MSG_CHANNEL_FAILURE
received- Specified by:
handleFailure
in interfaceChannel
- 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
SendsSSH_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()
- Specified by:
getProperties
in interfacePropertyResolver
-
getAttributesCount
public int getAttributesCount()
- Specified by:
getAttributesCount
in interfaceAttributeRepository
-
getAttribute
public <T> T getAttribute(AttributeRepository.AttributeKey<T> key)
- Specified by:
getAttribute
in interfaceAttributeRepository
-
attributeKeys
public Collection<AttributeRepository.AttributeKey<?>> attributeKeys()
- Specified by:
attributeKeys
in interfaceAttributeRepository
-
computeAttributeIfAbsent
public <T> T computeAttributeIfAbsent(AttributeRepository.AttributeKey<T> key, Function<? super AttributeRepository.AttributeKey<T>,? extends T> resolver)
- Specified by:
computeAttributeIfAbsent
in interfaceAttributeStore
-
setAttribute
public <T> T setAttribute(AttributeRepository.AttributeKey<T> key, T value)
- Specified by:
setAttribute
in interfaceAttributeStore
-
removeAttribute
public <T> T removeAttribute(AttributeRepository.AttributeKey<T> key)
- Specified by:
removeAttribute
in interfaceAttributeStore
-
clearAttributes
public void clearAttributes()
- Specified by:
clearAttributes
in interfaceAttributeStore
-
configureWindow
protected void configureWindow()
-
sendWindowAdjust
protected void sendWindowAdjust(long len) throws IOException
- Throws:
IOException
-
-