import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.MemoryManagerMXBean;
+import java.util.jar.JarEntry;
+import sun.management.snmp.jvmmib.JVM_MANAGEMENT_MIB;
+
+import com.itmill.toolkit.data.Property.ValueChangeEvent;
import com.itmill.toolkit.terminal.StreamResource;
+import com.itmill.toolkit.ui.AbstractField;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.Label;
import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
import com.itmill.toolkit.ui.ProgressIndicator;
+import com.itmill.toolkit.ui.Select;
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.StartedListener;
import com.itmill.toolkit.ui.Upload.SucceededEvent;
import com.itmill.toolkit.ui.Upload.SucceededListener;
+import com.sun.jdi.VirtualMachine;
public class TestForUpload extends CustomComponent implements
Upload.FinishedListener, FailedListener,SucceededListener, Upload.ProgressListener, StartedListener {
Layout main = new OrderedLayout();
- Buffer buffer = new Buffer();
+ Buffer buffer = new MemooryBuffer();
Panel status = new Panel("Uploaded file:");
private ProgressIndicator pi = new ProgressIndicator();
+ private Label memoryStatus;
+
+ private Select uploadBufferSelector;
+
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."));
+ + "current state into label below it. Memory receiver "
+ + "streams upload contents into memory. You may track"
+ + "consumption."
+ + "tempfile receiver writes upload to file and "
+ + "should have low memory consumption."));
- main.addComponent(new Label("Clicking on button b updates information about upload components status."));
+ main.addComponent(new Label("Clicking on button b updates information about upload components status or same with garbage collector."));
up = new Upload("Upload", buffer);
up.setImmediate(true);
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);
-
+ Button c = new Button("b with gc", this, "gc");
+ main.addComponent(b);
+ main.addComponent(c);
+
+ uploadBufferSelector = new Select("Receiver type");
+ uploadBufferSelector.setImmediate(true);
+ uploadBufferSelector.addItem("memory");
+ uploadBufferSelector.setValue("memory");
+ uploadBufferSelector.addItem("tempfile");
+ uploadBufferSelector.addListener(new AbstractField.ValueChangeListener() {
+ public void valueChange(ValueChangeEvent event) {
+ setBuffer();
+ }
+ });
+ main.addComponent(uploadBufferSelector);
main.addComponent(up);
l = new Label("Idle");
pi.setVisible(false);
pi.setPollingInterval(1000);
main.addComponent(pi);
+
+ memoryStatus = new Label();
+ main.addComponent(memoryStatus);
status.setVisible(false);
main.addComponent(status);
}
+
+ private void setBuffer() {
+ String id = (String) uploadBufferSelector.getValue();
+ if("memory".equals(id)) {
+ buffer = new MemooryBuffer();
+ } else if("tempfile".equals(id)) {
+ buffer = new TmpFileBuffer();
+ }
+ up.setReceiver(buffer);
+ }
+
+
+ public void gc() {
+ Runtime.getRuntime().gc();
+ readState();
+ }
public void readState() {
StringBuffer sb = new StringBuffer();
sb.append("Idle");
}
l.setValue(sb.toString());
+ refreshMemUsage();
}
public void uploadFinished(FinishedEvent event) {
status.removeAllComponents();
- if (buffer.getStream() == null)
+ InputStream stream = buffer.getStream();
+ if (stream == null)
status.addComponent(new Label(
"Upload finished, but output buffer is null!!"));
else {
status.setVisible(true);
}
}
+
+ public interface Buffer extends StreamResource.StreamSource, Upload.Receiver {
+
+ String getFileName();
+ }
- public class Buffer implements StreamResource.StreamSource, Upload.Receiver {
+ public class MemooryBuffer implements Buffer {
ByteArrayOutputStream outputBuffer = null;
String mimeType;
String fileName;
- public Buffer() {
+ public MemooryBuffer() {
}
}
}
+
+ public class TmpFileBuffer implements Buffer {
+ String mimeType;
+
+ String fileName;
+
+ private File file;
+
+ private FileInputStream stream;
+
+ public TmpFileBuffer() {
+ String tempFileName = "upload_tmpfile_" + System.currentTimeMillis();
+ try {
+ file = File.createTempFile(tempFileName,null);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+ public InputStream getStream() {
+ if (file == null)
+ return null;
+ try {
+ return new FileInputStream(file);
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * @see com.itmill.toolkit.ui.Upload.Receiver#receiveUpload(String,
+ * String)
+ */
+ public OutputStream receiveUpload(String filename, String MIMEType) {
+ fileName = filename;
+ mimeType = MIMEType;
+ try {
+ return new FileOutputStream(file);
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 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);
pi.setVisible(false);
l.setValue("Finished upload, idle");
System.out.println(event);
+ setBuffer();
}
public void updateProgress(long readBytes, long contentLenght) {
pi.setValue(new Float(readBytes/(float)contentLenght));
+
+ refreshMemUsage();
+ }
+
+ private void refreshMemUsage() {
+ StringBuffer mem = new StringBuffer();
+ MemoryMXBean mmBean = ManagementFactory.getMemoryMXBean();
+ mem.append("Heap (M):");
+ mem.append(mmBean.getHeapMemoryUsage().getUsed()/1048576);
+ mem.append(" |ÊNon-Heap (M):");
+ mem.append(mmBean.getNonHeapMemoryUsage().getUsed()/1048576);
+ memoryStatus.setValue(mem.toString());
}
public void uploadStarted(StartedEvent event) {