diff options
| author | 2026-03-09 12:59:56 +0100 | |
|---|---|---|
| committer | 2026-07-09 09:59:28 +0200 | |
| commit | 699afc9450e7b083ecc0002b5493e6cd0e39b250 (patch) | |
| tree | 0cf4f8640c89ea72e402f83f3b355c8583c07287 | |
| parent | 36b2e832b6c992a53abe988c680a94f5919b2fba (diff) | |
Refactored printing of progress bars to be able to handle adding of more
hosts during time
| -rw-r--r-- | src/main/java/com/it_jaros/networkScanner/ProgressBar.java | 32 | ||||
| -rw-r--r-- | src/main/java/com/it_jaros/networkScanner/Scanner.java | 9 |
2 files changed, 28 insertions, 13 deletions
diff --git a/src/main/java/com/it_jaros/networkScanner/ProgressBar.java b/src/main/java/com/it_jaros/networkScanner/ProgressBar.java index 409668a..78920d4 100644 --- a/src/main/java/com/it_jaros/networkScanner/ProgressBar.java +++ b/src/main/java/com/it_jaros/networkScanner/ProgressBar.java @@ -1,32 +1,48 @@ package com.it_jaros.networkScanner; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; public class ProgressBar { private ScheduledExecutorService ui = Executors.newSingleThreadScheduledExecutor(); private List<Progress> hosts; + private ReentrantLock lock = new ReentrantLock(); - public void start(List<Progress> hosts) { - this.hosts = hosts; + public void start() { + System.out.println("Progress:"); + this.hosts = new ArrayList<>(); // move cursor down depending on how many hosts have to be scanned - hosts.forEach((h) -> System.out.print("\n")); + System.out.print("\n"); ui.scheduleAtFixedRate(() -> { - drawProgress(); + lock.lock(); + drawProgress(false); + lock.unlock(); }, 1, 200, TimeUnit.MILLISECONDS); } - private void drawProgress() { - // clear bars by moving cursor up - System.out.print("\u001b[" + hosts.size() + "A"); + private void drawProgress(boolean last) { + // Make space for drawing of progress bars + //System.out.print("\u001b[" + hosts.size() + "B"); // paint a bar per host for (Progress progress : hosts) { drawBar(progress); } + + // move cursor up again + if (!last) + System.out.print("\u001b[" + hosts.size() + "A"); + } + + public void submit(Progress progress) { + lock.lock(); + hosts.add(progress); + lock.unlock(); } private void drawBar(Progress progress) { @@ -54,7 +70,7 @@ public class ProgressBar { try { ui.awaitTermination(10, TimeUnit.SECONDS); // we need to draw one last time for the 100% to appear - drawProgress(); + drawProgress(true); } catch (InterruptedException ignored) { } } diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java index 0aedb27..cfef136 100644 --- a/src/main/java/com/it_jaros/networkScanner/Scanner.java +++ b/src/main/java/com/it_jaros/networkScanner/Scanner.java @@ -18,13 +18,13 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.LockSupport; public class Scanner { - + private final Counter counter = new Counter(); private final ProgressBar progressBar = new ProgressBar(); private final Semaphore socketLimit; private final int timeoutInMillis; private final long delayInNanos; - + public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis) { this.timeoutInMillis = timeoutInMillis; this.delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis)); @@ -38,13 +38,12 @@ public class Scanner { public List<ScanResult> scanTargets(List<String> targets, String ports) { List<ScanResult> results = new ArrayList<>(); try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();) { - List<Progress> progresses = new ArrayList<>(); + progressBar.start(); for (String target : targets) { ScanResult result = scanTargetPorts(target, ports, executor); results.add(result); - progresses.add(result.progress()); + progressBar.submit(result.progress()); } - progressBar.start(progresses); } progressBar.stop(); |
