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.AtomicBoolean;
10 import java.util.concurrent.atomic.AtomicReference;
11 import java.util.function.Supplier;
13 import net.pterodactylus.fcp.AddPeer;
14 import net.pterodactylus.fcp.NodeRef;
15 import net.pterodactylus.fcp.Peer;
16 import net.pterodactylus.fcp.ProtocolError;
18 import com.google.common.util.concurrent.ListenableFuture;
19 import com.google.common.util.concurrent.ListeningExecutorService;
20 import com.google.common.util.concurrent.MoreExecutors;
23 * Default {@link AddPeerCommand} implementation based on {@link FcpDialog}.
25 * @author <a href="mailto:bombe@freenetproject.org">David ‘Bombe’ Roden</a>
27 public class AddPeerCommandImpl implements AddPeerCommand {
29 private final ListeningExecutorService threadPool;
30 private final ConnectionSupplier connectionSupplier;
31 private final Supplier<String> identifierSupplier;
32 private final AtomicReference<File> file = new AtomicReference<>();
33 private final AtomicReference<URL> url = new AtomicReference<>();
34 private final AtomicReference<NodeRef> nodeRef = new AtomicReference<>();
36 public AddPeerCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier<String> identifierSupplier) {
37 this.identifierSupplier = identifierSupplier;
38 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
39 this.connectionSupplier = connectionSupplier;
43 public Executable<Optional<Peer>> fromFile(File file) {
49 public Executable<Optional<Peer>> fromURL(URL url) {
55 public Executable<Optional<Peer>> fromNodeRef(NodeRef nodeRef) {
56 this.nodeRef.set(nodeRef);
60 private ListenableFuture<Optional<Peer>> execute() {
61 return threadPool.submit(this::executeDialog);
64 private Optional<Peer> executeDialog() throws IOException, ExecutionException, InterruptedException {
66 if (file.get() != null) {
67 addPeer = new AddPeer(identifierSupplier.get(), file.get().getPath());
68 } else if (url.get() != null) {
69 addPeer = new AddPeer(identifierSupplier.get(), url.get());
71 addPeer = new AddPeer(identifierSupplier.get(), nodeRef.get());
73 try (AddPeerDialog addPeerDialog = new AddPeerDialog()) {
74 return addPeerDialog.send(addPeer).get();
78 private class AddPeerDialog extends FcpDialog<Optional<Peer>> {
80 private final AtomicBoolean finished = new AtomicBoolean();
81 private final AtomicReference<Peer> peer = new AtomicReference<>();
83 public AddPeerDialog() throws IOException {
84 super(threadPool, connectionSupplier.get());
88 protected boolean isFinished() {
89 return finished.get();
93 protected Optional<Peer> getResult() {
94 return Optional.ofNullable(peer.get());
98 protected void consumePeer(Peer peer) {
104 protected void consumeProtocolError(ProtocolError protocolError) {