From 47bb280cf34fd9a33d7a498666bee10a6fa4a6cd Mon Sep 17 00:00:00 2001 From: Ainur <59531286+yagudin10@users.noreply.github.com> Date: Wed, 31 Aug 2022 11:00:07 +0300 Subject: [PATCH] CB-2464 de save data sources remotely fix (#1081) * CB-2464 de save data sources remotely fix * CB-2464 add data source persistence registry --- .../io/cloudbeaver/VirtualProjectImpl.java | 5 +- .../WebDataSourceRegistryProxy.java | 259 +++++++++++++++++- .../rm/local/LocalResourceController.java | 13 +- .../cloudbeaver/model/session/WebSession.java | 7 +- .../navigator/WebNavigatorNodeInfo.java | 2 +- 5 files changed, 259 insertions(+), 27 deletions(-) diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/VirtualProjectImpl.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/VirtualProjectImpl.java index 1143f8a800..389d994751 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/VirtualProjectImpl.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/VirtualProjectImpl.java @@ -20,6 +20,7 @@ import io.cloudbeaver.model.rm.RMUtils; import org.eclipse.core.resources.IProject; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry; import org.jkiss.dbeaver.model.auth.SMSessionContext; import org.jkiss.dbeaver.model.rm.RMProject; import org.jkiss.dbeaver.registry.BaseProjectImpl; @@ -93,7 +94,7 @@ public class VirtualProjectImpl extends BaseProjectImpl { @NotNull @Override - protected DataSourceRegistry createDataSourceRegistry() { - return new WebDataSourceRegistryProxy(super.createDataSourceRegistry(), dataSourceFilter); + protected DBPDataSourceRegistry createDataSourceRegistry() { + return new WebDataSourceRegistryProxy(new DataSourceRegistry(this), dataSourceFilter); } } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java index 89d9cc9905..eca241b2b3 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java @@ -7,30 +7,40 @@ import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.*; import org.jkiss.dbeaver.model.access.DBAAuthProfile; import org.jkiss.dbeaver.model.access.DBACredentialsProvider; +import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration; import org.jkiss.dbeaver.model.connection.DBPDriver; import org.jkiss.dbeaver.model.net.DBWNetworkProfile; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSObjectFilter; -import org.jkiss.dbeaver.registry.DataSourceDescriptor; -import org.jkiss.dbeaver.registry.DataSourceFolder; +import org.jkiss.dbeaver.registry.DataSourceConfigurationManager; +import org.jkiss.dbeaver.registry.DataSourcePersistentRegistry; import org.jkiss.dbeaver.registry.DataSourceRegistry; import java.util.List; +import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collectors; -public class WebDataSourceRegistryProxy extends DataSourceRegistry { +public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSourcePersistentRegistry { private final DataSourceFilter dataSourceFilter; + private final DataSourceRegistry dataSourceRegistry; public WebDataSourceRegistryProxy(DataSourceRegistry dataSourceRegistry, DataSourceFilter filter) { - super(dataSourceRegistry.getProject()); + this.dataSourceRegistry = dataSourceRegistry; this.dataSourceFilter = filter; } + @Override + public DBPProject getProject() { + return dataSourceRegistry.getProject(); + } + @Nullable @Override - public DataSourceDescriptor getDataSource(String id) { - DataSourceDescriptor dataSource = super.getDataSource(id); + public DBPDataSourceContainer getDataSource(String id) { + DBPDataSourceContainer dataSource = dataSourceRegistry.getDataSource(id); if (dataSourceFilter != null && !dataSourceFilter.filter(dataSource)) { return null; } @@ -39,17 +49,17 @@ public class WebDataSourceRegistryProxy extends DataSourceRegistry { @Nullable @Override - public DataSourceDescriptor getDataSource(DBPDataSource dataSource) { + public DBPDataSourceContainer getDataSource(DBPDataSource dataSource) { if (dataSourceFilter != null && !dataSourceFilter.filter(dataSource.getContainer())) { return null; } - return super.getDataSource(dataSource); + return dataSourceRegistry.getDataSource(dataSource); } @Nullable @Override - public DataSourceDescriptor findDataSourceByName(String name) { - var dataSource = super.findDataSourceByName(name); + public DBPDataSourceContainer findDataSourceByName(String name) { + var dataSource = dataSourceRegistry.findDataSourceByName(name); if (dataSource != null) { if (dataSourceFilter == null || dataSourceFilter.filter(dataSource)) { return dataSource; @@ -61,7 +71,7 @@ public class WebDataSourceRegistryProxy extends DataSourceRegistry { @NotNull @Override public List getDataSourcesByProfile(@NotNull DBWNetworkProfile profile) { - return super.getDataSourcesByProfile(profile) + return dataSourceRegistry.getDataSourcesByProfile(profile) .stream() .filter(dataSourceFilter::filter) .collect(Collectors.toList()); @@ -69,10 +79,233 @@ public class WebDataSourceRegistryProxy extends DataSourceRegistry { @NotNull @Override - public List getDataSources() { - return super.getDataSources() + public List getDataSources() { + return dataSourceRegistry.getDataSources() .stream() .filter(dataSourceFilter::filter) .collect(Collectors.toList()); } + + @NotNull + @Override + public DBPDataSourceContainer createDataSource(DBPDriver driver, DBPConnectionConfiguration connConfig) { + return dataSourceRegistry.createDataSource(driver, connConfig); + } + + @NotNull + @Override + public DBPDataSourceContainer createDataSource(DBPDataSourceContainer source) { + return dataSourceRegistry.createDataSource(source); + } + + @Override + public void addDataSourceListener(@NotNull DBPEventListener listener) { + dataSourceRegistry.addDataSourceListener(listener); + } + + @Override + public boolean removeDataSourceListener(@NotNull DBPEventListener listener) { + return dataSourceRegistry.removeDataSourceListener(listener); + } + + @Override + public void addDataSource(@NotNull DBPDataSourceContainer dataSource) { + dataSourceRegistry.addDataSource(dataSource); + } + + @Override + public void removeDataSource(@NotNull DBPDataSourceContainer dataSource) { + dataSourceRegistry.removeDataSource(dataSource); + } + + @Override + public void updateDataSource(@NotNull DBPDataSourceContainer dataSource) { + dataSourceRegistry.updateDataSource(dataSource); + } + + @NotNull + @Override + public List getAllFolders() { + return dataSourceRegistry.getAllFolders(); + } + + @NotNull + @Override + public List getRootFolders() { + return dataSourceRegistry.getRootFolders(); + } + + @Override + public DBPDataSourceFolder getFolder(String path) { + return dataSourceRegistry.getFolder(path); + } + + @Override + public DBPDataSourceFolder addFolder(DBPDataSourceFolder parent, String name) { + return dataSourceRegistry.addFolder(parent, name); + } + + @Override + public void removeFolder(DBPDataSourceFolder folder, boolean dropContents) { + dataSourceRegistry.removeFolder(folder, dropContents); + } + + @Nullable + @Override + public DBSObjectFilter getSavedFilter(String name) { + return dataSourceRegistry.getSavedFilter(name); + } + + @NotNull + @Override + public List getSavedFilters() { + return dataSourceRegistry.getSavedFilters(); + } + + @Override + public void updateSavedFilter(DBSObjectFilter filter) { + dataSourceRegistry.updateSavedFilter(filter); + } + + @Override + public void removeSavedFilter(String filterName) { + dataSourceRegistry.removeSavedFilter(filterName); + } + + @Nullable + @Override + public DBWNetworkProfile getNetworkProfile(String name) { + return dataSourceRegistry.getNetworkProfile(name); + } + + @NotNull + @Override + public List getNetworkProfiles() { + return dataSourceRegistry.getNetworkProfiles(); + } + + @Override + public void updateNetworkProfile(DBWNetworkProfile profile) { + dataSourceRegistry.updateNetworkProfile(profile); + } + + @Override + public void removeNetworkProfile(DBWNetworkProfile profile) { + dataSourceRegistry.removeNetworkProfile(profile); + } + + @Nullable + @Override + public DBAAuthProfile getAuthProfile(String id) { + return dataSourceRegistry.getAuthProfile(id); + } + + @NotNull + @Override + public List getAllAuthProfiles() { + return dataSourceRegistry.getAllAuthProfiles(); + } + + @NotNull + @Override + public List getApplicableAuthProfiles(@Nullable DBPDriver driver) { + return dataSourceRegistry.getApplicableAuthProfiles(driver); + } + + @Override + public void updateAuthProfile(DBAAuthProfile profile) { + dataSourceRegistry.updateAuthProfile(profile); + } + + @Override + public void removeAuthProfile(DBAAuthProfile profile) { + dataSourceRegistry.removeAuthProfile(profile); + } + + @Override + public void flushConfig() { + dataSourceRegistry.flushConfig(); + } + + @Override + public void refreshConfig() { + dataSourceRegistry.refreshConfig(); + } + + @Override + public Throwable getLastError() { + return dataSourceRegistry.getLastError(); + } + + @Override + public boolean hasError() { + return dataSourceRegistry.hasError(); + } + + @Override + public void checkForErrors() throws DBException { + dataSourceRegistry.checkForErrors(); + } + + @Override + public void notifyDataSourceListeners(DBPEvent event) { + dataSourceRegistry.notifyDataSourceListeners(event); + } + + @NotNull + @Override + public ISecurePreferences getSecurePreferences() { + return dataSourceRegistry.getSecurePreferences(); + } + + @Nullable + @Override + public DBACredentialsProvider getAuthCredentialsProvider() { + return dataSourceRegistry.getAuthCredentialsProvider(); + } + + @Override + public void dispose() { + dataSourceRegistry.dispose(); + } + + @Override + public void setAuthCredentialsProvider(DBACredentialsProvider authCredentialsProvider) { + dataSourceRegistry.setAuthCredentialsProvider(authCredentialsProvider); + } + + @Override + public Set getTemporaryFolders() { + return dataSourceRegistry.getTemporaryFolders(); + } + + @Override + public void loadDataSources( + @NotNull List storages, + @NotNull DataSourceConfigurationManager manager, + boolean refresh, + boolean purgeUntouched + ) { + dataSourceRegistry.loadDataSources(storages, manager, refresh, purgeUntouched); + } + + @Override + public void saveDataSources() { + dataSourceRegistry.saveDataSources(); + } + + @Override + public DataSourceConfigurationManager getConfigurationManager() { + return dataSourceRegistry.getConfigurationManager(); + } + + @Override + public void saveConfigurationToManager( + @NotNull DBRProgressMonitor monitor, + @NotNull DataSourceConfigurationManager configurationManager, + @Nullable Predicate filter + ) { + dataSourceRegistry.saveConfigurationToManager(monitor, configurationManager, filter); + } + } 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 9d45432cac..80d89ceeb2 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 @@ -27,6 +27,7 @@ import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSourceConfigurationStorage; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.auth.SMCredentials; @@ -259,7 +260,7 @@ public class LocalResourceController implements RMController { DBPDataSourceRegistry registry = projectMetadata.getDataSourceRegistry(); registry.checkForErrors(); DataSourceConfigurationManagerBuffer buffer = new DataSourceConfigurationManagerBuffer(); - ((DataSourceRegistry)registry).saveConfigurationToManager(new VoidProgressMonitor(), buffer, null); + ((DataSourcePersistentRegistry) registry).saveConfigurationToManager(new VoidProgressMonitor(), buffer, null); registry.checkForErrors(); return new String(buffer.getData(), StandardCharsets.UTF_8); } @@ -267,22 +268,22 @@ public class LocalResourceController implements RMController { @Override public void saveProjectDataSources(@NotNull String projectId, @NotNull String configuration) throws DBException { final DBPProject project = getProjectMetadata(projectId); - final DataSourceRegistry registry = (DataSourceRegistry) project.getDataSourceRegistry(); + final DBPDataSourceRegistry registry = project.getDataSourceRegistry(); final DBPDataSourceConfigurationStorage storage = new DataSourceMemoryStorage(configuration.getBytes(StandardCharsets.UTF_8)); final DataSourceConfigurationManager manager = new DataSourceConfigurationManagerBuffer(); - registry.loadDataSources(List.of(storage), manager, true, false); + ((DataSourcePersistentRegistry) registry).loadDataSources(List.of(storage), manager, true, false); registry.checkForErrors(); - registry.saveDataSources(); + ((DataSourcePersistentRegistry) registry).saveDataSources(); registry.checkForErrors(); } @Override public void deleteProjectDataSources(@NotNull String projectId, @NotNull String[] dataSourceIds) throws DBException { final DBPProject project = getProjectMetadata(projectId); - final DataSourceRegistry registry = (DataSourceRegistry) project.getDataSourceRegistry(); + final DBPDataSourceRegistry registry = project.getDataSourceRegistry(); for (String dataSourceId : dataSourceIds) { - final DataSourceDescriptor dataSource = registry.getDataSource(dataSourceId); + final DBPDataSourceContainer dataSource = registry.getDataSource(dataSourceId); if (dataSource != null) { registry.removeDataSource(dataSource); 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 adad2d4f5c..d2ce091a70 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 @@ -16,10 +16,7 @@ */ package io.cloudbeaver.model.session; -import io.cloudbeaver.DBWConstants; -import io.cloudbeaver.DBWebException; -import io.cloudbeaver.DataSourceFilter; -import io.cloudbeaver.VirtualProjectImpl; +import io.cloudbeaver.*; import io.cloudbeaver.model.WebAsyncTaskInfo; import io.cloudbeaver.model.WebConnectionInfo; import io.cloudbeaver.model.WebServerMessage; @@ -366,7 +363,7 @@ public class WebSession extends AbstractSessionPersistent implements SMSession, this, filter); DBPDataSourceRegistry dataSourceRegistry = sessionProject.getDataSourceRegistry(); - ((DataSourceRegistry) dataSourceRegistry).setAuthCredentialsProvider(this); + dataSourceRegistry.setAuthCredentialsProvider(this); addSessionProject(sessionProject); if (!project.isShared() || application.isConfigurationMode()) { this.defaultProject = sessionProject; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java index 5afb3bb4ea..bd490aade0 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java @@ -160,7 +160,7 @@ public class WebNavigatorNodeInfo { } else if (node instanceof DBNLocalFolder) { DataSourceFolder folder = (DataSourceFolder) ((DBNLocalFolder) node).getFolder(); String projectName = folder.getDataSourceRegistry().getProject().getName(); - Set tempFolders = ((DataSourceRegistry) folder.getDataSourceRegistry()).getTemporaryFolders(); + Set tempFolders = folder.getDataSourceRegistry().getTemporaryFolders(); isShared = !projectName.equals(session.getUserId()) || tempFolders.contains(folder); } if (isShared) {