Add basic ClientPutDiskDir command implementation
[jFCPlib.git] / src / main / java / net / pterodactylus / fcp / quelaton / ClientPutDiskDirCommandImpl.java
1 package net.pterodactylus.fcp.quelaton;
2
3 import java.io.File;
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;
11
12 import net.pterodactylus.fcp.ClientPutDiskDir;
13 import net.pterodactylus.fcp.Key;
14 import net.pterodactylus.fcp.PutSuccessful;
15
16 import com.google.common.util.concurrent.ListeningExecutorService;
17 import com.google.common.util.concurrent.MoreExecutors;
18
19 /**
20  * Default {@link ClientPutDiskDirCommand} implemented based on {@link FcpDialog}.
21  *
22  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
23  */
24 public class ClientPutDiskDirCommandImpl implements ClientPutDiskDirCommand {
25
26         private final ListeningExecutorService threadPool;
27         private final ConnectionSupplier connectionSupplier;
28         private final Supplier<String> identifierGenerator;
29         private final AtomicReference<String> directory = new AtomicReference<>();
30         private final AtomicReference<String> uri = new AtomicReference<>();
31
32         public ClientPutDiskDirCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier<String> identifierGenerator) {
33                 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
34                 this.connectionSupplier = connectionSupplier;
35                 this.identifierGenerator = identifierGenerator;
36         }
37
38         @Override
39         public WithUri fromDirectory(File directory) {
40                 this.directory.set(Objects.requireNonNull(directory).getPath());
41                 return this::uri;
42         }
43
44         public Executable<Optional<Key>> uri(String uri) {
45                 this.uri.set(Objects.requireNonNull(uri));
46                 return () -> threadPool.submit(this::execute);
47         }
48
49         private Optional<Key> execute() throws IOException, ExecutionException, InterruptedException {
50                 ClientPutDiskDir clientPutDiskDir = new ClientPutDiskDir(uri.get(), identifierGenerator.get(), directory.get());
51                 try (ClientPutDiskDirDialog clientPutDiskDirDialog = new ClientPutDiskDirDialog()) {
52                         return clientPutDiskDirDialog.send(clientPutDiskDir).get();
53                 }
54         }
55
56         private class ClientPutDiskDirDialog extends FcpDialog<Optional<Key>> {
57
58                 public ClientPutDiskDirDialog() throws IOException {
59                         super(threadPool, connectionSupplier.get(), Optional.<Key>empty());
60                 }
61
62                 @Override
63                 protected void consumePutSuccessful(PutSuccessful putSuccessful) {
64                         setResult(Optional.of(new Key(putSuccessful.getURI())));
65                 }
66
67         }
68
69 }