From 141f878d89aa472e2778ac4a6438b09ea049d87e Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Tue, 2 Oct 2007 13:16:26 +0000 Subject: [PATCH] wrote temp file receiver to upload test should not get out of memory event with huge files. svn changeset:2421/svn branch:trunk --- .../itmill/toolkit/tests/TestForUpload.java | 166 ++++++++++++++++-- 1 file changed, 152 insertions(+), 14 deletions(-) diff --git a/src/com/itmill/toolkit/tests/TestForUpload.java b/src/com/itmill/toolkit/tests/TestForUpload.java index a981ec2f8c..7ed0da8dea 100644 --- a/src/com/itmill/toolkit/tests/TestForUpload.java +++ b/src/com/itmill/toolkit/tests/TestForUpload.java @@ -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) { -- 2.39.5