Refactor FCP dialog
[jFCPlib.git] / src / main / java / net / pterodactylus / fcp / quelaton / UnsubscribeUskCommandImpl.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.function.Supplier;
7
8 import net.pterodactylus.fcp.UnsubscribeUSK;
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 UnsubscribeUskCommand} implementation based on {@link FcpDialog}.
16  *
17  * @author <a href="mailto:bombe@freenetproject.org">David ‘Bombe’ Roden</a>
18  */
19 public class UnsubscribeUskCommandImpl implements UnsubscribeUskCommand {
20
21         private final ListeningExecutorService threadPool;
22         private final ConnectionSupplier connectionSupplier;
23         private final UnsubscribeUSK unsubscribeUSK;
24
25         public UnsubscribeUskCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier<String> identifierGenerator) {
26                 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
27                 this.connectionSupplier = connectionSupplier;
28                 unsubscribeUSK = new UnsubscribeUSK(identifierGenerator.get());
29         }
30
31         @Override
32         public Executable<Void> identifier(String identifier) {
33                 return this::execute;
34         }
35
36         private ListenableFuture<Void> execute() {
37                 return threadPool.submit(this::executeDialog);
38         }
39
40         private Void executeDialog() throws IOException, ExecutionException, InterruptedException {
41                 try (UnsubscribeUskDialog unsubscribeUskDialog = new UnsubscribeUskDialog()) {
42                         return unsubscribeUskDialog.send(unsubscribeUSK).get();
43                 }
44         }
45
46         private class UnsubscribeUskDialog extends FcpDialog<Void> {
47
48                 public UnsubscribeUskDialog() throws IOException {
49                         super(threadPool, connectionSupplier.get(), null);
50                         finish();
51                 }
52
53         }
54
55 }