1 package net.pterodactylus.fcp.quelaton;
4 import java.io.IOException;
6 import java.util.Objects;
7 import java.util.Optional;
8 import java.util.concurrent.CopyOnWriteArrayList;
9 import java.util.concurrent.ExecutionException;
10 import java.util.concurrent.ExecutorService;
11 import java.util.concurrent.atomic.AtomicReference;
12 import java.util.function.Consumer;
13 import java.util.function.Supplier;
15 import net.pterodactylus.fcp.ClientPutDiskDir;
16 import net.pterodactylus.fcp.Key;
17 import net.pterodactylus.fcp.ProtocolError;
18 import net.pterodactylus.fcp.PutSuccessful;
19 import net.pterodactylus.fcp.RequestProgress;
20 import net.pterodactylus.fcp.SimpleProgress;
21 import net.pterodactylus.fcp.Verbosity;
23 import com.google.common.util.concurrent.ListeningExecutorService;
24 import com.google.common.util.concurrent.MoreExecutors;
27 * Default {@link ClientPutDiskDirCommand} implemented based on {@link FcpDialog}.
29 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
31 public class ClientPutDiskDirCommandImpl implements ClientPutDiskDirCommand {
33 private final ListeningExecutorService threadPool;
34 private final ConnectionSupplier connectionSupplier;
35 private final Supplier<String> identifierGenerator;
36 private final AtomicReference<String> directory = new AtomicReference<>();
37 private final AtomicReference<String> uri = new AtomicReference<>();
38 private final List<Consumer<RequestProgress>> requestProgressConsumers = new CopyOnWriteArrayList<>();
40 public ClientPutDiskDirCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier<String> identifierGenerator) {
41 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
42 this.connectionSupplier = connectionSupplier;
43 this.identifierGenerator = identifierGenerator;
47 public ClientPutDiskDirCommand onProgress(Consumer<RequestProgress> requestProgressConsumer) {
48 requestProgressConsumers.add(Objects.requireNonNull(requestProgressConsumer));
53 public WithUri fromDirectory(File directory) {
54 this.directory.set(Objects.requireNonNull(directory).getPath());
58 public Executable<Optional<Key>> uri(String uri) {
59 this.uri.set(Objects.requireNonNull(uri));
60 return () -> threadPool.submit(this::execute);
63 private Optional<Key> execute() throws IOException, ExecutionException, InterruptedException {
64 ClientPutDiskDir clientPutDiskDir = new ClientPutDiskDir(uri.get(), identifierGenerator.get(), directory.get());
65 if (!requestProgressConsumers.isEmpty()) {
66 clientPutDiskDir.setVerbosity(Verbosity.PROGRESS);
68 try (ClientPutDiskDirDialog clientPutDiskDirDialog = new ClientPutDiskDirDialog()) {
69 return clientPutDiskDirDialog.send(clientPutDiskDir).get();
73 private class ClientPutDiskDirDialog extends FcpDialog<Optional<Key>> {
75 public ClientPutDiskDirDialog() throws IOException {
76 super(threadPool, connectionSupplier.get(), Optional.<Key>empty());
80 protected void consumePutSuccessful(PutSuccessful putSuccessful) {
81 setResult(Optional.of(new Key(putSuccessful.getURI())));
85 protected void consumeSimpleProgress(SimpleProgress simpleProgress) {
86 RequestProgress requestProgress = new RequestProgress(
87 simpleProgress.getTotal(),
88 simpleProgress.getRequired(),
89 simpleProgress.getFailed(),
90 simpleProgress.getFatallyFailed(),
91 simpleProgress.getLastProgress(),
92 simpleProgress.getSucceeded(),
93 simpleProgress.isFinalizedTotal(),
94 simpleProgress.getMinSuccessFetchBlocks()
96 requestProgressConsumers.stream().forEach(consumer -> consumer.accept(requestProgress));
100 protected void consumeProtocolError(ProtocolError protocolError) {