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()) + ")";
     }
 }