package com.itmill.toolkit.tests;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import com.itmill.toolkit.terminal.StreamResource;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.Label;
import com.itmill.toolkit.ui.Layout;
import com.itmill.toolkit.ui.Link;
import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
import com.itmill.toolkit.ui.ProgressIndicator;
import com.itmill.toolkit.ui.Upload;
import com.itmill.toolkit.ui.Button.ClickEvent;
import com.itmill.toolkit.ui.Upload.FailedEvent;
import com.itmill.toolkit.ui.Upload.FailedListener;
import com.itmill.toolkit.ui.Upload.FinishedEvent;
import com.itmill.toolkit.ui.Upload.FinishedListener;
import com.itmill.toolkit.ui.Upload.StartedEvent;
import com.itmill.toolkit.ui.Upload.StartedListener;
import com.itmill.toolkit.ui.Upload.SucceededEvent;
import com.itmill.toolkit.ui.Upload.SucceededListener;
public class TestForUpload extends CustomComponent implements
Upload.FinishedListener, FailedListener,SucceededListener, Upload.ProgressListener, StartedListener {
Layout main = new OrderedLayout();
Buffer buffer = new Buffer();
Panel status = new Panel("Uploaded file:");
private Upload up;
private Label l;
private ProgressIndicator pi = new ProgressIndicator();
public TestForUpload() {
setCompositionRoot(main);
main.addComponent( new Label(
"This is a simple test for upload application. "
+ "Upload should work with big files and concurrent "
+ "requests should not be blocked. Button 'b' reads "
+ "current state into label below it. TODO make "
+ "streaming example/test where upload contents "
+ "is read but not saved and memory consumption is "
+ "verified low. TODO make test where contents is "
+ "written to disk and verifiy low memory consumption."));
main.addComponent(new Label("Clicking on button b updates information about upload components status."));
up = new Upload("Upload", buffer);
up.setImmediate(true);
up.addListener((FinishedListener)this);
up.addListener((FailedListener) this);
up.addListener((SucceededListener) this);
up.addListener((StartedListener) this);
up.setProgressListener(this);
Button b = new Button("b", this, "readState");
main.addComponent(b);
main.addComponent(up);
l = new Label("Idle");
main.addComponent(l);
pi.setVisible(false);
pi.setPollingInterval(1000);
main.addComponent(pi);
status.setVisible(false);
main.addComponent(status);
Button restart = new Button("R");
restart.addListener(new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
getApplication().close();
}
});
main.addComponent(restart);
}
public void readState() {
StringBuffer sb = new StringBuffer();
if (up.isUploading()) {
sb.append("Uploading...");
sb.append(up.getBytesRead());
sb.append("/");
sb.append(up.getUploadSize());
sb.append(" ");
sb.append(Math.round(100 * up.getBytesRead()
/ (double) up.getUploadSize()));
sb.append("%");
} else {
sb.append("Idle");
}
l.setValue(sb.toString());
}
public void uploadFinished(FinishedEvent event) {
status.removeAllComponents();
if (buffer.getStream() == null)
status.addComponent(new Label(
"Upload finished, but output buffer is null!!"));
else {
status
.addComponent(new Label("Name: "
+ event.getFilename(), Label.CONTENT_XHTML));
status.addComponent(new Label("Mimetype: "
+ event.getMIMEType(), Label.CONTENT_XHTML));
status.addComponent(new Label("Size: " + event.getLength()
+ " bytes.", Label.CONTENT_XHTML));
status.addComponent(new Link("Download " + buffer.getFileName(),
new StreamResource(buffer, buffer.getFileName(),
getApplication())));
status.setVisible(true);
}
}
public class Buffer implements StreamResource.StreamSource, Upload.Receiver {
ByteArrayOutputStream outputBuffer = null;
String mimeType;
String fileName;
public Buffer() {
}
public InputStream getStream() {
if (outputBuffer == null)
return null;
return new ByteArrayInputStream(outputBuffer.toByteArray());
}
/**
* @see com.itmill.toolkit.ui.Upload.Receiver#receiveUpload(String,
* String)
*/
public OutputStream receiveUpload(String filename, String MIMEType) {
fileName = filename;
mimeType = MIMEType;
outputBuffer = new ByteArrayOutputStream();
return outputBuffer;
}
/**
* Returns the fileName.
*
* @return String
*/
public String getFileName() {
return fileName;
}
/**
* Returns the mimeType.
*
* @return String
*/
public String getMimeType() {
return mimeType;
}
}
public void uploadFailed(FailedEvent event) {
System.out.println(event);
System.out.println(event.getSource());
}
public void uploadSucceeded(SucceededEvent event) {
pi.setVisible(false);
l.setValue("Finished upload, idle");
System.out.println(event);
}
public void updateProgress(long readBytes, long contentLenght) {
pi.setValue(new Float(readBytes/(float)contentLenght));
}
public void uploadStarted(StartedEvent event) {
pi.setVisible(true);
l.setValue("Started uploading file " + event.getFilename());
}
}