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;
12 import net.pterodactylus.fcp.AddPeer;
13 import net.pterodactylus.fcp.Peer;
14 import net.pterodactylus.fcp.ProtocolError;
16 import com.google.common.util.concurrent.ListenableFuture;
17 import com.google.common.util.concurrent.ListeningExecutorService;
18 import com.google.common.util.concurrent.MoreExecutors;
21 * Default {@link AddPeerCommand} implementation based on {@link FcpReplySequence}.
23 * @author <a href="mailto:bombe@freenetproject.org">David ‘Bombe’ Roden</a>
25 public class AddPeerCommandImpl implements AddPeerCommand {
27 private final ListeningExecutorService threadPool;
28 private final ConnectionSupplier connectionSupplier;
29 private final AtomicReference<File> file = new AtomicReference<>();
30 private final AtomicReference<URL> url = new AtomicReference<>();
32 public AddPeerCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier) {
33 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
34 this.connectionSupplier = connectionSupplier;
38 public Executable<Optional<Peer>> withFile(File file) {
44 public Executable<Optional<Peer>> fromURL(URL url) {
49 private ListenableFuture<Optional<Peer>> execute() {
50 return threadPool.submit(this::executeSequence);
53 private Optional<Peer> executeSequence() throws IOException, ExecutionException, InterruptedException {
54 AddPeer addPeer = null;
55 if (file.get() != null) {
56 addPeer = new AddPeer(new RandomIdentifierGenerator().generate(), file.get().getPath());
57 } else if (url.get() != null) {
58 addPeer = new AddPeer(new RandomIdentifierGenerator().generate(), url.get());
60 try (AddPeerSequence addPeerSequence = new AddPeerSequence()) {
61 return addPeerSequence.send(addPeer).get();
65 private class AddPeerSequence extends FcpReplySequence<Optional<Peer>> {
67 private final AtomicBoolean finished = new AtomicBoolean();
68 private final AtomicReference<Peer> peer = new AtomicReference<>();
70 public AddPeerSequence() throws IOException {
71 super(threadPool, connectionSupplier.get());
75 protected boolean isFinished() {
76 return finished.get();
80 protected Optional<Peer> getResult() {
81 return Optional.ofNullable(peer.get());
85 protected void consumePeer(Peer peer) {
91 protected void consumeProtocolError(ProtocolError protocolError) {