liding
2 天以前 bd46f203b0d30a3d33b7c51ae9a528e4807477e1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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("标准树路径格式错误");
        }
    }
}