97 lines
2.3 KiB
Java
97 lines
2.3 KiB
Java
|
package org.gcube.portlets.widgets.workspaceuploader.server.upload;
|
||
|
|
||
|
import java.io.FilterInputStream;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStream;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.List;
|
||
|
|
||
|
import org.apache.commons.fileupload.ProgressListener;
|
||
|
|
||
|
/**
|
||
|
* The Class UploadProgressInputStream.
|
||
|
*
|
||
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
||
|
* Sep 1, 2015
|
||
|
*/
|
||
|
public final class UploadProgressInputStream extends FilterInputStream {
|
||
|
|
||
|
private List<ProgressListener> listeners;
|
||
|
private long bytesRead = 0;
|
||
|
private long totalBytes = 0;
|
||
|
|
||
|
/**
|
||
|
* Instantiates a new upload progress input stream.
|
||
|
*
|
||
|
* @param in the in
|
||
|
* @param totalBytes the total bytes
|
||
|
*/
|
||
|
public UploadProgressInputStream(final InputStream in, final long totalBytes) {
|
||
|
super(in);
|
||
|
this.totalBytes = totalBytes;
|
||
|
listeners = new ArrayList<ProgressListener>();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds the listener.
|
||
|
*
|
||
|
* @param listener the listener
|
||
|
*/
|
||
|
public void addListener(final ProgressListener listener) {
|
||
|
listeners.add(listener);
|
||
|
}
|
||
|
|
||
|
/* (non-Javadoc)
|
||
|
* @see java.io.FilterInputStream#read()
|
||
|
*/
|
||
|
@Override
|
||
|
public int read() throws IOException {
|
||
|
int b = super.read();
|
||
|
this.bytesRead++;
|
||
|
updateListeners(bytesRead, totalBytes);
|
||
|
|
||
|
return b;
|
||
|
}
|
||
|
|
||
|
/* (non-Javadoc)
|
||
|
* @see java.io.FilterInputStream#read(byte[])
|
||
|
*/
|
||
|
@Override
|
||
|
public int read(final byte b[]) throws IOException {
|
||
|
return read(b, 0, b.length);
|
||
|
}
|
||
|
|
||
|
/* (non-Javadoc)
|
||
|
* @see java.io.FilterInputStream#read(byte[], int, int)
|
||
|
*/
|
||
|
@Override
|
||
|
public int read(final byte b[], final int off, final int len) throws IOException {
|
||
|
int bytesRead = in.read(b, off, len);
|
||
|
this.bytesRead = this.bytesRead + bytesRead;
|
||
|
updateListeners(this.bytesRead, totalBytes);
|
||
|
|
||
|
return bytesRead;
|
||
|
}
|
||
|
|
||
|
/* (non-Javadoc)
|
||
|
* @see java.io.FilterInputStream#close()
|
||
|
*/
|
||
|
@Override
|
||
|
public void close() throws IOException {
|
||
|
super.close();
|
||
|
updateListeners(totalBytes, totalBytes);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update listeners.
|
||
|
*
|
||
|
* @param bytesRead the bytes read
|
||
|
* @param totalBytes the total bytes
|
||
|
*/
|
||
|
private void updateListeners(final long bytesRead, final long totalBytes) {
|
||
|
|
||
|
for (ProgressListener listener : listeners)
|
||
|
listener.update(bytesRead, totalBytes, listeners.size());
|
||
|
}
|
||
|
}
|