Added ConsoleProgressBar.
This commit is contained in:
		@@ -1,6 +1,6 @@
 | 
				
			|||||||
#Fri, 21 Jan 2011 13:58:02 -0600
 | 
					#Tue, 25 Jan 2011 09:33:59 -0600
 | 
				
			||||||
name=jdb-util
 | 
					name=jdb-util
 | 
				
			||||||
version=1.1
 | 
					version=1.2
 | 
				
			||||||
lib.local=true
 | 
					lib.local=true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build.number=1
 | 
					build.number=3
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										62
									
								
								src/main/com/jdbernard/util/ConsoleProgressBar.groovy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/main/com/jdbernard/util/ConsoleProgressBar.groovy
									
									
									
									
									
										Normal file
									
								
							@@ -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 = ""
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user