Commit 825089f81fda01df31dd99629986ae7a755e0ebb

Authored by Dancovich
1 parent 291648c4
Exists in master

IN PROGRESS - issue FWK-123: Revisar e atualizar documentação do

Framework 2.4.0 
https://demoiselle.atlassian.net/browse/FWK-123
documentation/reference/pt-BR/configuracao.xml
@@ -160,15 +160,15 @@ public class BookmarkConfig { @@ -160,15 +160,15 @@ public class BookmarkConfig {
160 <section> 160 <section>
161 <title>Especificando os parâmetros</title> 161 <title>Especificando os parâmetros</title>
162 <para> 162 <para>
163 - Atualmente são suportados nativamente pelo <emphasis>Demoiselle Framework</emphasis> parâmetros de cinco tipos  
164 - diferentes, são eles: <emphasis>primitivo</emphasis>, <emphasis>wrapped</emphasis>, <emphasis>String</emphasis>,  
165 - <emphasis>class</emphasis>, <emphasis>map</emphasis> e <emphasis>array</emphasis>, sendo que os três últimos  
166 - são suportados a partir da versão 2.4.0. A seguir vamos explicar e exemplificar como utilizar cada um desses 163 + Atualmente são suportados nativamente pelo <emphasis>Demoiselle Framework</emphasis> parâmetros de sete categorias
  164 + diferentes. São eles: tipos primitivos (<emphasis>int, float, boolean, etc</emphasis>), classes <emphasis>wrapper</emphasis> (<emphasis>Integer, Float, Boolean, etc.</emphasis>)
  165 + , <emphasis>String</emphasis>, <emphasis>Class</emphasis>, <emphasis>Map</emphasis>, <emphasis>Array</emphasis> e instâncias de <emphasis>Enum</emphasis>.
  166 + A seguir vamos explicar e exemplificar como utilizar cada um desses
167 tipos, e alertar para as possíveis exceções que poderão ser lançadas para sua aplicação. 167 tipos, e alertar para as possíveis exceções que poderão ser lançadas para sua aplicação.
168 </para> 168 </para>
169 <caution> 169 <caution>
170 <para> 170 <para>
171 - A partir da versão 2.4.0 não são mais reconhecidas as convenções. Os parâmetros serão procurados exatamente 171 + A partir da versão 2.4.0 não são mais reconhecidas as convenções de substituição de nomes. Os parâmetros serão procurados exatamente
172 como foram definidos na classe de configuração. 172 como foram definidos na classe de configuração.
173 </para> 173 </para>
174 </caution> 174 </caution>
@@ -332,58 +332,42 @@ untypedClass=package.MyOtherClass @@ -332,58 +332,42 @@ untypedClass=package.MyOtherClass
332 <entry> 332 <entry>
333 <para> 333 <para>
334 Para utilizar parâmetros do tipo <emphasis>Map</emphasis>, o arquivo de configurações deve usar a seguinte 334 Para utilizar parâmetros do tipo <emphasis>Map</emphasis>, o arquivo de configurações deve usar a seguinte
335 - estrutura na formação da chave: <emphasis>prefixo+chavedomap+nomedoatributo</emphasis>. Vejamos um exemplo. 335 + estrutura na formação da chave: <emphasis>prefixo+nomedoatributo+chavedomap</emphasis>. Vejamos um exemplo.
336 Se temos em nossa aplicação uma classe de configuração como a mostrada abaixo: 336 Se temos em nossa aplicação uma classe de configuração como a mostrada abaixo:
337 </para> 337 </para>
338 <programlisting role="JAVA"><![CDATA[ 338 <programlisting role="JAVA"><![CDATA[
339 @Configuration 339 @Configuration
340 public class BookmarkConfig { 340 public class BookmarkConfig {
341 341
342 - private Map<String, String> url; 342 + private Map<String, String> connectionConfiguration;
343 343
344 - private Map<String, String> driverClass;  
345 -  
346 - public Map<String, String> getUrl() {  
347 - return url;  
348 - }  
349 -  
350 - public Map<String, String> DriverClass() {  
351 - return driverClass; 344 + public Map<String, String> getConnectionConfiguration() {
  345 + return connectionConfiguration;
352 } 346 }
353 } 347 }
354 ]]></programlisting> 348 ]]></programlisting>
355 <para> 349 <para>
356 - O arquivo de configuração deverá ser preenchido no formato seguinte (se for do tipo <emphasis>properties</emphasis>): 350 + O arquivo de configuração deverá ser preenchido no seguinte formato (se for do tipo <emphasis>properties</emphasis>):
357 </para> 351 </para>
358 - <programlisting role="PROPERTIES"><![CDATA[  
359 -mapkey1.url=jdbc:postgresql://localhost:5432/app  
360 -mapkey2.url=jdbc:mysql://localhost:3306/app  
361 -mapkey1.driverClass=org.postgresql.Driver  
362 -mapkey2.driverClass=com.mysql.Driver  
363 - ]]></programlisting> 352 + <programlisting role="PROPERTIES"><![CDATA[connectionConfiguration.ip=192.168.0.120
  353 +connectionConfiguration.gateway=192.168.0.1
  354 +connectionConfiguration.dns1=200.10.128.99
  355 +connectionConfiguration.dns2=200.10.128.88]]></programlisting>
364 <para> 356 <para>
365 - Dessa forma, ao fazer a chamada <emphasis>url.get("mapkey2");</emphasis>por exemplo, o valor retornado será  
366 - <emphasis>jdbc:mysql://localhost:3306/app</emphasis>. 357 + Dessa forma, ao fazer a chamada <emphasis>connectionConfiguration.get("gateway");</emphasis> por exemplo, o valor retornado será
  358 + <emphasis>192.168.0.1</emphasis>.
367 </para> 359 </para>
368 - <note>  
369 - <para>  
370 - O ponto entre a chave do <emphasis>Map</emphasis> e o nome do parâmetro é adicionado automaticamente pelo  
371 - framework.  
372 - </para>  
373 - </note> 360 +
374 <tip> 361 <tip>
375 <para> 362 <para>
376 Você pode utilizar a chave do Map com nome "default" para indicar que, no arquivo de configuração, a chave é formada 363 Você pode utilizar a chave do Map com nome "default" para indicar que, no arquivo de configuração, a chave é formada
377 - apenas pela junção do prefixo com o atributo, sem utilizar a própria chave do Map. Por exemplo, se na sua classe  
378 - existir um comando como este:  
379 - </para>  
380 - <programlisting role="JAVA"><![CDATA[  
381 - myMap.get("default");  
382 - ]]></programlisting>  
383 - <para>o framework irá procurar no arquivo de configuração uma linha como esta:</para>  
384 - <programlisting role="JAVA"><![CDATA[  
385 - prefix.myMap=Default Value  
386 - ]]></programlisting> 364 + apenas pela junção do prefixo com o atributo, sem utilizar a própria chave do Map. Por exemplo, se o seu arquivo de propriedades
  365 + contiver uma chave:
  366 + </para>
  367 + <programlisting role="JAVA"><![CDATA[prefix.myMap=Default Value]]></programlisting>
  368 + <para>então seu código poderá ter um comando:</para>
  369 + <programlisting role="JAVA"><![CDATA[String value = myMap.get("default");]]></programlisting>
  370 + <para>e o valor de <emphasis>value</emphasis> será <emphasis>"Default Value"</emphasis>.</para>
387 </tip> 371 </tip>
388 <para> 372 <para>
389 Caso a classe de configuração não esteja associada a um arquivo que contenha a chave de um de seus parâmetros 373 Caso a classe de configuração não esteja associada a um arquivo que contenha a chave de um de seus parâmetros
@@ -427,7 +411,66 @@ integerArray=1 @@ -427,7 +411,66 @@ integerArray=1
427 </row> 411 </row>
428 </tbody> 412 </tbody>
429 </tgroup> 413 </tgroup>
430 - </informaltable> 414 + </informaltable>
  415 +
  416 + <informaltable>
  417 + <tgroup cols="1">
  418 + <colspec colwidth="100*" />
  419 + <tbody>
  420 + <row>
  421 + <entry>
  422 + <emphasis role="bold">Enum</emphasis>
  423 + </entry>
  424 + </row>
  425 + <row>
  426 + <entry>
  427 + <para>
  428 + É possível criar uma lista de constantes do tipo <emphasis>Enum</emphasis> e carregar um valor de constante
  429 + através de um arquivo de configuração. Por exemplo, caso exista o seguinte <emphasis>Enum</emphasis>
  430 + </para>
  431 +
  432 + <programlisting role="JAVA"><![CDATA[public enum ConfigurationType {
  433 +
  434 + PROPERTIES , XML , SYSTEM;
  435 +
  436 +}]]></programlisting>
  437 +
  438 + <para>e ele seja usado no seguinte arquivo de configuração</para>
  439 +
  440 + <programlisting role="JAVA"><![CDATA[@Configuration
  441 +public class ConfigurationLoader {
  442 +
  443 + private ConfigurationType loadedConfigurationType;
  444 +
  445 + public ConfigurationType getLoadedConfigurationType(){
  446 + return loadedConfigurationType;
  447 + }
  448 +}]]></programlisting>
  449 +
  450 + <para>O arquivo do tipo <emphasis>properties</emphasis> pode ser criado assim:</para>
  451 +
  452 + <programlisting role="PROPERTIES"><![CDATA[loadedConfigurationType=SYSTEM]]></programlisting>
  453 +
  454 + <note>
  455 + <para>
  456 + O valor definido no arquivo de configuração para atributos do tipo <emphasis>Enum</emphasis> deve
  457 + ser idêntico ao nome da constante definida no <emphasis>Enum</emphasis>, inclusive casando letras maiúsculas e
  458 + minúsculas. De fato, o valor da propriedade deve casar com o valor retornado no código:
  459 + <emphasis>Enum.name()</emphasis>.
  460 + </para>
  461 +
  462 + <para>
  463 + Caso o valor definido no arquivo de configuração não case com nenhuma constante definida no <emphasis>Enum</emphasis>,
  464 + uma exceção de tipo <emphasis>ConfigurationException</emphasis> de causa <emphasis>ConversionException</emphasis>
  465 + será lançada. Já se à propriedade for atribuido um valor vazio, o atributo do tipo <emphasis>Enum</emphasis> receberá
  466 + o valor <emphasis>null</emphasis>.
  467 + </para>
  468 + </note>
  469 + </entry>
  470 + </row>
  471 + </tbody>
  472 + </tgroup>
  473 + </informaltable>
431 474
432 </section> 475 </section>
433 476
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationEnumValueExtractor.java
@@ -58,7 +58,7 @@ public class ConfigurationEnumValueExtractor implements ConfigurationValueExtrac @@ -58,7 +58,7 @@ public class ConfigurationEnumValueExtractor implements ConfigurationValueExtrac
58 public Object getValue(String prefix, String key, Field field, Configuration configuration) throws Exception { 58 public Object getValue(String prefix, String key, Field field, Configuration configuration) throws Exception {
59 String value = configuration.getString(prefix + key); 59 String value = configuration.getString(prefix + key);
60 60
61 - if (value!=null){ 61 + if (value!=null && !value.trim().equals("")){
62 Object enums[] = field.getType().getEnumConstants(); 62 Object enums[] = field.getType().getEnumConstants();
63 63
64 for (int i=0; i<enums.length; i++){ 64 for (int i=0; i<enums.length; i++){
impl/core/src/test/java/configuration/field/enumeration/AbstractEnumValueConfig.java
@@ -46,6 +46,8 @@ public abstract class AbstractEnumValueConfig implements Serializable { @@ -46,6 +46,8 @@ public abstract class AbstractEnumValueConfig implements Serializable {
46 46
47 private ListOfEnum anotherValue; 47 private ListOfEnum anotherValue;
48 48
  49 + private ListOfEnum emptyValue;
  50 +
49 public ListOfEnum getEnumValue() { 51 public ListOfEnum getEnumValue() {
50 return enumValue; 52 return enumValue;
51 } 53 }
@@ -53,4 +55,8 @@ public abstract class AbstractEnumValueConfig implements Serializable { @@ -53,4 +55,8 @@ public abstract class AbstractEnumValueConfig implements Serializable {
53 public ListOfEnum getAnotherValue() { 55 public ListOfEnum getAnotherValue() {
54 return anotherValue; 56 return anotherValue;
55 } 57 }
  58 +
  59 + public ListOfEnum getEmptyValue() {
  60 + return emptyValue;
  61 + }
56 } 62 }
impl/core/src/test/java/configuration/field/enumeration/ConfigurationEnumValueTest.java
@@ -74,6 +74,7 @@ public class ConfigurationEnumValueTest { @@ -74,6 +74,7 @@ public class ConfigurationEnumValueTest {
74 public void loadEnumConfig(){ 74 public void loadEnumConfig(){
75 Assert.assertEquals(ListOfEnum.VALUE_2, propertiesEnumConfig.getEnumValue()); 75 Assert.assertEquals(ListOfEnum.VALUE_2, propertiesEnumConfig.getEnumValue());
76 Assert.assertEquals(ListOfEnum.VALUE_2, xmlEnumConfig.getEnumValue()); 76 Assert.assertEquals(ListOfEnum.VALUE_2, xmlEnumConfig.getEnumValue());
  77 + Assert.assertNull(propertiesEnumConfig.getEmptyValue());
77 } 78 }
78 79
79 @Test(expected=ConfigurationException.class) 80 @Test(expected=ConfigurationException.class)
impl/core/src/test/resources/configuration/field/enumeration/demoiselle.properties
@@ -34,4 +34,5 @@ @@ -34,4 +34,5 @@
34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. 34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
35 35
36 prefix1.enumValue=VALUE_2 36 prefix1.enumValue=VALUE_2
  37 +prefix1.emptyValue=
37 prefix2.anotherValue=value_2 38 prefix2.anotherValue=value_2