1
2
3
4
5
6
7
8
9
10
11 package de.jaret.util.date.holidayenumerator;
12
13 import java.lang.reflect.Constructor;
14 import java.util.ArrayList;
15 import java.util.HashMap;
16 import java.util.List;
17 import java.util.Locale;
18 import java.util.Map;
19 import java.util.StringTokenizer;
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 public class HolidayEnumeratorFactory {
35
36 private static final String BASENAME = "de.jaret.util.date.holidayenumerator.HolidayEnumerator_";
37
38
39 private static Map<String, HolidayEnumerator> __enumerators = new HashMap<String, HolidayEnumerator>();
40
41
42
43
44
45
46
47
48
49
50 public static HolidayEnumerator getHolidayEnumeratorInstance(Locale locale, String regionId) {
51
52 HolidayEnumerator he = __enumerators.get(getHolidayEnumeratorId(locale, regionId));
53 if (he != null) {
54 return he;
55 }
56
57 he = instantiateHolidayEnumerator(locale, regionId);
58 if (he != null) {
59 __enumerators.put(getHolidayEnumeratorId(locale, regionId), he);
60 }
61 return he;
62 }
63
64
65
66
67
68
69
70
71 public static HolidayEnumerator getHolidayEnumeratorInstance(String languageAndCountry, String regionId) {
72 StringTokenizer tokenizer = new StringTokenizer(languageAndCountry, "_");
73 String language = null;
74 String country = null;
75 if (tokenizer.hasMoreTokens()) {
76 language = tokenizer.nextToken();
77 }
78 if (tokenizer.hasMoreTokens()) {
79 country = tokenizer.nextToken();
80 }
81 if (country == null || language == null) {
82 return null;
83 }
84
85 Locale locale = new Locale(language, country);
86 return getHolidayEnumeratorInstance(locale, regionId);
87 }
88
89
90
91
92
93
94
95
96 private static String getHolidayEnumeratorId(Locale locale, String regionId) {
97 return locale.toString() + "_" + (regionId != null ? regionId : "");
98 }
99
100
101
102
103
104
105
106 @SuppressWarnings("unchecked")
107 private static Class<? extends HolidayEnumerator> getHolidayEnumeratorClass(Locale locale) {
108
109 String classname = BASENAME + locale.toString();
110 Class<? extends HolidayEnumerator> clazz = null;
111 try {
112 clazz = (Class<? extends HolidayEnumerator>) Class.forName(classname);
113 } catch (Exception e) {
114
115 }
116 return clazz;
117 }
118
119
120
121
122
123
124
125
126
127 private static HolidayEnumerator instantiateHolidayEnumerator(Locale locale, String regionId) {
128 Class<? extends HolidayEnumerator> clazz = getHolidayEnumeratorClass(locale);
129 if (clazz == null) {
130
131 return null;
132 }
133 Constructor<? extends HolidayEnumerator> constructor;
134
135 try {
136 constructor = clazz.getConstructor(new Class[] {String.class});
137 HolidayEnumerator he = (HolidayEnumerator) constructor.newInstance(new Object[] {regionId});
138 return he;
139 } catch (Exception e) {
140
141 }
142
143 try {
144 constructor = clazz.getConstructor(new Class[] {});
145 HolidayEnumerator he = (HolidayEnumerator) constructor.newInstance(new Object[] {});
146 return he;
147 } catch (Exception e) {
148
149 }
150 return null;
151 }
152
153
154 private static List<Locale> _availableHolidayEnumeratorLocales;
155
156
157
158
159
160
161
162 public static List<Locale> getAvailableHolidayEnumeratorLocales() {
163 if (_availableHolidayEnumeratorLocales != null) {
164 return _availableHolidayEnumeratorLocales;
165 }
166 List<Locale> result = new ArrayList<Locale>();
167 Locale[] locales = Locale.getAvailableLocales();
168 for (int i = 0; i < locales.length; i++) {
169 if (getHolidayEnumeratorClass(locales[i]) != null) {
170 result.add(locales[i]);
171 }
172 }
173 _availableHolidayEnumeratorLocales = result;
174 return result;
175 }
176
177 }