Commit 825089f81fda01df31dd99629986ae7a755e0ebb
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
Showing
5 changed files
with
93 additions
and
42 deletions
Show diff stats
documentation/reference/pt-BR/configuracao.xml
| ... | ... | @@ -160,15 +160,15 @@ public class BookmarkConfig { |
| 160 | 160 | <section> |
| 161 | 161 | <title>Especificando os parâmetros</title> |
| 162 | 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 | 167 | tipos, e alertar para as possíveis exceções que poderão ser lançadas para sua aplicação. |
| 168 | 168 | </para> |
| 169 | 169 | <caution> |
| 170 | 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 | 172 | como foram definidos na classe de configuração. |
| 173 | 173 | </para> |
| 174 | 174 | </caution> |
| ... | ... | @@ -332,58 +332,42 @@ untypedClass=package.MyOtherClass |
| 332 | 332 | <entry> |
| 333 | 333 | <para> |
| 334 | 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 | 336 | Se temos em nossa aplicação uma classe de configuração como a mostrada abaixo: |
| 337 | 337 | </para> |
| 338 | 338 | <programlisting role="JAVA"><![CDATA[ |
| 339 | 339 | @Configuration |
| 340 | 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 | 348 | ]]></programlisting> |
| 355 | 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 | 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 | 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 | 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 | 361 | <tip> |
| 375 | 362 | <para> |
| 376 | 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 | 371 | </tip> |
| 388 | 372 | <para> |
| 389 | 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 | 411 | </row> |
| 428 | 412 | </tbody> |
| 429 | 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 | 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 | 58 | public Object getValue(String prefix, String key, Field field, Configuration configuration) throws Exception { |
| 59 | 59 | String value = configuration.getString(prefix + key); |
| 60 | 60 | |
| 61 | - if (value!=null){ | |
| 61 | + if (value!=null && !value.trim().equals("")){ | |
| 62 | 62 | Object enums[] = field.getType().getEnumConstants(); |
| 63 | 63 | |
| 64 | 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 | 46 | |
| 47 | 47 | private ListOfEnum anotherValue; |
| 48 | 48 | |
| 49 | + private ListOfEnum emptyValue; | |
| 50 | + | |
| 49 | 51 | public ListOfEnum getEnumValue() { |
| 50 | 52 | return enumValue; |
| 51 | 53 | } |
| ... | ... | @@ -53,4 +55,8 @@ public abstract class AbstractEnumValueConfig implements Serializable { |
| 53 | 55 | public ListOfEnum getAnotherValue() { |
| 54 | 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 | 74 | public void loadEnumConfig(){ |
| 75 | 75 | Assert.assertEquals(ListOfEnum.VALUE_2, propertiesEnumConfig.getEnumValue()); |
| 76 | 76 | Assert.assertEquals(ListOfEnum.VALUE_2, xmlEnumConfig.getEnumValue()); |
| 77 | + Assert.assertNull(propertiesEnumConfig.getEmptyValue()); | |
| 77 | 78 | } |
| 78 | 79 | |
| 79 | 80 | @Test(expected=ConfigurationException.class) | ... | ... |
impl/core/src/test/resources/configuration/field/enumeration/demoiselle.properties