Commit 8e309ba046a99d676e785aa6444f15bbaa5f2a5f

Authored by Cleverson Sacramento
1 parent 62d7edd7
Exists in master

Inclusão dos testes de personalização do carregador de configuração

impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationClassValueExtractor.java
... ... @@ -56,10 +56,8 @@ public class ConfigurationClassValueExtractor implements ConfigurationValueExtra
56 56 String canonicalName = configuration.getString(prefix + key);
57 57  
58 58 if (canonicalName != null) {
59   - ClassLoader classLoader = Reflections.getClassLoaderForClass(canonicalName);
60   -
61 59 try {
62   - value = Class.forName(canonicalName, true, classLoader);
  60 + value = Reflections.forName(canonicalName);
63 61 } catch (ClassNotFoundException cause) {
64 62 // TODO Lançar a mensagem correta
65 63 throw new ConfigurationException(null, cause);
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationLoader.java
... ... @@ -51,6 +51,7 @@ import org.apache.commons.configuration.FileConfiguration;
51 51 import org.apache.commons.configuration.PropertiesConfiguration;
52 52 import org.apache.commons.configuration.SystemConfiguration;
53 53 import org.apache.commons.configuration.XMLConfiguration;
  54 +import org.slf4j.Logger;
54 55  
55 56 import br.gov.frameworkdemoiselle.annotation.Ignore;
56 57 import br.gov.frameworkdemoiselle.annotation.Name;
... ... @@ -60,7 +61,9 @@ import br.gov.frameworkdemoiselle.configuration.ConfigurationException;
60 61 import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
61 62 import br.gov.frameworkdemoiselle.internal.bootstrap.ConfigurationBootstrap;
62 63 import br.gov.frameworkdemoiselle.util.Beans;
  64 +import br.gov.frameworkdemoiselle.util.NameQualifier;
63 65 import br.gov.frameworkdemoiselle.util.Reflections;
  66 +import br.gov.frameworkdemoiselle.util.ResourceBundle;
64 67  
65 68 /**
66 69 * This component loads a config class annotated with {@link Configuration} by filling its attributes with {@link Param}
... ... @@ -72,6 +75,10 @@ public class ConfigurationLoader implements Serializable {
72 75  
73 76 private static final long serialVersionUID = 1L;
74 77  
  78 + private static ResourceBundle bundle;
  79 +
  80 + private static Logger logger;
  81 +
75 82 private Object object;
76 83  
77 84 private ConfigType type;
... ... @@ -85,6 +92,8 @@ public class ConfigurationLoader implements Serializable {
85 92 private Collection<Field> fields;
86 93  
87 94 public void load(Object object) throws ConfigurationException {
  95 + getLogger().debug(getBundle().getString("loading-configuration-class", object.getClass().getName()));
  96 +
88 97 this.object = object;
89 98  
90 99 loadFields();
... ... @@ -220,6 +229,7 @@ public class ConfigurationLoader implements Serializable {
220 229 if (elected == null) {
221 230 // TODO lançar exceção informando que nenhum extrator foi encontrado para o field e ensinar como implementar
222 231 // um extrator personalizado.
  232 + throw new ConfigurationException("");
223 233 }
224 234  
225 235 return elected;
... ... @@ -253,4 +263,20 @@ public class ConfigurationLoader implements Serializable {
253 263 // TODO: Pegar mensagem do Bundle e verificar como as mensagens de log estão implementadas
254 264 }
255 265 }
  266 +
  267 + private static ResourceBundle getBundle() {
  268 + if (bundle == null) {
  269 + bundle = Beans.getReference(ResourceBundle.class, new NameQualifier("demoiselle-core-bundle"));
  270 + }
  271 +
  272 + return bundle;
  273 + }
  274 +
  275 + private static Logger getLogger() {
  276 + if (logger == null) {
  277 + logger = Beans.getReference(Logger.class, new NameQualifier(ConfigurationLoader.class.getName()));
  278 + }
  279 +
  280 + return logger;
  281 + }
256 282 }
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java
... ... @@ -100,7 +100,9 @@ public final class StrategySelector implements Serializable {
100 100 }
101 101 }
102 102  
103   - checkForAmbiguity(type, selected, options);
  103 + if (selected != null) {
  104 + checkForAmbiguity(type, selected, options);
  105 + }
104 106  
105 107 return selected;
106 108 }
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/producer/LoggerProducer.java
... ... @@ -56,18 +56,21 @@ import javax.enterprise.inject.spi.InjectionPoint;
56 56  
57 57 import org.slf4j.Logger;
58 58  
  59 +import br.gov.frameworkdemoiselle.DemoiselleException;
  60 +import br.gov.frameworkdemoiselle.annotation.Name;
59 61 import br.gov.frameworkdemoiselle.internal.proxy.Slf4jLoggerProxy;
  62 +import br.gov.frameworkdemoiselle.util.Reflections;
60 63  
61 64 public class LoggerProducer implements Serializable {
62 65  
63 66 private static final long serialVersionUID = 1L;
64 67  
65   - @Produces
66 68 @Default
  69 + @Produces
67 70 public Logger create(final InjectionPoint ip) {
68 71 Class<?> type;
69 72  
70   - if (ip != null) {
  73 + if (ip.getMember() != null) {
71 74 type = ip.getMember().getDeclaringClass();
72 75 } else {
73 76 type = LoggerProducer.class;
... ... @@ -76,6 +79,24 @@ public class LoggerProducer implements Serializable {
76 79 return create(type);
77 80 }
78 81  
  82 + @Name("")
  83 + @Produces
  84 + public Logger createNamed(final InjectionPoint ip) throws ClassNotFoundException {
  85 + Class<?> type;
  86 +
  87 + try {
  88 + String canonicalName = ip.getAnnotated().getAnnotation(Name.class).value();
  89 + type = Reflections.forName(canonicalName);
  90 +
  91 + } catch (ClassCastException cause) {
  92 + // TODO Colocar a mensgaem apropriada mostrando como utilizar a anotação @Name corretamente com a injeção de
  93 + // Logger.
  94 + throw new DemoiselleException(null, cause);
  95 + }
  96 +
  97 + return create(type);
  98 + }
  99 +
79 100 public static <T> Logger create(Class<T> type) {
80 101 return new Slf4jLoggerProxy(type);
81 102 }
... ...
impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Reflections.java
... ... @@ -191,4 +191,10 @@ public final class Reflections {
191 191 ClassLoader classLoader = getClassLoaderForResource(resource);
192 192 return classLoader != null ? classLoader.getResource(resource) : null;
193 193 }
  194 +
  195 + @SuppressWarnings("unchecked")
  196 + public static <T> Class<T> forName(final String className) throws ClassNotFoundException {
  197 + ClassLoader classLoader = getClassLoaderForClass(className);
  198 + return (Class<T>) Class.forName(className, true, classLoader);
  199 + }
194 200 }
... ...
impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/field/custom/ConfigurationCustomFieldTest.java 0 → 100644
... ... @@ -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.configuration.field.custom;
  38 +
  39 +import static junit.framework.Assert.assertNotNull;
  40 +import static junit.framework.Assert.fail;
  41 +
  42 +import java.io.File;
  43 +
  44 +import javax.inject.Inject;
  45 +
  46 +import org.jboss.arquillian.container.test.api.Deployment;
  47 +import org.jboss.arquillian.junit.Arquillian;
  48 +import org.jboss.shrinkwrap.api.asset.FileAsset;
  49 +import org.jboss.shrinkwrap.api.spec.JavaArchive;
  50 +import org.junit.Test;
  51 +import org.junit.runner.RunWith;
  52 +
  53 +import br.gov.frameworkdemoiselle.configuration.AbstractConfigurationTest;
  54 +import br.gov.frameworkdemoiselle.configuration.ConfigurationException;
  55 +
  56 +@RunWith(Arquillian.class)
  57 +public class ConfigurationCustomFieldTest extends AbstractConfigurationTest {
  58 +
  59 + @Inject
  60 + private CustomMappedFieldConfig mappedField;
  61 +
  62 + @Inject
  63 + private CustomUnmappedFieldConfig unmappedField;
  64 +
  65 + @Deployment
  66 + public static JavaArchive createDeployment() {
  67 + JavaArchive deployment = createConfigurationDeployment();
  68 +
  69 + deployment.addPackages(true, ConfigurationCustomFieldTest.class.getPackage());
  70 + deployment.addAsResource(new FileAsset(new File(
  71 + "src/test/resources/configuration/field/custom/demoiselle.properties")), "demoiselle.properties");
  72 +
  73 + return deployment;
  74 + }
  75 +
  76 + @Test
  77 + public void loadMappedClass() {
  78 + assertNotNull(mappedField.getMappedClass());
  79 + }
  80 +
  81 + @Test
  82 + public void loadUnmappedClass() {
  83 + try {
  84 + unmappedField.getUnmappedClass();
  85 + fail();
  86 + } catch (ConfigurationException cause) {
  87 + }
  88 + }
  89 +}
... ...
impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/field/custom/CustomMappedFieldConfig.java 0 → 100644
... ... @@ -0,0 +1,49 @@
  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.configuration.field.custom;
  38 +
  39 +import br.gov.frameworkdemoiselle.configuration.Configuration;
  40 +
  41 +@Configuration
  42 +public class CustomMappedFieldConfig {
  43 +
  44 + private MappedClass mappedClass;
  45 +
  46 + public MappedClass getMappedClass() {
  47 + return mappedClass;
  48 + }
  49 +}
... ...
impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/field/custom/CustomUnmappedFieldConfig.java 0 → 100644
... ... @@ -0,0 +1,49 @@
  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.configuration.field.custom;
  38 +
  39 +import br.gov.frameworkdemoiselle.configuration.Configuration;
  40 +
  41 +@Configuration
  42 +public class CustomUnmappedFieldConfig {
  43 +
  44 + private UnmappedClass unmappedClass;
  45 +
  46 + public UnmappedClass getUnmappedClass() {
  47 + return unmappedClass;
  48 + }
  49 +}
... ...
impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/field/custom/MappedClass.java 0 → 100644
... ... @@ -0,0 +1,41 @@
  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.configuration.field.custom;
  38 +
  39 +public class MappedClass {
  40 +
  41 +}
... ...
impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/field/custom/MyValueExtractor.java 0 → 100644
... ... @@ -0,0 +1,20 @@
  1 +package br.gov.frameworkdemoiselle.configuration.field.custom;
  2 +
  3 +import java.lang.reflect.Field;
  4 +
  5 +import org.apache.commons.configuration.Configuration;
  6 +
  7 +import br.gov.frameworkdemoiselle.configuration.ConfigurationValueExtractor;
  8 +
  9 +public class MyValueExtractor implements ConfigurationValueExtractor {
  10 +
  11 + @Override
  12 + public Object getValue(String prefix, String key, Field field, Configuration configuration, Object defaultValue) {
  13 + return new MappedClass();
  14 + }
  15 +
  16 + @Override
  17 + public boolean isSupported(Field field) {
  18 + return field.getType() == MappedClass.class;
  19 + }
  20 +}
... ...
impl/core/src/test/java/br/gov/frameworkdemoiselle/configuration/field/custom/UnmappedClass.java 0 → 100644
... ... @@ -0,0 +1,41 @@
  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.configuration.field.custom;
  38 +
  39 +public class UnmappedClass {
  40 +
  41 +}
... ...
impl/core/src/test/resources/configuration/field/custom/demoiselle.properties 0 → 100644
... ... @@ -0,0 +1,34 @@
  1 +# Demoiselle Framework
  2 +# Copyright (C) 2010 SERPRO
  3 +# ----------------------------------------------------------------------------
  4 +# This file is part of Demoiselle Framework.
  5 +#
  6 +# Demoiselle Framework is free software; you can redistribute it and/or
  7 +# modify it under the terms of the GNU Lesser General Public License version 3
  8 +# as published by the Free Software Foundation.
  9 +#
  10 +# This program is distributed in the hope that it will be useful,
  11 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13 +# GNU General Public License for more details.
  14 +#
  15 +# You should have received a copy of the GNU Lesser General Public License version 3
  16 +# along with this program; if not, see <http://www.gnu.org/licenses/>
  17 +# or write to the Free Software Foundation, Inc., 51 Franklin Street,
  18 +# Fifth Floor, Boston, MA 02110-1301, USA.
  19 +# ----------------------------------------------------------------------------
  20 +# Este arquivo é parte do Framework Demoiselle.
  21 +#
  22 +# O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  23 +# modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  24 +# do Software Livre (FSF).
  25 +#
  26 +# Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  27 +# GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  28 +# APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  29 +# para maiores detalhes.
  30 +#
  31 +# Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  32 +# "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  33 +# ou escreva para a Fundação do Software Livre (FSF) Inc.,
  34 +# 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
... ...