Commit 79ddb531556a870e514cbd693c9348ef7e7cec3d
Exists in
master
Merge branch 'master' of https://github.com/demoiselle/framework.git
Showing
22 changed files
with
387 additions
and
141 deletions
Show diff stats
documentation/reference/pt-BR/arquetipo.xml
@@ -6,9 +6,9 @@ | @@ -6,9 +6,9 @@ | ||
6 | <title>Arquétipos</title> | 6 | <title>Arquétipos</title> |
7 | 7 | ||
8 | <para> | 8 | <para> |
9 | - Como o projeto Demoiselle recomenda e usa a ferramenta <ulink url="http://maven.apache.org/">Apache-Maven</ulink> , para gerenciamento do ciclo de vida do desenvolvimento | 9 | + O projeto Demoiselle recomenda e usa a ferramenta <ulink url="http://maven.apache.org/">Apache-Maven</ulink> , para gerenciamento do ciclo de vida do desenvolvimento |
10 | de projeto. Baseada nesta ferramenta, além do fornecimento dos POMs Parentes, também fornece as estruturas chamadas <ulink url="http://maven.apache.org/archetype/maven-archetype-plugin/">arquétipos</ulink> | 10 | de projeto. Baseada nesta ferramenta, além do fornecimento dos POMs Parentes, também fornece as estruturas chamadas <ulink url="http://maven.apache.org/archetype/maven-archetype-plugin/">arquétipos</ulink> |
11 | - para facilitar a criação de aplicações, garantido a estrutura recomendada pelo framework e conceito de gerenciamento do próprio Maven. | 11 | + para facilitar a criação de aplicações, garantido a estrutura recomendada pelo framework e o conceito de gerenciamento do próprio Maven. |
12 | Atualmente estão disponíveis os seguintes artefatos: | 12 | Atualmente estão disponíveis os seguintes artefatos: |
13 | </para> | 13 | </para> |
14 | 14 | ||
@@ -27,7 +27,7 @@ | @@ -27,7 +27,7 @@ | ||
27 | é baseado no Demoiselle-JSF-Parent, | 27 | é baseado no Demoiselle-JSF-Parent, |
28 | e que já traz uma estrutura padrão de pacotes e todas | 28 | e que já traz uma estrutura padrão de pacotes e todas |
29 | as dependências necessárias para rodar a aplicação. Ao usar este | 29 | as dependências necessárias para rodar a aplicação. Ao usar este |
30 | - arquétipo, você já terá uma pequena aplicação de | 30 | + arquétipo, você terá uma pequena aplicação de |
31 | Bookmarks já pronta para rodar. Para isto, basta instalá-la em um | 31 | Bookmarks já pronta para rodar. Para isto, basta instalá-la em um |
32 | servidor da sua preferência! Para mais detalhes | 32 | servidor da sua preferência! Para mais detalhes |
33 | sobre esta aplicação de exemplo e em como usar o arquétipo, acesse | 33 | sobre esta aplicação de exemplo e em como usar o arquétipo, acesse |
documentation/reference/pt-BR/arquitetura.xml
@@ -30,7 +30,9 @@ | @@ -30,7 +30,9 @@ | ||
30 | Já os Componentes são artefatos separados e que, portanto, não são dependentes diretamente do Core. Aliás, os | 30 | Já os Componentes são artefatos separados e que, portanto, não são dependentes diretamente do Core. Aliás, os |
31 | Componentes podem até mesmo existir sem referenciar o Core. Desta forma, o seu ciclo de vida é totalmente | 31 | Componentes podem até mesmo existir sem referenciar o Core. Desta forma, o seu ciclo de vida é totalmente |
32 | independente do Core e Extensões. Um componente não precisa, necessariamente, estender o comportamento do Core, mas | 32 | independente do Core e Extensões. Um componente não precisa, necessariamente, estender o comportamento do Core, mas |
33 | - permitir disponibilizar novas funcionalidades ao usuário. Um exemplo é o <literal>demoiselle-validation</literal>. | 33 | + permitir disponibilizar novas funcionalidades ao usuário. Outra diferença importante é que, diferente de Core e |
34 | + Extensões, os Componentes não necessariamente são aderentes a alguma especificação. Um exemplo é o | ||
35 | + <literal>demoiselle-validation</literal>. | ||
34 | </para> | 36 | </para> |
35 | </section> | 37 | </section> |
36 | 38 |
documentation/reference/pt-BR/authorgroup.xml
@@ -8,9 +8,17 @@ | @@ -8,9 +8,17 @@ | ||
8 | </author> | 8 | </author> |
9 | <author> | 9 | <author> |
10 | <firstname>Emerson</firstname> | 10 | <firstname>Emerson</firstname> |
11 | + <surname>Oliveira</surname> | ||
12 | + </author> | ||
13 | + <author> | ||
14 | + <firstname>Emerson</firstname> | ||
11 | <surname>Saito</surname> | 15 | <surname>Saito</surname> |
12 | </author> | 16 | </author> |
13 | <author> | 17 | <author> |
18 | + <firstname>Luciano</firstname> | ||
19 | + <surname>Borges</surname> | ||
20 | + </author> | ||
21 | + <author> | ||
14 | <firstname>Marlon</firstname> | 22 | <firstname>Marlon</firstname> |
15 | <surname>Carvalho</surname> | 23 | <surname>Carvalho</surname> |
16 | </author> | 24 | </author> |
@@ -34,12 +42,4 @@ | @@ -34,12 +42,4 @@ | ||
34 | <firstname>Wilson</firstname> | 42 | <firstname>Wilson</firstname> |
35 | <surname>Guimarães</surname> | 43 | <surname>Guimarães</surname> |
36 | </author> | 44 | </author> |
37 | - <author> | ||
38 | - <firstname>Emerson</firstname> | ||
39 | - <surname>Oliveira</surname> | ||
40 | - </author> | ||
41 | - <author> | ||
42 | - <firstname>Luciano</firstname> | ||
43 | - <surname>Borges</surname> | ||
44 | - </author> | ||
45 | </authorgroup> | 45 | </authorgroup> |
documentation/reference/pt-BR/bookinfo.xml
@@ -3,11 +3,11 @@ | @@ -3,11 +3,11 @@ | ||
3 | "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" []> | 3 | "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" []> |
4 | <bookinfo> | 4 | <bookinfo> |
5 | 5 | ||
6 | - <title>Framework Demoiselle 2.2.0</title> | 6 | + <title>Framework Demoiselle 2.3.0</title> |
7 | <subtitle>Guia de Referência</subtitle> | 7 | <subtitle>Guia de Referência</subtitle> |
8 | 8 | ||
9 | - <abstract>Demoiselle 2.2.0: Framework de Código Aberto para o Desenvolvimento de Aplicações Java EE 6</abstract> | ||
10 | - <titleabbrev>Demoiselle 2.2.0 - Guia de Referência</titleabbrev> | 9 | + <abstract>Demoiselle 2.3.0: Framework de Código Aberto para o Desenvolvimento de Aplicações Java EE 6</abstract> |
10 | + <titleabbrev>Demoiselle 2.3.0 - Guia de Referência</titleabbrev> | ||
11 | 11 | ||
12 | <xi:include href="revhistory.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> | 12 | <xi:include href="revhistory.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> |
13 | <xi:include href="authorgroup.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> | 13 | <xi:include href="authorgroup.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> |
documentation/reference/pt-BR/configuracao.xml
@@ -46,6 +46,7 @@ | @@ -46,6 +46,7 @@ | ||
46 | </para> | 46 | </para> |
47 | </section> | 47 | </section> |
48 | 48 | ||
49 | + <!-- | ||
49 | <section> | 50 | <section> |
50 | <title>Configurando</title> | 51 | <title>Configurando</title> |
51 | <para> | 52 | <para> |
@@ -64,6 +65,7 @@ | @@ -64,6 +65,7 @@ | ||
64 | ]]> | 65 | ]]> |
65 | </programlisting> | 66 | </programlisting> |
66 | </section> | 67 | </section> |
68 | + --> | ||
67 | 69 | ||
68 | <section> | 70 | <section> |
69 | <title>As classes de configuração</title> | 71 | <title>As classes de configuração</title> |
@@ -233,7 +235,8 @@ general.load.initial.data = true | @@ -233,7 +235,8 @@ general.load.initial.data = true | ||
233 | <para> | 235 | <para> |
234 | Além de <literal>String</literal> e <literal>boolean</literal>, existe a possibilidade de se recuperar valores de qualquer | 236 | Além de <literal>String</literal> e <literal>boolean</literal>, existe a possibilidade de se recuperar valores de qualquer |
235 | tipo primitivo do Java (i.e., <literal>int, byte, short, char, long, float, double</literal> e <literal>boolean</literal>) | 237 | tipo primitivo do Java (i.e., <literal>int, byte, short, char, long, float, double</literal> e <literal>boolean</literal>) |
236 | - e também arrays desses tipos. | 238 | + e também arrays desses tipos e de alguns tipos complexos (i.e., <literal>Integer, BigDecimal, BigInteger, Calendar, Date, |
239 | + Color, Locale, URL</literal> e <literal>String</literal>). | ||
237 | </para> | 240 | </para> |
238 | </tip> | 241 | </tip> |
239 | </section> | 242 | </section> |
documentation/reference/pt-BR/controlador.xml
@@ -42,7 +42,7 @@ | @@ -42,7 +42,7 @@ | ||
42 | public @interface SeuController { | 42 | public @interface SeuController { |
43 | }]]></programlisting> | 43 | }]]></programlisting> |
44 | <para> | 44 | <para> |
45 | - Neste exemplo foi criado um controlador chamado <literal>SeuController</literal> quem tem a característica de ter um escopo de | 45 | + Neste exemplo foi criado um controlador chamado <literal>SeuController</literal> que tem a característica de ter um escopo de |
46 | View. Isto quer dizer que toda classe que seja desse tipo de controlador, também terá o escopo de View. | 46 | View. Isto quer dizer que toda classe que seja desse tipo de controlador, também terá o escopo de View. |
47 | </para> | 47 | </para> |
48 | <!-- TODO: qual a vantagem em se criar um controlador customizado? incluir um exemplo possível e prático de utilização disso --> | 48 | <!-- TODO: qual a vantagem em se criar um controlador customizado? incluir um exemplo possível e prático de utilização disso --> |
documentation/reference/pt-BR/excecao.xml
@@ -122,10 +122,10 @@ public class Simples { | @@ -122,10 +122,10 @@ public class Simples { | ||
122 | <section> | 122 | <section> |
123 | <title>Exceção de Aplicação</title> | 123 | <title>Exceção de Aplicação</title> |
124 | <para> | 124 | <para> |
125 | - Imagine que você precise informar que caso um determinado tipo de exceção seja lançado através do seu método, a transação atual sofrerá um <emphasis>rollback</emphasis>. | ||
126 | - Ou, então, que haja necessidade de informar o grau de severidade da exceção, de forma que uma camada de apresentação específica a trate de forma | ||
127 | - diferenciada. Estas duas opções são possíveis através do uso da anotação <literal>@ApplicationException</literal>. Utilize-a em suas exceções e informe | ||
128 | - os atributos <literal>rollback</literal> e <literal>severity</literal> para alcançar os objetivos acima. | 125 | + Imagine que você precise informar que caso um determinado tipo de exceção seja lançado através do seu método, a transação atual sofrerá um |
126 | + <emphasis>rollback</emphasis>. Ou, então, que haja necessidade de informar o grau de severidade da exceção, de forma que uma camada de apresentação | ||
127 | + específica a trate de forma diferenciada. Estas duas opções são possíveis através do uso da anotação <literal>@ApplicationException</literal>. | ||
128 | + Utilize-a em suas exceções e informe os atributos <literal>rollback</literal> e <literal>severity</literal> para alcançar os objetivos acima. | ||
129 | </para> | 129 | </para> |
130 | <programlisting role="JAVA"><![CDATA[@ApplicationException(rollback=true, severity=SeverityType.INFO) | 130 | <programlisting role="JAVA"><![CDATA[@ApplicationException(rollback=true, severity=SeverityType.INFO) |
131 | public class MinhaException extends Exception { | 131 | public class MinhaException extends Exception { |
@@ -141,14 +141,15 @@ public class MinhaException extends Exception { | @@ -141,14 +141,15 @@ public class MinhaException extends Exception { | ||
141 | <section> | 141 | <section> |
142 | <title>Tratamento Padrão</title> | 142 | <title>Tratamento Padrão</title> |
143 | <para> | 143 | <para> |
144 | - As exceções lançadas a partir da camada de negócio, ou de persistência, não causam a interrupção de sua aplicação. Muito menos, apresentam a tela padrão de erro do JSF ou | ||
145 | - de outra tecnologia de visão. Qualquer exceção lançada, e que chega até a camada de apresentação, recebe um tratamento especial. Inicialmente, ela é encapsulada de forma | ||
146 | - que possa ser exibida de forma elegante para o usuário. No caso do JSF, é utilizado o mecanismo de Messages próprio desta tecnologia. | 144 | + As exceções lançadas a partir da camada de negócio, ou de persistência, não causam a interrupção de sua aplicação. Muito menos, apresentam a tela |
145 | + padrão de erro do JSF ou de outra tecnologia de visão. Qualquer exceção lançada, e que chega até a camada de apresentação, recebe um tratamento | ||
146 | + especial. Inicialmente, ela é encapsulada de forma que possa ser exibida de forma elegante para o usuário. No caso do JSF, é utilizado o mecanismo | ||
147 | + de Messages próprio desta tecnologia. | ||
147 | </para> | 148 | </para> |
148 | <para> | 149 | <para> |
149 | - No caso do Vaadin, o tratamento é bem semelhante, contudo, a exceção é tratada de forma que possa ser exibida adotando os mecanismos próprios da tecnologia. No caso de | ||
150 | - exceções que não usam a anotação <literal>@ApplicationException</literal>, um <emphasis>rollback</emphasis> é realizado de forma automática. Por último, sem o uso desta | ||
151 | - anotação, toda exceção é vista como tendo nível de gravidade igual a <literal>ERROR</literal>. | 150 | + No caso do Vaadin, o tratamento é bem semelhante, contudo, a exceção é tratada de forma que possa ser exibida adotando os mecanismos próprios da |
151 | + tecnologia. No caso de exceções que não usam a anotação <literal>@ApplicationException</literal>, um <emphasis>rollback</emphasis> é realizado | ||
152 | + de forma automática. Por último, sem o uso desta anotação, toda exceção é vista como tendo nível de gravidade igual a <literal>ERROR</literal>. | ||
152 | </para> | 153 | </para> |
153 | </section> | 154 | </section> |
154 | 155 |
documentation/reference/pt-BR/inicializacao.xml
@@ -36,25 +36,27 @@ | @@ -36,25 +36,27 @@ | ||
36 | <para> | 36 | <para> |
37 | As instruções contidas em um método anotado com <literal>@Startup</literal> serão executadas automaticamente quando a aplicação | 37 | As instruções contidas em um método anotado com <literal>@Startup</literal> serão executadas automaticamente quando a aplicação |
38 | Java for inicializada, seja ela hospedada em um contêiner Web ou executada através de um método <literal>main()</literal>. | 38 | Java for inicializada, seja ela hospedada em um contêiner Web ou executada através de um método <literal>main()</literal>. |
39 | - Nenhum outro arquivo ou classe precisa ser definido. A anotação <literal>@Startup</literal> permite a indicação do argumento | ||
40 | - <literal>priority</literal>, um número inteiro que serve para definir a prioridade de execução do respectivo método na existência | ||
41 | - de mais de um inicializador para a aplicação. | 39 | + Nenhum outro arquivo ou classe precisa ser definido. A anotação <literal>@Startup</literal> pode ser utilizada em conjunto com a anotação |
40 | + <literal>@Priority</literal>, que recebe como parametro um número inteiro que serve para definir a prioridade de execução do respectivo | ||
41 | + método, na existência de mais de um inicializador para a aplicação. | ||
42 | </para> | 42 | </para> |
43 | <para> | 43 | <para> |
44 | De maneira análoga, um método anotado com <literal>@Shutdown</literal> será executado no momento de finalização de uma aplicação, | 44 | De maneira análoga, um método anotado com <literal>@Shutdown</literal> será executado no momento de finalização de uma aplicação, |
45 | - obedecendo também à ordem de prioridade definida com o argumento <literal>priority</literal>. | 45 | + obedecendo também à ordem de prioridade definida com a anotação <literal>@Priority</literal>. |
46 | </para> | 46 | </para> |
47 | <para> | 47 | <para> |
48 | Eis um exemplo de implementação de inicializador em uma aplicação: | 48 | Eis um exemplo de implementação de inicializador em uma aplicação: |
49 | </para> | 49 | </para> |
50 | <programlisting role="JAVA"><![CDATA[public class BookmarkInitializer { | 50 | <programlisting role="JAVA"><![CDATA[public class BookmarkInitializer { |
51 | 51 | ||
52 | - @Startup(priority = 1) | 52 | + @Startup |
53 | + @Priority(1) | ||
53 | public void initialize() { | 54 | public void initialize() { |
54 | ... | 55 | ... |
55 | } | 56 | } |
56 | 57 | ||
57 | - @Shutdown(priority = 5) | 58 | + @Shutdown |
59 | + @Priority(5) | ||
58 | public void finalize() { | 60 | public void finalize() { |
59 | ... | 61 | ... |
60 | } | 62 | } |
@@ -64,7 +66,7 @@ | @@ -64,7 +66,7 @@ | ||
64 | <para> | 66 | <para> |
65 | Para a definição de prioridade de execução de um método na inicialização ou finalização, podem ser | 67 | Para a definição de prioridade de execução de um método na inicialização ou finalização, podem ser |
66 | utilizadas as constantes <literal>MIN_PRIORITY</literal> ou <literal>MAX_PRIORITY</literal> presentes em | 68 | utilizadas as constantes <literal>MIN_PRIORITY</literal> ou <literal>MAX_PRIORITY</literal> presentes em |
67 | - <literal>br.gov.frameworkdemoiselle.annotation.Startup</literal>. | 69 | + <literal>br.gov.frameworkdemoiselle.annotation.Priority</literal>. |
68 | </para> | 70 | </para> |
69 | </tip> | 71 | </tip> |
70 | </section> | 72 | </section> |
@@ -75,11 +77,11 @@ | @@ -75,11 +77,11 @@ | ||
75 | Eis um interessante caso de uso de inicialização e finalização: rodar um servidor de modo standalone em paralelo à | 77 | Eis um interessante caso de uso de inicialização e finalização: rodar um servidor de modo standalone em paralelo à |
76 | execução da aplicação principal. Eis o código referente à essa implementação: | 78 | execução da aplicação principal. Eis o código referente à essa implementação: |
77 | </para> | 79 | </para> |
78 | - <programlisting role="JAVA"><![CDATA[import br.gov.frameworkdemoiselle.annotation.Shutdown; | ||
79 | -import br.gov.frameworkdemoiselle.annotation.Startup; | 80 | + <programlisting role="JAVA"><![CDATA[import br.gov.frameworkdemoiselle.lifecycle.Shutdown; |
81 | +import br.gov.frameworkdemoiselle.lifecycle.Startup; | ||
80 | 82 | ||
81 | -import static br.gov.frameworkdemoiselle.annotation.Startup.MAX_PRIORITY; | ||
82 | -import static br.gov.frameworkdemoiselle.annotation.Startup.MIN_PRIORITY; | 83 | +import static br.gov.frameworkdemoiselle.annotation.Priority.MAX_PRIORITY; |
84 | +import static br.gov.frameworkdemoiselle.annotation.Priority.MIN_PRIORITY; | ||
83 | 85 | ||
84 | public class DatabaseServer { | 86 | public class DatabaseServer { |
85 | 87 | ||
@@ -93,12 +95,14 @@ public class DatabaseServer { | @@ -93,12 +95,14 @@ public class DatabaseServer { | ||
93 | server.setSilent(true); | 95 | server.setSilent(true); |
94 | } | 96 | } |
95 | 97 | ||
96 | - @Startup(priority = MAX_PRIORITY) | 98 | + @Startup |
99 | + @Priority(MAX_PRIORITY) | ||
97 | public void startup() { | 100 | public void startup() { |
98 | server.start(); | 101 | server.start(); |
99 | } | 102 | } |
100 | 103 | ||
101 | - @Shutdown(priority = MIN_PRIORITY) | 104 | + @Shutdown |
105 | + @Priority (MIN_PRIORITY) | ||
102 | public void shutdown() { | 106 | public void shutdown() { |
103 | server.stop(); | 107 | server.stop(); |
104 | } | 108 | } |
documentation/reference/pt-BR/intro.xml
@@ -18,16 +18,13 @@ | @@ -18,16 +18,13 @@ | ||
18 | <para> | 18 | <para> |
19 | O nome <emphasis>Demoiselle</emphasis> | 19 | O nome <emphasis>Demoiselle</emphasis> |
20 | é uma homenagem à série de aeroplanos construídos por Santos Dummont entre 1907 e 1909. Também conhecido como | 20 | é uma homenagem à série de aeroplanos construídos por Santos Dummont entre 1907 e 1909. Também conhecido como |
21 | - <emphasis>Libellule</emphasis>, as Demoiselles foram os melhores, | ||
22 | - menores e mais baratos aviões da sua época. Como sua intenção era popularizar a | ||
23 | - aviação com fabricação em larga escala, o inventor disponibilizou os planos em revistas técnicas para qualquer pessoa | ||
24 | - que se interessasse. | 21 | + <emphasis>Libellule</emphasis>, as Demoiselles foram os melhores, menores e mais baratos aviões da sua época. Como |
22 | + sua intenção era popularizar a aviação com fabricação em larga escala, o inventor disponibilizou os planos em revistas | ||
23 | + técnicas para qualquer pessoa que se interessasse. | ||
25 | </para> | 24 | </para> |
26 | <para> | 25 | <para> |
27 | - O <emphasis>framework Demoiselle</emphasis> | ||
28 | - usa a mesma filosofia do <quote>Pai da Aviação</quote>, | ||
29 | - tendo sido disponibilizado como software livre em abril de 2009, sob a | ||
30 | - licença livre LGPL version 3. Mais informações no portal | 26 | + O <emphasis>framework Demoiselle</emphasis> usa a mesma filosofia do <quote>Pai da Aviação</quote>, tendo sido |
27 | + disponibilizado como software livre em abril de 2009, sob a licença livre LGPL version 3. Mais informações no portal | ||
31 | <ulink url="http://www.frameworkdemoiselle.gov.br">"www.frameworkdemoiselle.gov.br</ulink> | 28 | <ulink url="http://www.frameworkdemoiselle.gov.br">"www.frameworkdemoiselle.gov.br</ulink> |
32 | </para> | 29 | </para> |
33 | </section> | 30 | </section> |
documentation/reference/pt-BR/master.xml
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | </para> | 14 | </para> |
15 | <note> | 15 | <note> |
16 | <para> | 16 | <para> |
17 | - Esta documentação refere-se à release 2.2 do <emphasis>Framework Demoiselle</emphasis> | 17 | + Esta documentação refere-se à release 2.3 do <emphasis>Framework Demoiselle</emphasis> |
18 | e pode diferir significativamente das versões anteriores. | 18 | e pode diferir significativamente das versões anteriores. |
19 | </para> | 19 | </para> |
20 | </note> | 20 | </note> |
documentation/reference/pt-BR/mensagem.xml
@@ -8,8 +8,8 @@ | @@ -8,8 +8,8 @@ | ||
8 | <section> | 8 | <section> |
9 | <title>Mensagens em uma aplicação</title> | 9 | <title>Mensagens em uma aplicação</title> |
10 | <para> | 10 | <para> |
11 | - Uma aplicação bem estruturada, seja na plataforma Web ou desktop, deve exibir mensagens informativas, | ||
12 | - de aviso ou de erro ao usuário após efetuar determinadas tarefas. Por exemplo, após gravar um registro | 11 | + Uma aplicação bem estruturada, seja na plataforma Web ou Desktop, deve exibir mensagens informativas, |
12 | + de aviso, ou de erro para o usuário após efetuar determinadas tarefas. Por exemplo, após gravar um registro | ||
13 | no banco de dados, é aconselhável que a aplicação exiba uma mensagem informativa. Se alguma exceção | 13 | no banco de dados, é aconselhável que a aplicação exiba uma mensagem informativa. Se alguma exceção |
14 | ocorreu, é preciso exibir uma mensagem de erro. Ou seja, a severidade da mensagem deve ser escolhida de | 14 | ocorreu, é preciso exibir uma mensagem de erro. Ou seja, a severidade da mensagem deve ser escolhida de |
15 | acordo com o resultado da execução. | 15 | acordo com o resultado da execução. |
documentation/reference/pt-BR/paginacao.xml
@@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
20 | A apresentação de conjuntos de registros de médio a grande porte em formato de tabelas em aplicações Web geralmente requer um | 20 | A apresentação de conjuntos de registros de médio a grande porte em formato de tabelas em aplicações Web geralmente requer um |
21 | <emphasis>mecanismo de paginação</emphasis>, o qual permite ao cliente ver apenas um pedaço do resultado final, podendo este | 21 | <emphasis>mecanismo de paginação</emphasis>, o qual permite ao cliente ver apenas um pedaço do resultado final, podendo este |
22 | navegar para frente e para trás através dos registros. A menos que o conjunto de registros seja garantidamente pequeno, qualquer | 22 | navegar para frente e para trás através dos registros. A menos que o conjunto de registros seja garantidamente pequeno, qualquer |
23 | - aplicação do tipo Web com funcionalidades de busca precisa ser dotada de paginação. | 23 | + aplicação do tipo Web com funcionalidades de busca e/ou listagem de registros, precisa ser dotada de paginação. |
24 | </para> | 24 | </para> |
25 | <para> | 25 | <para> |
26 | O mecanismo de paginação para as aplicações fornecido pelo <emphasis>Demoiselle Framework</emphasis> consiste em um algoritmo | 26 | O mecanismo de paginação para as aplicações fornecido pelo <emphasis>Demoiselle Framework</emphasis> consiste em um algoritmo |
documentation/reference/pt-BR/parametro.xml
@@ -43,7 +43,7 @@ | @@ -43,7 +43,7 @@ | ||
43 | nome diferente ao objeto, ele pode anotá-lo com <literal>@Name</literal> e no valor dessa anotação, colocar o | 43 | nome diferente ao objeto, ele pode anotá-lo com <literal>@Name</literal> e no valor dessa anotação, colocar o |
44 | nome do parâmetro. Por default o objeto criado tem o escopo de request, mas é possível usar o escopo de sessão | 44 | nome do parâmetro. Por default o objeto criado tem o escopo de request, mas é possível usar o escopo de sessão |
45 | ou de visão, bastando anotar o objeto com <literal>@SessionScoped</literal> ou <literal>@ViewScoped</literal>, | 45 | ou de visão, bastando anotar o objeto com <literal>@SessionScoped</literal> ou <literal>@ViewScoped</literal>, |
46 | - respectivamente. Veja abaixo como ficaria essa passagem de parãmetros na versão 2.X do Demoiselle. | 46 | + respectivamente. Veja abaixo como ficaria essa passagem de parâmetros na versão 2.X do Demoiselle. |
47 | </para> | 47 | </para> |
48 | <para> | 48 | <para> |
49 | Passagem do parâmetro | 49 | Passagem do parâmetro |
documentation/reference/pt-BR/parentsPom.xml
@@ -32,19 +32,34 @@ Assim, a alteração no POM.XML da aplicação será a minima possível. Outra v | @@ -32,19 +32,34 @@ Assim, a alteração no POM.XML da aplicação será a minima possível. Outra v | ||
32 | </section> | 32 | </section> |
33 | 33 | ||
34 | <section> | 34 | <section> |
35 | - <title>Demoiselle-WEB-Parent</title> | 35 | + <title>Demoiselle-SE-Parent</title> |
36 | <para> | 36 | <para> |
37 | - Especialização do POM mínimo, contendo configurações úteis para todas as aplicações JEE6/Web que utilizam o Demoiselle, mas sem a definição de | ||
38 | - qual camada de apresentação utilizará. | 37 | + Especialização do POM mínimo, contendo configurações úteis para todas as aplicações <!-- SE -->Desktop que utilizam o framework, mas sem definição da |
38 | + camada de apresentação que será utilizada. | ||
39 | + </para> | ||
40 | + </section> | ||
41 | + | ||
42 | + <section> | ||
43 | + <title>Demoiselle-Servlet-Parent</title> | ||
44 | + <para> | ||
45 | + Especialização do POM mínimo, contendo profiles para Tomcat 6, Tomcat 7, GAE, Glassfish 3, JBoss 6 e JBoss 7, e outras configurações úteis para todas | ||
46 | + as aplicações JEE6/Web que utilizam o Demoiselle, mas sem a definição de qual camada de apresentação utilizará. Entre as dependências referênciadas | ||
47 | + por este POM está a extensão Demoiselle-Servlet. | ||
39 | </para> | 48 | </para> |
40 | </section> | 49 | </section> |
41 | 50 | ||
42 | <section> | 51 | <section> |
43 | <title>Demoiselle-JSF-Parent</title> | 52 | <title>Demoiselle-JSF-Parent</title> |
44 | <para> | 53 | <para> |
45 | - Especialização do POM demoiselle-web-parent, contendo configurações úteis e necessárias para todas as aplicações que utilizarão a tecnologia JSF2 | ||
46 | - para camada de apresentação. | ||
47 | - Entre as dependências referênciadas por este POM está obviamente a extensão Demoiselle-JSF. | 54 | + Especialização do POM demoiselle-servlet-parent, contendo configurações úteis e necessárias para todas as aplicações que utilizarão a tecnologia JSF2 |
55 | + para camada de apresentação. Entre as dependências referênciadas por este POM está obviamente a extensão Demoiselle-JSF. | ||
56 | + </para> | ||
57 | + </section> | ||
58 | + | ||
59 | + <section> | ||
60 | + <title>Demoiselle-Archetype-Parent</title> | ||
61 | + <para> | ||
62 | + Contém configurações comuns a todos os projetos geradores de arquétipos. | ||
48 | </para> | 63 | </para> |
49 | </section> | 64 | </section> |
50 | 65 |
documentation/reference/pt-BR/properties.xml
@@ -8,14 +8,14 @@ | @@ -8,14 +8,14 @@ | ||
8 | <para> | 8 | <para> |
9 | Em um projeto com o <emphasis>Demoiselle Framework</emphasis>, algumas propriedades e configurações | 9 | Em um projeto com o <emphasis>Demoiselle Framework</emphasis>, algumas propriedades e configurações |
10 | do <emphasis>Framework</emphasis> podem ser ajustadas no arquivo <literal>demoiselle.properties</literal>. | 10 | do <emphasis>Framework</emphasis> podem ser ajustadas no arquivo <literal>demoiselle.properties</literal>. |
11 | - Além disso, a partir da versão 2.3.0 também é nesse arquivo que devem ser definidas as estratégias de | ||
12 | - <emphasis>Transação</emphasis>, <emphasis>Autorização</emphasis> e <emphasis>Autenticação</emphasis>. | 11 | + <!--Além disso, a partir da versão 2.3.0 também é nesse arquivo que devem ser definidas as estratégias de |
12 | + <emphasis>Transação</emphasis>, <emphasis>Autorização</emphasis> e <emphasis>Autenticação</emphasis>. | ||
13 | </para> | 13 | </para> |
14 | - <para> | 14 | + <para>--> |
15 | A seguir listamos as propriedades e configurações do <emphasis>Demoiselle Framework</emphasis> que o usuário pode modificar, | 15 | A seguir listamos as propriedades e configurações do <emphasis>Demoiselle Framework</emphasis> que o usuário pode modificar, |
16 | - acompanhados de alguns exemplos ilustrativos. Também mostraremos como escolher as estratégias para | 16 | + acompanhados de alguns exemplos ilustrativos. <!-- Também mostraremos como escolher as estratégias para |
17 | <emphasis>Transação</emphasis>, <emphasis>Autorização</emphasis> e <emphasis>Autenticação</emphasis>, oferecidas pelo | 17 | <emphasis>Transação</emphasis>, <emphasis>Autorização</emphasis> e <emphasis>Autenticação</emphasis>, oferecidas pelo |
18 | - <emphasis>Demoiselle</emphasis>. | 18 | + <emphasis>Demoiselle</emphasis>. --> |
19 | </para> | 19 | </para> |
20 | 20 | ||
21 | <section> | 21 | <section> |
@@ -151,7 +151,7 @@ | @@ -151,7 +151,7 @@ | ||
151 | </para> | 151 | </para> |
152 | </section> | 152 | </section> |
153 | 153 | ||
154 | - <section> | 154 | + <!-- <section> |
155 | <title>Escolhendo Estratégias</title> | 155 | <title>Escolhendo Estratégias</title> |
156 | <para> | 156 | <para> |
157 | Para escolher as estratégias de <emphasis>Transação</emphasis>, <emphasis>Autorização</emphasis> e <emphasis>Autenticação</emphasis> | 157 | Para escolher as estratégias de <emphasis>Transação</emphasis>, <emphasis>Autorização</emphasis> e <emphasis>Autenticação</emphasis> |
@@ -184,5 +184,5 @@ | @@ -184,5 +184,5 @@ | ||
184 | As instruções para você construir e utilizar sua própria estratégia estãodescritas nos capítulos <link linkend="transacao">Transação</link> | 184 | As instruções para você construir e utilizar sua própria estratégia estãodescritas nos capítulos <link linkend="transacao">Transação</link> |
185 | e <link linkend="security">Segurança</link>. | 185 | e <link linkend="security">Segurança</link>. |
186 | </para> | 186 | </para> |
187 | - </section> | 187 | + </section> --> |
188 | </chapter> | 188 | </chapter> |
documentation/reference/pt-BR/security.xml
@@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
20 | <section> | 20 | <section> |
21 | <title>Configurando</title> | 21 | <title>Configurando</title> |
22 | <para> | 22 | <para> |
23 | - Para um correto funcionamento do Demoiselle é necessário inserir od interceptadores de segurança no arquivo <filename>src/main/WEB-INF/beans.xml</filename>. | 23 | + Para um correto funcionamento do Demoiselle é necessário inserir os interceptadores de segurança no arquivo <filename>src/main/WEB-INF/beans.xml</filename>. |
24 | </para> | 24 | </para> |
25 | <programlisting role="XML"> | 25 | <programlisting role="XML"> |
26 | <![CDATA[ | 26 | <![CDATA[ |
@@ -179,10 +179,11 @@ public class Credential { | @@ -179,10 +179,11 @@ public class Credential { | ||
179 | Após toda essa explicação, fica a dúvida: como implementar um esquema de segurança sem utilizar a extensão existente? | 179 | Após toda essa explicação, fica a dúvida: como implementar um esquema de segurança sem utilizar a extensão existente? |
180 | </para> | 180 | </para> |
181 | <para> | 181 | <para> |
182 | - O primeiro passo é criar classes para implementar as interfaces Authenticator e Authorizer. Essas classes devem ser | ||
183 | - anotadas com @Alternative para que o CDI saiba que se trata de uma estratégia: | 182 | + O primeiro passo é criar classes para implementar as interfaces Authenticator e Authorizer. O <literal>Demoiselle</literal> detecta automaticamente |
183 | + a implementação, e torna essa classe a implementação padrão dessas interfaces:<!-- Essas classes devem ser | ||
184 | + anotadas com @Alternative para que o CDI saiba que se trata de uma estratégia: --> | ||
184 | </para> | 185 | </para> |
185 | - <programlisting role="JAVA"><![CDATA[@Alternative | 186 | + <programlisting role="JAVA"><![CDATA[ |
186 | public class MeuAuthenticator implements Authenticator { | 187 | public class MeuAuthenticator implements Authenticator { |
187 | 188 | ||
188 | @Override | 189 | @Override |
@@ -204,7 +205,7 @@ public class MeuAuthenticator implements Authenticator { | @@ -204,7 +205,7 @@ public class MeuAuthenticator implements Authenticator { | ||
204 | } | 205 | } |
205 | 206 | ||
206 | }]]></programlisting> | 207 | }]]></programlisting> |
207 | - <programlisting role="JAVA"><![CDATA[@Alternative | 208 | + <programlisting role="JAVA"><![CDATA[ |
208 | public class MeuAuthorizer implements Authorizer { | 209 | public class MeuAuthorizer implements Authorizer { |
209 | 210 | ||
210 | @Override | 211 | @Override |
@@ -220,19 +221,30 @@ public class MeuAuthorizer implements Authorizer { | @@ -220,19 +221,30 @@ public class MeuAuthorizer implements Authorizer { | ||
220 | } | 221 | } |
221 | 222 | ||
222 | }]]></programlisting> | 223 | }]]></programlisting> |
223 | - <para> | 224 | + <!-- <para> |
224 | Feito isso deve-se definir no arquivo <filename>demoiselle.properties</filename>, as classes criadas: | 225 | Feito isso deve-se definir no arquivo <filename>demoiselle.properties</filename>, as classes criadas: |
225 | </para> | 226 | </para> |
226 | <programlisting> | 227 | <programlisting> |
227 | frameworkdemoiselle.security.authenticator.class=projeto.MeuAuthenticator | 228 | frameworkdemoiselle.security.authenticator.class=projeto.MeuAuthenticator |
228 | frameworkdemoiselle.security.authorizer.class=projeto.MeuAuthorizer | 229 | frameworkdemoiselle.security.authorizer.class=projeto.MeuAuthorizer |
229 | - </programlisting> | 230 | + </programlisting> --> |
230 | <para> | 231 | <para> |
231 | - À partir desse momento, a aplicação já possui uma implementação de segurança definida. | 232 | + Pronto! Sua aplicação já possui uma implementação de segurança definida. Caso sua ela não implemente essas interfaces, no momento em que |
233 | + forem chamadas, o framework lançará uma exceção informando que a aplicação precisa implementá-las. | ||
232 | </para> | 234 | </para> |
235 | + <para> | ||
236 | + Se você tem mais de uma implementação de <literal>Authenticator</literal> e/ou <literal>Authorizer</literal> (o que pode acontecer, por exemplo, quando | ||
237 | + se necessite de uma implementação na aplicação principal, e outra para os testes), deverá definir no arquivo <filename>demoiselle.properties</filename> | ||
238 | + qual classe será a padrão: | ||
239 | + <programlisting> | ||
240 | + frameworkdemoiselle.security.authenticator.class=projeto.MeuAuthenticatorPadrao | ||
241 | + frameworkdemoiselle.security.authorizer.class=projeto.MeuAuthorizerPadrao | ||
242 | + </programlisting> | ||
243 | + </para> | ||
233 | </section> | 244 | </section> |
234 | - <caution> <para>O Demoiselle também oferece o componente <ulink url="http://demoiselle.sourceforge.net/docs/demoiselle-guide-components/1.2.0/html/authorization-master.html">Authorization</ulink> | ||
235 | - que facilita o uso de segurança com JAAS. Obviamente, não é possível utilizá-los ao mesmo tempo. Há arquétipos Maven que já trazem esse componente como dependência, por isso sempre confira o arquivo | ||
236 | - POM.XML e se for o caso retire esse dependência.</para> </caution> | 245 | + <caution> <para>O Demoiselle também oferece o componente |
246 | + <ulink url="http://demoiselle.sourceforge.net/docs/demoiselle-guide-components/1.2.0/html/authorization-master.html">Authorization</ulink> | ||
247 | + que facilita o uso de segurança com JAAS. Obviamente, não é possível utilizá-los ao mesmo tempo. Há arquétipos Maven que já trazem esse componente | ||
248 | + como dependência, por isso sempre confira o arquivo POM.XML e se for o caso retire essa dependência.</para> </caution> | ||
237 | 249 | ||
238 | </chapter> | 250 | </chapter> |
239 | \ No newline at end of file | 251 | \ No newline at end of file |
documentation/reference/pt-BR/transacao.xml
@@ -6,8 +6,8 @@ | @@ -6,8 +6,8 @@ | ||
6 | <title>Transação</title> | 6 | <title>Transação</title> |
7 | 7 | ||
8 | <para> | 8 | <para> |
9 | - Esta funcionalidade utiliza os recursos do CDI para interceptar e delegar o tratamento adequado das transações | ||
10 | - para quem é de direito. Em outras palavras, não reinventamos a roda. Criamos algumas estratégias de delegação e | 9 | + Esta funcionalidade utiliza os recursos do CDI para interceptar e delegar adequadamente o tratamento das transações. |
10 | + Em outras palavras, não reinventamos a roda. Criamos algumas estratégias de delegação e | ||
11 | controle de transação com base no que está sendo mais utilizado no mercado, algumas mais simples de configurar, | 11 | controle de transação com base no que está sendo mais utilizado no mercado, algumas mais simples de configurar, |
12 | outras mais completas para utilizar. | 12 | outras mais completas para utilizar. |
13 | </para> | 13 | </para> |
@@ -74,7 +74,7 @@ public class Simples { | @@ -74,7 +74,7 @@ public class Simples { | ||
74 | <title>E se acontecer uma Exception?</title> | 74 | <title>E se acontecer uma Exception?</title> |
75 | <para> | 75 | <para> |
76 | Caso ocorra uma exceção na execução de um método transacional o mecanismo fará rollback na transação | 76 | Caso ocorra uma exceção na execução de um método transacional o mecanismo fará rollback na transação |
77 | - automaticamente. É possível mudar este comportamento utilizando exceções de aplicação. | 77 | + automaticamente. É possível mudar este comportamento utilizando exceções de aplicação (para maiores detalhes ver <link linkend="excecao">Exceção</link>). |
78 | </para> | 78 | </para> |
79 | <programlisting role="JAVA"><![CDATA[@ApplicationException(rollback = false) | 79 | <programlisting role="JAVA"><![CDATA[@ApplicationException(rollback = false) |
80 | public class AbacaxiException { | 80 | public class AbacaxiException { |
@@ -103,7 +103,12 @@ public class AbacaxiException { | @@ -103,7 +103,12 @@ public class AbacaxiException { | ||
103 | </para> | 103 | </para> |
104 | <para> | 104 | <para> |
105 | Você pode optar também por não utilizar controle de transação. Neste caso, basta não utilizar a anotação <literal>@Transactional</literal>. Contudo, | 105 | Você pode optar também por não utilizar controle de transação. Neste caso, basta não utilizar a anotação <literal>@Transactional</literal>. Contudo, |
106 | - caso você a utilize e não defina qual estratégia deseja utilizar, o framework lançará uma exceção lhe avisando sobre isto! | 106 | + caso você a utilize, você poderá escolher entre as estratégias JPA, JTA (ambas fornecidas pelo <literal>Framework</literal>) e uma estratégia que você |
107 | + pode criar ou importar para seu projeto. | ||
108 | + </para> | ||
109 | + <para> | ||
110 | + A forma de selecionar cada uma dessas estratégias é descrita abaixo. Caso tente utilizar o controle de transação e não selecione nenhuma estratégia, | ||
111 | + o framework lançará uma exceção lhe avisando sobre isto! | ||
107 | </para> | 112 | </para> |
108 | </section> | 113 | </section> |
109 | 114 | ||
@@ -118,11 +123,16 @@ public class AbacaxiException { | @@ -118,11 +123,16 @@ public class AbacaxiException { | ||
118 | </para> | 123 | </para> |
119 | <para> | 124 | <para> |
120 | A transação JPA é simples de configurar e não exige nenhum recurso externo à sua aplicação. | 125 | A transação JPA é simples de configurar e não exige nenhum recurso externo à sua aplicação. |
121 | - Basta definir no arquivo <filename>demoiselle.properties</filename> a seguinte configuração: | 126 | + Para utilizá-la basta que seu projeto adicione no arquivo POM.XML dependência à extensão <literal>demoiselle-jpa</literal>, que o |
127 | + Demoiselle fará a seleção por essa estratégia de forma automática. | ||
128 | +<!-- Basta definir no arquivo <filename>demoiselle.properties</filename> a seguinte configuração: --> | ||
122 | </para> | 129 | </para> |
130 | + | ||
131 | + <!-- | ||
123 | <programlisting> | 132 | <programlisting> |
124 | frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JPATransaction | 133 | frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JPATransaction |
125 | </programlisting> | 134 | </programlisting> |
135 | + --> | ||
126 | <tip><para> Caso não esteja utilizando o arquétipo JSF-JPA fornecidos pelo Demoiselle, confira se a dependência para a | 136 | <tip><para> Caso não esteja utilizando o arquétipo JSF-JPA fornecidos pelo Demoiselle, confira se a dependência para a |
127 | extensão está indicada corretamente no arquivo POM.XML.</para> | 137 | extensão está indicada corretamente no arquivo POM.XML.</para> |
128 | <programlisting role="XML"><![CDATA[<dependency> | 138 | <programlisting role="XML"><![CDATA[<dependency> |
@@ -135,17 +145,24 @@ public class AbacaxiException { | @@ -135,17 +145,24 @@ public class AbacaxiException { | ||
135 | <section> | 145 | <section> |
136 | <title>Estratégia JTA</title> | 146 | <title>Estratégia JTA</title> |
137 | <para> | 147 | <para> |
138 | - Esta estratégia, também está disponível através de uma extensão: <literal>demoiselle-jta</literal> e é | 148 | + Esta estratégia, também está disponível através de uma extensão (<literal>demoiselle-jta</literal>), e é |
139 | responsável por delegar o controle de transação para um container JEE. Com a <literal>JTATransaction</literal> | 149 | responsável por delegar o controle de transação para um container JEE. Com a <literal>JTATransaction</literal> |
140 | é possível incluir várias unidades de persistência de uma mesma aplicação no mesmo contexto transacional. | 150 | é possível incluir várias unidades de persistência de uma mesma aplicação no mesmo contexto transacional. |
141 | Isso mesmo, o famoso <emphasis>Two-Phase Commit (2PC)</emphasis>. | 151 | Isso mesmo, o famoso <emphasis>Two-Phase Commit (2PC)</emphasis>. |
142 | </para> | 152 | </para> |
143 | <para> | 153 | <para> |
144 | A estratégia JTA não serve apenas para persistência em banco de dados, serve também para integrar com | 154 | A estratégia JTA não serve apenas para persistência em banco de dados, serve também para integrar com |
145 | - tecnologias que façam acesso ao contexto JTA, como é o caso do EJB. Para ativar esta estratégia defina no | 155 | + tecnologias que façam acesso ao contexto JTA, como é o caso do EJB. Para ativar esta estratégia basta |
156 | + que seu projeto adicione no arquivo POM.XML a dependência à extensão <literal>demoiselle-jta</literal>, que o | ||
157 | + Demoiselle fará a seleção por essa estratégia de forma automática, pois essa estratégia tem prioridade em relação | ||
158 | + a estratégia JPA. | ||
159 | + </para> | ||
160 | + <!-- | ||
161 | + defina no | ||
146 | arquivo <filename>demoiselle.properties</filename> a seguinte configuração: | 162 | arquivo <filename>demoiselle.properties</filename> a seguinte configuração: |
147 | </para> | 163 | </para> |
148 | <programlisting>frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JTATransaction</programlisting> | 164 | <programlisting>frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JTATransaction</programlisting> |
165 | + --> | ||
149 | <para> | 166 | <para> |
150 | Feito isto, o controle transacional será delegado para a transação acessível via JNDI com o nome | 167 | Feito isto, o controle transacional será delegado para a transação acessível via JNDI com o nome |
151 | <literal>UserTransaction</literal>. A estratégia acessa o objeto da seguinte maneira: | 168 | <literal>UserTransaction</literal>. A estratégia acessa o objeto da seguinte maneira: |
@@ -156,14 +173,15 @@ public class AbacaxiException { | @@ -156,14 +173,15 @@ public class AbacaxiException { | ||
156 | É preciso também informar no arquivo <filename>persistence.xml</filename> o endereço da conexão | 173 | É preciso também informar no arquivo <filename>persistence.xml</filename> o endereço da conexão |
157 | JTA gerenciada. Veja um exemplo utilizando o servidor de aplicações JBoss-AS6 e com o provider Hibernate (embutido no JBoss-AS) como implementação JPA: | 174 | JTA gerenciada. Veja um exemplo utilizando o servidor de aplicações JBoss-AS6 e com o provider Hibernate (embutido no JBoss-AS) como implementação JPA: |
158 | </para> | 175 | </para> |
159 | - <programlisting role="XML"><![CDATA[<?xml version="1.0" encoding="UTF-8"?> | ||
160 | -<persistence version="2.0" | 176 | + <programlisting role="XML"><![CDATA[ |
177 | + <?xml version="1.0" encoding="UTF-8"?> | ||
178 | + <persistence version="2.0" | ||
161 | xmlns="http://java.sun.com/xml/ns/persistence" | 179 | xmlns="http://java.sun.com/xml/ns/persistence" |
162 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | 180 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
163 | xsi:schemaLocation="http://java.sun.com/xml/ns/persistence | 181 | xsi:schemaLocation="http://java.sun.com/xml/ns/persistence |
164 | http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> | 182 | http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> |
165 | 183 | ||
166 | - <persistence-unit name="bookmark-ds" transaction-type="JTA"> | 184 | + <persistence-unit name="bookmark-ds" transaction-type="JTA"> |
167 | <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> | 185 | <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> |
168 | <properties> | 186 | <properties> |
169 | <property name="hibernate.show_sql" value="true" /> | 187 | <property name="hibernate.show_sql" value="true" /> |
@@ -172,12 +190,13 @@ public class AbacaxiException { | @@ -172,12 +190,13 @@ public class AbacaxiException { | ||
172 | <property name="hibernate.transaction.jta.platform" | 190 | <property name="hibernate.transaction.jta.platform" |
173 | value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> | 191 | value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> |
174 | </properties> | 192 | </properties> |
175 | - </persistence-unit> | ||
176 | -</persistence>]]></programlisting> | 193 | + </persistence-unit> |
194 | + </persistence>]]></programlisting> | ||
177 | 195 | ||
178 | <tip><para> Caso não esteja utilizando o arquétipo JSF-JPA fornecidos pelo Demoiselle, confira se a dependência para a | 196 | <tip><para> Caso não esteja utilizando o arquétipo JSF-JPA fornecidos pelo Demoiselle, confira se a dependência para a |
179 | extensão está indicada corretamente, no arquivo POM.XML.</para> | 197 | extensão está indicada corretamente, no arquivo POM.XML.</para> |
180 | - <programlisting role="XML"><![CDATA[<dependency> | 198 | + <programlisting role="XML"><![CDATA[ |
199 | + <dependency> | ||
181 | <groupId>br.gov.frameworkdemoiselle</groupId> | 200 | <groupId>br.gov.frameworkdemoiselle</groupId> |
182 | <artifactId>demoiselle-jta</artifactId> | 201 | <artifactId>demoiselle-jta</artifactId> |
183 | <scope>compile</scope> | 202 | <scope>compile</scope> |
@@ -190,19 +209,19 @@ public class AbacaxiException { | @@ -190,19 +209,19 @@ public class AbacaxiException { | ||
190 | <para> | 209 | <para> |
191 | Caso nenhuma das estratégias oferecidas sirva para você, crie a sua. Basta escrever uma | 210 | Caso nenhuma das estratégias oferecidas sirva para você, crie a sua. Basta escrever uma |
192 | classe não-final que implemente a interface <literal>Transaction</literal> do pacote | 211 | classe não-final que implemente a interface <literal>Transaction</literal> do pacote |
193 | - <literal>br.gov.frameworkdemoiselle.transaction</literal>. Anote a classe com | 212 | + <literal>br.gov.frameworkdemoiselle.transaction</literal>. <!--Anote a classe com |
194 | <literal>@SessionScoped</literal> e <literal>@Alternative</literal> para que o CDI saiba | 213 | <literal>@SessionScoped</literal> e <literal>@Alternative</literal> para que o CDI saiba |
195 | - que se trata de uma estratégia. É preciso que sua classe não possua construtores explícitos ou | 214 | + que se trata de uma estratégia.-->É preciso que sua classe não possua construtores explícitos ou |
196 | que possua um construtor público sem parâmetros. É possível fazer injeções nesta classe. | 215 | que possua um construtor público sem parâmetros. É possível fazer injeções nesta classe. |
197 | </para> | 216 | </para> |
217 | + <!-- import javax.enterprise.context.SessionScoped; | ||
218 | + import javax.enterprise.inject.Alternative; | ||
219 | + @Alternative | ||
220 | + @SessionScoped --> | ||
198 | <programlisting role="JAVA"><![CDATA[package projeto; | 221 | <programlisting role="JAVA"><![CDATA[package projeto; |
199 | 222 | ||
200 | -import javax.enterprise.context.SessionScoped; | ||
201 | -import javax.enterprise.inject.Alternative; | ||
202 | import br.gov.frameworkdemoiselle.transaction.Transaction; | 223 | import br.gov.frameworkdemoiselle.transaction.Transaction; |
203 | 224 | ||
204 | -@Alternative | ||
205 | -@SessionScoped | ||
206 | public class MegaTransaction implements Transaction { | 225 | public class MegaTransaction implements Transaction { |
207 | 226 | ||
208 | public void begin() { } | 227 | public void begin() { } |
@@ -224,10 +243,34 @@ public class MegaTransaction implements Transaction { | @@ -224,10 +243,34 @@ public class MegaTransaction implements Transaction { | ||
224 | } | 243 | } |
225 | ]]></programlisting> | 244 | ]]></programlisting> |
226 | <para> | 245 | <para> |
246 | + Pronto, é só isso! Agora, os métodos anotados com <literal>@Transactional</literal> irão utilizar a estratégia criada em seu projeto de forma automática, | ||
247 | + mesmo que as extensões <literal>demoiselle-jpa</literal> e <literal>demoiselle-jta</literal> sejam adicionadas ao projeto, pois o framework da prioridade | ||
248 | + máxima à estratégia criada no projeto. | ||
249 | + </para> | ||
250 | +<!-- <para> | ||
227 | Basta agora definir no arquivo <filename>demoiselle.properties</filename> a sua estratégia: | 251 | Basta agora definir no arquivo <filename>demoiselle.properties</filename> a sua estratégia: |
228 | </para> | 252 | </para> |
229 | <programlisting> | 253 | <programlisting> |
230 | frameworkdemoiselle.transaction.class=projeto.MegaTransaction | 254 | frameworkdemoiselle.transaction.class=projeto.MegaTransaction |
255 | + </programlisting>--> | ||
256 | + </section> | ||
257 | + | ||
258 | + <section> | ||
259 | + <title>Escolhendo estratégias manualmente</title> | ||
260 | + <para> | ||
261 | + Existem alguns casos nos quais você vai ter que definir a estratégia manualmente. Um exemplo é quando seu projeto implementa mais do que uma estratégia | ||
262 | + de transação. Outra situação pode acontecer em casos de teste, nos quais você queira utilizar estratégia diferente. Nesses casos você deve definir no | ||
263 | + arquivo <filename>demoiselle.properties</filename> qual estratégia será utilizada. Veja alguns exemplos de definição de estratégias própria, | ||
264 | + <literal>JTATransaction</literal> e <literal>JPATransaction</literal> (importante notar que apenas uma estratégia pode estar ativa por vez): | ||
265 | + </para> | ||
266 | + <programlisting> | ||
267 | + frameworkdemoiselle.transaction.class=projeto.MyTransaction | ||
268 | + </programlisting> | ||
269 | + <programlisting> | ||
270 | + frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JTATransaction | ||
271 | + </programlisting> | ||
272 | + <programlisting> | ||
273 | + frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JPATransaction | ||
231 | </programlisting> | 274 | </programlisting> |
232 | </section> | 275 | </section> |
233 | 276 |
impl/core/src/test/java/br/gov/frameworkdemoiselle/internal/implementation/MessageContextImplTest.java
@@ -145,12 +145,42 @@ public class MessageContextImplTest { | @@ -145,12 +145,42 @@ public class MessageContextImplTest { | ||
145 | }; | 145 | }; |
146 | } | 146 | } |
147 | 147 | ||
148 | -// @Test | ||
149 | -// public void testAddMessage() { | ||
150 | -// messageContext.add(m1); | ||
151 | -// Assert.assertTrue(messageContext.getMessages().size() == 1); | ||
152 | -// Assert.assertTrue(messageContext.getMessages().contains(m1)); | ||
153 | -// } | 148 | + @Test |
149 | + public void testAddMessage() { | ||
150 | + messageContext.add(m1); | ||
151 | + Assert.assertTrue(messageContext.getMessages().size() == 1); | ||
152 | + Assert.assertTrue(messageContext.getMessages().get(0).getText().equals(m1.getText())); | ||
153 | + Assert.assertTrue(messageContext.getMessages().get(0).getSeverity().equals(m1.getSeverity())); | ||
154 | + } | ||
155 | + | ||
156 | + @Test | ||
157 | + public void testClearMessages() { | ||
158 | + Assert.assertTrue(messageContext.getMessages().isEmpty()); | ||
159 | + | ||
160 | + messageContext.add(m1); | ||
161 | + messageContext.add(m1, null); | ||
162 | + | ||
163 | + Assert.assertTrue(messageContext.getMessages().size() == 2); | ||
164 | + | ||
165 | + messageContext.clear(); | ||
166 | + | ||
167 | + Assert.assertTrue(messageContext.getMessages().isEmpty()); | ||
168 | + } | ||
169 | + | ||
170 | + @Test | ||
171 | + public void testGetMessages() { | ||
172 | + Assert.assertNotNull(messageContext.getMessages()); | ||
173 | + Assert.assertTrue(messageContext.getMessages().isEmpty()); | ||
174 | + | ||
175 | + messageContext.add("key1"); | ||
176 | + Assert.assertTrue(messageContext.getMessages().size() == 1); | ||
177 | + | ||
178 | + messageContext.add("key2"); | ||
179 | + Assert.assertTrue(messageContext.getMessages().size() == 2); | ||
180 | + | ||
181 | + Assert.assertTrue(messageContext.getMessages().get(0).getText().equals("key1")); | ||
182 | + Assert.assertTrue(messageContext.getMessages().get(1).getText().equals("key2")); | ||
183 | + } | ||
154 | 184 | ||
155 | // @Test | 185 | // @Test |
156 | // public void testAddMessageObjectArray() { | 186 | // public void testAddMessageObjectArray() { |
@@ -224,19 +254,5 @@ public class MessageContextImplTest { | @@ -224,19 +254,5 @@ public class MessageContextImplTest { | ||
224 | // Assert.assertTrue(messageContext.getMessages().get(0).getParameters()[1] == param[1]); | 254 | // Assert.assertTrue(messageContext.getMessages().get(0).getParameters()[1] == param[1]); |
225 | // } | 255 | // } |
226 | 256 | ||
227 | - @Test | ||
228 | - public void testGetMessages() { | ||
229 | - Assert.assertNotNull(messageContext.getMessages()); | ||
230 | - Assert.assertTrue(messageContext.getMessages().isEmpty()); | ||
231 | - | ||
232 | - messageContext.add("key1"); | ||
233 | - Assert.assertTrue(messageContext.getMessages().size() == 1); | ||
234 | - | ||
235 | - messageContext.add("key2"); | ||
236 | - Assert.assertTrue(messageContext.getMessages().size() == 2); | ||
237 | - | ||
238 | - Assert.assertTrue(messageContext.getMessages().get(0).getText().equals("key1")); | ||
239 | - Assert.assertTrue(messageContext.getMessages().get(1).getText().equals("key2")); | ||
240 | - } | ||
241 | 257 | ||
242 | } | 258 | } |
243 | \ No newline at end of file | 259 | \ No newline at end of file |
impl/core/src/test/java/br/gov/frameworkdemoiselle/internal/implementation/PaginationContextImplTest.java
@@ -36,34 +36,40 @@ | @@ -36,34 +36,40 @@ | ||
36 | */ | 36 | */ |
37 | package br.gov.frameworkdemoiselle.internal.implementation; | 37 | package br.gov.frameworkdemoiselle.internal.implementation; |
38 | 38 | ||
39 | +import static org.easymock.EasyMock.expect; | ||
39 | import static org.junit.Assert.assertEquals; | 40 | import static org.junit.Assert.assertEquals; |
40 | import static org.junit.Assert.assertNotNull; | 41 | import static org.junit.Assert.assertNotNull; |
41 | import static org.junit.Assert.assertNull; | 42 | import static org.junit.Assert.assertNull; |
43 | +import static org.powermock.api.easymock.PowerMock.mockStatic; | ||
44 | +import static org.powermock.api.easymock.PowerMock.replayAll; | ||
42 | 45 | ||
43 | import java.util.HashMap; | 46 | import java.util.HashMap; |
44 | import java.util.Map; | 47 | import java.util.Map; |
45 | 48 | ||
46 | import org.easymock.EasyMock; | 49 | import org.easymock.EasyMock; |
47 | import org.junit.After; | 50 | import org.junit.After; |
48 | -import org.junit.Before; | ||
49 | import org.junit.Test; | 51 | import org.junit.Test; |
50 | import org.junit.runner.RunWith; | 52 | import org.junit.runner.RunWith; |
51 | import org.powermock.api.easymock.PowerMock; | 53 | import org.powermock.api.easymock.PowerMock; |
54 | +import org.powermock.core.classloader.annotations.PrepareForTest; | ||
52 | import org.powermock.modules.junit4.PowerMockRunner; | 55 | import org.powermock.modules.junit4.PowerMockRunner; |
53 | import org.powermock.reflect.Whitebox; | 56 | import org.powermock.reflect.Whitebox; |
54 | 57 | ||
55 | import br.gov.frameworkdemoiselle.internal.configuration.PaginationConfig; | 58 | import br.gov.frameworkdemoiselle.internal.configuration.PaginationConfig; |
56 | import br.gov.frameworkdemoiselle.pagination.Pagination; | 59 | import br.gov.frameworkdemoiselle.pagination.Pagination; |
57 | import br.gov.frameworkdemoiselle.pagination.PaginationContext; | 60 | import br.gov.frameworkdemoiselle.pagination.PaginationContext; |
61 | +import br.gov.frameworkdemoiselle.util.Beans; | ||
58 | 62 | ||
59 | @RunWith(PowerMockRunner.class) | 63 | @RunWith(PowerMockRunner.class) |
64 | +@PrepareForTest(Beans.class) | ||
60 | public class PaginationContextImplTest { | 65 | public class PaginationContextImplTest { |
61 | 66 | ||
62 | private PaginationContext context; | 67 | private PaginationContext context; |
63 | 68 | ||
69 | + private PaginationConfig config = new PaginationConfig(); | ||
70 | + | ||
64 | private Pagination pagination; | 71 | private Pagination pagination; |
65 | 72 | ||
66 | - @Before | ||
67 | public void setUp() { | 73 | public void setUp() { |
68 | context = new PaginationContextImpl(); | 74 | context = new PaginationContextImpl(); |
69 | 75 | ||
@@ -87,21 +93,38 @@ public class PaginationContextImplTest { | @@ -87,21 +93,38 @@ public class PaginationContextImplTest { | ||
87 | 93 | ||
88 | return map; | 94 | return map; |
89 | } | 95 | } |
96 | + | ||
97 | + @Test | ||
98 | + public void testNullPaginationConfig() { | ||
99 | + context = new PaginationContextImpl(); | ||
100 | + | ||
101 | + mockStatic(Beans.class); | ||
102 | + expect(Beans.getReference(PaginationConfig.class)).andReturn(config).anyTimes(); | ||
103 | + replayAll(Beans.class); | ||
104 | + | ||
105 | + assertNotNull(context.getPagination(Object.class, true)); | ||
106 | + } | ||
90 | 107 | ||
91 | @Test | 108 | @Test |
92 | public void testGetPaginationWithoutCreateParameter() { | 109 | public void testGetPaginationWithoutCreateParameter() { |
110 | + setUp(); | ||
111 | + | ||
93 | assertEquals(pagination, context.getPagination(getClass())); | 112 | assertEquals(pagination, context.getPagination(getClass())); |
94 | assertNull(context.getPagination(Object.class)); | 113 | assertNull(context.getPagination(Object.class)); |
95 | } | 114 | } |
96 | 115 | ||
97 | @Test | 116 | @Test |
98 | public void testGetPaginationWithCreateParameterTrueValued() { | 117 | public void testGetPaginationWithCreateParameterTrueValued() { |
118 | + setUp(); | ||
119 | + | ||
99 | assertEquals(pagination, context.getPagination(getClass(), true)); | 120 | assertEquals(pagination, context.getPagination(getClass(), true)); |
100 | assertNotNull(context.getPagination(Object.class, true)); | 121 | assertNotNull(context.getPagination(Object.class, true)); |
101 | } | 122 | } |
102 | 123 | ||
103 | @Test | 124 | @Test |
104 | public void testGetPaginationWithCreateParameterFalseValued() { | 125 | public void testGetPaginationWithCreateParameterFalseValued() { |
126 | + setUp(); | ||
127 | + | ||
105 | assertEquals(pagination, context.getPagination(getClass(), false)); | 128 | assertEquals(pagination, context.getPagination(getClass(), false)); |
106 | assertNull(context.getPagination(Object.class, false)); | 129 | assertNull(context.getPagination(Object.class, false)); |
107 | } | 130 | } |
impl/core/src/test/java/br/gov/frameworkdemoiselle/internal/implementation/TransactionInfoTest.java
0 → 100644
@@ -0,0 +1,85 @@ | @@ -0,0 +1,85 @@ | ||
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.internal.implementation; | ||
38 | + | ||
39 | +import org.junit.Assert; | ||
40 | +import org.junit.Test; | ||
41 | + | ||
42 | + | ||
43 | +public class TransactionInfoTest { | ||
44 | + | ||
45 | + private TransactionInfo transactionInfo = new TransactionInfo(); | ||
46 | + | ||
47 | + @Test | ||
48 | + public void testMarkAsOwner(){ | ||
49 | + transactionInfo.markAsOwner(); | ||
50 | + Assert.assertTrue(transactionInfo.isOwner()); | ||
51 | + } | ||
52 | + | ||
53 | + @Test | ||
54 | + public void testIncrementCounter() { | ||
55 | + int count = transactionInfo.getCounter(); | ||
56 | + | ||
57 | + transactionInfo.incrementCounter(); | ||
58 | + Assert.assertEquals(count+1, transactionInfo.getCounter()); | ||
59 | + | ||
60 | + transactionInfo.incrementCounter(); | ||
61 | + Assert.assertEquals(count+2, transactionInfo.getCounter()); | ||
62 | + } | ||
63 | + | ||
64 | + @Test | ||
65 | + public void testDecrementCounter() { | ||
66 | + int count = transactionInfo.getCounter(); | ||
67 | + | ||
68 | + transactionInfo.incrementCounter(); | ||
69 | + Assert.assertEquals(count+1, transactionInfo.getCounter()); | ||
70 | + | ||
71 | + transactionInfo.decrementCounter(); | ||
72 | + Assert.assertEquals(count, transactionInfo.getCounter()); | ||
73 | + } | ||
74 | + | ||
75 | + @Test | ||
76 | + public void testClear() { | ||
77 | + transactionInfo.incrementCounter(); | ||
78 | + transactionInfo.markAsOwner(); | ||
79 | + | ||
80 | + transactionInfo.clear(); | ||
81 | + | ||
82 | + Assert.assertEquals(0, transactionInfo.getCounter()); | ||
83 | + Assert.assertFalse(transactionInfo.isOwner()); | ||
84 | + } | ||
85 | +} |
impl/core/src/test/java/br/gov/frameworkdemoiselle/internal/interceptor/TransactionalInterceptorTest.java
@@ -35,22 +35,36 @@ | @@ -35,22 +35,36 @@ | ||
35 | * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | 35 | * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. |
36 | */ | 36 | */ |
37 | package br.gov.frameworkdemoiselle.internal.interceptor; | 37 | package br.gov.frameworkdemoiselle.internal.interceptor; |
38 | + | ||
38 | import static org.easymock.EasyMock.expect; | 39 | import static org.easymock.EasyMock.expect; |
39 | -import static org.easymock.EasyMock.replay; | ||
40 | import static org.easymock.EasyMock.verify; | 40 | import static org.easymock.EasyMock.verify; |
41 | import static org.junit.Assert.assertEquals; | 41 | import static org.junit.Assert.assertEquals; |
42 | import static org.junit.Assert.assertTrue; | 42 | import static org.junit.Assert.assertTrue; |
43 | import static org.junit.Assert.fail; | 43 | import static org.junit.Assert.fail; |
44 | +import static org.powermock.api.easymock.PowerMock.mockStatic; | ||
45 | +import static org.powermock.api.easymock.PowerMock.replay; | ||
46 | +import static org.powermock.api.easymock.PowerMock.replayAll; | ||
47 | + | ||
48 | +import java.util.Locale; | ||
44 | 49 | ||
50 | +import javax.enterprise.inject.Instance; | ||
45 | import javax.interceptor.InvocationContext; | 51 | import javax.interceptor.InvocationContext; |
46 | 52 | ||
47 | import org.easymock.EasyMock; | 53 | import org.easymock.EasyMock; |
48 | -import org.junit.Ignore; | 54 | +import org.junit.Before; |
49 | import org.junit.Test; | 55 | import org.junit.Test; |
56 | +import org.junit.runner.RunWith; | ||
57 | +import org.powermock.core.classloader.annotations.PrepareForTest; | ||
58 | +import org.powermock.modules.junit4.PowerMockRunner; | ||
50 | 59 | ||
51 | import br.gov.frameworkdemoiselle.DemoiselleException; | 60 | import br.gov.frameworkdemoiselle.DemoiselleException; |
61 | +import br.gov.frameworkdemoiselle.internal.implementation.TransactionInfo; | ||
52 | import br.gov.frameworkdemoiselle.transaction.Transaction; | 62 | import br.gov.frameworkdemoiselle.transaction.Transaction; |
53 | -@Ignore | 63 | +import br.gov.frameworkdemoiselle.transaction.TransactionContext; |
64 | +import br.gov.frameworkdemoiselle.util.Beans; | ||
65 | + | ||
66 | +@RunWith(PowerMockRunner.class) | ||
67 | +@PrepareForTest(Beans.class) | ||
54 | public class TransactionalInterceptorTest { | 68 | public class TransactionalInterceptorTest { |
55 | 69 | ||
56 | private TransactionalInterceptor interceptor; | 70 | private TransactionalInterceptor interceptor; |
@@ -59,6 +73,8 @@ public class TransactionalInterceptorTest { | @@ -59,6 +73,8 @@ public class TransactionalInterceptorTest { | ||
59 | 73 | ||
60 | private Transaction transaction; | 74 | private Transaction transaction; |
61 | 75 | ||
76 | + private TransactionContext transactionContext; | ||
77 | + | ||
62 | class ClassWithMethod { | 78 | class ClassWithMethod { |
63 | 79 | ||
64 | public void method() { | 80 | public void method() { |
@@ -66,26 +82,35 @@ public class TransactionalInterceptorTest { | @@ -66,26 +82,35 @@ public class TransactionalInterceptorTest { | ||
66 | } | 82 | } |
67 | } | 83 | } |
68 | 84 | ||
69 | - // @Before | ||
70 | - // @SuppressWarnings("unchecked") | ||
71 | - // public void setUp() throws Exception { | ||
72 | - // Instance<Transaction> transactionInstance = EasyMock.createMock(Instance.class); | ||
73 | - // Instance<TransactionInfo> transactionContextInstance = EasyMock.createMock(Instance.class); | ||
74 | - // | ||
75 | - // Logger logger = EasyMock.createMock(Logger.class); | ||
76 | - // ResourceBundle bundle = new ResourceBundle("demoiselle-core-bundle", Locale.getDefault()); | ||
77 | - // transaction = EasyMock.createMock(Transaction.class); | ||
78 | - // TransactionInfo context = new TransactionInfo(); | ||
79 | - // | ||
80 | - // this.interceptor = new TransactionalInterceptor(transactionInstance, transactionContextInstance, logger, bundle); | ||
81 | - // this.ic = EasyMock.createMock(InvocationContext.class); | ||
82 | - // | ||
83 | - // expect(transactionInstance.get()).andReturn(transaction).anyTimes(); | ||
84 | - // expect(transactionContextInstance.get()).andReturn(context).anyTimes(); | ||
85 | - // expect(this.ic.proceed()).andReturn(null); | ||
86 | - // expect(this.ic.getMethod()).andReturn(ClassWithMethod.class.getMethod("method")); | ||
87 | - // replay(this.ic, transactionInstance, transactionContextInstance); | ||
88 | - // } | 85 | + @Before |
86 | + @SuppressWarnings("unchecked") | ||
87 | + public void setUp() throws Exception { | ||
88 | + Instance<Transaction> transactionInstance = EasyMock.createMock(Instance.class); | ||
89 | + Instance<TransactionInfo> transactionInfoInstance = EasyMock.createMock(Instance.class); | ||
90 | + Instance<TransactionContext> transactionContextInstance = EasyMock.createMock(Instance.class); | ||
91 | + | ||
92 | + TransactionInfo transactionInfo = new TransactionInfo(); | ||
93 | + transaction = EasyMock.createMock(Transaction.class); | ||
94 | + this.transactionContext = EasyMock.createMock(TransactionContext.class); | ||
95 | + this.ic = EasyMock.createMock(InvocationContext.class); | ||
96 | + | ||
97 | + mockStatic(Beans.class); | ||
98 | + expect(Beans.getReference(Locale.class)).andReturn(Locale.getDefault()); | ||
99 | + expect(Beans.getReference(TransactionContext.class)).andReturn(transactionContext); | ||
100 | + expect(Beans.getReference(TransactionInfo.class)).andReturn(transactionInfo); | ||
101 | + | ||
102 | + expect(transactionInstance.get()).andReturn(transaction).anyTimes(); | ||
103 | + expect(transactionContextInstance.get()).andReturn(transactionContext).anyTimes(); | ||
104 | + expect(transactionInfoInstance.get()).andReturn(transactionInfo).anyTimes(); | ||
105 | + expect(transactionContext.getCurrentTransaction()).andReturn(transaction).anyTimes(); | ||
106 | + expect(this.ic.proceed()).andReturn(null); | ||
107 | + expect(this.ic.getMethod()).andReturn(ClassWithMethod.class.getMethod("method")); | ||
108 | + replayAll(Beans.class, this.ic, transactionContextInstance, transactionInfoInstance, transactionInstance, | ||
109 | + transactionContext); | ||
110 | + | ||
111 | + this.interceptor = new TransactionalInterceptor(); | ||
112 | + | ||
113 | + } | ||
89 | 114 | ||
90 | @Test | 115 | @Test |
91 | public void testManageWithInativeTransactionAndTransactionInterceptorBeginAndDoNotIsMarkedRollback() | 116 | public void testManageWithInativeTransactionAndTransactionInterceptorBeginAndDoNotIsMarkedRollback() |
impl/core/src/test/java/br/gov/frameworkdemoiselle/transaction/TransactionExceptionTest.java
0 → 100644
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +package br.gov.frameworkdemoiselle.transaction; | ||
2 | + | ||
3 | +import java.sql.SQLException; | ||
4 | + | ||
5 | +import junit.framework.Assert; | ||
6 | + | ||
7 | +import org.junit.Test; | ||
8 | + | ||
9 | + | ||
10 | +public class TransactionExceptionTest { | ||
11 | + | ||
12 | + SQLException cause = new SQLException(); | ||
13 | + | ||
14 | + @Test | ||
15 | + public void testTransactionException() { | ||
16 | + TransactionException test = new TransactionException(cause); | ||
17 | + Assert.assertEquals("java.sql.SQLException", test.getCause().toString()); | ||
18 | + } | ||
19 | + | ||
20 | +} |