Vaadin 8: расширение FiledownLoader - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь расширить Vaadin 8 FileDownloader, чтобы ресурс мог генерироваться после того, как FileDownloader был расширен до кнопки.Но я получаю это исключение: java.lang.RuntimeException: ResourceReference не поддерживает ресурсы типа DynamicFileDownloader

Вот мой код:

import com.vaadin.server.DownloadStream;
import com.vaadin.server.FileDownloader;
import com.vaadin.server.Resource;
import com.vaadin.server.StreamResource;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinResponse;
import com.vaadin.server.VaadinSession;
import java.io.IOException;

public class DynamicFileDownloader extends FileDownloader
{

private DynamicDownloadListener dynamicDownloadListener;

public DynamicFileDownloader()
{
  super(new Resource()
  {
     @Override
 public String getMIMEType()
 {
    return "pdf";
 }
  });
}

public void addDynamicDownloadListener(DynamicDownloadListener listener)
{
  dynamicDownloadListener = listener;
}

public void setResource(StreamResource resource)
{
   super.setResource("stream", resource);
}

@Override
public boolean handleConnectorRequest(VaadinRequest request,
 VaadinResponse response, String path) throws IOException
{
  VaadinSession session = getSession();

  session.lock();
  dynamicDownloadListener.beforeDownload();

  DownloadStream stream;

  try
  {
     Resource resource = super.getResource("stream");

     stream = ((StreamResource) resource).getStream();

  } finally
  {
     session.unlock();
  }
   stream.writeResponse(request, response);
   return true;
}

public interface DynamicDownloadListener
{
   public void beforeDownload();
}
 }

Как использовать:

DynamicFileDownloader dynamicFileDownloader = new DynamicFileDownloader();
 dynamicFileDownloader.addDynamicDownloadListener(() -> {
  try
 {
    // make resource from user input
    dynamicFileDownloader.setResource(resource);
 } catch (ValidationException | IOException e1)
 {

 }
});

dynamicFileDownloader.extend(window.getButtonDownload());

Я гуглил, но ничего не смог найти Обычный FileDownloader не позволяет динамический контент из пользовательского ввода, поэтому я пытаюсь расширить FileDownloader.

1 Ответ

0 голосов
/ 08 июня 2018

Тату Лунд, спасибо за подсказку.Я был в состоянии использовать OnDemandFileDownloader.Вот код:

import com.vaadin.server.FileDownloader;
import com.vaadin.server.StreamResource;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinResponse;

import java.io.IOException;

public class OnDemandFileDownloader extends FileDownloader
{
   public interface OnDemandStreamResource extends StreamResource.StreamSource
   {
      String getFilename();
   }

   private final OnDemandStreamResource onDemandStreamResource;

   public OnDemandFileDownloader(OnDemandStreamResource onDemandStreamResource)
   {
      super(new StreamResource(onDemandStreamResource, ""));
      this.onDemandStreamResource = onDemandStreamResource;
   }

   @Override
   public boolean handleConnectorRequest(VaadinRequest request,
     VaadinResponse response, String path) throws IOException
   {
      getResource().setFilename(onDemandStreamResource.getFilename());
      return super.handleConnectorRequest(request, response, path);
   }

   private StreamResource getResource()
   {
      return (StreamResource) this.getResource("dl");
   }
}

А вот как я его использовал:

OnDemandFileDownloader.OnDemandStreamResource onDemandStreamResource = new  OnDemandFileDownloader.OnDemandStreamResource()
  {
     @Override
     public String getFilename()
     {
        return  pojo.getName();
     }

     @Override
     public InputStream getStream()
     {
        byte[] source = null;

       // make source here
        return new ByteArrayInputStream(source);
     }
  };

  OnDemandFileDownloader onDemandFileDownloader = new OnDemandFileDownloader(
        onDemandStreamResource);
  onDemandFileDownloader.extend(downloadButton);
...