All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yomahub.liteflow.parser.sql.SQLXmlELParser Maven / Gradle / Ivy

package com.yomahub.liteflow.parser.sql;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.StrFormatter;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.core.FlowInitHook;
import com.yomahub.liteflow.parser.constant.ReadType;
import com.yomahub.liteflow.parser.el.ClassXmlFlowELParser;
import com.yomahub.liteflow.parser.sql.exception.ELSQLException;
import com.yomahub.liteflow.parser.sql.read.SqlReadFactory;
import com.yomahub.liteflow.parser.sql.util.JDBCHelper;
import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
import com.yomahub.liteflow.property.LiteflowConfig;
import com.yomahub.liteflow.property.LiteflowConfigGetter;
import com.yomahub.liteflow.util.JsonUtil;

import java.util.Objects;

/**
 * SQL 解析器实现,只支持 EL 形式的 XML,不支持其他的形式
 *
 * @author tangkc
 * @since 2.9.0
 */
public class SQLXmlELParser extends ClassXmlFlowELParser {

    private static SQLParserVO sqlParserVO;

    private static final String ERROR_MSG_PATTERN = "rule-source-ext-data {} is blank";

    private static final String ERROR_COMMON_MSG = "rule-source-ext-data is empty";

    /**
     * 构造函数
     */
    public SQLXmlELParser() {
        LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();

        try {
            if (MapUtil.isNotEmpty((liteflowConfig.getRuleSourceExtDataMap()))) {
                sqlParserVO = BeanUtil.toBean(liteflowConfig.getRuleSourceExtDataMap(), SQLParserVO.class,
                        CopyOptions.create());
            } else if (StrUtil.isNotBlank(liteflowConfig.getRuleSourceExtData())) {
                sqlParserVO = JsonUtil.parseObject(liteflowConfig.getRuleSourceExtData(), SQLParserVO.class);
            }
            if (Objects.isNull(sqlParserVO)) {
                throw new ELSQLException(ERROR_COMMON_MSG);
            }

            // 检查配置文件
            checkParserVO(sqlParserVO);

            // 初始化 JDBCHelper
            JDBCHelper.init(sqlParserVO);

            // 初始化 SqlReadFactory
            SqlReadFactory.registerRead(sqlParserVO);

            // 注册轮询任务
            SqlReadFactory.registerSqlReadPollTask(ReadType.CHAIN);
            SqlReadFactory.registerSqlReadPollTask(ReadType.SCRIPT);
        } catch (ELSQLException elsqlException) {
            throw elsqlException;
        } catch (Exception ex) {
            throw new ELSQLException(ex);
        }

    }

    @Override
    public String parseCustom() {
        try {
            JDBCHelper jdbcHelper = JDBCHelper.getInstance();
            String content = jdbcHelper.getContent();
            if (sqlParserVO.getPollingEnabled()) {
                FlowInitHook.addHook(() -> {
                    jdbcHelper.listenSQL();
                    return true;
                });
            }
            return content;
        } catch (Exception ex) {
            throw new ELSQLException(ex);
        }
    }

    /**
     * 检查配置文件并设置默认值
     *
     * @param sqlParserVO sqlParserVO
     */
    private void checkParserVO(SQLParserVO sqlParserVO) {
        if (sqlParserVO.isDefaultDataSource()) {
            return;
        }
        if (StrUtil.isEmpty(sqlParserVO.getUrl())) {
            throw new ELSQLException(StrFormatter.format(ERROR_MSG_PATTERN, "url"));
        }
        if (StrUtil.isEmpty(sqlParserVO.getDriverClassName())) {
            throw new ELSQLException(StrFormatter.format(ERROR_MSG_PATTERN, "driverClassName"));
        }
        if (Objects.isNull(sqlParserVO.getUsername())) {
            throw new ELSQLException(StrFormatter.format(ERROR_MSG_PATTERN, "username"));
        }
        if (Objects.isNull(sqlParserVO.getPassword())) {
            throw new ELSQLException(StrFormatter.format(ERROR_MSG_PATTERN, "password"));
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy