Repository: mina-sshd
Updated Branches:
  refs/heads/master 101a50951 -> bba23bf70


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
index e797456..8704a4a 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
@@ -23,13 +23,13 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Collection;
-import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.session.SessionHolder;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.logging.AbstractLoggingBean;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.common.util.threads.ExecutorServiceCarrier;
 import org.apache.sshd.common.util.threads.ThreadUtils;
 import org.apache.sshd.server.Environment;
@@ -56,20 +56,17 @@ public abstract class AbstractCommandSupport
     protected Future<?> cmdFuture;
     protected Thread cmdRunner;
     protected ExecutorService executorService;
-    protected boolean shutdownOnExit;
     protected boolean cbCalled;
     protected ServerSession serverSession;
 
-    protected AbstractCommandSupport(String command, ExecutorService 
executorService, boolean shutdownOnExit) {
+    protected AbstractCommandSupport(String command, ExecutorService 
executorService) {
         this.command = command;
 
         if (executorService == null) {
             String poolName = GenericUtils.isEmpty(command) ? 
getClass().getSimpleName() : command.replace(' ', '_').replace('/', ':');
             this.executorService = 
ThreadUtils.newSingleThreadExecutor(poolName);
-            this.shutdownOnExit = true;    // we always close the ad-hoc 
executor service
         } else {
             this.executorService = executorService;
-            this.shutdownOnExit = shutdownOnExit;
         }
     }
 
@@ -97,11 +94,6 @@ public abstract class AbstractCommandSupport
         return executorService;
     }
 
-    @Override
-    public boolean isShutdownOnExit() {
-        return shutdownOnExit;
-    }
-
     public InputStream getInputStream() {
         return in;
     }
@@ -176,7 +168,7 @@ public abstract class AbstractCommandSupport
         cmdFuture = null;
 
         ExecutorService executors = getExecutorService();
