package com.vaadin.tests.resources; import java.io.IOException; import java.io.InputStream; import com.vaadin.annotations.Push; import com.vaadin.server.DownloadStream; import com.vaadin.server.Resource; import com.vaadin.server.StreamResource; import com.vaadin.server.StreamResource.StreamSource; import com.vaadin.server.VaadinRequest; import com.vaadin.tests.components.AbstractTestUIWithLog; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; @Push public class DownloadWithPush extends AbstractTestUIWithLog { private static class GeneratedStream extends InputStream { int read = 0; int next = 'a'; private final int size; public GeneratedStream(int size) { this.size = size; } @Override public int read() throws IOException { if (available() == 0) { return -1; } read++; next++; if (next > 'z') { next = 'a'; } return next; } @Override public int available() throws IOException { return size - read; } } private final class DownloadResoure extends StreamResource { private DownloadResoure(StreamSource streamSource, String filename) { super(streamSource, filename); } @Override public DownloadStream getStream() { DownloadStream ds = super.getStream(); ds.setParameter("Content-Disposition", "attachment; filename=" + getFilename() + ";"); return ds; } } private Resource hugeFileResource = createResource();; private int fileSize = 300 * (1024 * 1024); @Override protected void setup(VaadinRequest request) { Button b = new Button("Download a " + String.format("%.1f", fileSize / 1024.0 / 1024.0) + "MB file", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { getUI().getPage().open(hugeFileResource, "", false); } }); addComponent(b); } private Resource createResource() { Resource hugeFileResource = new DownloadResoure(new StreamSource() { @Override public InputStream getStream() { return new GeneratedStream(fileSize); } }, "hugefile.txt"); return hugeFileResource; } @Override protected Integer getTicketNumber() { return 19709; } }