diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationArrayValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationArrayValueExtractor.java index 06d7904..94bc3c2 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationArrayValueExtractor.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationArrayValueExtractor.java @@ -36,17 +36,20 @@ */ package br.gov.frameworkdemoiselle.internal.configuration; +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + import java.lang.reflect.Field; import org.apache.commons.configuration.DataConfiguration; +import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor; +@Priority(EXTENSIONS_L1_PRIORITY) public class ConfigurationArrayValueExtractor implements ConfigurationValueExtractor { @Override - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, - Object defaultValue) { + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) { return configuration.getArray(field.getType().getComponentType(), prefix + key, defaultValue); } diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationClassValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationClassValueExtractor.java index 171d07b..957e3b1 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationClassValueExtractor.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationClassValueExtractor.java @@ -36,19 +36,22 @@ */ package br.gov.frameworkdemoiselle.internal.configuration; +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + import java.lang.reflect.Field; import org.apache.commons.configuration.DataConfiguration; +import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.configuration.ConfigurationException; import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor; import br.gov.frameworkdemoiselle.util.Reflections; +@Priority(EXTENSIONS_L1_PRIORITY) public class ConfigurationClassValueExtractor implements ConfigurationValueExtractor { @Override - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, - Object defaultValue) { + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) { Object value = defaultValue; String canonicalName = configuration.getString(prefix + key); diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java index aa67281..c5b4d30 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java @@ -41,8 +41,9 @@ import static br.gov.frameworkdemoiselle.configuration.ConfigType.SYSTEM; import java.io.Serializable; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import javax.inject.Inject; import javax.validation.constraints.NotNull; @@ -61,6 +62,7 @@ import br.gov.frameworkdemoiselle.configuration.Configuration; import br.gov.frameworkdemoiselle.configuration.ConfigurationException; import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor; import br.gov.frameworkdemoiselle.internal.bootstrap.ConfigurationBootstrap; +import br.gov.frameworkdemoiselle.internal.implementation.StrategySelector; import br.gov.frameworkdemoiselle.util.Beans; import br.gov.frameworkdemoiselle.util.Reflections; @@ -84,9 +86,9 @@ public class ConfigurationLoader implements Serializable { private DataConfiguration configuration; - private List fields; + private Set fields; - private List extractors; + private Set extractors; @Inject private ConfigurationBootstrap bootstrap; @@ -165,7 +167,7 @@ public class ConfigurationLoader implements Serializable { } private void loadExtractors() { - this.extractors = new ArrayList(); + this.extractors = new HashSet(); for (Class extractorClass : this.bootstrap.getCache()) { this.extractors.add(Beans.getReference(extractorClass)); @@ -191,9 +193,9 @@ public class ConfigurationLoader implements Serializable { } } - private List getFields() { + private Set getFields() { if (this.fields == null) { - this.fields = Reflections.getNonStaticFields(this.object.getClass()); + this.fields = new HashSet(Reflections.getNonStaticFields(this.object.getClass())); } return this.fields; @@ -211,16 +213,23 @@ public class ConfigurationLoader implements Serializable { } private Object getValue(Field field, Class type, String key, Object defaultValue) { - Object value = null; + Collection candidates = new HashSet(); for (ConfigurationValueExtractor extractor : this.extractors) { if (extractor.isSupported(field)) { - value = extractor.getValue(this.prefix, key, field, configuration, defaultValue); - break; + candidates.add(extractor); } } - return value; + ConfigurationValueExtractor elected = StrategySelector.getInstance(ConfigurationValueExtractor.class, + candidates); + + if (elected == null) { + // TODO lançar exceção informando que nenhum extrator foi encontrado para o field e ensinar como implementar + // um extrator personalizado. + } + + return elected.getValue(this.prefix, key, field, configuration, defaultValue); } private String getKey(Field field) { diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationMapValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationMapValueExtractor.java index ae8bfcb..0fae16d 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationMapValueExtractor.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationMapValueExtractor.java @@ -36,6 +36,8 @@ */ package br.gov.frameworkdemoiselle.internal.configuration; +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + import java.lang.reflect.Field; import java.util.HashMap; import java.util.Iterator; @@ -45,13 +47,14 @@ import java.util.regex.Pattern; import org.apache.commons.configuration.DataConfiguration; +import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor; +@Priority(EXTENSIONS_L1_PRIORITY) public class ConfigurationMapValueExtractor implements ConfigurationValueExtractor { @Override - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, - Object defaultValue) { + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) { @SuppressWarnings("unchecked") Map value = (Map) defaultValue; diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationPrimitiveOrWrapperValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationPrimitiveOrWrapperValueExtractor.java index da7a135..17871cf 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationPrimitiveOrWrapperValueExtractor.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationPrimitiveOrWrapperValueExtractor.java @@ -36,6 +36,8 @@ */ package br.gov.frameworkdemoiselle.internal.configuration; +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; @@ -44,8 +46,10 @@ import org.apache.commons.configuration.ConversionException; import org.apache.commons.configuration.DataConfiguration; import org.apache.commons.lang.ClassUtils; +import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor; +@Priority(EXTENSIONS_L1_PRIORITY) public class ConfigurationPrimitiveOrWrapperValueExtractor implements ConfigurationValueExtractor { private static final Set wrappers = new HashSet(); @@ -64,8 +68,7 @@ public class ConfigurationPrimitiveOrWrapperValueExtractor implements Configurat @Override @SuppressWarnings("unchecked") - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, - Object defaultValue) { + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) { Object value; try { diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationStringValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationStringValueExtractor.java index 4842a7e..2b27f56 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationStringValueExtractor.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationStringValueExtractor.java @@ -36,17 +36,20 @@ */ package br.gov.frameworkdemoiselle.internal.configuration; +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + import java.lang.reflect.Field; import org.apache.commons.configuration.DataConfiguration; +import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor; +@Priority(EXTENSIONS_L1_PRIORITY) public class ConfigurationStringValueExtractor implements ConfigurationValueExtractor { @Override - public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, - Object defaultValue) { + public Object getValue(String prefix, String key, Field field, DataConfiguration configuration, Object defaultValue) { return configuration.getString(prefix + key, (String) defaultValue); } diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java index e6a35d2..67b2ed8 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java +++ b/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; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.configuration.ConfigurationException; @@ -72,7 +75,22 @@ public final class StrategySelector implements Serializable { return bundle; } - public static Class getClass(Class type, List> options) + @SuppressWarnings("unchecked") + public static T getInstance(Class type, Collection options) throws ConfigurationException { + + Map, T> map = new HashMap, T>(); + + for (T instance : options) { + if (instance != null) { + map.put((Class) instance.getClass(), instance); + } + } + + Class elected = getClass(type, map.keySet()); + return map.get(elected); + } + + public static Class getClass(Class type, Collection> options) throws ConfigurationException { Class selected = null; @@ -88,7 +106,7 @@ public final class StrategySelector implements Serializable { } private static void checkForAmbiguity(Class type, Class selected, - List> options) throws ConfigurationException { + Collection> options) throws ConfigurationException { int selectedPriority = getPriority(selected); List> ambiguous = new ArrayList>(); -- libgit2 0.21.2