-        if ((executors != null) && (!executors.isShutdown()) && 
isShutdownOnExit()) {
+        if ((executors != null) && (!executors.isShutdown())) {
             Collection<Runnable> runners = executors.shutdownNow();
             if (debugEnabled) {
                 log.debug("destroy() - shutdown executor service - runners 
count=" + runners.size());

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractFileSystemCommand.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractFileSystemCommand.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractFileSystemCommand.java
index e4d0f58..6722976 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractFileSystemCommand.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractFileSystemCommand.java
@@ -21,9 +21,9 @@ package org.apache.sshd.server.command;
 
 import java.io.IOException;
 import java.nio.file.FileSystem;
-import java.util.concurrent.ExecutorService;
 
 import org.apache.sshd.common.file.FileSystemAware;
+import org.apache.sshd.common.util.threads.ExecutorService;
 
 /**
  * Provides a basic useful skeleton for {@link Command} executions that 
require file system access
@@ -34,8 +34,8 @@ public abstract class AbstractFileSystemCommand extends 
AbstractCommandSupport i
 
     protected FileSystem fileSystem;
 
-    public AbstractFileSystemCommand(String command, ExecutorService 
executorService, boolean shutdownOnExit) {
-        super(command, executorService, shutdownOnExit);
+    public AbstractFileSystemCommand(String command, ExecutorService 
executorService) {
+        super(command, executorService);
     }
 
     public FileSystem getFileSystem() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/main/java/org/apache/sshd/server/forward/DirectTcpipFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/forward/DirectTcpipFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/forward/DirectTcpipFactory.java
index 55ba23d..48ec7bd 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/forward/DirectTcpipFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/forward/DirectTcpipFactory.java
@@ -24,6 +24,7 @@ import 
org.apache.sshd.server.forward.TcpipServerChannel.TcpipFactory;
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 public class DirectTcpipFactory extends TcpipFactory {
+
     public static final DirectTcpipFactory INSTANCE = new DirectTcpipFactory();
 
     public DirectTcpipFactory() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/main/java/org/apache/sshd/server/forward/ForwardedTcpipFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/forward/ForwardedTcpipFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/forward/ForwardedTcpipFactory.java
index 74e394e..352667c 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/forward/ForwardedTcpipFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/forward/ForwardedTcpipFactory.java
@@ -24,6 +24,7 @@ import 
org.apache.sshd.server.forward.TcpipServerChannel.TcpipFactory;
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 public class ForwardedTcpipFactory extends TcpipFactory {
+
     public static final ForwardedTcpipFactory INSTANCE = new 
ForwardedTcpipFactory();
 
     public ForwardedTcpipFactory() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
index 949fd55..663553b 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
@@ -22,9 +22,8 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.net.ConnectException;
 import java.net.SocketAddress;
-import java.util.Collection;
+import java.util.Collections;
 import java.util.Objects;
-import java.util.concurrent.ExecutorService;
 
 import org.apache.sshd.client.future.DefaultOpenFuture;
 import org.apache.sshd.client.future.OpenFuture;
@@ -50,6 +49,7 @@ 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.net.SshdSocketAddress;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.common.util.threads.ExecutorServiceCarrier;
 import org.apache.sshd.common.util.threads.ThreadUtils;
 import org.apache.sshd.server.channel.AbstractServerChannel;
@@ -61,7 +61,9 @@ import 
org.apache.sshd.server.forward.TcpForwardingFilter.Type;
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 public class TcpipServerChannel extends AbstractServerChannel implements 
ForwardingTunnelEndpointsProvider {
+
     public abstract static class TcpipFactory implements ChannelFactory, 
ExecutorServiceCarrier {
+
         private final ForwardingFilter.Type type;
 
         protected TcpipFactory(ForwardingFilter.Type type) {
@@ -77,21 +79,14 @@ public class TcpipServerChannel extends 
AbstractServerChannel implements Forward
             return type.getName();
         }
 
-        @Override   // user can override to provide an alternative
+        @Override
         public ExecutorService getExecutorService() {
             return null;
         }
 
         @Override
-        public boolean isShutdownOnExit() {
-            return false;
-        }
-
-        @Override
         public Channel create() {
-            TcpipServerChannel channel = new TcpipServerChannel(getType());
-            channel.setExecutorService(getExecutorService());
-            channel.setShutdownOnExit(isShutdownOnExit());
+            TcpipServerChannel channel = new TcpipServerChannel(getType(), 
ThreadUtils.noClose(getExecutorService()));
             return channel;
         }
     }
@@ -105,7 +100,8 @@ public class TcpipServerChannel extends 
AbstractServerChannel implements Forward
     private SshdSocketAddress originatorAddress;
     private SocketAddress localAddress;
 
-    public TcpipServerChannel(ForwardingFilter.Type type) {
+    public TcpipServerChannel(ForwardingFilter.Type type, ExecutorService 
executor) {
+        super("", Collections.emptyList(), executor);
         this.type = Objects.requireNonNull(type, "No channel type specified");
     }
 
@@ -329,27 +325,16 @@ public class TcpipServerChannel extends 
AbstractServerChannel implements Forward
 
         // allocate a temporary executor service if none provided
         ExecutorService executors = (service == null)
-            ? 
ThreadUtils.newSingleThreadExecutor("TcpIpServerChannel-ConnectorCleanup[" + 
getSession() + "]")
-            : service;
-        // shutdown the temporary executor service if had to create it
-        boolean shutdown = (executors != service) || isShutdownOnExit();
+                ? 
ThreadUtils.newSingleThreadExecutor("TcpIpServerChannel-ConnectorCleanup[" + 
getSession() + "]")
+                : ThreadUtils.noClose(service);
 
         return builder().when(closingFeature).run(toString(), () -> {
             executors.submit(() -> {
-                try {
-                    if (debugEnabled) {
-                        log.debug("disposing connector: {} for: {}", 
connector, TcpipServerChannel.this);
-                    }
-                    connector.close(immediately);
-                } finally {
-                    if (shutdown && (!executors.isShutdown())) {
-                        Collection<Runnable> runners = executors.shutdownNow();
-                        if (debugEnabled) {
-                            log.debug("destroy({}) - shutdown executor service 
- runners count={}",
-                                      TcpipServerChannel.this, runners.size());
-                        }
-                    }
+                if (debugEnabled) {
+                    log.debug("disposing connector: {} for: {}", connector, 
TcpipServerChannel.this);
                 }
+                connector.close(immediately)
+                        .addListener(f -> executors.close(true));
             });
         }).build().close(false);
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/main/java/org/apache/sshd/server/session/ServerConnectionService.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerConnectionService.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerConnectionService.java
index b76bfa3..98c785a 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerConnectionService.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerConnectionService.java
@@ -27,8 +27,9 @@ import 
org.apache.sshd.common.session.helpers.AbstractConnectionService;
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 public class ServerConnectionService
-        extends AbstractConnectionService<AbstractServerSession>
+        extends AbstractConnectionService
         implements ServerSessionHolder {
+
     protected ServerConnectionService(AbstractServerSession s) throws 
SshException {
         super(s);
 
@@ -41,4 +42,9 @@ public class ServerConnectionService
     public final ServerSession getServerSession() {
         return getSession();
     }
+
+    @Override
+    public AbstractServerSession getSession() {
+        return (AbstractServerSession) super.getSession();
+    }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/test/java/org/apache/sshd/common/forward/AbstractServerCloseTestSupport.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/common/forward/AbstractServerCloseTestSupport.java
 
b/sshd-core/src/test/java/org/apache/sshd/common/forward/AbstractServerCloseTestSupport.java
index 0ab991e..ab5194f 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/common/forward/AbstractServerCloseTestSupport.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/common/forward/AbstractServerCloseTestSupport.java
@@ -29,11 +29,9 @@ import java.nio.channels.CompletionHandler;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 
-import org.apache.sshd.common.util.OsUtils;
 import org.apache.sshd.util.test.BaseTestSupport;
 import org.junit.After;
 import org.junit.Assert;
-import org.junit.Assume;
 import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -141,8 +139,11 @@ public abstract class AbstractServerCloseTestSupport 
extends BaseTestSupport {
 
     private void readInOneBuffer(int serverPort) throws Exception {
         outputDebugMessage("readInOneBuffer(port=%d)", serverPort);
-        try (Socket s = new Socket(TEST_LOCALHOST, serverPort)) {
+        try (Socket s = new Socket()) {
             s.setSoTimeout(300);
+            s.setReceiveBufferSize(65536);
+            s.connect(new InetSocketAddress(TEST_LOCALHOST, serverPort));
+            Thread.sleep(50L);
 
             byte buf[] = new byte[PAYLOAD.length()];
             try (InputStream inputStream = s.getInputStream()) {
@@ -157,8 +158,12 @@ public abstract class AbstractServerCloseTestSupport 
extends BaseTestSupport {
 
     private void readInTwoBuffersWithPause(int serverPort) throws Exception {
         outputDebugMessage("readInTwoBuffersWithPause(port=%d)", serverPort);
-        try (Socket s = new Socket(TEST_LOCALHOST, serverPort)) {
+        try (Socket s = new Socket()) {
             s.setSoTimeout(300);
+            s.setReceiveBufferSize(65536);
+            s.connect(new InetSocketAddress(TEST_LOCALHOST, serverPort));
+            Thread.sleep(50L);
+
             byte b1[] = new byte[PAYLOAD.length() / 2];
             byte b2[] = new byte[PAYLOAD.length()];
 
@@ -202,7 +207,6 @@ public abstract class AbstractServerCloseTestSupport 
extends BaseTestSupport {
      */
     @Test
     public void testRemotePortForwardOneBuffer() throws Exception {
-        Assume.assumeTrue("Intermittent failures in Windows", 
OsUtils.isUNIX());
         readInOneBuffer(startRemotePF());
     }
 
@@ -224,7 +228,6 @@ public abstract class AbstractServerCloseTestSupport 
extends BaseTestSupport {
 
     @Test
     public void testLocalPortForwardOneBuffer() throws Exception {
-        Assume.assumeTrue("Intermittent failures in Windows", 
OsUtils.isUNIX());
         readInOneBuffer(startLocalPF());
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/test/java/org/apache/sshd/common/io/DefaultIoServiceFactoryFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/common/io/DefaultIoServiceFactoryFactoryTest.java
 
b/sshd-core/src/test/java/org/apache/sshd/common/io/DefaultIoServiceFactoryFactoryTest.java
index 6d48266..ebf4284 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/common/io/DefaultIoServiceFactoryFactoryTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/common/io/DefaultIoServiceFactoryFactoryTest.java
@@ -19,12 +19,10 @@
 
 package org.apache.sshd.common.io;
 
-import java.io.IOException;
 import java.util.Collections;
-import java.util.concurrent.ExecutorService;
 
 import org.apache.sshd.common.FactoryManager;
-import org.apache.sshd.common.util.threads.ExecutorServiceCarrier;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.util.test.BaseTestSupport;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -57,7 +55,7 @@ public class DefaultIoServiceFactoryFactoryTest extends 
BaseTestSupport {
 
     @SuppressWarnings("boxing")
     @Test
-    public void testExecutorServiceInitialization() throws IOException {
+    public void testExecutorServiceInitialization() throws Exception {
         ExecutorService service = Mockito.mock(ExecutorService.class);
         
Mockito.when(service.shutdownNow()).thenReturn(Collections.emptyList());
         Mockito.when(service.isShutdown()).thenReturn(Boolean.TRUE);
@@ -74,18 +72,14 @@ public class DefaultIoServiceFactoryFactoryTest extends 
BaseTestSupport {
             String name = f.getName();
             try {
                 System.setProperty(propName, name);
-                for (boolean shutdownOnExit : new boolean[]{true, false}) {
-                    DefaultIoServiceFactoryFactory defaultFactory = new 
DefaultIoServiceFactoryFactory(service, shutdownOnExit);
+                DefaultIoServiceFactoryFactory defaultFactory = new 
DefaultIoServiceFactoryFactory(() -> service);
 
-                    try (IoServiceFactory factory = 
defaultFactory.create(manager)) {
-                        if (!(factory instanceof ExecutorServiceCarrier)) {
-                            continue;
-                        }
+                try (IoServiceFactory factory = 
defaultFactory.create(manager)) {
 
-                        ExecutorServiceCarrier carrier = 
(ExecutorServiceCarrier) factory;
-                        assertSame(name + "/" + shutdownOnExit + " - 
mismatched executor service", service, carrier.getExecutorService());
-                        assertEquals(name + "/" + shutdownOnExit + " - 
mismatched shutdown on exit", shutdownOnExit, carrier.isShutdownOnExit());
-                    }
+                    ExecutorService svc = (ExecutorService) 
factory.getClass().getMethod("getExecutorService").invoke(factory);
+                    assertSame(name + " - mismatched executor service", 
service, svc);
+                } catch (NoSuchMethodException e) {
+                    // ignore if there's no executor service
                 }
             } finally {
                 System.clearProperty(propName);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/test/java/org/apache/sshd/common/util/ThreadUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/common/util/ThreadUtilsTest.java 
b/sshd-core/src/test/java/org/apache/sshd/common/util/ThreadUtilsTest.java
index 5e224ff..09f3bb0 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/util/ThreadUtilsTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/util/ThreadUtilsTest.java
@@ -20,9 +20,8 @@
 package org.apache.sshd.common.util;
 
 import java.util.Collection;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.common.util.threads.ThreadUtils;
 import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.NoIoTestCase;
@@ -47,7 +46,7 @@ public class ThreadUtilsTest extends BaseTestSupport {
             assertNull("Unexpected instance for shutdown=" + shutdownOnExit, 
ThreadUtils.protectExecutorServiceShutdown(null, shutdownOnExit));
         }
 
-        ExecutorService service = Executors.newSingleThreadExecutor();
+        ExecutorService service = ThreadUtils.newSingleThreadExecutor("pool");
         try {
             assertSame("Unexpected wrapped instance", service, 
ThreadUtils.protectExecutorServiceShutdown(service, true));
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java 
b/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java
index 6b4f0df..3bbcbc2 100644
--- a/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java
@@ -326,7 +326,7 @@ public class ServerTest extends BaseTestSupport {
             assertTrue("No changes in open channels", 
channelListener.waitForOpenChannelsChange(5L, TimeUnit.SECONDS));
 
             try (AbstractSession serverSession = 
sshd.getActiveSessions().iterator().next()) {
-                AbstractConnectionService<?> service = 
serverSession.getService(AbstractConnectionService.class);
+                AbstractConnectionService service = 
serverSession.getService(AbstractConnectionService.class);
                 Collection<? extends Channel> channels = service.getChannels();
 
                 try (Channel channel = channels.iterator().next()) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-core/src/test/java/org/apache/sshd/util/test/CommandExecutionHelper.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/util/test/CommandExecutionHelper.java 
b/sshd-core/src/test/java/org/apache/sshd/util/test/CommandExecutionHelper.java
index c199a38..da2c95e 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/util/test/CommandExecutionHelper.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/util/test/CommandExecutionHelper.java
@@ -37,7 +37,7 @@ public abstract class CommandExecutionHelper extends 
AbstractCommandSupport {
     }
 
     protected CommandExecutionHelper(String command) {
-        super(command, null, true);
+        super(command, null);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommand.java
----------------------------------------------------------------------
diff --git a/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommand.java 
b/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommand.java
index 1542e75..cb75a3a 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommand.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommand.java
@@ -24,9 +24,9 @@ import java.nio.file.FileSystem;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.concurrent.ExecutorService;
 
 import org.apache.sshd.common.channel.ChannelOutputStream;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.server.command.AbstractFileSystemCommand;
 
 /**
@@ -45,8 +45,8 @@ public abstract class AbstractGitCommand
     protected final GitLocationResolver rootDirResolver;
     protected FileSystem fileSystem;
 
-    protected AbstractGitCommand(GitLocationResolver rootDirResolver, String 
command, ExecutorService executorService, boolean shutdownOnExit) {
-        super(command, executorService, shutdownOnExit);
+    protected AbstractGitCommand(GitLocationResolver rootDirResolver, String 
command, ExecutorService executorService) {
+        super(command, executorService);
         this.rootDirResolver = Objects.requireNonNull(rootDirResolver, "No GIT 
root directory resolver provided");
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommandFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommandFactory.java 
b/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommandFactory.java
index 71f6d1b..b0cb79f 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommandFactory.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommandFactory.java
@@ -19,10 +19,9 @@
 
 package org.apache.sshd.git;
 
-import java.util.concurrent.ExecutorService;
-
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.common.util.threads.ExecutorServiceCarrier;
 import org.apache.sshd.server.command.AbstractDelegatingCommandFactory;
 import org.apache.sshd.server.command.Command;
@@ -40,7 +39,6 @@ public abstract class AbstractGitCommandFactory
     private final String cmdPrefix;
     private GitLocationResolver rootDirResolver;
     private ExecutorService executorService;
-    private boolean shutdownOnExit;
 
     /**
      * @param name Command factory logical name
@@ -62,21 +60,11 @@ public abstract class AbstractGitCommandFactory
         return executorService;
     }
 
-    @Override
-    public boolean isShutdownOnExit() {
-        return shutdownOnExit;
-    }
-
     public AbstractGitCommandFactory withExecutorService(ExecutorService 
executorService) {
         this.executorService = executorService;
         return this;
     }
 
-    public AbstractGitCommandFactory withShutdownOnExit(boolean 
shutdownOnExit) {
-        this.shutdownOnExit = shutdownOnExit;
-        return this;
-    }
-
     @Override
     public GitLocationResolver getGitLocationResolver() {
         return rootDirResolver;

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommand.java
----------------------------------------------------------------------
diff --git 
a/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommand.java 
b/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommand.java
index 3b65b2a..565f88b 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommand.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommand.java
@@ -21,10 +21,10 @@ package org.apache.sshd.git.pack;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.List;
-import java.util.concurrent.ExecutorService;
 
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.git.AbstractGitCommand;
 import org.apache.sshd.git.GitLocationResolver;
 import org.apache.sshd.server.Environment;
@@ -46,11 +46,9 @@ public class GitPackCommand extends AbstractGitCommand {
      * @param command Command to execute
      * @param executorService An {@link ExecutorService} to be used when 
{@link #start(Environment)}-ing
      * execution. If {@code null} an ad-hoc single-threaded service is created 
and used.
-     * @param shutdownOnExit  If {@code true} the {@link 
ExecutorService#shutdownNow()} will be called when
-     * command terminates - unless it is the ad-hoc service, which will be 
shutdown regardless
      */
-    public GitPackCommand(GitLocationResolver rootDirResolver, String command, 
ExecutorService executorService, boolean shutdownOnExit) {
-        super(rootDirResolver, command, executorService, shutdownOnExit);
+    public GitPackCommand(GitLocationResolver rootDirResolver, String command, 
ExecutorService executorService) {
+        super(rootDirResolver, command, executorService);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommandFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommandFactory.java 
b/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommandFactory.java
index 784281f..5548df6 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommandFactory.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommandFactory.java
@@ -18,8 +18,7 @@
  */
 package org.apache.sshd.git.pack;
 
-import java.util.concurrent.ExecutorService;
-
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.git.AbstractGitCommandFactory;
 import org.apache.sshd.git.GitLocationResolver;
 import org.apache.sshd.server.command.CommandFactory;
@@ -58,12 +57,7 @@ public class GitPackCommandFactory extends 
AbstractGitCommandFactory {
     }
 
     @Override
-    public GitPackCommandFactory withShutdownOnExit(boolean shutdownOnExit) {
-        return (GitPackCommandFactory) 
super.withShutdownOnExit(shutdownOnExit);
-    }
-
-    @Override
     public GitPackCommand createGitCommand(String command) {
-        return new GitPackCommand(getGitLocationResolver(), command, 
getExecutorService(), isShutdownOnExit());
+        return new GitPackCommand(getGitLocationResolver(), command, 
getExecutorService());
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommand.java
----------------------------------------------------------------------
diff --git a/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommand.java 
b/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommand.java
index 5a95449..c827057 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommand.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommand.java
@@ -23,9 +23,9 @@ import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.util.List;
-import java.util.concurrent.ExecutorService;
 
 import org.apache.sshd.common.util.ValidateUtils;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.git.AbstractGitCommand;
 import org.apache.sshd.git.GitLocationResolver;
 import org.apache.sshd.server.Environment;
@@ -41,11 +41,9 @@ public class GitPgmCommand extends AbstractGitCommand {
      * @param command Command to execute
      * @param executorService An {@link ExecutorService} to be used when 
{@link #start(Environment)}-ing
      * execution. If {@code null} an ad-hoc single-threaded service is created 
and used.
-     * @param shutdownOnExit  If {@code true} the {@link 
ExecutorService#shutdownNow()} will be called when
-     * command terminates - unless it is the ad-hoc service, which will be 
shutdown regardless
      */
-    public GitPgmCommand(GitLocationResolver rootDirResolver, String command, 
ExecutorService executorService, boolean shutdownOnExit) {
-        super(rootDirResolver, command, executorService, shutdownOnExit);
+    public GitPgmCommand(GitLocationResolver rootDirResolver, String command, 
ExecutorService executorService) {
+        super(rootDirResolver, command, executorService);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommandFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommandFactory.java 
b/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommandFactory.java
index 2da6d48..b68cb00 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommandFactory.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommandFactory.java
@@ -18,8 +18,7 @@
  */
 package org.apache.sshd.git.pgm;
 
-import java.util.concurrent.ExecutorService;
-
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.git.AbstractGitCommandFactory;
 import org.apache.sshd.git.GitLocationResolver;
 import org.apache.sshd.server.command.CommandFactory;
@@ -58,12 +57,7 @@ public class GitPgmCommandFactory extends 
AbstractGitCommandFactory {
     }
 
     @Override
-    public GitPgmCommandFactory withShutdownOnExit(boolean shutdownOnExit) {
-        return (GitPgmCommandFactory) super.withShutdownOnExit(shutdownOnExit);
-    }
-
-    @Override
     public GitPgmCommand createGitCommand(String command) {
-        return new GitPgmCommand(getGitLocationResolver(), 
command.substring(GIT_COMMAND_PREFIX.length()), getExecutorService(), 
isShutdownOnExit());
+        return new GitPgmCommand(getGitLocationResolver(), 
command.substring(GIT_COMMAND_PREFIX.length()), getExecutorService());
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java
 
b/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java
index 9581b69..2931566 100644
--- 
a/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java
+++ 
b/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java
@@ -18,8 +18,6 @@
  */
 package org.apache.sshd.common.io.mina;
 
-import java.util.concurrent.ExecutorService;
-
 import org.apache.mina.core.service.IoProcessor;
 import org.apache.mina.core.service.SimpleIoProcessorPool;
 import org.apache.mina.transport.socket.nio.NioProcessor;
@@ -29,6 +27,7 @@ import org.apache.sshd.common.io.AbstractIoServiceFactory;
 import org.apache.sshd.common.io.IoAcceptor;
 import org.apache.sshd.common.io.IoConnector;
 import org.apache.sshd.common.io.IoHandler;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.common.util.threads.ThreadUtils;
 
 /**
@@ -40,10 +39,8 @@ public class MinaServiceFactory extends 
AbstractIoServiceFactory {
 
     private final IoProcessor<NioSession> ioProcessor;
 
-    public MinaServiceFactory(FactoryManager factoryManager, ExecutorService 
service, boolean shutdownOnExit) {
-        super(factoryManager,
-                (service == null) ? 
ThreadUtils.newCachedThreadPool(factoryManager.toString() + "-mina") : service,
-                (service == null) || shutdownOnExit);
+    public MinaServiceFactory(FactoryManager factoryManager, ExecutorService 
service) {
+        super(factoryManager, ThreadUtils.newCachedThreadPoolIf(service, 
factoryManager.toString() + "-mina"));
         ioProcessor = new SimpleIoProcessorPool<>(NioProcessor.class, 
getExecutorService(), getNioWorkers(factoryManager), null);
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java
 
b/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java
index 7057d5a..dfef37d 100644
--- 
a/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java
+++ 
b/sshd-mina/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java
@@ -18,34 +18,29 @@
  */
 package org.apache.sshd.common.io.mina;
 
-import java.util.concurrent.ExecutorService;
-
+import org.apache.sshd.common.Factory;
 import org.apache.sshd.common.FactoryManager;
 import org.apache.sshd.common.io.AbstractIoServiceFactoryFactory;
 import org.apache.sshd.common.io.IoServiceFactory;
+import org.apache.sshd.common.util.threads.ExecutorService;
 
 /**
  */
 public class MinaServiceFactoryFactory extends AbstractIoServiceFactoryFactory 
{
     public MinaServiceFactoryFactory() {
-        this(null, true);
+        this(null);
     }
 
     /**
-     * @param executors      The {@link ExecutorService} to use for spawning 
threads.
-     *                       If {@code null} then an internal service is 
allocated - in which case it
-     *                       is automatically shutdown regardless of the value 
of the <tt>shutdownOnExit</tt>
-     *                       parameter value
-     * @param shutdownOnExit If {@code true} then the {@link 
ExecutorService#shutdownNow()}
-     *                       will be called (unless it is an internally 
allocated service which is always
-     *                       closed)
+     * @param factory      The {@link ExecutorService} factory to use for 
spawning threads.
+     *                     If {@code null} then an internal service is 
allocated.
      */
-    public MinaServiceFactoryFactory(ExecutorService executors, boolean 
shutdownOnExit) {
-        super(executors, shutdownOnExit);
+    public MinaServiceFactoryFactory(Factory<ExecutorService> factory) {
+        super(factory);
     }
 
     @Override
     public IoServiceFactory create(FactoryManager manager) {
-        return new MinaServiceFactory(manager, getExecutorService(), 
isShutdownOnExit());
+        return new MinaServiceFactory(manager, newExecutor());
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-netty/src/main/java/org/apache/sshd/netty/NettyIoServiceFactoryFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-netty/src/main/java/org/apache/sshd/netty/NettyIoServiceFactoryFactory.java
 
b/sshd-netty/src/main/java/org/apache/sshd/netty/NettyIoServiceFactoryFactory.java
index 7920227..8cafba2 100644
--- 
a/sshd-netty/src/main/java/org/apache/sshd/netty/NettyIoServiceFactoryFactory.java
+++ 
b/sshd-netty/src/main/java/org/apache/sshd/netty/NettyIoServiceFactoryFactory.java
@@ -20,8 +20,8 @@
 package org.apache.sshd.netty;
 
 import org.apache.sshd.common.FactoryManager;
+import org.apache.sshd.common.io.AbstractIoServiceFactoryFactory;
 import org.apache.sshd.common.io.IoServiceFactory;
-import org.apache.sshd.common.io.IoServiceFactoryFactory;
 
 import io.netty.channel.EventLoopGroup;
 
@@ -29,7 +29,7 @@ import io.netty.channel.EventLoopGroup;
  * @author <a href="mailto:jul...@julienviet.com";>Julien Viet</a>
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-public class NettyIoServiceFactoryFactory implements IoServiceFactoryFactory {
+public class NettyIoServiceFactoryFactory extends 
AbstractIoServiceFactoryFactory {
 
     protected final EventLoopGroup eventLoopGroup;
 
@@ -38,6 +38,7 @@ public class NettyIoServiceFactoryFactory implements 
IoServiceFactoryFactory {
     }
 
     public NettyIoServiceFactoryFactory(EventLoopGroup eventLoopGroup) {
+        super(null);
         this.eventLoopGroup = eventLoopGroup;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-scp/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java
----------------------------------------------------------------------
diff --git 
a/sshd-scp/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java 
b/sshd-scp/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java
index 81c20db..bbea856 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java
@@ -56,6 +56,10 @@ public abstract class AbstractScpClient extends 
AbstractLoggingBean implements S
         super();
     }
 
+    public boolean isOpen() {
+        return getSession().isOpen();
+    }
+
     @Override
     public final ClientSession getSession() {
         return getClientSession();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommand.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommand.java 
b/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommand.java
index 3bb4453..7af2b09 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommand.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommand.java
@@ -20,7 +20,6 @@ package org.apache.sshd.server.scp;
 
 import java.io.IOException;
 import java.util.Collections;
-import java.util.concurrent.ExecutorService;
 
 import org.apache.sshd.common.scp.ScpException;
 import org.apache.sshd.common.scp.ScpFileOpener;
@@ -28,6 +27,7 @@ import org.apache.sshd.common.scp.ScpHelper;
 import org.apache.sshd.common.scp.ScpTransferEventListener;
 import org.apache.sshd.common.scp.helpers.DefaultScpFileOpener;
 import org.apache.sshd.common.util.GenericUtils;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.common.util.threads.ThreadUtils;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.command.AbstractFileSystemCommand;
@@ -60,9 +60,6 @@ public class ScpCommand
      * @param executorService An {@link ExecutorService} to be used when
      *                        {@link #start(Environment)}-ing execution. If 
{@code null} an ad-hoc
      *                        single-threaded service is created and used.
-     * @param shutdownOnExit  If {@code true} the {@link 
ExecutorService#shutdownNow()}
-     *                        will be called when command terminates - unless 
it is the ad-hoc
-     *                        service, which will be shutdown regardless
      * @param sendSize        Size (in bytes) of buffer to use when sending 
files
      * @param receiveSize     Size (in bytes) of buffer to use when receiving 
files
      * @param fileOpener      The {@link ScpFileOpener} - if {@code null} then 
{@link DefaultScpFileOpener} is used
@@ -72,10 +69,10 @@ public class ScpCommand
      * @see ScpHelper#MIN_RECEIVE_BUFFER_SIZE
      */
     public ScpCommand(String command,
-            ExecutorService executorService, boolean shutdownOnExit,
+            ExecutorService executorService,
             int sendSize, int receiveSize,
             ScpFileOpener fileOpener, ScpTransferEventListener eventListener) {
-        super(command, executorService, shutdownOnExit);
+        super(command, executorService);
 
         if (sendSize < ScpHelper.MIN_SEND_BUFFER_SIZE) {
             throw new IllegalArgumentException("<ScpCommmand>(" + command + ") 
send buffer size "

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommandFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommandFactory.java 
b/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommandFactory.java
index 0f9a474..4f7aa00 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommandFactory.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/server/scp/ScpCommandFactory.java
@@ -20,7 +20,6 @@ package org.apache.sshd.server.scp;
 
 import java.util.Collection;
 import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.ExecutorService;
 
 import org.apache.sshd.common.scp.ScpFileOpener;
 import org.apache.sshd.common.scp.ScpFileOpenerHolder;
@@ -29,7 +28,8 @@ import org.apache.sshd.common.scp.ScpTransferEventListener;
 import org.apache.sshd.common.util.EventListenerUtils;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ObjectBuilder;
-import org.apache.sshd.common.util.threads.ExecutorServiceConfigurer;
+import org.apache.sshd.common.util.threads.ExecutorService;
+import org.apache.sshd.common.util.threads.ExecutorServiceCarrier;
 import org.apache.sshd.server.command.AbstractDelegatingCommandFactory;
 import org.apache.sshd.server.command.Command;
 import org.apache.sshd.server.command.CommandFactory;
@@ -46,7 +46,8 @@ public class ScpCommandFactory
         extends AbstractDelegatingCommandFactory
         implements ScpFileOpenerHolder,
         Cloneable,
-        ExecutorServiceConfigurer {
+        ExecutorServiceCarrier {
+
     public static final String SCP_FACTORY_NAME = "scp";
 
     /**
@@ -74,11 +75,6 @@ public class ScpCommandFactory
             return this;
         }
 
-        public Builder withShutdownOnExit(boolean shutdown) {
-            factory.setShutdownOnExit(shutdown);
-            return this;
-        }
-
         public Builder withSendBufferSize(int sendSize) {
             factory.setSendBufferSize(sendSize);
             return this;
@@ -106,7 +102,6 @@ public class ScpCommandFactory
     }
 
     private ExecutorService executors;
-    private boolean shutdownExecutor;
     private ScpFileOpener fileOpener;
     private int sendBufferSize = ScpHelper.MIN_SEND_BUFFER_SIZE;
     private int receiveBufferSize = ScpHelper.MIN_RECEIVE_BUFFER_SIZE;
@@ -140,21 +135,10 @@ public class ScpCommandFactory
      * when the command is terminated - unless it is the ad-hoc service, which 
will be
      * shutdown regardless
      */
-    @Override
     public void setExecutorService(ExecutorService service) {
         executors = service;
     }
 
-    @Override
-    public boolean isShutdownOnExit() {
-        return shutdownExecutor;
-    }
-
-    @Override
-    public void setShutdownOnExit(boolean shutdown) {
-        shutdownExecutor = shutdown;
-    }
-
     public int getSendBufferSize() {
         return sendBufferSize;
     }
@@ -227,7 +211,7 @@ public class ScpCommandFactory
     @Override
     protected Command executeSupportedCommand(String command) {
         return new ScpCommand(command,
-                getExecutorService(), isShutdownOnExit(),
+                getExecutorService(),
                 getSendBufferSize(), getReceiveBufferSize(),
                 getScpFileOpener(), listenerProxy);
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java 
b/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java
index 3cc15b7..5712e2f 100644
--- a/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java
+++ b/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java
@@ -35,7 +35,6 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.EnumSet;
 import java.util.Set;
-import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -60,6 +59,7 @@ import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.OsUtils;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.io.IoUtils;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.server.SshServer;
 import org.apache.sshd.server.command.Command;
 import org.apache.sshd.server.scp.ScpCommand;
@@ -768,9 +768,9 @@ public class ScpTest extends BaseTestSupport {
         final int testExitValue = 7365;
         class InternalScpCommand extends ScpCommand {
 
-            InternalScpCommand(String command, ExecutorService 
executorService, boolean shutdownOnExit,
+            InternalScpCommand(String command, ExecutorService executorService,
                     int sendSize, int receiveSize, ScpFileOpener opener, 
ScpTransferEventListener eventListener) {
-                super(command, executorService, shutdownOnExit, sendSize, 
receiveSize, opener, eventListener);
+                super(command, executorService, sendSize, receiveSize, opener, 
eventListener);
             }
 
             @Override
@@ -792,7 +792,7 @@ public class ScpTest extends BaseTestSupport {
             public Command createCommand(String command) {
                 
ValidateUtils.checkTrue(command.startsWith(ScpHelper.SCP_COMMAND_PREFIX), "Bad 
SCP command: %s", command);
                 return new InternalScpCommand(command,
-                        getExecutorService(), isShutdownOnExit(),
+                        getExecutorService(),
                         getSendBufferSize(), getReceiveBufferSize(),
                         DefaultScpFileOpener.INSTANCE,
                         ScpTransferEventListener.EMPTY);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-scp/src/test/java/org/apache/sshd/server/scp/ScpCommandFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-scp/src/test/java/org/apache/sshd/server/scp/ScpCommandFactoryTest.java 
b/sshd-scp/src/test/java/org/apache/sshd/server/scp/ScpCommandFactoryTest.java
index 1ee20fd..06ae97e 100644
--- 
a/sshd-scp/src/test/java/org/apache/sshd/server/scp/ScpCommandFactoryTest.java
+++ 
b/sshd-scp/src/test/java/org/apache/sshd/server/scp/ScpCommandFactoryTest.java
@@ -19,9 +19,8 @@
 
 package org.apache.sshd.server.scp;
 
-import java.util.concurrent.ExecutorService;
-
 import org.apache.sshd.common.scp.ScpHelper;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.server.command.CommandFactory;
 import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.NoIoTestCase;
@@ -52,7 +51,6 @@ public class ScpCommandFactoryTest extends BaseTestSupport {
         assertNull("Mismatched executor", factory.getExecutorService());
         assertEquals("Mismatched send size", ScpHelper.MIN_SEND_BUFFER_SIZE, 
factory.getSendBufferSize());
         assertEquals("Mismatched receive size", 
ScpHelper.MIN_RECEIVE_BUFFER_SIZE, factory.getReceiveBufferSize());
-        assertFalse("Mismatched shutdown state", factory.isShutdownOnExit());
     }
 
     /**
@@ -69,13 +67,11 @@ public class ScpCommandFactoryTest extends BaseTestSupport {
                 .withExecutorService(service)
                 .withSendBufferSize(sendSize)
                 .withReceiveBufferSize(receiveSize)
-                .withShutdownOnExit(true)
                 .build();
         assertSame("Mismatched delegate", delegate, 
factory.getDelegateCommandFactory());
         assertSame("Mismatched executor", service, 
factory.getExecutorService());
         assertEquals("Mismatched send size", sendSize, 
factory.getSendBufferSize());
         assertEquals("Mismatched receive size", receiveSize, 
factory.getReceiveBufferSize());
-        assertTrue("Mismatched shutdown state", factory.isShutdownOnExit());
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java
----------------------------------------------------------------------
diff --git 
a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java
 
b/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java
index 369d1b2..aecbe2f 100644
--- 
a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java
+++ 
b/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java
@@ -40,7 +40,6 @@ import java.util.Objects;
 import java.util.TreeMap;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -66,6 +65,7 @@ import org.apache.sshd.common.util.buffer.Buffer;
 import org.apache.sshd.common.util.buffer.BufferUtils;
 import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
 import org.apache.sshd.common.util.io.IoUtils;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.common.util.threads.ExecutorServiceCarrier;
 import org.apache.sshd.common.util.threads.ThreadUtils;
 import org.apache.sshd.server.ChannelSessionAware;
@@ -150,15 +150,11 @@ public class SftpSubsystem
     protected ServerSession serverSession;
     protected ChannelSession channelSession;
     protected ExecutorService executorService;
-    protected boolean shutdownOnExit;
 
     /**
      * @param executorService The {@link ExecutorService} to be used by
      *                        the {@link SftpSubsystem} command when starting 
execution. If
      *                        {@code null} then a single-threaded ad-hoc 
service is used.
-     * @param shutdownOnExit  If {@code true} the {@link 
ExecutorService#shutdownNow()}
-     *                        will be called when subsystem terminates - 
unless it is the ad-hoc
-     *                        service, which will be shutdown regardless
      * @param policy          The {@link UnsupportedAttributePolicy} to use if 
failed to access
      *                        some local file attributes
      * @param accessor        The {@link SftpFileSystemAccessor} to use for 
opening files and directories
@@ -166,16 +162,14 @@ public class SftpSubsystem
      * use when generating failed commands error messages
      * @see ThreadUtils#newSingleThreadExecutor(String)
      */
-    public SftpSubsystem(ExecutorService executorService, boolean 
shutdownOnExit, UnsupportedAttributePolicy policy,
+    public SftpSubsystem(ExecutorService executorService, 
UnsupportedAttributePolicy policy,
             SftpFileSystemAccessor accessor, SftpErrorStatusDataHandler 
errorStatusDataHandler) {
         super(policy, accessor, errorStatusDataHandler);
 
         if (executorService == null) {
             this.executorService = 
ThreadUtils.newSingleThreadExecutor(getClass().getSimpleName());
-            this.shutdownOnExit = true;    // we always close the ad-hoc 
executor service
         } else {
             this.executorService = executorService;
-            this.shutdownOnExit = shutdownOnExit;
         }
     }
 
@@ -195,11 +189,6 @@ public class SftpSubsystem
     }
 
     @Override
-    public boolean isShutdownOnExit() {
-        return shutdownOnExit;
-    }
-
-    @Override
     public void setSession(ServerSession session) {
         this.serverSession = Objects.requireNonNull(session, "No session");
 
@@ -1003,7 +992,7 @@ public class SftpSubsystem
         pendingFuture = null;
 
         ExecutorService executors = getExecutorService();
-        if ((executors != null) && (!executors.isShutdown()) && 
isShutdownOnExit()) {
+        if ((executors != null) && (!executors.isShutdown())) {
             Collection<Runnable> runners = executors.shutdownNow();
             if (debugEnabled) {
                 log.debug("destroy(" + session + ") - shutdown executor 
service - runners count=" + runners.size());

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactory.java
----------------------------------------------------------------------
diff --git 
a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactory.java
 
b/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactory.java
index 860f3ce..a60cab6 100644
--- 
a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactory.java
+++ 
b/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactory.java
@@ -20,12 +20,11 @@
 package org.apache.sshd.server.subsystem.sftp;
 
 import java.util.Objects;
-import java.util.concurrent.ExecutorService;
 
 import org.apache.sshd.common.subsystem.sftp.SftpConstants;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ObjectBuilder;
-import org.apache.sshd.common.util.threads.ExecutorServiceConfigurer;
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.server.command.Command;
 import org.apache.sshd.server.subsystem.SubsystemFactory;
 
@@ -34,13 +33,13 @@ import org.apache.sshd.server.subsystem.SubsystemFactory;
  */
 public class SftpSubsystemFactory
         extends AbstractSftpEventListenerManager
-        implements SubsystemFactory, ExecutorServiceConfigurer, 
SftpEventListenerManager, SftpFileSystemAccessorManager {
+        implements SubsystemFactory, SftpEventListenerManager, 
SftpFileSystemAccessorManager {
+
     public static final String NAME = SftpConstants.SFTP_SUBSYSTEM_NAME;
     public static final UnsupportedAttributePolicy DEFAULT_POLICY = 
UnsupportedAttributePolicy.Warn;
 
     public static class Builder extends AbstractSftpEventListenerManager 
implements ObjectBuilder<SftpSubsystemFactory> {
         private ExecutorService executors;
-        private boolean shutdownExecutor;
         private UnsupportedAttributePolicy policy = DEFAULT_POLICY;
         private SftpFileSystemAccessor fileSystemAccessor = 
SftpFileSystemAccessor.DEFAULT;
         private SftpErrorStatusDataHandler errorStatusDataHandler = 
SftpErrorStatusDataHandler.DEFAULT;
@@ -54,11 +53,6 @@ public class SftpSubsystemFactory
             return this;
         }
 
-        public Builder withShutdownOnExit(boolean shutdown) {
-            shutdownExecutor = shutdown;
-            return this;
-        }
-
         public Builder 
withUnsupportedAttributePolicy(UnsupportedAttributePolicy p) {
             policy = Objects.requireNonNull(p, "No policy");
             return this;
@@ -78,7 +72,6 @@ public class SftpSubsystemFactory
         public SftpSubsystemFactory build() {
             SftpSubsystemFactory factory = new SftpSubsystemFactory();
             factory.setExecutorService(executors);
-            factory.setShutdownOnExit(shutdownExecutor);
             factory.setUnsupportedAttributePolicy(policy);
             factory.setFileSystemAccessor(fileSystemAccessor);
             factory.setErrorStatusDataHandler(errorStatusDataHandler);
@@ -88,7 +81,6 @@ public class SftpSubsystemFactory
     }
 
     private ExecutorService executors;
-    private boolean shutdownExecutor;
     private UnsupportedAttributePolicy policy = DEFAULT_POLICY;
     private SftpFileSystemAccessor fileSystemAccessor = 
SftpFileSystemAccessor.DEFAULT;
     private SftpErrorStatusDataHandler errorStatusDataHandler = 
SftpErrorStatusDataHandler.DEFAULT;
@@ -102,7 +94,6 @@ public class SftpSubsystemFactory
         return NAME;
     }
 
-    @Override
     public ExecutorService getExecutorService() {
         return executors;
     }
@@ -111,26 +102,10 @@ public class SftpSubsystemFactory
      * @param service The {@link ExecutorService} to be used by the {@link 
SftpSubsystem}
      * command when starting execution. If {@code null} then a single-threaded 
ad-hoc service is used.
      */
-    @Override
     public void setExecutorService(ExecutorService service) {
         executors = service;
     }
 
-    @Override
-    public boolean isShutdownOnExit() {
-        return shutdownExecutor;
-    }
-
-    /**
-     * @param shutdownOnExit If {@code true} the {@link 
ExecutorService#shutdownNow()}
-     * will be called when subsystem terminates - unless it is the ad-hoc 
service, which
-     *                       will be shutdown regardless
-     */
-    @Override
-    public void setShutdownOnExit(boolean shutdownOnExit) {
-        shutdownExecutor = shutdownOnExit;
-    }
-
     public UnsupportedAttributePolicy getUnsupportedAttributePolicy() {
         return policy;
     }
@@ -164,7 +139,7 @@ public class SftpSubsystemFactory
     @Override
     public Command create() {
         SftpSubsystem subsystem =
-            new SftpSubsystem(getExecutorService(), isShutdownOnExit(),
+            new SftpSubsystem(getExecutorService(),
                 getUnsupportedAttributePolicy(), getFileSystemAccessor(),
                 getErrorStatusDataHandler());
         GenericUtils.forEach(getRegisteredListeners(), 
subsystem::addSftpEventListener);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/SftpVersionsTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/SftpVersionsTest.java
 
b/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/SftpVersionsTest.java
index 3f85a68..09bb1a9 100644
--- 
a/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/SftpVersionsTest.java
+++ 
b/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/SftpVersionsTest.java
@@ -227,7 +227,7 @@ public class SftpVersionsTest extends 
AbstractSftpClientTestSupport {
         SftpSubsystemFactory factory = new SftpSubsystemFactory() {
             @Override
             public Command create() {
-                SftpSubsystem subsystem = new 
SftpSubsystem(getExecutorService(), isShutdownOnExit(),
+                SftpSubsystem subsystem = new 
SftpSubsystem(getExecutorService(),
                         getUnsupportedAttributePolicy(), 
getFileSystemAccessor(), getErrorStatusDataHandler()) {
                     @Override
                     protected NavigableMap<String, Object> 
resolveFileAttributes(Path file, int flags, LinkOption... options) throws 
IOException {
@@ -346,7 +346,7 @@ public class SftpVersionsTest extends 
AbstractSftpClientTestSupport {
         SftpSubsystemFactory factory = new SftpSubsystemFactory() {
             @Override
             public Command create() {
-                SftpSubsystem subsystem = new 
SftpSubsystem(getExecutorService(), isShutdownOnExit(),
+                SftpSubsystem subsystem = new 
SftpSubsystem(getExecutorService(),
                         getUnsupportedAttributePolicy(), 
getFileSystemAccessor(), getErrorStatusDataHandler()) {
                     @Override
                     protected NavigableMap<String, Object> 
resolveFileAttributes(Path file, int flags, LinkOption... options) throws 
IOException {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/SpaceAvailableExtensionImplTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/SpaceAvailableExtensionImplTest.java
 
b/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/SpaceAvailableExtensionImplTest.java
index 82b82df..af83656 100644
--- 
a/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/SpaceAvailableExtensionImplTest.java
+++ 
b/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/helpers/SpaceAvailableExtensionImplTest.java
@@ -71,7 +71,7 @@ public class SpaceAvailableExtensionImplTest extends 
AbstractSftpClientTestSuppo
         sshd.setSubsystemFactories(Collections.singletonList(new 
SftpSubsystemFactory() {
             @Override
             public Command create() {
-                return new SftpSubsystem(getExecutorService(), 
isShutdownOnExit(),
+                return new SftpSubsystem(getExecutorService(),
                         getUnsupportedAttributePolicy(), 
getFileSystemAccessor(), getErrorStatusDataHandler()) {
                     @Override
                     protected SpaceAvailableExtensionInfo doSpaceAvailable(int 
id, String path) throws IOException {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java
 
b/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java
index b8240d8..83ef70f 100644
--- 
a/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java
+++ 
b/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java
@@ -124,7 +124,7 @@ public class OpenSSHExtensionsTest extends 
AbstractSftpClientTestSupport {
         sshd.setSubsystemFactories(Collections.singletonList(new 
SftpSubsystemFactory() {
             @Override
             public Command create() {
-                return new SftpSubsystem(getExecutorService(), 
isShutdownOnExit(),
+                return new SftpSubsystem(getExecutorService(),
                         getUnsupportedAttributePolicy(), 
getFileSystemAccessor(), getErrorStatusDataHandler()) {
                     @Override
                     protected List<OpenSSHExtension> 
resolveOpenSSHExtensions(ServerSession session) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/7b35bb36/sshd-sftp/src/test/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/sshd-sftp/src/test/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactoryTest.java
 
b/sshd-sftp/src/test/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactoryTest.java
index 6420411..436ae17 100644
--- 
a/sshd-sftp/src/test/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactoryTest.java
+++ 
b/sshd-sftp/src/test/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystemFactoryTest.java
@@ -19,8 +19,7 @@
 
 package org.apache.sshd.server.subsystem.sftp;
 
-import java.util.concurrent.ExecutorService;
-
+import org.apache.sshd.common.util.threads.ExecutorService;
 import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.NoIoTestCase;
 import org.junit.FixMethodOrder;
@@ -47,7 +46,6 @@ public class SftpSubsystemFactoryTest extends BaseTestSupport 
{
     public void testBuilderDefaultFactoryValues() {
         SftpSubsystemFactory factory = new 
SftpSubsystemFactory.Builder().build();
         assertNull("Mismatched executor", factory.getExecutorService());
-        assertFalse("Mismatched shutdown state", factory.isShutdownOnExit());
         assertSame("Mismatched unsupported attribute policy", 
SftpSubsystemFactory.DEFAULT_POLICY, factory.getUnsupportedAttributePolicy());
     }
 
@@ -59,10 +57,8 @@ public class SftpSubsystemFactoryTest extends 
BaseTestSupport {
         SftpSubsystemFactory.Builder builder = new 
SftpSubsystemFactory.Builder();
         ExecutorService service = dummyExecutor();
         SftpSubsystemFactory factory = builder.withExecutorService(service)
-                .withShutdownOnExit(true)
                 .build();
         assertSame("Mismatched executor", service, 
factory.getExecutorService());
-        assertTrue("Mismatched shutdown state", factory.isShutdownOnExit());
 
         for (UnsupportedAttributePolicy policy : 
UnsupportedAttributePolicy.VALUES) {
             SftpSubsystemFactory actual = 
builder.withUnsupportedAttributePolicy(policy).build();

Reply via email to