package org.nutz.mvc.upload.speed; import java.io.PrintStream; import javax.servlet.http.HttpSession; import org.nutz.lang.Lang; import org.nutz.mvc.upload.UploadInfo; import org.nutz.trans.Atom; public class UploadMonitor implements Atom { private HttpSession session; private PrintStream out; private long interval; private Object lock; private boolean done; public UploadMonitor(Object lock, HttpSession session, PrintStream out, long interval) { this.lock = lock; this.session = session; this.out = out; this.interval = interval; } public UploadMonitor stop() { done = true; synchronized (lock) { lock.notifyAll(); } return this; } public void run() { while (!done) { try { UploadInfo info = (UploadInfo) session.getAttribute(UploadInfo.SESSION_NAME); if (null == info) { out.print('.'); synchronized (lock) { lock.wait(interval); } continue; } out.printf( "\n > %6s%% : %10d / %d", (info.current / (info.sum / 100)), info.current, info.sum); synchronized (lock) { lock.wait(interval); } } catch (InterruptedException e) { throw Lang.wrapThrow(e); } } out.printf("\n > %6s%%\n", 100); } }