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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package frame.variant.expression;
 
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import frame.util.Util;
 
public class GlobalVariant {
 
    private static Object lock = new Object();
    private static GlobalVariant instance;
    private Map<String, IVariantRequestListener> listenerMap;
    
    
    private GlobalVariant() throws VariantExistsException {
        listenerMap = new HashMap<String, IVariantRequestListener>();
    }
    
    public static GlobalVariant getInstance() {
        if (instance == null) {
            synchronized(lock) {
                try {
                    if (instance == null) {
                        instance = new GlobalVariant();
                        GlobalVariantProvider provider = new GlobalVariantProvider();
                        GlobalVariant.regist(provider);
                    }
                }
                catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        return instance;
    }
    
    public static void regist(IVariantRequestListener listener) throws VariantExistsException {
        GlobalVariant service = getInstance();
        
        List<String> variantNames = listener.getVariantNames();
        
        if (variantNames == null) {
            return;
        }
        
        for (String name: variantNames) {
            if (name == null) {
                continue;
            }
            
            String lower = name.toLowerCase();
            
            if (service.listenerMap.containsKey(lower)) {
                throw new VariantExistsException(name);
            }
            
            service.listenerMap.put(lower, listener);
        }
    }
    
    public static String getStringValue(String name) throws Exception {
        return getStringValue(name, null);
    }
        
    public static String getStringValue(String name, VariantRequestParams params) throws Exception {
        GlobalVariant service = getInstance();
        
        if (name == null) {
            return null;
        }
        
        String lower = name.toLowerCase();
        
        IVariantRequestListener listener = service.listenerMap.get(lower);
        
        if (listener == null) {
            return null;
        }
        
        return listener.getStringValue(lower, params);
    }
    
    public static class GlobalVariantProvider implements IVariantRequestListener {
        
        private List<String> variantNames;
        
        public GlobalVariantProvider() {
            variantNames = new ArrayList<String>();
            initVariantNames();
        }
        
        @Override
        public String getStringValue(String name, VariantRequestParams params) {
            if ("guid".equals(name)) {
                return Util.newShortGUID();
            }
            else if ("newDate".equals(name)) {
                return Util.newDateStr();
            }
            else if ("newDateTime".equals(name)) {
                return Util.newDateTimeStr();
            }
            else if ("current.year".equals(name)) {
                Calendar calendar = Calendar.getInstance();
                return String.valueOf(calendar.get(Calendar.YEAR));
            }
            else if ("current.month".equals(name)) {
                Calendar calendar = Calendar.getInstance();
                return String.valueOf(calendar.get(Calendar.MONTH) + 1);
            }
            
            return null;            
        }
 
        @Override
        public List<String> getVariantNames() {
            return variantNames;
        }
        
        public void initVariantNames() {
            variantNames.add("guid");
            variantNames.add("newDate");
            variantNames.add("newDateTime");
            variantNames.add("current.year");
            variantNames.add("current.month");
        }
    }
}