diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java index 4c383ebd15..3c47a6efe8 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java @@ -28,14 +28,16 @@ import io.cloudbeaver.server.CBPlatform; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.jkiss.code.NotNull; -import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.meta.Association; import org.jkiss.dbeaver.model.meta.Property; -import org.jkiss.dbeaver.model.navigator.*; +import org.jkiss.dbeaver.model.navigator.DBNModel; +import org.jkiss.dbeaver.model.navigator.DBNNode; +import org.jkiss.dbeaver.model.navigator.DBNProject; +import org.jkiss.dbeaver.model.navigator.DBNProjectDatabases; import org.jkiss.dbeaver.model.runtime.*; import org.jkiss.dbeaver.runtime.jobs.DisconnectJob; import org.jkiss.utils.CommonUtils; @@ -81,6 +83,7 @@ public class WebSession { private DBNModel navigatorModel; private DBNProjectDatabases databases; private DBRProgressMonitor progressMonitor = new SessionProgressMonitor(); + private DBNProject projectNode; public WebSession(HttpSession httpSession) { this.id = httpSession.getId(); @@ -173,7 +176,7 @@ public class WebSession { this.navigatorModel.initialize(); DBPProject project = platform.getWorkspace().getActiveProject(); - DBNProject projectNode = this.navigatorModel.getRoot().getProjectNode(project); + this.projectNode = this.navigatorModel.getRoot().getProjectNode(project); this.databases = projectNode.getDatabases(); this.locale = Locale.getDefault().getLanguage(); @@ -245,7 +248,11 @@ public class WebSession { return navigatorModel; } - public DBNProjectDatabases getDatabases() { + public DBNProject getProjectNode() { + return projectNode; + } + + public DBNProjectDatabases getDatabasesNode() { return databases; } @@ -302,14 +309,12 @@ public class WebSession { connectionInfo = connections.get(connectionID); } if (connectionInfo == null) { - DBNNode dbNode = null; - try { - dbNode = navigatorModel.getNodeByPath(progressMonitor, connectionID); - } catch (DBException e) { - log.debug(e); - } - if (dbNode instanceof DBNDataSource) { - return new WebConnectionInfo(this, ((DBNDataSource) dbNode).getDataSourceContainer()); + DBPDataSourceContainer dataSource = databases.getDataSourceRegistry().getDataSource(connectionID); + if (dataSource != null) { + connectionInfo = new WebConnectionInfo(this, dataSource); + synchronized (connections) { + connections.put(connectionID, connectionInfo); + } } else { throw new DBWebException("Connection '" + connectionID + "' not found"); } 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 52149d8c76..b1c0f28116 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 @@ -135,7 +135,7 @@ public class WebServiceCore implements DBWServiceCore { throw new DBWebException("Datasource '" + dataSourceId + "' not found"); } - DBPDataSourceRegistry sessionRegistry = webSession.getDatabases().getDataSourceRegistry(); + DBPDataSourceRegistry sessionRegistry = webSession.getDatabasesNode().getDataSourceRegistry(); DBPDataSourceContainer newDataSource = sessionRegistry.createDataSource(dataSourceTemplate); newDataSource.setSavePassword(true); ((DataSourceDescriptor)newDataSource).setTemporary(true); @@ -164,7 +164,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public WebConnectionInfo createConnection(WebSession webSession, WebConnectionConfig connectionConfig) throws DBWebException { - DBPDataSourceRegistry sessionRegistry = webSession.getDatabases().getDataSourceRegistry(); + DBPDataSourceRegistry sessionRegistry = webSession.getDatabasesNode().getDataSourceRegistry(); DBPDataSourceContainer newDataSource = makeConnectionInstance(connectionConfig, sessionRegistry); if (CommonUtils.isEmpty(newDataSource.getName())) { @@ -181,7 +181,7 @@ public class WebServiceCore implements DBWServiceCore { @Override public WebConnectionInfo testConnection(WebSession webSession, WebConnectionConfig connectionConfig) throws DBWebException { - DBPDataSourceRegistry sessionRegistry = webSession.getDatabases().getDataSourceRegistry(); + DBPDataSourceRegistry sessionRegistry = webSession.getDatabasesNode().getDataSourceRegistry(); DBPDataSourceContainer newDataSource = makeConnectionInstance(connectionConfig, sessionRegistry); try { @@ -216,7 +216,7 @@ public class WebServiceCore implements DBWServiceCore { // Disconnect in async mode? //new DisconnectJob(connectionInfo.getDataSource()).schedule(); } - webSession.getDatabases().getDataSourceRegistry().removeDataSource(connectionInfo.getDataSourceContainer()); + webSession.getDatabasesNode().getDataSourceRegistry().removeDataSource(connectionInfo.getDataSourceContainer()); webSession.removeConnection(connectionInfo); return disconnected; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java index a0119551f6..3adf6c5214 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java @@ -35,6 +35,7 @@ import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.rdb.DBSCatalog; +import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import java.lang.reflect.InvocationTargetException; @@ -56,7 +57,12 @@ public class WebServiceNavigator implements DBWServiceNavigator { DBNNode[] nodeChildren; boolean isRootPath = CommonUtils.isEmpty(parentPath) || "/".equals(parentPath); if (isRootPath) { - nodeChildren = session.getDatabases().getChildren(monitor); + nodeChildren = session.getDatabasesNode().getChildren(monitor); + // Inject extra nodes + List extraNodes = session.getProjectNode().getExtraNodes(); + if (!extraNodes.isEmpty()) { + nodeChildren = ArrayUtils.concatArrays(extraNodes.toArray(new DBNNode[0]), nodeChildren); + } } else { DBNNode parentNode = session.getNavigatorModel().getNodeByPath(monitor, parentPath); if (parentNode == null) {