diff --git a/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/pom.xml b/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/pom.xml index 1de3798a37..eef03ed3ec 100644 --- a/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/pom.xml +++ b/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/pom.xml @@ -51,9 +51,8 @@ - org.hibernate + org.hibernate.validator hibernate-validator - 5.1.2.Final diff --git a/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/restful/DataSourceCoreRestfulApi.java b/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/restful/DataSourceCoreRestfulApi.java index cf49d31687..8788b4b1c2 100644 --- a/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/restful/DataSourceCoreRestfulApi.java +++ b/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/restful/DataSourceCoreRestfulApi.java @@ -1121,6 +1121,42 @@ public Message getDataSourceListByTypes( }, "Fail to get all types of data source[获取数据源列表失败]"); } + + @ApiOperation( + value = "getPublishedDataSourceByType", + notes = "get published data source by type and proxy user", + response = Message.class) + @ApiImplicitParams({ + @ApiImplicitParam(name = "dataSourceType", required = true, dataType = "String"), + @ApiImplicitParam(name = "proxyUser", required = true, dataType = "String") + }) + @RequestMapping(value = "/published/type", method = RequestMethod.GET) + public Message getPublishedDataSourceByType( + @RequestParam("dataSourceType") String dataSourceType, + @RequestParam("proxyUser") String proxyUser, + HttpServletRequest request) { + return RestfulApiHelper.doAndResponse( + () -> { + String userName = + ModuleUserUtils.getOperationUser(request, "getPublishedDataSourceByType"); + DataSource dataSource = + dataSourceInfoService.getPublishedDataSourceByType(dataSourceType, proxyUser); + if (dataSource == null) { + return Message.error( + "No published data source found for type: " + + dataSourceType + + " and proxy user: " + + proxyUser); + } + if (!AuthContext.hasPermission(dataSource, userName)) { + return Message.error("Don't have query permission for data source [没有数据源的查询权限]"); + } + dataSource.setConnectParams(null); + dataSource.setParameter(null); + return Message.ok().data("info", dataSource); + }, + "Fail to get published data source[获取已发布数据源信息失败]"); + } /** * Inner method to insert data source * diff --git a/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/service/DataSourceInfoService.java b/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/service/DataSourceInfoService.java index e037d45fe9..a7387f5413 100644 --- a/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/service/DataSourceInfoService.java +++ b/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/service/DataSourceInfoService.java @@ -290,4 +290,13 @@ DataSource getDataSourceInfoForConnect(String dataSourceName, String envId) * @return */ boolean existDataSourceEnv(String dataSourceEnvName); + + /** + * Get published data source by type and proxy user + * + * @param dataSourceType data source type + * @param proxyUser proxy user + * @return data source entity + */ + DataSource getPublishedDataSourceByType(String dataSourceType, String proxyUser); } diff --git a/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/service/impl/DataSourceInfoServiceImpl.java b/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/service/impl/DataSourceInfoServiceImpl.java index 1e5aa95e72..99ddbc9852 100644 --- a/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/service/impl/DataSourceInfoServiceImpl.java +++ b/linkis-public-enhancements/linkis-datasource/linkis-datasource-manager/server/src/main/java/org/apache/linkis/datasourcemanager/core/service/impl/DataSourceInfoServiceImpl.java @@ -739,4 +739,29 @@ private void mergeVersionParams(DataSource dataSource, Long version) { } } } + + @Override + public DataSource getPublishedDataSourceByType(String dataSourceType, String proxyUser) { + try { + // 1. 查询数据源列表 + List dataSourceList = + dataSourceDao.selectDatasourcesByType(dataSourceType, proxyUser); + if (CollectionUtils.isEmpty(dataSourceList)) { + LOG.debug("No datasource found for type:{} and owner:{}", dataSourceType, proxyUser); + return null; + } + // 2. 筛选符合条件的已发布数据源 + return dataSourceList.stream() + .filter( + dataSource -> + (dataSource.getPublishedVersionId() != null) && (!dataSource.isExpire())) + .sorted(Comparator.comparing(DataSource::getCreateTime, Comparator.reverseOrder())) + .findFirst() + .orElse(null); + } catch (Exception e) { + LOG.error( + "Get published datasource failed, type:{}, proxyUser:{}", dataSourceType, proxyUser, e); + return null; + } + } } diff --git a/linkis-public-enhancements/linkis-pes-client/src/main/java/org/apache/linkis/datasource/client/errorcode/DatasourceClientErrorCodeSummary.java b/linkis-public-enhancements/linkis-pes-client/src/main/java/org/apache/linkis/datasource/client/errorcode/DatasourceClientErrorCodeSummary.java index 4debe0ab30..ac195e8593 100644 --- a/linkis-public-enhancements/linkis-pes-client/src/main/java/org/apache/linkis/datasource/client/errorcode/DatasourceClientErrorCodeSummary.java +++ b/linkis-public-enhancements/linkis-pes-client/src/main/java/org/apache/linkis/datasource/client/errorcode/DatasourceClientErrorCodeSummary.java @@ -31,6 +31,8 @@ public enum DatasourceClientErrorCodeSummary implements LinkisErrorCode { IP_NEEDED(31000, "ip is needed(ip为空)!"), PORT_NEEDED(31000, "port is needed(port为空)!"), OWNER_NEEDED(31000, "owner is needed(owner为空)!"), + DATASOURCE_TYPE_NEEDED(31000, "dataSourceType is needed(dataSourceType为空)!"), + PROXY_USER_NEEDED(31000, "proxyUser is needed(proxyUser为空)!"), DATASOURCE_NEEDED(31000, "datasourceTypeName is needed(datasourceTypeName为空)!"), CANNOT_SOURCE( 31000, "Cannot encode the name of data source:{0} for request(无法对请求的数据源名称进行编码:{0})"), diff --git a/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/DataSourceRemoteClient.scala b/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/DataSourceRemoteClient.scala index 3d541f9563..ba66f67062 100644 --- a/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/DataSourceRemoteClient.scala +++ b/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/DataSourceRemoteClient.scala @@ -67,4 +67,9 @@ trait DataSourceRemoteClient extends RemoteClient { ): UpdateDataSourceParameterResult def getKeyDefinitionsByType(action: GetKeyTypeDatasourceAction): GetKeyTypeDatasourceResult + + def getPublishedDataSourceByType( + action: GetPublishedDataSourceByTypeAction + ): GetPublishedDataSourceByTypeResult + } diff --git a/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/impl/LinkisDataSourceRemoteClient.scala b/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/impl/LinkisDataSourceRemoteClient.scala index 068e6235fd..dedf8f6eb9 100644 --- a/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/impl/LinkisDataSourceRemoteClient.scala +++ b/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/impl/LinkisDataSourceRemoteClient.scala @@ -151,4 +151,9 @@ class LinkisDataSourceRemoteClient(clientConfig: DWSClientConfig, clientName: St action: GetKeyTypeDatasourceAction ): GetKeyTypeDatasourceResult = execute(action).asInstanceOf[GetKeyTypeDatasourceResult] + override def getPublishedDataSourceByType( + action: GetPublishedDataSourceByTypeAction + ): GetPublishedDataSourceByTypeResult = + execute(action).asInstanceOf[GetPublishedDataSourceByTypeResult] + } diff --git a/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/request/GetPublishedDataSourceByTypeAction.scala b/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/request/GetPublishedDataSourceByTypeAction.scala new file mode 100644 index 0000000000..5ab82a8cde --- /dev/null +++ b/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/request/GetPublishedDataSourceByTypeAction.scala @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.linkis.datasource.client.request + +import org.apache.linkis.datasource.client.config.DatasourceClientConfig.DATA_SOURCE_SERVICE_MODULE +import org.apache.linkis.datasource.client.errorcode.DatasourceClientErrorCodeSummary._ +import org.apache.linkis.datasource.client.exception.DataSourceClientBuilderException +import org.apache.linkis.httpclient.request.GetAction + +class GetPublishedDataSourceByTypeAction extends GetAction with DataSourceAction { + private var dataSourceType: String = _ + private var proxyUser: String = _ + + override def suffixURLs: Array[String] = + Array(DATA_SOURCE_SERVICE_MODULE.getValue, "published", "type") + + override def setUser(user: String): Unit = this.user = user + + override def getUser: String = this.user + + private var user: String = _ + +} + +object GetPublishedDataSourceByTypeAction { + def builder(): Builder = new Builder + + class Builder private[GetPublishedDataSourceByTypeAction] () { + private var dataSourceType: String = _ + private var proxyUser: String = _ + private var system: String = _ + private var user: String = _ + + def setUser(user: String): Builder = { + this.user = user + this + } + + def setDataSourceType(dataSourceType: String): Builder = { + this.dataSourceType = dataSourceType + this + } + + def setProxyUser(proxyUser: String): Builder = { + this.proxyUser = proxyUser + this + } + + def setSystem(system: String): Builder = { + this.system = system + this + } + + def build(): GetPublishedDataSourceByTypeAction = { + if (dataSourceType == null) { + throw new DataSourceClientBuilderException(DATASOURCE_TYPE_NEEDED.getErrorDesc) + } + if (proxyUser == null) { + throw new DataSourceClientBuilderException(PROXY_USER_NEEDED.getErrorDesc) + } + if (system == null) throw new DataSourceClientBuilderException(SYSTEM_NEEDED.getErrorDesc) + if (user == null) throw new DataSourceClientBuilderException(USER_NEEDED.getErrorDesc) + + val action = new GetPublishedDataSourceByTypeAction + action.dataSourceType = this.dataSourceType + action.proxyUser = this.proxyUser + action.setParameter("dataSourceType", dataSourceType) + action.setParameter("proxyUser", proxyUser) + action.setParameter("system", system) + action.setUser(user) + action + } + + } + +} diff --git a/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/response/GetPublishedDataSourceByTypeResult.scala b/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/response/GetPublishedDataSourceByTypeResult.scala new file mode 100644 index 0000000000..5c8bd2997d --- /dev/null +++ b/linkis-public-enhancements/linkis-pes-client/src/main/scala/org/apache/linkis/datasource/client/response/GetPublishedDataSourceByTypeResult.scala @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.linkis.datasource.client.response + +import org.apache.linkis.datasourcemanager.common.domain.DataSource +import org.apache.linkis.httpclient.dws.DWSHttpClient +import org.apache.linkis.httpclient.dws.annotation.DWSHttpMessageResult +import org.apache.linkis.httpclient.dws.response.DWSResult + +import scala.beans.BeanProperty + +@DWSHttpMessageResult("/api/rest_j/v\\d+/data-source-manager/published/type") +class GetPublishedDataSourceByTypeResult extends DWSResult { + @BeanProperty var info: java.util.Map[String, Any] = _ + + def getDataSource: DataSource = { + val str = DWSHttpClient.jacksonJson.writeValueAsString(info) + DWSHttpClient.jacksonJson.readValue(str, classOf[DataSource]) + } + +}