hefeixia
2021-02-18 5b8c95c760840f09910730943b21391e47187315
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package frame.variant.expression;
 
public class VariantParser {
 
    private static char Flag_Variant = '@';
    private static char Flag_LeftQuote = '{';    
    private static char Flag_RightQuote = '}';    
    private IVariantParseListener listener;
 
    public VariantParser(IVariantParseListener listener) {
        this.listener = listener;
    }
    
    public void parse(String expression) throws Exception {
        if (expression == null) {
            return;
        }
        
        int length = expression.length();
        
        String segmentString;
        int variantLength = 0;        
        int begin = 0;
        char curr;
        
        for (int i = 0; i < length; i++) {
            curr = expression.charAt(i);
            
            if (isKey(curr)) {
                if (Flag_LeftQuote != expression.charAt(Math.min(i + 1, length - 1))) {
                    continue;
                }
                
                segmentString = expression.substring(begin, i);
                onFindSegment(segmentString);
                
                variantLength = getVariantLength(expression, i + 1, length);
                segmentString = expression.substring(i + 2, i + 2 + variantLength);
                
                onFindVariant(curr, segmentString);
                
                i = i + 2 + variantLength + 1;
                begin = i;
            }
        }
        
        if (begin <= length - 1) {
            segmentString = expression.substring(begin, length);
            onFindSegment(segmentString);
        }
    }
    
    public static String getVariantName(String value) {
        if (value == null) {
            return null;
        }
        
        int begin = value.indexOf("@{") + 2;
        int end = value.indexOf("}", begin);
        
        if (end <= begin) {
            return null; 
        }
        
        return value.substring(begin, end);
    }
    
    public static String toSegmentString(String name) {
        return "@{" + name + "}";
    }
    
    protected boolean isKey(char value) {
        return Flag_Variant == value;
    }
 
    protected void onFindSegment(String segment) throws Exception {
        if (listener != null) {
            listener.onSegment(segment);
        }
    }    
    
    protected void onFindVariant(char key, String variant) throws Exception {
        if (listener != null) {
            listener.addVariant(variant);
        }        
    }
 
    private int getVariantLength(String expression, int pos, int max) throws Exception {
        if (Flag_LeftQuote == expression.charAt(pos)) {
            for (int i = pos + 1; i < max; i++) {
                if (Flag_RightQuote == expression.charAt(i)) {
                    return i - pos - 1;
                }
            }
        }
        else {
            throw new Exception("error parse param expression (" + pos + "):" + expression);
        }
        
        throw new Exception("error parse param expression (" + pos + "):" + expression);
    }
    
    public static void main(String[] args) {
        System.out.println(getVariantName("123@{456}789"));
    }
 
}