
spring.turbo.util.TextVariables Maven / Gradle / Ivy
package spring.turbo.util;
import org.springframework.core.convert.converter.Converter;
import org.springframework.lang.Nullable;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import static java.util.regex.Pattern.DOTALL;
import static java.util.regex.Pattern.MULTILINE;
/**
* 工具类,从文本中解析出若干参数名值对。
*
* @author 应卓
* @see StringTokenizer
* @since 3.3.1
*/
public class TextVariables implements Serializable {
private static final StringMatcher DEFAULT_DELIMITER = StringMatcher.charSetMatcher('\n', ';');
/**
* 依赖{@link HashMap} 实现
*/
private final Map innerMap = new HashMap<>();
/**
* 默认构造方法
*/
public TextVariables() {
}
/**
* 构造方法
*
* @param text 多个参数合成的字符串
* @see StringMatcher
* @see StringMatcher#stringMatcher(String)
*/
public TextVariables(@Nullable String text) {
reset(text, DEFAULT_DELIMITER);
}
/**
* 构造方法
*
* @param text 多个参数合成的字符串
* @param delimiter 参数之间的分隔符
* @see StringMatcher
* @see StringMatcher#stringMatcher(String)
*/
public TextVariables(@Nullable String text, @Nullable StringMatcher delimiter) {
reset(text, delimiter);
}
/**
* 获取解析出的参数名
*
* @return 参数名集合
*/
public Set getNames() {
return innerMap.keySet();
}
/**
* 获取参数值
*
* @param name 参数名
* @return 参数值或空值
*/
@Nullable
public String getValue(String name) {
return innerMap.get(name);
}
/**
* 获取参数值
*
* @param name 参数名
* @param defaultValue 默认值
* @return 参数值默认值
*/
@Nullable
public String getValue(String name, @Nullable String defaultValue) {
var value = getValue(name);
if (value != null && !value.isBlank()) {
return defaultValue;
}
return value;
}
/**
* 获取参数值并转换成其他类型
*
* @param name 参数名
* @param converter 转换器
* @param 转换器目标类型泛型
* @return 转换结果
*/
@Nullable
public T getValue(String name, Converter converter) {
var value = getValue(name);
if (value == null || value.isBlank()) {
return (T) null;
}
return converter.convert(value);
}
/**
* 获取参数值并转换成其他类型
*
* @param name 参数名
* @param converter 转换器
* @param defaultObject 转换失败或没有对应值时返回此对象
* @param 转换器目标类型泛型
* @return 转换结果或默认值
*/
@Nullable
public T getValue(String name, Converter converter, @Nullable T defaultObject) {
var value = getValue(name);
if (value == null || value.isBlank()) {
return (T) defaultObject;
}
try {
return converter.convert(value);
} catch (Throwable e) {
return defaultObject;
}
}
/**
* 获取参数的数量
*
* @return 参数的数量
* @see Map#size()
*/
public int size() {
return innerMap.size();
}
/**
* 判断是不是包含参数
*
* @return 结果
* @see Map#size()
*/
public boolean isEmpty() {
return innerMap.isEmpty();
}
/**
* 清除所有参数
*/
public void clear() {
innerMap.clear();
}
/**
* 重置
*
* @param text 多个参数合成的字符串
* @param delimiter 参数之间的分隔符
* @see StringMatcher
* @see StringMatcher#stringMatcher(String)
*/
public void reset(@Nullable String text, @Nullable StringMatcher delimiter) {
innerMap.clear();
if (StringUtils.isNotBlank(text)) {
delimiter = delimiter != null ? delimiter : DEFAULT_DELIMITER;
var stringTokenizer =
StringTokenizer.newInstance(text)
.setDelimiterMatcher(delimiter)
.setTrimmerMatcher(StringMatcher.noneMatcher());
while (stringTokenizer.hasNext()) {
var token = stringTokenizer.next();
if (!token.isBlank()) {
// 注意: Group1 用的是懒惰量词
var regex = "(.*?)=(.*)";
var pattern = Pattern.compile(regex, DOTALL | MULTILINE);
var matcher = pattern.matcher(token);
if (matcher.matches()) {
var variableName = matcher.group(1).trim();
var variableValue = matcher.group(2).trim();
innerMap.put(variableName, variableValue);
}
}
}
}
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return innerMap.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy