diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferNodeDescriptor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferNodeDescriptor.java index dd5365c0d8b66c3a1f06a9a83f858e9144667df7..1050b8001909f8666b01a2056f2bacc200408990 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferNodeDescriptor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferNodeDescriptor.java @@ -17,6 +17,7 @@ package org.jkiss.dbeaver.registry.transfer; +import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.jface.wizard.IWizardPage; import org.jkiss.code.NotNull; @@ -25,6 +26,7 @@ import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBIcon; import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.model.impl.AbstractDescriptor; +import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.registry.RegistryConstants; import org.jkiss.dbeaver.tools.transfer.IDataTransferNode; import org.jkiss.dbeaver.tools.transfer.IDataTransferSettings; @@ -170,18 +172,26 @@ public class DataTransferNodeDescriptor extends AbstractDescriptor /** * Returns data exporter which supports ALL specified object types - * @param objectTypes object types + * @param surceObjects object types * @return list of editors */ - public Collection getAvailableProcessors(Collection> objectTypes) + public Collection getAvailableProcessors(Collection surceObjects) { List editors = new ArrayList<>(); for (DataTransferProcessorDescriptor descriptor : processors) { boolean supports = true; - for (Class objectType : objectTypes) { - if (!descriptor.appliesToType(objectType)) { - supports = false; - break; + for (DBSObject sourceObject : surceObjects) { + if (!descriptor.appliesToType(sourceObject.getClass())) { + boolean adapts = false; + if (sourceObject instanceof IAdaptable) { + if (descriptor.adaptsToType((IAdaptable)sourceObject)) { + adapts = true; + } + } + if (!adapts) { + supports = false; + break; + } } } if (supports) { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferProcessorDescriptor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferProcessorDescriptor.java index 87483569793c0513e1fca044ce8a7b364687b6cc..9a9627e5e62eb34286d6a05f0ffbd00dafe9a184 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferProcessorDescriptor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferProcessorDescriptor.java @@ -17,6 +17,7 @@ package org.jkiss.dbeaver.registry.transfer; +import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IConfigurationElement; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.DBIcon; @@ -107,6 +108,18 @@ public class DataTransferProcessorDescriptor extends AbstractDescriptor implemen return false; } + public boolean adaptsToType(IAdaptable adaptable) { + if (sourceTypes.isEmpty()) { + return true; + } + for (ObjectType sourceType : sourceTypes) { + if (adaptable.getAdapter(sourceType.getObjectClass()) != null) { + return true; + } + } + return false; + } + public IDataTransferProcessor getInstance() { try { @@ -126,4 +139,5 @@ public class DataTransferProcessorDescriptor extends AbstractDescriptor implemen public boolean isBinaryFormat() { return isBinary; } + } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferRegistry.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferRegistry.java index ec635a619a1871aa1c5b974ad104ec53f3135f51..676e3e8b9d4723ab38ec0116b42bdfafcdf49cd1 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferRegistry.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/transfer/DataTransferRegistry.java @@ -21,6 +21,7 @@ import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.registry.RegistryConstants; import org.jkiss.dbeaver.tools.transfer.IDataTransferNode; import org.jkiss.utils.CommonUtils; @@ -82,23 +83,23 @@ public class DataTransferRegistry { nodes.sort(Comparator.comparing(DataTransferNodeDescriptor::getName)); } - public List getAvailableProducers(Collection> objectTypes) + public List getAvailableProducers(Collection sourceObjects) { - return getAvailableNodes(DataTransferNodeDescriptor.NodeType.PRODUCER, objectTypes); + return getAvailableNodes(DataTransferNodeDescriptor.NodeType.PRODUCER, sourceObjects); } - public List getAvailableConsumers(Collection> objectTypes) + public List getAvailableConsumers(Collection sourceObjects) { - return getAvailableNodes(DataTransferNodeDescriptor.NodeType.CONSUMER, objectTypes); + return getAvailableNodes(DataTransferNodeDescriptor.NodeType.CONSUMER, sourceObjects); } - List getAvailableNodes(DataTransferNodeDescriptor.NodeType nodeType, Collection> objectTypes) + List getAvailableNodes(DataTransferNodeDescriptor.NodeType nodeType, Collection sourceObjects) { List result = new ArrayList<>(); for (DataTransferNodeDescriptor node : nodes) { if (node.getNodeType() == nodeType) { - for (Class objectType : objectTypes) { - if (node.appliesToType(objectType)) { + for (DBSObject sourceObject : sourceObjects) { + if (node.appliesToType(sourceObject.getClass())) { result.add(node); break; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/wizard/DataTransferPagePipes.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/wizard/DataTransferPagePipes.java index 204efc9cff87712cafd5bf2ba1fd4f1a0c02453e..f81a9ad14254777aaaaf1c3e2470c4b0b5d422cb 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/wizard/DataTransferPagePipes.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/wizard/DataTransferPagePipes.java @@ -26,6 +26,7 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.jkiss.dbeaver.core.CoreMessages; +import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.registry.transfer.DataTransferNodeDescriptor; import org.jkiss.dbeaver.registry.transfer.DataTransferProcessorDescriptor; import org.jkiss.dbeaver.registry.transfer.DataTransferRegistry; @@ -180,11 +181,11 @@ class DataTransferPagePipes extends ActiveWizardPage { private void loadConsumers() { DataTransferSettings settings = getWizard().getSettings(); - Collection> objectTypes = settings.getObjectTypes(); + Collection objects = settings.getSourceObjects(); List transferTargets = new ArrayList<>(); - for (DataTransferNodeDescriptor consumer : DataTransferRegistry.getInstance().getAvailableConsumers(objectTypes)) { - Collection processors = consumer.getAvailableProcessors(objectTypes); + for (DataTransferNodeDescriptor consumer : DataTransferRegistry.getInstance().getAvailableConsumers(objects)) { + Collection processors = consumer.getAvailableProcessors(objects); if (CommonUtils.isEmpty(processors)) { transferTargets.add(new TransferTarget(consumer, null)); } else { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/wizard/DataTransferSettings.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/wizard/DataTransferSettings.java index 1c219a5c5d9312fe9e063e1a5eed87e67eda1d44..e9914ed841d8cf0db4e2e22e7172ec0acc753640 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/wizard/DataTransferSettings.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/wizard/DataTransferSettings.java @@ -24,6 +24,7 @@ import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.registry.transfer.DataTransferNodeDescriptor; import org.jkiss.dbeaver.registry.transfer.DataTransferProcessorDescriptor; import org.jkiss.dbeaver.registry.transfer.DataTransferRegistry; @@ -119,7 +120,7 @@ public class DataTransferSettings { throw new IllegalArgumentException("Producers or consumers must be specified"); } - Collection> objectTypes = getObjectTypes(); + Collection objectTypes = getSourceObjects(); List nodes = new ArrayList<>(); DataTransferRegistry registry = DataTransferRegistry.getInstance(); if (ArrayUtils.isEmpty(producers)) { @@ -191,16 +192,16 @@ public class DataTransferSettings { return nodeSettings != null && ArrayUtils.contains(nodeSettings.pages, page); } - public Collection> getObjectTypes() + public Collection getSourceObjects() { List dataPipes = getDataPipes(); - Set> objectTypes = new HashSet<>(); + Set objects = new HashSet<>(); for (DataTransferPipe transferPipe : dataPipes) { if (transferPipe.getProducer() != null) { - objectTypes.add(transferPipe.getProducer().getSourceObject().getClass()); + objects.add(transferPipe.getProducer().getSourceObject()); } } - return objectTypes; + return objects; } public IDataTransferSettings getNodeSettings(IWizardPage page) diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java index e7357da81802a3a33381af68266ea86ea9e380a3..a0273743463212f289faa11e28719fb95a0a9f0e 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java @@ -16,6 +16,7 @@ */ package org.jkiss.dbeaver.ui.controls.resultset; +import org.eclipse.core.runtime.IAdaptable; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBUtils; @@ -35,7 +36,7 @@ import java.util.List; * Client-side data container. * Wraps RSV model and original data container. */ -public class ResultSetDataContainer implements DBSDataContainer { +public class ResultSetDataContainer implements DBSDataContainer, IAdaptable { private static final Log log = Log.getLog(ResultSetDataContainer.class); @@ -138,6 +139,14 @@ public class ResultSetDataContainer implements DBSDataContainer { return dataContainer.isPersisted(); } + @Override + public T getAdapter(Class adapter) { + if (adapter.isInstance(dataContainer)) { + return adapter.cast(dataContainer); + } + return null; + } + private class ModelResultSet implements DBCResultSet { private final DBCSession session; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/handlers/NavigateObjectHandler.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/handlers/NavigateObjectHandler.java index e4e400c108870ec3faa571e8f0a8911fb9975243..4538b3e3217e0a9333344c0054a5c822b2a3ec53 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/handlers/NavigateObjectHandler.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/handlers/NavigateObjectHandler.java @@ -73,7 +73,7 @@ public class NavigateObjectHandler extends AbstractHandler { } String lastKeyword = hyperlinkDetector.getLastKeyword(); if (!CommonUtils.isEmpty(lastKeyword)) { - IEditorStatusLine statusLine = (IEditorStatusLine)editor.getAdapter(IEditorStatusLine.class); + IEditorStatusLine statusLine = editor.getAdapter(IEditorStatusLine.class); if (statusLine != null) { statusLine.setMessage(true, "Can't find metadata object for name '" + lastKeyword + "'", (Image)null); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/AbstractDescriptor.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/AbstractDescriptor.java index e54bbe591a73382ff819dfdc92c5cb7fdd2734f5..74865d2984e9c2c09b2c86b5e1088496b7cbaab5 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/AbstractDescriptor.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/AbstractDescriptor.java @@ -20,6 +20,7 @@ import org.apache.commons.jexl2.Expression; import org.apache.commons.jexl2.JexlContext; import org.apache.commons.jexl2.JexlEngine; import org.apache.commons.jexl2.JexlException; +import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.jkiss.code.NotNull;