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,10 +43,12 @@ import java.lang.reflect.Method; | ||
43 | import java.lang.reflect.ParameterizedType; | 43 | import java.lang.reflect.ParameterizedType; |
44 | import java.lang.reflect.Type; | 44 | import java.lang.reflect.Type; |
45 | import java.net.URL; | 45 | import java.net.URL; |
46 | -import java.util.HashSet; | 46 | +import java.util.HashMap; |
47 | import java.util.Iterator; | 47 | import java.util.Iterator; |
48 | +import java.util.Map; | ||
48 | import java.util.Properties; | 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 | import javax.validation.constraints.NotNull; | 53 | import javax.validation.constraints.NotNull; |
52 | 54 | ||
@@ -114,7 +116,7 @@ public class ConfigurationLoader implements Serializable { | @@ -114,7 +116,7 @@ public class ConfigurationLoader implements Serializable { | ||
114 | org.apache.commons.configuration.Configuration config = getConfiguration(resource, type); | 116 | org.apache.commons.configuration.Configuration config = getConfiguration(resource, type); |
115 | 117 | ||
116 | if (config != null) { | 118 | if (config != null) { |
117 | - String key = getKey(field, clazz, config); | 119 | + Key key = new Key(field, clazz, config); |
118 | Object value = getValue(key, field, config); | 120 | Object value = getValue(key, field, config); |
119 | 121 | ||
120 | validate(field, key, value, resource); | 122 | validate(field, key, value, resource); |
@@ -123,106 +125,21 @@ public class ConfigurationLoader implements Serializable { | @@ -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 | if (value != null) { | 129 | if (value != null) { |
128 | Reflections.setFieldValue(field, object, value); | 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 | if (field.isAnnotationPresent(NotNull.class) && value == null) { | 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 | * Returns the configuration class according to specified resource name and configuration type. | 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,7 +190,7 @@ public class ConfigurationLoader implements Serializable { | ||
273 | } | 190 | } |
274 | 191 | ||
275 | @SuppressWarnings("unchecked") | 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 | Object value; | 194 | Object value; |
278 | 195 | ||
279 | Class<?> fieldClass = (Class<?>) field.getType(); | 196 | Class<?> fieldClass = (Class<?>) field.getType(); |
@@ -281,6 +198,9 @@ public class ConfigurationLoader implements Serializable { | @@ -281,6 +198,9 @@ public class ConfigurationLoader implements Serializable { | ||
281 | if (fieldClass.isArray()) { | 198 | if (fieldClass.isArray()) { |
282 | value = getArray(key, field, config); | 199 | value = getArray(key, field, config); |
283 | 200 | ||
201 | + } else if (fieldClass.equals(Map.class)) { | ||
202 | + value = getMap(key, field, config); | ||
203 | + | ||
284 | } else if (fieldClass.equals(Properties.class)) { | 204 | } else if (fieldClass.equals(Properties.class)) { |
285 | value = getProperty(key, config); | 205 | value = getProperty(key, config); |
286 | 206 | ||
@@ -294,7 +214,37 @@ public class ConfigurationLoader implements Serializable { | @@ -294,7 +214,37 @@ public class ConfigurationLoader implements Serializable { | ||
294 | return (T) value; | 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 | Object value = null; | 248 | Object value = null; |
299 | 249 | ||
300 | Class<?> fieldClass = (Class<?>) field.getType(); | 250 | Class<?> fieldClass = (Class<?>) field.getType(); |
@@ -309,7 +259,7 @@ public class ConfigurationLoader implements Serializable { | @@ -309,7 +259,7 @@ public class ConfigurationLoader implements Serializable { | ||
309 | methodName += "Array"; | 259 | methodName += "Array"; |
310 | 260 | ||
311 | method = config.getClass().getMethod(methodName, String.class); | 261 | method = config.getClass().getMethod(methodName, String.class); |
312 | - value = method.invoke(config, key); | 262 | + value = method.invoke(config, key.toString()); |
313 | 263 | ||
314 | } catch (Throwable cause) { | 264 | } catch (Throwable cause) { |
315 | throw new ConfigurationException(getBundle().getString("error-converting-to-type", fieldClass.getName()), | 265 | throw new ConfigurationException(getBundle().getString("error-converting-to-type", fieldClass.getName()), |
@@ -319,7 +269,7 @@ public class ConfigurationLoader implements Serializable { | @@ -319,7 +269,7 @@ public class ConfigurationLoader implements Serializable { | ||
319 | return value; | 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 | Object value = null; | 273 | Object value = null; |
324 | 274 | ||
325 | Class<?> fieldClass = (Class<?>) field.getType(); | 275 | Class<?> fieldClass = (Class<?>) field.getType(); |
@@ -333,11 +283,11 @@ public class ConfigurationLoader implements Serializable { | @@ -333,11 +283,11 @@ public class ConfigurationLoader implements Serializable { | ||
333 | 283 | ||
334 | if (!fieldClass.isPrimitive()) { | 284 | if (!fieldClass.isPrimitive()) { |
335 | method = config.getClass().getMethod(methodName, String.class, fieldClass); | 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 | method = config.getClass().getMethod(methodName, String.class); | 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 | } catch (Throwable cause) { | 293 | } catch (Throwable cause) { |
@@ -348,11 +298,11 @@ public class ConfigurationLoader implements Serializable { | @@ -348,11 +298,11 @@ public class ConfigurationLoader implements Serializable { | ||
348 | return value; | 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 | Object value = null; | 302 | Object value = null; |
353 | 303 | ||
354 | try { | 304 | try { |
355 | - String canonicalName = config.getString(key); | 305 | + String canonicalName = config.getString(key.toString()); |
356 | 306 | ||
357 | if (canonicalName != null) { | 307 | if (canonicalName != null) { |
358 | ClassLoader classLoader = getClassLoaderForClass(canonicalName); | 308 | ClassLoader classLoader = getClassLoaderForClass(canonicalName); |
@@ -395,17 +345,17 @@ public class ConfigurationLoader implements Serializable { | @@ -395,17 +345,17 @@ public class ConfigurationLoader implements Serializable { | ||
395 | return ""; | 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 | Object value = null; | 349 | Object value = null; |
400 | 350 | ||
401 | @SuppressWarnings("unchecked") | 351 | @SuppressWarnings("unchecked") |
402 | - Iterator<String> iterator = config.getKeys(key); | 352 | + Iterator<String> iterator = config.getKeys(key.toString()); |
403 | if (iterator.hasNext()) { | 353 | if (iterator.hasNext()) { |
404 | Properties props = new Properties(); | 354 | Properties props = new Properties(); |
405 | 355 | ||
406 | while (iterator.hasNext()) { | 356 | while (iterator.hasNext()) { |
407 | String fullKey = iterator.next(); | 357 | String fullKey = iterator.next(); |
408 | - String prefix = key + "."; | 358 | + String prefix = key.toString() + "."; |
409 | String unprefixedKey = fullKey.substring(prefix.length()); | 359 | String unprefixedKey = fullKey.substring(prefix.length()); |
410 | props.put(unprefixedKey, config.getString(fullKey)); | 360 | props.put(unprefixedKey, config.getString(fullKey)); |
411 | } | 361 | } |
@@ -470,4 +420,61 @@ public class ConfigurationLoader implements Serializable { | @@ -470,4 +420,61 @@ public class ConfigurationLoader implements Serializable { | ||
470 | 420 | ||
471 | return bootstrap; | 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 | } |