Commit f0bc674e8ebc767fcab08c7a1924dec451e9a11e

Authored by Cleverson Sacramento
1 parent 8937b13e
Exists in master

Tratando ambiguidade dos extratores de configuração

impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationArrayValueExtractor.java
... ... @@ -36,17 +36,20 @@
36 36 */
37 37 package br.gov.frameworkdemoiselle.internal.configuration;
38 38  
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
39 41 import java.lang.reflect.Field;
40 42  
41 43 import org.apache.commons.configuration.DataConfiguration;
42 44  
  45 +import br.gov.frameworkdemoiselle.annotation.Priority;
43 46 import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
44 47  
  48 +@Priority(EXTENSIONS_L1_PRIORITY)
45 49 public class ConfigurationArrayValueExtractor implements ConfigurationValueExtractor {
46 50  
47 51 @Override
48   - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration,
49   - Object defaultValue) {
  52 + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) {
50 53 return configuration.getArray(field.getType().getComponentType(), prefix + key, defaultValue);
51 54 }
52 55  
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationClassValueExtractor.java
... ... @@ -36,19 +36,22 @@
36 36 */
37 37 package br.gov.frameworkdemoiselle.internal.configuration;
38 38  
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
39 41 import java.lang.reflect.Field;
40 42  
41 43 import org.apache.commons.configuration.DataConfiguration;
42 44  
  45 +import br.gov.frameworkdemoiselle.annotation.Priority;
43 46 import br.gov.frameworkdemoiselle.configuration.ConfigurationException;
44 47 import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
45 48 import br.gov.frameworkdemoiselle.util.Reflections;
46 49  
  50 +@Priority(EXTENSIONS_L1_PRIORITY)
