...
private void requestProgressUpdate()
{
if (DEBUG)
{
Log.log(Duration.currentTimeMillis()/1000 + " requestProgressUpdate");
}
RequestBuilder builder = new RequestBuilder(GET, FILE_UPLOAD_SERVLET);
try
{
builder.sendRequest(null, new RequestCallback()
{
@Override
public void onResponseReceived(Request p_request,
Response p_response)
{
m_progress.setVisible(true);
if (p_response.getStatusCode() == Response.SC_OK)
{
String text = p_response.getText();
if (DEBUG)
m_status.setHTML(text);
if (m_progressUpdateTimer != null && text.length() > 0)
updateProgress(text);
if (DEBUG)
{
Log.log(Duration.currentTimeMillis()/1000
+ " onResponseReceived " + text + " (OK)");
}
}
else
{
String text = p_response.getStatusText();
m_status.setHTML(text);
if (DEBUG)
{
Log.log(Duration.currentTimeMillis()/1000
+ " onResponseReceived " + text + " ("+p_response.getStatusCode()+")");
}
}
if (m_progressUpdateTimer != null && isAttached())
m_progressUpdateTimer.schedule(PROGRESS_UPDATE_MSEC);
}
@Override
public void onError(Request p_request, Throwable p_e)
{
m_progress.setVisible(true);
m_status.setText(p_e.getMessage());
if (m_progressUpdateTimer != null && isAttached())
m_progressUpdateTimer.schedule(PROGRESS_UPDATE_MSEC);
if (DEBUG)
{
Log.log(Duration.currentTimeMillis()/1000
+ " onError " + p_e.getMessage());
}
}
});
}
catch (RequestException e)
{
m_progress.setVisible(true);
m_status.setText(e.getMessage());
if (DEBUG)
{
Log.log(Duration.currentTimeMillis()/1000
+ " RequestException " + e.getMessage());
}
}
}
private void updateProgress(String p_text)
{
try
{
Document xml = XMLParser.parse(p_text);
Integer item = intValue(xml, "item");
if (item == null)
{
m_progress.setItem(null);
}
else
{
// form item 1 is the id, items 2+ are the files.
String filename = null;
if (item > 1 && item - 2 < m_uploadFilelist.size())
filename = m_uploadFilelist.get(item - 2);
m_progress.setItem(filename);
}
Integer percent_complete = intValue(xml, "percent_complete");
if (percent_complete != null)
{
m_progress.setProgress(percent_complete.doubleValue());
}
if (DEBUG)
{
Integer bytes_read = intValue(xml, "bytes_read");
Integer content_length = intValue(xml, "content_length");
String progress = "Uploaded " + bytes_read + " of "
+ content_length + ": " + percent_complete + "%";
m_status.setText(progress);
}
}
catch (Exception e)
{
m_status.setText(e.getMessage());
if (DEBUG)
{
Log.log(Duration.currentTimeMillis()/1000
+ " updateProgress " + e.getMessage());
}
}
}
private Integer intValue(Document p_xml, String p_tagname)
{
try
{
NodeList list = p_xml.getElementsByTagName(p_tagname);
if (list.getLength() > 0)
{
Node node = list.item(0);
list = node.getChildNodes();
node = list.item(0);
String value = node.getNodeValue();
if (value != null)
return Integer.valueOf(value);
}
}
catch (Exception e)
{
m_status.setText(e.getMessage());
}
return null;
}
private static class UploadProgressBar extends ProgressBar
{
private String m_item;
public UploadProgressBar()
{
super();
}
public void setItem(String p_item)
{
m_item = p_item;
}
@Override
protected String generateText(double curProgress)
{
if (m_item == null)
return (int)(100 * getPercent()) + "%";
else
return m_item + " " + (int)(100 * getPercent()) + "%";
}
}
@Override
protected void doGet(HttpServletRequest p_request,
HttpServletResponse p_response)
throws ServletException, IOException
{
if (DEBUG)
System.err.println("\n" + System.nanoTime() + " doGet request "
+ p_request.getContentType() + " " + p_request.getServletPath());
HttpSession session = p_request.getSession();
if (session == null)
return;
FileUploadProgress progress =
(FileUploadProgress)session.getAttribute("progress");
if (progress == null)
return;
long bytesRead = progress.getBytesRead();
long contentLength = progress.getContentLength();
int item = progress.getItem();
p_response.setContentType("text/xml");
StringBuffer buffer = new StringBuffer();
buffer.append("<?xml version=\"1.0\"?>\n");
buffer.append("<response>\n");
buffer.append("\t<item>").append(item)
.append("</item>\n");
buffer.append("\t<bytes_read>").append(bytesRead)
.append("</bytes_read>\n");
buffer.append("\t<content_length>").append(contentLength)
.append("</content_length>\n");
long percentComplete;
if (bytesRead < contentLength && contentLength != 0)
{
percentComplete = ((100 * bytesRead) / contentLength);
}
else
{
percentComplete = 100;
session.setAttribute("progress", null);
}
buffer.append("\t<percent_complete>").append(percentComplete)
.append("</percent_complete>\n");
buffer.append("</response>\n");
PrintWriter out = p_response.getWriter();
out.println(buffer.toString());
out.flush();
out.close();
}
import org.apache.commons.fileupload.ProgressListener;
public class FileUploadProgress implements ProgressListener
{
private volatile long m_bytesRead;
private volatile long m_contentLength;
private volatile int m_item;
public FileUploadProgress()
{
super();
}
@Override
public void update(long p_bytesRead, long p_contentLength, int p_item)
{
m_bytesRead = p_bytesRead;
m_contentLength = p_contentLength;
m_item = p_item;
}
public long getBytesRead()
{
return m_bytesRead;
}
public long getContentLength()
{
return m_contentLength;
}
public int getItem()
{
return m_item;
}
}