Commit 79ddb531556a870e514cbd693c9348ef7e7cec3d

Authored by Dancovich
2 parents 2612fd9c 78c36c78
Exists in master

Merge branch 'master' of https://github.com/demoiselle/framework.git

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ê 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 +}