P15GEN2\59518
2024-05-29 d4210c7c4b04abde20037ea8aa0f54ef8a2649aa
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package foundation.variant.expression;
 
public class VariantParser {
 
    private static char DefaultFlag_Variant = '@';
    private static char DefaultFlag_LeftQuote = '{';    
    private static char DefaultFlag_RightQuote = '}';
    private char Flag_Variant;
    private char Flag_LeftQuote;
    private char Flag_RightQuote;
    private IVariantParseListener listener;
 
    public VariantParser(IVariantParseListener listener) {
        this.listener = listener;
        this.Flag_Variant = DefaultFlag_Variant;
        this.Flag_LeftQuote = DefaultFlag_LeftQuote;
        this.Flag_RightQuote = DefaultFlag_RightQuote;
    }
    
    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;
                begin = i + 1;
            }
        }
        
        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 void setFlag_Variant(char value) {
        Flag_Variant = value;
    }
 
    public void setFlag_LeftQuote(char value) {
        Flag_LeftQuote = value;
    }
 
    public void setFlag_RightQuote(char value) {
        Flag_RightQuote = value;
    }
 
    public static void main(String[] args) {
        System.out.println(getVariantName("123@{456}789"));
    }
 
}