Commit 6b7e32cb4b062c23633566e7eca5dfacd29cde6a
1 parent
a6feb89f
Exists in
master
Suporte ao carregamento de Map nas classes de configuração
Showing
1 changed file
with
113 additions
and
106 deletions
Show diff stats
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java
... | ... | @@ -43,10 +43,12 @@ import java.lang.reflect.Method; |
43 | 43 | import java.lang.reflect.ParameterizedType; |
44 | 44 | import java.lang.reflect.Type; |
45 | 45 | import java.net.URL; |
46 | -import java.util.HashSet; | |
46 | +import java.util.HashMap; | |
47 | 47 | import java.util.Iterator; |
48 | +import java.util.Map; | |
48 | 49 | import java.util.Properties; |
49 | -import java.util.Set; | |
50 | +import java.util.regex.Matcher; | |
51 | +import java.util.regex.Pattern; | |
50 | 52 | |
51 | 53 | import javax.validation.constraints.NotNull; |
52 | 54 | |
... | ... | @@ -114,7 +116,7 @@ public class ConfigurationLoader implements Serializable { |
114 | 116 | org.apache.commons.configuration.Configuration config = getConfiguration(resource, type); |
115 | 117 | |
116 | 118 | if (config != null) { |
117 | - String key = getKey(field, clazz, config); | |
119 | + Key key = new Key(field, clazz, config); | |
118 | 120 | Object value = getValue(key, field, config); |
119 | 121 | |
120 | 122 | validate(field, key, value, resource); |
... | ... | @@ -123,106 +125,21 @@ public class ConfigurationLoader implements Serializable { |
123 | 125 | } |
124 | 126 | } |
125 | 127 | |
126 | - private void setValue(Field field, String key, Object object, Object value) { | |
128 | + private void setValue(Field field, Key key, Object object, Object value) { | |
127 | 129 | if (value != null) { |
128 | 130 | Reflections.setFieldValue(field, object, value); |
129 | - getLogger().debug(getBundle().getString("configuration-field-loaded", key, field.getName(), value)); | |
131 | + getLogger().debug( | |
132 | + getBundle().getString("configuration-field-loaded", key.toString(), field.getName(), value)); | |
130 | 133 | } |
131 | 134 | } |
132 | 135 | |
133 | - private void validate(Field field, String key, Object value, String resource) { | |
136 | + private void validate(Field field, Key key, Object value, String resource) { | |
134 | 137 | if (field.isAnnotationPresent(NotNull.class) && value == null) { |
135 | - throw new ConfigurationException(getBundle().getString("configuration-attribute-is-mandatory", key, | |
136 | - resource)); | |
138 | + throw new ConfigurationException(getBundle().getString("configuration-attribute-is-mandatory", | |
139 | + key.toString(), resource)); | |
137 | 140 | } |
138 | 141 | } |
139 | 142 | |
140 | - private String getKey(final Field field, final Class<?> clazz, | |
141 | - final org.apache.commons.configuration.Configuration config) { | |
142 | - | |
143 | - final String prefix = getPrefix(field, clazz); | |
144 | - final StringBuffer key = new StringBuffer(); | |
145 | - | |
146 | - key.append(prefix); | |
147 | - | |
148 | - if (field.isAnnotationPresent(Name.class)) { | |
149 | - key.append(getKeyByAnnotation(field)); | |
150 | - } else { | |
151 | - key.append(getKeyByConvention(field, prefix, config)); | |
152 | - } | |
153 | - | |
154 | - return key.toString(); | |
155 | - } | |
156 | - | |
157 | - private String getPrefix(Field field, Class<?> type) { | |
158 | - String prefix = ""; | |
159 | - | |
160 | - Configuration classAnnotation = type.getAnnotation(Configuration.class); | |
161 | - if (!Strings.isEmpty(classAnnotation.prefix())) { | |
162 | - | |
163 | - prefix = classAnnotation.prefix(); | |
164 | - | |
165 | - if (prefix.charAt(prefix.length() - 1) != '.') { | |
166 | - getLogger().warn( | |
167 | - "ATENÇÃO!!! Informe o ponto (.) ao final da declaração do atributo prefix = \"" + prefix | |
168 | - + "\" da anotação @Configuration da classe " + type.getCanonicalName() | |
169 | - + " para evitar incompatibilidade com as próximas versões do Demoiselle."); | |
170 | - | |
171 | - prefix += "."; | |
172 | - } | |
173 | - } | |
174 | - | |
175 | - return prefix; | |
176 | - } | |
177 | - | |
178 | - private String getKeyByAnnotation(Field field) { | |
179 | - String key = null; | |
180 | - | |
181 | - Name nameAnnotation = field.getAnnotation(Name.class); | |
182 | - if (Strings.isEmpty(nameAnnotation.value())) { | |
183 | - throw new ConfigurationException(getBundle().getString("configuration-name-attribute-cant-be-empty")); | |
184 | - } else { | |
185 | - key = nameAnnotation.value(); | |
186 | - } | |
187 | - | |
188 | - return key; | |
189 | - } | |
190 | - | |
191 | - private String getKeyByConvention(Field field, String prefix, org.apache.commons.configuration.Configuration config) { | |
192 | - | |
193 | - Set<String> conventions = new HashSet<String>(); | |
194 | - conventions.add(field.getName()); | |
195 | - conventions.add(Strings.camelCaseToSymbolSeparated(field.getName(), ".")); | |
196 | - conventions.add(Strings.camelCaseToSymbolSeparated(field.getName(), "_")); | |
197 | - conventions.add(field.getName().toLowerCase()); | |
198 | - conventions.add(field.getName().toUpperCase()); | |
199 | - | |
200 | - int matches = 0; | |
201 | - String key = field.getName(); | |
202 | - for (String convention : conventions) { | |
203 | - if (config.containsKey(prefix + convention)) { | |
204 | - key = convention; | |
205 | - matches++; | |
206 | - } | |
207 | - } | |
208 | - | |
209 | - if (!field.getName().equals(key)) { | |
210 | - getLogger().warn( | |
211 | - "ATENÇÃO!!! Anote o atributo " + field.getName() + " da classe " | |
212 | - + field.getDeclaringClass().getCanonicalName() + " com @Name(\"" + key | |
213 | - + "\") para evitar incompatibilidade com as próximas versões do Demoiselle."); | |
214 | - } | |
215 | - | |
216 | - if (matches == 0) { | |
217 | - getLogger().debug(getBundle().getString("configuration-key-not-found", key, conventions)); | |
218 | - } else if (matches > 1) { | |
219 | - throw new ConfigurationException(getBundle().getString("ambiguous-key", field.getName(), | |
220 | - field.getDeclaringClass())); | |
221 | - } | |
222 | - | |
223 | - return key; | |
224 | - } | |
225 | - | |
226 | 143 | /** |
227 | 144 | * Returns the configuration class according to specified resource name and configuration type. |
228 | 145 | * |
... | ... | @@ -273,7 +190,7 @@ public class ConfigurationLoader implements Serializable { |
273 | 190 | } |
274 | 191 | |
275 | 192 | @SuppressWarnings("unchecked") |
276 | - private <T> T getValue(String key, Field field, org.apache.commons.configuration.Configuration config) { | |
193 | + private <T> T getValue(Key key, Field field, org.apache.commons.configuration.Configuration config) { | |
277 | 194 | Object value; |
278 | 195 | |
279 | 196 | Class<?> fieldClass = (Class<?>) field.getType(); |
... | ... | @@ -281,6 +198,9 @@ public class ConfigurationLoader implements Serializable { |
281 | 198 | if (fieldClass.isArray()) { |
282 | 199 | value = getArray(key, field, config); |
283 | 200 | |
201 | + } else if (fieldClass.equals(Map.class)) { | |
202 | + value = getMap(key, field, config); | |
203 | + | |
284 | 204 | } else if (fieldClass.equals(Properties.class)) { |
285 | 205 | value = getProperty(key, config); |
286 | 206 | |
... | ... | @@ -294,7 +214,37 @@ public class ConfigurationLoader implements Serializable { |
294 | 214 | return (T) value; |
295 | 215 | } |
296 | 216 | |
297 | - private <T> Object getArray(String key, Field field, org.apache.commons.configuration.Configuration config) { | |
217 | + private <T> Object getMap(Key key, Field field, org.apache.commons.configuration.Configuration config) { | |
218 | + Map<String, Object> value = null; | |
219 | + | |
220 | + Pattern pattern = Pattern.compile("^(" + key.getPrefix() + ")(.+)\\.(" + key.getName() + ")$"); | |
221 | + Matcher matcher; | |
222 | + | |
223 | + String iterKey; | |
224 | + String mapKey; | |
225 | + String confKey; | |
226 | + | |
227 | + for (@SuppressWarnings("unchecked") | |
228 | + Iterator<String> iter = config.getKeys(); iter.hasNext();) { | |
229 | + iterKey = iter.next(); | |
230 | + matcher = pattern.matcher(iterKey); | |
231 | + | |
232 | + if (matcher.matches()) { | |
233 | + mapKey = matcher.group(2); | |
234 | + confKey = matcher.group(1) + matcher.group(2) + "." + matcher.group(3); | |
235 | + | |
236 | + if (value == null) { | |
237 | + value = new HashMap<String, Object>(); | |
238 | + } | |
239 | + | |
240 | + value.put(mapKey, config.getProperty(confKey)); | |
241 | + } | |
242 | + } | |
243 | + | |
244 | + return value; | |
245 | + } | |
246 | + | |
247 | + private <T> Object getArray(Key key, Field field, org.apache.commons.configuration.Configuration config) { | |
298 | 248 | Object value = null; |
299 | 249 | |
300 | 250 | Class<?> fieldClass = (Class<?>) field.getType(); |
... | ... | @@ -309,7 +259,7 @@ public class ConfigurationLoader implements Serializable { |
309 | 259 | methodName += "Array"; |
310 | 260 | |
311 | 261 | method = config.getClass().getMethod(methodName, String.class); |
312 | - value = method.invoke(config, key); | |
262 | + value = method.invoke(config, key.toString()); | |
313 | 263 | |
314 | 264 | } catch (Throwable cause) { |
315 | 265 | throw new ConfigurationException(getBundle().getString("error-converting-to-type", fieldClass.getName()), |
... | ... | @@ -319,7 +269,7 @@ public class ConfigurationLoader implements Serializable { |
319 | 269 | return value; |
320 | 270 | } |
321 | 271 | |
322 | - private <T> Object getBasic(String key, Field field, org.apache.commons.configuration.Configuration config) { | |
272 | + private <T> Object getBasic(Key key, Field field, org.apache.commons.configuration.Configuration config) { | |
323 | 273 | Object value = null; |
324 | 274 | |
325 | 275 | Class<?> fieldClass = (Class<?>) field.getType(); |
... | ... | @@ -333,11 +283,11 @@ public class ConfigurationLoader implements Serializable { |
333 | 283 | |
334 | 284 | if (!fieldClass.isPrimitive()) { |
335 | 285 | method = config.getClass().getMethod(methodName, String.class, fieldClass); |
336 | - value = method.invoke(config, key, null); | |
286 | + value = method.invoke(config, key.toString(), null); | |
337 | 287 | |
338 | - } else if (config.containsKey(key)) { | |
288 | + } else if (config.containsKey(key.toString())) { | |
339 | 289 | method = config.getClass().getMethod(methodName, String.class); |
340 | - value = method.invoke(config, key); | |
290 | + value = method.invoke(config, key.toString()); | |
341 | 291 | } |
342 | 292 | |
343 | 293 | } catch (Throwable cause) { |
... | ... | @@ -348,11 +298,11 @@ public class ConfigurationLoader implements Serializable { |
348 | 298 | return value; |
349 | 299 | } |
350 | 300 | |
351 | - private <T> Object getClass(String key, Field field, org.apache.commons.configuration.Configuration config) { | |
301 | + private <T> Object getClass(Key key, Field field, org.apache.commons.configuration.Configuration config) { | |
352 | 302 | Object value = null; |
353 | 303 | |
354 | 304 | try { |
355 | - String canonicalName = config.getString(key); | |
305 | + String canonicalName = config.getString(key.toString()); | |
356 | 306 | |
357 | 307 | if (canonicalName != null) { |
358 | 308 | ClassLoader classLoader = getClassLoaderForClass(canonicalName); |
... | ... | @@ -395,17 +345,17 @@ public class ConfigurationLoader implements Serializable { |
395 | 345 | return ""; |
396 | 346 | } |
397 | 347 | |
398 | - private Object getProperty(String key, org.apache.commons.configuration.Configuration config) { | |
348 | + private Object getProperty(Key key, org.apache.commons.configuration.Configuration config) { | |
399 | 349 | Object value = null; |
400 | 350 | |
401 | 351 | @SuppressWarnings("unchecked") |
402 | - Iterator<String> iterator = config.getKeys(key); | |
352 | + Iterator<String> iterator = config.getKeys(key.toString()); | |
403 | 353 | if (iterator.hasNext()) { |
404 | 354 | Properties props = new Properties(); |
405 | 355 | |
406 | 356 | while (iterator.hasNext()) { |
407 | 357 | String fullKey = iterator.next(); |
408 | - String prefix = key + "."; | |
358 | + String prefix = key.toString() + "."; | |
409 | 359 | String unprefixedKey = fullKey.substring(prefix.length()); |
410 | 360 | props.put(unprefixedKey, config.getString(fullKey)); |
411 | 361 | } |
... | ... | @@ -470,4 +420,61 @@ public class ConfigurationLoader implements Serializable { |
470 | 420 | |
471 | 421 | return bootstrap; |
472 | 422 | } |
423 | + | |
424 | + private class Key { | |
425 | + | |
426 | + private String prefix; | |
427 | + | |
428 | + private String name; | |
429 | + | |
430 | + private String key; | |
431 | + | |
432 | + private Key(final Field field, final Class<?> type, final org.apache.commons.configuration.Configuration config) { | |
433 | + | |
434 | + this.prefix = type.getAnnotation(Configuration.class).prefix(); | |
435 | + if (this.prefix == null) { | |
436 | + this.prefix = ""; | |
437 | + } else { | |
438 | + this.prefix += "."; | |
439 | + } | |
440 | + | |
441 | + if (field.isAnnotationPresent(Name.class)) { | |
442 | + this.name = getNameByAnnotation(field); | |
443 | + } else { | |
444 | + this.name = getNameByField(field); | |
445 | + } | |
446 | + | |
447 | + this.key = this.prefix + this.name; | |
448 | + } | |
449 | + | |
450 | + private String getNameByAnnotation(Field field) { | |
451 | + String key = null; | |
452 | + | |
453 | + Name nameAnnotation = field.getAnnotation(Name.class); | |
454 | + if (Strings.isEmpty(nameAnnotation.value())) { | |
455 | + throw new ConfigurationException(getBundle().getString("configuration-name-attribute-cant-be-empty")); | |
456 | + } else { | |
457 | + key = nameAnnotation.value(); | |
458 | + } | |
459 | + | |
460 | + return key; | |
461 | + } | |
462 | + | |
463 | + private String getNameByField(Field field) { | |
464 | + return field.getName(); | |
465 | + } | |
466 | + | |
467 | + public String getPrefix() { | |
468 | + return prefix; | |
469 | + } | |
470 | + | |
471 | + public String getName() { | |
472 | + return name; | |
473 | + } | |
474 | + | |
475 | + @Override | |
476 | + public String toString() { | |
477 | + return this.key; | |
478 | + } | |
479 | + } | |
473 | 480 | } | ... | ... |