1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.validator;
18
19 import java.io.Serializable;
20 import java.util.Collections;
21 import java.util.HashMap;
22 import java.util.Locale;
23 import java.util.Map;
24 import java.util.Map.Entry;
25 import java.util.Objects;
26
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29
30
31
32
33
34
35 public class FormSet implements Serializable {
36
37 private static final long serialVersionUID = -8936513232763306055L;
38
39
40
41
42 protected static final int GLOBAL_FORMSET = 1;
43
44
45
46
47
48 protected static final int LANGUAGE_FORMSET = 2;
49
50
51
52
53
54 protected static final int COUNTRY_FORMSET = 3;
55
56
57
58
59 protected static final int VARIANT_FORMSET = 4;
60
61
62 private transient Log log = LogFactory.getLog(FormSet.class);
63
64
65
66
67
68 private boolean processed;
69
70
71 private String language;
72
73
74 private String country;
75
76
77 private String variant;
78
79
80
81
82
83 private final Map<String, Form> forms = new HashMap<>();
84
85
86
87
88
89 private final Map<String, String> constants = new HashMap<>();
90
91
92
93
94
95 private volatile boolean merged;
96
97
98
99
100 public FormSet() {
101
102 }
103
104
105
106
107
108
109
110 public void addConstant(final String name, final String value) {
111 if (constants.containsKey(name)) {
112 getLog().error("Constant '" + name + "' already exists in FormSet[" + displayKey() + "] - ignoring.");
113 } else {
114 constants.put(name, value);
115 }
116 }
117
118
119
120
121
122
123 public void addForm(final Form f) {
124
125 final String formName = f.getName();
126 if (forms.containsKey(formName)) {
127 getLog().error("Form '" + formName + "' already exists in FormSet[" + displayKey() + "] - ignoring.");
128
129 } else {
130 forms.put(f.getName(), f);
131 }
132
133 }
134
135
136
137
138
139
140 public String displayKey() {
141 final StringBuilder results = new StringBuilder();
142 if (language != null && !language.isEmpty()) {
143 results.append("language=");
144 results.append(language);
145 }
146 if (country != null && !country.isEmpty()) {
147 if (results.length() > 0) {
148 results.append(", ");
149 }
150 results.append("country=");
151 results.append(country);
152 }
153 if (variant != null && !variant.isEmpty()) {
154 if (results.length() > 0) {
155 results.append(", ");
156 }
157 results.append("variant=");
158 results.append(variant);
159 }
160 if (results.length() == 0) {
161 results.append("default");
162 }
163
164 return results.toString();
165 }
166
167
168
169
170
171
172 public String getCountry() {
173 return country;
174 }
175
176
177
178
179
180
181
182 public Form getForm(final String formName) {
183 return forms.get(formName);
184 }
185
186
187
188
189
190
191
192 public Map<String, Form> getForms() {
193 return Collections.unmodifiableMap(forms);
194 }
195
196
197
198
199
200
201 public String getLanguage() {
202 return language;
203 }
204
205
206
207
208
209
210
211
212
213
214
215 private Log getLog() {
216 if (log == null) {
217 log = LogFactory.getLog(FormSet.class);
218 }
219 return log;
220 }
221
222
223
224
225
226
227
228
229
230
231 protected int getType() {
232 final String myLanguage = getLanguage();
233 final String myCountry = getCountry();
234 if (getVariant() != null) {
235 Objects.requireNonNull(myLanguage, "When variant is specified, country and language must be specified.");
236 Objects.requireNonNull(myCountry, "When variant is specified, country and language must be specified.");
237 return VARIANT_FORMSET;
238 }
239 if (myCountry != null) {
240 Objects.requireNonNull(myLanguage, "When country is specified, language must be specified.");
241 return COUNTRY_FORMSET;
242 }
243 if (myLanguage != null) {
244 return LANGUAGE_FORMSET;
245 }
246 return GLOBAL_FORMSET;
247 }
248
249
250
251
252
253
254 public String getVariant() {
255 return variant;
256 }
257
258
259
260
261
262
263
264 protected boolean isMerged() {
265 return merged;
266 }
267
268
269
270
271
272
273
274 public boolean isProcessed() {
275 return processed;
276 }
277
278
279
280
281
282
283
284
285
286
287 protected void merge(final FormSet depends) {
288 if (depends != null) {
289 final Map<String, Form> myForms = getForms();
290 final Map<String, Form> dependsForms = depends.getForms();
291 for (final Entry<String, Form> entry : dependsForms.entrySet()) {
292 final String key = entry.getKey();
293 final Form form = myForms.get(key);
294 if (form != null) {
295
296 form.merge(entry.getValue());
297 } else {
298 addForm(entry.getValue());
299 }
300 }
301 }
302 merged = true;
303 }
304
305
306
307
308
309
310 synchronized void process(final Map<String, String> globalConstants) {
311 for (final Form f : forms.values()) {
312 f.process(globalConstants, constants, forms);
313 }
314
315 processed = true;
316 }
317
318
319
320
321
322
323 public void setCountry(final String country) {
324 this.country = country;
325 }
326
327
328
329
330
331
332 public void setLanguage(final String language) {
333 this.language = language;
334 }
335
336
337
338
339
340
341 public void setVariant(final String variant) {
342 this.variant = variant;
343 }
344
345
346
347
348
349
350 @Override
351 public String toString() {
352 final StringBuilder results = new StringBuilder();
353
354 results.append("FormSet: language=");
355 results.append(language);
356 results.append(" country=");
357 results.append(country);
358 results.append(" variant=");
359 results.append(variant);
360 results.append("\n");
361
362 for (final Object name : getForms().values()) {
363 results.append(" ");
364 results.append(name);
365 results.append("\n");
366 }
367
368 return results.toString();
369 }
370 }