From fc7a84cc0f8b0d21fc80ea476cffacbd8018da27 Mon Sep 17 00:00:00 2001 From: Cleverson Sacramento Date: Thu, 4 Apr 2013 09:38:47 -0300 Subject: [PATCH] Movendo as classes de carregamento de configuração para o pacote correto --- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationArrayValueExtractor.java | 62 -------------------------------------------------------------- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationClassValueExtractor.java | 76 ---------------------------------------------------------------------------- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java | 251 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationMapValueExtractor.java | 88 ---------------------------------------------------------------------------------------- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationPrimitiveOrWrapperValueExtractor.java | 89 ----------------------------------------------------------------------------------------- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationStringValueExtractor.java | 60 ------------------------------------------------------------ impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationArrayValueExtractor.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationClassValueExtractor.java | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationImpl.java | 1 - impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationLoader.java | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationMapValueExtractor.java | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationPrimitiveOrWrapperValueExtractor.java | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationStringValueExtractor.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Reflections.java | 6 ++---- impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/AbstractConfigurationTest.java | 12 ++++++------ 15 files changed, 633 insertions(+), 637 deletions(-) delete mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationArrayValueExtractor.java delete mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationClassValueExtractor.java delete mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java delete mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationMapValueExtractor.java delete mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationPrimitiveOrWrapperValueExtractor.java delete mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationStringValueExtractor.java create mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationArrayValueExtractor.java create mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationClassValueExtractor.java create mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationLoader.java create mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationMapValueExtractor.java create mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationPrimitiveOrWrapperValueExtractor.java create mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationStringValueExtractor.java 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 deleted file mode 100644 index 0fcea08..0000000 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationArrayValueExtractor.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -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.Configuration; -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, Configuration configuration, Object defaultValue) { - return new DataConfiguration(configuration).getArray(field.getType().getComponentType(), prefix + key, - defaultValue); - } - - @Override - public boolean isSupported(Field field) { - return field.getType().isArray(); - } -} 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 deleted file mode 100644 index fadea85..0000000 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationClassValueExtractor.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -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.Configuration; - -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, Configuration configuration, Object defaultValue) { - Object value = defaultValue; - String canonicalName = configuration.getString(prefix + key); - - if (canonicalName != null) { - ClassLoader classLoader = Reflections.getClassLoaderForClass(canonicalName); - - try { - value = Class.forName(canonicalName, true, classLoader); - } catch (ClassNotFoundException cause) { - // TODO Lançar a mensagem correta - throw new ConfigurationException(null, cause); - } - } - - return value; - } - - @Override - public boolean isSupported(Field field) { - return field.getType() == Class.class; - } -} 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 deleted file mode 100644 index 6391727..0000000 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java +++ /dev/null @@ -1,251 +0,0 @@ -/* -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -package br.gov.frameworkdemoiselle.internal.configuration; - -import static br.gov.frameworkdemoiselle.configuration.ConfigType.SYSTEM; - -import java.io.Serializable; -import java.lang.reflect.Field; -import java.util.Collection; -import java.util.HashSet; - -import javax.validation.constraints.NotNull; - -import org.apache.commons.configuration.AbstractConfiguration; -import org.apache.commons.configuration.FileConfiguration; -import org.apache.commons.configuration.PropertiesConfiguration; -import org.apache.commons.configuration.SystemConfiguration; -import org.apache.commons.configuration.XMLConfiguration; - -import br.gov.frameworkdemoiselle.annotation.Ignore; -import br.gov.frameworkdemoiselle.annotation.Name; -import br.gov.frameworkdemoiselle.configuration.ConfigType; -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; - -/** - * This component loads a config class annotated with {@link Configuration} by filling its attributes with {@link Param} - * according to a {@link ConfigType}. - * - * @author SERPRO - */ -public class ConfigurationLoader implements Serializable { - - private static final long serialVersionUID = 1L; - - private Object object; - - private ConfigType type; - - private String resource; - - private String prefix; - - private org.apache.commons.configuration.Configuration configuration; - - private Collection fields; - - public void load(Object object) throws ConfigurationException { - this.object = object; - - loadFields(); - validateFields(); - - loadType(); - loadResource(); - loadConfiguration(); - - if (this.configuration != null) { - loadPrefix(); - loadValues(); - } - - validateValues(); - } - - private void loadFields() { - this.fields = Reflections.getNonStaticFields(this.object.getClass()); - } - - private void validateFields() { - for (Field field : this.fields) { - validateField(field); - } - } - - private void validateField(Field field) { - } - - private void loadType() { - this.type = object.getClass().getAnnotation(Configuration.class).type(); - } - - private void loadResource() { - if (this.type != SYSTEM) { - String name = this.object.getClass().getAnnotation(Configuration.class).resource(); - String extension = this.type.toString().toLowerCase(); - - this.resource = name + "." + extension; - } - } - - private void loadConfiguration() { - AbstractConfiguration conf; - - switch (this.type) { - case SYSTEM: - conf = new SystemConfiguration(); - break; - - case XML: - conf = new XMLConfiguration(); - break; - - default: - conf = new PropertiesConfiguration(); - break; - } - - conf.setDelimiterParsingDisabled(true); - - if (conf instanceof FileConfiguration) { - ((FileConfiguration) conf).setURL(Reflections.getResourceAsURL(this.resource)); - - try { - ((FileConfiguration) conf).load(); - - } catch (org.apache.commons.configuration.ConfigurationException cause) { - conf = null; - } - } - - this.configuration = conf; - } - - private void loadPrefix() { - String prefix = this.object.getClass().getAnnotation(Configuration.class).prefix(); - - if (prefix.endsWith(".")) { - // prefix = prefix.substring(0, prefix.length() - 1); - // TODO Lançar warning pedindo para retirar o ponto (.)? - } else if (!prefix.isEmpty()) { - prefix += "."; - } - - this.prefix = prefix; - } - - private void loadValues() { - for (Field field : this.fields) { - loadValue(field); - } - } - - private void loadValue(Field field) { - if (hasIgnore(field)) { - return; - } - - Object defaultValue = Reflections.getFieldValue(field, this.object); - Object finalValue = getValue(field, field.getType(), getKey(field), defaultValue); - - Reflections.setFieldValue(field, this.object, finalValue); - } - - private Object getValue(Field field, Class type, String key, Object defaultValue) { - ConfigurationValueExtractor extractor = getValueExtractor(field); - return extractor.getValue(this.prefix, key, field, this.configuration, defaultValue); - } - - private ConfigurationValueExtractor getValueExtractor(Field field) { - Collection candidates = new HashSet(); - ConfigurationBootstrap bootstrap = Beans.getReference(ConfigurationBootstrap.class); - - for (Class extractorClass : bootstrap.getCache()) { - ConfigurationValueExtractor extractor = Beans.getReference(extractorClass); - - if (extractor.isSupported(field)) { - candidates.add(extractor); - } - } - - 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; - } - - private String getKey(Field field) { - String key = ""; - - if (field.isAnnotationPresent(Name.class)) { - key += field.getAnnotation(Name.class).value(); - } else { - key += field.getName(); - } - - return key; - } - - private boolean hasIgnore(Field field) { - return field.isAnnotationPresent(Ignore.class); - } - - private void validateValues() { - for (Field field : this.fields) { - validateValue(field); - } - } - - private void validateValue(Field field) { - if (field.isAnnotationPresent(NotNull.class) && Reflections.getFieldValue(field, this.object) == null) { - throw new ConfigurationException("", new NullPointerException()); - // TODO: Pegar mensagem do Bundle e verificar como as mensagens de log estão implementadas - } - } -} 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 deleted file mode 100644 index d88aff0..0000000 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationMapValueExtractor.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -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; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.configuration.Configuration; - -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, Configuration configuration, Object defaultValue) { - @SuppressWarnings("unchecked") - Map value = (Map) defaultValue; - - String regexp = "^(" + prefix + ")((.+)\\.)?(" + key + ")$"; - Pattern pattern = Pattern.compile(regexp); - - for (Iterator iter = configuration.getKeys(); iter.hasNext();) { - String iterKey = iter.next(); - Matcher matcher = pattern.matcher(iterKey); - - if (matcher.matches()) { - String confKey = matcher.group(1) + (matcher.group(2) == null ? "" : matcher.group(2)) - + matcher.group(4); - - if (value == null) { - value = new HashMap(); - } - - String mapKey = matcher.group(3) == null ? "default" : matcher.group(3); - value.put(mapKey, configuration.getString(confKey)); - } - } - - return value; - } - - @Override - public boolean isSupported(Field field) { - return field.getType() == Map.class; - } -} 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 deleted file mode 100644 index 6aa759c..0000000 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationPrimitiveOrWrapperValueExtractor.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -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; - -import org.apache.commons.configuration.Configuration; -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(); - - static { - wrappers.add(Boolean.class); - wrappers.add(Byte.class); - wrappers.add(Character.class); - wrappers.add(Short.class); - wrappers.add(Integer.class); - wrappers.add(Long.class); - wrappers.add(Double.class); - wrappers.add(Float.class); - wrappers.add(Void.TYPE); - } - - @Override - @SuppressWarnings("unchecked") - public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) { - Object value; - - try { - value = new DataConfiguration(configuration).get(ClassUtils.primitiveToWrapper(field.getType()), prefix + key, defaultValue); - - } catch (ConversionException cause) { - value = defaultValue; - } - - return value; - } - - @Override - public boolean isSupported(Field field) { - return field.getType().isPrimitive() || wrappers.contains(field.getType()); - } -} 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 deleted file mode 100644 index be40e1f..0000000 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationStringValueExtractor.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ -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.Configuration; - -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, Configuration configuration, Object defaultValue) { - return configuration.getString(prefix + key, (String) defaultValue); - } - - @Override - public boolean isSupported(Field field) { - return field.getType() == String.class; - } -} diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationArrayValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationArrayValueExtractor.java new file mode 100644 index 0000000..9756f1b --- /dev/null +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationArrayValueExtractor.java @@ -0,0 +1,62 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package br.gov.frameworkdemoiselle.internal.implementation; + +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + +import java.lang.reflect.Field; + +import org.apache.commons.configuration.Configuration; +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, Configuration configuration, Object defaultValue) { + return new DataConfiguration(configuration).getArray(field.getType().getComponentType(), prefix + key, + defaultValue); + } + + @Override + public boolean isSupported(Field field) { + return field.getType().isArray(); + } +} diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationClassValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationClassValueExtractor.java new file mode 100644 index 0000000..d036df2 --- /dev/null +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationClassValueExtractor.java @@ -0,0 +1,76 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package br.gov.frameworkdemoiselle.internal.implementation; + +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + +import java.lang.reflect.Field; + +import org.apache.commons.configuration.Configuration; + +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, Configuration configuration, Object defaultValue) { + Object value = defaultValue; + String canonicalName = configuration.getString(prefix + key); + + if (canonicalName != null) { + ClassLoader classLoader = Reflections.getClassLoaderForClass(canonicalName); + + try { + value = Class.forName(canonicalName, true, classLoader); + } catch (ClassNotFoundException cause) { + // TODO Lançar a mensagem correta + throw new ConfigurationException(null, cause); + } + } + + return value; + } + + @Override + public boolean isSupported(Field field) { + return field.getType() == Class.class; + } +} diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationImpl.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationImpl.java index b1b06d6..2c682db 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationImpl.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationImpl.java @@ -3,7 +3,6 @@ package br.gov.frameworkdemoiselle.internal.implementation; import java.io.Serializable; import br.gov.frameworkdemoiselle.annotation.Ignore; -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader; import br.gov.frameworkdemoiselle.util.Beans; public class ConfigurationImpl implements Serializable { diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationLoader.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationLoader.java new file mode 100644 index 0000000..473c92b --- /dev/null +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationLoader.java @@ -0,0 +1,250 @@ +/* +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package br.gov.frameworkdemoiselle.internal.implementation; + +import static br.gov.frameworkdemoiselle.configuration.ConfigType.SYSTEM; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.util.Collection; +import java.util.HashSet; + +import javax.validation.constraints.NotNull; + +import org.apache.commons.configuration.AbstractConfiguration; +import org.apache.commons.configuration.FileConfiguration; +import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.commons.configuration.SystemConfiguration; +import org.apache.commons.configuration.XMLConfiguration; + +import br.gov.frameworkdemoiselle.annotation.Ignore; +import br.gov.frameworkdemoiselle.annotation.Name; +import br.gov.frameworkdemoiselle.configuration.ConfigType; +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.util.Beans; +import br.gov.frameworkdemoiselle.util.Reflections; + +/** + * This component loads a config class annotated with {@link Configuration} by filling its attributes with {@link Param} + * according to a {@link ConfigType}. + * + * @author SERPRO + */ +public class ConfigurationLoader implements Serializable { + + private static final long serialVersionUID = 1L; + + private Object object; + + private ConfigType type; + + private String resource; + + private String prefix; + + private org.apache.commons.configuration.Configuration configuration; + + private Collection fields; + + public void load(Object object) throws ConfigurationException { + this.object = object; + + loadFields(); + validateFields(); + + loadType(); + loadResource(); + loadConfiguration(); + + if (this.configuration != null) { + loadPrefix(); + loadValues(); + } + + validateValues(); + } + + private void loadFields() { + this.fields = Reflections.getNonStaticFields(this.object.getClass()); + } + + private void validateFields() { + for (Field field : this.fields) { + validateField(field); + } + } + + private void validateField(Field field) { + } + + private void loadType() { + this.type = object.getClass().getAnnotation(Configuration.class).type(); + } + + private void loadResource() { + if (this.type != SYSTEM) { + String name = this.object.getClass().getAnnotation(Configuration.class).resource(); + String extension = this.type.toString().toLowerCase(); + + this.resource = name + "." + extension; + } + } + + private void loadConfiguration() { + AbstractConfiguration conf; + + switch (this.type) { + case SYSTEM: + conf = new SystemConfiguration(); + break; + + case XML: + conf = new XMLConfiguration(); + break; + + default: + conf = new PropertiesConfiguration(); + break; + } + + conf.setDelimiterParsingDisabled(true); + + if (conf instanceof FileConfiguration) { + ((FileConfiguration) conf).setURL(Reflections.getResourceAsURL(this.resource)); + + try { + ((FileConfiguration) conf).load(); + + } catch (org.apache.commons.configuration.ConfigurationException cause) { + conf = null; + } + } + + this.configuration = conf; + } + + private void loadPrefix() { + String prefix = this.object.getClass().getAnnotation(Configuration.class).prefix(); + + if (prefix.endsWith(".")) { + // prefix = prefix.substring(0, prefix.length() - 1); + // TODO Lançar warning pedindo para retirar o ponto (.)? + } else if (!prefix.isEmpty()) { + prefix += "."; + } + + this.prefix = prefix; + } + + private void loadValues() { + for (Field field : this.fields) { + loadValue(field); + } + } + + private void loadValue(Field field) { + if (hasIgnore(field)) { + return; + } + + Object defaultValue = Reflections.getFieldValue(field, this.object); + Object finalValue = getValue(field, field.getType(), getKey(field), defaultValue); + + Reflections.setFieldValue(field, this.object, finalValue); + } + + private Object getValue(Field field, Class type, String key, Object defaultValue) { + ConfigurationValueExtractor extractor = getValueExtractor(field); + return extractor.getValue(this.prefix, key, field, this.configuration, defaultValue); + } + + private ConfigurationValueExtractor getValueExtractor(Field field) { + Collection candidates = new HashSet(); + ConfigurationBootstrap bootstrap = Beans.getReference(ConfigurationBootstrap.class); + + for (Class extractorClass : bootstrap.getCache()) { + ConfigurationValueExtractor extractor = Beans.getReference(extractorClass); + + if (extractor.isSupported(field)) { + candidates.add(extractor); + } + } + + 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; + } + + private String getKey(Field field) { + String key = ""; + + if (field.isAnnotationPresent(Name.class)) { + key += field.getAnnotation(Name.class).value(); + } else { + key += field.getName(); + } + + return key; + } + + private boolean hasIgnore(Field field) { + return field.isAnnotationPresent(Ignore.class); + } + + private void validateValues() { + for (Field field : this.fields) { + validateValue(field); + } + } + + private void validateValue(Field field) { + if (field.isAnnotationPresent(NotNull.class) && Reflections.getFieldValue(field, this.object) == null) { + throw new ConfigurationException("", new NullPointerException()); + // TODO: Pegar mensagem do Bundle e verificar como as mensagens de log estão implementadas + } + } +} diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationMapValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationMapValueExtractor.java new file mode 100644 index 0000000..e27dd98 --- /dev/null +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationMapValueExtractor.java @@ -0,0 +1,88 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package br.gov.frameworkdemoiselle.internal.implementation; + +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.configuration.Configuration; + +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, Configuration configuration, Object defaultValue) { + @SuppressWarnings("unchecked") + Map value = (Map) defaultValue; + + String regexp = "^(" + prefix + ")((.+)\\.)?(" + key + ")$"; + Pattern pattern = Pattern.compile(regexp); + + for (Iterator iter = configuration.getKeys(); iter.hasNext();) { + String iterKey = iter.next(); + Matcher matcher = pattern.matcher(iterKey); + + if (matcher.matches()) { + String confKey = matcher.group(1) + (matcher.group(2) == null ? "" : matcher.group(2)) + + matcher.group(4); + + if (value == null) { + value = new HashMap(); + } + + String mapKey = matcher.group(3) == null ? "default" : matcher.group(3); + value.put(mapKey, configuration.getString(confKey)); + } + } + + return value; + } + + @Override + public boolean isSupported(Field field) { + return field.getType() == Map.class; + } +} diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationPrimitiveOrWrapperValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationPrimitiveOrWrapperValueExtractor.java new file mode 100644 index 0000000..b2a6009 --- /dev/null +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationPrimitiveOrWrapperValueExtractor.java @@ -0,0 +1,89 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package br.gov.frameworkdemoiselle.internal.implementation; + +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.configuration.Configuration; +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(); + + static { + wrappers.add(Boolean.class); + wrappers.add(Byte.class); + wrappers.add(Character.class); + wrappers.add(Short.class); + wrappers.add(Integer.class); + wrappers.add(Long.class); + wrappers.add(Double.class); + wrappers.add(Float.class); + wrappers.add(Void.TYPE); + } + + @Override + @SuppressWarnings("unchecked") + public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) { + Object value; + + try { + value = new DataConfiguration(configuration).get(ClassUtils.primitiveToWrapper(field.getType()), prefix + key, defaultValue); + + } catch (ConversionException cause) { + value = defaultValue; + } + + return value; + } + + @Override + public boolean isSupported(Field field) { + return field.getType().isPrimitive() || wrappers.contains(field.getType()); + } +} diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationStringValueExtractor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationStringValueExtractor.java new file mode 100644 index 0000000..b64665e --- /dev/null +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationStringValueExtractor.java @@ -0,0 +1,60 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package br.gov.frameworkdemoiselle.internal.implementation; + +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.EXTENSIONS_L1_PRIORITY; + +import java.lang.reflect.Field; + +import org.apache.commons.configuration.Configuration; + +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, Configuration configuration, Object defaultValue) { + return configuration.getString(prefix + key, (String) defaultValue); + } + + @Override + public boolean isSupported(Field field) { + return field.getType() == String.class; + } +} diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Reflections.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Reflections.java index 7516d3c..3f6dcbc 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Reflections.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Reflections.java @@ -47,8 +47,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader; - public final class Reflections { private Reflections() { @@ -178,8 +176,8 @@ public final class Reflections { } if (url == null) { - result = ConfigurationLoader.class.getClassLoader(); - url = ConfigurationLoader.class.getClassLoader().getResource(stripped); + result = Reflections.class.getClassLoader(); + url = Reflections.class.getClassLoader().getResource(stripped); } if (url == null) { diff --git a/impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/AbstractConfigurationTest.java b/impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/AbstractConfigurationTest.java index 67bdeff..ae3cbab 100644 --- a/impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/AbstractConfigurationTest.java +++ b/impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/AbstractConfigurationTest.java @@ -48,12 +48,12 @@ import br.gov.frameworkdemoiselle.annotation.Ignore; import br.gov.frameworkdemoiselle.annotation.Name; import br.gov.frameworkdemoiselle.internal.bootstrap.ConfigurationBootstrap; import br.gov.frameworkdemoiselle.internal.bootstrap.CoreBootstrap; -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationArrayValueExtractor; -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationClassValueExtractor; -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader; -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationMapValueExtractor; -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationPrimitiveOrWrapperValueExtractor; -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationStringValueExtractor; +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationArrayValueExtractor; +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationClassValueExtractor; +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationLoader; +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationMapValueExtractor; +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationPrimitiveOrWrapperValueExtractor; +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationStringValueExtractor; import br.gov.frameworkdemoiselle.internal.producer.LocaleProducer; import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; -- libgit2 0.21.2