8000 feat: Add TransferProgressListener API (#21343) · vaadin/flow@5c8ab80 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 5c8ab80

Browse files
mshabarovcaalador
andauthored
feat: Add TransferProgressListener API (#21343)
This is the first part for DownloadHandler. Part-of #21167 --------- Co-authored-by: caalador <mikael.grankvist@vaadin.com>
1 parent 7a51e5b commit 5c8ab80

21 files changed

+1932
-119
lines changed

flow-server/src/main/java/com/vaadin/flow/server/DownloadRequest.java renamed to flow-server/src/main/java/com/vaadin/flow/server/DownloadEvent.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.io.IOException;
2020
import java.io.OutputStream;
2121
import java.io.PrintWriter;
22-
import java.io.Serializable;
2322
import java.io.UncheckedIOException;
2423
import java.util.Optional;
2524

@@ -34,9 +33,9 @@
3433
*
3534
* @since 24.8
3635
*/
37-
public record DownloadRequest(VaadinRequest request, VaadinResponse response,
36+
public record DownloadEvent(VaadinRequest request, VaadinResponse response,
3837
VaadinSession session, String fileName, String contentType,
39-
Element owningElement) implements Serializable {
38+
Element owningElement) {
4039

4140
/**
4241
* Returns a <code>OutputStream</code> for writing binary data in the
@@ -45,14 +44,15 @@ public record DownloadRequest(VaadinRequest request, VaadinResponse response,
4544
* Either this method or getWriter() may be called to write the response,
4645
* not both.
4746
*
48-
* @return a <code>OutputStream</code> for writing binary data or empty
49-
* optional if an error happened
47+
* @return a <code>OutputStream</code> for writing binary data
48+
* @throws UncheckedIOException
49+
* if an I/O error occurred while getting the output stream
5050
*/
5151
public OutputStream getOutputStream() {
5252
try {
5353
return response.getOutputStream();
5454
} catch (IOException e) {
55-
LoggerFactory.getLogger(DownloadRequest.class)
55+
LoggerFactory.getLogger(DownloadEvent.class)
5656
.error("Error getting output stream", e);
5757
throw new UncheckedIOException("Error getting output stream", e);
5858
}
@@ -66,14 +66,15 @@ public OutputStream getOutputStream() {
6666
* Either this method or getOutputStream() may be called to write the
6767
* response, not both.
6868
*
69-
* @return a <code>PrintWriter</code> for writing character text or empty
70-
* optional if an error happened
69+
* @return a <code>PrintWriter</code> for writing character text
70+
* @throws UncheckedIOException
71+
* if an I/O error occurred while getting the writer
7172
*/
7273
public PrintWriter getWriter() {
7374
try {
7475
return response.getWriter();
7576
} catch (IOException e) {
76-
LoggerFactory.getLogger(DownloadRequest.class)
77+
LoggerFactory.getLogger(DownloadEvent.class)
7778
.error("Error getting print writer");
7879
throw new UncheckedIOException("Error getting writer", e);
7980
}

flow-server/src/main/java/com/vaadin/flow/server/DownloadHandler.java

Lines changed: 121 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,21 @@
1717
package com.vaadin.flow.server;
1818

1919
import java.io.File;
20+
import java.io.InputStream;
21+
import java.io.OutputStream;
22+
import java.util.Collection;
2023
import java.util.Optional;
2124

2225
import com.vaadin.flow.dom.Element;
26+
import com.vaadin.flow.function.SerializableConsumer;
2327
import com.vaadin.flow.function.SerializableFunction;
28+
import com.vaadin.flow.server.streams.AbstractDownloadHandler;
2429
import com.vaadin.flow.server.streams.ClassDownloadHandler;
2530
import com.vaadin.flow.server.streams.DownloadResponse;
2631
import com.vaadin.flow.server.streams.FileDownloadHandler;
2732
import com.vaadin.flow.server.streams.InputStreamDownloadHandler;
2833
import com.vaadin.flow.server.streams.ServletResourceDownloadHandler;
34+
import com.vaadin.flow.server.streams.TransferContext;
2935

3036
/**
3137
* Interface for handling download of data from the server to the client.
@@ -43,29 +49,29 @@ public interface DownloadHandler extends ElementRequestHandler {
4349
* download event containing the necessary data for writing the
4450
* response
4551
*/
46-
void handleDownloadRequest(DownloadRequest event);
52+
void handleDownloadRequest(DownloadEvent event);
4753

4854
default void handleRequest(VaadinRequest request, VaadinResponse response,
4955
VaadinSession session, Element owner) {
5056
String fileName = getUrlPostfix() == null ? "" : getUrlPostfix();
5157

52-
DownloadRequest event = new DownloadRequest(request, response, session,
53-
fileName,
58+
DownloadEvent downloadEvent = new DownloadEvent(request, response,
59+
session, fileName,
5460
Optional.ofNullable(response.getService().getMimeType(fileName))
5561
.orElse("application/octet-stream"),
5662
owner);
5763

58-
handleDownloadRequest(event);
64+
handleDownloadRequest(downloadEvent);
5965
}
6066

6167
/**
6268
* Get a download handler for serving given {@link File}.
6369
*
6470
* @param file
6571
* file to server for download
66-
* @return DownloadHandler instance for file
72+
* @return DownloadHandler implementation for download a file
6773
*/
68-
static DownloadHandler forFile(File file) {
74+
static FileDownloadHandler forFile(File file) {
6975
return new FileDownloadHandler(file);
7076
}
7177

@@ -76,12 +82,31 @@ static DownloadHandler forFile(File file) {
7682
* file to server for download
7783
* @param name
7884
* download name to use
79-
* @return DownloadHandler instance for file
85+
* @return DownloadHandler implementation for download a file
8086
*/
81-
static DownloadHandler forFile(File file, String name) {
87+
static FileDownloadHandler forFile(File file, String name) {
8288
return new FileDownloadHandler(file, name);
8389
}
8490

91+
/**
92+
* Get a download handler for serving given {@link File} with the given
93+
* download name and progress listener.
94+
*
95+
* @param file
96+
* file to server for download
97+
* @param name
98+
* download name to use
99+
* @param listener
100+
* listener for transfer progress events
101+
* @return DownloadHandler implementation for download a file
102+
*/
103+
static FileDownloadHandler forFile(File file, String name,
104+
TransferProgressListener listener) {
105+
FileDownloadHandler handler = new FileDownloadHandler(file, name);
106+
handler.addTransferProgressListener(listener);
107+
return handler;
108+
}
109+
85110
/**
86111
* Generate a download handler for class resource.
87112
* <p>
@@ -93,9 +118,9 @@ static DownloadHandler forFile(File file, String name) {
93118
* class for resource module
94119
* @param resourceName
95120
* name of class resource
96-
* @return DownloadHandler instance for class resource
121+
* @return DownloadHandler implementation for download a class resource
97122
*/
98-
static DownloadHandler forClassResource(Class<?> clazz,
123+
static ClassDownloadHandler forClassResource(Class<?> clazz,
99124
String resourceName) {
100125
return new ClassDownloadHandler(clazz, resourceName);
101126
}
@@ -113,13 +138,40 @@ static DownloadHandler forClassResource(Class<?> clazz,
113138
* name of class resource
114139
* @param fileName
115140
* download resourceName to use
116-
* @return DownloadHandler instance for class resource
141+
* @return DownloadHandler implementation for download a class resource
117142
*/
118-
static DownloadHandler forClassResource(Class<?> clazz, String resourceName,
119-
String fileName) {
143+
static ClassDownloadHandler forClassResource(Class<?> clazz,
144+
String resourceName, String fileName) {
120145
return new ClassDownloadHandler(clazz, resourceName, fileName);
121146
}
122147

148+
/**
149+
* Generate a download handler for class resource with the given download
150+
* name and progress listener.
151+
* <p>
152+
* For instance for the file {@code resources/com/example/ui/MyData.json}
153+
* and class {@code com.example.ui.MyData} the definition would be
154+
* {@code forClassResource(MyData.class, "MyData.json", "Data.json")}
155+
*
156+
* @param clazz
157+
* class for resource module
158+
* @param resourceName
159+
* name of class resource
160+
* @param fileName
161+
* download resourceName to use
162+
* @param listener
163+
* listener for transfer progress events
164+
* @return DownloadHandler implementation for download a class resource
165+
*/
166+
static ClassDownloadHandler forClassResource(Class<?> clazz,
167+
String resourceName, String fileName,
168+
TransferProgressListener listener) {
169+
ClassDownloadHandler handler = new ClassDownloadHandler(clazz,
170+
resourceName, fileName);
171+
handler.addTransferProgressListener(listener);
172+
return handler;
173+
}
174+
123175
/**
124176
* Generate a download handler for a servlet resource.
125177
* <p>
@@ -128,9 +180,9 @@ static DownloadHandler forClassResource(Class<?> clazz, String resourceName,
128180
*
129181
* @param path
130182
* the servlet path to the file
131-
* @return DownloadHandler instance for servlet resource
183+
* @return DownloadHandler implementation for downloading a servlet resource
132184
*/
133-
static DownloadHandler forServletResource(String path) {
185+
static ServletResourceDownloadHandler forServletResource(String path) {
134186
return new ServletResourceDownloadHandler(path);
135187
}
136188

@@ -147,21 +199,47 @@ static DownloadHandler forServletResource(String path) {
147199
* the servlet path to the file
148200
* @param name
149201
* resource name
150-
* @return DownloadHandler instance for servlet resource
202+
* @return DownloadHandler implementation for downloading a servlet resource
151203
*/
152-
static DownloadHandler forServletResource(String path, String name) {
204+
static ServletResourceDownloadHandler forServletResource(String path,
205+
String name) {
153206
return new ServletResourceDownloadHandler(path, name);
154207
}
155208

209+
/**
210+
* Generate a download handler for a servlet resource.
211+
* <p>
212+
* For instance for the file {@code webapp/WEB-INF/servlet.json} the path
213+
* would be {@code /WEB-INF/servlet.json}
214+
* <p>
215+
* Name is appended to the download url as the logical name of the target
216+
* file.
217+
*
218+
* @param path
219+
* the servlet path to the file
220+
* @param name
221+
* resource name
222+
* @param listener
223+
* listener for transfer progress events
224+
* @return DownloadHandler implementation for downloading a servlet resource
225+
*/
226+
static ServletResourceDownloadHandler forServletResource(String path,
227+
String name, TransferProgressListener listener) {
228+
ServletResourceDownloadHandler handler = new ServletResourceDownloadHandler(
229+
path, name);
230+
handler.addTransferProgressListener(listener);
231+
return handler;
232+
}
233+
156234
/**
157235
* Generate a function for downloading from a generated inputStream.
158236
*
159237
* @param handler
160238
* handler function that will be called on download
161-
* @return DownloadHandler instance for inputStream
239+
* @return DownloadHandler implementation for download from an input stream
162240
*/
163-
static DownloadHandler fromInputStream(
164-
SerializableFunction<DownloadRequest, DownloadResponse> handler) {
241+
static InputStreamDownloadHandler fromInputStream(
242+
SerializableFunction<DownloadEvent, DownloadResponse> handler) {
165243
return new InputStreamDownloadHandler(handler);
166244
}
167245

@@ -172,11 +250,31 @@ static DownloadHandler fromInputStream(
172250
* handler function that will be called on download
173251
* @param name
174252
* resource name
175-
* @return DownloadHandler instance for inputStream
253+
* @return DownloadHandler implementation for download from an input stream
176254
*/
177-
static DownloadHandler fromInputStream(
178-
SerializableFunction<DownloadRequest, DownloadResponse> handler,
255+
static InputStreamDownloadHandler fromInputStream(
256+
SerializableFunction<DownloadEvent, DownloadResponse> handler,
179257
String name) {
180258
return new InputStreamDownloadHandler(handler, name);
181259
}
260+
261 A1CC +
/**
262+
* Generate a function for downloading from a generated inputStream.
263+
*
264+
* @param handler
265+
* handler function that will be called on download
266+
* @param name
267+
* resource name
268+
* @param listener
269+
* listener for transfer progress events
270+
* @return DownloadHandler implementation for download from an input stream
271+
*/
272+
static InputStreamDownloadHandler fromInputStream(
273+
SerializableFunction<DownloadEvent, DownloadResponse> handler,
274+
String name, TransferProgressListener listener) {
275+
InputStreamDownloadHandler downloadHandler = new InputStreamDownloadHandler(
276+
handler, name);
277+
downloadHandler.addTransferProgressListener(listener);
278+
return downloadHandler;
279+
}
182280
}

0 commit comments

Comments
 (0)
0