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