1 package net.pterodactylus.fcp.quelaton;
4 import java.io.IOException;
5 import java.util.Objects;
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.ClientPutDiskDir;
13 import net.pterodactylus.fcp.Key;
14 import net.pterodactylus.fcp.ProtocolError;
15 import net.pterodactylus.fcp.PutSuccessful;
17 import com.google.common.util.concurrent.ListeningExecutorService;
18 import com.google.common.util.concurrent.MoreExecutors;
21 * Default {@link ClientPutDiskDirCommand} implemented based on {@link FcpDialog}.
23 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
25 public class ClientPutDiskDirCommandImpl implements ClientPutDiskDirCommand {
27 private final ListeningExecutorService threadPool;
28 private final ConnectionSupplier connectionSupplier;
29 private final Supplier<String> identifierGenerator;
30 private final AtomicReference<String> directory = new AtomicReference<>();
31 private final AtomicReference<String> uri = new AtomicReference<>();
33 public ClientPutDiskDirCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier<String> identifierGenerator) {
34 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
35 this.connectionSupplier = connectionSupplier;
36 this.identifierGenerator = identifierGenerator;
40 public WithUri fromDirectory(File directory) {
41 this.directory.set(Objects.requireNonNull(directory).getPath());
45 public Executable<Optional<Key>> uri(String uri) {
46 this.uri.set(Objects.requireNonNull(uri));
47 return () -> threadPool.submit(this::execute);
50 private Optional<Key> execute() throws IOException, ExecutionException, InterruptedException {
51 ClientPutDiskDir clientPutDiskDir = new ClientPutDiskDir(uri.get(), identifierGenerator.get(), directory.get());
52 try (ClientPutDiskDirDialog clientPutDiskDirDialog = new ClientPutDiskDirDialog()) {
53 return clientPutDiskDirDialog.send(clientPutDiskDir).get();
57 private class ClientPutDiskDirDialog extends FcpDialog<Optional<Key>> {
59 public ClientPutDiskDirDialog() throws IOException {
60 super(threadPool, connectionSupplier.get(), Optional.<Key>empty());
64 protected void consumePutSuccessful(PutSuccessful putSuccessful) {
65 setResult(Optional.of(new Key(putSuccessful.getURI())));
69 protected void consumeProtocolError(ProtocolError protocolError) {