瀏覽代碼

add /validateSQL

sunyj 8 年之前
父節點
當前提交
493fbb5cd8

+ 22 - 0
kanban-console/src/main/java/com/uas/kanban/controller/KanbanController.java

@@ -1,8 +1,11 @@
 package com.uas.kanban.controller;
 
+import com.uas.kanban.annotation.NotEmpty;
 import com.uas.kanban.base.BaseController;
+import com.uas.kanban.exception.OperationException;
 import com.uas.kanban.model.Kanban;
 import com.uas.kanban.service.KanbanService;
+import com.uas.kanban.service.PanelService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -10,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
+import java.sql.SQLException;
 import java.util.List;
 
 /**
@@ -25,6 +29,9 @@ public class KanbanController extends BaseController<Kanban> {
     @Autowired
     private KanbanService kanbanService;
 
+    @Autowired
+    private PanelService panelService;
+
     /**
      * 获取指定面板的看板
      *
@@ -37,4 +44,19 @@ public class KanbanController extends BaseController<Kanban> {
     public List<Kanban> getByPanelCode(@PathVariable("panelCode") String panelCode, HttpServletRequest request) {
         return kanbanService.getByPanelCode(panelCode);
     }
+
+    /**
+     * 校验 sql
+     *
+     * @param panelCode 面板 code
+     * @param sql       sql
+     * @param request   request
+     * @return sql 执行结果
+     */
+    @RequestMapping("/validateSQL")
+    @ResponseBody
+    public boolean validateSQL(@NotEmpty("panelCode") String panelCode, @NotEmpty("sql") String sql, HttpServletRequest request) throws SQLException, OperationException {
+        panelService.validateSQL(panelCode, sql, true);
+        return true;
+    }
 }

+ 23 - 0
kanban-console/src/main/java/com/uas/kanban/controller/ParameterController.java

@@ -1,7 +1,10 @@
 package com.uas.kanban.controller;
 
+import com.uas.kanban.annotation.NotEmpty;
 import com.uas.kanban.base.BaseController;
+import com.uas.kanban.exception.OperationException;
 import com.uas.kanban.model.Parameter;
+import com.uas.kanban.service.PanelService;
 import com.uas.kanban.service.ParameterService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -10,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
+import java.sql.SQLException;
 import java.util.List;
 
 /**
@@ -25,6 +29,9 @@ public class ParameterController extends BaseController<Parameter> {
     @Autowired
     private ParameterService parameterService;
 
+    @Autowired
+    private PanelService panelService;
+
     /**
      * 获取指定面板的参数
      *
@@ -37,4 +44,20 @@ public class ParameterController extends BaseController<Parameter> {
     public List<Parameter> getByPanelCode(@PathVariable("panelCode") String panelCode, HttpServletRequest request) {
         return parameterService.getByPanelCode(panelCode);
     }
+
+    /**
+     * 校验 sql
+     *
+     * @param panelCode 面板 code
+     * @param sql       sql
+     * @param request   request
+     * @return sql 执行结果
+     */
+    @RequestMapping("/validateSQL")
+    @ResponseBody
+    public boolean validateSQL(@NotEmpty("panelCode") String panelCode, @NotEmpty("sql") String sql, HttpServletRequest request) throws SQLException, OperationException {
+        panelService.validateSQL(panelCode, sql, false);
+        return true;
+    }
+
 }

+ 27 - 0
kanban-console/src/main/java/com/uas/kanban/service/PanelService.java

@@ -0,0 +1,27 @@
+package com.uas.kanban.service;
+
+import com.uas.kanban.annotation.NotEmpty;
+import com.uas.kanban.exception.OperationException;
+
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 面板
+ *
+ * @author sunyj
+ * @since 2017/12/14 16:18
+ */
+public interface PanelService {
+
+    /**
+     * 校验 sql
+     *
+     * @param panelCode         面板 code
+     * @param sql               sql
+     * @param replaceParameters 是否需要替换 sql 中的参数
+     * @return sql 执行结果
+     */
+    List<Map<String, Object>> validateSQL(@NotEmpty("panelCode") String panelCode, @NotEmpty("sql") String sql, Boolean replaceParameters) throws SQLException, OperationException;
+}

+ 49 - 1
kanban-console/src/main/java/com/uas/kanban/service/impl/PanelServiceImpl.java

@@ -6,10 +6,20 @@ import com.uas.kanban.dao.DataSourceDao;
 import com.uas.kanban.dao.PanelDao;
 import com.uas.kanban.exception.OperationException;
 import com.uas.kanban.model.Panel;
