You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by lg...@apache.org on 2016/02/15 17:51:20 UTC
[2/6] mina-sshd git commit: Added ChannelHolder interface
Added ChannelHolder interface
Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/28675bdb
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/28675bdb
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/28675bdb
Branch: refs/heads/master
Commit: 28675bdb0b00bfcc3eadfa2e9f7e42fa10f1591c
Parents: 9d22091
Author: Lyor Goldstein <ly...@gmail.com>
Authored: Mon Feb 15 18:48:41 2016 +0200
Committer: Lyor Goldstein <ly...@gmail.com>
Committed: Mon Feb 15 18:48:41 2016 +0200
----------------------------------------------------------------------
.../sshd/client/subsystem/SubsystemClient.java | 8 +++++-
.../subsystem/sftp/AbstractSftpClient.java | 7 ++++-
.../common/channel/ChannelAsyncInputStream.java | 24 +++++++++++-----
.../sshd/common/channel/ChannelHolder.java | 30 ++++++++++++++++++++
.../common/channel/ChannelOutputStream.java | 28 +++++++++++-------
.../org/apache/sshd/common/channel/Window.java | 18 ++++++++----
6 files changed, 89 insertions(+), 26 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/28675bdb/sshd-core/src/main/java/org/apache/sshd/client/subsystem/SubsystemClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/SubsystemClient.java b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/SubsystemClient.java
index dca1b38..cfc7970 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/SubsystemClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/SubsystemClient.java
@@ -25,12 +25,18 @@ import org.apache.sshd.client.channel.ClientChannel;
import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.client.session.ClientSessionHolder;
import org.apache.sshd.common.NamedResource;
+import org.apache.sshd.common.channel.ChannelHolder;
import org.apache.sshd.common.session.SessionHolder;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public interface SubsystemClient extends SessionHolder<ClientSession>, ClientSessionHolder, NamedResource, Channel {
+public interface SubsystemClient
+ extends SessionHolder<ClientSession>,
+ ClientSessionHolder,
+ NamedResource,
+ ChannelHolder,
+ Channel {
/**
* @return The underlying {@link ClientChannel} used
*/
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/28675bdb/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/AbstractSftpClient.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/AbstractSftpClient.java b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/AbstractSftpClient.java
index 81292c3..16b9105 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/AbstractSftpClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/subsystem/sftp/AbstractSftpClient.java
@@ -36,6 +36,7 @@ import org.apache.sshd.client.subsystem.sftp.extensions.BuiltinSftpClientExtensi
import org.apache.sshd.client.subsystem.sftp.extensions.SftpClientExtension;
import org.apache.sshd.client.subsystem.sftp.extensions.SftpClientExtensionFactory;
import org.apache.sshd.common.SshException;
+import org.apache.sshd.common.channel.Channel;
import org.apache.sshd.common.subsystem.sftp.SftpConstants;
import org.apache.sshd.common.subsystem.sftp.SftpException;
import org.apache.sshd.common.subsystem.sftp.SftpHelper;
@@ -51,7 +52,6 @@ import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
public abstract class AbstractSftpClient extends AbstractSubsystemClient implements SftpClient, RawSftpClient {
-
private final AtomicReference<Map<String, Object>> parsedExtensionsHolder = new AtomicReference<>(null);
protected AbstractSftpClient() {
@@ -59,6 +59,11 @@ public abstract class AbstractSftpClient extends AbstractSubsystemClient impleme
}
@Override
+ public Channel getChannel() {
+ return getClientChannel();
+ }
+
+ @Override
public String getName() {
return SftpConstants.SFTP_SUBSYSTEM_NAME;
}
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/28675bdb/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
index 11be85b..75ca78d 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
@@ -19,6 +19,7 @@
package org.apache.sshd.common.channel;
import java.io.IOException;
+
import org.apache.sshd.common.RuntimeSshException;
import org.apache.sshd.common.SshException;
import org.apache.sshd.common.future.CloseFuture;
@@ -26,7 +27,9 @@ import org.apache.sshd.common.future.DefaultVerifiableSshFuture;
import org.apache.sshd.common.io.IoInputStream;
import org.apache.sshd.common.io.IoReadFuture;
import org.apache.sshd.common.io.ReadPendingException;
+import org.apache.sshd.common.session.Session;
import org.apache.sshd.common.util.Readable;
+import org.apache.sshd.common.util.ValidateUtils;
import org.apache.sshd.common.util.buffer.Buffer;
import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
import org.apache.sshd.common.util.closeable.AbstractCloseable;
@@ -34,14 +37,18 @@ import org.apache.sshd.common.util.closeable.AbstractCloseable;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public class ChannelAsyncInputStream extends AbstractCloseable implements IoInputStream {
-
- private final Channel channel;
+public class ChannelAsyncInputStream extends AbstractCloseable implements IoInputStream, ChannelHolder {
+ private final Channel channelInstance;
private final Buffer buffer = new ByteArrayBuffer();
private IoReadFutureImpl pending;
public ChannelAsyncInputStream(Channel channel) {
- this.channel = channel;
+ this.channelInstance = ValidateUtils.checkNotNull(channel, "No channel");
+ }
+
+ @Override
+ public Channel getChannel() {
+ return channelInstance;
}
public void write(Readable src) throws IOException {
@@ -109,10 +116,13 @@ public class ChannelAsyncInputStream extends AbstractCloseable implements IoInpu
}
}
if (nbRead > 0) {
+ Channel channel = getChannel();
try {
- channel.getLocalWindow().consumeAndCheck(nbRead);
+ Window wLocal = channel.getLocalWindow();
+ wLocal.consumeAndCheck(nbRead);
} catch (IOException e) {
- channel.getSession().exceptionCaught(e);
+ Session session = channel.getSession();
+ session.exceptionCaught(e);
}
future.setValue(nbRead);
}
@@ -120,7 +130,7 @@ public class ChannelAsyncInputStream extends AbstractCloseable implements IoInpu
@Override
public String toString() {
- return "ChannelAsyncInputStream[" + channel + "]";
+ return getClass().getSimpleName() + "[" + getChannel() + "]";
}
public static class IoReadFutureImpl extends DefaultVerifiableSshFuture<IoReadFuture> implements IoReadFuture {
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/28675bdb/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelHolder.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelHolder.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelHolder.java
new file mode 100644
index 0000000..869dc9c
--- /dev/null
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelHolder.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sshd.common.channel;
+
+/**
+ * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
+ */
+public interface ChannelHolder {
+ /**
+ * @return The associated {@link Channel} instance
+ */
+ Channel getChannel();
+}
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/28675bdb/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
index 9525bd2..3ed3f59 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
@@ -21,7 +21,6 @@ package org.apache.sshd.common.channel;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.OutputStream;
-import java.nio.channels.Channel;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -34,18 +33,16 @@ import org.apache.sshd.common.util.buffer.Buffer;
import org.slf4j.Logger;
/**
- * TODO Add javadoc
- *
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public class ChannelOutputStream extends OutputStream implements Channel {
+public class ChannelOutputStream extends OutputStream implements java.nio.channels.Channel, ChannelHolder {
/**
* Configure max. wait time (millis) to wait for space to become available
*/
public static final String WAIT_FOR_SPACE_TIMEOUT = "channel-output-wait-for-space-timeout";
public static final long DEFAULT_WAIT_FOR_SPACE_TIMEOUT = TimeUnit.SECONDS.toMillis(30L);
- private final AbstractChannel channel;
+ private final AbstractChannel channelInstance;
private final Window remoteWindow;
private final long maxWaitTimeout;
private final Logger log;
@@ -63,7 +60,7 @@ public class ChannelOutputStream extends OutputStream implements Channel {
}
public ChannelOutputStream(AbstractChannel channel, Window remoteWindow, long maxWaitTimeout, Logger log, byte cmd, boolean eofOnClose) {
- this.channel = ValidateUtils.checkNotNull(channel, "No channel");
+ this.channelInstance = ValidateUtils.checkNotNull(channel, "No channel");
this.remoteWindow = ValidateUtils.checkNotNull(remoteWindow, "No remote window");
ValidateUtils.checkTrue(maxWaitTimeout > 0L, "Non-positive max. wait time: %d", maxWaitTimeout);
this.maxWaitTimeout = maxWaitTimeout;
@@ -73,6 +70,11 @@ public class ChannelOutputStream extends OutputStream implements Channel {
newBuffer(0);
}
+ @Override // co-variant return
+ public AbstractChannel getChannel() {
+ return channelInstance;
+ }
+
public boolean isEofOnClose() {
return eofOnClose;
}
@@ -102,6 +104,7 @@ public class ChannelOutputStream extends OutputStream implements Channel {
throw new SshException("write(" + this + ") len=" + l + " - channel already closed");
}
+ Channel channel = getChannel();
Session session = channel.getSession();
while (l > 0) {
// The maximum amount we should admit without flushing again
@@ -152,6 +155,7 @@ public class ChannelOutputStream extends OutputStream implements Channel {
}
try {
+ AbstractChannel channel = getChannel();
Session session = channel.getSession();
while (bufferLength > 0) {
session.resetIdleTimeout();
@@ -207,6 +211,7 @@ public class ChannelOutputStream extends OutputStream implements Channel {
try {
flush();
if (isEofOnClose()) {
+ AbstractChannel channel = getChannel();
channel.sendEof();
}
} finally {
@@ -215,12 +220,8 @@ public class ChannelOutputStream extends OutputStream implements Channel {
}
}
- @Override
- public String toString() {
- return getClass().getSimpleName() + "[" + channel + "]";
- }
-
protected void newBuffer(int size) {
+ Channel channel = getChannel();
Session session = channel.getSession();
buffer = session.createBuffer(cmd, size <= 0 ? 12 : 12 + size);
buffer.putInt(channel.getRecipient());
@@ -230,4 +231,9 @@ public class ChannelOutputStream extends OutputStream implements Channel {
buffer.putInt(0);
bufferLength = 0;
}
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "[" + getChannel() + "] " + SshConstants.getCommandMessageName(cmd & 0xFF);
+ }
}
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/28675bdb/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
index b393112..b9a26be 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
@@ -43,7 +43,7 @@ import org.apache.sshd.common.util.logging.AbstractLoggingBean;
*
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public class Window extends AbstractLoggingBean implements java.nio.channels.Channel, PropertyResolver {
+public class Window extends AbstractLoggingBean implements java.nio.channels.Channel, ChannelHolder, PropertyResolver {
/**
* Default {@link Predicate} used to test if space became available
*/
@@ -59,7 +59,7 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha
private final AtomicBoolean closed = new AtomicBoolean(false);
private final AtomicBoolean initialized = new AtomicBoolean(false);
private final AtomicInteger sizeHolder = new AtomicInteger(0);
- private final AbstractChannel channel;
+ private final AbstractChannel channelInstance;
private final Object lock;
private final String suffix;
@@ -68,9 +68,9 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha
private Map<String, Object> props = Collections.<String, Object>emptyMap();
public Window(AbstractChannel channel, Object lock, boolean client, boolean local) {
- this.channel = ValidateUtils.checkNotNull(channel, "No channel provided");
+ this.channelInstance = ValidateUtils.checkNotNull(channel, "No channel provided");
this.lock = (lock != null) ? lock : this;
- this.suffix = ": " + (client ? "client" : "server") + " " + (local ? "local" : "remote") + " window";
+ this.suffix = (client ? "client" : "server") + "/" + (local ? "local" : "remote");
}
@Override
@@ -80,7 +80,12 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha
@Override
public PropertyResolver getParentPropertyResolver() {
- return channel;
+ return getChannel();
+ }
+
+ @Override // co-variant return
+ public AbstractChannel getChannel() {
+ return channelInstance;
}
public int getSize() {
@@ -191,6 +196,7 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha
checkInitialized("check");
int adjustSize = -1;
+ AbstractChannel channel = getChannel();
synchronized (lock) {
// TODO make the adjust factor configurable via FactoryManager property
int size = sizeHolder.get();
@@ -339,6 +345,6 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha
@Override
public String toString() {
- return String.valueOf(channel) + suffix;
+ return getClass().getSimpleName() + "[" + suffix + "](" + String.valueOf(getChannel()) + ")";
}
}