47 51 public class ConfigurationClassValueExtractor implements ConfigurationValueExtractor {
48 52  
49 53 @Override
50   - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration,
51   - Object defaultValue) {
  54 + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) {
52 55 Object value = defaultValue;
53 56 String canonicalName = configuration.getString(prefix + key);
54 57  
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java
... ... @@ -41,8 +41,9 @@ import static br.gov.frameworkdemoiselle.configuration.ConfigType.SYSTEM;
41 41  
42 42 import java.io.Serializable;
43 43 import java.lang.reflect.Field;
44   -import java.util.ArrayList;
45   -import java.util.List;
  44 +import java.util.Collection;
  45 +import java.util.HashSet;
  46 +import java.util.Set;
46 47  
47 48 import javax.inject.Inject;
48 49 import javax.validation.constraints.NotNull;
... ... @@ -61,6 +62,7 @@ import br.gov.frameworkdemoiselle.configuration.Configuration;
61 62 import br.gov.frameworkdemoiselle.configuration.ConfigurationException;
62 63 import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
63 64 import br.gov.frameworkdemoiselle.internal.bootstrap.ConfigurationBootstrap;
  65 +import br.gov.frameworkdemoiselle.internal.implementation.StrategySelector;
64 66 import br.gov.frameworkdemoiselle.util.Beans;
65 67 import br.gov.frameworkdemoiselle.util.Reflections;
66 68  
... ... @@ -84,9 +86,9 @@ public class ConfigurationLoader implements Serializable {
84 86  
85 87 private DataConfiguration configuration;
86 88  
87   - private List<Field> fields;
  89 + private Set<Field> fields;
88 90  
89   - private List<ConfigurationValueExtractor> extractors;
  91 + private Set<ConfigurationValueExtractor> extractors;
90 92  
91 93 @Inject
92 94 private ConfigurationBootstrap bootstrap;
... ... @@ -165,7 +167,7 @@ public class ConfigurationLoader implements Serializable {
165 167 }
166 168  
167 169 private void loadExtractors() {
168   - this.extractors = new ArrayList<ConfigurationValueExtractor>();
  170 + this.extractors = new HashSet<ConfigurationValueExtractor>();
169 171  
170 172 for (Class<? extends ConfigurationValueExtractor> extractorClass : this.bootstrap.getCache()) {
171 173 this.extractors.add(Beans.getReference(extractorClass));
... ... @@ -191,9 +193,9 @@ public class ConfigurationLoader implements Serializable {
191 193 }
192 194 }
193 195  
194   - private List<Field> getFields() {
  196 + private Set<Field> getFields() {
195 197 if (this.fields == null) {
196   - this.fields = Reflections.getNonStaticFields(this.object.getClass());
  198 + this.fields = new HashSet<Field>(Reflections.getNonStaticFields(this.object.getClass()));
197 199 }
198 200  
199 201 return this.fields;
... ... @@ -211,16 +213,23 @@ public class ConfigurationLoader implements Serializable {
211 213 }
212 214  
213 215 private Object getValue(Field field, Class<?> type, String key, Object defaultValue) {
214   - Object value = null;
  216 + Collection<ConfigurationValueExtractor> candidates = new HashSet<ConfigurationValueExtractor>();
215 217  
216 218 for (ConfigurationValueExtractor extractor : this.extractors) {
217 219 if (extractor.isSupported(field)) {
218   - value = extractor.getValue(this.prefix, key, field, configuration, defaultValue);
219   - break;
  220 + candidates.add(extractor);
220 221 }
221 222 }
222 223  
223   - return value;
  224 + ConfigurationValueExtractor elected = StrategySelector.getInstance(ConfigurationValueExtractor.class,
  225 + candidates);
  226 +
  227 + if (elected == null) {
  228 + // TODO lançar exceção informando que nenhum extrator foi encontrado para o field e ensinar como implementar
  229 + // um extrator personalizado.
  230 + }
  231 +
  232 + return elected.getValue(this.prefix, key, field, configuration, defaultValue);
224 233 }
225 234  
226 235 private String getKey(Field field) {
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationMapValueExtractor.java
... ... @@ -36,6 +36,8 @@
36 36 */
37 37 package br.gov.frameworkdemoiselle.internal.configuration;
38 38  
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
39 41 import java.lang.reflect.Field;
40 42 import java.util.HashMap;
41 43 import java.util.Iterator;
... ... @@ -45,13 +47,14 @@ import java.util.regex.Pattern;
45 47  
46 48 import org.apache.commons.configuration.DataConfiguration;
47 49  
  50 +import br.gov.frameworkdemoiselle.annotation.Priority;
48 51 import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
49 52  
  53 +@Priority(EXTENSIONS_L1_PRIORITY)
50 54 public class ConfigurationMapValueExtractor implements ConfigurationValueExtractor {
51 55  
52 56 @Override
53   - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration,
54   - Object defaultValue) {
  57 + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) {
55 58 @SuppressWarnings("unchecked")
56 59 Map<String, Object> value = (Map<String, Object>) defaultValue;
57 60  
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationPrimitiveOrWrapperValueExtractor.java
... ... @@ -36,6 +36,8 @@
36 36 */
37 37 package br.gov.frameworkdemoiselle.internal.configuration;
38 38  
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
39 41 import java.lang.reflect.Field;
40 42 import java.util.HashSet;
41 43 import java.util.Set;
... ... @@ -44,8 +46,10 @@ import org.apache.commons.configuration.ConversionException;
44 46 import org.apache.commons.configuration.DataConfiguration;
45 47 import org.apache.commons.lang.ClassUtils;
46 48  
  49 +import br.gov.frameworkdemoiselle.annotation.Priority;
47 50 import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
48 51  
  52 +@Priority(EXTENSIONS_L1_PRIORITY)
49 53 public class ConfigurationPrimitiveOrWrapperValueExtractor implements ConfigurationValueExtractor {
50 54  
51 55 private static final Set<Object> wrappers = new HashSet<Object>();
... ... @@ -64,8 +68,7 @@ public class ConfigurationPrimitiveOrWrapperValueExtractor implements Configurat
64 68  
65 69 @Override
66 70 @SuppressWarnings("unchecked")
67   - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration,
68   - Object defaultValue) {
  71 + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) {
69 72 Object value;
70 73  
71 74 try {
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationStringValueExtractor.java
... ... @@ -36,17 +36,20 @@
36 36 */
37 37 package br.gov.frameworkdemoiselle.internal.configuration;
38 38  
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
39 41 import java.lang.reflect.Field;
40 42  
41 43 import org.apache.commons.configuration.DataConfiguration;
42 44  
  45 +import br.gov.frameworkdemoiselle.annotation.Priority;
43 46 import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
44 47  
  48 +@Priority(EXTENSIONS_L1_PRIORITY)
45 49 public class ConfigurationStringValueExtractor implements ConfigurationValueExtractor {
46 50  
47 51 @Override
48   - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration,
49   - Object defaultValue) {
  52 + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) {
50 53 return configuration.getString(prefix + key, (String) defaultValue);
51 54 }
52 55  
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java
... ... @@ -40,7 +40,10 @@ import static br.gov.frameworkdemoiselle.annotation.Priority.MIN_PRIORITY;
40 40  
41 41 import java.io.Serializable;
42 42 import java.util.ArrayList;
  43 +import java.util.Collection;
  44 +import java.util.HashMap;
43 45 import java.util.List;
  46 +import java.util.Map;
44 47  
45 48 import br.gov.frameworkdemoiselle.annotation.Priority;
46 49 import br.gov.frameworkdemoiselle.configuration.ConfigurationException;
... ... @@ -72,7 +75,22 @@ public final class StrategySelector implements Serializable {
72 75 return bundle;
73 76 }
74 77  
75   - public static <T> Class<? extends T> getClass(Class<T> type, List<Class<? extends T>> options)
  78 + @SuppressWarnings("unchecked")
  79 + public static <T> T getInstance(Class<T> type, Collection<? extends T> options) throws ConfigurationException {
  80 +
  81 + Map<Class<? extends T>, T> map = new HashMap<Class<? extends T>, T>();
  82 +
  83 + for (T instance : options) {
  84 + if (instance != null) {
  85 + map.put((Class<T>) instance.getClass(), instance);
  86 + }
  87 + }
  88 +
  89 + Class<? extends T> elected = getClass(type, map.keySet());
  90 + return map.get(elected);
  91 + }
  92 +
  93 + public static <T> Class<? extends T> getClass(Class<T> type, Collection<Class<? extends T>> options)
76 94 throws ConfigurationException {
77 95 Class<? extends T> selected = null;
78 96  
... ... @@ -88,7 +106,7 @@ public final class StrategySelector implements Serializable {
88 106 }
89 107  
90 108 private static <T> void checkForAmbiguity(Class<T> type, Class<? extends T> selected,
91   - List<Class<? extends T>> options) throws ConfigurationException {
  109 + Collection<Class<? extends T>> options) throws ConfigurationException {
92 110 int selectedPriority = getPriority(selected);
93 111  
94 112 List<Class<? extends T>> ambiguous = new ArrayList<Class<? extends T>>();
... ...