me.tongfei.progressbar.ProgressBar Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of act Show documentation
Show all versions of act Show documentation
The ACT full stack MVC framework
package me.tongfei.progressbar;
/*-
* #%L
* TongFei ProgressBar
* %%
* Copyright (C) 2014 - 2018 Tongfei Chen
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import me.tongfei.progressbar.wrapped.ProgressBarWrappedIterable;
import me.tongfei.progressbar.wrapped.ProgressBarWrappedIterator;
import org.joda.time.LocalDateTime;
import java.io.PrintStream;
import java.util.Iterator;
/**
* A simple console-based progress bar.
* @author Tongfei Chen
*/
public class ProgressBar {
private ProgressState progress;
private ProgressThread target;
private Thread thread;
/**
* Creates a progress bar with the specific task name and initial maximum value.
* @param task Task name
* @param initialMax Initial maximum value
*/
public ProgressBar(String task, long initialMax) {
this(task, initialMax, 1000, System.err, ProgressBarStyle.UNICODE_BLOCK);
}
public ProgressBar(String task, long initialMax, ProgressBarStyle style) {
this(task, initialMax, 1000, System.err, style);
}
public ProgressBar(String task, long initialMax, int updateIntervalMillis) {
this(task, initialMax, updateIntervalMillis, System.err, ProgressBarStyle.UNICODE_BLOCK);
}
/**
* Creates a progress bar with the specific task name, initial maximum value,
* customized update interval (default 1000 ms), the PrintStream to be used, and output style.
* @param task Task name
* @param initialMax Initial maximum value
* @param updateIntervalMillis Update interval (default value 1000 ms)
* @param os Print stream (default value System.err)
* @param style Output style (default value ProgresBarStyle.UNICODE_BLOCK)
*/
public ProgressBar(String task, long initialMax, int updateIntervalMillis, PrintStream os, ProgressBarStyle style) {
this.progress = new ProgressState(task, initialMax);
this.target = new ProgressThread(progress, style, updateIntervalMillis, os);
this.thread = new Thread(target);
}
/**
* Starts this progress bar.
*/
public ProgressBar start() {
progress.startTime = LocalDateTime.now();
thread.start();
return this;
}
/**
* Advances this progress bar by a specific amount.
* @param n Step size
*/
public ProgressBar stepBy(long n) {
progress.stepBy(n);
return this;
}
/**
* Advances this progress bar to the specific progress value.
* @param n New progress value
*/
public ProgressBar stepTo(long n) {
progress.stepTo(n);
return this;
}
/**
* Advances this progress bar by one step.
*/
public ProgressBar step() {
progress.stepBy(1);
return this;
}
/**
* Gives a hint to the maximum value of the progress bar.
* @param n Hint of the maximum value
*/
public ProgressBar maxHint(long n) {
if (n < 0)
progress.setAsIndefinite();
else {
progress.setAsDefinite();
progress.maxHint(n);
}
return this;
}
/**
* Stops this progress bar.
*/
public ProgressBar stop() {
target.kill();
try {
thread.join();
target.consoleStream.print("\n");
target.consoleStream.flush();
}
catch (InterruptedException ex) { }
return this;
}
/**
* Sets the extra message at the end of the progress bar.
* @param msg New message
*/
public ProgressBar setExtraMessage(String msg) {
progress.setExtraMessage(msg);
return this;
}
/**
* Returns the current progress.
*/
public long getCurrent() {
return progress.getCurrent();
}
/**
* Returns the maximum value of this progress bar.
*/
public long getMax() {
return progress.getMax();
}
/**
* Returns the name of this task.
*/
public String getTask() {
return progress.getTask();
}
/**
* Returns the extra message at the end of the progress bar.
*/
public String getExtraMessage() {
return progress.getExtraMessage();
}
/**
* Wraps an iterator so that when iterated, a progress bar is shown to track the traversal progress.
* @param it Underlying iterator
* @param task Task name
*/
public static Iterator wrap(Iterator it, String task) {
return new ProgressBarWrappedIterator<>(it, task, -1); // indefinite progress bar
}
/**
* Wraps an iterable so that when iterated, a progress bar is shown to track the traversal progress.
*
* Sample usage: {@code
* for (T x : ProgressBar.wrap(collection, "Traversal")) { ... }
* }
*
* @param ts Underlying iterable
* @param task Task name
*/
public static Iterable wrap(Iterable ts, String task) {
return new ProgressBarWrappedIterable<>(ts, task);
}
}