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

com.biz.operation.log.replace.DefaultContentReplacerProcessor Maven / Gradle / Ivy

Go to download

BizX 是一个灵活而高效的业务开发框架, 其中也有很多为业务开发所需要的工具类的提供。

The newest version!
package com.biz.operation.log.replace;

import com.biz.common.bean.BizXBeanUtils;
import com.biz.common.spel.SpELUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

/**
 * {@code DefaultContentReplacerProcessor} 是 {@link ContentReplacer} 接口的默认处理器。
 *
 * 

该类基于字符串的替换方法,结合 SpEL 表达式和预定义的关键字来进行内容替换。

* *

主要功能包括通过预定义的关键字进行替换,并支持使用 SpEL 表达式动态解析内容。

* *

该类使用了 {@link SpelExpressionParser} 作为默认的表达式解析器。

* *

主要方法包括:

*
    *
  • {@link #replace(String, Object)}:使用默认的表达式解析器和上下文进行内容替换。
  • *
  • {@link #replace(String, Object, ExpressionParser)}:使用指定的表达式解析器和上下文进行内容替换。
  • *
* *

在 Spring Bean 初始化完成后,通过 {@link SmartInitializingSingleton#afterSingletonsInstantiated()} 方法来获取自定义的 {@link ReplaceOperationLogKey} 实现。

* * @author francis * @since 1.0.0 * @version 1.0.0 **/ @Slf4j public class DefaultContentReplacerProcessor implements ContentReplacer, SmartInitializingSingleton { /** * 使用者自定义操作日志中替换关键字的接口。 */ private ReplaceOperationLogKey replaceOperationLogKey; /** * 默认的表达式解析器,用于解析 SpEL 表达式。 */ private final ExpressionParser parser = new SpelExpressionParser(); /** * 当所有 Bean 都加载完成后,获取使用者自定义的 {@link ReplaceOperationLogKey} 实现 Bean。 * *

如果找不到 {@link ReplaceOperationLogKey} 的实现,则不会执行任何操作。

*/ @Override public void afterSingletonsInstantiated() { try { this.replaceOperationLogKey = BizXBeanUtils.getBean(ReplaceOperationLogKey.class); } catch (Exception e) { if (log.isWarnEnabled()) { log.warn("ReplaceOperationLogKey Bean is null in DefaultContentReplacerProcessor"); } } } /** * 使用默认的表达式解析器和上下文进行内容替换。 * * @param content 原始内容,包含需要替换的占位符或表达式 * @param context 上下文,用于提供替换所需的数据 * @return 替换后的内容,所有占位符或表达式均已被替换为具体值 */ @Override public String replace(String content, Object context) { return this.replace(content, context, parser); } /** * 使用指定的表达式解析器和上下文进行内容替换。 * *

如果上下文不是 {@link StandardEvaluationContext} 的实例,将抛出 {@link IllegalArgumentException}。

* * @param content 操作日志原始内容,包含需要替换的占位符或表达式 * @param context 上下文,用于提供替换所需的数据 * @param parser 表达式解析器,用于解析 SpEL 表达式 * @return 替换后的内容,所有占位符或表达式均已被替换为具体值 * @throws IllegalArgumentException 如果上下文不是 {@link StandardEvaluationContext} 的实例 */ @Override public String replace(String content, Object context, ExpressionParser parser) { if (!(context instanceof StandardEvaluationContext)) { throw new IllegalArgumentException("Context must be an instance of StandardEvaluationContext"); } StandardEvaluationContext evalContext = (StandardEvaluationContext) context; Object[] args = (Object[]) evalContext.lookupVariable("args"); String[] parameterNames = (String[])evalContext.lookupVariable("parameterNames"); if (parameterNames != null && args != null) { SpELUtils.setVariable(evalContext, parameterNames, args); } SpELContentReplacerHelper helper = SpELContentReplacerHelper.builder() .content(content) .context(evalContext) .parser(parser) .build(); // 替换日志中的 SpEL 表达式 helper.replaceForSpEl(); // 替换自定义的关键字和值 helper.setContent(this.replaceCustomKey(helper.toContent())); // 替换框架支持的关键字和值 this.replaceDefaultKey(helper); return helper.toContent(); } /** * 替换使用者自定义实现的操作日志上下文关键字信息。 * * @param content 操作日志原始内容,包含需要替换的占位符或表达式 * @return 替换后的内容 */ private String replaceCustomKey(String content) { if (replaceOperationLogKey != null) { return replaceOperationLogKey.replace(content); } return content; } /** * 替换框架支持的关键字。 * * @param helper SpEL 内容替换器 */ private void replaceDefaultKey(SpELContentReplacerHelper helper) { helper.replaceByKey("category", "category"); helper.replaceByKey("subcategory", "subcategory"); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy