diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebConnectionConfigInputHandler.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebConnectionConfigInputHandler.java index 57614a98d0..70b11f9506 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebConnectionConfigInputHandler.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebConnectionConfigInputHandler.java @@ -27,8 +27,11 @@ import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration; import org.jkiss.dbeaver.model.connection.DBPDriver; import org.jkiss.dbeaver.registry.DataSourceDescriptor; +import org.jkiss.dbeaver.registry.DataSourcePreferenceStore; import org.jkiss.utils.CommonUtils; +import java.util.Map; + public class WebConnectionConfigInputHandler { private static final Log log = Log.getLog(WebConnectionConfigInputHandler.class); protected final T input; @@ -93,6 +96,11 @@ public void updateDataSource(@NotNull C dataSource) throws DBWebException { input.isSharedCredentials() ); dataSource.setConnectionReadOnly(input.isReadOnly()); + DataSourcePreferenceStore preferenceStore = dataSource.getPreferenceStore(); + Map defaultUserSettings = input.getDefaultUserSettings(); + for (Map.Entry entry : defaultUserSettings.entrySet()) { + preferenceStore.setValue(entry.getKey(), (String)entry.getValue()); + } } @NotNull diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionConfig.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionConfig.java index 277e59c85d..1aa7bae58a 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionConfig.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionConfig.java @@ -23,6 +23,7 @@ import org.jkiss.dbeaver.model.meta.Property; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -64,6 +65,8 @@ public class WebConnectionConfig { private Boolean defaultAutoCommit; private String defaultCatalogName; private String defaultSchemaName; + @NotNull + private Map defaultUserSettings = new LinkedHashMap<>(); public WebConnectionConfig() { } @@ -111,6 +114,7 @@ public WebConnectionConfig(@NotNull Map params) { String configType = JSONUtils.getString(params, "configurationType"); configurationType = configType == null ? null : DBPDriverConfigurationType.valueOf(configType); + defaultUserSettings = JSONUtils.getObject(params, "defaultUserSettings"); networkHandlersConfig = new ArrayList<>(); for (Map nhc : JSONUtils.getObjectList(params, "networkHandlersConfig")) { networkHandlersConfig.add(new WebNetworkHandlerConfigInput(nhc)); @@ -367,4 +371,13 @@ public String getDefaultSchemaName() { public void setDefaultSchemaName(String defaultSchemaName) { this.defaultSchemaName = defaultSchemaName; } + + @NotNull + public Map getDefaultUserSettings() { + return defaultUserSettings; + } + + public void setDefaultUserSettings(@NotNull Map defaultUserSettings) { + this.defaultUserSettings = defaultUserSettings; + } } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionInfo.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionInfo.java index 963339b8c1..558815ede9 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionInfo.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionInfo.java @@ -39,11 +39,13 @@ import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; import org.jkiss.dbeaver.model.navigator.DBNDataSource; +import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor; import org.jkiss.dbeaver.model.preferences.DBPPropertySource; import org.jkiss.dbeaver.model.rm.RMConstants; import org.jkiss.dbeaver.model.rm.RMProjectPermission; import org.jkiss.dbeaver.model.runtime.DBRRunnableParametrized; +import org.jkiss.dbeaver.registry.DataSourcePreferenceStore; import org.jkiss.dbeaver.registry.network.NetworkHandlerDescriptor; import org.jkiss.dbeaver.registry.network.NetworkHandlerRegistry; import org.jkiss.dbeaver.runtime.DBWorkbench; @@ -293,6 +295,16 @@ public DBNBrowseSettings getDefaultNavigatorSettings() { return dataSourceContainer.getNavigatorSettings().getOriginalSettings(); } + @Property + @NotNull + public Map defaultUserSettings() { + DBPPreferenceStore preferenceStore = dataSourceContainer.getPreferenceStore(); + if (preferenceStore instanceof DataSourcePreferenceStore dataSourcePreferenceStore) { + return dataSourcePreferenceStore.getProperties(); + } + return Collections.emptyMap(); + } + @Property @NotNull public List getSupportedDataFormats() { @@ -578,4 +590,14 @@ public List getTools() { public void setCredentialsSavedInSession(@Nullable Boolean credentialsSavedInSession) { this.credentialsSavedInSession = credentialsSavedInSession; } + + + @Property + public Map getConnectionPreferences() { + DBPPreferenceStore preferenceStore = dataSourceContainer.getPreferenceStore(); + if (preferenceStore instanceof DataSourcePreferenceStore dataSourcePreferenceStore) { + return dataSourcePreferenceStore.getProperties(); + } + return Collections.emptyMap(); + } } diff --git a/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls index f09fac54ff..11657345e5 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls @@ -565,6 +565,8 @@ type ConnectionInfo { requiredAuth: String defaultCatalogName: String @since(version: "25.0.5") defaultSchemaName: String @since(version: "25.0.5") + "Default user settings for connection" + defaultUserSettings: Object @since(version: "25.3.5") "List of tools that can be used with this connection. Returns empty list if no tools are available" tools: [String!]! @since(version: "24.1.3") @@ -741,6 +743,8 @@ input ConnectionConfig { defaultCatalogName: String @since(version: "25.0.5") @deprecated(reason: "25.2.1 use expertPropertyValues instead") "Sets schema name for the connection" defaultSchemaName: String @since(version: "25.0.5") @deprecated(reason: "25.2.1 use expertPropertyValues instead") + "Default user settings for connection" + defaultUserSettings: Object @since(version: "25.3.5") } #################################################### @@ -846,6 +850,7 @@ extend type Mutation { "Sets to default navigator settings for connection. Resets all user navigator settings for this connection." clearConnectionNavigatorSettings(projectId: ID!, id: ID!): ConnectionInfo! @since(version: "25.3.2") + setObjectSettings(id: ID!, projectId:ID, objectType: String, settings: Object!): Object! @since(version: "25.3.5") #### Generic async functions "Cancel async task by ID" diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java index 0f5a46f57d..6eb26577d0 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java @@ -24,6 +24,7 @@ import jakarta.servlet.http.HttpServletResponse; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.rm.RMConstants; import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings; import org.jkiss.dbeaver.registry.settings.ProductSettingDescriptor; @@ -213,6 +214,14 @@ WebConnectionInfo clearConnectionNavigatorSettings( @NotNull String id ) throws DBWebException; + Object setObjectSettings( + @NotNull WebSession webSession, + @NotNull String projectId, + @NotNull String objectType, + @NotNull String objectId, + @NotNull Map settings + ) throws DBException; + /////////////////////////////////////////// // Async tasks diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/WebServiceBindingCore.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/WebServiceBindingCore.java index bfc3be1d17..88385a7b36 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/WebServiceBindingCore.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/WebServiceBindingCore.java @@ -160,6 +160,13 @@ public void bindWiring(DBWBindingContext model) throws DBWebException { getArgumentVal(env, "id") ) ) + .dataFetcher("setObjectSettings", env -> getService(env).setObjectSettings( + getWebSession(env), + getProjectReference(env), + getArgumentVal(env, "objectType"), + getArgumentVal(env, "id"), + getArgumentVal(env, "settings") + )) .dataFetcher("asyncTaskInfo", env -> getService(env).getAsyncTaskInfo( getWebSession(env), 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 ada2a84760..082a00a980 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 @@ -58,6 +58,7 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.secret.DBSSecretController; import org.jkiss.dbeaver.model.secret.DBSSecretValue; +import org.jkiss.dbeaver.model.security.SMObjectType; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings; import org.jkiss.dbeaver.registry.DataSourceNavigatorSettingsUtils; @@ -133,6 +134,7 @@ public List getUserConnections( ) throws DBWebException { if (id != null) { WebConnectionInfo connectionInfo = getConnectionState(webSession, projectId, id); + Map connectionPreferences = connectionInfo.getConnectionPreferences(); if (connectionInfo != null) { return Collections.singletonList(connectionInfo); } @@ -760,6 +762,23 @@ public WebConnectionInfo clearConnectionNavigatorSettings( return connectionInfo; } + @Override + public Object setObjectSettings( + @NotNull WebSession webSession, + @NotNull String projectId, + @NotNull String objectType, + @NotNull String objectId, + @NotNull Map settings + ) throws DBException { + + SMObjectType smObjectType = SMObjectType.valueOf(objectType); + webSession.getSecurityController().setObjectSettings(projectId, smObjectType, objectId, settings); + //fixme return proper object + return settings.entrySet().stream() + .filter(e -> e.getValue() != null) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + @Override public WebAsyncTaskInfo getAsyncTaskInfo(WebSession webSession, String taskId, Boolean removeOnFinish) throws DBWebException {