From dfd6eddb5979e704d250900f2f1da34c7c7869f9 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Wed, 29 Apr 2020 09:57:09 +0300 Subject: [PATCH] #8 Navigator service --- .../bundles/io.cloudbeaver.server/plugin.xml | 4 + .../schema/schema.graphqls | 38 ------- .../schema/service.navigator.graphqls | 46 ++++++++ .../cloudbeaver/model/session/WebSession.java | 63 +---------- .../server/graphql/GraphQLBindingContext.java | 12 --- .../service/WebServiceBindingBase.java | 25 ++++- .../navigator/DBWServiceNavigator.java | 41 +++++++ .../navigator/WebServiceBindingNavigator.java | 55 ++++++++++ .../navigator/impl/WebServiceNavigator.java | 102 ++++++++++++++++++ .../service/admin/WebServiceBindingAdmin.java | 7 +- .../service/auth/WebServiceBindingAuth.java | 7 +- .../WebServiceBindingDataTransfer.java | 31 ++---- .../service/metadata/DBWServiceMetadata.java | 3 +- .../metadata/WebServiceBindingMetadata.java | 23 ++-- .../metadata/impl/WebServiceMetadata.java | 7 +- 15 files changed, 297 insertions(+), 167 deletions(-) create mode 100644 server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebServiceBindingNavigator.java create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java diff --git a/server/bundles/io.cloudbeaver.server/plugin.xml b/server/bundles/io.cloudbeaver.server/plugin.xml index 6a5b324043..adf664c300 100644 --- a/server/bundles/io.cloudbeaver.server/plugin.xml +++ b/server/bundles/io.cloudbeaver.server/plugin.xml @@ -34,4 +34,8 @@ + + + + diff --git a/server/bundles/io.cloudbeaver.server/schema/schema.graphqls b/server/bundles/io.cloudbeaver.server/schema/schema.graphqls index eb12eba5c4..5044433385 100644 --- a/server/bundles/io.cloudbeaver.server/schema/schema.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/schema.graphqls @@ -258,31 +258,6 @@ type DatabaseObjectInfo { editors: [ String ] } -type NavigatorNodeInfo { - # Node ID - generally a full path to the node from root of tree - id: ID! - # Node human readable name - name: String - # Node icon path - icon: String - # Node description - description: String - # Node type - nodeType: String - # Can this property have child nodes? - hasChildren: Boolean - - # Associated object. Maybe null for non-database objects - object: DatabaseObjectInfo - - # Supported features: item, container, leaf - features: [ String ] - - folder: Boolean - inline: Boolean - navigable: Boolean -} - #################################################### # SQL helpers #################################################### @@ -426,19 +401,6 @@ type Query { readSessionLog(maxEntries: Int, clearEntries: Boolean): [ LogEntry! ] - # Get child nodes - navNodeChildren( - parentPath: ID!, - offset: Int, - limit: Int, - onlyFolders: Boolean): [ NavigatorNodeInfo! ] - - navNodeInfo( nodePath: ID! ): NavigatorNodeInfo - - navRefreshNode( nodePath: ID! ): Boolean - - navGetStructContainers( connectionId: ID!, catalog: ID ): DatabaseStructContainers! - sqlDialectInfo( connectionId: ID! ): SQLDialectInfo sqlListContexts( connectionId: ID! ): [ SQLContextInfo ] diff --git a/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls new file mode 100644 index 0000000000..2b62bd33a2 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls @@ -0,0 +1,46 @@ + +type NavigatorNodeInfo { + # Node ID - generally a full path to the node from root of tree + id: ID! + # Node human readable name + name: String + # Node icon path + icon: String + # Node description + description: String + # Node type + nodeType: String + # Can this property have child nodes? + hasChildren: Boolean + + # Associated object. Maybe null for non-database objects + object: DatabaseObjectInfo + + # Supported features: item, container, leaf + features: [ String ] + + folder: Boolean + inline: Boolean + navigable: Boolean +} + +#################################################### +# Main API +#################################################### + +extend type Query { + + # Get child nodes + navNodeChildren( + parentPath: ID!, + offset: Int, + limit: Int, + onlyFolders: Boolean): [ NavigatorNodeInfo! ] + + navNodeInfo( nodePath: ID! ): NavigatorNodeInfo + + navRefreshNode( nodePath: ID! ): Boolean + + navGetStructContainers( connectionId: ID!, catalog: ID ): DatabaseStructContainers! + +} 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 bfdb674de8..fc5abc7665 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 @@ -60,8 +60,6 @@ public class WebSession { private static final Log log = Log.getLog(WebSession.class); - public static final List EMPTY_NODE_LIST = Collections.emptyList(); - private static final String ATTR_LOCALE = "locale"; private static final AtomicInteger TASK_ID = new AtomicInteger(); @@ -141,6 +139,10 @@ public class WebSession { return navigatorModel; } + public DBNProjectDatabases getDatabases() { + return databases; + } + /** * Returns and clears progress messages */ @@ -359,63 +361,6 @@ public class WebSession { } } - public List getNavigatorNodeChildren(String parentPath, Integer offset, Integer limit, Boolean onlyFolders) throws DBWebException { - try { - DBRProgressMonitor monitor = getProgressMonitor(); - - DBNNode parentNode = CommonUtils.isEmpty(parentPath) || "/".equals(parentPath) ? databases : navigatorModel.getNodeByPath(monitor, parentPath); - if (parentNode == null) { - throw new DBWebException("Node '" + parentPath + "' not found"); - } - if (!parentNode.hasChildren(true)) { - return EMPTY_NODE_LIST; - } - DBNNode[] nodeChildren = parentNode.getChildren(monitor); - if (nodeChildren == null) { - return EMPTY_NODE_LIST; - } - List result = new ArrayList<>(); - for (DBNNode node : nodeChildren) { - if (!CommonUtils.toBoolean(onlyFolders) || node instanceof DBNContainer) { - result.add(new WebNavigatorNodeInfo(this, node)); - } - } - return result; - } catch (DBException e) { - throw new DBWebException("Error getting navigator nodes", e); - } - } - - @NotNull - public WebNavigatorNodeInfo getNavigatorNodeInfo(String nodePath) throws DBWebException { - try { - DBRProgressMonitor monitor = getProgressMonitor(); - - DBNNode node = navigatorModel.getNodeByPath(monitor, nodePath); - if (node == null) { - throw new DBWebException("Navigator node '" + nodePath + "' not found"); - } - return new WebNavigatorNodeInfo(this, node); - } catch (DBException e) { - throw new DBWebException("Error getting navigator node '" + nodePath + "'", e); - } - } - - public boolean refreshNavigatorNode(String nodePath) throws DBWebException { - try { - DBRProgressMonitor monitor = getProgressMonitor(); - - DBNNode node = navigatorModel.getNodeByPath(monitor, nodePath); - if (node == null) { - throw new DBWebException("Navigator node '" + nodePath + "' not found"); - } - node.refreshNode(monitor, this); - return true; - } catch (DBException e) { - throw new DBWebException("Error refreshing navigator node '" + nodePath + "'", e); - } - } - public DBRProgressMonitor getProgressMonitor() { return progressMonitor; } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/graphql/GraphQLBindingContext.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/graphql/GraphQLBindingContext.java index b92cb5f037..74eb2302d3 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/graphql/GraphQLBindingContext.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/graphql/GraphQLBindingContext.java @@ -77,18 +77,6 @@ class GraphQLBindingContext implements DBWBindingContext { env.getArgument("maxEntries"), env.getArgument("clearEntries"))) - .dataFetcher("navNodeChildren", env -> sessionManager.getWebSession(getServletRequest(env)).getNavigatorNodeChildren( - env.getArgument("parentPath"), env.getArgument("offset"), env.getArgument("limit"), env.getArgument("onlyFolders"))) - .dataFetcher("navNodeInfo", env -> sessionManager.getWebSession(getServletRequest(env)).getNavigatorNodeInfo( - env.getArgument("nodePath"))) - .dataFetcher("navRefreshNode", env -> sessionManager.getWebSession(getServletRequest(env)).refreshNavigatorNode( - env.getArgument("nodePath") - )) - - .dataFetcher("navGetStructContainers", env -> DBWUtils.getSQLProcessor(sessionManager, env).getStructContainers( - env.getArgument("catalog") - )) - .dataFetcher("sqlDialectInfo", env -> DBWUtils.getSQLProcessor(sessionManager, env).getDialectInfo() ) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java index 0be1d3f424..7ebfd9471c 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java @@ -19,9 +19,12 @@ package io.cloudbeaver.service; import graphql.schema.DataFetchingEnvironment; import graphql.schema.idl.SchemaParser; import graphql.schema.idl.TypeDefinitionRegistry; +import io.cloudbeaver.DBWUtils; import io.cloudbeaver.DBWebException; import io.cloudbeaver.DBWService; +import io.cloudbeaver.model.session.WebSession; +import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -36,22 +39,28 @@ import java.lang.reflect.Proxy; public abstract class WebServiceBindingBase implements DBWServiceBindingGraphQL { private final Class apiInterface; - private API_TYPE serviceImpl; + private final API_TYPE serviceImpl; + private final String schemaFileName; - - public WebServiceBindingBase(Class apiInterface, API_TYPE impl) { + public WebServiceBindingBase(Class apiInterface, API_TYPE impl, String schemaFileName) { this.apiInterface = apiInterface; this.serviceImpl = impl; + this.schemaFileName = schemaFileName; } protected API_TYPE getServiceImpl() { return serviceImpl; } + @Override + public TypeDefinitionRegistry getTypeDefinition() throws DBWebException { + return loadSchemaDefinition(getClass(), schemaFileName); + } + /** * Creates proxy for permission checks and other general API calls validation/logging. */ - protected API_TYPE getAPI(DataFetchingEnvironment env) { + protected API_TYPE getService(DataFetchingEnvironment env) { Object proxyImpl = Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{apiInterface}, new ServiceInvocationHandler(serviceImpl)); return apiInterface.cast(proxyImpl); } @@ -69,6 +78,14 @@ public abstract class WebServiceBindingBase impleme } } + protected HttpServletRequest getServletRequest(DataFetchingEnvironment env) { + return DBWUtils.getServletRequest(env); + } + + protected WebSession getWebSession(DBWBindingContext model, DataFetchingEnvironment env) throws DBWebException { + return model.getSessionManager().getWebSession(getServletRequest(env)); + } + private class ServiceInvocationHandler implements InvocationHandler { private final API_TYPE impl; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java new file mode 100644 index 0000000000..07b1ec7421 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java @@ -0,0 +1,41 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.service.navigator; + +import io.cloudbeaver.DBWService; +import io.cloudbeaver.DBWebException; +import io.cloudbeaver.WebAction; +import io.cloudbeaver.model.WebNavigatorNodeInfo; +import io.cloudbeaver.model.session.WebSession; + +import java.util.List; + +/** + * Web service API + */ +public interface DBWServiceNavigator extends DBWService { + + @WebAction + List getNavigatorNodeChildren(WebSession session, String parentPath, Integer offset, Integer limit, Boolean onlyFolders) throws DBWebException; + + @WebAction + WebNavigatorNodeInfo getNavigatorNodeInfo(WebSession session, String nodePath) throws DBWebException; + + @WebAction + boolean refreshNavigatorNode(WebSession session, String nodePath) throws DBWebException; + +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebServiceBindingNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebServiceBindingNavigator.java new file mode 100644 index 0000000000..e24cdaf8dc --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebServiceBindingNavigator.java @@ -0,0 +1,55 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.service.navigator; + +import io.cloudbeaver.DBWUtils; +import io.cloudbeaver.DBWebException; +import io.cloudbeaver.service.DBWBindingContext; +import io.cloudbeaver.service.WebServiceBindingBase; +import io.cloudbeaver.service.navigator.impl.WebServiceNavigator; + +/** + * Web service implementation + */ +public class WebServiceBindingNavigator extends WebServiceBindingBase { + + public WebServiceBindingNavigator() { + super(DBWServiceNavigator.class, new WebServiceNavigator(), "schema/service.navigator.graphqls"); + } + + @Override + public void bindWiring(DBWBindingContext model) throws DBWebException { + model.getQueryType() + .dataFetcher("navNodeChildren", env -> getService(env).getNavigatorNodeChildren( + getWebSession(model, env), + env.getArgument("parentPath"), + env.getArgument("offset"), + env.getArgument("limit"), + env.getArgument("onlyFolders"))) + .dataFetcher("navNodeInfo", env -> getService(env).getNavigatorNodeInfo( + getWebSession(model, env), + env.getArgument("nodePath"))) + .dataFetcher("navRefreshNode", env -> getService(env).refreshNavigatorNode( + getWebSession(model, env), + env.getArgument("nodePath") + )) + .dataFetcher("navGetStructContainers", env -> DBWUtils.getSQLProcessor(model.getSessionManager(), env).getStructContainers( + env.getArgument("catalog") + )); + } + +} 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 new file mode 100644 index 0000000000..ac23eb4284 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java @@ -0,0 +1,102 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.service.navigator.impl; + + +import io.cloudbeaver.DBWebException; +import io.cloudbeaver.model.WebNavigatorNodeInfo; +import io.cloudbeaver.model.session.WebSession; +import io.cloudbeaver.service.navigator.DBWServiceNavigator; +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.model.navigator.DBNContainer; +import org.jkiss.dbeaver.model.navigator.DBNNode; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.utils.CommonUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Web service implementation + */ +public class WebServiceNavigator implements DBWServiceNavigator { + private static final List EMPTY_NODE_LIST = Collections.emptyList(); + + @Override + public List getNavigatorNodeChildren(WebSession session, String parentPath, Integer offset, Integer limit, Boolean onlyFolders) throws DBWebException { + try { + DBRProgressMonitor monitor = session.getProgressMonitor(); + + DBNNode parentNode = CommonUtils.isEmpty(parentPath) || "/".equals(parentPath) ? session.getDatabases() : session.getNavigatorModel().getNodeByPath(monitor, parentPath); + if (parentNode == null) { + throw new DBWebException("Node '" + parentPath + "' not found"); + } + if (!parentNode.hasChildren(true)) { + return EMPTY_NODE_LIST; + } + DBNNode[] nodeChildren = parentNode.getChildren(monitor); + if (nodeChildren == null) { + return EMPTY_NODE_LIST; + } + List result = new ArrayList<>(); + for (DBNNode node : nodeChildren) { + if (!CommonUtils.toBoolean(onlyFolders) || node instanceof DBNContainer) { + result.add(new WebNavigatorNodeInfo(session, node)); + } + } + return result; + } catch (DBException e) { + throw new DBWebException("Error getting navigator nodes", e); + } + } + + @Override + @NotNull + public WebNavigatorNodeInfo getNavigatorNodeInfo(WebSession session, String nodePath) throws DBWebException { + try { + DBRProgressMonitor monitor = session.getProgressMonitor(); + + DBNNode node = session.getNavigatorModel().getNodeByPath(monitor, nodePath); + if (node == null) { + throw new DBWebException("Navigator node '" + nodePath + "' not found"); + } + return new WebNavigatorNodeInfo(session, node); + } catch (DBException e) { + throw new DBWebException("Error getting navigator node '" + nodePath + "'", e); + } + } + + @Override + public boolean refreshNavigatorNode(WebSession session, String nodePath) throws DBWebException { + try { + DBRProgressMonitor monitor = session.getProgressMonitor(); + + DBNNode node = session.getNavigatorModel().getNodeByPath(monitor, nodePath); + if (node == null) { + throw new DBWebException("Navigator node '" + nodePath + "' not found"); + } + node.refreshNode(monitor, this); + return true; + } catch (DBException e) { + throw new DBWebException("Error refreshing navigator node '" + nodePath + "'", e); + } + } + + +} diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java index 118eced743..675e0c2052 100644 --- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java @@ -30,12 +30,7 @@ public class WebServiceBindingAdmin extends WebServiceBindingBase private static final String SCHEMA_FILE_NAME = "schema/service.auth.graphqls"; public WebServiceBindingAuth() { - super(DBWServiceAuth.class, new WebServiceAuthImpl()); - } - - @Override - public TypeDefinitionRegistry getTypeDefinition() throws DBWebException { - return loadSchemaDefinition(getClass(), SCHEMA_FILE_NAME); + super(DBWServiceAuth.class, new WebServiceAuthImpl(), SCHEMA_FILE_NAME); } @Override diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/WebServiceBindingDataTransfer.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/WebServiceBindingDataTransfer.java index 081587ed67..ca61d7d223 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/WebServiceBindingDataTransfer.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/WebServiceBindingDataTransfer.java @@ -16,18 +16,14 @@ */ package io.cloudbeaver.service.data.transfer; -import graphql.schema.DataFetchingEnvironment; -import graphql.schema.idl.TypeDefinitionRegistry; -import io.cloudbeaver.DBWebException; +import io.cloudbeaver.DBWUtils; +import io.cloudbeaver.server.CloudbeaverApplication; import io.cloudbeaver.service.DBWBindingContext; import io.cloudbeaver.service.DBWServiceBindingServlet; -import io.cloudbeaver.DBWUtils; import io.cloudbeaver.service.WebServiceBindingBase; -import io.cloudbeaver.server.CloudbeaverApplication; -import io.cloudbeaver.model.session.WebSession; -import io.cloudbeaver.service.data.transfer.impl.WebServiceDataTransfer; import io.cloudbeaver.service.data.transfer.impl.WebDataTransferParameters; import io.cloudbeaver.service.data.transfer.impl.WebDataTransferServlet; +import io.cloudbeaver.service.data.transfer.impl.WebServiceDataTransfer; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; @@ -36,15 +32,8 @@ import org.eclipse.jetty.servlet.ServletHolder; */ public class WebServiceBindingDataTransfer extends WebServiceBindingBase implements DBWServiceBindingServlet { - private static final String DT_SCHEMA_FILE_NAME = "schema/service.data.transfer.graphqls"; - public WebServiceBindingDataTransfer() { - super(DBWServiceDataTransfer.class, new WebServiceDataTransfer()); - } - - @Override - public TypeDefinitionRegistry getTypeDefinition() throws DBWebException { - return loadSchemaDefinition(getClass(), DT_SCHEMA_FILE_NAME); + super(DBWServiceDataTransfer.class, new WebServiceDataTransfer(), "schema/service.data.transfer.graphqls"); } @Override @@ -52,18 +41,18 @@ public class WebServiceBindingDataTransfer extends WebServiceBindingBase getAPI(env).getAvailableStreamProcessors(getWebSession(model, env))) - .dataFetcher("dataTransferExportDataFromContainer", env -> getAPI(env).dataTransferExportDataFromContainer( + env -> getService(env).getAvailableStreamProcessors(getWebSession(model, env))) + .dataFetcher("dataTransferExportDataFromContainer", env -> getService(env).dataTransferExportDataFromContainer( DBWUtils.getSQLProcessor(model.getSessionManager(), env), env.getArgument("containerNodePath"), new WebDataTransferParameters(env.getArgument("parameters")) )) - .dataFetcher("dataTransferExportDataFromResults", env -> getAPI(env).dataTransferExportDataFromResults( + .dataFetcher("dataTransferExportDataFromResults", env -> getService(env).dataTransferExportDataFromResults( DBWUtils.getSQLContext(model.getSessionManager(), env), env.getArgument("resultsId"), new WebDataTransferParameters(env.getArgument("parameters")) )) - .dataFetcher("dataTransferRemoveDataFile", env -> getAPI(env).dataTransferRemoveDataFile( + .dataFetcher("dataTransferRemoveDataFile", env -> getService(env).dataTransferRemoveDataFile( DBWUtils.getSQLProcessor(model.getSessionManager(), env), env.getArgument("dataFileId") )) @@ -71,10 +60,6 @@ public class WebServiceBindingDataTransfer extends WebServiceBindingBase options) throws DBWebException; + String getNodeDDL(WebSession webSession, DBNNode node, Map options) throws DBWebException; } diff --git a/server/bundles/io.cloudbeaver.service.metadata/src/io/cloudbeaver/service/metadata/WebServiceBindingMetadata.java b/server/bundles/io.cloudbeaver.service.metadata/src/io/cloudbeaver/service/metadata/WebServiceBindingMetadata.java index 96b1dd7c49..4e5ea2fd3c 100644 --- a/server/bundles/io.cloudbeaver.service.metadata/src/io/cloudbeaver/service/metadata/WebServiceBindingMetadata.java +++ b/server/bundles/io.cloudbeaver.service.metadata/src/io/cloudbeaver/service/metadata/WebServiceBindingMetadata.java @@ -16,14 +16,12 @@ */ package io.cloudbeaver.service.metadata; -import graphql.schema.idl.TypeDefinitionRegistry; import io.cloudbeaver.DBWebException; -import io.cloudbeaver.service.DBWBindingContext; -import io.cloudbeaver.DBWUtils; -import io.cloudbeaver.service.WebServiceBindingBase; -import io.cloudbeaver.model.WebNavigatorNodeInfo; import io.cloudbeaver.model.session.WebSession; +import io.cloudbeaver.service.DBWBindingContext; +import io.cloudbeaver.service.WebServiceBindingBase; import io.cloudbeaver.service.metadata.impl.WebServiceMetadata; +import org.jkiss.dbeaver.model.navigator.DBNNode; import java.util.Map; @@ -35,22 +33,19 @@ public class WebServiceBindingMetadata extends WebServiceBindingBase { - WebSession webSession = model.getSessionManager().getWebSession(DBWUtils.getServletRequest(env)); - WebNavigatorNodeInfo node = webSession.getNavigatorNodeInfo(env.getArgument("nodeId")); + WebSession webSession = getWebSession(model, env); + + String nodePath = env.getArgument("nodeId"); + DBNNode node = webSession.getNavigatorModel().getNodeByPath(webSession.getProgressMonitor(), nodePath); Map options = env.getArgument("options"); - return getAPI(env).getNodeDDL(webSession, node, options); + return getService(env).getNodeDDL(webSession, node, options); }); } diff --git a/server/bundles/io.cloudbeaver.service.metadata/src/io/cloudbeaver/service/metadata/impl/WebServiceMetadata.java b/server/bundles/io.cloudbeaver.service.metadata/src/io/cloudbeaver/service/metadata/impl/WebServiceMetadata.java index 6fc189bf5f..e5857dbb91 100644 --- a/server/bundles/io.cloudbeaver.service.metadata/src/io/cloudbeaver/service/metadata/impl/WebServiceMetadata.java +++ b/server/bundles/io.cloudbeaver.service.metadata/src/io/cloudbeaver/service/metadata/impl/WebServiceMetadata.java @@ -36,8 +36,7 @@ public class WebServiceMetadata implements DBWServiceMetadata { @Override - public String getNodeDDL(WebSession webSession, WebNavigatorNodeInfo node, Map options) throws DBWebException { - DBNNode dbNode = node.getNode(); + public String getNodeDDL(WebSession webSession, DBNNode dbNode, Map options) throws DBWebException { if (dbNode instanceof DBNDatabaseNode) { DBSObject object = ((DBNDatabaseNode) dbNode).getObject(); if (object instanceof DBPScriptObject) { @@ -50,10 +49,10 @@ public class WebServiceMetadata implements DBWServiceMetadata { throw new DBWebException("Error extracting DDL", e); } } else { - throw new DBWebException("Object '" + node.getId() + "' doesn't support DDL"); + throw new DBWebException("Object '" + dbNode.getNodeItemPath() + "' doesn't support DDL"); } } else { - throw new DBWebException("Node '" + node.getId() + "' is not database node"); + throw new DBWebException("Node '" + dbNode.getNodeItemPath() + "' is not database node"); } } }