Commit fc7a84cc0f8b0d21fc80ea476cffacbd8018da27

Authored by Cleverson Sacramento
1 parent 0c9ec847
Exists in master

Movendo as classes de carregamento de configuração para o pacote

correto
Showing 15 changed files with 633 additions and 637 deletions   Show diff stats
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationArrayValueExtractor.java
@@ -1,62 +0,0 @@ @@ -1,62 +0,0 @@
1 -/*  
2 - * Demoiselle Framework  
3 - * Copyright (C) 2010 SERPRO  
4 - * ----------------------------------------------------------------------------  
5 - * This file is part of Demoiselle Framework.  
6 - *  
7 - * Demoiselle Framework is free software; you can redistribute it and/or  
8 - * modify it under the terms of the GNU Lesser General Public License version 3  
9 - * as published by the Free Software Foundation.  
10 - *  
11 - * This program is distributed in the hope that it will be useful,  
12 - * but WITHOUT ANY WARRANTY; without even the implied warranty of  
13 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
14 - * GNU General Public License for more details.  
15 - *  
16 - * You should have received a copy of the GNU Lesser General Public License version 3  
17 - * along with this program; if not, see <http://www.gnu.org/licenses/>  
18 - * or write to the Free Software Foundation, Inc., 51 Franklin Street,  
19 - * Fifth Floor, Boston, MA 02110-1301, USA.  
20 - * ----------------------------------------------------------------------------  
21 - * Este arquivo é parte do Framework Demoiselle.  
22 - *  
23 - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou  
24 - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação  
25 - * do Software Livre (FSF).  
26 - *  
27 - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA  
28 - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou  
29 - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português  
30 - * para maiores detalhes.  
31 - *  
32 - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título  
33 - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>  
34 - * ou escreva para a Fundação do Software Livre (FSF) Inc.,  
35 - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.  
36 - */  
37 -package br.gov.frameworkdemoiselle.internal.configuration;  
38 -  
39 -import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;  
40 -  
41 -import java.lang.reflect.Field;  
42 -  
43 -import org.apache.commons.configuration.Configuration;  
44 -import org.apache.commons.configuration.DataConfiguration;  
45 -  
46 -import br.gov.frameworkdemoiselle.annotation.Priority;  
47 -import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;  
48 -  
49 -@Priority(EXTENSIONS_L1_PRIORITY)  
50 -public class ConfigurationArrayValueExtractor implements ConfigurationValueExtractor {  
51 -  
52 - @Override  
53 - public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {  
54 - return new DataConfiguration(configuration).getArray(field.getType().getComponentType(), prefix + key,  
55 - defaultValue);  
56 - }  
57 -  
58 - @Override  
59 - public boolean isSupported(Field field) {  
60 - return field.getType().isArray();  
61 - }  
62 -}  
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationClassValueExtractor.java
@@ -1,76 +0,0 @@ @@ -1,76 +0,0 @@
1 -/*  
2 - * Demoiselle Framework  
3 - * Copyright (C) 2010 SERPRO  
4 - * ----------------------------------------------------------------------------  
5 - * This file is part of Demoiselle Framework.  
6 - *  
7 - * Demoiselle Framework is free software; you can redistribute it and/or  
8 - * modify it under the terms of the GNU Lesser General Public License version 3  
9 - * as published by the Free Software Foundation.  
10 - *  
11 - * This program is distributed in the hope that it will be useful,  
12 - * but WITHOUT ANY WARRANTY; without even the implied warranty of  
13 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
14 - * GNU General Public License for more details.  
15 - *  
16 - * You should have received a copy of the GNU Lesser General Public License version 3  
17 - * along with this program; if not, see <http://www.gnu.org/licenses/>  
18 - * or write to the Free Software Foundation, Inc., 51 Franklin Street,  
19 - * Fifth Floor, Boston, MA 02110-1301, USA.  
20 - * ----------------------------------------------------------------------------  
21 - * Este arquivo é parte do Framework Demoiselle.  
22 - *  
23 - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou  
24 - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação  
25 - * do Software Livre (FSF).  
26 - *  
27 - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA  
28 - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou  
29 - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português  
30 - * para maiores detalhes.  
31 - *  
32 - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título  
33 - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>  
34 - * ou escreva para a Fundação do Software Livre (FSF) Inc.,  
35 - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.  
36 - */  
37 -package br.gov.frameworkdemoiselle.internal.configuration;  
38 -  
39 -import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;  
40 -  
41 -import java.lang.reflect.Field;  
42 -  
43 -import org.apache.commons.configuration.Configuration;  
44 -  
45 -import br.gov.frameworkdemoiselle.annotation.Priority;  
46 -import br.gov.frameworkdemoiselle.configuration.ConfigurationException;  
47 -import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;  
48 -import br.gov.frameworkdemoiselle.util.Reflections;  
49 -  
50 -@Priority(EXTENSIONS_L1_PRIORITY)  
51 -public class ConfigurationClassValueExtractor implements ConfigurationValueExtractor {  
52 -  
53 - @Override  
54 - public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {  
55 - Object value = defaultValue;  
56 - String canonicalName = configuration.getString(prefix + key);  
57 -  
58 - if (canonicalName != null) {  
59 - ClassLoader classLoader = Reflections.getClassLoaderForClass(canonicalName);  
60 -  
61 - try {  
62 - value = Class.forName(canonicalName, true, classLoader);  
63 - } catch (ClassNotFoundException cause) {  
64 - // TODO Lançar a mensagem correta  
65 - throw new ConfigurationException(null, cause);  
66 - }  
67 - }  
68 -  
69 - return value;  
70 - }  
71 -  
72 - @Override  
73 - public boolean isSupported(Field field) {  
74 - return field.getType() == Class.class;  
75 - }  
76 -}  
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java
@@ -1,251 +0,0 @@ @@ -1,251 +0,0 @@
1 -/*  
2 -/*  
3 - * Demoiselle Framework  
4 - * Copyright (C) 2010 SERPRO  
5 - * ----------------------------------------------------------------------------  
6 - * This file is part of Demoiselle Framework.  
7 - *  
8 - * Demoiselle Framework is free software; you can redistribute it and/or  
9 - * modify it under the terms of the GNU Lesser General Public License version 3  
10 - * as published by the Free Software Foundation.  
11 - *  
12 - * This program is distributed in the hope that it will be useful,  
13 - * but WITHOUT ANY WARRANTY; without even the implied warranty of  
14 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
15 - * GNU General Public License for more details.  
16 - *  
17 - * You should have received a copy of the GNU Lesser General Public License version 3  
18 - * along with this program; if not, see <http://www.gnu.org/licenses/>  
19 - * or write to the Free Software Foundation, Inc., 51 Franklin Street,  
20 - * Fifth Floor, Boston, MA 02110-1301, USA.  
21 - * ----------------------------------------------------------------------------  
22 - * Este arquivo é parte do Framework Demoiselle.  
23 - *  
24 - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou  
25 - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação  
26 - * do Software Livre (FSF).  
27 - *  
28 - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA  
29 - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou  
30 - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português  
31 - * para maiores detalhes.  
32 - *  
33 - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título  
34 - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>  
35 - * ou escreva para a Fundação do Software Livre (FSF) Inc.,  
36 - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.  
37 - */  
38 -package br.gov.frameworkdemoiselle.internal.configuration;  
39 -  
40 -import static br.gov.frameworkdemoiselle.configuration.ConfigType.SYSTEM;  
41 -  
42 -import java.io.Serializable;  
43 -import java.lang.reflect.Field;  
44 -import java.util.Collection;  
45 -import java.util.HashSet;  
46 -  
47 -import javax.validation.constraints.NotNull;  
48 -  
49 -import org.apache.commons.configuration.AbstractConfiguration;  
50 -import org.apache.commons.configuration.FileConfiguration;  
51 -import org.apache.commons.configuration.PropertiesConfiguration;  
52 -import org.apache.commons.configuration.SystemConfiguration;  
53 -import org.apache.commons.configuration.XMLConfiguration;  
54 -  
55 -import br.gov.frameworkdemoiselle.annotation.Ignore;  
56 -import br.gov.frameworkdemoiselle.annotation.Name;  
57 -import br.gov.frameworkdemoiselle.configuration.ConfigType;  
58 -import br.gov.frameworkdemoiselle.configuration.Configuration;  
59 -import br.gov.frameworkdemoiselle.configuration.ConfigurationException;  
60 -import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;  
61 -import br.gov.frameworkdemoiselle.internal.bootstrap.ConfigurationBootstrap;  
62 -import br.gov.frameworkdemoiselle.internal.implementation.StrategySelector;  
63 -import br.gov.frameworkdemoiselle.util.Beans;  
64 -import br.gov.frameworkdemoiselle.util.Reflections;  
65 -  
66 -/**  
67 - * This component loads a config class annotated with {@link Configuration} by filling its attributes with {@link Param}  
68 - * according to a {@link ConfigType}.  
69 - *  
70 - * @author SERPRO  
71 - */  
72 -public class ConfigurationLoader implements Serializable {  
73 -  
74 - private static final long serialVersionUID = 1L;  
75 -  
76 - private Object object;  
77 -  
78 - private ConfigType type;  
79 -  
80 - private String resource;  
81 -  
82 - private String prefix;  
83 -  
84 - private org.apache.commons.configuration.Configuration configuration;  
85 -  
86 - private Collection<Field> fields;  
87 -  
88 - public void load(Object object) throws ConfigurationException {  
89 - this.object = object;  
90 -  
91 - loadFields();  
92 - validateFields();  
93 -  
94 - loadType();  
95 - loadResource();  
96 - loadConfiguration();  
97 -  
98 - if (this.configuration != null) {  
99 - loadPrefix();  
100 - loadValues();  
101 - }  
102 -  
103 - validateValues();  
104 - }  
105 -  
106 - private void loadFields() {  
107 - this.fields = Reflections.getNonStaticFields(this.object.getClass());  
108 - }  
109 -  
110 - private void validateFields() {  
111 - for (Field field : this.fields) {  
112 - validateField(field);  
113 - }  
114 - }  
115 -  
116 - private void validateField(Field field) {  
117 - }  
118 -  
119 - private void loadType() {  
120 - this.type = object.getClass().getAnnotation(Configuration.class).type();  
121 - }  
122 -  
123 - private void loadResource() {  
124 - if (this.type != SYSTEM) {  
125 - String name = this.object.getClass().getAnnotation(Configuration.class).resource();  
126 - String extension = this.type.toString().toLowerCase();  
127 -  
128 - this.resource = name + "." + extension;  
129 - }  
130 - }  
131 -  
132 - private void loadConfiguration() {  
133 - AbstractConfiguration conf;  
134 -  
135 - switch (this.type) {  
136 - case SYSTEM:  
137 - conf = new SystemConfiguration();  
138 - break;  
139 -  
140 - case XML:  
141 - conf = new XMLConfiguration();  
142 - break;  
143 -  
144 - default:  
145 - conf = new PropertiesConfiguration();  
146 - break;  
147 - }  
148 -  
149 - conf.setDelimiterParsingDisabled(true);  
150 -  
151 - if (conf instanceof FileConfiguration) {  
152 - ((FileConfiguration) conf).setURL(Reflections.getResourceAsURL(this.resource));  
153 -  
154 - try {  
155 - ((FileConfiguration) conf).load();  
156 -  
157 - } catch (org.apache.commons.configuration.ConfigurationException cause) {  
158 - conf = null;  
159 - }  
160 - }  
161 -  
162 - this.configuration = conf;  
163 - }  
164 -  
165 - private void loadPrefix() {  
166 - String prefix = this.object.getClass().getAnnotation(Configuration.class).prefix();  
167 -  
168 - if (prefix.endsWith(".")) {  
169 - // prefix = prefix.substring(0, prefix.length() - 1);  
170 - // TODO Lançar warning pedindo para retirar o ponto (.)?  
171 - } else if (!prefix.isEmpty()) {  
172 - prefix += ".";  
173 - }  
174 -  
175 - this.prefix = prefix;  
176 - }  
177 -  
178 - private void loadValues() {  
179 - for (Field field : this.fields) {  
180 - loadValue(field);  
181 - }  
182 - }  
183 -  
184 - private void loadValue(Field field) {  
185 - if (hasIgnore(field)) {  
186 - return;  
187 - }  
188 -  
189 - Object defaultValue = Reflections.getFieldValue(field, this.object);  
190 - Object finalValue = getValue(field, field.getType(), getKey(field), defaultValue);  
191 -  
192 - Reflections.setFieldValue(field, this.object, finalValue);  
193 - }  
194 -  
195 - private Object getValue(Field field, Class<?> type, String key, Object defaultValue) {  
196 - ConfigurationValueExtractor extractor = getValueExtractor(field);  
197 - return extractor.getValue(this.prefix, key, field, this.configuration, defaultValue);  
198 - }  
199 -  
200 - private ConfigurationValueExtractor getValueExtractor(Field field) {  
201 - Collection<ConfigurationValueExtractor> candidates = new HashSet<ConfigurationValueExtractor>();  
202 - ConfigurationBootstrap bootstrap = Beans.getReference(ConfigurationBootstrap.class);  
203 -  
204 - for (Class<? extends ConfigurationValueExtractor> extractorClass : bootstrap.getCache()) {  
205 - ConfigurationValueExtractor extractor = Beans.getReference(extractorClass);  
206 -  
207 - if (extractor.isSupported(field)) {  
208 - candidates.add(extractor);  
209 - }  
210 - }  
211 -  
212 - ConfigurationValueExtractor elected = StrategySelector.getInstance(ConfigurationValueExtractor.class,  
213 - candidates);  
214 -  
215 - if (elected == null) {  
216 - // TODO lançar exceção informando que nenhum extrator foi encontrado para o field e ensinar como implementar  
217 - // um extrator personalizado.  
218 - }  
219 -  
220 - return elected;  
221 - }  
222 -  
223 - private String getKey(Field field) {  
224 - String key = "";  
225 -  
226 - if (field.isAnnotationPresent(Name.class)) {  
227 - key += field.getAnnotation(Name.class).value();  
228 - } else {  
229 - key += field.getName();  
230 - }  
231 -  
232 - return key;  
233 - }  
234 -  
235 - private boolean hasIgnore(Field field) {  
236 - return field.isAnnotationPresent(Ignore.class);  
237 - }  
238 -  
239 - private void validateValues() {  
240 - for (Field field : this.fields) {  
241 - validateValue(field);  
242 - }  
243 - }  
244 -  
245 - private void validateValue(Field field) {  
246 - if (field.isAnnotationPresent(NotNull.class) && Reflections.getFieldValue(field, this.object) == null) {  
247 - throw new ConfigurationException("", new NullPointerException());  
248 - // TODO: Pegar mensagem do Bundle e verificar como as mensagens de log estão implementadas  
249 - }  
250 - }  
251 -}  
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationMapValueExtractor.java
@@ -1,88 +0,0 @@ @@ -1,88 +0,0 @@
1 -/*  
2 - * Demoiselle Framework  
3 - * Copyright (C) 2010 SERPRO  
4 - * ----------------------------------------------------------------------------  
5 - * This file is part of Demoiselle Framework.  
6 - *  
7 - * Demoiselle Framework is free software; you can redistribute it and/or  
8 - * modify it under the terms of the GNU Lesser General Public License version 3  
9 - * as published by the Free Software Foundation.  
10 - *  
11 - * This program is distributed in the hope that it will be useful,  
12 - * but WITHOUT ANY WARRANTY; without even the implied warranty of  
13 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
14 - * GNU General Public License for more details.  
15 - *  
16 - * You should have received a copy of the GNU Lesser General Public License version 3  
17 - * along with this program; if not, see <http://www.gnu.org/licenses/>  
18 - * or write to the Free Software Foundation, Inc., 51 Franklin Street,  
19 - * Fifth Floor, Boston, MA 02110-1301, USA.  
20 - * ----------------------------------------------------------------------------  
21 - * Este arquivo é parte do Framework Demoiselle.  
22 - *  
23 - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou  
24 - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação  
25 - * do Software Livre (FSF).  
26 - *  
27 - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA  
28 - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou  
29 - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português  
30 - * para maiores detalhes.  
31 - *  
32 - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título  
33 - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>  
34 - * ou escreva para a Fundação do Software Livre (FSF) Inc.,  
35 - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.  
36 - */  
37 -package br.gov.frameworkdemoiselle.internal.configuration;  
38 -  
39 -import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;  
40 -  
41 -import java.lang.reflect.Field;  
42 -import java.util.HashMap;  
43 -import java.util.Iterator;  
44 -import java.util.Map;  
45 -import java.util.regex.Matcher;  
46 -import java.util.regex.Pattern;  
47 -  
48 -import org.apache.commons.configuration.Configuration;  
49 -  
50 -import br.gov.frameworkdemoiselle.annotation.Priority;  
51 -import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;  
52 -  
53 -@Priority(EXTENSIONS_L1_PRIORITY)  
54 -public class ConfigurationMapValueExtractor implements ConfigurationValueExtractor {  
55 -  
56 - @Override  
57 - public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {  
58 - @SuppressWarnings("unchecked")  
59 - Map<String, Object> value = (Map<String, Object>) defaultValue;  
60 -  
61 - String regexp = "^(" + prefix + ")((.+)\\.)?(" + key + ")$";  
62 - Pattern pattern = Pattern.compile(regexp);  
63 -  
64 - for (Iterator<String> iter = configuration.getKeys(); iter.hasNext();) {  
65 - String iterKey = iter.next();  
66 - Matcher matcher = pattern.matcher(iterKey);  
67 -  
68 - if (matcher.matches()) {  
69 - String confKey = matcher.group(1) + (matcher.group(2) == null ? "" : matcher.group(2))  
70 - + matcher.group(4);  
71 -  
72 - if (value == null) {  
73 - value = new HashMap<String, Object>();  
74 - }  
75 -  
76 - String mapKey = matcher.group(3) == null ? "default" : matcher.group(3);  
77 - value.put(mapKey, configuration.getString(confKey));  
78 - }  
79 - }  
80 -  
81 - return value;  
82 - }  
83 -  
84 - @Override  
85 - public boolean isSupported(Field field) {  
86 - return field.getType() == Map.class;  
87 - }  
88 -}  
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationPrimitiveOrWrapperValueExtractor.java
@@ -1,89 +0,0 @@ @@ -1,89 +0,0 @@
1 -/*  
2 - * Demoiselle Framework  
3 - * Copyright (C) 2010 SERPRO  
4 - * ----------------------------------------------------------------------------  
5 - * This file is part of Demoiselle Framework.  
6 - *  
7 - * Demoiselle Framework is free software; you can redistribute it and/or  
8 - * modify it under the terms of the GNU Lesser General Public License version 3  
9 - * as published by the Free Software Foundation.  
10 - *  
11 - * This program is distributed in the hope that it will be useful,  
12 - * but WITHOUT ANY WARRANTY; without even the implied warranty of  
13 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
14 - * GNU General Public License for more details.  
15 - *  
16 - * You should have received a copy of the GNU Lesser General Public License version 3  
17 - * along with this program; if not, see <http://www.gnu.org/licenses/>  
18 - * or write to the Free Software Foundation, Inc., 51 Franklin Street,  
19 - * Fifth Floor, Boston, MA 02110-1301, USA.  
20 - * ----------------------------------------------------------------------------  
21 - * Este arquivo é parte do Framework Demoiselle.  
22 - *  
23 - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou  
24 - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação  
25 - * do Software Livre (FSF).  
26 - *  
27 - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA  
28 - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou  
29 - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português  
30 - * para maiores detalhes.  
31 - *  
32 - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título  
33 - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>  
34 - * ou escreva para a Fundação do Software Livre (FSF) Inc.,  
35 - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.  
36 - */  
37 -package br.gov.frameworkdemoiselle.internal.configuration;  
38 -  
39 -import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;  
40 -  
41 -import java.lang.reflect.Field;  
42 -import java.util.HashSet;  
43 -import java.util.Set;  
44 -  
45 -import org.apache.commons.configuration.Configuration;  
46 -import org.apache.commons.configuration.ConversionException;  
47 -import org.apache.commons.configuration.DataConfiguration;  
48 -import org.apache.commons.lang.ClassUtils;  
49 -  
50 -import br.gov.frameworkdemoiselle.annotation.Priority;  
51 -import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;  
52 -  
53 -@Priority(EXTENSIONS_L1_PRIORITY)  
54 -public class ConfigurationPrimitiveOrWrapperValueExtractor implements ConfigurationValueExtractor {  
55 -  
56 - private static final Set<Object> wrappers = new HashSet<Object>();  
57 -  
58 - static {  
59 - wrappers.add(Boolean.class);  
60 - wrappers.add(Byte.class);  
61 - wrappers.add(Character.class);  
62 - wrappers.add(Short.class);  
63 - wrappers.add(Integer.class);  
64 - wrappers.add(Long.class);  
65 - wrappers.add(Double.class);  
66 - wrappers.add(Float.class);  
67 - wrappers.add(Void.TYPE);  
68 - }  
69 -  
70 - @Override  
71 - @SuppressWarnings("unchecked")  
72 - public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {  
73 - Object value;  
74 -  
75 - try {  
76 - value = new DataConfiguration(configuration).get(ClassUtils.primitiveToWrapper(field.getType()), prefix + key, defaultValue);  
77 -  
78 - } catch (ConversionException cause) {  
79 - value = defaultValue;  
80 - }  
81 -  
82 - return value;  
83 - }  
84 -  
85 - @Override  
86 - public boolean isSupported(Field field) {  
87 - return field.getType().isPrimitive() || wrappers.contains(field.getType());  
88 - }  
89 -}  
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationStringValueExtractor.java
@@ -1,60 +0,0 @@ @@ -1,60 +0,0 @@
1 -/*  
2 - * Demoiselle Framework  
3 - * Copyright (C) 2010 SERPRO  
4 - * ----------------------------------------------------------------------------  
5 - * This file is part of Demoiselle Framework.  
6 - *  
7 - * Demoiselle Framework is free software; you can redistribute it and/or  
8 - * modify it under the terms of the GNU Lesser General Public License version 3  
9 - * as published by the Free Software Foundation.  
10 - *  
11 - * This program is distributed in the hope that it will be useful,  
12 - * but WITHOUT ANY WARRANTY; without even the implied warranty of  
13 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
14 - * GNU General Public License for more details.  
15 - *  
16 - * You should have received a copy of the GNU Lesser General Public License version 3  
17 - * along with this program; if not, see <http://www.gnu.org/licenses/>  
18 - * or write to the Free Software Foundation, Inc., 51 Franklin Street,  
19 - * Fifth Floor, Boston, MA 02110-1301, USA.  
20 - * ----------------------------------------------------------------------------  
21 - * Este arquivo é parte do Framework Demoiselle.  
22 - *  
23 - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou  
24 - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação  
25 - * do Software Livre (FSF).  
26 - *  
27 - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA  
28 - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou  
29 - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português  
30 - * para maiores detalhes.  
31 - *  
32 - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título  
33 - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>  
34 - * ou escreva para a Fundação do Software Livre (FSF) Inc.,  
35 - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.  
36 - */  
37 -package br.gov.frameworkdemoiselle.internal.configuration;  
38 -  
39 -import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;  
40 -  
41 -import java.lang.reflect.Field;  
42 -  
43 -import org.apache.commons.configuration.Configuration;  
44 -  
45 -import br.gov.frameworkdemoiselle.annotation.Priority;  
46 -import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;  
47 -  
48 -@Priority(EXTENSIONS_L1_PRIORITY)  
49 -public class ConfigurationStringValueExtractor implements ConfigurationValueExtractor {  
50 -  
51 - @Override  
52 - public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {  
53 - return configuration.getString(prefix + key, (String) defaultValue);  
54 - }  
55 -  
56 - @Override  
57 - public boolean isSupported(Field field) {  
58 - return field.getType() == String.class;  
59 - }  
60 -}  
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationArrayValueExtractor.java 0 → 100644
@@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
  41 +import java.lang.reflect.Field;
  42 +
  43 +import org.apache.commons.configuration.Configuration;
  44 +import org.apache.commons.configuration.DataConfiguration;
  45 +
  46 +import br.gov.frameworkdemoiselle.annotation.Priority;
  47 +import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
  48 +
  49 +@Priority(EXTENSIONS_L1_PRIORITY)
  50 +public class ConfigurationArrayValueExtractor implements ConfigurationValueExtractor {
  51 +
  52 + @Override
  53 + public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {
  54 + return new DataConfiguration(configuration).getArray(field.getType().getComponentType(), prefix + key,
  55 + defaultValue);
  56 + }
  57 +
  58 + @Override
  59 + public boolean isSupported(Field field) {
  60 + return field.getType().isArray();
  61 + }
  62 +}
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationClassValueExtractor.java 0 → 100644
@@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
  41 +import java.lang.reflect.Field;
  42 +
  43 +import org.apache.commons.configuration.Configuration;
  44 +
  45 +import br.gov.frameworkdemoiselle.annotation.Priority;
  46 +import br.gov.frameworkdemoiselle.configuration.ConfigurationException;
  47 +import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
  48 +import br.gov.frameworkdemoiselle.util.Reflections;
  49 +
  50 +@Priority(EXTENSIONS_L1_PRIORITY)
  51 +public class ConfigurationClassValueExtractor implements ConfigurationValueExtractor {
  52 +
  53 + @Override
  54 + public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {
  55 + Object value = defaultValue;
  56 + String canonicalName = configuration.getString(prefix + key);
  57 +
  58 + if (canonicalName != null) {
  59 + ClassLoader classLoader = Reflections.getClassLoaderForClass(canonicalName);
  60 +
  61 + try {
  62 + value = Class.forName(canonicalName, true, classLoader);
  63 + } catch (ClassNotFoundException cause) {
  64 + // TODO Lançar a mensagem correta
  65 + throw new ConfigurationException(null, cause);
  66 + }
  67 + }
  68 +
  69 + return value;
  70 + }
  71 +
  72 + @Override
  73 + public boolean isSupported(Field field) {
  74 + return field.getType() == Class.class;
  75 + }
  76 +}
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationImpl.java
@@ -3,7 +3,6 @@ package br.gov.frameworkdemoiselle.internal.implementation; @@ -3,7 +3,6 @@ package br.gov.frameworkdemoiselle.internal.implementation;
3 import java.io.Serializable; 3 import java.io.Serializable;
4 4
5 import br.gov.frameworkdemoiselle.annotation.Ignore; 5 import br.gov.frameworkdemoiselle.annotation.Ignore;
6 -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader;  
7 import br.gov.frameworkdemoiselle.util.Beans; 6 import br.gov.frameworkdemoiselle.util.Beans;
8 7
9 public class ConfigurationImpl implements Serializable { 8 public class ConfigurationImpl implements Serializable {
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationLoader.java 0 → 100644
@@ -0,0 +1,250 @@ @@ -0,0 +1,250 @@
  1 +/*
  2 +/*
  3 + * Demoiselle Framework
  4 + * Copyright (C) 2010 SERPRO
  5 + * ----------------------------------------------------------------------------
  6 + * This file is part of Demoiselle Framework.
  7 + *
  8 + * Demoiselle Framework is free software; you can redistribute it and/or
  9 + * modify it under the terms of the GNU Lesser General Public License version 3
  10 + * as published by the Free Software Foundation.
  11 + *
  12 + * This program is distributed in the hope that it will be useful,
  13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 + * GNU General Public License for more details.
  16 + *
  17 + * You should have received a copy of the GNU Lesser General Public License version 3
  18 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  19 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  20 + * Fifth Floor, Boston, MA 02110-1301, USA.
  21 + * ----------------------------------------------------------------------------
  22 + * Este arquivo é parte do Framework Demoiselle.
  23 + *
  24 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  25 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  26 + * do Software Livre (FSF).
  27 + *
  28 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  29 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  30 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  31 + * para maiores detalhes.
  32 + *
  33 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  34 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  35 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  36 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  37 + */
  38 +package br.gov.frameworkdemoiselle.internal.implementation;
  39 +
  40 +import static br.gov.frameworkdemoiselle.configuration.ConfigType.SYSTEM;
  41 +
  42 +import java.io.Serializable;
  43 +import java.lang.reflect.Field;
  44 +import java.util.Collection;
  45 +import java.util.HashSet;
  46 +
  47 +import javax.validation.constraints.NotNull;
  48 +
  49 +import org.apache.commons.configuration.AbstractConfiguration;
  50 +import org.apache.commons.configuration.FileConfiguration;
  51 +import org.apache.commons.configuration.PropertiesConfiguration;
  52 +import org.apache.commons.configuration.SystemConfiguration;
  53 +import org.apache.commons.configuration.XMLConfiguration;
  54 +
  55 +import br.gov.frameworkdemoiselle.annotation.Ignore;
  56 +import br.gov.frameworkdemoiselle.annotation.Name;
  57 +import br.gov.frameworkdemoiselle.configuration.ConfigType;
  58 +import br.gov.frameworkdemoiselle.configuration.Configuration;
  59 +import br.gov.frameworkdemoiselle.configuration.ConfigurationException;
  60 +import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
  61 +import br.gov.frameworkdemoiselle.internal.bootstrap.ConfigurationBootstrap;
  62 +import br.gov.frameworkdemoiselle.util.Beans;
  63 +import br.gov.frameworkdemoiselle.util.Reflections;
  64 +
  65 +/**
  66 + * This component loads a config class annotated with {@link Configuration} by filling its attributes with {@link Param}
  67 + * according to a {@link ConfigType}.
  68 + *
  69 + * @author SERPRO
  70 + */
  71 +public class ConfigurationLoader implements Serializable {
  72 +
  73 + private static final long serialVersionUID = 1L;
  74 +
  75 + private Object object;
  76 +
  77 + private ConfigType type;
  78 +
  79 + private String resource;
  80 +
  81 + private String prefix;
  82 +
  83 + private org.apache.commons.configuration.Configuration configuration;
  84 +
  85 + private Collection<Field> fields;
  86 +
  87 + public void load(Object object) throws ConfigurationException {
  88 + this.object = object;
  89 +
  90 + loadFields();
  91 + validateFields();
  92 +
  93 + loadType();
  94 + loadResource();
  95 + loadConfiguration();
  96 +
  97 + if (this.configuration != null) {
  98 + loadPrefix();
  99 + loadValues();
  100 + }
  101 +
  102 + validateValues();
  103 + }
  104 +
  105 + private void loadFields() {
  106 + this.fields = Reflections.getNonStaticFields(this.object.getClass());
  107 + }
  108 +
  109 + private void validateFields() {
  110 + for (Field field : this.fields) {
  111 + validateField(field);
  112 + }
  113 + }
  114 +
  115 + private void validateField(Field field) {
  116 + }
  117 +
  118 + private void loadType() {
  119 + this.type = object.getClass().getAnnotation(Configuration.class).type();
  120 + }
  121 +
  122 + private void loadResource() {
  123 + if (this.type != SYSTEM) {
  124 + String name = this.object.getClass().getAnnotation(Configuration.class).resource();
  125 + String extension = this.type.toString().toLowerCase();
  126 +
  127 + this.resource = name + "." + extension;
  128 + }
  129 + }
  130 +
  131 + private void loadConfiguration() {
  132 + AbstractConfiguration conf;
  133 +
  134 + switch (this.type) {
  135 + case SYSTEM:
  136 + conf = new SystemConfiguration();
  137 + break;
  138 +
  139 + case XML:
  140 + conf = new XMLConfiguration();
  141 + break;
  142 +
  143 + default:
  144 + conf = new PropertiesConfiguration();
  145 + break;
  146 + }
  147 +
  148 + conf.setDelimiterParsingDisabled(true);
  149 +
  150 + if (conf instanceof FileConfiguration) {
  151 + ((FileConfiguration) conf).setURL(Reflections.getResourceAsURL(this.resource));
  152 +
  153 + try {
  154 + ((FileConfiguration) conf).load();
  155 +
  156 + } catch (org.apache.commons.configuration.ConfigurationException cause) {
  157 + conf = null;
  158 + }
  159 + }
  160 +
  161 + this.configuration = conf;
  162 + }
  163 +
  164 + private void loadPrefix() {
  165 + String prefix = this.object.getClass().getAnnotation(Configuration.class).prefix();
  166 +
  167 + if (prefix.endsWith(".")) {
  168 + // prefix = prefix.substring(0, prefix.length() - 1);
  169 + // TODO Lançar warning pedindo para retirar o ponto (.)?
  170 + } else if (!prefix.isEmpty()) {
  171 + prefix += ".";
  172 + }
  173 +
  174 + this.prefix = prefix;
  175 + }
  176 +
  177 + private void loadValues() {
  178 + for (Field field : this.fields) {
  179 + loadValue(field);
  180 + }
  181 + }
  182 +
  183 + private void loadValue(Field field) {
  184 + if (hasIgnore(field)) {
  185 + return;
  186 + }
  187 +
  188 + Object defaultValue = Reflections.getFieldValue(field, this.object);
  189 + Object finalValue = getValue(field, field.getType(), getKey(field), defaultValue);
  190 +
  191 + Reflections.setFieldValue(field, this.object, finalValue);
  192 + }
  193 +
  194 + private Object getValue(Field field, Class<?> type, String key, Object defaultValue) {
  195 + ConfigurationValueExtractor extractor = getValueExtractor(field);
  196 + return extractor.getValue(this.prefix, key, field, this.configuration, defaultValue);
  197 + }
  198 +
  199 + private ConfigurationValueExtractor getValueExtractor(Field field) {
  200 + Collection<ConfigurationValueExtractor> candidates = new HashSet<ConfigurationValueExtractor>();
  201 + ConfigurationBootstrap bootstrap = Beans.getReference(ConfigurationBootstrap.class);
  202 +
  203 + for (Class<? extends ConfigurationValueExtractor> extractorClass : bootstrap.getCache()) {
  204 + ConfigurationValueExtractor extractor = Beans.getReference(extractorClass);
  205 +
  206 + if (extractor.isSupported(field)) {
  207 + candidates.add(extractor);
  208 + }
  209 + }
  210 +
  211 + ConfigurationValueExtractor elected = StrategySelector.getInstance(ConfigurationValueExtractor.class,
  212 + candidates);
  213 +
  214 + if (elected == null) {
  215 + // TODO lançar exceção informando que nenhum extrator foi encontrado para o field e ensinar como implementar
  216 + // um extrator personalizado.
  217 + }
  218 +
  219 + return elected;
  220 + }
  221 +
  222 + private String getKey(Field field) {
  223 + String key = "";
  224 +
  225 + if (field.isAnnotationPresent(Name.class)) {
  226 + key += field.getAnnotation(Name.class).value();
  227 + } else {
  228 + key += field.getName();
  229 + }
  230 +
  231 + return key;
  232 + }
  233 +
  234 + private boolean hasIgnore(Field field) {
  235 + return field.isAnnotationPresent(Ignore.class);
  236 + }
  237 +
  238 + private void validateValues() {
  239 + for (Field field : this.fields) {
  240 + validateValue(field);
  241 + }
  242 + }
  243 +
  244 + private void validateValue(Field field) {
  245 + if (field.isAnnotationPresent(NotNull.class) && Reflections.getFieldValue(field, this.object) == null) {
  246 + throw new ConfigurationException("", new NullPointerException());
  247 + // TODO: Pegar mensagem do Bundle e verificar como as mensagens de log estão implementadas
  248 + }
  249 + }
  250 +}
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationMapValueExtractor.java 0 → 100644
@@ -0,0 +1,88 @@ @@ -0,0 +1,88 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
  41 +import java.lang.reflect.Field;
  42 +import java.util.HashMap;
  43 +import java.util.Iterator;
  44 +import java.util.Map;
  45 +import java.util.regex.Matcher;
  46 +import java.util.regex.Pattern;
  47 +
  48 +import org.apache.commons.configuration.Configuration;
  49 +
  50 +import br.gov.frameworkdemoiselle.annotation.Priority;
  51 +import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
  52 +
  53 +@Priority(EXTENSIONS_L1_PRIORITY)
  54 +public class ConfigurationMapValueExtractor implements ConfigurationValueExtractor {
  55 +
  56 + @Override
  57 + public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {
  58 + @SuppressWarnings("unchecked")
  59 + Map<String, Object> value = (Map<String, Object>) defaultValue;
  60 +
  61 + String regexp = "^(" + prefix + ")((.+)\\.)?(" + key + ")$";
  62 + Pattern pattern = Pattern.compile(regexp);
  63 +
  64 + for (Iterator<String> iter = configuration.getKeys(); iter.hasNext();) {
  65 + String iterKey = iter.next();
  66 + Matcher matcher = pattern.matcher(iterKey);
  67 +
  68 + if (matcher.matches()) {
  69 + String confKey = matcher.group(1) + (matcher.group(2) == null ? "" : matcher.group(2))
  70 + + matcher.group(4);
  71 +
  72 + if (value == null) {
  73 + value = new HashMap<String, Object>();
  74 + }
  75 +
  76 + String mapKey = matcher.group(3) == null ? "default" : matcher.group(3);
  77 + value.put(mapKey, configuration.getString(confKey));
  78 + }
  79 + }
  80 +
  81 + return value;
  82 + }
  83 +
  84 + @Override
  85 + public boolean isSupported(Field field) {
  86 + return field.getType() == Map.class;
  87 + }
  88 +}
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationPrimitiveOrWrapperValueExtractor.java 0 → 100644
@@ -0,0 +1,89 @@ @@ -0,0 +1,89 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
  41 +import java.lang.reflect.Field;
  42 +import java.util.HashSet;
  43 +import java.util.Set;
  44 +
  45 +import org.apache.commons.configuration.Configuration;
  46 +import org.apache.commons.configuration.ConversionException;
  47 +import org.apache.commons.configuration.DataConfiguration;
  48 +import org.apache.commons.lang.ClassUtils;
  49 +
  50 +import br.gov.frameworkdemoiselle.annotation.Priority;
  51 +import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
  52 +
  53 +@Priority(EXTENSIONS_L1_PRIORITY)
  54 +public class ConfigurationPrimitiveOrWrapperValueExtractor implements ConfigurationValueExtractor {
  55 +
  56 + private static final Set<Object> wrappers = new HashSet<Object>();
  57 +
  58 + static {
  59 + wrappers.add(Boolean.class);
  60 + wrappers.add(Byte.class);
  61 + wrappers.add(Character.class);
  62 + wrappers.add(Short.class);
  63 + wrappers.add(Integer.class);
  64 + wrappers.add(Long.class);
  65 + wrappers.add(Double.class);
  66 + wrappers.add(Float.class);
  67 + wrappers.add(Void.TYPE);
  68 + }
  69 +
  70 + @Override
  71 + @SuppressWarnings("unchecked")
  72 + public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {
  73 + Object value;
  74 +
  75 + try {
  76 + value = new DataConfiguration(configuration).get(ClassUtils.primitiveToWrapper(field.getType()), prefix + key, defaultValue);
  77 +
  78 + } catch (ConversionException cause) {
  79 + value = defaultValue;
  80 + }
  81 +
  82 + return value;
  83 + }
  84 +
  85 + @Override
  86 + public boolean isSupported(Field field) {
  87 + return field.getType().isPrimitive() || wrappers.contains(field.getType());
  88 + }
  89 +}
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationStringValueExtractor.java 0 → 100644
@@ -0,0 +1,60 @@ @@ -0,0 +1,60 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY;
  40 +
  41 +import java.lang.reflect.Field;
  42 +
  43 +import org.apache.commons.configuration.Configuration;
  44 +
  45 +import br.gov.frameworkdemoiselle.annotation.Priority;
  46 +import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
  47 +
  48 +@Priority(EXTENSIONS_L1_PRIORITY)
  49 +public class ConfigurationStringValueExtractor implements ConfigurationValueExtractor {
  50 +
  51 + @Override
  52 + public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {
  53 + return configuration.getString(prefix + key, (String) defaultValue);
  54 + }
  55 +
  56 + @Override
  57 + public boolean isSupported(Field field) {
  58 + return field.getType() == String.class;
  59 + }
  60 +}
impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Reflections.java
@@ -47,8 +47,6 @@ import java.util.ArrayList; @@ -47,8 +47,6 @@ import java.util.ArrayList;
47 import java.util.Arrays; 47 import java.util.Arrays;
48 import java.util.List; 48 import java.util.List;
49 49
50 -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader;  
51 -  
52 public final class Reflections { 50 public final class Reflections {
53 51
54 private Reflections() { 52 private Reflections() {
@@ -178,8 +176,8 @@ public final class Reflections { @@ -178,8 +176,8 @@ public final class Reflections {
178 } 176 }
179 177
180 if (url == null) { 178 if (url == null) {
181 - result = ConfigurationLoader.class.getClassLoader();  
182 - url = ConfigurationLoader.class.getClassLoader().getResource(stripped); 179 + result = Reflections.class.getClassLoader();
  180 + url = Reflections.class.getClassLoader().getResource(stripped);
183 } 181 }
184 182
185 if (url == null) { 183 if (url == null) {
impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/AbstractConfigurationTest.java
@@ -48,12 +48,12 @@ import br.gov.frameworkdemoiselle.annotation.Ignore; @@ -48,12 +48,12 @@ import br.gov.frameworkdemoiselle.annotation.Ignore;
48 import br.gov.frameworkdemoiselle.annotation.Name; 48 import br.gov.frameworkdemoiselle.annotation.Name;
49 import br.gov.frameworkdemoiselle.internal.bootstrap.ConfigurationBootstrap; 49 import br.gov.frameworkdemoiselle.internal.bootstrap.ConfigurationBootstrap;
50 import br.gov.frameworkdemoiselle.internal.bootstrap.CoreBootstrap; 50 import br.gov.frameworkdemoiselle.internal.bootstrap.CoreBootstrap;
51 -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationArrayValueExtractor;  
52 -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationClassValueExtractor;  
53 -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader;  
54 -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationMapValueExtractor;  
55 -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationPrimitiveOrWrapperValueExtractor;  
56 -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationStringValueExtractor; 51 +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationArrayValueExtractor;
  52 +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationClassValueExtractor;
  53 +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationLoader;
  54 +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationMapValueExtractor;
  55 +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationPrimitiveOrWrapperValueExtractor;
  56 +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationStringValueExtractor;
57 import br.gov.frameworkdemoiselle.internal.producer.LocaleProducer; 57 import br.gov.frameworkdemoiselle.internal.producer.LocaleProducer;
58 import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; 58 import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer;
59 import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; 59 import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer;