From 8bc4a683481f915ebadca5fbcdd933e9b4cf88e2 Mon Sep 17 00:00:00 2001 From: Aleksandr Skoblikov Date: Tue, 13 Sep 2022 14:44:05 +0300 Subject: [PATCH 1/9] CB-2328 data export output params --- .../schema/service.data.transfer.graphqls | 21 +++++++++++ .../data/transfer/DBWServiceDataTransfer.java | 2 ++ .../WebServiceBindingDataTransfer.java | 1 + .../WebDataTransferDefaultExportSettings.java | 29 +++++++++++++++ .../impl/WebDataTransferOutputSettings.java | 35 +++++++++++++++++++ .../impl/WebDataTransferParameters.java | 20 +++++++---- .../transfer/impl/WebServiceDataTransfer.java | 17 +++++++-- 7 files changed, 117 insertions(+), 8 deletions(-) create mode 100644 server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferDefaultExportSettings.java create mode 100644 server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferOutputSettings.java 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 f4ee2c59a5..773d47932b 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 @@ -14,6 +14,23 @@ type DataTransferProcessorInfo { isHTML: Boolean } +input DataTransferOutputSettingsInput { + insertBom: Boolean + encoding: Boolean + timestampPattern: Boolean +} + +type DataTransferOutputSettings { + insertBom: Boolean! + encoding: Boolean! + timestampPattern: Boolean! +} + +type DataTransferDefaultExportSettings { + outputSettings : DataTransferOutputSettings! + supportedEncodings: [String!]! +} + input DataTransferParameters { # Processor ID processorId: ID! @@ -22,6 +39,8 @@ input DataTransferParameters { settings: Object # Processor properties. See DataTransferProcessorInfo.properties processorProperties: Object! + # Consumer properties. See StreamConsumerSettings + outputSettings: DataTransferOutputSettingsInput # Data filter settings filter: SQLDataFilter } @@ -31,6 +50,8 @@ extend type Query { # Available transfer processors dataTransferAvailableStreamProcessors: [ DataTransferProcessorInfo! ]! + dataTransferDefaultExportSettings: DataTransferDefaultExportSettings! + dataTransferExportDataFromContainer( projectId: ID, connectionId: ID!, diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/DBWServiceDataTransfer.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/DBWServiceDataTransfer.java index 813433facc..4f158e3cc0 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/DBWServiceDataTransfer.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/DBWServiceDataTransfer.java @@ -21,6 +21,7 @@ import io.cloudbeaver.DBWebException; import io.cloudbeaver.WebAction; import io.cloudbeaver.model.WebAsyncTaskInfo; import io.cloudbeaver.model.session.WebSession; +import io.cloudbeaver.service.data.transfer.impl.WebDataTransferDefaultExportSettings; import io.cloudbeaver.service.data.transfer.impl.WebDataTransferParameters; import io.cloudbeaver.service.data.transfer.impl.WebDataTransferStreamProcessor; import io.cloudbeaver.service.sql.WebSQLContextInfo; @@ -51,4 +52,5 @@ public interface DBWServiceDataTransfer extends DBWService { @WebAction Boolean dataTransferRemoveDataFile(WebSession session, String dataFileId) throws DBWebException; + WebDataTransferDefaultExportSettings defaultExportSettings(); } diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/WebServiceBindingDataTransfer.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/WebServiceBindingDataTransfer.java index 2a552c9138..c87a5ad872 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/WebServiceBindingDataTransfer.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/WebServiceBindingDataTransfer.java @@ -56,6 +56,7 @@ public class WebServiceBindingDataTransfer extends WebServiceBindingBase getService(env).defaultExportSettings()) ; } 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 new file mode 100644 index 0000000000..0c0b6567eb --- /dev/null +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferDefaultExportSettings.java @@ -0,0 +1,29 @@ +package io.cloudbeaver.service.data.transfer.impl; + +import org.jkiss.dbeaver.tools.transfer.stream.StreamConsumerSettings; + +import java.nio.charset.Charset; +import java.util.Set; + +public class WebDataTransferDefaultExportSettings { + private final WebDataTransferOutputSettings outputSettings; + private final Set supportedEncodings; + + public WebDataTransferDefaultExportSettings() { + var defConsumerSettings = new StreamConsumerSettings(); + this.outputSettings = new WebDataTransferOutputSettings( + false, + defConsumerSettings.getOutputEncoding(), + defConsumerSettings.getOutputTimestampPattern() + ); + this.supportedEncodings = Charset.availableCharsets().keySet(); + } + + public WebDataTransferOutputSettings getOutputSettings() { + return outputSettings; + } + + public Set getSupportedEncodings() { + return supportedEncodings; + } +} 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 new file mode 100644 index 0000000000..71ff9b9b63 --- /dev/null +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferOutputSettings.java @@ -0,0 +1,35 @@ +package io.cloudbeaver.service.data.transfer.impl; + +import org.jkiss.dbeaver.model.data.json.JSONUtils; + +import java.util.Map; + +public class WebDataTransferOutputSettings { + private final boolean insertBom; + private final String encoding; + private final String timestampPattern; + + public WebDataTransferOutputSettings(Map outputSettings) { + this.insertBom = JSONUtils.getBoolean(outputSettings, "insertBom", false); + this.encoding = JSONUtils.getString(outputSettings, "encoding"); + this.timestampPattern = JSONUtils.getString(outputSettings, "timestampPattern"); + } + + public WebDataTransferOutputSettings(boolean insertBom, String encoding, String timestampPattern) { + this.insertBom = insertBom; + this.encoding = encoding; + this.timestampPattern = timestampPattern; + } + + public boolean isInsertBom() { + return insertBom; + } + + public String getEncoding() { + return encoding; + } + + public String getTimestampPattern() { + return timestampPattern; + } +} diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferParameters.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferParameters.java index d04362dbac..aba200b50c 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferParameters.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferParameters.java @@ -2,24 +2,28 @@ package io.cloudbeaver.service.data.transfer.impl; import io.cloudbeaver.service.sql.WebSQLDataFilter; import org.jkiss.dbeaver.model.data.json.JSONUtils; +import org.jkiss.dbeaver.tools.transfer.stream.StreamConsumerSettings; import java.util.Map; public class WebDataTransferParameters { private String processorId; - private Map settings; + private Map dbProducerSettings; private Map processorProperties; private WebSQLDataFilter filter; + private WebDataTransferOutputSettings outputSettings; public WebDataTransferParameters() { } public WebDataTransferParameters(Map params) { this.processorId = JSONUtils.getString(params, "processorId"); - this.settings = JSONUtils.getObject(params, "settings"); + this.dbProducerSettings = JSONUtils.getObject(params, "settings"); this.processorProperties = JSONUtils.getObject(params, "processorProperties"); this.filter = new WebSQLDataFilter(JSONUtils.getObject(params, "filter")); + + } public String getProcessorId() { @@ -30,12 +34,12 @@ public class WebDataTransferParameters { this.processorId = processorId; } - public Map getSettings() { - return settings; + public Map getDbProducerSettings() { + return dbProducerSettings; } - public void setSettings(Map settings) { - this.settings = settings; + public void setDbProducerSettings(Map dbProducerSettings) { + this.dbProducerSettings = dbProducerSettings; } public Map getProcessorProperties() { @@ -53,4 +57,8 @@ public class WebDataTransferParameters { public void setFilter(WebSQLDataFilter filter) { this.filter = filter; } + + public WebDataTransferOutputSettings getOutputSettings() { + return outputSettings; + } } \ No newline at end of file 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 81fc63357f..42bf3dfb54 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 @@ -142,6 +142,11 @@ public class WebServiceDataTransfer implements DBWServiceDataTransfer { return true; } + @Override + public WebDataTransferDefaultExportSettings defaultExportSettings() { + return new WebDataTransferDefaultExportSettings(); + } + private WebAsyncTaskInfo asyncExportFromDataContainer(WebSQLProcessor sqlProcessor, WebDataTransferParameters parameters, DBSDataContainer dataContainer, @Nullable WebSQLResultsInfo resultsInfo) { sqlProcessor.getWebSession().addInfoMessage("Export data"); @@ -213,10 +218,18 @@ public class WebServiceDataTransfer implements DBWServiceDataTransfer { StreamConsumerSettings settings = new StreamConsumerSettings(); - settings.setOutputEncodingBOM(false); settings.setOutputFolder(exportFile.getParent().toAbsolutePath().toString()); settings.setOutputFilePattern(exportFile.getFileName().toString()); + WebDataTransferOutputSettings outputSettings = parameters.getOutputSettings(); + settings.setOutputEncodingBOM(outputSettings.isInsertBom()); + if (!CommonUtils.isEmpty(outputSettings.getEncoding())) { + settings.setOutputEncoding(outputSettings.getEncoding()); + } + if (!CommonUtils.isEmpty(outputSettings.getTimestampPattern())) { + settings.setOutputTimestampPattern(outputSettings.getTimestampPattern()); + } + Map properties = new HashMap<>(); Map processorProperties = parameters.getProcessorProperties(); @@ -241,7 +254,7 @@ public class WebServiceDataTransfer implements DBWServiceDataTransfer { DatabaseProducerSettings producerSettings = new DatabaseProducerSettings(); producerSettings.setExtractType(DatabaseProducerSettings.ExtractType.SINGLE_QUERY); producerSettings.setQueryRowCount(false); - producerSettings.setOpenNewConnections(CommonUtils.getOption(parameters.getSettings(), "openNewConnection")); + producerSettings.setOpenNewConnections(CommonUtils.getOption(parameters.getDbProducerSettings(), "openNewConnection")); producer.transferData(monitor, consumer, null, producerSettings, null); From 5174ff65bada012d43be3caeadfaf22df7f51835 Mon Sep 17 00:00:00 2001 From: Aleksandr Skoblikov Date: Tue, 13 Sep 2022 14:54:19 +0300 Subject: [PATCH 2/9] CB-2328 copyright --- .../schema/service.data.transfer.graphqls | 8 ++++---- .../WebDataTransferDefaultExportSettings.java | 16 +++++++++++++++ .../impl/WebDataTransferOutputSettings.java | 16 +++++++++++++++ .../impl/WebDataTransferParameters.java | 20 ++++++++++++++++--- .../transfer/impl/WebDataTransferServlet.java | 16 +++++++++++++++ .../impl/WebDataTransferSessionConfig.java | 16 +++++++++++++++ .../impl/WebDataTransferStreamProcessor.java | 16 +++++++++++++++ .../impl/WebDataTransferTaskConfig.java | 16 +++++++++++++++ .../transfer/impl/WebDataTransferUtils.java | 16 +++++++++++++++ 9 files changed, 133 insertions(+), 7 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 773d47932b..aa3753cf01 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 @@ -16,14 +16,14 @@ type DataTransferProcessorInfo { input DataTransferOutputSettingsInput { insertBom: Boolean - encoding: Boolean - timestampPattern: Boolean + encoding: String + timestampPattern: String } type DataTransferOutputSettings { insertBom: Boolean! - encoding: Boolean! - timestampPattern: Boolean! + encoding: String! + timestampPattern: String! } 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 0c0b6567eb..5e9435998c 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 @@ -1,3 +1,19 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.cloudbeaver.service.data.transfer.impl; import org.jkiss.dbeaver.tools.transfer.stream.StreamConsumerSettings; 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 71ff9b9b63..b38596e936 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 @@ -1,3 +1,19 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.cloudbeaver.service.data.transfer.impl; import org.jkiss.dbeaver.model.data.json.JSONUtils; diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferParameters.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferParameters.java index aba200b50c..f257b395b1 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferParameters.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferParameters.java @@ -1,8 +1,23 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.cloudbeaver.service.data.transfer.impl; import io.cloudbeaver.service.sql.WebSQLDataFilter; import org.jkiss.dbeaver.model.data.json.JSONUtils; -import org.jkiss.dbeaver.tools.transfer.stream.StreamConsumerSettings; import java.util.Map; @@ -22,8 +37,7 @@ public class WebDataTransferParameters { this.dbProducerSettings = JSONUtils.getObject(params, "settings"); this.processorProperties = JSONUtils.getObject(params, "processorProperties"); this.filter = new WebSQLDataFilter(JSONUtils.getObject(params, "filter")); - - + this.outputSettings = new WebDataTransferOutputSettings(JSONUtils.getObject(params, "outputSettings")); } public String getProcessorId() { 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 623be196df..5cbd178ea9 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 @@ -1,3 +1,19 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.cloudbeaver.service.data.transfer.impl; import io.cloudbeaver.DBWebException; diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferSessionConfig.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferSessionConfig.java index 6b784471d2..e6e83ea5ff 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferSessionConfig.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferSessionConfig.java @@ -1,3 +1,19 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.cloudbeaver.service.data.transfer.impl; import java.util.HashMap; diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferStreamProcessor.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferStreamProcessor.java index 89a676d703..8f550113c5 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferStreamProcessor.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferStreamProcessor.java @@ -1,3 +1,19 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.cloudbeaver.service.data.transfer.impl; import io.cloudbeaver.model.WebPropertyInfo; diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferTaskConfig.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferTaskConfig.java index c56f0c73c2..89fd7521b1 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferTaskConfig.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebDataTransferTaskConfig.java @@ -1,3 +1,19 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.cloudbeaver.service.data.transfer.impl; import org.jkiss.dbeaver.Log; 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 40641112cf..d160307c56 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 @@ -1,3 +1,19 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.cloudbeaver.service.data.transfer.impl; import io.cloudbeaver.model.session.WebSession; From 9269ccd4340c4c1f7cbd0a88752a7bdd09364115 Mon Sep 17 00:00:00 2001 From: Konstantin Vasilev Date: Tue, 13 Sep 2022 11:44:17 +0300 Subject: [PATCH 3/9] CB-2511 feat(plugin-data-export): Add output options to export dialog --- .../src/Dialog/DataExportController.ts | 52 ++++++++++++- .../src/Dialog/DataExportDialog.tsx | 2 + .../src/Dialog/ProcessorConfigureDialog.tsx | 78 +++++++++++++++++-- .../Dialog/ProcessorConfigureDialogFooter.tsx | 31 ++++++-- 4 files changed, 146 insertions(+), 17 deletions(-) diff --git a/webapp/packages/plugin-data-export/src/Dialog/DataExportController.ts b/webapp/packages/plugin-data-export/src/Dialog/DataExportController.ts index 620cb11eab..aa1450b5dc 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/DataExportController.ts +++ b/webapp/packages/plugin-data-export/src/Dialog/DataExportController.ts @@ -13,7 +13,7 @@ import { injectable, IInitializableController, IDestructibleController } from '@ import { CommonDialogService } from '@cloudbeaver/core-dialogs'; import { NotificationService } from '@cloudbeaver/core-events'; import { ErrorDetailsDialog } from '@cloudbeaver/core-notifications'; -import { DataTransferProcessorInfo, GQLErrorCatcher } from '@cloudbeaver/core-sdk'; +import { DataTransferProcessorInfo, GQLErrorCatcher, ObjectPropertyInfo, ObjectPropertyLength } from '@cloudbeaver/core-sdk'; import { DataExportService } from '../DataExportService'; import type { IExportContext } from '../IExportContext'; @@ -44,6 +44,9 @@ export class DataExportController implements IInitializableController, IDestruct processorProperties: any = {}; properties: IProperty[] = []; + processorOutputProperties: Record = {}; + outputProperties: ObjectPropertyInfo[] = []; + readonly error = new GQLErrorCatcher(); private context!: IExportContext; @@ -62,6 +65,8 @@ export class DataExportController implements IInitializableController, IDestruct processors: computed, processorProperties: observable, properties: observable, + processorOutputProperties: observable, + outputProperties: observable, }); } @@ -123,6 +128,51 @@ export class DataExportController implements IInitializableController, IDestruct this.processorProperties = {}; + this.outputProperties = [{ + category: undefined, + dataType: 'String', + defaultValue: 'UTF-8', + description: 'Encoding', + displayName: 'Encoding', + features: [], + id: 'encoding', + length: ObjectPropertyLength.Short, + order: 1, + validValues: ['UTF-8', 'CP1251'], + value: null, + }, { + category: undefined, + dataType: 'String', + defaultValue: 'yyyyMMddHHmm', + description: 'Timestamp pattern', + displayName: 'Timestamp pattern', + features: [], + id: 'timestamp', + length: ObjectPropertyLength.Long, + order: 2, + validValues: undefined, + value: null, + }, { + category: undefined, + dataType: 'Boolean', + defaultValue: null, + description: 'Insert BOM', + displayName: 'Insert BOM', + features: [], + id: 'insertBOM', + length: ObjectPropertyLength.Long, + order: 3, + validValues: undefined, + value: null, + }]; + + this.processorOutputProperties = this.outputProperties.reduce((acc, property) => { + if (property.id) { + acc[property.id] = property.defaultValue; + } + return acc; + }, {} as Record); + this.step = DataExportStep.Configure; this.error.clear(); }; diff --git a/webapp/packages/plugin-data-export/src/Dialog/DataExportDialog.tsx b/webapp/packages/plugin-data-export/src/Dialog/DataExportDialog.tsx index 46aef14ae9..9e99706568 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/DataExportDialog.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/DataExportDialog.tsx @@ -28,6 +28,8 @@ export const DataExportDialog: DialogComponent = observer(functi processor={controller.processor} properties={controller.properties} processorProperties={controller.processorProperties} + outputProperties={controller.outputProperties} + processorOutputProperties={controller.processorOutputProperties} error={controller.error} isExporting={controller.isExporting} onShowDetails={controller.showDetails} diff --git a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx index 1c2629b1c1..28979fcaee 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx @@ -7,13 +7,15 @@ */ import { observer } from 'mobx-react-lite'; +import { useState } from 'react'; import styled, { css } from 'reshadow'; -import { IProperty, PropertiesTable, ErrorMessage } from '@cloudbeaver/core-blocks'; +import { IProperty, PropertiesTable, ErrorMessage, ObjectPropertyInfoForm } from '@cloudbeaver/core-blocks'; import { CommonDialogWrapper } from '@cloudbeaver/core-dialogs'; import { useTranslate } from '@cloudbeaver/core-localization'; -import type { DataTransferProcessorInfo, GQLErrorCatcher } from '@cloudbeaver/core-sdk'; +import type { DataTransferProcessorInfo, GQLErrorCatcher, ObjectPropertyInfo } from '@cloudbeaver/core-sdk'; import { useStyles } from '@cloudbeaver/core-theming'; +import { ITabData, Tab, TabList, TabsState, UNDERLINE_TAB_STYLES } from '@cloudbeaver/core-ui'; import { ProcessorConfigureDialogFooter } from './ProcessorConfigureDialogFooter'; @@ -34,12 +36,26 @@ const styles = css` bottom: 0; padding: 8px 24px; } + + TabList { + margin: 0 10px; + } + + content { + margin: 0 24px; + } + + ObjectPropertyInfoForm { + margin: 12px 0; + } `; interface Props { processor: DataTransferProcessorInfo; properties: IProperty[]; processorProperties: any; + outputProperties: ObjectPropertyInfo[]; + processorOutputProperties: Record; error: GQLErrorCatcher; isExporting: boolean; onShowDetails: () => void; @@ -48,10 +64,17 @@ interface Props { onExport: () => void; } +enum SETTINGS_TABS { + EXTRACTION = 'EXTRACTION', + OUTPUT = 'OUTPUT', +} + export const ProcessorConfigureDialog = observer(function ProcessorConfigureDialog({ processor, properties, processorProperties, + outputProperties, + processorOutputProperties, error, isExporting, onShowDetails, @@ -61,17 +84,36 @@ export const ProcessorConfigureDialog = observer(function ProcessorConfig }) { const translate = useTranslate(); const title = `${translate('data_transfer_dialog_configuration_title')} (${processor.name})`; + const [currentTabId, setCurrentTabId] = useState(SETTINGS_TABS.EXTRACTION); - return styled(useStyles(styles))( + function handleTabChange(tab: ITabData) { + setCurrentTabId(tab.tabId as SETTINGS_TABS); + } + + function handleNextClick() { + setCurrentTabId(SETTINGS_TABS.OUTPUT); + } + + function handleBackClick() { + if (currentTabId === SETTINGS_TABS.OUTPUT) { + setCurrentTabId(SETTINGS_TABS.EXTRACTION); + } else { + onBack(); + } + } + + return styled(useStyles(UNDERLINE_TAB_STYLES, styles))( )} fixedSize @@ -79,10 +121,30 @@ export const ProcessorConfigureDialog = observer(function ProcessorConfig noBodyPadding onReject={onClose} > - + + + + Extraction + + + Output + + + + {currentTabId === SETTINGS_TABS.EXTRACTION ? ( + + ) : ( + + + + )} + {error.responseMessage && ( void; onExport: () => void; onBack: () => void; + onNext: () => void; } export const ProcessorConfigureDialogFooter = observer(function ProcessorConfigureDialogFooter({ isExporting, + isFinalStep, onCancel, onExport, onBack, + onNext, }) { const translate = useTranslate(); @@ -64,14 +68,25 @@ export const ProcessorConfigureDialogFooter = observer(function Processor > {translate('ui_processing_cancel')} - + {isFinalStep ? ( + + ) : ( + + )} ); } From 83b18ed907aea971e05de20b4462afce02c6e97b Mon Sep 17 00:00:00 2001 From: Konstantin Vasilev Date: Tue, 13 Sep 2022 11:49:28 +0300 Subject: [PATCH 4/9] CB-2511 feat(plugin-data-export): Add translations --- .../src/Dialog/ProcessorConfigureDialog.tsx | 5 +++-- webapp/packages/plugin-data-export/src/locales/en.ts | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx index 28979fcaee..a6a54d95c3 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx @@ -26,6 +26,7 @@ const styles = css` PropertiesTable { flex: 1; overflow: hidden; + padding: 12px 0; } message { margin: auto; @@ -124,10 +125,10 @@ export const ProcessorConfigureDialog = observer(function ProcessorConfig - Extraction + {translate('data_transfer_extraction_settings')} - Output + {translate('data_transfer_output')} diff --git a/webapp/packages/plugin-data-export/src/locales/en.ts b/webapp/packages/plugin-data-export/src/locales/en.ts index 9566e31bb5..f3876cc2da 100644 --- a/webapp/packages/plugin-data-export/src/locales/en.ts +++ b/webapp/packages/plugin-data-export/src/locales/en.ts @@ -12,4 +12,6 @@ export default [ ['data_transfer_notification_delete', 'Delete'], ['data_transfer_exporting_table', 'Table:'], ['data_transfer_exporting_sql', 'SQL:'], + ['data_transfer_extraction_settings', 'Extraction'], + ['data_transfer_output', 'Output'], ]; From f47f03399b320dc2a92325a97708a7d4245f2568 Mon Sep 17 00:00:00 2001 From: Konstantin Vasilev Date: Tue, 13 Sep 2022 13:07:43 +0300 Subject: [PATCH 5/9] CB-2511 feat(plugin-data-export): Fix export tabs names --- .../src/Dialog/ProcessorConfigureDialog.tsx | 4 ++-- webapp/packages/plugin-data-export/src/locales/en.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx index a6a54d95c3..331d6430f3 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx @@ -125,10 +125,10 @@ export const ProcessorConfigureDialog = observer(function ProcessorConfig - {translate('data_transfer_extraction_settings')} + {translate('data_transfer_format_settings')} - {translate('data_transfer_output')} + {translate('data_transfer_output_settings')} diff --git a/webapp/packages/plugin-data-export/src/locales/en.ts b/webapp/packages/plugin-data-export/src/locales/en.ts index f3876cc2da..533819e1c7 100644 --- a/webapp/packages/plugin-data-export/src/locales/en.ts +++ b/webapp/packages/plugin-data-export/src/locales/en.ts @@ -12,6 +12,6 @@ export default [ ['data_transfer_notification_delete', 'Delete'], ['data_transfer_exporting_table', 'Table:'], ['data_transfer_exporting_sql', 'SQL:'], - ['data_transfer_extraction_settings', 'Extraction'], - ['data_transfer_output', 'Output'], + ['data_transfer_format_settings', 'Format'], + ['data_transfer_output_settings', 'Output'], ]; From c10d30a36ec1094b3904bed04ced327d84540694 Mon Sep 17 00:00:00 2001 From: Konstantin Vasilev Date: Wed, 14 Sep 2022 09:53:39 +0300 Subject: [PATCH 6/9] CB-2511 feat(plugin-data-export): Add export output options dialog --- .../src/Dialog/OutputOptionsForm.tsx | 48 +++++++++++++++++++ .../src/Dialog/ProcessorConfigureDialog.tsx | 8 ++-- 2 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx diff --git a/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx b/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx new file mode 100644 index 0000000000..9dcfddc0ab --- /dev/null +++ b/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx @@ -0,0 +1,48 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ +import styled, { css, use } from 'reshadow'; + +import { Combobox, FieldCheckbox, InputField } from '@cloudbeaver/core-blocks'; + +const styles = css` + Combobox { + width: 140px; + } + + row { + display: flex; + align-items: end; + margin-bottom: 24px; + } + + FieldCheckbox { + margin-bottom: 6px; + margin-left: 24px + } +`; + +export function OutputOptionsForm() { + return styled(styles)( + <> + + + Encoding + + + Insert BOM + + + + Filename timestamp pattern + + + ); +} \ No newline at end of file diff --git a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx index 331d6430f3..6db7b28bb0 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx @@ -17,6 +17,7 @@ import type { DataTransferProcessorInfo, GQLErrorCatcher, ObjectPropertyInfo } f import { useStyles } from '@cloudbeaver/core-theming'; import { ITabData, Tab, TabList, TabsState, UNDERLINE_TAB_STYLES } from '@cloudbeaver/core-ui'; +import { OutputOptionsForm } from './OutputOptionsForm'; import { ProcessorConfigureDialogFooter } from './ProcessorConfigureDialogFooter'; const styles = css` @@ -43,7 +44,7 @@ const styles = css` } content { - margin: 0 24px; + margin: 24px; } ObjectPropertyInfoForm { @@ -139,10 +140,11 @@ export const ProcessorConfigureDialog = observer(function ProcessorConfig /> ) : ( - + {/* + /> */} )} From e37222dd088d45318adf6ccd629d978c62fd070e Mon Sep 17 00:00:00 2001 From: Konstantin Vasilev Date: Wed, 14 Sep 2022 13:22:15 +0300 Subject: [PATCH 7/9] CB-2511 feat(plugin-data-export): Add default export properties --- .../getDataTransferDefaultParameters.gql | 10 +++ webapp/packages/core-sdk/src/sdk.ts | 39 ++++++++++ .../src/Dialog/DataExportController.ts | 70 +++++------------- .../src/Dialog/DataExportDialog.tsx | 3 +- .../DefaultExportOutputSettingsResource.ts | 27 +++++++ .../src/Dialog/OutputOptionsForm.tsx | 71 +++++++++++++------ .../src/Dialog/ProcessorConfigureDialog.tsx | 10 ++- .../plugin-data-export/src/manifest.ts | 2 + 8 files changed, 153 insertions(+), 79 deletions(-) create mode 100644 webapp/packages/core-sdk/src/queries/data-transfer/getDataTransferDefaultParameters.gql create mode 100644 webapp/packages/plugin-data-export/src/Dialog/DefaultExportOutputSettingsResource.ts diff --git a/webapp/packages/core-sdk/src/queries/data-transfer/getDataTransferDefaultParameters.gql b/webapp/packages/core-sdk/src/queries/data-transfer/getDataTransferDefaultParameters.gql new file mode 100644 index 0000000000..6a94c6c834 --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/data-transfer/getDataTransferDefaultParameters.gql @@ -0,0 +1,10 @@ +query getDataTransferDefaultParameters { + settings: dataTransferDefaultExportSettings { + outputSettings { + insertBom + encoding + timestampPattern + } + supportedEncodings + } +} diff --git a/webapp/packages/core-sdk/src/sdk.ts b/webapp/packages/core-sdk/src/sdk.ts index 8fc381bcd3..1c03cd0086 100644 --- a/webapp/packages/core-sdk/src/sdk.ts +++ b/webapp/packages/core-sdk/src/sdk.ts @@ -222,8 +222,26 @@ export interface ConnectionInfo { useUrl: Scalars['Boolean']; } +export interface DataTransferDefaultExportSettings { + outputSettings: DataTransferOutputSettings; + supportedEncodings: Array; +} + +export interface DataTransferOutputSettings { + encoding: Scalars['String']; + insertBom: Scalars['Boolean']; + timestampPattern: Scalars['String']; +} + +export interface DataTransferOutputSettingsInput { + encoding?: InputMaybe; + insertBom?: InputMaybe; + timestampPattern?: InputMaybe; +} + export interface DataTransferParameters { filter?: InputMaybe; + outputSettings?: InputMaybe; processorId: Scalars['ID']; processorProperties: Scalars['Object']; settings?: InputMaybe; @@ -830,6 +848,7 @@ export interface Query { createRole: AdminRoleInfo; createUser: AdminUserInfo; dataTransferAvailableStreamProcessors: Array; + dataTransferDefaultExportSettings: DataTransferDefaultExportSettings; dataTransferExportDataFromContainer: AsyncTaskInfo; dataTransferExportDataFromResults: AsyncTaskInfo; dataTransferRemoveDataFile?: Maybe; @@ -2135,6 +2154,11 @@ export type ExportDataFromResultsQueryVariables = Exact<{ export type ExportDataFromResultsQuery = { taskInfo: { id: string, name?: string, running: boolean, status?: string, taskResult?: any, error?: { message?: string, errorCode?: string, errorType?: string, stackTrace?: string } } }; +export type GetDataTransferDefaultParametersQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetDataTransferDefaultParametersQuery = { settings: { supportedEncodings: Array, outputSettings: { insertBom: boolean, encoding: string, timestampPattern: string } } }; + export type GetDataTransferProcessorsQueryVariables = Exact<{ [key: string]: never; }>; @@ -3506,6 +3530,18 @@ export const ExportDataFromResultsDocument = ` } } ${AsyncTaskInfoFragmentDoc}`; +export const GetDataTransferDefaultParametersDocument = ` + query getDataTransferDefaultParameters { + settings: dataTransferDefaultExportSettings { + outputSettings { + insertBom + encoding + timestampPattern + } + supportedEncodings + } +} + `; export const GetDataTransferProcessorsDocument = ` query getDataTransferProcessors { processors: dataTransferAvailableStreamProcessors { @@ -4326,6 +4362,9 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = exportDataFromResults(variables: ExportDataFromResultsQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { return withWrapper((wrappedRequestHeaders) => client.request(ExportDataFromResultsDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'exportDataFromResults', 'query'); }, + getDataTransferDefaultParameters(variables?: GetDataTransferDefaultParametersQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { + return withWrapper((wrappedRequestHeaders) => client.request(GetDataTransferDefaultParametersDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'getDataTransferDefaultParameters', 'query'); + }, getDataTransferProcessors(variables?: GetDataTransferProcessorsQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { return withWrapper((wrappedRequestHeaders) => client.request(GetDataTransferProcessorsDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'getDataTransferProcessors', 'query'); }, diff --git a/webapp/packages/plugin-data-export/src/Dialog/DataExportController.ts b/webapp/packages/plugin-data-export/src/Dialog/DataExportController.ts index aa1450b5dc..294eb558e0 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/DataExportController.ts +++ b/webapp/packages/plugin-data-export/src/Dialog/DataExportController.ts @@ -13,10 +13,11 @@ import { injectable, IInitializableController, IDestructibleController } from '@ import { CommonDialogService } from '@cloudbeaver/core-dialogs'; import { NotificationService } from '@cloudbeaver/core-events'; import { ErrorDetailsDialog } from '@cloudbeaver/core-notifications'; -import { DataTransferProcessorInfo, GQLErrorCatcher, ObjectPropertyInfo, ObjectPropertyLength } from '@cloudbeaver/core-sdk'; +import { DataTransferOutputSettings, DataTransferProcessorInfo, GQLErrorCatcher, ObjectPropertyInfo, ObjectPropertyLength } from '@cloudbeaver/core-sdk'; import { DataExportService } from '../DataExportService'; import type { IExportContext } from '../IExportContext'; +import { DefaultExportOutputSettingsResource } from './DefaultExportOutputSettingsResource'; export enum DataExportStep { DataTransferProcessor, @@ -44,8 +45,7 @@ export class DataExportController implements IInitializableController, IDestruct processorProperties: any = {}; properties: IProperty[] = []; - processorOutputProperties: Record = {}; - outputProperties: ObjectPropertyInfo[] = []; + outputSettings: Partial = {}; readonly error = new GQLErrorCatcher(); @@ -56,7 +56,8 @@ export class DataExportController implements IInitializableController, IDestruct constructor( private readonly dataExportService: DataExportService, private readonly notificationService: NotificationService, - private readonly commonDialogService: CommonDialogService + private readonly commonDialogService: CommonDialogService, + private readonly defaultExportOutputSettingsResource: DefaultExportOutputSettingsResource, ) { makeObservable(this, { step: observable, @@ -65,8 +66,7 @@ export class DataExportController implements IInitializableController, IDestruct processors: computed, processorProperties: observable, properties: observable, - processorOutputProperties: observable, - outputProperties: observable, + outputSettings: observable, }); } @@ -74,6 +74,7 @@ export class DataExportController implements IInitializableController, IDestruct this.context = context; this.close = close; this.loadProcessors(); + this.loadDefaultOutputSettings(); } destruct(): void { @@ -93,6 +94,7 @@ export class DataExportController implements IInitializableController, IDestruct processorId: this.processor.id, processorProperties: this.processorProperties, filter: this.context.filter, + outputSettings: this.outputSettings, } ); this.close(); @@ -128,51 +130,6 @@ export class DataExportController implements IInitializableController, IDestruct this.processorProperties = {}; - this.outputProperties = [{ - category: undefined, - dataType: 'String', - defaultValue: 'UTF-8', - description: 'Encoding', - displayName: 'Encoding', - features: [], - id: 'encoding', - length: ObjectPropertyLength.Short, - order: 1, - validValues: ['UTF-8', 'CP1251'], - value: null, - }, { - category: undefined, - dataType: 'String', - defaultValue: 'yyyyMMddHHmm', - description: 'Timestamp pattern', - displayName: 'Timestamp pattern', - features: [], - id: 'timestamp', - length: ObjectPropertyLength.Long, - order: 2, - validValues: undefined, - value: null, - }, { - category: undefined, - dataType: 'Boolean', - defaultValue: null, - description: 'Insert BOM', - displayName: 'Insert BOM', - features: [], - id: 'insertBOM', - length: ObjectPropertyLength.Long, - order: 3, - validValues: undefined, - value: null, - }]; - - this.processorOutputProperties = this.outputProperties.reduce((acc, property) => { - if (property.id) { - acc[property.id] = property.defaultValue; - } - return acc; - }, {} as Record); - this.step = DataExportStep.Configure; this.error.clear(); }; @@ -190,6 +147,17 @@ export class DataExportController implements IInitializableController, IDestruct this.notificationService.logException(exception, 'Can\'t load data export processors'); } } + + private async loadDefaultOutputSettings() { + try { + const data = await this.defaultExportOutputSettingsResource.load(); + if (data) { + Object.assign(this.outputSettings, data.outputSettings); + } + } catch (exception: any) { + this.notificationService.logException(exception, 'Can\'t load output settings'); + } + } } function sortProcessors(processorA: DataTransferProcessorInfo, processorB: DataTransferProcessorInfo): number { diff --git a/webapp/packages/plugin-data-export/src/Dialog/DataExportDialog.tsx b/webapp/packages/plugin-data-export/src/Dialog/DataExportDialog.tsx index 9e99706568..3bf7608071 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/DataExportDialog.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/DataExportDialog.tsx @@ -28,10 +28,9 @@ export const DataExportDialog: DialogComponent = observer(functi processor={controller.processor} properties={controller.properties} processorProperties={controller.processorProperties} - outputProperties={controller.outputProperties} - processorOutputProperties={controller.processorOutputProperties} error={controller.error} isExporting={controller.isExporting} + outputSettings={controller.outputSettings} onShowDetails={controller.showDetails} onBack={() => controller.setStep(DataExportStep.DataTransferProcessor)} onClose={rejectDialog} diff --git a/webapp/packages/plugin-data-export/src/Dialog/DefaultExportOutputSettingsResource.ts b/webapp/packages/plugin-data-export/src/Dialog/DefaultExportOutputSettingsResource.ts new file mode 100644 index 0000000000..af40f3454a --- /dev/null +++ b/webapp/packages/plugin-data-export/src/Dialog/DefaultExportOutputSettingsResource.ts @@ -0,0 +1,27 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { injectable } from '@cloudbeaver/core-di'; +import { + GraphQLService, + CachedDataResource, + DataTransferDefaultExportSettings +} from '@cloudbeaver/core-sdk'; + +@injectable() +export class DefaultExportOutputSettingsResource + extends CachedDataResource { + + constructor(private readonly graphQLService: GraphQLService) { + super(null); + } + + async loader() { + return (await this.graphQLService.sdk.getDataTransferDefaultParameters()).settings; + } +} \ No newline at end of file diff --git a/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx b/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx index 9dcfddc0ab..a9809a3582 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx @@ -5,9 +5,13 @@ * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. */ +import { observer } from 'mobx-react-lite'; import styled, { css, use } from 'reshadow'; -import { Combobox, FieldCheckbox, InputField } from '@cloudbeaver/core-blocks'; +import { Combobox, FieldCheckbox, InputField, Loader, useDataResource } from '@cloudbeaver/core-blocks'; +import type { DataTransferOutputSettings } from '@cloudbeaver/core-sdk'; + +import { DefaultExportOutputSettingsResource } from './DefaultExportOutputSettingsResource'; const styles = css` Combobox { @@ -26,23 +30,50 @@ const styles = css` } `; -export function OutputOptionsForm() { - return styled(styles)( - <> - - - Encoding - - - Insert BOM - - - - Filename timestamp pattern - - +interface Props { + outputSettings: Partial; +} + +export const OutputOptionsForm = observer(function OutputOptionsForm(props: Props) { + const resource = useDataResource(OutputOptionsForm, DefaultExportOutputSettingsResource, undefined); + + return ( + + {() => { + const data = resource.data; + + if (!data) { + return null; + } + + return styled(styles)( + <> + + + Encoding + + + Insert BOM + + + + Filename timestamp pattern + + + ); + }} + ); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx index 6db7b28bb0..99940e945c 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx @@ -13,7 +13,7 @@ import styled, { css } from 'reshadow'; import { IProperty, PropertiesTable, ErrorMessage, ObjectPropertyInfoForm } from '@cloudbeaver/core-blocks'; import { CommonDialogWrapper } from '@cloudbeaver/core-dialogs'; import { useTranslate } from '@cloudbeaver/core-localization'; -import type { DataTransferProcessorInfo, GQLErrorCatcher, ObjectPropertyInfo } from '@cloudbeaver/core-sdk'; +import type { DataTransferOutputSettings, DataTransferProcessorInfo, GQLErrorCatcher, ObjectPropertyInfo } from '@cloudbeaver/core-sdk'; import { useStyles } from '@cloudbeaver/core-theming'; import { ITabData, Tab, TabList, TabsState, UNDERLINE_TAB_STYLES } from '@cloudbeaver/core-ui'; @@ -56,8 +56,7 @@ interface Props { processor: DataTransferProcessorInfo; properties: IProperty[]; processorProperties: any; - outputProperties: ObjectPropertyInfo[]; - processorOutputProperties: Record; + outputSettings: Partial; error: GQLErrorCatcher; isExporting: boolean; onShowDetails: () => void; @@ -75,8 +74,7 @@ export const ProcessorConfigureDialog = observer(function ProcessorConfig processor, properties, processorProperties, - outputProperties, - processorOutputProperties, + outputSettings, error, isExporting, onShowDetails, @@ -140,7 +138,7 @@ export const ProcessorConfigureDialog = observer(function ProcessorConfig /> ) : ( - + {/* Date: Wed, 14 Sep 2022 16:34:06 +0300 Subject: [PATCH 8/9] CB-2511 feat(plugin-data-export): Disable export form for binary processors --- .../DefaultExportOutputSettingsResource.ts | 2 +- .../src/Dialog/OutputOptionsForm.tsx | 47 ++++++++----------- .../src/Dialog/ProcessorConfigureDialog.tsx | 44 +++++++---------- 3 files changed, 37 insertions(+), 56 deletions(-) diff --git a/webapp/packages/plugin-data-export/src/Dialog/DefaultExportOutputSettingsResource.ts b/webapp/packages/plugin-data-export/src/Dialog/DefaultExportOutputSettingsResource.ts index af40f3454a..cbf233cfd4 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/DefaultExportOutputSettingsResource.ts +++ b/webapp/packages/plugin-data-export/src/Dialog/DefaultExportOutputSettingsResource.ts @@ -24,4 +24,4 @@ export class DefaultExportOutputSettingsResource async loader() { return (await this.graphQLService.sdk.getDataTransferDefaultParameters()).settings; } -} \ No newline at end of file +} diff --git a/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx b/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx index a9809a3582..078cbd50b8 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/OutputOptionsForm.tsx @@ -6,9 +6,9 @@ * you may not use this file except in compliance with the License. */ import { observer } from 'mobx-react-lite'; -import styled, { css, use } from 'reshadow'; +import styled, { css } from 'reshadow'; -import { Combobox, FieldCheckbox, InputField, Loader, useDataResource } from '@cloudbeaver/core-blocks'; +import { Combobox, FieldCheckbox, Loader, useDataResource } from '@cloudbeaver/core-blocks'; import type { DataTransferOutputSettings } from '@cloudbeaver/core-sdk'; import { DefaultExportOutputSettingsResource } from './DefaultExportOutputSettingsResource'; @@ -18,10 +18,10 @@ const styles = css` width: 140px; } - row { + root { + padding: 24px; display: flex; align-items: end; - margin-bottom: 24px; } FieldCheckbox { @@ -47,33 +47,24 @@ export const OutputOptionsForm = observer(function OutputOptionsForm(props: Prop } return styled(styles)( - <> - - - Encoding - - - Insert BOM - - - + - Filename timestamp pattern - - + Encoding + + + Insert BOM + + ); }} ); -}); \ No newline at end of file +}); diff --git a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx index 99940e945c..0d0d28ae83 100644 --- a/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx +++ b/webapp/packages/plugin-data-export/src/Dialog/ProcessorConfigureDialog.tsx @@ -5,15 +5,14 @@ * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. */ - import { observer } from 'mobx-react-lite'; import { useState } from 'react'; import styled, { css } from 'reshadow'; -import { IProperty, PropertiesTable, ErrorMessage, ObjectPropertyInfoForm } from '@cloudbeaver/core-blocks'; +import { IProperty, PropertiesTable, ErrorMessage } from '@cloudbeaver/core-blocks'; import { CommonDialogWrapper } from '@cloudbeaver/core-dialogs'; import { useTranslate } from '@cloudbeaver/core-localization'; -import type { DataTransferOutputSettings, DataTransferProcessorInfo, GQLErrorCatcher, ObjectPropertyInfo } from '@cloudbeaver/core-sdk'; +import type { DataTransferOutputSettings, DataTransferProcessorInfo, GQLErrorCatcher } from '@cloudbeaver/core-sdk'; import { useStyles } from '@cloudbeaver/core-theming'; import { ITabData, Tab, TabList, TabsState, UNDERLINE_TAB_STYLES } from '@cloudbeaver/core-ui'; @@ -43,10 +42,6 @@ const styles = css` margin: 0 10px; } - content { - margin: 24px; - } - ObjectPropertyInfoForm { margin: 12px 0; } @@ -109,7 +104,7 @@ export const ProcessorConfigureDialog = observer(function ProcessorConfig footer={( (function ProcessorConfig noBodyPadding onReject={onClose} > - - - - {translate('data_transfer_format_settings')} - - - {translate('data_transfer_output_settings')} - - - + {!processor.isBinary ? ( + + + + {translate('data_transfer_format_settings')} + + + {translate('data_transfer_output_settings')} + + + + ) : null} {currentTabId === SETTINGS_TABS.EXTRACTION ? ( ) : ( - - - {/* */} - + )} {error.responseMessage && ( @@ -155,5 +146,4 @@ export const ProcessorConfigureDialog = observer(function ProcessorConfig )} ); -} -); +}); From e2dee49dc6be02ccbc5a42ddc122de61078ec7f5 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Fri, 16 Sep 2022 09:13:11 +0200 Subject: [PATCH 9/9] Driver file resolution fix --- .../src/io/cloudbeaver/server/CBPlatform.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java index 8aabe975f3..f2000e8d37 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBPlatform.java @@ -293,16 +293,20 @@ public class CBPlatform extends BasePlatformImpl { if (!WebDriverRegistry.getInstance().isDriverEnabled(driver)) { continue; } - boolean hasAllFiles = true; + boolean hasAllFiles = true, hasJars = false; for (DBPDriverLibrary lib : libraries) { if (!lib.isOptional() && lib.getType() != DBPDriverLibrary.FileType.license && - (lib.getLocalFile() == null || !Files.exists(lib.getLocalFile()))) { + (lib.getLocalFile() == null || !Files.exists(lib.getLocalFile()))) + { hasAllFiles = false; log.error("\tDriver '" + driver.getId() + "' is missing library '" + lib.getDisplayName() + "'"); - break; + } else { + if (lib.getType() == DBPDriverLibrary.FileType.jar) { + hasJars = true; + } } } - if (hasAllFiles) { + if (hasAllFiles || hasJars) { applicableDrivers.add(driver); } }