Add test for TestDDA sequence
[jFCPlib.git] / src / main / java / net / pterodactylus / fcp / quelaton / DefaultFcpClient.java
index 30dac91..42522e0 100644 (file)
@@ -12,6 +12,9 @@ import net.pterodactylus.fcp.CloseConnectionDuplicateClientName;
 import net.pterodactylus.fcp.FcpConnection;
 import net.pterodactylus.fcp.NodeHello;
 
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+
 /**
  * Default {@link FcpClient} implementation.
  *
@@ -19,7 +22,7 @@ import net.pterodactylus.fcp.NodeHello;
  */
 public class DefaultFcpClient implements FcpClient {
 
-       private final ExecutorService threadPool;
+       private final ListeningExecutorService threadPool;
        private final String hostname;
        private final int port;
        private final AtomicReference<FcpConnection> fcpConnection = new AtomicReference<>();
@@ -27,8 +30,8 @@ public class DefaultFcpClient implements FcpClient {
        private final Supplier<String> expectedVersion;
 
        public DefaultFcpClient(ExecutorService threadPool, String hostname, int port, Supplier<String> clientName,
-                       Supplier<String> expectedVersion) {
-               this.threadPool = threadPool;
+               Supplier<String> expectedVersion) {
+               this.threadPool = MoreExecutors.listeningDecorator(threadPool);
                this.hostname = hostname;
                this.port = port;
                this.clientName = clientName;
@@ -48,25 +51,7 @@ public class DefaultFcpClient implements FcpClient {
        private FcpConnection createConnection() throws IOException {
                FcpConnection connection = new FcpConnection(hostname, port);
                connection.connect();
-               FcpReplySequence<?> nodeHelloSequence = new FcpReplySequence<Void>(threadPool, connection) {
-                       private final AtomicReference<NodeHello> receivedNodeHello = new AtomicReference<>();
-                       private final AtomicBoolean receivedClosed = new AtomicBoolean();
-                       @Override
-                       protected boolean isFinished() {
-                               return receivedNodeHello.get() != null || receivedClosed.get();
-                       }
-
-                       @Override
-                       protected void consumeNodeHello(NodeHello nodeHello) {
-                               receivedNodeHello.set(nodeHello);
-                       }
-
-                       @Override
-                       protected void consumeCloseConnectionDuplicateClientName(
-                               CloseConnectionDuplicateClientName closeConnectionDuplicateClientName) {
-                               receivedClosed.set(true);
-                       }
-               };
+               FcpReplySequence<?> nodeHelloSequence = new ClientHelloReplySequence(connection);
                ClientHello clientHello = new ClientHello(clientName.get(), expectedVersion.get());
                try {
                        nodeHelloSequence.send(clientHello).get();
@@ -87,5 +72,39 @@ public class DefaultFcpClient implements FcpClient {
                return new ClientGetCommandImpl(threadPool, this::connect);
        }
 
+       @Override
+       public ClientPutCommand clientPut() {
+               return new ClientPutCommandImpl(threadPool, this::connect);
+       }
+
+       private class ClientHelloReplySequence extends FcpReplySequence<Void> {
+
+               private final AtomicReference<NodeHello> receivedNodeHello;
+               private final AtomicBoolean receivedClosed;
+
+               public ClientHelloReplySequence(FcpConnection connection) {
+                       super(DefaultFcpClient.this.threadPool, connection);
+                       receivedNodeHello = new AtomicReference<>();
+                       receivedClosed = new AtomicBoolean();
+               }
+
+               @Override
+               protected boolean isFinished() {
+                       return receivedNodeHello.get() != null || receivedClosed.get();
+               }
+
+               @Override
+               protected void consumeNodeHello(NodeHello nodeHello) {
+                       receivedNodeHello.set(nodeHello);
+               }
+
+               @Override
+               protected void consumeCloseConnectionDuplicateClientName(
+                       CloseConnectionDuplicateClientName closeConnectionDuplicateClientName) {
+                       receivedClosed.set(true);
+               }
+
+       }
+
 }