package neembuu.uploader.uploaders.common; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.atomic.AtomicInteger; /** * This class overrides FileInputStream to calculate the progress value and set * it on a referenced AtomicInteger * * @author vigneshwaran * @author davidepastore */ public class MonitoredInputStream extends InputStream { private InputStream upperStream; private long totalSize=0; private long uploadedSize=0; private AtomicInteger jp = null; private int read; private int progressValue; /* Speed logic */ private StringBuffer speed; private long currentTimeMillis = System.currentTimeMillis(); private long byteCounter; public MonitoredInputStream(InputStream upperStream) { this(upperStream,Long.MAX_VALUE,null); } public MonitoredInputStream(InputStream upperStream, long totalSize) { this(upperStream,totalSize,null); } public MonitoredInputStream(InputStream upperStream, long totalSize, AtomicInteger jp) { this.upperStream = upperStream; this.totalSize = totalSize; this.jp = jp; } public MonitoredInputStream(InputStream upperStream, long totalSize, AtomicInteger jp, StringBuffer speed) { this.upperStream = upperStream; this.totalSize = totalSize; this.jp = jp; this.speed = speed; } @Override public int read() throws IOException { // NULogger.getLogger().info("simple read"); return upperStream.read(); } @Override public int read(byte[]b) throws IOException { read = upperStream.read(b); if (read == -1) return -1; uploadedSize += read; progressValue = (int)((float)((uploadedSize*100)/totalSize)); jp.set(progressValue); addToSpeed(read); // NULogger.getLogger().info("byte read: " + read); // NULogger.getLogger().info("uploaded size: "+ uploadedSize); // NULogger.getLogger().info("Total size: "+ totalSize); // NULogger.getLogger().info("progress value: "+ progressValue); return read; } @Override public int read(byte[] b, int off, int len) throws IOException { read = upperStream.read(b, off, len); if (read == -1) return -1; uploadedSize += read; progressValue = (int)((float)((uploadedSize*100)/totalSize)); jp.set(progressValue); addToSpeed(read); // NULogger.getLogger().info("off read: " + progressValue); return read; } @Override public void close() throws IOException { upperStream.close(); super.close(); } /** * Add a val to the speed of the upload. * @param val the value to add to speed. */ private void addToSpeed(int val) { if(speed != null){ //Reset the byteCounter and set the new speed value if(currentTimeMillis + 1000 < System.currentTimeMillis()){ speed.setLength(0); //Reset the value speed.append(CommonUploaderTasks.getSpeed(byteCounter)); // NULogger.getLogger().log(Level.INFO, "Byte Counter: {0}", byteCounter); currentTimeMillis = System.currentTimeMillis(); byteCounter = 0; } byteCounter+=val; } } }