提交 0c85da93 编写于 作者: S serge-rider

#3336 Data transfer fix (check for object adaptions). RSV data container refactoring.

上级 7c2a3a46
......@@ -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<DataTransferProcessorDescriptor> getAvailableProcessors(Collection<Class<?>> objectTypes)
public Collection<DataTransferProcessorDescriptor> getAvailableProcessors(Collection<DBSObject> surceObjects)
{
List<DataTransferProcessorDescriptor> 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) {
......
......@@ -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;
}
}
......@@ -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<DataTransferNodeDescriptor> getAvailableProducers(Collection<Class<?>> objectTypes)
public List<DataTransferNodeDescriptor> getAvailableProducers(Collection<DBSObject> sourceObjects)
{
return getAvailableNodes(DataTransferNodeDescriptor.NodeType.PRODUCER, objectTypes);
return getAvailableNodes(DataTransferNodeDescriptor.NodeType.PRODUCER, sourceObjects);
}
public List<DataTransferNodeDescriptor> getAvailableConsumers(Collection<Class<?>> objectTypes)
public List<DataTransferNodeDescriptor> getAvailableConsumers(Collection<DBSObject> sourceObjects)
{
return getAvailableNodes(DataTransferNodeDescriptor.NodeType.CONSUMER, objectTypes);
return getAvailableNodes(DataTransferNodeDescriptor.NodeType.CONSUMER, sourceObjects);
}
List<DataTransferNodeDescriptor> getAvailableNodes(DataTransferNodeDescriptor.NodeType nodeType, Collection<Class<?>> objectTypes)
List<DataTransferNodeDescriptor> getAvailableNodes(DataTransferNodeDescriptor.NodeType nodeType, Collection<DBSObject> sourceObjects)
{
List<DataTransferNodeDescriptor> 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;
}
......
......@@ -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<DataTransferWizard> {
private void loadConsumers()
{
DataTransferSettings settings = getWizard().getSettings();
Collection<Class<?>> objectTypes = settings.getObjectTypes();
Collection<DBSObject> objects = settings.getSourceObjects();
List<TransferTarget> transferTargets = new ArrayList<>();
for (DataTransferNodeDescriptor consumer : DataTransferRegistry.getInstance().getAvailableConsumers(objectTypes)) {
Collection<DataTransferProcessorDescriptor> processors = consumer.getAvailableProcessors(objectTypes);
for (DataTransferNodeDescriptor consumer : DataTransferRegistry.getInstance().getAvailableConsumers(objects)) {
Collection<DataTransferProcessorDescriptor> processors = consumer.getAvailableProcessors(objects);
if (CommonUtils.isEmpty(processors)) {
transferTargets.add(new TransferTarget(consumer, null));
} else {
......
......@@ -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<Class<?>> objectTypes = getObjectTypes();
Collection<DBSObject> objectTypes = getSourceObjects();
List<DataTransferNodeDescriptor> 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<Class<?>> getObjectTypes()
public Collection<DBSObject> getSourceObjects()
{
List<DataTransferPipe> dataPipes = getDataPipes();
Set<Class<?>> objectTypes = new HashSet<>();
Set<DBSObject> 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)
......
......@@ -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> T getAdapter(Class<T> adapter) {
if (adapter.isInstance(dataContainer)) {
return adapter.cast(dataContainer);
}
return null;
}
private class ModelResultSet implements DBCResultSet {
private final DBCSession session;
......
......@@ -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);
}
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册