Add flag to GetNode command to include volatile data
[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         private final AtomicBoolean includePrivate = new AtomicBoolean(false);
26         private final AtomicBoolean includeVolatile = new AtomicBoolean(false);
27
28         public GetNodeCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier) {
29                 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
30                 this.connectionSupplier = connectionSupplier;
31         }
32
33         @Override
34         public GetNodeCommand opennetRef() {
35                 giveOpennetRef.set(true);
36                 return this;
37         }
38
39         @Override
40         public GetNodeCommand includePrivate() {
41                 includePrivate.set(true);
42                 return this;
43         }
44
45         @Override
46         public GetNodeCommand includeVolatile() {
47                 includeVolatile.set(true);
48                 return this;
49         }
50
51         @Override
52         public ListenableFuture<NodeData> execute() {
53                 GetNode getNode = new GetNode(new RandomIdentifierGenerator().generate(), giveOpennetRef.get(),
54                         includePrivate.get(), includeVolatile.get());
55                 return threadPool.submit(() -> new GetNodeReplySequence().send(getNode).get());
56         }
57
58         private class GetNodeReplySequence extends FcpReplySequence<NodeData> {
59
60                 private final AtomicReference<NodeData> nodeData = new AtomicReference<>();
61
62                 public GetNodeReplySequence() throws IOException {
63                         super(threadPool, connectionSupplier.get());
64                 }
65
66                 @Override
67                 protected boolean isFinished() {
68                         return nodeData.get() != null;
69                 }
70
71                 @Override
72                 protected NodeData getResult() {
73                         return nodeData.get();
74                 }
75
76                 @Override
77                 protected void consumeNodeData(NodeData nodeData) {
78                         this.nodeData.set(nodeData);
79                 }
80
81         }
82
83 }