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,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 |