3a2192210111a7b8bcd3f3477084eac5e52c4ac2
[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.ProtocolError;
15 import net.pterodactylus.fcp.PutSuccessful;
16
17 import com.google.common.util.concurrent.ListeningExecutorService;
18 import com.google.common.util.concurrent.MoreExecutors;
19
20 /**
21  * Default {@link ClientPutDiskDirCommand} implemented based on {@link FcpDialog}.
22  *
23  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
24  */
25 public class ClientPutDiskDirCommandImpl implements ClientPutDiskDirCommand {
26
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<>();
32
33         public ClientPutDiskDirCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier<String> identifierGenerator) {
34                 this.threadPool = MoreExecutors.listeningDecorator(threadPool);
35                 this.connectionSupplier = connectionSupplier;
36                 this.identifierGenerator = identifierGenerator;
37         }
38
39         @Override
40         public WithUri fromDirectory(File directory) {
41                 this.directory.set(Objects.requireNonNull(directory).getPath());
42                 return this::uri;
43         }
44
45         public Executable<Optional<Key>> uri(String uri) {
46                 this.uri.set(Objects.requireNonNull(uri));
47                 return () -> threadPool.submit(this::execute);
48         }
49
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();
54                 }
55         }
56
57         private class ClientPutDiskDirDialog extends FcpDialog<Optional<Key>> {
58
59                 public ClientPutDiskDirDialog() throws IOException {
60                         super(threadPool, connectionSupplier.get(), Optional.<Key>empty());
61                 }
62
63                 @Override
64                 protected void consumePutSuccessful(PutSuccessful putSuccessful) {
65                         setResult(Optional.of(new Key(putSuccessful.getURI())));
66                 }
67
68                 @Override
69                 protected void consumeProtocolError(ProtocolError protocolError) {
70                         finish();
71                 }
72
73         }
74
75 }