From 19277203c7a43830d2fbbb68fbac50dfb59e3257 Mon Sep 17 00:00:00 2001 From: gaibu <1016771049@qq.com> Date: Sun, 12 Mar 2023 21:59:42 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#I6L8YB=20=E5=AF=B9=E4=BA=8E=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E5=90=8D=E7=A7=B0=E5=AD=98=E5=9C=A8=E7=89=B9=E6=AE=8A?= =?UTF-8?q?=E7=AC=A6=E5=8F=B7=E5=9C=A8=E6=89=A7=E8=A1=8C=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E6=97=B6=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liteflow/parser/sql/util/JDBCHelper.java | 424 +++++++++--------- .../src/test/resources/sql/data.sql | 1 + 2 files changed, 214 insertions(+), 211 deletions(-) diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java index 5fa5e22f7..8bce369a8 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java @@ -2,9 +2,11 @@ package com.yomahub.liteflow.parser.sql.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.XmlUtil; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.parser.sql.exception.ELSQLException; import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; + import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -22,250 +24,250 @@ import java.util.Objects; */ public class JDBCHelper { - private static final String SQL_PATTERN = "SELECT {},{} FROM {} WHERE {}=?"; + private static final String SQL_PATTERN = "SELECT {},{} FROM {} WHERE {}=?"; - private static final String SCRIPT_SQL_CHECK_PATTERN = "SELECT 1 FROM {} WHERE {}=?"; + private static final String SCRIPT_SQL_CHECK_PATTERN = "SELECT 1 FROM {} WHERE {}=?"; - private static final String SCRIPT_SQL_PATTERN = "SELECT {},{},{},{} FROM {} WHERE {}=?"; + private static final String SCRIPT_SQL_PATTERN = "SELECT {},{},{},{} FROM {} WHERE {}=?"; - private static final String CHAIN_XML_PATTERN = "{}"; - private static final String NODE_XML_PATTERN = "{}"; + private static final String CHAIN_XML_PATTERN = "{}"; + private static final String NODE_XML_PATTERN = "{}"; - private static final String NODE_ITEM_XML_PATTERN = ""; - private static final String XML_PATTERN = "{}{}"; - private static final Integer FETCH_SIZE_MAX = 1000; + private static final String NODE_ITEM_XML_PATTERN = ""; + private static final String XML_PATTERN = "{}{}"; + private static final Integer FETCH_SIZE_MAX = 1000; - private SQLParserVO sqlParserVO; + private SQLParserVO sqlParserVO; - private static JDBCHelper INSTANCE; + private static JDBCHelper INSTANCE; - /** - * 初始化 INSTANCE - */ - public static void init(SQLParserVO sqlParserVO) { - try { - INSTANCE = new JDBCHelper(); - Class.forName(sqlParserVO.getDriverClassName()); - INSTANCE.setSqlParserVO(sqlParserVO); - } catch (ClassNotFoundException e) { - throw new ELSQLException(e.getMessage()); - } - } + /** + * 初始化 INSTANCE + */ + public static void init(SQLParserVO sqlParserVO) { + try { + INSTANCE = new JDBCHelper(); + Class.forName(sqlParserVO.getDriverClassName()); + INSTANCE.setSqlParserVO(sqlParserVO); + } catch (ClassNotFoundException e) { + throw new ELSQLException(e.getMessage()); + } + } - /** - * 获取 INSTANCE - */ - public static JDBCHelper getInstance() { - return INSTANCE; - } + /** + * 获取 INSTANCE + */ + public static JDBCHelper getInstance() { + return INSTANCE; + } - /** - * 获取链接 - */ - public Connection getConn() { - Connection connection; - try { - connection = DriverManager.getConnection(sqlParserVO.getUrl(), sqlParserVO.getUsername(), sqlParserVO.getPassword()); - } catch (SQLException e) { - throw new ELSQLException(e.getMessage()); - } - return connection; - } + /** + * 获取链接 + */ + public Connection getConn() { + Connection connection; + try { + connection = DriverManager.getConnection(sqlParserVO.getUrl(), sqlParserVO.getUsername(), sqlParserVO.getPassword()); + } catch (SQLException e) { + throw new ELSQLException(e.getMessage()); + } + return connection; + } - /** - * 获取 ElData 数据内容 - */ - public String getContent() { - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; + /** + * 获取 ElData 数据内容 + */ + public String getContent() { + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; - String chainTableName = sqlParserVO.getChainTableName(); - String elDataField = sqlParserVO.getElDataField(); - String chainNameField = sqlParserVO.getChainNameField(); - String chainApplicationNameField = sqlParserVO.getChainApplicationNameField(); - String applicationName = sqlParserVO.getApplicationName(); + String chainTableName = sqlParserVO.getChainTableName(); + String elDataField = sqlParserVO.getElDataField(); + String chainNameField = sqlParserVO.getChainNameField(); + String chainApplicationNameField = sqlParserVO.getChainApplicationNameField(); + String applicationName = sqlParserVO.getApplicationName(); - if(StrUtil.isBlank(chainTableName)){ - throw new ELSQLException("You did not define the chainTableName property"); - } + if (StrUtil.isBlank(chainTableName)) { + throw new ELSQLException("You did not define the chainTableName property"); + } - if(StrUtil.isBlank(applicationName) || StrUtil.isBlank(chainApplicationNameField)){ - throw new ELSQLException("You did not define the applicationName or chainApplicationNameField property"); - } + if (StrUtil.isBlank(applicationName) || StrUtil.isBlank(chainApplicationNameField)) { + throw new ELSQLException("You did not define the applicationName or chainApplicationNameField property"); + } - String sqlCmd = StrUtil.format(SQL_PATTERN, chainNameField, elDataField, chainTableName, chainApplicationNameField); + String sqlCmd = StrUtil.format(SQL_PATTERN, chainNameField, elDataField, chainTableName, chainApplicationNameField); - List result = new ArrayList<>(); - try { - conn = getConn(); - stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - // 设置游标拉取数量 - stmt.setFetchSize(FETCH_SIZE_MAX); - stmt.setString(1, applicationName); - rs = stmt.executeQuery(); + List result = new ArrayList<>(); + try { + conn = getConn(); + stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + // 设置游标拉取数量 + stmt.setFetchSize(FETCH_SIZE_MAX); + stmt.setString(1, applicationName); + rs = stmt.executeQuery(); - while (rs.next()) { - String elData = getStringFromResultSet(rs, elDataField); - String chainName = getStringFromResultSet(rs, chainNameField); + while (rs.next()) { + String elData = getStringFromResultSet(rs, elDataField); + String chainName = getStringFromResultSet(rs, chainNameField); - result.add(StrUtil.format(CHAIN_XML_PATTERN, chainName, elData)); - } - } catch (Exception e) { - throw new ELSQLException(e.getMessage()); - } finally { - // 关闭连接 - close(conn, stmt, rs); - } + result.add(StrUtil.format(CHAIN_XML_PATTERN, XmlUtil.escape(chainName), elData)); + } + } catch (Exception e) { + throw new ELSQLException(e.getMessage()); + } finally { + // 关闭连接 + close(conn, stmt, rs); + } - String chainsContent = CollUtil.join(result, StrUtil.EMPTY); + String chainsContent = CollUtil.join(result, StrUtil.EMPTY); - String nodesContent; - if (hasScriptData()){ - nodesContent = getScriptNodes(); - }else{ - nodesContent = StrUtil.EMPTY; - } + String nodesContent; + if (hasScriptData()) { + nodesContent = getScriptNodes(); + } else { + nodesContent = StrUtil.EMPTY; + } - return StrUtil.format(XML_PATTERN, nodesContent, chainsContent); - } + return StrUtil.format(XML_PATTERN, nodesContent, chainsContent); + } - public String getScriptNodes() { - List result = new ArrayList<>(); - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; + public String getScriptNodes() { + List result = new ArrayList<>(); + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; - String scriptTableName = sqlParserVO.getScriptTableName(); - String scriptIdField = sqlParserVO.getScriptIdField(); - String scriptDataField = sqlParserVO.getScriptDataField(); - String scriptNameField = sqlParserVO.getScriptNameField(); - String scriptTypeField = sqlParserVO.getScriptTypeField(); - String scriptApplicationNameField = sqlParserVO.getScriptApplicationNameField(); - String applicationName = sqlParserVO.getApplicationName(); + String scriptTableName = sqlParserVO.getScriptTableName(); + String scriptIdField = sqlParserVO.getScriptIdField(); + String scriptDataField = sqlParserVO.getScriptDataField(); + String scriptNameField = sqlParserVO.getScriptNameField(); + String scriptTypeField = sqlParserVO.getScriptTypeField(); + String scriptApplicationNameField = sqlParserVO.getScriptApplicationNameField(); + String applicationName = sqlParserVO.getApplicationName(); - if(StrUtil.isBlank(applicationName) || StrUtil.isBlank(scriptApplicationNameField)){ - throw new ELSQLException("You did not define the applicationName or scriptApplicationNameField property"); - } + if (StrUtil.isBlank(applicationName) || StrUtil.isBlank(scriptApplicationNameField)) { + throw new ELSQLException("You did not define the applicationName or scriptApplicationNameField property"); + } - String sqlCmd = StrUtil.format( - SCRIPT_SQL_PATTERN, - scriptIdField, - scriptDataField, - scriptNameField, - scriptTypeField, - scriptTableName, - scriptApplicationNameField - ); - try { - conn = getConn(); - stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - // 设置游标拉取数量 - stmt.setFetchSize(FETCH_SIZE_MAX); - stmt.setString(1, applicationName); - rs = stmt.executeQuery(); + String sqlCmd = StrUtil.format( + SCRIPT_SQL_PATTERN, + scriptIdField, + scriptDataField, + scriptNameField, + scriptTypeField, + scriptTableName, + scriptApplicationNameField + ); + try { + conn = getConn(); + stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + // 设置游标拉取数量 + stmt.setFetchSize(FETCH_SIZE_MAX); + stmt.setString(1, applicationName); + rs = stmt.executeQuery(); - while (rs.next()) { - String id = getStringFromResultSet(rs, scriptIdField); - String data = getStringFromResultSet(rs, scriptDataField); - String name = getStringFromResultSet(rs, scriptNameField); - String type = getStringFromResultSet(rs, scriptTypeField); + while (rs.next()) { + String id = getStringFromResultSet(rs, scriptIdField); + String data = getStringFromResultSet(rs, scriptDataField); + String name = getStringFromResultSet(rs, scriptNameField); + String type = getStringFromResultSet(rs, scriptTypeField); - NodeTypeEnum nodeTypeEnum = NodeTypeEnum.getEnumByCode(type); - if (Objects.isNull(nodeTypeEnum)){ - throw new ELSQLException(StrUtil.format("Invalid type value[{}]", type)); - } + NodeTypeEnum nodeTypeEnum = NodeTypeEnum.getEnumByCode(type); + if (Objects.isNull(nodeTypeEnum)) { + throw new ELSQLException(StrUtil.format("Invalid type value[{}]", type)); + } - if (!nodeTypeEnum.isScript()) { - throw new ELSQLException(StrUtil.format("The type value[{}] is not a script type", type)); - } + if (!nodeTypeEnum.isScript()) { + throw new ELSQLException(StrUtil.format("The type value[{}] is not a script type", type)); + } - result.add(StrUtil.format(NODE_ITEM_XML_PATTERN, id, name, type, data)); - } - } catch (Exception e) { - throw new ELSQLException(e.getMessage()); - } finally { - // 关闭连接 - close(conn, stmt, rs); - } - return StrUtil.format(NODE_XML_PATTERN, CollUtil.join(result, StrUtil.EMPTY)); - } + result.add(StrUtil.format(NODE_ITEM_XML_PATTERN, XmlUtil.escape(id), XmlUtil.escape(name), type, data)); + } + } catch (Exception e) { + throw new ELSQLException(e.getMessage()); + } finally { + // 关闭连接 + close(conn, stmt, rs); + } + return StrUtil.format(NODE_XML_PATTERN, CollUtil.join(result, StrUtil.EMPTY)); + } - /** - * 关闭连接 - * - * @param conn conn - * @param stmt stmt - * @param rs rs - */ - private void close(Connection conn, PreparedStatement stmt, ResultSet rs) { - // 关闭连接 - if (conn != null) { - try { - conn.close(); - } catch (SQLException e) { - throw new ELSQLException(e.getMessage()); - } - } - // 关闭 statement - if (stmt != null) { - try { - stmt.close(); - } catch (SQLException e) { - throw new ELSQLException(e.getMessage()); - } - } - //关闭结果集 - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - throw new ELSQLException(e.getMessage()); - } - } - } + /** + * 关闭连接 + * + * @param conn conn + * @param stmt stmt + * @param rs rs + */ + private void close(Connection conn, PreparedStatement stmt, ResultSet rs) { + // 关闭连接 + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + throw new ELSQLException(e.getMessage()); + } + } + // 关闭 statement + if (stmt != null) { + try { + stmt.close(); + } catch (SQLException e) { + throw new ELSQLException(e.getMessage()); + } + } + //关闭结果集 + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + throw new ELSQLException(e.getMessage()); + } + } + } - private boolean hasScriptData(){ - if (StrUtil.isBlank(sqlParserVO.getScriptTableName())){ - return false; - } + private boolean hasScriptData() { + if (StrUtil.isBlank(sqlParserVO.getScriptTableName())) { + return false; + } - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; - String sqlCmd = StrUtil.format(SCRIPT_SQL_CHECK_PATTERN, - sqlParserVO.getScriptTableName(), - sqlParserVO.getScriptApplicationNameField()); - try { - conn = getConn(); - stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - stmt.setFetchSize(1); - stmt.setString(1, sqlParserVO.getApplicationName()); - rs = stmt.executeQuery(); - return rs.next(); - } catch (Exception e) { - return false; - } finally { - // 关闭连接 - close(conn, stmt, rs); - } - } + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; + String sqlCmd = StrUtil.format(SCRIPT_SQL_CHECK_PATTERN, + sqlParserVO.getScriptTableName(), + sqlParserVO.getScriptApplicationNameField()); + try { + conn = getConn(); + stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + stmt.setFetchSize(1); + stmt.setString(1, sqlParserVO.getApplicationName()); + rs = stmt.executeQuery(); + return rs.next(); + } catch (Exception e) { + return false; + } finally { + // 关闭连接 + close(conn, stmt, rs); + } + } - //#region get set method - private String getStringFromResultSet(ResultSet rs, String field) throws SQLException { - String data = rs.getString(field); - if (StrUtil.isBlank(data)) { - throw new ELSQLException(StrUtil.format("exist {} field value is empty", field)); - } - return data; - } + //#region get set method + private String getStringFromResultSet(ResultSet rs, String field) throws SQLException { + String data = rs.getString(field); + if (StrUtil.isBlank(data)) { + throw new ELSQLException(StrUtil.format("exist {} field value is empty", field)); + } + return data; + } - private SQLParserVO getSqlParserVO() { - return sqlParserVO; - } + private SQLParserVO getSqlParserVO() { + return sqlParserVO; + } - private void setSqlParserVO(SQLParserVO sqlParserVO) { - this.sqlParserVO = sqlParserVO; - } + private void setSqlParserVO(SQLParserVO sqlParserVO) { + this.sqlParserVO = sqlParserVO; + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql index 22f2e7803..3bb39657f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql @@ -3,6 +3,7 @@ DELETE FROM EL_TABLE; INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain1','THEN(a, b, c);'); INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain2','THEN(a, b, c);'); INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain3','IF(x0, THEN(a, b));'); +INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','','IF(x0, THEN(a, b));'); DELETE FROM SCRIPT_NODE_TABLE;