diff --git a/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls index c61f1aa38e..578c632b88 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.core.graphqls @@ -63,6 +63,7 @@ type ServerConfig { supportedLanguages: [ ServerLanguage! ]! services: [ WebServiceConfig ] productConfiguration: Object! + defaultNavigatorSettings: NavigatorSettings! } type SessionInfo { @@ -133,7 +134,8 @@ type DriverPropertyInfo { } # Data source info is a description of some remote database. Doesn't include user credentials -type DataSourceInfo @deprecated { +# Deprectaed. Use ConnectionInfo instead +type DataSourceInfo { id: ID! driverId: ID! name: String! @@ -153,7 +155,7 @@ input ConnectionConfig { description: String # ID of predefined datasource - dataSourceId: ID @deprecated + dataSourceId: ID # deprecated # Custom connection parameters (all optional) @@ -167,8 +169,8 @@ input ConnectionConfig { # User credentials - userName: String @deprecated - userPassword: String @deprecated + userName: String # deprecated + userPassword: String # deprecated authModelId: ID credentials: Object @@ -196,6 +198,26 @@ type DriverAuthModel { parameters: [DriverAuthParameter!]! } +type NavigatorSettings { + showSystemObjects: Boolean! + showUtilityObjects: Boolean! + showOnlyEntities: Boolean! + mergeEntities: Boolean! + hideFolders: Boolean! + hideSchemas: Boolean! + hideVirtualModel: Boolean! +} + +input NavigatorSettingsInput { + showSystemObjects: Boolean! + showUtilityObjects: Boolean! + showOnlyEntities: Boolean! + mergeEntities: Boolean! + hideFolders: Boolean! + hideSchemas: Boolean! + hideVirtualModel: Boolean! +} + # Connection instance type ConnectionInfo { id: ID! @@ -219,6 +241,7 @@ type ConnectionInfo { # Supported features (provided etc) features: [ String! ]! + navigatorSettings: NavigatorSettings! } type LogEntry { @@ -295,6 +318,12 @@ extend type Mutation { # Remove connection and disconnects from the database if needed deleteConnection( id: ID! ): Boolean! + # Changes navigator settings for connection + setConnectionNavigatorSettings( id: ID!, settings: NavigatorSettingsInput!): Boolean! + + # Changes default navigator settings + setDefaultNavigatorSettings( settings: NavigatorSettingsInput!): Boolean! + #### Generic async functions asyncTaskCancel(id: String!): Boolean diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebConnectionInfo.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebConnectionInfo.java index 7e832c8c07..65eb5b17de 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebConnectionInfo.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebConnectionInfo.java @@ -21,8 +21,8 @@ import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.server.CBConstants; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBPDataSourceContainer; -import org.jkiss.dbeaver.model.meta.Association; import org.jkiss.dbeaver.model.meta.Property; +import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; import java.util.ArrayList; import java.util.List; @@ -126,7 +126,7 @@ public class WebConnectionInfo { this.clientVersion = clientVersion; } - @Association + @Property public String[] getFeatures() { List features = new ArrayList<>(); @@ -149,4 +149,9 @@ public class WebConnectionInfo { return features.toArray(new String[0]); } + @Property + public DBNBrowseSettings getNavigatorSettings() { + return dataSourceContainer.getNavigatorSettings(); + } + } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebServerConfig.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebServerConfig.java index 62a39d9ec5..1752598969 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebServerConfig.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/WebServerConfig.java @@ -21,6 +21,7 @@ import io.cloudbeaver.registry.WebServiceRegistry; import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.server.CBPlatform; import org.jkiss.dbeaver.model.meta.Property; +import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; import org.jkiss.dbeaver.registry.language.PlatformLanguageDescriptor; import org.jkiss.dbeaver.registry.language.PlatformLanguageRegistry; import org.jkiss.dbeaver.utils.GeneralUtils; @@ -104,4 +105,9 @@ public class WebServerConfig { return CBPlatform.getInstance().getApplication().getProductConfiguration(); } + @Property + public DBNBrowseSettings getNavigatorSettings() { + return application.getDefaultNavigatorSettings(); + } + } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java index 5dfdd87feb..f6e9ba5829 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java @@ -28,7 +28,9 @@ import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.ModelPreferences; import org.jkiss.dbeaver.model.app.DBPApplication; import org.jkiss.dbeaver.model.data.json.JSONUtils; +import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; import org.jkiss.dbeaver.registry.BaseApplicationImpl; +import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.dbeaver.utils.PrefUtils; @@ -69,6 +71,8 @@ public class CBApplication extends BaseApplicationImpl { private CBDatabase database; private CBSecurityController securityController; + private DBNBrowseSettings defaultNavigatorSettings = DataSourceNavigatorSettings.PRESET_FULL.getSettings(); + private long maxSessionIdleTime = CBConstants.MAX_SESSION_IDLE_TIME; private boolean develMode = false; @@ -340,4 +344,12 @@ public class CBApplication extends BaseApplicationImpl { public boolean isDevelMode() { return develMode; } + + public DBNBrowseSettings getDefaultNavigatorSettings() { + return defaultNavigatorSettings; + } + + public void setDefaultNavigatorSettings(DBNBrowseSettings defaultNavigatorSettings) { + this.defaultNavigatorSettings = defaultNavigatorSettings; + } } 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 ad97e2967c..1634fb04e1 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 @@ -21,6 +21,7 @@ import io.cloudbeaver.DBWebException; import io.cloudbeaver.WebAction; import io.cloudbeaver.model.*; import io.cloudbeaver.model.session.WebSession; +import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; import javax.servlet.http.HttpServletRequest; import java.util.List; @@ -81,6 +82,13 @@ public interface DBWServiceCore extends DBWService { @WebAction boolean closeConnection(WebSession webSession, String connectionId) throws DBWebException; + /////////////////////////////////////////// + // Navigator settings + + boolean setConnectionNavigatorSettings(WebSession webSession, String id, DBNBrowseSettings settings) throws DBWebException; + + boolean setDefaultNavigatorSettings(WebSession webSession, DBNBrowseSettings settings); + /////////////////////////////////////////// // Async tasks @@ -89,4 +97,5 @@ public interface DBWServiceCore extends DBWService { @WebAction boolean cancelAsyncTask(WebSession webSession, String taskId) throws DBWebException; + } 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 2847ace5e9..ab4823d85c 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 @@ -16,6 +16,8 @@ */ package io.cloudbeaver.service.core; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import graphql.TypeResolutionEnvironment; import graphql.schema.DataFetchingEnvironment; import graphql.schema.idl.TypeRuntimeWiring; @@ -27,12 +29,18 @@ import io.cloudbeaver.server.graphql.GraphQLEndpoint; import io.cloudbeaver.service.DBWBindingContext; import io.cloudbeaver.service.WebServiceBindingBase; import io.cloudbeaver.service.core.impl.WebServiceCore; +import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; +import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings; + +import java.util.Map; /** * Web service implementation */ public class WebServiceBindingCore extends WebServiceBindingBase { + private final Gson gson = new GsonBuilder().create(); + public WebServiceBindingCore() { super(DBWServiceCore.class, new WebServiceCore(), "schema/service.core.graphqls"); } @@ -69,6 +77,9 @@ public class WebServiceBindingCore extends WebServiceBindingBase .dataFetcher("testConnection", env -> getService(env).testConnection(getWebSession(env), getConnectionConfig(env))) .dataFetcher("closeConnection", env -> getService(env).closeConnection(getWebSession(env), env.getArgument("id"))) + .dataFetcher("setConnectionNavigatorSettings", env -> getService(env).setConnectionNavigatorSettings(getWebSession(env), env.getArgument("id"), parseNavigatorSettings(env.getArgument("settings")))) + .dataFetcher("setDefaultNavigatorSettings", env -> getService(env).setDefaultNavigatorSettings(getWebSession(env), parseNavigatorSettings(env.getArgument("settings")))) + .dataFetcher("asyncTaskStatus", env -> getService(env).getAsyncTaskStatus(getWebSession(env), env.getArgument("id"))) .dataFetcher("asyncTaskCancel", env -> getService(env).cancelAsyncTask(getWebSession(env), env.getArgument("id"))) ; @@ -77,6 +88,11 @@ public class WebServiceBindingCore extends WebServiceBindingBase ); } + private DBNBrowseSettings parseNavigatorSettings(Map settingsMap) { + return gson.fromJson( + gson.toJsonTree(settingsMap), DataSourceNavigatorSettings.class); + } + private WebConnectionConfig getConnectionConfig(DataFetchingEnvironment env) { return new WebConnectionConfig(env.getArgument("config")); } 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 ffdc3dd42d..6693af66a4 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 @@ -32,6 +32,7 @@ import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry; import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration; import org.jkiss.dbeaver.model.connection.DBPDriver; import org.jkiss.dbeaver.model.exec.DBCException; +import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings; import org.jkiss.dbeaver.runtime.jobs.ConnectionTestJob; @@ -230,6 +231,19 @@ public class WebServiceCore implements DBWServiceCore { return disconnected; } + @Override + public boolean setConnectionNavigatorSettings(WebSession webSession, String id, DBNBrowseSettings settings) throws DBWebException { + WebConnectionInfo connectionInfo = webSession.getWebConnectionInfo(id); + ((DataSourceDescriptor)connectionInfo.getDataSourceContainer()).setNavigatorSettings(settings); + return true; + } + + @Override + public boolean setDefaultNavigatorSettings(WebSession webSession, DBNBrowseSettings settings) { + CBApplication.getInstance().setDefaultNavigatorSettings(settings); + return true; + } + @NotNull private DBPDataSourceContainer makeConnectionInstance(WebConnectionConfig config, DBPDataSourceRegistry sessionRegistry) throws DBWebException { String driverId = config.getDriverId();