From 7104dbe034aef03e7de3b0d6251a536c6bb40020 Mon Sep 17 00:00:00 2001 From: Ainur <59531286+yagudin10@users.noreply.github.com> Date: Wed, 27 Jul 2022 15:30:18 +0300 Subject: [PATCH] CB-2371 project connections add exceptions (#983) * CB-2371 project connections add exceptions * CB-2371 check for errors in data source registry --- .../rm/local/LocalResourceController.java | 7 +++++- .../cloudbeaver/model/session/WebSession.java | 5 ++++ .../service/core/impl/WebServiceCore.java | 25 +++++++++++++++++-- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java index 3e459d5cf6..b9c862d816 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java @@ -21,6 +21,7 @@ import io.cloudbeaver.VirtualProjectImpl; import io.cloudbeaver.model.rm.RMUtils; import io.cloudbeaver.service.sql.WebSQLConstants; import io.cloudbeaver.utils.WebAppUtils; +import io.cloudbeaver.utils.WebDataSourceUtils; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; @@ -253,9 +254,10 @@ public class LocalResourceController implements RMController { public String getProjectsDataSources(@NotNull String projectId) throws DBException { DBPProject projectMetadata = getProjectMetadata(projectId); DBPDataSourceRegistry registry = projectMetadata.getDataSourceRegistry(); + registry.checkForErrors(); DataSourceConfigurationManagerBuffer buffer = new DataSourceConfigurationManagerBuffer(); ((DataSourceRegistry)registry).saveConfigurationToManager(new VoidProgressMonitor(), buffer, null); - + registry.checkForErrors(); return new String(buffer.getData(), StandardCharsets.UTF_8); } @@ -266,7 +268,9 @@ public class LocalResourceController implements RMController { final DBPDataSourceConfigurationStorage storage = new DataSourceMemoryStorage(configuration.getBytes(StandardCharsets.UTF_8)); final DataSourceConfigurationManager manager = new DataSourceConfigurationManagerBuffer(); registry.loadDataSources(List.of(storage), manager, true, false); + registry.checkForErrors(); registry.saveDataSources(); + registry.checkForErrors(); } @Override @@ -283,6 +287,7 @@ public class LocalResourceController implements RMController { log.warn("Could not find datasource " + dataSourceId + " for deletion"); } } + registry.checkForErrors(); } @NotNull diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java index 154076d386..4baf895085 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java @@ -362,6 +362,11 @@ public class WebSession extends AbstractSessionPersistent implements SMSession, WebConnectionInfo connectionInfo = new WebConnectionInfo(this, ds); connList.add(connectionInfo); } + Throwable lastError = registry.getLastError(); + if (lastError != null) { + addSessionError(lastError); + log.error("Error refreshing connections from project '" + project.getId() + "'", lastError); + } } // Add all provided datasources to the session diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java index 322b0ea91c..5c656ecb90 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java @@ -317,6 +317,11 @@ public class WebServiceCore implements DBWServiceCore { } sessionRegistry.addDataSource(newDataSource); + try { + sessionRegistry.checkForErrors(); + } catch (DBException e) { + throw new DBWebException(e.getMessage(), e.getCause()); + } WebConnectionInfo connectionInfo = new WebConnectionInfo(webSession, newDataSource); webSession.addConnection(connectionInfo); @@ -354,6 +359,11 @@ public class WebServiceCore implements DBWServiceCore { WebServiceUtils.saveAuthProperties(dataSource, dataSource.getConnectionConfiguration(), config.getCredentials(), config.isSaveCredentials()); sessionRegistry.updateDataSource(dataSource); + try { + sessionRegistry.checkForErrors(); + } catch (DBException e) { + throw new DBWebException(e.getMessage(), e.getCause()); + } return connectionInfo; } @@ -392,6 +402,11 @@ public class WebServiceCore implements DBWServiceCore { newDataSource.setName(connectionName); } projectRegistry.addDataSource(newDataSource); + try { + projectRegistry.checkForErrors(); + } catch (DBException e) { + throw new DBWebException(e.getMessage(), e.getCause()); + } WebConnectionInfo connectionInfo = new WebConnectionInfo(webSession, newDataSource); webSession.addConnection(connectionInfo); @@ -434,7 +449,7 @@ public class WebServiceCore implements DBWServiceCore { WebConnectionInfo connectionInfo = new WebConnectionInfo(webSession, newDataSource); webSession.addConnection(connectionInfo); - + dataSourceRegistry.checkForErrors(); return connectionInfo; } catch (DBException e) { throw new DBWebException("Error copying connection", e); @@ -554,7 +569,13 @@ public class WebServiceCore implements DBWServiceCore { //new DisconnectJob(connectionInfo.getDataSource()).schedule(); } if (forceDelete) { - webSession.getProjectById(projectId).getDataSourceRegistry().removeDataSource(dataSourceContainer); + DBPDataSourceRegistry registry = webSession.getProjectById(projectId).getDataSourceRegistry(); + registry.removeDataSource(dataSourceContainer); + try { + registry.checkForErrors(); + } catch (DBException e) { + throw new DBWebException(e.getMessage(), e.getCause()); + } webSession.removeConnection(connectionInfo); } else { // Just reset saved credentials