diff --git a/project.properties b/project.properties index 38a9df8..d054050 100644 --- a/project.properties +++ b/project.properties @@ -1,6 +1,6 @@ -#Fri, 21 Jan 2011 13:58:02 -0600 +#Tue, 25 Jan 2011 09:33:59 -0600 name=jdb-util -version=1.1 +version=1.2 lib.local=true -build.number=1 +build.number=3 diff --git a/src/main/com/jdbernard/util/ConsoleProgressBar.groovy b/src/main/com/jdbernard/util/ConsoleProgressBar.groovy new file mode 100644 index 0000000..f5ea1c1 --- /dev/null +++ b/src/main/com/jdbernard/util/ConsoleProgressBar.groovy @@ -0,0 +1,62 @@ +package com.jdbernard.util + +/** + * Controls a console-based progress bar. + * This bar has two totals, an overall process total and an individual file + * total. The overall total is 0-based, b/c the current value is incomplete + * (the file counter is the partial completion of the current step). The file + * counter is 1-based because the current step is complete for this counter. + * @author Jonathan Bernard (jonathan.bernard@gemalto.com) + */ +class ConsoleProgressBar { + int MAX_STEP = 30 + + int max = 10 + def out = System.out + private int lastStepAmount = -1 + private String lastLinePrinted = "" + private String lastInfo = "" + private long startTime + + void update(int value, String info) { + if (value == 0) startTime = System.currentTimeMillis() + + def curStep + def curPercent + def curTime + def remTime + + value = Math.min(value, max) + + curStep = Math.floor((value/max) * MAX_STEP) + curPercent = ((double) value / (double) max) + + if (info != lastInfo || curStep != lastStepAmount) { + // time so far + curTime = System.currentTimeMillis() - startTime + // estimate total time based on how far we are + remTime = (curTime / curPercent) - curTime + remTime /= 1000 + + def numEq = Math.max(curStep - 1, 0) + def remMin = curPercent < 0.05 ? '?' : (int) (remTime / 60) + def remSec = curPercent < 0.05 ? '?' : (int) (((remTime / 60.0) - remMin) * 60) + + out.print '\b' * lastLinePrinted.length() + lastLinePrinted = '=' * numEq + (curStep > 0 ? "0" : "") + '-' * (MAX_STEP - curStep) + lastLinePrinted += " ${info.padRight(16)} -- (" + + "${String.format('%5.2f', curPercent * 100)}%, ${remMin ? remMin + 'm ' : ''}${remSec}s) " + out.print lastLinePrinted + lastStepAmount = curStep; + lastInfo = info + } + out.flush() + } + + void erase() { + out.print '\b' * lastLinePrinted.length() + out.print ' ' * lastLinePrinted.length() + out.print '\b' * lastLinePrinted.length() + lastLinePrinted = "" + } +}