From 0c981a67f49da65fe6b1af7d83e046616782fbd8 Mon Sep 17 00:00:00 2001 From: Alexander Skoblikov Date: Wed, 5 Jul 2023 12:17:42 +0300 Subject: [PATCH] CB-3516 add compress flag to the export settings (#1792) * CB-3516 add compress flag to the export settings * CB-3516 add compression checkbox * CB-3516 zip export result download fix * CB-3516 fix zip name --------- Co-authored-by: naumov --- .../schema/service.data.transfer.graphqls | 2 ++ .../WebDataTransferDefaultExportSettings.java | 3 ++- .../impl/WebDataTransferOutputSettings.java | 9 ++++++++- .../transfer/impl/WebDataTransferServlet.java | 2 +- .../data/transfer/impl/WebDataTransferUtils.java | 8 ++++++++ .../transfer/impl/WebServiceDataTransfer.java | 9 +++++++-- .../getDataTransferDefaultParameters.gql | 15 ++++++++------- webapp/packages/core-sdk/src/sdk.ts | 5 ++++- .../src/Dialog/OutputOptionsForm.tsx | 15 +++++++++++---- .../packages/plugin-data-export/src/locales/en.ts | 2 ++ .../packages/plugin-data-export/src/locales/it.ts | 2 ++ .../packages/plugin-data-export/src/locales/ru.ts | 2 ++ .../packages/plugin-data-export/src/locales/zh.ts | 2 ++ 13 files changed, 59 insertions(+), 17 deletions(-) diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls b/server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls index aa3753cf01..608c5ad8c1 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls +++ b/server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls @@ -18,12 +18,14 @@ input DataTransferOutputSettingsInput { insertBom: Boolean encoding: String timestampPattern: String + compress: Boolean } type DataTransferOutputSettings { insertBom: Boolean! encoding: String! timestampPattern: String! + compress: Boolean! } type DataTransferDefaultExportSettings { diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferDefaultExportSettings.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferDefaultExportSettings.java index 66016ac098..4e35ab0ecd 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferDefaultExportSettings.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferDefaultExportSettings.java @@ -30,7 +30,8 @@ public class WebDataTransferDefaultExportSettings { this.outputSettings = new WebDataTransferOutputSettings( false, defConsumerSettings.getOutputEncoding(), - defConsumerSettings.getOutputTimestampPattern() + defConsumerSettings.getOutputTimestampPattern(), + defConsumerSettings.isCompressResults() ); this.supportedEncodings = Charset.availableCharsets().keySet(); } diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferOutputSettings.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferOutputSettings.java index d01ff5051f..9d05a280d9 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferOutputSettings.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferOutputSettings.java @@ -24,17 +24,20 @@ public class WebDataTransferOutputSettings { private final boolean insertBom; private final String encoding; private final String timestampPattern; + private final boolean compress; public WebDataTransferOutputSettings(Map outputSettings) { this.insertBom = JSONUtils.getBoolean(outputSettings, "insertBom", false); this.encoding = JSONUtils.getString(outputSettings, "encoding"); this.timestampPattern = JSONUtils.getString(outputSettings, "timestampPattern"); + this.compress = JSONUtils.getBoolean(outputSettings, "compress", false); } - public WebDataTransferOutputSettings(boolean insertBom, String encoding, String timestampPattern) { + public WebDataTransferOutputSettings(boolean insertBom, String encoding, String timestampPattern, boolean compress) { this.insertBom = insertBom; this.encoding = encoding; this.timestampPattern = timestampPattern; + this.compress = compress; } public boolean isInsertBom() { @@ -48,4 +51,8 @@ public class WebDataTransferOutputSettings { public String getTimestampPattern() { return timestampPattern; } + + public boolean isCompress() { + return compress; + } } diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferServlet.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferServlet.java index bbd1c7701b..8f180fcdee 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferServlet.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferServlet.java @@ -71,7 +71,7 @@ public class WebDataTransferServlet extends WebServiceServletBase { } else { fileName = taskInfo.getDataFileId(); } - + fileName = WebDataTransferUtils.normalizeFileName(fileName, taskInfo.getParameters().getOutputSettings()); Path dataFile = taskInfo.getDataFile(); session.addInfoMessage("Download data ..."); response.setHeader("Content-Type", processor.getContentType()); diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferUtils.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferUtils.java index ccae785511..09b7b6bbaf 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferUtils.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferUtils.java @@ -17,6 +17,7 @@ package io.cloudbeaver.service.data.transfer.impl; import io.cloudbeaver.model.session.WebSession; +import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor; import org.jkiss.dbeaver.tools.transfer.registry.DataTransferProcessorDescriptor; @@ -33,6 +34,13 @@ class WebDataTransferUtils { return CommonUtils.isEmpty(ext) ? "data" : ext; } + public static String normalizeFileName( + @NotNull String fileName, + @NotNull WebDataTransferOutputSettings outputSettings + ) { + return outputSettings.isCompress() ? fileName + ".zip" : fileName; + } + public static WebDataTransferSessionConfig getSessionDataTransferConfig(WebSession session) { return session.getAttribute("dataTransfer", x -> new WebDataTransferSessionConfig(), WebDataTransferSessionConfig::deleteExportFiles); } diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java index 69ceff8367..b350b62fa1 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java @@ -173,12 +173,16 @@ public class WebServiceDataTransfer implements DBWServiceDataTransfer { } throw new DBException("Error exporting data", e); } - WebDataTransferTaskConfig taskConfig = new WebDataTransferTaskConfig(exportFile, parameters); + Path finallyExportFile = parameters.getOutputSettings().isCompress() + ? exportFile.resolveSibling(WebDataTransferUtils.normalizeFileName( + exportFile.getFileName().toString(), parameters.getOutputSettings())) + : exportFile; + WebDataTransferTaskConfig taskConfig = new WebDataTransferTaskConfig(finallyExportFile, parameters); String exportFileName = CommonUtils.escapeFileName(CommonUtils.truncateString(dataContainer.getName(), 32)); taskConfig.setExportFileName(exportFileName); WebDataTransferUtils.getSessionDataTransferConfig(sqlProcessor.getWebSession()).addTask(taskConfig); - result = exportFile.getFileName().toString(); + result = finallyExportFile.getFileName().toString(); } catch (Throwable e) { throw new InvocationTargetException(e); } finally { @@ -223,6 +227,7 @@ public class WebServiceDataTransfer implements DBWServiceDataTransfer { WebDataTransferOutputSettings outputSettings = parameters.getOutputSettings(); settings.setOutputEncodingBOM(outputSettings.isInsertBom()); + settings.setCompressResults(outputSettings.isCompress()); if (!CommonUtils.isEmpty(outputSettings.getEncoding())) { settings.setOutputEncoding(outputSettings.getEncoding()); } diff --git a/webapp/packages/core-sdk/src/queries/data-transfer/getDataTransferDefaultParameters.gql b/webapp/packages/core-sdk/src/queries/data-transfer/getDataTransferDefaultParameters.gql index 6a94c6c834..970c46e805 100644 --- a/webapp/packages/core-sdk/src/queries/data-transfer/getDataTransferDefaultParameters.gql +++ b/webapp/packages/core-sdk/src/queries/data-transfer/getDataTransferDefaultParameters.gql @@ -1,10 +1,11 @@ query getDataTransferDefaultParameters { - settings: dataTransferDefaultExportSettings { - outputSettings { - insertBom - encoding - timestampPattern - } - supportedEncodings + settings: dataTransferDefaultExportSettings { + outputSettings { + insertBom + encoding + timestampPattern + compress } + supportedEncodings + } } diff --git a/webapp/packages/core-sdk/src/sdk.ts b/webapp/packages/core-sdk/src/sdk.ts index 230cfef66f..c635a2b57d 100644 --- a/webapp/packages/core-sdk/src/sdk.ts +++ b/webapp/packages/core-sdk/src/sdk.ts @@ -346,12 +346,14 @@ export interface DataTransferDefaultExportSettings { } export interface DataTransferOutputSettings { + compress: Scalars['Boolean']; encoding: Scalars['String']; insertBom: Scalars['Boolean']; timestampPattern: Scalars['String']; } export interface DataTransferOutputSettingsInput { + compress?: InputMaybe; encoding?: InputMaybe; insertBom?: InputMaybe; timestampPattern?: InputMaybe; @@ -2412,7 +2414,7 @@ export type ExportDataFromResultsQuery = { taskInfo: { id: string, name?: string export type GetDataTransferDefaultParametersQueryVariables = Exact<{ [key: string]: never; }>; -export type GetDataTransferDefaultParametersQuery = { settings: { supportedEncodings: Array, outputSettings: { insertBom: boolean, encoding: string, timestampPattern: string } } }; +export type GetDataTransferDefaultParametersQuery = { settings: { supportedEncodings: Array, outputSettings: { insertBom: boolean, encoding: string, timestampPattern: string, compress: boolean } } }; export type GetDataTransferProcessorsQueryVariables = Exact<{ [key: string]: never; }>; @@ -3974,6 +3976,7 @@ export const GetDataTransferDefaultParametersDocument = ` insertBom encoding timestampPattern + compress } supportedEncodings } diff --git a/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx b/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx index 4a5383887d..17cc1487a3 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx @@ -8,7 +8,7 @@ import { observer } from 'mobx-react-lite'; import styled, { css } from 'reshadow'; -import { BASE_CONTAINERS_STYLES, Combobox, Container, FieldCheckbox, Loader, useResource } from '@cloudbeaver/core-blocks'; +import { BASE_CONTAINERS_STYLES, Combobox, Container, FieldCheckbox, Loader, useResource, useTranslate } from '@cloudbeaver/core-blocks'; import type { DataTransferOutputSettings } from '@cloudbeaver/core-sdk'; import { DefaultExportOutputSettingsResource } from './DefaultExportOutputSettingsResource'; @@ -24,6 +24,8 @@ interface Props { } export const OutputOptionsForm = observer(function OutputOptionsForm(props: Props) { + const translate = useTranslate(); + const resource = useResource(OutputOptionsForm, DefaultExportOutputSettingsResource, undefined); return ( @@ -44,9 +46,14 @@ export const OutputOptionsForm = observer(function OutputOptionsForm(props: Prop Encoding - - Insert BOM - + + + Insert BOM + + + {translate('data_transfer_output_settings_compress')} + + , ); diff --git a/webapp/packages/plugin-data-export/src/locales/en.ts b/webapp/packages/plugin-data-export/src/locales/en.ts index 533819e1c7..46a1479da1 100644 --- a/webapp/packages/plugin-data-export/src/locales/en.ts +++ b/webapp/packages/plugin-data-export/src/locales/en.ts @@ -13,5 +13,7 @@ export default [ ['data_transfer_exporting_table', 'Table:'], ['data_transfer_exporting_sql', 'SQL:'], ['data_transfer_format_settings', 'Format'], + ['data_transfer_output_settings', 'Output'], + ['data_transfer_output_settings_compress', 'Compression'], ]; diff --git a/webapp/packages/plugin-data-export/src/locales/it.ts b/webapp/packages/plugin-data-export/src/locales/it.ts index c53e827cc2..9bd5c5619a 100644 --- a/webapp/packages/plugin-data-export/src/locales/it.ts +++ b/webapp/packages/plugin-data-export/src/locales/it.ts @@ -11,4 +11,6 @@ export default [ ['data_transfer_notification_delete', 'Elimina'], ['data_transfer_exporting_table', 'Tabella:'], ['data_transfer_exporting_sql', 'SQL:'], + + ['data_transfer_output_settings_compress', 'Compression'], ]; diff --git a/webapp/packages/plugin-data-export/src/locales/ru.ts b/webapp/packages/plugin-data-export/src/locales/ru.ts index 0d8b41ab09..053270ad89 100644 --- a/webapp/packages/plugin-data-export/src/locales/ru.ts +++ b/webapp/packages/plugin-data-export/src/locales/ru.ts @@ -12,4 +12,6 @@ export default [ ['data_transfer_notification_delete', 'Удалить'], ['data_transfer_exporting_table', 'Таблица:'], ['data_transfer_exporting_sql', 'SQL:'], + + ['data_transfer_output_settings_compress', 'Сжатие'], ]; diff --git a/webapp/packages/plugin-data-export/src/locales/zh.ts b/webapp/packages/plugin-data-export/src/locales/zh.ts index 045bc97bca..d01228165f 100644 --- a/webapp/packages/plugin-data-export/src/locales/zh.ts +++ b/webapp/packages/plugin-data-export/src/locales/zh.ts @@ -12,4 +12,6 @@ export default [ ['data_transfer_notification_delete', '删除'], ['data_transfer_exporting_table', '表:'], ['data_transfer_exporting_sql', 'SQL:'], + + ['data_transfer_output_settings_compress', 'Compression'], ];