package com.ruoyi.basic.utils;
|
|
import com.ruoyi.common.exception.base.BaseException;
|
|
import java.util.regex.Pattern;
|
|
/**
|
* 标准树固定两级路径解析工具。
|
*
|
* 兼容前端传递的两种叶子路径:
|
* 标准库侧:行业 - null - 标准
|
* 下单侧:行业 - - 标准
|
* 统一解析为 industry = 第一个有效段,standard = 最后一个有效段。
|
*/
|
public final class StandardTreePathParser {
|
|
private static final String SEPARATOR = " - ";
|
|
private static final String NULL_MARKER = "null";
|
|
private StandardTreePathParser() {
|
}
|
|
/**
|
* 解析路径为行业 + 标准。标准可能为 null(表示仅行业节点)。
|
*/
|
public static StandardTreePath parse(String tree) {
|
if (tree == null || tree.trim().isEmpty()) {
|
throw new BaseException("标准树路径格式错误");
|
}
|
String[] parts = tree.split(Pattern.quote(SEPARATOR), -1);
|
for (int i = 0; i < parts.length; i++) {
|
parts[i] = parts[i].trim();
|
}
|
if (parts.length == 1) {
|
validateSegment(parts[0]);
|
return new StandardTreePath(parts[0], null);
|
}
|
if (parts.length == 2) {
|
validateSegment(parts[0]);
|
validateSegment(parts[1]);
|
return new StandardTreePath(parts[0], parts[1]);
|
}
|
if (parts.length == 3 && (parts[1].isEmpty() || NULL_MARKER.equals(parts[1]))) {
|
validateSegment(parts[0]);
|
validateSegment(parts[2]);
|
return new StandardTreePath(parts[0], parts[2]);
|
}
|
throw new BaseException("标准树路径格式错误");
|
}
|
|
/**
|
* 生成规范路径:行业 - null - 标准
|
*/
|
public static String canonical(String industry, String standard) {
|
String normalizedIndustry = trim(industry);
|
String normalizedStandard = trim(standard);
|
validateSegment(normalizedIndustry);
|
validateSegment(normalizedStandard);
|
return normalizedIndustry + SEPARATOR + NULL_MARKER + SEPARATOR + normalizedStandard;
|
}
|
|
private static String trim(String value) {
|
return value == null ? "" : value.trim();
|
}
|
|
public static String normalizeNodeName(String value) {
|
String normalized = trim(value);
|
validateSegment(normalized);
|
return normalized;
|
}
|
|
private static void validateSegment(String value) {
|
if (value == null || value.isEmpty() || NULL_MARKER.equals(value) || value.contains(SEPARATOR)) {
|
throw new BaseException("标准树路径格式错误");
|
}
|
}
|
}
|