/*
* <<
* Davinci
* ==
* Copyright (C) 2016 - 2019 EDP
* ==
* 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 edp.davinci.service.impl;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import edp.core.exception.NotFoundException;
import edp.core.exception.ServerException;
import edp.core.exception.UnAuthorizedException;
import edp.core.model.Paginate;
import edp.core.model.PaginateWithQueryColumns;
import edp.core.utils.*;
import edp.davinci.core.common.Constants;
import edp.davinci.core.enums.*;
import edp.davinci.core.model.SqlEntity;
import edp.davinci.core.model.SqlFilter;
import edp.davinci.core.utils.SqlParseUtils;
import edp.davinci.dao.RelRoleViewMapper;
import edp.davinci.dao.SourceMapper;
import edp.davinci.dao.ViewMapper;
import edp.davinci.dao.WidgetMapper;
import edp.davinci.dto.projectDto.ProjectDetail;
import edp.davinci.dto.projectDto.ProjectPermission;
import edp.davinci.dto.sourceDto.SourceBaseInfo;
import edp.davinci.dto.viewDto.*;
import edp.davinci.model.*;
import edp.davinci.service.ProjectService;
import edp.davinci.service.ViewService;
import edp.davinci.service.excel.SQLContext;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.STGroup;
import org.stringtemplate.v4.STGroupFile;
import java.sql.SQLException;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
import static edp.core.consts.Consts.COMMA;
import static edp.core.consts.Consts.MINUS;
import static edp.davinci.core.common.Constants.NO_AUTH_PERMISSION;
import static edp.davinci.core.enums.SqlVariableTypeEnum.AUTHVAR;
import static edp.davinci.core.enums.SqlVariableTypeEnum.QUERYVAR;
@Slf4j
@Service("viewService")
public class
ViewServiceImpl extends BaseEntityService implements ViewService {
private static final Logger optLogger = LoggerFactory.getLogger(LogNameEnum.BUSINESS_OPERATION.getName());
@Autowired
private ViewMapper viewMapper;
@Autowired
private SourceMapper sourceMapper;
@Autowired
private WidgetMapper widgetMapper;
@Autowired
private RelRoleViewMapper relRoleViewMapper;
@Autowired
private SqlUtils sqlUtils;
@Autowired
private RedisUtils redisUtils;
@Autowired
private ProjectService projectService;
@Autowired
private SqlParseUtils sqlParseUtils;
private static final String SQL_VARABLE_KEY = "name";
private static final CheckEntityEnum entity = CheckEntityEnum.VIEW;
private static final ExecutorService ROLEPARAM_THREADPOOL = Executors.newFixedThreadPool(8);
@Override
public boolean isExist(String name, Long id, Long projectId) {
Long viewId = viewMapper.getByNameWithProjectId(name, projectId);
if (null != id && null != viewId) {
return !id.equals(viewId);
}
return null != viewId && viewId.longValue() > 0L;
}
/**
* 获取View列表
*
* @param projectId
* @param user
* @return
*/
@Override
public List<ViewBaseInfo> getViews(Long projectId, User user) throws NotFoundException, UnAuthorizedException, ServerException {
ProjectDetail projectDetail = null;
try {
projectDetail = projectService.getProjectDetail(projectId, user, false);
} catch (UnAuthorizedException e) {
return null;
}
List<ViewBaseInfo> views = viewMapper.getViewBaseInfoByProject(projectId);
if (null == views) {
return null;
}
if (isHiddenPermission(projectDetail, user, true)) {
return null;
}
return views;
}
private boolean isHiddenPermission(ProjectDetail projectDetail, User user, boolean basePermission) {
ProjectPermission projectPermission = projectService.getProjectPermission(projectDetail, user);
return (projectPermission.getVizPermission() == UserPermissionEnum.HIDDEN.getPermission() || basePermission)
&& projectPermission.getWidgetPermission() == UserPermissionEnum.HIDDEN.getPermission()
&& projectPermission.getViewPermission() == UserPermissionEnum.HIDDEN.getPermission();
}
@Override
public ViewWithSourceBaseInfo getView(Long id, User user) throws NotFoundException, UnAuthorizedException, ServerException {
ViewWithSourceBaseInfo view = viewMapper.getViewWithSourceBaseInfo(id);
if (null == view) {
throw new NotFoundException("View is not found");
}
ProjectDetail projectDetail = projectService.getProjectDetail(view.getProjectId(), user, false);
if (isHiddenPermission(projectDetail, user, false)) {
throw new UnAuthorizedException("Insufficient permissions");
}
List<RelRoleView> relRoleViews = relRoleViewMapper.getByView(view.getId());
view.setRoles(relRoleViews);
return view;
}
@Override
public SQLContext getSQLContext(boolean isMaintainer, ViewWithSource viewWithSource, ViewExecuteParam executeParam, User user) {
if (null == executeParam || (CollectionUtils.isEmpty(executeParam.getGroups()) && CollectionUtils.isEmpty(executeParam.getAggregators()))) {
return null;
}
Source source = viewWithSource.getSource();
if (null == source) {
throw new NotFoundException("Source is not found");
}
String sql = viewWithSource.getSql();
if (StringUtils.isEmpty(sql)) {
throw new NotFoundException("Sql is not found");
}
String sqlTempDelimiter = SqlUtils.getSqlTempDelimiter(source.getProperties());
SQLContext context = new SQLContext();
//解析变量
List<SqlVariable> variables = viewWithSource.getVariables();
//解析sql
SqlEntity sqlEntity = sqlParseUtils.parseSql(sql, variables, sqlTempDelimiter, user, isMaintainer);
//列权限(只记录被限制访问的字段)
Set<String> excludeColumns = new HashSet<>();
packageParams(isMaintainer, viewWithSource.getId(), sqlEntity, variables, executeParam.getParams(), excludeColumns, user);
String srcSql = sqlParseUtils.replaceParams(sqlEntity.getSql(), sqlEntity.getQueryParams(), sqlEntity.getAuthParams(), sqlTempDelimiter);
context.setExecuteSql(sqlParseUtils.getSqls(srcSql, Boolean.FALSE));
List<String> querySqlList = sqlParseUtils.getSqls(srcSql, Boolean.TRUE);
if (!CollectionUtils.isEmpty(querySqlList)) {
buildQuerySql(querySqlList, source, executeParam);
executeParam.addExcludeColumn(excludeColumns, source.getJdbcUrl(), source.getDbVersion());
context.setQuerySql(querySqlList);
context.setViewExecuteParam(executeParam);
}
if (!CollectionUtils.isEmpty(excludeColumns)) {
List<String> excludeList = excludeColumns.stream().collect(Collectors.toList());
context.setExcludeColumns(excludeList);
}
return context;
}
/**
* 新建View
*

m0_72731342
- 粉丝: 4
- 资源: 1829
最新资源
- 中科岩创隧道自动化监测解决方案
- Manatee 1.09电磁噪声振动计算软件:引领电机NVH领域革新,带教程易上手,超越同类软件的强大后处理功能,电机电磁振动噪声NVH解决利器:Manatee 1.09软件教程全面,强大后处理参数化
- C2000 MCU同步降压升压转换器的数字控制系统应用与优化
- .NET 9 彻底改变了 API 的文档:从 Swashbuckle 到 Scalar
- datax-mysql8驱动
- 气动影响下叶片裂纹应力集中现象的Fluent分析,基于气动影响的叶片裂纹应力集中现象的Fluent分析与研究,Fluent,考虑气动影响情况下的叶片裂纹应力集中 ,Fluent; 考虑气动影响; 叶片
- MATLAB驱动的高尔夫模拟仿真系统:深度定制球杆与挥杆参数的互动体验,基于MATLAB的全方位高尔夫模拟仿真系统:精确设定球杆与天气因素,让用户享受个性化的挥杆力量与角度掌控体验,基于MATLAB的
- 单向光伏并网逆变器:结构解析与性能追踪图集,包括整体结构图、并网电流电压曲线图、最大功率追踪MPPT控制图及直流母线电压曲线图,单向光伏并网逆变器:结构解析与性能追踪图集,含最大功率追踪图及电流电压曲
- COMSOL裂缝地层THM耦合离散模型与地热能开采过程研究:探究随机复杂裂缝对增强地热系统的影响,COMSOL裂缝地层THM耦合与离散随机复杂裂缝模型在地热能开采中的应用研究,COMSOL裂缝地层的T
- 基于C2000 MCU峰值电流控制模式的升压电路实现在电源领域的应用与优化
- site-packages.rar
- BUCK控制策略对比及主电路图详解:开环与闭环控制的波形与调节过程分析,BUCK控制策略对比及主电路图详解:开环与闭环控制的波形与调节过程分析,BUCK多种控制策略对比 图一BUCK主电路图与控制策略
- 永磁同步电机MATLAB仿真:直接转矩控制下的转速外环与磁链内环优化,转矩脉动显著减小,永磁同步电机MATLAB仿真:直接转矩控制下的转速外环与磁链内环优化,转矩脉动显著减小,永磁同步电机(PMSM)
- 清华大学最新学习教程《DeepSeek与AI幻觉》
- 销售数据集,数据集包含模拟不同产品、地区和客户的销售交易信息,可以用于机器学习
- 可以快速使用的一个日志模块,可以打印不同颜色,绑定到RichTextBox
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


