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

DataSourceDescriptor clone/compare.

Connection properties edit fix.
Wizard finish improvement (checks).
上级 e7791217
......@@ -82,6 +82,7 @@ public class DataSourceDescriptor
this.typeName = typeName;
}
// Copy constructor
FilterMapping(FilterMapping mapping)
{
this.typeName = mapping.typeName;
......@@ -127,14 +128,18 @@ public class DataSourceDescriptor
private boolean showUtilityObjects;
private boolean connectionReadOnly;
private final Map<String, FilterMapping> filterMap = new HashMap<>();
private Date createDate;
private DBDDataFormatterProfile formatterProfile;
@Nullable
private DBPClientHome clientHome;
@Nullable
private String lockPasswordHash;
@Nullable
private DataSourceFolder folder;
@NotNull
private DataSourcePreferenceStore preferenceStore;
@Nullable
private DBPDataSource dataSource;
@Nullable
private String lockPasswordHash;
private final List<DBPDataSourceUser> users = new ArrayList<>();
......@@ -144,7 +149,6 @@ public class DataSourceDescriptor
private volatile boolean connecting = false;
private final List<DBRProcessDescriptor> childProcesses = new ArrayList<>();
private DBWTunnel tunnel;
private DataSourceFolder folder;
@NotNull
private final DBVModel virtualModel;
......@@ -169,11 +173,11 @@ public class DataSourceDescriptor
this.id = id;
this.driver = driver;
this.connectionInfo = connectionInfo;
this.createDate = new Date();
this.preferenceStore = new DataSourcePreferenceStore(this);
this.virtualModel = new DBVModel(this);
}
// Copy constructor
public DataSourceDescriptor(@NotNull DataSourceDescriptor source)
{
this.registry = source.registry;
......@@ -187,17 +191,18 @@ public class DataSourceDescriptor
this.connectionReadOnly = source.connectionReadOnly;
this.driver = source.driver;
this.connectionInfo = source.connectionInfo;
this.createDate = source.createDate;
this.preferenceStore = source.preferenceStore;
this.formatterProfile = source.formatterProfile;
this.clientHome = source.clientHome;
this.virtualModel = source.virtualModel;
this.connectionInfo = new DBPConnectionConfiguration(source.connectionInfo);
this.tunnelConnectionInfo = source.tunnelConnectionInfo == null ? null : new DBPConnectionConfiguration(source.tunnelConnectionInfo);
this.filterMap.putAll(source.filterMap);
for (Map.Entry<String, FilterMapping> fe : source.filterMap.entrySet()) {
this.filterMap.put(fe.getKey(), new FilterMapping(fe.getValue()));
}
this.lockPasswordHash = source.lockPasswordHash;
this.folder = source.folder;
this.preferenceStore = new DataSourcePreferenceStore(this);
this.virtualModel = new DBVModel(this, source.virtualModel);
}
public boolean isDisposed()
......@@ -1174,6 +1179,26 @@ public class DataSourceDescriptor
return name + " [" + driver + "]";
}
public boolean equalSettings(Object obj) {
if (!(obj instanceof DataSourceDescriptor)) {
return false;
}
DataSourceDescriptor source = (DataSourceDescriptor) obj;
return
CommonUtils.equalObjects(this.name, source.name) &&
CommonUtils.equalObjects(this.description, source.description) &&
CommonUtils.equalObjects(this.savePassword, source.savePassword) &&
CommonUtils.equalObjects(this.showSystemObjects, source.showSystemObjects) &&
CommonUtils.equalObjects(this.showUtilityObjects, source.showUtilityObjects) &&
CommonUtils.equalObjects(this.connectionReadOnly, source.connectionReadOnly) &&
CommonUtils.equalObjects(this.driver, source.driver) &&
CommonUtils.equalObjects(this.connectionInfo, source.connectionInfo) &&
CommonUtils.equalObjects(this.formatterProfile, source.formatterProfile) &&
CommonUtils.equalObjects(this.clientHome, source.clientHome) &&
CommonUtils.equalObjects(this.lockPasswordHash, source.lockPasswordHash) &&
CommonUtils.equalObjects(this.folder, source.folder);
}
public static class ContextInfo implements DBPObject {
private final DBCExecutionContext context;
......
......@@ -20,7 +20,6 @@ package org.jkiss.dbeaver.ui.actions.navigator;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
......@@ -46,7 +45,6 @@ import org.jkiss.dbeaver.model.struct.DBSObjectContainer;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.registry.editor.EntityEditorsRegistry;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.actions.datasource.DataSourceHandler;
import org.jkiss.dbeaver.ui.controls.folders.ITabbedFolderContainer;
import org.jkiss.dbeaver.ui.dialogs.connection.EditConnectionDialog;
import org.jkiss.dbeaver.ui.dialogs.connection.EditConnectionWizard;
......@@ -232,17 +230,7 @@ public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase imple
EditConnectionDialog dialog = new EditConnectionDialog(
workbenchWindow,
new EditConnectionWizard(dataSourceContainer));
if (dialog.open() == IDialogConstants.OK_ID) {
if (dataSourceContainer.isConnected()) {
if (UIUtils.confirmAction(
workbenchWindow.getShell(),
"Connection changed",
"Connection '" + dataSourceContainer.getName() + "' has been changed.\nDo you want to reconnect?"))
{
DataSourceHandler.reconnectDataSource(null, dataSourceContainer);
}
}
}
dialog.open();
}
public static void openResourceEditor(IWorkbenchWindow workbenchWindow, ResourceUtils.ResourceInfo resourceInfo) {
......
......@@ -29,13 +29,13 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.registry.DataSourceViewDescriptor;
import org.jkiss.dbeaver.registry.driver.DriverDescriptor;
import org.jkiss.dbeaver.ui.IActionConstants;
import org.jkiss.dbeaver.ui.ICompositeDialogPage;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.actions.datasource.DataSourceHandler;
import org.jkiss.dbeaver.ui.preferences.*;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.CommonUtils;
......@@ -51,9 +51,10 @@ import java.util.Locale;
public class EditConnectionWizard extends ConnectionWizard
{
@NotNull
private DataSourceDescriptor originalDataSource;
@NotNull
private DataSourceDescriptor dataSource;
private DBPConnectionConfiguration oldData;
@Nullable
private ConnectionPageSettings pageSettings;
private ConnectionPageGeneral pageGeneral;
......@@ -66,8 +67,9 @@ public class EditConnectionWizard extends ConnectionWizard
*/
public EditConnectionWizard(@NotNull DataSourceDescriptor dataSource)
{
this.dataSource = dataSource;
this.oldData = new DBPConnectionConfiguration(this.dataSource.getConnectionConfiguration());
this.originalDataSource = dataSource;
this.dataSource = new DataSourceDescriptor(dataSource);
setWindowTitle(CoreMessages.dialog_connection_wizard_title);
}
......@@ -170,16 +172,49 @@ public class EditConnectionWizard extends ConnectionWizard
@Override
public boolean performFinish()
{
DataSourceDescriptor dsCopy = new DataSourceDescriptor(originalDataSource);
DataSourceDescriptor dsChanged = new DataSourceDescriptor(dataSource);
saveSettings(dsChanged);
if (dsCopy.equalSettings(dsChanged)) {
// No changes
return true;
}
// Check locked datasources
if (!CommonUtils.isEmpty(dataSource.getLockPasswordHash())) {
if (!checkLockPassword()) {
return false;
if (!isOnlyUserCredentialChanged(dsCopy, dsChanged)) {
if (!checkLockPassword()) {
return false;
}
}
}
saveSettings(dataSource);
dataSource.getRegistry().updateDataSource(dataSource);
// Save
saveSettings(originalDataSource);
originalDataSource.getRegistry().updateDataSource(originalDataSource);
if (originalDataSource.isConnected()) {
if (UIUtils.confirmAction(
getShell(),
"Connection changed",
"Connection '" + originalDataSource.getName() + "' has been changed.\nDo you want to reconnect?"))
{
DataSourceHandler.reconnectDataSource(null, originalDataSource);
}
}
return true;
}
private boolean isOnlyUserCredentialChanged(DataSourceDescriptor dsCopy, DataSourceDescriptor dsChanged) {
dsCopy.getConnectionConfiguration().setUserName(null);
dsCopy.getConnectionConfiguration().setUserPassword(null);
dsChanged.getConnectionConfiguration().setUserName(null);
dsChanged.getConnectionConfiguration().setUserPassword(null);
return dsCopy.equalSettings(dsChanged);
}
private boolean checkLockPassword() {
BaseAuthDialog dialog = new BaseAuthDialog(getShell(), "Enter lock password", true);
if (dialog.open() == IDialogConstants.OK_ID) {
......@@ -203,7 +238,7 @@ public class EditConnectionWizard extends ConnectionWizard
@Override
public boolean performCancel()
{
dataSource.setConnectionInfo(oldData);
// Just in case - cancel changes in pref pages (there shouldn't be any)
for (WizardPrefPage prefPage : prefPages) {
prefPage.performCancel();
}
......
......@@ -97,4 +97,18 @@ public class DBPConnectionBootstrap
ignoreErrors ||
!CommonUtils.isEmpty(initQueries);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof DBPConnectionBootstrap)) {
return false;
}
DBPConnectionBootstrap source = (DBPConnectionBootstrap)obj;
return
CommonUtils.equalObjects(this.defaultObjectName, source.defaultObjectName) &&
CommonUtils.equalObjects(this.defaultAutoCommit, source.defaultAutoCommit) &&
CommonUtils.equalObjects(this.defaultTransactionIsolation, source.defaultTransactionIsolation) &&
CommonUtils.equalObjects(this.initQueries, source.initQueries) &&
this.ignoreErrors == source.ignoreErrors;
}
}
......@@ -22,6 +22,7 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.DBPObject;
import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration;
import org.jkiss.dbeaver.model.runtime.DBRShellCommand;
import org.jkiss.utils.CommonUtils;
import java.util.*;
......@@ -74,7 +75,7 @@ public class DBPConnectionConfiguration implements DBPObject
this.clientHomeId = info.clientHomeId;
this.connectionType = info.connectionType;
this.properties = new HashMap<>(info.properties);
this.providerProperties = new HashMap<>(info.properties);
this.providerProperties = new HashMap<>(info.providerProperties);
this.events = new HashMap<>(info.events.size());
for (Map.Entry<DBPConnectionEventType, DBRShellCommand> entry : info.events.entrySet()) {
this.events.put(entry.getKey(), new DBRShellCommand(entry.getValue()));
......@@ -326,4 +327,33 @@ public class DBPConnectionConfiguration implements DBPObject
public void setKeepAliveInterval(int keepAliveInterval) {
this.keepAliveInterval = keepAliveInterval;
}
@Override
public String toString() {
return "Connection: " + (url == null ? databaseName : url);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof DBPConnectionConfiguration)) {
return false;
}
DBPConnectionConfiguration source = (DBPConnectionConfiguration)obj;
return
CommonUtils.equalObjects(this.hostName, source.hostName) &&
CommonUtils.equalObjects(this.hostPort, source.hostPort) &&
CommonUtils.equalObjects(this.serverName, source.serverName) &&
CommonUtils.equalObjects(this.databaseName, source.databaseName) &&
CommonUtils.equalObjects(this.userName, source.userName) &&
CommonUtils.equalObjects(this.userPassword, source.userPassword) &&
CommonUtils.equalObjects(this.url, source.url) &&
CommonUtils.equalObjects(this.clientHomeId, source.clientHomeId) &&
CommonUtils.equalObjects(this.connectionType, source.connectionType) &&
CommonUtils.equalObjects(this.properties, source.properties) &&
CommonUtils.equalObjects(this.providerProperties, source.providerProperties) &&
CommonUtils.equalObjects(this.events, source.events) &&
CommonUtils.equalObjects(this.handlers, source.handlers) &&
CommonUtils.equalObjects(this.bootstrap, source.bootstrap) &&
this.keepAliveInterval == source.keepAliveInterval;
}
}
......@@ -21,6 +21,7 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.utils.CommonUtils;
import java.util.HashMap;
import java.util.Map;
......@@ -137,4 +138,19 @@ public class DBWHandlerConfiguration {
return properties;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof DBWHandlerConfiguration)) {
return false;
}
DBWHandlerConfiguration source = (DBWHandlerConfiguration)obj;
return
CommonUtils.equalObjects(this.descriptor, source.descriptor) &&
CommonUtils.equalObjects(this.driver, source.driver) &&
this.enabled == source.enabled &&
CommonUtils.equalObjects(this.userName, source.userName) &&
CommonUtils.equalObjects(this.password, source.password) &&
this.savePassword == source.savePassword &&
CommonUtils.equalObjects(this.properties, source.properties);
}
}
......@@ -18,6 +18,8 @@
package org.jkiss.dbeaver.model.runtime;
import org.jkiss.utils.CommonUtils;
/**
* DBRShellCommand
*/
......@@ -43,6 +45,7 @@ public class DBRShellCommand
this.showProcessPanel = command.showProcessPanel;
this.waitProcessFinish = command.waitProcessFinish;
this.terminateAtDisconnect = command.terminateAtDisconnect;
this.workingDirectory = command.workingDirectory;
}
public String getCommand()
......@@ -104,4 +107,19 @@ public class DBRShellCommand
{
this.workingDirectory = workingDirectory;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof DBRShellCommand)) {
return false;
}
DBRShellCommand source = (DBRShellCommand)obj;
return
CommonUtils.equalObjects(this.command, source.command) &&
this.enabled == source.enabled &&
this.showProcessPanel == source.showProcessPanel &&
this.waitProcessFinish == source.waitProcessFinish &&
this.terminateAtDisconnect == source.terminateAtDisconnect &&
CommonUtils.equalObjects(this.workingDirectory, source.workingDirectory);
}
}
......@@ -46,6 +46,20 @@ public class DBVContainer extends DBVObject implements DBSObjectContainer {
this.name = name;
}
// Copy constructor
DBVContainer(DBVContainer parent, DBVContainer source)
{
this.parent = parent;
this.name = source.name;
this.description = source.description;
for (Map.Entry<String, DBVContainer> ce : source.containers.entrySet()) {
this.containers.put(ce.getKey(), new DBVContainer(this, ce.getValue()));
}
for (Map.Entry<String, DBVEntity> ee : source.entities.entrySet()) {
this.entities.put(ee.getKey(), new DBVEntity(this, ee.getValue()));
}
}
public DBSObjectContainer getRealContainer(DBRProgressMonitor monitor) throws DBException
{
DBSObjectContainer realParent = parent.getRealContainer(monitor);
......
......@@ -64,6 +64,7 @@ public class DBVEntity extends DBVObject implements DBSEntity, DBPQualifiedObjec
this.descriptionColumnNames = descriptionColumnNames;
}
// Copy constructor
public DBVEntity(DBVContainer container, DBVEntity copy) {
this.container = container;
this.name = copy.name;
......
......@@ -74,6 +74,12 @@ public class DBVModel extends DBVContainer {
this.dataSourceContainer = dataSourceContainer;
}
// Copy constructor
public DBVModel(DBPDataSourceContainer dataSourceContainer, DBVModel source) {
super(null, source);
this.dataSourceContainer = dataSourceContainer;
}
@Override
public DBSObjectContainer getRealContainer(DBRProgressMonitor monitor) throws DBException {
DBPDataSource dataSource = dataSourceContainer.getDataSource();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册