1 package net.pterodactylus.fcp.quelaton;
4 import java.io.IOException;
6 import java.util.Optional;
7 import java.util.concurrent.ExecutionException;
8 import java.util.concurrent.ExecutorService;
9 import java.util.concurrent.atomic.AtomicReference;
10 import java.util.function.Supplier;
12 import net.pterodactylus.fcp.AddPeer;
13 import net.pterodactylus.fcp.NodeRef;
14 import net.pterodactylus.fcp.Peer;
15 import net.pterodactylus.fcp.ProtocolError;
17 import com.google.common.util.concurrent.ListenableFuture;
18 import com.google.common.util.concurrent.ListeningExecutorService;
19 import com.google.common.util.concurrent.MoreExecutors;
22 * Default {@link AddPeerCommand} implementation based on {@link FcpDialog}.
24 * @author <a href="mailto:bombe@freenetproject.org">David ‘Bombe’ Roden</a>
26 public class AddPeerCommandImpl implements AddPeerCommand {
28 private final ListeningExecutorService threadPool;
29 private final ConnectionSupplier connectionSupplier;
30 private final Supplier<String> identifierSupplier;
31 private final AtomicReference<File> file = new AtomicReference<>();
32 private final AtomicReference<URL> url = new AtomicReference<>();
33 private final AtomicReference<NodeRef> nodeRef = new AtomicReference<>();
35 public AddPeerCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier<String> identifierSupplier) {
36 this.identifierSupplier = identifierSupplier;
37 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
38 this.connectionSupplier = connectionSupplier;
42 public Executable<Optional<Peer>> fromFile(File file) {
48 public Executable<Optional<Peer>> fromURL(URL url) {
54 public Executable<Optional<Peer>> fromNodeRef(NodeRef nodeRef) {
55 this.nodeRef.set(nodeRef);
59 private ListenableFuture<Optional<Peer>> execute() {
60 return threadPool.submit(this::executeDialog);
63 private Optional<Peer> executeDialog() throws IOException, ExecutionException, InterruptedException {
65 if (file.get() != null) {
66 addPeer = new AddPeer(identifierSupplier.get(), file.get().getPath());
67 } else if (url.get() != null) {
68 addPeer = new AddPeer(identifierSupplier.get(), url.get());
70 addPeer = new AddPeer(identifierSupplier.get(), nodeRef.get());
72 try (AddPeerDialog addPeerDialog = new AddPeerDialog()) {
73 return addPeerDialog.send(addPeer).get();
77 private class AddPeerDialog extends FcpDialog<Optional<Peer>> {
79 public AddPeerDialog() throws IOException {
80 super(threadPool, connectionSupplier.get(), Optional.empty());
84 protected void consumePeer(Peer peer) {
85 setResult(Optional.ofNullable(peer));
89 protected void consumeProtocolError(ProtocolError protocolError) {