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