提交 b14420c4 编写于 作者: S Serge Rider

#6896 Data consumer settings loading fix


Former-commit-id: 5596b3fd
上级 4b87328b
......@@ -25,6 +25,7 @@ import org.eclipse.ui.IWorkbenchWindow;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.task.DBTTask;
......@@ -46,6 +47,7 @@ import org.jkiss.dbeaver.ui.task.TaskConfigurationWizardDialog;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
public class DataTransferWizard extends TaskConfigurationWizard implements IExportWizard, IImportWizard {
......@@ -253,7 +255,14 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
@Override
public boolean performFinish() {
// Save settings
saveSettings();
try {
getRunnableContext().run(true, true, this::saveSettings);
} catch (InvocationTargetException e) {
DBWorkbench.getPlatformUI().showError(e.getMessage(), "Can't save settings", e.getTargetException());
return false;
} catch (InterruptedException e) {
return false;
}
super.performFinish();
......@@ -285,9 +294,9 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
//wizardContainer.
}
private void saveSettings() {
private void saveSettings(DBRProgressMonitor monitor) {
DialogSettingsMap dialogSettings = new DialogSettingsMap(getDialogSettings());
saveConfiguration(dialogSettings);
saveConfiguration(monitor, dialogSettings);
}
private void addNodeSettings(DataTransferNodeDescriptor node) {
......@@ -382,7 +391,7 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
return null;
}
public void saveTaskState(Map<String, Object> state) {
public void saveTaskState(DBRProgressMonitor monitor, Map<String, Object> state) {
List<IDataTransferNode> producers = new ArrayList<>();
List<IDataTransferNode> consumers = new ArrayList<>();
for (DataTransferPipe pipe : settings.getDataPipes()) {
......@@ -393,12 +402,12 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
consumers.add(pipe.getConsumer());
}
}
DataTransferSettings.saveNodesLocation(state, producers, "producers");
DataTransferSettings.saveNodesLocation(state, consumers, "consumers");
state.put("configuration", saveConfiguration(new LinkedHashMap<>()));
DataTransferSettings.saveNodesLocation(monitor, state, producers, "producers");
DataTransferSettings.saveNodesLocation(monitor, state, consumers, "consumers");
state.put("configuration", saveConfiguration(monitor, new LinkedHashMap<>()));
}
private Map<String, Object> saveConfiguration(Map<String, Object> config) {
private Map<String, Object> saveConfiguration(DBRProgressMonitor monitor, Map<String, Object> config) {
config.put("maxJobCount", settings.getMaxJobCount());
config.put("showFinalMessage", settings.isShowFinalMessage());
// Save nodes' settings
......
......@@ -433,11 +433,11 @@ public class DataTransferSettings {
this.showFinalMessage = showFinalMessage;
}
public static void saveNodesLocation(Map<String, Object> state, Collection<IDataTransferNode> nodes, String nodeType) {
public static void saveNodesLocation(DBRProgressMonitor monitor, Map<String, Object> state, Collection<IDataTransferNode> nodes, String nodeType) {
if (nodes != null) {
List<Map<String, Object>> inputObjects = new ArrayList<>();
for (Object inputObject : nodes) {
inputObjects.add(JSONUtils.serializeObject(inputObject));
inputObjects.add(JSONUtils.serializeObject(monitor, inputObject));
}
state.put(nodeType, inputObjects);
}
......
......@@ -27,6 +27,7 @@ import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.model.struct.DBSDataManipulator;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.DBSObjectContainer;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.tools.transfer.*;
......@@ -174,8 +175,8 @@ public class DatabaseConsumerSettings implements IDataTransferSettings {
truncateBeforeLoad = CommonUtils.getBoolean(settings.get("truncateBeforeLoad"), truncateBeforeLoad);
openTableOnFinish = CommonUtils.getBoolean(settings.get("openTableOnFinish"), openTableOnFinish);
List<DataTransferPipe> dataPipes = dataTransferSettings.getDataPipes();
{
List<DataTransferPipe> dataPipes = dataTransferSettings.getDataPipes();
if (!dataPipes.isEmpty()) {
IDataTransferConsumer consumer = dataPipes.get(0).getConsumer();
if (consumer instanceof DatabaseTransferConsumer) {
......@@ -190,15 +191,33 @@ public class DatabaseConsumerSettings implements IDataTransferSettings {
checkContainerConnection(runnableContext);
}
loadNode(runnableContext, null);
// Load mapping for current objects
Map<String, Object> mappings = (Map<String, Object>) settings.get("mappings");
if (mappings != null) {
for (DatabaseMappingContainer dmc : dataMappings.values()) {
DBSDataContainer sourceDatacontainer = dmc.getSource();
if (sourceDatacontainer != null) {
Map<String, Object> dmcSettings = (Map<String, Object>) mappings.get(DBUtils.getObjectFullId(sourceDatacontainer));
if (dmcSettings != null) {
dmc.loadSettings(runnableContext, dmcSettings);
if (!dataMappings.isEmpty()) {
for (DatabaseMappingContainer dmc : dataMappings.values()) {
DBSDataContainer sourceDatacontainer = dmc.getSource();
if (sourceDatacontainer != null) {
Map<String, Object> dmcSettings = (Map<String, Object>) mappings.get(DBUtils.getObjectFullId(sourceDatacontainer));
if (dmcSettings != null) {
dmc.loadSettings(runnableContext, dmcSettings);
}
}
}
} else if (!dataPipes.isEmpty()) {
for (DataTransferPipe pipe : dataPipes) {
IDataTransferProducer producer = pipe.getProducer();
DBSObject dbObject = producer.getDatabaseObject();
if (dbObject instanceof DBSDataContainer) {
DBSDataContainer sourceDC = (DBSDataContainer)dbObject;
Map<String, Object> dmcSettings = (Map<String, Object>) mappings.get(DBUtils.getObjectFullId(dbObject));
if (dmcSettings != null) {
DatabaseMappingContainer dmc = new DatabaseMappingContainer(this, sourceDC);
dmc.loadSettings(runnableContext, dmcSettings);
dataMappings.put(sourceDC, dmc);
}
}
}
}
......
......@@ -20,7 +20,6 @@ import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.model.data.DBDAttributeBindingCustom;
import org.jkiss.dbeaver.model.data.DBDValueHandler;
......@@ -45,7 +44,6 @@ import org.jkiss.dbeaver.tools.transfer.IDataTransferNodePrimary;
import org.jkiss.dbeaver.tools.transfer.IDataTransferProcessor;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
/**
......@@ -284,7 +282,7 @@ public class DatabaseTransferConsumer implements IDataTransferConsumer<DatabaseC
}
private void initExporter(DBRProgressMonitor monitor) throws DBCException {
DBSObject targetDB = checkTargetContainer();
DBSObject targetDB = checkTargetContainer(monitor);
DBPDataSourceContainer dataSourceContainer = targetDB.getDataSource().getContainer();
if (!dataSourceContainer.hasModifyPermission(DBPDataSourcePermission.PERMISSION_IMPORT_DATA)) {
......@@ -308,9 +306,15 @@ public class DatabaseTransferConsumer implements IDataTransferConsumer<DatabaseC
}
}
private DBSObject checkTargetContainer() throws DBCException {
if (targetObject == null && settings.getContainer() == null) {
throw new DBCException("Can't initialize database consumer. No target object and no taregt container");
private DBSObject checkTargetContainer(DBRProgressMonitor monitor) throws DBCException {
if (targetObject == null) {
if (settings.getContainerNode() != null && settings.getContainerNode().getDataSource() == null) {
// Init connection
settings.getContainerNode().initializeNode(monitor, null);
}
if (settings.getContainer() == null) {
throw new DBCException("Can't initialize database consumer. No target object and no target container");
}
}
containerMapping = sourceObject == null ? null : settings.getDataMapping(sourceObject);
......@@ -343,7 +347,7 @@ public class DatabaseTransferConsumer implements IDataTransferConsumer<DatabaseC
// Create all necessary database objects
monitor.beginTask("Create necessary database objects", 1);
try {
DBSObject dbObject = checkTargetContainer();
DBSObject dbObject = checkTargetContainer(monitor);
boolean hasNewObjects = false;
if (containerMapping != null) {
......@@ -536,7 +540,7 @@ public class DatabaseTransferConsumer implements IDataTransferConsumer<DatabaseC
}
public DBSDataManipulator getTargetObject() {
return targetObject;
return targetObject != null ? targetObject : containerMapping == null ? null : containerMapping.getTarget();
}
@Override
......@@ -612,48 +616,43 @@ public class DatabaseTransferConsumer implements IDataTransferConsumer<DatabaseC
public boolean equals(Object obj) {
return obj instanceof DatabaseTransferConsumer &&
CommonUtils.equalObjects(targetObject, ((DatabaseTransferConsumer) obj).targetObject);
}
public static class ObjectSerializer implements DBPObjectSerializer<DBTTask, DatabaseTransferConsumer> {
@Override
public void serializeObject(DatabaseTransferConsumer object, Map<String, Object> state) {
DBSDataContainer dataContainer = object.targetObject;
if (dataContainer instanceof DBSEntity) {
state.put("type", "entity");
if (dataContainer.getDataSource() != null) {
state.put("project", dataContainer.getDataSource().getContainer().getProject().getName());
public void serializeObject(DBRProgressMonitor monitor, DatabaseTransferConsumer object, Map<String, Object> state) {
try {
DatabaseMappingContainer targetMapping = object.containerMapping;
DBPDataSourceContainer targetDS = object.getDataSourceContainer();
if (targetDS == null) {
throw new DBException("Can't get target datasource container");
}
state.put("entityId", DBUtils.getObjectFullId(dataContainer));
} else {
state.put("type", "unknown");
log.error("Unsupported consumer data container: " + dataContainer);
state.put("type", "mappings");
state.put("project", targetDS.getProject().getName());
state.put("dataSource", targetDS.getId());
} catch (Exception e) {
log.error("Error initializing database consumer", e);
}
}
@Override
public DatabaseTransferConsumer deserializeObject(DBRRunnableContext runnableContext, DBTTask objectContext, Map<String, Object> state) {
DatabaseTransferConsumer consumer = new DatabaseTransferConsumer();
try {
runnableContext.run(false, true, monitor -> {
try {
String projectName = CommonUtils.toString(state.get("project"));
DBPProject project = CommonUtils.isEmpty(projectName) ? null : DBWorkbench.getPlatform().getWorkspace().getProject(projectName);
if (project == null) {
project = objectContext.getProject();
}
String id = CommonUtils.toString(state.get("entityId"));
consumer.targetObject = (DBSDataManipulator) DBUtils.findObjectById(monitor, project, id);
} catch (Exception e) {
throw new InvocationTargetException(e);
}
});
/*try {
String projectName = CommonUtils.toString(state.get("project"));
DBPProject project = CommonUtils.isEmpty(projectName) ? null : DBWorkbench.getPlatform().getWorkspace().getProject(projectName);
if (project == null) {
project = objectContext.getProject();
}
DatabaseMappingContainer targetMapping = new DatabaseMappingContainer();
targetMapping.loadSettings(runnableContext, state);
targetMapping.getTarget()
} catch (InvocationTargetException e) {
log.debug("Error deserializing node location", e.getTargetException());
} catch (InterruptedException e) {
// Ignore
}
}*/
return consumer;
}
......
......@@ -241,7 +241,7 @@ public class DatabaseTransferProducer implements IDataTransferProducer<DatabaseP
public static class ObjectSerializer implements DBPObjectSerializer<DBTTask, DatabaseTransferProducer> {
@Override
public void serializeObject(DatabaseTransferProducer object, Map<String, Object> state) {
public void serializeObject(DBRProgressMonitor monitor, DatabaseTransferProducer object, Map<String, Object> state) {
DBSDataContainer dataContainer = object.dataContainer;
if (dataContainer instanceof IAdaptable) {
DBSDataContainer nestedDataContainer = ((IAdaptable) dataContainer).getAdapter(DBSDataContainer.class);
......
......@@ -677,7 +677,7 @@ public class StreamTransferConsumer implements IDataTransferConsumer<StreamConsu
public static class ObjectSerializer implements DBPObjectSerializer<DBTTask, StreamTransferConsumer> {
@Override
public void serializeObject(StreamTransferConsumer object, Map<String, Object> state) {
public void serializeObject(DBRProgressMonitor monitor, StreamTransferConsumer object, Map<String, Object> state) {
}
@Override
......
......@@ -284,7 +284,7 @@ public class StreamTransferProducer implements IDataTransferProducer<StreamProdu
public static class ObjectSerializer implements DBPObjectSerializer<DBTTask, StreamTransferProducer> {
@Override
public void serializeObject(StreamTransferProducer object, Map<String, Object> state) {
public void serializeObject(DBRProgressMonitor monitor, StreamTransferProducer object, Map<String, Object> state) {
state.put("file", object.inputFile.getAbsolutePath());
if (object.defaultProcessor != null) {
state.put("node", object.defaultProcessor.getNode().getId());
......
......@@ -23,6 +23,7 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.runtime.serialize.DBPObjectSerializer;
import org.jkiss.dbeaver.runtime.serialize.SerializerRegistry;
......@@ -225,7 +226,7 @@ public class JSONUtils {
json.endObject();
}
public static <OBJECT_CONTEXT, OBJECT_TYPE> Map<String, Object> serializeObject(@NotNull OBJECT_TYPE object) {
public static <OBJECT_CONTEXT, OBJECT_TYPE> Map<String, Object> serializeObject(DBRProgressMonitor monitor, @NotNull OBJECT_TYPE object) {
DBPObjectSerializer<OBJECT_CONTEXT, OBJECT_TYPE> serializer = SerializerRegistry.getInstance().createSerializer(object);
if (serializer == null) {
log.error("No serializer found for object " + object.getClass().getName());
......@@ -234,7 +235,7 @@ public class JSONUtils {
Map<String, Object> state = new LinkedHashMap<>();
Map<String, Object> location = new LinkedHashMap<>();
serializer.serializeObject(object, location);
serializer.serializeObject(monitor, object, location);
state.put("type", SerializerRegistry.getInstance().getObjectType(object));
state.put("location", location);
......
......@@ -17,6 +17,7 @@
package org.jkiss.dbeaver.runtime.serialize;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import java.util.Map;
......@@ -26,7 +27,7 @@ import java.util.Map;
*/
public interface DBPObjectSerializer<CONTEXT_TYPE, OBJECT_TYPE> {
void serializeObject(OBJECT_TYPE object, Map<String, Object> state);
void serializeObject(DBRProgressMonitor monitor, OBJECT_TYPE object, Map<String, Object> state);
OBJECT_TYPE deserializeObject(DBRRunnableContext runnableContext, CONTEXT_TYPE objectContext, Map<String, Object> state);
......
......@@ -23,6 +23,7 @@ import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.task.DBTTask;
import org.jkiss.dbeaver.model.task.DBTTaskType;
import org.jkiss.dbeaver.registry.task.TaskRegistry;
......@@ -30,6 +31,7 @@ import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.dialogs.BaseWizard;
import org.jkiss.dbeaver.ui.navigator.NavigatorUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
public abstract class TaskConfigurationWizard extends BaseWizard implements IWorkbenchWizard {
......@@ -52,7 +54,7 @@ public abstract class TaskConfigurationWizard extends BaseWizard implements IWor
public abstract String getTaskTypeId();
public abstract void saveTaskState(Map<String, Object> state);
public abstract void saveTaskState(DBRProgressMonitor monitor, Map<String, Object> state);
public IStructuredSelection getCurrentSelection() {
return currentSelection;
......@@ -155,7 +157,20 @@ public abstract class TaskConfigurationWizard extends BaseWizard implements IWor
taskPage.saveSettings();
}
}
saveTaskState(currentTask.getProperties());
try {
DBTTask theTask = currentTask;
getRunnableContext().run(true, true, monitor -> {
try {
saveTaskState(monitor, theTask.getProperties());
} catch (Exception e) {
throw new InvocationTargetException(e);
}
});
} catch (InvocationTargetException e) {
DBWorkbench.getPlatformUI().showError("Tsk save error", "Error saving task configuration", e.getTargetException());
} catch (InterruptedException e) {
// ignore
}
}
}
\ No newline at end of file
......@@ -20,6 +20,7 @@ import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.ui.dialogs.ActiveWizardPage;
import java.util.Map;
......@@ -45,7 +46,7 @@ class TaskConfigurationWizardStub extends TaskConfigurationWizard {
}
@Override
public void saveTaskState(Map<String, Object> state) {
public void saveTaskState(DBRProgressMonitor monitor, Map<String, Object> state) {
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册