diff --git a/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/AttributeTransformerSettingsDialog.java b/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/AttributeTransformerSettingsDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..b6fb5f04fced1722c0593ea9d85fc86719d84f4d --- /dev/null +++ b/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/AttributeTransformerSettingsDialog.java @@ -0,0 +1,162 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2021 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 org.jkiss.dbeaver.tools.transfer.ui.pages.database; + +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor; +import org.jkiss.dbeaver.runtime.properties.PropertySourceCustom; +import org.jkiss.dbeaver.tools.transfer.database.DatabaseMappingAttribute; +import org.jkiss.dbeaver.tools.transfer.registry.DataTransferAttributeTransformerDescriptor; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.dialogs.BaseDialog; +import org.jkiss.dbeaver.ui.properties.PropertyTreeViewer; + +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +class AttributeTransformerSettingsDialog extends BaseDialog { + + private static final Log log = Log.getLog(AttributeTransformerSettingsDialog.class); + + private final DatabaseMappingAttribute mapping; + private final DataTransferAttributeTransformerDescriptor transformer; + + private PropertyTreeViewer propertiesEditor; + private PropertySourceCustom propertySource; + + private Text infoText; + + public AttributeTransformerSettingsDialog(Shell parentShell, DatabaseMappingAttribute mapping, DataTransferAttributeTransformerDescriptor transformer) { + super(parentShell, "Transformer " + transformer.getName() + " settings", null); + this.mapping = mapping; + this.transformer = transformer; + } + + @Override + protected Composite createDialogArea(Composite parent) + { + Composite composite = super.createDialogArea(parent); + + createTransformSettingsArea(composite); + + updateTransformerInfo(); + + return parent; + } + + private void updateTransformerInfo() { + if (infoText != null) { + if (transformer != null && transformer.getDescription() != null) { + infoText.setText(transformer.getDescription()); + } else { + infoText.setText(""); + } + } + + if (transformer != null) { + Collection transformerProperties = transformer.getProperties(); + loadTransformerSettings(transformerProperties); + } else { + loadTransformerSettings(Collections.emptyList()); + } + } + + private void saveTransformerSettings() { + propertiesEditor.saveEditorValues(); + Map settings = mapping.getTransformerProperties(); + if (settings == null) { + settings = new LinkedHashMap<>(); + } + final Map properties = propertySource.getPropertiesWithDefaults(); + for (Map.Entry prop : properties.entrySet()) { + if (prop.getValue() != null) { + settings.put(prop.getKey(), prop.getValue()); + } + } + mapping.setTransformerProperties(settings); + } + + private void createTransformSettingsArea(Composite composite) { + Composite settingsPanel = UIUtils.createComposite(composite, 1); + if (composite.getLayout() instanceof GridLayout) { + settingsPanel.setLayoutData(new GridData(GridData.FILL_BOTH)); + } + final Composite placeholder = UIUtils.createComposite(settingsPanel, 2); + UIUtils.createLabelText(placeholder, "Transformer", transformer.getName(), SWT.READ_ONLY); + Label infoLabel = UIUtils.createControlLabel(placeholder, "Info"); + infoLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); + infoText = new Text(placeholder, SWT.READ_ONLY | SWT.WRAP); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.widthHint = 300; + infoText.setLayoutData(gd); + + propertiesEditor = new PropertyTreeViewer(settingsPanel, SWT.BORDER); + + propertiesEditor.getControl().setFocus(); + } + + private void loadTransformerSettings(Collection properties) { + Map transformOptions = mapping.getTransformerProperties(); + if (transformOptions == null) { + transformOptions = Collections.emptyMap(); + } + propertySource = new PropertySourceCustom( + properties, + transformOptions); + propertiesEditor.loadProperties(propertySource); + } + + @Override + protected void createButtonsForButtonBar(Composite parent) + { + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); + } + + @Override + public void create() { + super.create(); + + if (propertySource != null && propertySource.getProperties().length == 0) { + // No properties + UIUtils.asyncExec(this::okPressed); + } + } + + @Override + protected void okPressed() + { + saveTransformerSettings(); + + super.okPressed(); + } + + @Override + public boolean close() { + return super.close(); + } +} diff --git a/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/DatabaseConsumerPageMapping.java b/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/DatabaseConsumerPageMapping.java index fd55b2efa37f37127b5a112985914bd9683a861e..778981895581225a8abf2026a15800bb047c7adf 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/DatabaseConsumerPageMapping.java +++ b/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/DatabaseConsumerPageMapping.java @@ -16,6 +16,7 @@ */ package org.jkiss.dbeaver.tools.transfer.ui.pages.database; +import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.*; @@ -429,6 +430,31 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage { + IStructuredSelection selection = (IStructuredSelection) mappingViewer.getSelection(); + if (!selection.isEmpty()) { + Object element = selection.getFirstElement(); + if (element instanceof DatabaseMappingAttribute) { + DatabaseMappingAttribute mapping= (DatabaseMappingAttribute) element; + if (mapping.getTransformer() != null && !mapping.getTransformer().getProperties().isEmpty()) { + manager.add(new Action("Transformer settings ...") { + @Override + public void run() { + AttributeTransformerSettingsDialog settingsDialog = new AttributeTransformerSettingsDialog( + getShell(), + (DatabaseMappingAttribute) element, + mapping.getTransformer()); + if (settingsDialog.open() != IDialogConstants.OK_ID) { + return; + } + } + }); + } + } + } + UIUtils.fillDefaultTreeContextMenu(manager, mappingViewer.getTree()); + }); + { TreeViewerColumn columnSource = new TreeViewerColumn(mappingViewer, SWT.LEFT); columnSource.setLabelProvider(new MappingLabelProvider() { @@ -566,7 +592,8 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage options) throws DBException; diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingAttribute.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingAttribute.java index 85ad98c10e07797a47cc93be4fee11003ef52114..ea6e88d5fbeb6910f0a192f32a69638fab67fe3e 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingAttribute.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingAttribute.java @@ -25,6 +25,7 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.tools.transfer.registry.DataTransferAttributeTransformerDescriptor; +import org.jkiss.dbeaver.tools.transfer.registry.DataTransferRegistry; import org.jkiss.dbeaver.tools.transfer.stream.StreamDataImporterColumnInfo; import org.jkiss.utils.CommonUtils; @@ -277,7 +278,7 @@ public class DatabaseMappingAttribute implements DatabaseMappingObject { if (transformer != null) { settings.put("transformer", transformer.getId()); - settings.put("properties", new LinkedHashMap<>(transformerProperties)); + settings.put("transformerProperties", new LinkedHashMap<>(transformerProperties)); } } } @@ -309,6 +310,19 @@ public class DatabaseMappingAttribute implements DatabaseMappingObject { log.error(e); } } + Object transformerId = settings.get("transformer"); + if (transformerId != null) { + transformer = DataTransferRegistry.getInstance().getAttributeTransformer(transformerId.toString()); + if (transformer == null) { + log.error("Can't find attribute transformer " + transformerId); + } else { + Map tp = (Map) settings.get("transformerProperties"); + transformerProperties.clear(); + if (tp != null) { + transformerProperties.putAll(tp); + } + } + } } @Override diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferConsumer.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferConsumer.java index 9fb9b1f74caa971d35bba4ef53a3d0cb19475e82..9d1199c7b551cd8b17580bdb91a4bb41612d4e40 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferConsumer.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferConsumer.java @@ -40,6 +40,7 @@ import org.jkiss.dbeaver.model.struct.rdb.DBSManipulationType; import org.jkiss.dbeaver.model.struct.rdb.DBSSchema; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.runtime.ui.DBPPlatformUI; +import org.jkiss.dbeaver.tools.transfer.IDataTransferAttributeTransformer; import org.jkiss.dbeaver.tools.transfer.IDataTransferConsumer; import org.jkiss.dbeaver.tools.transfer.IDataTransferNodePrimary; import org.jkiss.dbeaver.tools.transfer.IDataTransferProcessor; @@ -78,6 +79,7 @@ public class DatabaseTransferConsumer implements IDataTransferConsumer previewRows; + private DBDAttributeBinding[] rsAttributes; public static class ColumnMapping { public DBDAttributeBinding sourceAttr; @@ -85,6 +87,8 @@ public class DatabaseTransferConsumer implements IDataTransferConsumer valueTransformerProperties; private ColumnMapping(DBDAttributeBinding sourceAttr) { this.sourceAttr = sourceAttr; @@ -160,7 +164,6 @@ public class DatabaseTransferConsumer implements IDataTransferConsumer properties = new ArrayList<>(); public DataTransferAttributeTransformerDescriptor(IConfigurationElement config) { @@ -49,6 +52,7 @@ public class DataTransferAttributeTransformerDescriptor extends AbstractDescript this.name = config.getAttribute("label"); this.description = config.getAttribute("description"); this.icon = iconToImage(config.getAttribute("icon"), DBIcon.TYPE_UNKNOWN); + this.implType = new ObjectType(config.getAttribute("class")); for (IConfigurationElement prop : config.getChildren(PropertyDescriptor.TAG_PROPERTY_GROUP)) { properties.addAll(PropertyDescriptor.extractProperties(prop)); @@ -80,6 +84,16 @@ public class DataTransferAttributeTransformerDescriptor extends AbstractDescript return properties; } + public IDataTransferAttributeTransformer createTransformer() throws DBException + { + try { + return implType.getObjectClass(IDataTransferAttributeTransformer.class) + .getDeclaredConstructor().newInstance(); + } catch (Throwable e) { + throw new DBException("Can't create attribute transformer instance", e); + } + } + @Override public String toString() { return id; diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/registry/DataTransferRegistry.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/registry/DataTransferRegistry.java index d3b9d8c835e5f52fb65bf5b61ce3c37c83020f67..80d9d0b701ce9d48b646de00c3f54bdfce73a4a8 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/registry/DataTransferRegistry.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/registry/DataTransferRegistry.java @@ -174,6 +174,6 @@ public class DataTransferRegistry { } public DataTransferAttributeTransformerDescriptor getAttributeTransformerByName(String tName) { - return transformers.values().stream().filter(t -> t.getName().equals(tName)).findFirst().get(); + return transformers.values().stream().filter(t -> t.getName().equals(tName)).findFirst().orElse(null); } } diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerConstant.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerConstant.java index b4c1db1aa2cd56f44ab299bf63ccca5d1d637834..1889ddf85468551c42066bbc17e1824d1785ae4e 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerConstant.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerConstant.java @@ -30,7 +30,7 @@ import java.util.Map; public class DataTransferTransformerConstant implements IDataTransferAttributeTransformer { @Override - public Object transformAttribute(@NotNull DBCSession session, @NotNull DBDAttributeBinding[] dataAttributes, @NotNull Object[] dataRow, @NotNull DBDAttributeBinding attribute, @NotNull Map options) throws DBException { + public Object transformAttribute(@NotNull DBCSession session, @NotNull DBDAttributeBinding[] dataAttributes, @NotNull Object[] dataRow, @NotNull DBDAttributeBinding attribute, Object attrValue, @NotNull Map options) throws DBException { return null; } diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerExpression.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerExpression.java index 7d5b30b89d89d644e89f41b4adda6eb947c0ba50..aa72969e26e1b9d4b532a9c557e9bde27d6cfa9d 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerExpression.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerExpression.java @@ -30,7 +30,7 @@ import java.util.Map; public class DataTransferTransformerExpression implements IDataTransferAttributeTransformer { @Override - public Object transformAttribute(@NotNull DBCSession session, @NotNull DBDAttributeBinding[] dataAttributes, @NotNull Object[] dataRow, @NotNull DBDAttributeBinding attribute, @NotNull Map options) throws DBException { + public Object transformAttribute(@NotNull DBCSession session, @NotNull DBDAttributeBinding[] dataAttributes, @NotNull Object[] dataRow, @NotNull DBDAttributeBinding attribute, Object attrValue, @NotNull Map options) throws DBException { return null; } diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerNull.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerNull.java index 9a36a7069051ea1d09e0cb3ac9d23075897b469a..721421d2ef32d6ef643b6693a7170f31700a9f11 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerNull.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/transformers/DataTransferTransformerNull.java @@ -30,7 +30,7 @@ import java.util.Map; public class DataTransferTransformerNull implements IDataTransferAttributeTransformer { @Override - public Object transformAttribute(@NotNull DBCSession session, @NotNull DBDAttributeBinding[] dataAttributes, @NotNull Object[] dataRow, @NotNull DBDAttributeBinding attribute, @NotNull Map options) throws DBException { + public Object transformAttribute(@NotNull DBCSession session, @NotNull DBDAttributeBinding[] dataAttributes, @NotNull Object[] dataRow, @NotNull DBDAttributeBinding attribute, Object attrValue, @NotNull Map options) throws DBException { return null; }