Add progress consumer to ClientPut command
[jFCPlib.git] / src / main / java / net / pterodactylus / fcp / quelaton / ClientPutCommandImpl.java
index 982fd76..8dbaf0f 100644 (file)
@@ -21,12 +21,15 @@ import net.pterodactylus.fcp.Key;
 import net.pterodactylus.fcp.ProtocolError;
 import net.pterodactylus.fcp.PutFailed;
 import net.pterodactylus.fcp.PutSuccessful;
+import net.pterodactylus.fcp.RequestProgress;
+import net.pterodactylus.fcp.SimpleProgress;
 import net.pterodactylus.fcp.TestDDAComplete;
 import net.pterodactylus.fcp.TestDDAReply;
 import net.pterodactylus.fcp.TestDDARequest;
 import net.pterodactylus.fcp.TestDDAResponse;
 import net.pterodactylus.fcp.URIGenerated;
 import net.pterodactylus.fcp.UploadFrom;
+import net.pterodactylus.fcp.Verbosity;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
@@ -47,6 +50,7 @@ class ClientPutCommandImpl implements ClientPutCommand {
        private final AtomicReference<InputStream> payload = new AtomicReference<>();
        private final AtomicLong length = new AtomicLong();
        private final AtomicReference<String> targetFilename = new AtomicReference<>();
+       private final List<Consumer<RequestProgress>> requestProgressConsumers = new CopyOnWriteArrayList<>();
        private final List<Consumer<String>> keyGenerateds = new CopyOnWriteArrayList<>();
 
        public ClientPutCommandImpl(ExecutorService threadPool, ConnectionSupplier connectionSupplier, Supplier<String> identifierGenerator) {
@@ -56,6 +60,12 @@ class ClientPutCommandImpl implements ClientPutCommand {
        }
 
        @Override
+       public ClientPutCommand onProgress(Consumer<RequestProgress> requestProgressConsumer) {
+               requestProgressConsumers.add(Objects.requireNonNull(requestProgressConsumer));
+               return this;
+       }
+
+       @Override
        public ClientPutCommand onKeyGenerated(Consumer<String> keyGenerated) {
                keyGenerateds.add(keyGenerated);
                return this;
@@ -113,6 +123,9 @@ class ClientPutCommandImpl implements ClientPutCommand {
                if (targetFilename.get() != null) {
                        clientPut.setTargetFilename(targetFilename.get());
                }
+               if (!requestProgressConsumers.isEmpty()) {
+                       clientPut.setVerbosity(Verbosity.PROGRESS);
+               }
                return clientPut;
        }
 
@@ -155,6 +168,21 @@ class ClientPutCommandImpl implements ClientPutCommand {
                }
 
                @Override
+               protected void consumeSimpleProgress(SimpleProgress simpleProgress) {
+                       RequestProgress requestProgress = new RequestProgress(
+                               simpleProgress.getTotal(),
+                               simpleProgress.getRequired(),
+                               simpleProgress.getFailed(),
+                               simpleProgress.getFatallyFailed(),
+                               simpleProgress.getLastProgress(),
+                               simpleProgress.getSucceeded(),
+                               simpleProgress.isFinalizedTotal(),
+                               simpleProgress.getMinSuccessFetchBlocks()
+                       );
+                       requestProgressConsumers.stream().forEach(consumer -> consumer.accept(requestProgress));
+               }
+
+               @Override
                protected void consumeURIGenerated(URIGenerated uriGenerated) {
                        for (Consumer<String> keyGenerated : keyGenerateds) {
                                keyGenerated.accept(uriGenerated.getURI());