]> source.dussan.org Git - vaadin-framework.git/commitdiff
wrote temp file receiver to upload test should not get out of memory event with...
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Tue, 2 Oct 2007 13:16:26 +0000 (13:16 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Tue, 2 Oct 2007 13:16:26 +0000 (13:16 +0000)
svn changeset:2421/svn branch:trunk

src/com/itmill/toolkit/tests/TestForUpload.java

index a981ec2f8c1923f9ecd5975ac1d57a1457ff0d81..7ed0da8deaaaa2c297f54ba4b5ad66c07072db7f 100644 (file)
@@ -2,10 +2,23 @@ package com.itmill.toolkit.tests;
 
 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;
@@ -14,6 +27,7 @@ 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.Select;
 import com.itmill.toolkit.ui.Upload;
 import com.itmill.toolkit.ui.Button.ClickEvent;
 import com.itmill.toolkit.ui.Upload.FailedEvent;
@@ -24,13 +38,14 @@ 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;
+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:");
 
@@ -40,19 +55,23 @@ public class TestForUpload extends CustomComponent implements
        
        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);
@@ -60,15 +79,27 @@ public class TestForUpload extends CustomComponent implements
                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");
@@ -77,6 +108,9 @@ public class TestForUpload extends CustomComponent implements
                pi.setVisible(false);
                pi.setPollingInterval(1000);
                main.addComponent(pi);
+               
+               memoryStatus = new Label();
+               main.addComponent(memoryStatus);
 
                status.setVisible(false);
                main.addComponent(status);
@@ -93,6 +127,22 @@ public class TestForUpload extends CustomComponent implements
                
 
        }
+       
+       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();
@@ -110,11 +160,13 @@ public class TestForUpload extends CustomComponent implements
                        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 {
@@ -133,15 +185,20 @@ public class TestForUpload extends CustomComponent implements
                        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() {
 
                }
 
@@ -181,6 +238,74 @@ public class TestForUpload extends CustomComponent implements
                }
 
        }
+       
+       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);
@@ -193,10 +318,23 @@ public class TestForUpload extends CustomComponent implements
                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) {