提交 6fe4aff6 编写于 作者: J jurgen

Connection test cancel implemented

上级 4f86c8e4
...@@ -17,13 +17,18 @@ ...@@ -17,13 +17,18 @@
*/ */
package org.jkiss.dbeaver.ui.dialogs.connection; package org.jkiss.dbeaver.ui.dialogs.connection;
import org.jkiss.code.NotNull; import org.eclipse.core.runtime.IProgressMonitor;
import org.jkiss.dbeaver.Log; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.Wizard;
import org.eclipse.osgi.util.NLS; import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.INewWizard; import org.eclipse.ui.INewWizard;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.DBPConnectionConfiguration; import org.jkiss.dbeaver.model.DBPConnectionConfiguration;
...@@ -32,11 +37,11 @@ import org.jkiss.dbeaver.model.DBPDataSourceInfo; ...@@ -32,11 +37,11 @@ import org.jkiss.dbeaver.model.DBPDataSourceInfo;
import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose;
import org.jkiss.dbeaver.model.exec.DBCSession; import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.registry.DataSourceRegistry;
import org.jkiss.dbeaver.registry.DriverDescriptor; import org.jkiss.dbeaver.registry.DriverDescriptor;
import org.jkiss.dbeaver.runtime.RuntimeUtils; import org.jkiss.dbeaver.runtime.AbstractJob;
import org.jkiss.dbeaver.runtime.DefaultProgressMonitor;
import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.CommonUtils; import org.jkiss.utils.CommonUtils;
...@@ -112,12 +117,32 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard { ...@@ -112,12 +117,32 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard {
try { try {
saveSettings(testDataSource); saveSettings(testDataSource);
ConnectionTester op = new ConnectionTester(testDataSource); final ConnectionTester op = new ConnectionTester(testDataSource);
try { try {
long startTime = System.currentTimeMillis(); getContainer().run(true, true, new IRunnableWithProgress() {
RuntimeUtils.run(getContainer(), true, true, op); @Override
long connectTime = (System.currentTimeMillis() - startTime); public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
// Wait for job to finish
op.ownerMonitor = new DefaultProgressMonitor(monitor);
op.schedule();
while (op.getState() == Job.WAITING || op.getState() == Job.RUNNING) {
if (monitor.isCanceled()) {
op.cancel();
throw new InterruptedException();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
break;
}
}
if (op.error != null) {
throw new InvocationTargetException(op.error);
}
}
});
String message = ""; String message = "";
if (!CommonUtils.isEmpty(op.productName)) { if (!CommonUtils.isEmpty(op.productName)) {
message += "Server: " + op.productName + " " + op.productVersion + "\n"; message += "Server: " + op.productName + " " + op.productVersion + "\n";
...@@ -128,7 +153,7 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard { ...@@ -128,7 +153,7 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard {
if (!CommonUtils.isEmpty(message)) { if (!CommonUtils.isEmpty(message)) {
message += "\n"; message += "\n";
} }
message += NLS.bind(CoreMessages.dialog_connection_wizard_start_connection_monitor_connected, connectTime); message += NLS.bind(CoreMessages.dialog_connection_wizard_start_connection_monitor_connected, op.connectTime);
MessageDialog.openInformation(getShell(), CoreMessages.dialog_connection_wizard_start_connection_monitor_success, MessageDialog.openInformation(getShell(), CoreMessages.dialog_connection_wizard_start_connection_monitor_success,
message); message);
...@@ -152,16 +177,22 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard { ...@@ -152,16 +177,22 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard {
return false; return false;
} }
private class ConnectionTester implements DBRRunnableWithProgress { private class ConnectionTester extends AbstractJob {
String productName; String productName;
String productVersion; String productVersion;
String driverName; String driverName;
String driverVersion; String driverVersion;
private final DataSourceDescriptor testDataSource; private final DataSourceDescriptor testDataSource;
private boolean initOnTest; private boolean initOnTest;
long startTime = -1;
long connectTime = -1;
DBRProgressMonitor ownerMonitor;
DBException error;
public ConnectionTester(DataSourceDescriptor testDataSource) public ConnectionTester(DataSourceDescriptor testDataSource)
{ {
super("Test connection to " + testDataSource.getName());
setSystem(true);
this.testDataSource = testDataSource; this.testDataSource = testDataSource;
this.initOnTest = CommonUtils.toBoolean(testDataSource.getDriver().getDriverParameter(DBConstants.PARAM_INIT_ON_TEST)); this.initOnTest = CommonUtils.toBoolean(testDataSource.getDriver().getDriverParameter(DBConstants.PARAM_INIT_ON_TEST));
productName = null; productName = null;
...@@ -169,15 +200,21 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard { ...@@ -169,15 +200,21 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard {
} }
@Override @Override
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException public IStatus run(DBRProgressMonitor monitor)
{ {
if (ownerMonitor != null) {
monitor = ownerMonitor;
}
monitor.beginTask(CoreMessages.dialog_connection_wizard_start_connection_monitor_start, 3); monitor.beginTask(CoreMessages.dialog_connection_wizard_start_connection_monitor_start, 3);
Thread.currentThread().setName(CoreMessages.dialog_connection_wizard_start_connection_monitor_thread); Thread.currentThread().setName(CoreMessages.dialog_connection_wizard_start_connection_monitor_thread);
try { try {
testDataSource.setName(testDataSource.getConnectionConfiguration().getUrl()); testDataSource.setName(testDataSource.getConnectionConfiguration().getUrl());
monitor.worked(1); monitor.worked(1);
startTime = System.currentTimeMillis();
testDataSource.connect(monitor, initOnTest, false); testDataSource.connect(monitor, initOnTest, false);
connectTime = (System.currentTimeMillis() - startTime);
monitor.worked(1); monitor.worked(1);
DBPDataSource dataSource = testDataSource.getDataSource(); DBPDataSource dataSource = testDataSource.getDataSource();
if (dataSource == null) { if (dataSource == null) {
...@@ -225,8 +262,9 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard { ...@@ -225,8 +262,9 @@ public abstract class ConnectionWizard extends Wizard implements INewWizard {
} }
monitor.subTask(CoreMessages.dialog_connection_wizard_start_connection_monitor_success); monitor.subTask(CoreMessages.dialog_connection_wizard_start_connection_monitor_success);
} catch (DBException ex) { } catch (DBException ex) {
throw new InvocationTargetException(ex); error = ex;
} }
return Status.OK_STATUS;
} }
} }
} }
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册