From dcd091860ec0f4daa18718a1454d8a45e5fb4986 Mon Sep 17 00:00:00 2001 From: Max Thonagel <12283268+thoniTUB@users.noreply.github.com> Date: Thu, 12 Aug 2021 17:04:05 +0200 Subject: [PATCH 1/5] ResultRenderProvider returns list instead of optional --- .../com/bakdata/conquery/apiv1/QueryProcessor.java | 4 ++-- .../result/ResultRender/ResultRendererProvider.java | 4 ++-- .../models/config/ArrowFileResultProvider.java | 11 +++++++---- .../models/config/ArrowStreamResultProvider.java | 11 +++++++---- .../models/config/CsvResultRendererProvider.java | 11 +++++++---- .../conquery/models/config/XlsxResultProvider.java | 11 +++++++---- 6 files changed, 32 insertions(+), 20 deletions(-) diff --git a/backend/src/main/java/com/bakdata/conquery/apiv1/QueryProcessor.java b/backend/src/main/java/com/bakdata/conquery/apiv1/QueryProcessor.java index 11349a128e..6af2e4f26c 100644 --- a/backend/src/main/java/com/bakdata/conquery/apiv1/QueryProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/apiv1/QueryProcessor.java @@ -218,8 +218,8 @@ public Stream getQueriesFiltered(Dataset datasetId, UriBuilder public static S setDownloadUrls(S status, List renderer, ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders) { List resultUrls = renderer.stream() - .map(r -> r.generateResultURL(exec, uriBuilder.clone(), allProviders)) - .flatMap(Optional::stream).collect(Collectors.toList()); + .map(r -> r.generateResultURLs(exec, uriBuilder.clone(), allProviders)) + .flatMap(Collection::stream).collect(Collectors.toList()); status.setResultUrls(resultUrls); diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/ResultRender/ResultRendererProvider.java b/backend/src/main/java/com/bakdata/conquery/io/result/ResultRender/ResultRendererProvider.java index e4d2d20135..cb4d6010d8 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/ResultRender/ResultRendererProvider.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/ResultRender/ResultRendererProvider.java @@ -8,7 +8,7 @@ import javax.ws.rs.core.UriBuilder; import java.net.URL; -import java.util.Optional; +import java.util.Collection; @CPSBase @JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM, property = "type") @@ -22,7 +22,7 @@ public interface ResultRendererProvider { * @param allProviders A flag that should override internal "hide-this-url" flags. * @return An Optional with the url or an empty optional. */ - Optional generateResultURL(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders); + Collection generateResultURLs(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders); void registerResultResource(JerseyEnvironment environment, ManagerNode manager); } diff --git a/backend/src/main/java/com/bakdata/conquery/models/config/ArrowFileResultProvider.java b/backend/src/main/java/com/bakdata/conquery/models/config/ArrowFileResultProvider.java index 38d1094fb8..e3db747188 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/config/ArrowFileResultProvider.java +++ b/backend/src/main/java/com/bakdata/conquery/models/config/ArrowFileResultProvider.java @@ -15,6 +15,9 @@ import javax.ws.rs.core.UriBuilder; import java.net.MalformedURLException; import java.net.URL; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Optional; @Getter @@ -25,16 +28,16 @@ public class ArrowFileResultProvider implements ResultRendererProvider { @Override @SneakyThrows(MalformedURLException.class) - public Optional generateResultURL(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders) { + public Collection generateResultURLs(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders) { if (!(exec instanceof SingleTableResult)) { - return Optional.empty(); + return Collections.emptyList(); } if (hidden && !allProviders) { - return Optional.empty(); + return Collections.emptyList(); } - return Optional.of(ResultArrowFileResource.getDownloadURL(uriBuilder, (ManagedExecution & SingleTableResult) exec)); + return List.of(ResultArrowFileResource.getDownloadURL(uriBuilder, (ManagedExecution & SingleTableResult) exec)); } @Override diff --git a/backend/src/main/java/com/bakdata/conquery/models/config/ArrowStreamResultProvider.java b/backend/src/main/java/com/bakdata/conquery/models/config/ArrowStreamResultProvider.java index 08c16f8c36..ee923972ba 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/config/ArrowStreamResultProvider.java +++ b/backend/src/main/java/com/bakdata/conquery/models/config/ArrowStreamResultProvider.java @@ -15,6 +15,9 @@ import javax.ws.rs.core.UriBuilder; import java.net.MalformedURLException; import java.net.URL; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Optional; @Getter @@ -25,16 +28,16 @@ public class ArrowStreamResultProvider implements ResultRendererProvider { @Override @SneakyThrows(MalformedURLException.class) - public Optional generateResultURL(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders) { + public Collection generateResultURLs(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders) { if (!(exec instanceof SingleTableResult)) { - return Optional.empty(); + return Collections.emptyList(); } if (hidden && !allProviders) { - return Optional.empty(); + return Collections.emptyList(); } - return Optional.of(ResultArrowStreamResource.getDownloadURL(uriBuilder, (ManagedExecution & SingleTableResult) exec)); + return List.of(ResultArrowStreamResource.getDownloadURL(uriBuilder, exec)); } @Override diff --git a/backend/src/main/java/com/bakdata/conquery/models/config/CsvResultRendererProvider.java b/backend/src/main/java/com/bakdata/conquery/models/config/CsvResultRendererProvider.java index 5dc4552064..68b12841c2 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/config/CsvResultRendererProvider.java +++ b/backend/src/main/java/com/bakdata/conquery/models/config/CsvResultRendererProvider.java @@ -15,6 +15,9 @@ import javax.ws.rs.core.UriBuilder; import java.net.MalformedURLException; import java.net.URL; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Optional; @Getter @@ -25,16 +28,16 @@ public class CsvResultRendererProvider implements ResultRendererProvider { @Override @SneakyThrows(MalformedURLException.class) - public Optional generateResultURL(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders) { + public Collection generateResultURLs(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders) { if (!(exec instanceof SingleTableResult)) { - return Optional.empty(); + return Collections.emptyList(); } if (hidden && !allProviders) { - return Optional.empty(); + return Collections.emptyList(); } - return Optional.of(ResultCsvResource.getDownloadURL(uriBuilder, (ManagedExecution & SingleTableResult) exec)); + return List.of(ResultCsvResource.getDownloadURL(uriBuilder, (ManagedExecution & SingleTableResult) exec)); } @Override diff --git a/backend/src/main/java/com/bakdata/conquery/models/config/XlsxResultProvider.java b/backend/src/main/java/com/bakdata/conquery/models/config/XlsxResultProvider.java index 8d1919b951..0f82baace2 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/config/XlsxResultProvider.java +++ b/backend/src/main/java/com/bakdata/conquery/models/config/XlsxResultProvider.java @@ -15,6 +15,9 @@ import javax.ws.rs.core.UriBuilder; import java.net.MalformedURLException; import java.net.URL; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Optional; @Getter @@ -25,16 +28,16 @@ public class XlsxResultProvider implements ResultRendererProvider { @Override @SneakyThrows(MalformedURLException.class) - public Optional generateResultURL(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders) { + public Collection generateResultURLs(ManagedExecution exec, UriBuilder uriBuilder, boolean allProviders) { if (!(exec instanceof SingleTableResult)) { - return Optional.empty(); + return Collections.emptyList(); } if (hidden && !allProviders) { - return Optional.empty(); + return Collections.emptyList(); } - return Optional.of(ResultExcelResource.getDownloadURL(uriBuilder, (ManagedExecution & SingleTableResult) exec)); + return List.of(ResultExcelResource.getDownloadURL(uriBuilder, (ManagedExecution & SingleTableResult) exec)); } @Override From d3d3f09f8e59abe444d03e92a9d384ab7ba9f8b2 Mon Sep 17 00:00:00 2001 From: Max Thonagel <12283268+thoniTUB@users.noreply.github.com> Date: Fri, 13 Aug 2021 11:23:07 +0200 Subject: [PATCH 2/5] deliver results with correct media type --- .../serializer/MediaTypeDeserializer.java | 16 ++++++++++++++++ .../bakdata/conquery/io/result/ResultUtil.java | 5 ++++- .../result/arrow/ResultArrowFileProcessor.java | 4 ++++ .../io/result/arrow/ResultArrowProcessor.java | 11 +++-------- .../result/arrow/ResultArrowStreamProcessor.java | 4 ++++ .../io/result/csv/ResultCsvProcessor.java | 3 ++- .../io/result/excel/ResultExcelProcessor.java | 10 ++++------ 7 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 backend/src/main/java/com/bakdata/conquery/io/jackson/serializer/MediaTypeDeserializer.java diff --git a/backend/src/main/java/com/bakdata/conquery/io/jackson/serializer/MediaTypeDeserializer.java b/backend/src/main/java/com/bakdata/conquery/io/jackson/serializer/MediaTypeDeserializer.java new file mode 100644 index 0000000000..352882b4c4 --- /dev/null +++ b/backend/src/main/java/com/bakdata/conquery/io/jackson/serializer/MediaTypeDeserializer.java @@ -0,0 +1,16 @@ +package com.bakdata.conquery.io.jackson.serializer; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import javax.ws.rs.core.MediaType; +import java.io.IOException; + +public class MediaTypeDeserializer extends JsonDeserializer { + @Override + public MediaType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + return MediaType.valueOf(jsonParser.getText()); + } +} diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java b/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java index d0ca96473d..96565f2082 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java @@ -14,6 +14,8 @@ import lombok.extern.slf4j.Slf4j; import javax.ws.rs.BadRequestException; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; import java.nio.charset.Charset; @@ -32,8 +34,9 @@ public static ExternalEntityId createId(Namespace namespace, EntityResult cer, I mappingState); } - public static Response makeResponseWithFileName(StreamingOutput out, String label, String fileExtension) { + public static Response makeResponseWithFileName(StreamingOutput out, String label, String fileExtension, MediaType mediaType) { Response.ResponseBuilder response = Response.ok(out); + response.header(HttpHeaders.CONTENT_TYPE, mediaType); if(!(Strings.isNullOrEmpty(label) || label.isBlank())) { // Set filename from label if the label was set, otherwise the browser will name the file according to the request path response.header("Content-Disposition", String.format( diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowFileProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowFileProcessor.java index 3f33e27488..13fc959c31 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowFileProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowFileProcessor.java @@ -10,6 +10,7 @@ import org.apache.arrow.vector.dictionary.DictionaryProvider; import org.apache.arrow.vector.ipc.ArrowFileWriter; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.nio.channels.Channels; @@ -19,6 +20,8 @@ @RequiredArgsConstructor public class ResultArrowFileProcessor { + // From https://www.iana.org/assignments/media-types/application/vnd.apache.arrow.file + public static final MediaType MEDIA_TYPE = new MediaType("application", "vnd.apache.arrow.file"); private final DatasetRegistry datasetRegistry; private final ConqueryConfig config; @@ -31,6 +34,7 @@ public & SingleTableResult> Response getArrowFile datasetRegistry, pretty, FILE_EXTENTION_ARROW_FILE, + MEDIA_TYPE, config); } } diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java index 769dc1691f..82898f3593 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java @@ -3,15 +3,13 @@ import static com.bakdata.conquery.io.result.ResultUtil.makeResponseWithFileName; import static com.bakdata.conquery.io.result.arrow.ArrowRenderer.renderToStream; import static com.bakdata.conquery.models.auth.AuthorizationHelper.authorizeDownloadDatasets; -import static com.bakdata.conquery.resources.ResourceConstants.FILE_EXTENTION_ARROW_FILE; -import static com.bakdata.conquery.resources.ResourceConstants.FILE_EXTENTION_ARROW_STREAM; import java.io.IOException; import java.io.OutputStream; -import java.nio.channels.Channels; import java.util.function.Function; import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; @@ -32,13 +30,9 @@ import com.bakdata.conquery.models.worker.DatasetRegistry; import com.bakdata.conquery.models.worker.Namespace; import com.bakdata.conquery.util.io.ConqueryMDC; -import lombok.RequiredArgsConstructor; import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; import org.apache.arrow.vector.VectorSchemaRoot; -import org.apache.arrow.vector.dictionary.DictionaryProvider; -import org.apache.arrow.vector.ipc.ArrowFileWriter; -import org.apache.arrow.vector.ipc.ArrowStreamWriter; import org.apache.arrow.vector.ipc.ArrowWriter; import org.apache.http.HttpStatus; @@ -55,6 +49,7 @@ public static & SingleTableResult> Response getAr DatasetRegistry datasetRegistry, boolean pretty, String fileExtension, + MediaType mediaType, ConqueryConfig config) { final Namespace namespace = datasetRegistry.get(dataset.getId()); @@ -99,7 +94,7 @@ public void write(OutputStream output) throws IOException, WebApplicationExcepti } }; - return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), fileExtension); + return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), fileExtension, mediaType); } } diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowStreamProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowStreamProcessor.java index 94ad4ce968..359fbfcd71 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowStreamProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowStreamProcessor.java @@ -10,6 +10,7 @@ import org.apache.arrow.vector.dictionary.DictionaryProvider; import org.apache.arrow.vector.ipc.ArrowStreamWriter; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import static com.bakdata.conquery.io.result.arrow.ResultArrowProcessor.getArrowResult; @@ -19,6 +20,8 @@ public class ResultArrowStreamProcessor { + // From https://www.iana.org/assignments/media-types/application/vnd.apache.arrow.stream + public static final MediaType MEDIA_TYPE = new MediaType("application", "vnd.apache.arrow.stream"); private final DatasetRegistry datasetRegistry; private final ConqueryConfig config; @@ -32,6 +35,7 @@ public & SingleTableResult> Response getArrowStre datasetRegistry, pretty, FILE_EXTENTION_ARROW_STREAM, + MEDIA_TYPE, config); } diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java index b9e9b81ccc..a5703d92c5 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java @@ -9,6 +9,7 @@ import java.nio.charset.Charset; import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; @@ -74,7 +75,7 @@ public & SingleTableResult> Response getResult(Us throw new WebApplicationException("Failed to load result", e); } }; - return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "csv"); + return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "csv", new MediaType("text", "csv", charset.toString())); } } diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java index 5ce26459d5..3f7f4ceb56 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java @@ -1,7 +1,6 @@ package com.bakdata.conquery.io.result.excel; import com.bakdata.conquery.io.result.ResultUtil; -import com.bakdata.conquery.io.result.excel.ExcelRenderer; import com.bakdata.conquery.models.auth.entities.User; import com.bakdata.conquery.models.auth.permissions.Ability; import com.bakdata.conquery.models.config.ConqueryConfig; @@ -9,7 +8,6 @@ import com.bakdata.conquery.models.execution.ManagedExecution; import com.bakdata.conquery.models.i18n.I18n; import com.bakdata.conquery.models.identifiable.ids.specific.DatasetId; -import com.bakdata.conquery.models.identifiable.ids.specific.ManagedExecutionId; import com.bakdata.conquery.models.identifiable.mapping.IdMappingConfig; import com.bakdata.conquery.models.identifiable.mapping.IdMappingState; import com.bakdata.conquery.models.query.PrintSettings; @@ -17,20 +15,20 @@ import com.bakdata.conquery.models.query.results.EntityResult; import com.bakdata.conquery.models.worker.DatasetRegistry; import com.bakdata.conquery.models.worker.Namespace; -import com.bakdata.conquery.util.ResourceUtil; import com.bakdata.conquery.util.io.ConqueryMDC; import lombok.RequiredArgsConstructor; -import javax.ws.rs.BadRequestException; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; -import static com.bakdata.conquery.io.result.ResultUtil.checkSingleTableResult; import static com.bakdata.conquery.io.result.ResultUtil.makeResponseWithFileName; @RequiredArgsConstructor public class ResultExcelProcessor { + // Media type according to https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types + public static final MediaType MEDIA_TYPE = new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet"); private final DatasetRegistry datasetRegistry; private final ConqueryConfig config; @@ -62,7 +60,7 @@ public & SingleTableResult> Response getExcelResu output ); - return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "xlsx"); + return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "xlsx", MEDIA_TYPE); } } From 9a061329dc0e1ab33a36235e8ae0da77c9b2592a Mon Sep 17 00:00:00 2001 From: Max Thonagel <12283268+thoniTUB@users.noreply.github.com> Date: Fri, 13 Aug 2021 12:14:01 +0200 Subject: [PATCH 3/5] provide content disposition mode --- .../java/com/bakdata/conquery/io/result/ResultUtil.java | 9 +++++++-- .../conquery/io/result/arrow/ResultArrowProcessor.java | 2 +- .../conquery/io/result/csv/ResultCsvProcessor.java | 2 +- .../conquery/io/result/excel/ResultExcelProcessor.java | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java b/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java index 96565f2082..0a54ec1a5d 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java @@ -24,6 +24,11 @@ @Slf4j public class ResultUtil { + public static enum ContentDispositionOption { + inline, + attachment + } + public static ExternalEntityId createId(Namespace namespace, EntityResult cer, IdMappingConfig idMappingConfig, IdMappingState mappingState) { EncodedDictionary dict = namespace.getStorage().getPrimaryDictionary(); @@ -34,13 +39,13 @@ public static ExternalEntityId createId(Namespace namespace, EntityResult cer, I mappingState); } - public static Response makeResponseWithFileName(StreamingOutput out, String label, String fileExtension, MediaType mediaType) { + public static Response makeResponseWithFileName(StreamingOutput out, String label, String fileExtension, MediaType mediaType, ContentDispositionOption disposition) { Response.ResponseBuilder response = Response.ok(out); response.header(HttpHeaders.CONTENT_TYPE, mediaType); if(!(Strings.isNullOrEmpty(label) || label.isBlank())) { // Set filename from label if the label was set, otherwise the browser will name the file according to the request path response.header("Content-Disposition", String.format( - "attachment; filename=\"%s\"",FileUtil.makeSafeFileName(label, fileExtension))); + "%s; filename=\"%s\"", disposition, FileUtil.makeSafeFileName(label, fileExtension))); } return response.build(); } diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java index 82898f3593..4442201fd2 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java @@ -94,7 +94,7 @@ public void write(OutputStream output) throws IOException, WebApplicationExcepti } }; - return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), fileExtension, mediaType); + return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), fileExtension, mediaType, ResultUtil.ContentDispositionOption.attachment); } } diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java index a5703d92c5..d20926dd00 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java @@ -75,7 +75,7 @@ public & SingleTableResult> Response getResult(Us throw new WebApplicationException("Failed to load result", e); } }; - return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "csv", new MediaType("text", "csv", charset.toString())); + return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "csv", new MediaType("text", "csv", charset.toString()), ResultUtil.ContentDispositionOption.attachment); } } diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java index 3f7f4ceb56..7c27c5dec3 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java @@ -60,7 +60,7 @@ public & SingleTableResult> Response getExcelResu output ); - return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "xlsx", MEDIA_TYPE); + return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "xlsx", MEDIA_TYPE, ResultUtil.ContentDispositionOption.attachment); } } From 077a4a9e258b4627e2a59c4e2c6ae3674d6242eb Mon Sep 17 00:00:00 2001 From: Max Thonagel <12283268+thoniTUB@users.noreply.github.com> Date: Tue, 17 Aug 2021 09:47:06 +0200 Subject: [PATCH 4/5] names enums according to ajva conventions --- .../com/bakdata/conquery/io/result/ResultUtil.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java b/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java index 0a54ec1a5d..a707da60d1 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/ResultUtil.java @@ -20,13 +20,20 @@ import javax.ws.rs.core.StreamingOutput; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.util.Locale; @Slf4j public class ResultUtil { public static enum ContentDispositionOption { - inline, - attachment + // Try to display payload in the browser + INLINE, + // Force download of the payload by the browser + ATTACHMENT; + + String getHeaderValue() { + return this.name().toLowerCase(Locale.ROOT); + } } @@ -45,7 +52,7 @@ public static Response makeResponseWithFileName(StreamingOutput out, String labe if(!(Strings.isNullOrEmpty(label) || label.isBlank())) { // Set filename from label if the label was set, otherwise the browser will name the file according to the request path response.header("Content-Disposition", String.format( - "%s; filename=\"%s\"", disposition, FileUtil.makeSafeFileName(label, fileExtension))); + "%s; filename=\"%s\"", disposition.getHeaderValue(), FileUtil.makeSafeFileName(label, fileExtension))); } return response.build(); } From cddbe1990fdcba79a2f95447b311c806a2886d31 Mon Sep 17 00:00:00 2001 From: Max Thonagel <12283268+thoniTUB@users.noreply.github.com> Date: Tue, 17 Aug 2021 09:51:18 +0200 Subject: [PATCH 5/5] simplify streamin output creation --- .../io/result/arrow/ResultArrowProcessor.java | 23 +++++++------------ .../io/result/csv/ResultCsvProcessor.java | 2 +- .../io/result/excel/ResultExcelProcessor.java | 2 +- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java index 4442201fd2..91511ad9c0 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/arrow/ResultArrowProcessor.java @@ -80,21 +80,14 @@ public static & SingleTableResult> Response getAr (EntityResult cer) -> ResultUtil.createId(namespace, cer, config.getIdMapping(), mappingState)); - StreamingOutput out = new StreamingOutput() { - - @Override - public void write(OutputStream output) throws IOException, WebApplicationException { - renderToStream(writerProducer.apply(output), - settings, - config.getArrow().getBatchSize(), - idMappingConf.getPrintIdFields(), - exec.getResultInfo(), - exec.streamResults()); - - } - }; - - return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), fileExtension, mediaType, ResultUtil.ContentDispositionOption.attachment); + StreamingOutput out = output -> renderToStream(writerProducer.apply(output), + settings, + config.getArrow().getBatchSize(), + idMappingConf.getPrintIdFields(), + exec.getResultInfo(), + exec.streamResults()); + + return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), fileExtension, mediaType, ResultUtil.ContentDispositionOption.ATTACHMENT); } } diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java index d20926dd00..dd947cbc5b 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/csv/ResultCsvProcessor.java @@ -75,7 +75,7 @@ public & SingleTableResult> Response getResult(Us throw new WebApplicationException("Failed to load result", e); } }; - return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "csv", new MediaType("text", "csv", charset.toString()), ResultUtil.ContentDispositionOption.attachment); + return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "csv", new MediaType("text", "csv", charset.toString()), ResultUtil.ContentDispositionOption.ATTACHMENT); } } diff --git a/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java b/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java index 7c27c5dec3..e56e7ac8c9 100644 --- a/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java +++ b/backend/src/main/java/com/bakdata/conquery/io/result/excel/ResultExcelProcessor.java @@ -60,7 +60,7 @@ public & SingleTableResult> Response getExcelResu output ); - return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "xlsx", MEDIA_TYPE, ResultUtil.ContentDispositionOption.attachment); + return makeResponseWithFileName(out, exec.getLabelWithoutAutoLabelSuffix(), "xlsx", MEDIA_TYPE, ResultUtil.ContentDispositionOption.ATTACHMENT); } }