+import com.uas.kanban.model.PanelInstance;
+import com.uas.kanban.model.Parameter;
+import com.uas.kanban.service.PanelInstanceService;
+import com.uas.kanban.service.PanelService;
+import com.uas.kanban.support.DataSourceManager;
+import com.uas.kanban.support.KanbanParser;
+import com.uas.kanban.util.CollectionUtils;
+import me.chyxion.jdbc.NewbieJdbcSupport;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.sql.SQLException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 面板
@@ -18,7 +28,7 @@ import java.util.List;
  * @since 2017/10/18 14:20
  */
 @Service
-public class PanelServiceImpl extends BaseService<Panel> {
+public class PanelServiceImpl extends BaseService<Panel> implements PanelService {
 
     @Autowired
     private PanelDao panelDao;
@@ -26,6 +36,15 @@ public class PanelServiceImpl extends BaseService<Panel> {
     @Autowired
     private DataSourceDao dataSourceDao;
 
+    @Autowired
+    private PanelInstanceService panelInstanceService;
+
+    @Autowired
+    private DataSourceManager dataSourceManager;
+
+    @Autowired
+    private KanbanParser kanbanParser;
+
     @Override
     public Panel save(@NotEmpty("json") String json) {
         // TODO generate PanelInstance
@@ -76,4 +95,33 @@ public class PanelServiceImpl extends BaseService<Panel> {
         return super.delete(codes);
     }
 
+    @Override
+    public List<Map<String, Object>> validateSQL(@NotEmpty("panelCode") String panelCode, @NotEmpty("sql") String sql, Boolean replaceParameters) throws SQLException, OperationException {
+        if (sql.toLowerCase().matches("([\\s]*?update|delete|insert)[\\s]+?[\\s\\S]+?")) {
+            throw new OperationException("不支持 update, delete, insert 操作");
+        }
+        Panel panel = panelDao.checkExist(panelCode);
+        // 如果需要替换 sql 中的参数
+        if (replaceParameters != null && replaceParameters) {
+            PanelInstance panelInstance = panelInstanceService.getByPanelCode(panelCode);
+            List<Parameter> parameters = panelInstance.fromParameters();
+            if (!CollectionUtils.isEmpty(parameters)) {
+                for (Parameter parameter : parameters) {
+                    if (parameter.getValue() == null) {
+                        List<Object> optionalValues = parameter.getOptionalValues();
+                        if (CollectionUtils.isEmpty(optionalValues)) {
+                            throw new IllegalStateException("参数没有可用值:" + parameter.getName());
+                        } else {
+                            // 默认取第一个值
+                            parameter.setValue(optionalValues.get(0));
+                        }
+                    }
+                }
+            }
+            sql = kanbanParser.replaceParameters(sql, parameters, true);
+        }
+        NewbieJdbcSupport jdbc = dataSourceManager.getJdbc(panel.getDataSourceCode());
+        kanbanParser.checkCount(jdbc.getDataSource().getConnection(), sql);
+        return jdbc.listMap(sql);
+    }
 }

+ 2 - 2
kanban-console/src/main/java/com/uas/kanban/support/KanbanParser.java

@@ -53,7 +53,7 @@ public class KanbanParser {
      * @param needSingleQuote 参数值是否以单引号括起来(用于 sql)
      * @return 替换后的内容
      */
-    private String replaceParameters(@NotEmpty("content") String content, List<Parameter> parameters,
+    public String replaceParameters(@NotEmpty("content") String content, List<Parameter> parameters,
                                     @NotEmpty("needSingleQuote") Boolean needSingleQuote) throws SQLException {
         if (CollectionUtils.isEmpty(parameters)) {
             return content;
@@ -347,7 +347,7 @@ public class KanbanParser {
      * @param connection 数据库连接
      * @param sql        查询语句
      */
-    private void checkCount(@NotEmpty("connection") Connection connection, @NotEmpty("sql") String sql)
+    public void checkCount(@NotEmpty("connection") Connection connection, @NotEmpty("sql") String sql)
             throws SQLException, IllegalStateException {
         int count = getCount(connection, sql);
         if (count > MAX_RECORD_SIZE) {

+ 2 - 0
kanban-console/src/main/webapp/WEB-INF/views/console.html

@@ -64,6 +64,7 @@
             <li><a target="_blank">parameter/get?page=1&size=10</a></li>
             <br/>
             <li><a target="_blank">parameter/get/byPanel/4EC2735D343</a></li>
+            <li><a target="_blank">parameter/validateSQL?panelCode=4EC2735D343&sql=select 1 from dual</a></li>
         </ol>
         <strong><li class="title">看板</li></strong>
         <ol>
@@ -78,6 +79,7 @@
             <li><a target="_blank">kanban/get?page=1&size=10</a></li>
             <br/>
             <li><a target="_blank">kanban/get/byPanel/4EC2735D343</a></li>
+            <li><a target="_blank">kanban/validateSQL?panelCode=4EC2735D343&sql=select 1 from dual</a></li>
         </ol>
         <strong><li class="title">看板历史记录</li></strong>
         <ol>