diff --git a/src/main/java/fr/rakambda/mediaconverter/Main.java b/src/main/java/fr/rakambda/mediaconverter/Main.java index 1520845..ede68fd 100644 --- a/src/main/java/fr/rakambda/mediaconverter/Main.java +++ b/src/main/java/fr/rakambda/mediaconverter/Main.java @@ -13,6 +13,7 @@ import fr.rakambda.mediaconverter.progress.ConversionProgressExecutor; import fr.rakambda.mediaconverter.progress.ConverterProgressBarGenerator; import fr.rakambda.mediaconverter.progress.ProgressBarSupplier; +import fr.rakambda.mediaconverter.progress.ReuseProgressBarSupplier; import fr.rakambda.mediaconverter.utils.CLIParameters; import lombok.extern.log4j.Log4j2; import me.tongfei.progressbar.ProgressBar; @@ -64,7 +65,7 @@ public static void main(String[] args){ var progressBarGenerator = new ConverterProgressBarGenerator(); try(var converterExecutor = ConversionProgressExecutor.of(Executors.newFixedThreadPool(parameters.getThreadCount())); var scanningProgressBar = new ProgressBarBuilder().setTaskName("Scanning").setUnit("File", 1).build(); - var converterProgressBarSupplier = new ProgressBarSupplier(progressBarGenerator)){ + var converterProgressBarSupplier = new ReuseProgressBarSupplier(progressBarGenerator)){ tempPaths = new ArrayList<>(Configuration.loadConfiguration(parameters.getConfiguration()) .stream() .flatMap(config -> config.getConversions().stream()) diff --git a/src/main/java/fr/rakambda/mediaconverter/progress/CreateProgressBarSupplier.java b/src/main/java/fr/rakambda/mediaconverter/progress/CreateProgressBarSupplier.java new file mode 100644 index 0000000..e00d08d --- /dev/null +++ b/src/main/java/fr/rakambda/mediaconverter/progress/CreateProgressBarSupplier.java @@ -0,0 +1,30 @@ +package fr.rakambda.mediaconverter.progress; + +import lombok.extern.slf4j.Slf4j; +import me.tongfei.progressbar.ProgressBar; +import org.jetbrains.annotations.NotNull; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +public class CreateProgressBarSupplier implements ProgressBarSupplier{ + private final ConverterProgressBarGenerator generator; + private final AtomicInteger counter; + + public CreateProgressBarSupplier(@NotNull ConverterProgressBarGenerator generator){ + this.generator = generator; + counter = new AtomicInteger(0); + } + + public void addBack(@NotNull ProgressBar progressBar){ + progressBar.close(); + } + + @Override + public void close(){ + } + + @NotNull + public ProgressBarHandle get(){ + return new ProgressBarHandle(generator.generate(counter.incrementAndGet()), this); + } +} diff --git a/src/main/java/fr/rakambda/mediaconverter/progress/ProgressBarSupplier.java b/src/main/java/fr/rakambda/mediaconverter/progress/ProgressBarSupplier.java index 78c0024..3c43b52 100644 --- a/src/main/java/fr/rakambda/mediaconverter/progress/ProgressBarSupplier.java +++ b/src/main/java/fr/rakambda/mediaconverter/progress/ProgressBarSupplier.java @@ -1,28 +1,11 @@ package fr.rakambda.mediaconverter.progress; -import lombok.extern.slf4j.Slf4j; import me.tongfei.progressbar.ProgressBar; -import java.util.concurrent.atomic.AtomicInteger; +import org.jetbrains.annotations.NotNull; -@Slf4j -public class ProgressBarSupplier implements AutoCloseable{ - private final ConverterProgressBarGenerator generator; - private final AtomicInteger counter; +public interface ProgressBarSupplier extends AutoCloseable{ + void addBack(@NotNull ProgressBar progressBar); - public ProgressBarSupplier(ConverterProgressBarGenerator generator) { - this.generator = generator; - counter = new AtomicInteger(0); - } - - public void addBack(ProgressBar progressBar){ - progressBar.close(); - } - - @Override - public void close(){ - } - - public ProgressBarHandle get(){ - return new ProgressBarHandle(generator.generate(counter.incrementAndGet()), this); - } + @NotNull + ProgressBarHandle get(); } diff --git a/src/main/java/fr/rakambda/mediaconverter/progress/ReuseProgressBarSupplier.java b/src/main/java/fr/rakambda/mediaconverter/progress/ReuseProgressBarSupplier.java new file mode 100644 index 0000000..54ed503 --- /dev/null +++ b/src/main/java/fr/rakambda/mediaconverter/progress/ReuseProgressBarSupplier.java @@ -0,0 +1,45 @@ + +package fr.rakambda.mediaconverter.progress; + +import lombok.extern.slf4j.Slf4j; +import me.tongfei.progressbar.ProgressBar; +import org.jetbrains.annotations.NotNull; +import java.util.Optional; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +public class ReuseProgressBarSupplier implements ProgressBarSupplier{ + private final ConverterProgressBarGenerator generator; + private final AtomicInteger counter; + private final Queue queue; + + public ReuseProgressBarSupplier(@NotNull ConverterProgressBarGenerator generator){ + this.generator = generator; + this.counter = new AtomicInteger(0); + this.queue = new ConcurrentLinkedQueue<>(); + } + + public void addBack(@NotNull ProgressBar progressBar){ + queue.offer(progressBar + .setExtraMessage("") + .maxHint(-1) + .reset() + .pause()); + } + + @Override + public void close(){ + queue.forEach(ProgressBar::close); + queue.clear(); + } + + @NotNull + public ProgressBarHandle get(){ + var progressBar = Optional.ofNullable(queue.poll()) + .orElseGet(() -> generator.generate(counter.incrementAndGet())) + .resume(); + return new ProgressBarHandle(progressBar, this); + } +}