X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Ffcp%2Fquelaton%2FClientPutDiskDirCommandImpl.java;fp=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Ffcp%2Fquelaton%2FClientPutDiskDirCommandImpl.java;h=861522cbbf2114de16643d907827e2b78f8958b9;hb=8ff9728f5a6fd4dd1f541c0a8caa7f8fc7401b76;hp=0000000000000000000000000000000000000000;hpb=02ab574b5554f822f0b1899eac24c4229c83e263;p=jFCPlib.git diff --git a/src/main/java/net/pterodactylus/fcp/quelaton/ClientPutDiskDirCommandImpl.java b/src/main/java/net/pterodactylus/fcp/quelaton/ClientPutDiskDirCommandImpl.java new file mode 100644 index 0000000..861522c --- /dev/null +++ b/src/main/java/net/pterodactylus/fcp/quelaton/ClientPutDiskDirCommandImpl.java @@ -0,0 +1,69 @@ +package net.pterodactylus.fcp.quelaton; + +import java.io.File; +import java.io.IOException; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +import net.pterodactylus.fcp.ClientPutDiskDir; +import net.pterodactylus.fcp.Key; +import net.pterodactylus.fcp.PutSuccessful; + +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; + +/** + * Default {@link ClientPutDiskDirCommand} implemented based on {@link FcpDialog}. + * + * @author David ‘Bombe’ Roden + */ +public class ClientPutDiskDirCommandImpl implements ClientPutDiskDirCommand { + + private final ListeningExecutorService threadPool; + private final ConnectionSupplier connectionSupplier; + private final Supplier identifierGenerator; + private final AtomicReference directory = new AtomicReference<>(); + private final AtomicReference uri = new AtomicReference<>(); + + public ClientPutDiskDirCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier identifierGenerator) { + this.threadPool = MoreExecutors.listeningDecorator(threadPool); + this.connectionSupplier = connectionSupplier; + this.identifierGenerator = identifierGenerator; + } + + @Override + public WithUri fromDirectory(File directory) { + this.directory.set(Objects.requireNonNull(directory).getPath()); + return this::uri; + } + + public Executable> uri(String uri) { + this.uri.set(Objects.requireNonNull(uri)); + return () -> threadPool.submit(this::execute); + } + + private Optional execute() throws IOException, ExecutionException, InterruptedException { + ClientPutDiskDir clientPutDiskDir = new ClientPutDiskDir(uri.get(), identifierGenerator.get(), directory.get()); + try (ClientPutDiskDirDialog clientPutDiskDirDialog = new ClientPutDiskDirDialog()) { + return clientPutDiskDirDialog.send(clientPutDiskDir).get(); + } + } + + private class ClientPutDiskDirDialog extends FcpDialog> { + + public ClientPutDiskDirDialog() throws IOException { + super(threadPool, connectionSupplier.get(), Optional.empty()); + } + + @Override + protected void consumePutSuccessful(PutSuccessful putSuccessful) { + setResult(Optional.of(new Key(putSuccessful.getURI()))); + } + + } + +}