Add GetNode command implementation
[jFCPlib.git] / src / main / java / net / pterodactylus / fcp / quelaton / GetNodeCommandImpl.java
1 package net.pterodactylus.fcp.quelaton;
2
3 import java.io.IOException;
4 import java.util.concurrent.ExecutorService;
5 import java.util.concurrent.atomic.AtomicReference;
6
7 import net.pterodactylus.fcp.GetNode;
8 import net.pterodactylus.fcp.NodeData;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import com.google.common.util.concurrent.ListeningExecutorService;
12 import com.google.common.util.concurrent.MoreExecutors;
13
14 /**
15  * Default {@link GetNodeCommandImpl} implementation based on {@link FcpReplySequence}.
16  *
17  * @author <a href="mailto:bombe@freenetproject.org">David ‘Bombe’ Roden</a>
18  */
19 public class GetNodeCommandImpl implements GetNodeCommand {
20
21         private final ListeningExecutorService threadPool;
22         private final ConnectionSupplier connectionSupplier;
23
24         public GetNodeCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier) {
25                 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
26                 this.connectionSupplier = connectionSupplier;
27         }
28
29         @Override
30         public ListenableFuture<NodeData> execute() {
31                 GetNode getNode = new GetNode(new RandomIdentifierGenerator().generate(), false, false, false);
32                 return threadPool.submit(() -> new GetNodeReplySequence().send(getNode).get());
33         }
34
35         private class GetNodeReplySequence extends FcpReplySequence<NodeData> {
36
37                 private final AtomicReference<NodeData> nodeData = new AtomicReference<>();
38
39                 public GetNodeReplySequence() throws IOException {
40                         super(threadPool, connectionSupplier.get());
41                 }
42
43                 @Override
44                 protected boolean isFinished() {
45                         return nodeData.get() != null;
46                 }
47
48                 @Override
49                 protected NodeData getResult() {
50                         return nodeData.get();
51                 }
52
53                 @Override
54                 protected void consumeNodeData(NodeData nodeData) {
55                         this.nodeData.set(nodeData);
56                 }
57
58         }
59
60 }