diff options
Diffstat (limited to 'src/main/java/com/it_jaros/jscanner/ProgressBar.java')
| -rw-r--r-- | src/main/java/com/it_jaros/jscanner/ProgressBar.java | 75 |
1 files changed, 50 insertions, 25 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/ProgressBar.java b/src/main/java/com/it_jaros/jscanner/ProgressBar.java index 6360895..62bb2c1 100644 --- a/src/main/java/com/it_jaros/jscanner/ProgressBar.java +++ b/src/main/java/com/it_jaros/jscanner/ProgressBar.java @@ -16,7 +16,6 @@ public class ProgressBar { private final ScheduledExecutorService ui = Executors.newSingleThreadScheduledExecutor(); private final Scan scan; private final boolean quiet; - private final int columnWidth = ProgressBar.getColumnWidth(); private final Object outputLock = new Object(); public ProgressBar(Scan scan, boolean quiet) { @@ -125,7 +124,7 @@ public class ProgressBar { System.err.print("Scanning targets...\n\n"); ui.scheduleAtFixedRate(() -> { synchronized (outputLock) { - printStatusLine(scan); + printStatusLine(); } }, 1, 1000, TimeUnit.MILLISECONDS); } @@ -166,42 +165,68 @@ public class ProgressBar { return String.format("%ds", seconds); } - private void printStatusLine(final Scan scan) { - this.printStatusLine(scan.getHostCounter(), scan.getHostTotalCounter(), scan.getSocketCounter(), scan.getThreadCounter()); - } - private void printStatusLine( - Counter hostCounter, Counter hostTotalCounter, Counter - socketCounter, Counter - threadCounter) { + private void printStatusLine() { long duration = scan.getDurationMillis(); - int total = hostTotalCounter.current(); - int running = hostCounter.current(); + int total = scan.getHostTotalCounter().current(); + int running = scan.getHostCounter().current(); int done = total - running; long percent = total == 0 ? 100 : done * 100L / total; - String line = String.format( - "hosts: %d running, %d done | %s | sockets: %d active, %d peak | workers: %d active, %d peak", + String hostStat = String.format( + "hosts: %d running, %d done", running, - done, - formatDuration(duration), - socketCounter.current(), - socketCounter.max(), - threadCounter.current(), - threadCounter.max() + done + ); + String durationStat = String.format( + " | %s", + formatDuration(duration) + ); + String socketStat = String.format( + " | sockets: %d active, %d peak", + scan.getSocketCounter().current(), + scan.getSocketCounter().max() + ); + String workerStat = String.format( + " | workers: %d active, %d peak", + scan.getThreadCounter().current(), + scan.getThreadCounter().max() ); - String barFormat = " | [%s] %3d%%"; - int barWidth = Math.max(5, ProgressBar.getColumnWidth() - line.length() - barFormat.length()); - String progressBar = progressBar(percent, barWidth); - String status = line + String.format(barFormat, progressBar, percent); - System.err.print("\r" + status); + int availableWidth = ProgressBar.getColumnWidth(); + String statusLine = appendIfEnoughSpace("", availableWidth, hostStat, durationStat, socketStat, workerStat); + + String barFormat = " [%s] %3d%%"; + int remainingWidth = availableWidth - statusLine.length() - barFormat.length(); + if (remainingWidth > 0) { + String progressBar = String.format( + barFormat, + progressBar(percent, remainingWidth), + percent + ); + statusLine = appendIfEnoughSpace(statusLine, availableWidth, progressBar); + } + System.err.print("\r" + statusLine); System.err.flush(); } + private String appendIfEnoughSpace(String current, int availableSize, String... additional) { + StringBuilder builder = new StringBuilder(current); + for (String add : additional) { + if ((builder.length() + add.length()) <= availableSize) { + builder.append(add); + } + } + + return builder.toString(); + } + private static String progressBar(long percent, int width) { - int filled = (int) (percent * width / 100); + if (width <= 0) { + return ""; + } + int filled = (int) (percent * width / 100); return "#".repeat(filled) + "-".repeat(width - filled); } } |
