Refactor FCP dialog
[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.ExecutionException;
5 import java.util.concurrent.ExecutorService;
6 import java.util.concurrent.atomic.AtomicBoolean;
7 import java.util.function.Supplier;
8
9 import net.pterodactylus.fcp.GetNode;
10 import net.pterodactylus.fcp.NodeData;
11
12 import com.google.common.util.concurrent.ListenableFuture;
13 import com.google.common.util.concurrent.ListeningExecutorService;
14 import com.google.common.util.concurrent.MoreExecutors;
15
16 /**
17  * Default {@link GetNodeCommandImpl} implementation based on {@link FcpDialog}.
18  *
19  * @author <a href="mailto:bombe@freenetproject.org">David ‘Bombe’ Roden</a>
20  */
21 public class GetNodeCommandImpl implements GetNodeCommand {
22
23         private final ListeningExecutorService threadPool;
24         private final ConnectionSupplier connectionSupplier;
25         private final Supplier<String> identifierGenerator;
26         private final AtomicBoolean giveOpennetRef = new AtomicBoolean(false);
27         private final AtomicBoolean includePrivate = new AtomicBoolean(false);
28         private final AtomicBoolean includeVolatile = new AtomicBoolean(false);
29
30         public GetNodeCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier<String> identifierGenerator) {
31                 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
32                 this.connectionSupplier = connectionSupplier;
33                 this.identifierGenerator = identifierGenerator;
34         }
35
36         @Override
37         public GetNodeCommand opennetRef() {
38                 giveOpennetRef.set(true);
39                 return this;
40         }
41
42         @Override
43         public GetNodeCommand includePrivate() {
44                 includePrivate.set(true);
45                 return this;
46         }
47
48         @Override
49         public GetNodeCommand includeVolatile() {
50                 includeVolatile.set(true);
51                 return this;
52         }
53
54         @Override
55         public ListenableFuture<NodeData> execute() {
56                 return threadPool.submit(this::executeDialog);
57         }
58
59         private NodeData executeDialog() throws InterruptedException, ExecutionException, IOException {
60                 GetNode getNode = new GetNode(identifierGenerator.get(), giveOpennetRef.get(),
61                         includePrivate.get(), includeVolatile.get());
62                 try (GetNodeDialog getNodeDialog = new GetNodeDialog()) {
63                         return getNodeDialog.send(getNode).get();
64                 }
65         }
66
67         private class GetNodeDialog extends FcpDialog<NodeData> {
68
69                 public GetNodeDialog() throws IOException {
70                         super(threadPool, connectionSupplier.get(), null);
71                 }
72
73                 @Override
74                 protected void consumeNodeData(NodeData nodeData) {
75                         setResult(nodeData);
76                 }
77
78         }
79
80 }