From e93a3d1e627667f007e48b68d984ff0ad6bbddcd Mon Sep 17 00:00:00 2001 From: Ainur <59531286+yagudin10@users.noreply.github.com> Date: Wed, 19 Feb 2025 14:14:10 +0200 Subject: [PATCH] CB-6102 add event listener filter for a session global project (#3259) --- ...ava => WebGlobalProjectRegistryProxy.java} | 35 +++++++++++++++++-- .../WebSessionGlobalProjectImpl.java | 2 +- 2 files changed, 33 insertions(+), 4 deletions(-) rename server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/{WebDataSourceRegistryProxy.java => WebGlobalProjectRegistryProxy.java} (89%) diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebGlobalProjectRegistryProxy.java similarity index 89% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebGlobalProjectRegistryProxy.java index c29e00d7de..bf7584ba78 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebGlobalProjectRegistryProxy.java @@ -43,13 +43,17 @@ import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; -public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSourcePersistentRegistry, DBPDataSourceRegistryCache { +/** + * Proxy for a global project data source registry. + * We need to filter some data sources in case of inaccessibility (not enough permissions). + */ +public class WebGlobalProjectRegistryProxy implements DBPDataSourceRegistry, DataSourcePersistentRegistry, DBPDataSourceRegistryCache { @NotNull private final DataSourceFilter dataSourceFilter; @NotNull private final DataSourceRegistry dataSourceRegistry; - public WebDataSourceRegistryProxy(@NotNull DataSourceRegistry dataSourceRegistry, @NotNull DataSourceFilter filter) { + public WebGlobalProjectRegistryProxy(@NotNull DataSourceRegistry dataSourceRegistry, @NotNull DataSourceFilter filter) { this.dataSourceRegistry = dataSourceRegistry; this.dataSourceFilter = filter; } @@ -141,7 +145,7 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo @Override public void addDataSourceListener(@NotNull DBPEventListener listener) { - dataSourceRegistry.addDataSourceListener(listener); + dataSourceRegistry.addDataSourceListener(new WebDBPEventListenerProxy(listener)); } @Override @@ -387,4 +391,29 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo public void resolveSecrets(DBSSecretController secretController) throws DBException { dataSourceRegistry.resolveSecrets(secretController); } + + /** + * Event listener proxy. + * For some cases (like creating data source) we should not send event because of accessibility of connection. + */ + private class WebDBPEventListenerProxy implements DBPEventListener { + @NotNull + private final DBPEventListener eventListener; + + public WebDBPEventListenerProxy(@NotNull DBPEventListener eventListener) { + this.eventListener = eventListener; + } + + @Override + public void handleDataSourceEvent(@NotNull DBPEvent event) { + if (event.getAction() == DBPEvent.Action.OBJECT_ADD && + event.getObject() instanceof DBPDataSourceContainer container && + !dataSourceFilter.filter(container) + ) { + // we cannot send event of creating data source connection because it is not accessible for user + return; + } + eventListener.handleDataSourceEvent(event); + } + } } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionGlobalProjectImpl.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionGlobalProjectImpl.java index 49663933cf..403e8f4178 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionGlobalProjectImpl.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebSessionGlobalProjectImpl.java @@ -49,7 +49,7 @@ public class WebSessionGlobalProjectImpl extends WebSessionProjectImpl { @NotNull @Override protected DBPDataSourceRegistry createDataSourceRegistry() { - return new WebDataSourceRegistryProxy( + return new WebGlobalProjectRegistryProxy( createRegistryWithCredentialsProvider(), this::isDataSourceAccessible );