diff --git a/documentation/quickstart/.gitignore b/documentation/quickstart/.gitignore
deleted file mode 100644
index 8cf413e..0000000
--- a/documentation/quickstart/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-/bin
-/target
-/.project
-/.classpath
-/.settings
-/.externalToolBuilders
-/.DS_Store
-/target
diff --git a/documentation/quickstart/pt-BR/authorgroup.xml b/documentation/quickstart/pt-BR/authorgroup.xml
deleted file mode 100755
index 073205b..0000000
--- a/documentation/quickstart/pt-BR/authorgroup.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- Emerson
- Oliveira
-
-
- Emerson
- Saito
-
-
- Luciano
- Borges
-
-
- Marlon
- Carvalho
-
-
- Rodrigo
- Hjort
-
-
- Serge
- Rehem
-
-
\ No newline at end of file
diff --git a/documentation/quickstart/pt-BR/avancado.xml b/documentation/quickstart/pt-BR/avancado.xml
deleted file mode 100644
index f4066a2..0000000
--- a/documentation/quickstart/pt-BR/avancado.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
- Utilizando opções avançadas
-
- Implementando paginação dos dados
- ... introduzir mecanismo e lazy
- loading
-
- explicar interface Pagination (unidade
- básica de paginação) e contexto de paginação
- PaginationContext, disponível através de injeção
-
-
- o exemplo em questão é específico para o PrimeFaces se for
- utilizar outra implementação, tal como RichFaces, ... código será
- semelhante
-
- No pacote
- br.gov.frameworkdemoiselle.sample.view altere a classe
- BookmarkListMB incluindo nela as linhas de
- código a seguir:
- private DataModel<Bookmark> dataModel;
-
- @Override
- @SuppressWarnings("unchecked")
- public DataModel<Bookmark> getDataModel() {
- if (dataModel == null) {
- dataModel = new LazyDataModelImpl();
- }
- return dataModel;
- }
-
- private class LazyDataModelImpl extends LazyDataModel<Bookmark> {
-
- private static final long serialVersionUID = 1L;
-
- private boolean loaded = false;
-
- @Override
- public int getRowCount() {
- if (!loaded) {
- getPagination();
- handleResultList();
- loaded = true;
- }
- return getPagination().getTotalResults();
- }
-
- @Override
- public List<Bookmark> load(int first, int pageSize, String sortField,
- boolean sortOrder, Map<String, String> filters) {
-
- Pagination pagination = getPagination();
- pagination.setPageSize(pageSize);
- pagination.setFirstResult(first);
-
- return handleResultList();
- }
-
- }
- A interface DataModel pertence à
- especificação JSF, enquanto que a classe abstrata
- LazyDataModel é uma implementação da primeira fornecida
- pelo framework PrimeFaces.
- No diretório /src/main/webapp/, altere o
- arquivo bookmark_list.xhtml substituindo
- apenas a tag p:dataTable com o conteúdo
- seguinte:
- <p:dataTable id="list" height="300" var="bean" value="#{bookmarkListMB.dataModel}"
- lazy="true" paginator="true" rows="#{bookmarkListMB.pageSize}"
- pageLinks="#{bookmarkListMB.maxPageLinks}">
- ...
- No diretório /src/main/resources/,
- altere o arquivo demoiselle.properties
- incluindo as linhas a seguir:
- frameworkdemoiselle.pagination.default.page.size = 5
-frameworkdemoiselle.pagination.max.page.links = 3
- ...
-
- Paginação de dados na aplicação Bookmark
-
- Aplicação
- Bookmark em funcionamento
-
- ...
- INFO [STDOUT] Hibernate: select top ? count(bookmark0_.id) as col_0_0_ from Bookmark bookmark0_
-INFO [STDOUT] Hibernate: select top ? bookmark0_.id as id4_, bookmark0_.description as descript2_4_, bookmark0_.link as link4_ from Bookmark bookmark0_
-INFO [STDOUT] Hibernate: select limit ? ? bookmark0_.id as id4_, bookmark0_.description as descript2_4_, bookmark0_.link as link4_ from Bookmark bookmark0_
-
- // todo: explicar superficialmente como implementar no
- RF...
-
-import org.richfaces.component.UIDatascroller;
-import org.richfaces.event.DataScrollerEvent;
-
- // evento específico do RichFaces
- public void updatePage(DataScrollerEvent e) {
- int index = ((UIDatascroller) e.getComponent()).getPage();
- Page pagina = new Page(getRows(), index);
- recarregarLista(pagina);
- }
-
-
- <rich:datascroller for="table"
- maxPages="#{bookmarkListMB.maxPages}" page="#{bookmarkListMB.currentPage}"
- reRender="table" scrollerListener="#{bookmarkListMB.updatePage}" />
- <rich:dataTable width="100%" value="#{bookmarkListMB.lazyModel}"
- rows="#{bookmarkListMB.pageSize}"
- var="element" rowKeyVar="row" id="table">
-
-
-
-
\ No newline at end of file
diff --git a/documentation/quickstart/pt-BR/bookinfo.xml b/documentation/quickstart/pt-BR/bookinfo.xml
deleted file mode 100644
index 39b4b38..0000000
--- a/documentation/quickstart/pt-BR/bookinfo.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
- Framework Demoiselle
- QuickStart
-
-
diff --git a/documentation/quickstart/pt-BR/criacao.xml b/documentation/quickstart/pt-BR/criacao.xml
deleted file mode 100644
index 1485a87..0000000
--- a/documentation/quickstart/pt-BR/criacao.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-
-
-
-
- Criação da aplicação
-
- Nossa primeira aplicação
-
- Para iniciar o uso do Demoiselle Framework, criaremos uma aplicação
- Java do tipo Web utilizando o Apache Maven,
- através do plugin para IDE Eclipse (M2Eclipse) para gerenciar todo o clico de vida do Projeto,
- desde a criação até o deploy.
-
-
- Essa aplicação consistirá em um cadastro simples de bookmarks (links Favoritos) e
- será gerada com o auxílio de um arquétipo do Maven disponibilizado pelo projeto Demoiselle.
- Ela será preparada para utilizar as tecnologias de persistência JPA e de apresentação JSF nas
- versões mais recentes conforme a especificação Java EE 6.
-
-
-
-
- Construindo o projeto usando um arquétipo Maven
-
- Para criar esse projeto utilizando a IDE Eclipse, acesse o menu File,
- New, Other... digite e selecione Maven Project:
- conforme mostrado na figura abaixo:
-
-
-
-
-
-
-
-
-
-
- Na tela seguinte, recomenda-se manter os valores padrões:
-
-
-
-
-
-
-
-
-
-
- Na tela abaixo, no combo-box chamado Catalog, selecione o item com o nome Demoiselle e
- no campo Filter digite JSF e em seguida selecione o item demoiselle-jsf-jpa:
-
-
-
-
-
-
-
-
-
-
-
- Se as opções anteriores não aparecem, é porque será necessário incluir o catálogo remoto de arquétipos Maven do Demoiselle.
- Caso contrário pule o subitem Incluindo catálogo remoto e siga as demais instruções.
-
-
-
-
- A versão do arquétipo irá variar conforme surjam novas versões do Demoiselle. A imagem deste guia apresenta a versão &version;, contudo,
- fique sempre atento para as novas versões do Demoiselle em nosso site e sempre utilize a versão do arquétipo mais recente.
-
-
-
- Incluindo catálogo remoto
-
- Ainda na tela criação do novo projeto, clique no botão Configure à direita do combo-box
- Catalog, para que apareça a tela de configuração de arquétipos Maven no Eclipse.
-
-
-
-
-
-
-
-
-
-
- Clique no botão Add Remote Catalog...:
-
-
-
-
-
-
-
-
-
-
- Na campo Catalog File coloque este conteúdo:
- https://oss.sonatype.org/content/repositories/releases.
- No campo Description informe: Nexus. Em seguida, clique no botão
- Verify... para certificar-se que o conteúdo está correto.
- Retorne então ao item anterior e siga as instruções.
-
-
-
- Na próxima tela preencha os campos conforme ilustrado a seguir e clique em Finish:
-
-
-
-
-
-
-
-
-
-
-
- Ao término do processo será criado o projeto bookmark gerenciado pelo Maven e com a seguinte estrutura de diretórios:
-
-
-
-
-
- Entidade de domínio
-
- Dentro do pacote br.gov.frameworkdemoiselle.sample.bookmark.domain foi criada a classe
- Bookmark, a qual será responsável por representar um objeto de bookmark
- a ser persistido no banco de dados usando JPA:
-
-
-
-
-
- Os dois construtores da classe Bookmark serão utilizados posteriormente na aplicação.
- As anotações @Entity, @Id, @GeneratedValue e
- @Column são fornecidas pela especificação JPA.
-
-
-
-
- Camada de persistência
-
- Dentro do pacote br.gov.frameworkdemoiselle.sample.bookmark.persistence foi criada a classe
- BookmarkDAO, a qual será responsável por manipular os dados:
-
-
- {
-
- private static final long serialVersionUID = 1L;
-
-}]]>
-
-
-
- A anotação @PersistenceController trata-se de um estereótipo fornecido
- pelo Demoiselle Framework para indicar que uma classe será tratada
- como controlador da camada de persistência na aplicação.
-
-
-
- A classe abstrata JPACrud faz parte do código de suporte fornecido pelo
- Demoiselle Framework (especificamente na extensão JPA). Ao utilizá-la,
- o desenvolvedor não precisará implementar métodos de manipulação de uma entidade, tais como busca,
- listagem, inclusão, alteração e exclusão de registros. Dessa forma, apenas métodos específicos do
- caso de uso necessitam ser criados manualmente.
-
-
-
- Recomenda-se usar o sufixo DAO nessa classe para indicar que se trata de
- um objeto de acesso a dados (i.e., um DAO - Data Access Object).
-
-
-
- No diretório /src/main/resources/META-INF/ foi criado o arquivo persistence.xml
- utilizado para armazenar as configurações de acesso ao banco de dados via JPA (conexões controladas por um JPA Provider, ex: Hibernate)
- ou JTA (conexões controladas pelo Application Server, ex: JBossAS) e, como pode ser observado, o Demoiselle Framework
- já traz neste arquivo vários exemplos de configurações para os mais distintos Application Servers, como:
- JBoss AS7, JBoss AS6, GlassFish 3, Tomcat 6 e Tomcat7.
-
-
- O projeto criado pelo arquétipo demoiselle-jsf-jpa já vem configurado para usar conexão JPA com o HSQLDB, conforme código abaixo:
-
-
-
-
-
-
- java:jboss/datasources/ExampleDS
-
- br.gov.frameworkdemoiselle.sample.bookmark.domain.Bookmark
-
-
-
-
-
-
-
-
-
-]]>
-
-
-
-
- Camada de negócio
-
- Dentro do pacote br.gov.frameworkdemoiselle.sample.bookmark.business foi criada a classe
- BookmarkBC, a qual será responsável por gerenciar as regras de negócio referentes aos bookmarks:
-
-
- {
-
- private static final long serialVersionUID = 1L;
-
- @Startup
- @Transactional
- public void load() {
- if (findAll().isEmpty()) {
- insert(new Bookmark("Demoiselle Portal", "http://www.frameworkdemoiselle.gov.br"));
- insert(new Bookmark("Demoiselle SourceForge", "http://sf.net/projects/demoiselle"));
- insert(new Bookmark("Twitter", "http://twitter.frameworkdemoiselle.gov.br"));
- insert(new Bookmark("Blog", "http://blog.frameworkdemoiselle.gov.br"));
- insert(new Bookmark("Wiki", "http://wiki.frameworkdemoiselle.gov.br"));
- insert(new Bookmark("Bug Tracking", "http://tracker.frameworkdemoiselle.gov.br"));
- insert(new Bookmark("Forum", "http://forum.frameworkdemoiselle.gov.br"));
- insert(new Bookmark("Github", "https://github.com/demoiselle"));
- insert(new Bookmark("SVN", "http://svn.frameworkdemoiselle.gov.br"));
- insert(new Bookmark("Maven", "http://repository.frameworkdemoiselle.gov.br"));
- insert(new Bookmark("Downloads", "http://download.frameworkdemoiselle.gov.br"));
- }
- }
-}]]>
-
-
- O método com a anotação @startup nessa classe será invocado automaticamente durante a
- inicialização da aplicação e fará com que a tabela seja populada com dados iniciais de bookmarks.
-
-
-
- A anotação @BusinessController trata-se de um estereótipo fornecido
- pelo Demoiselle Framework para indicar que uma classe será tratada
- como controlador da camada de negócio na aplicação.
-
-
-
- A classe DelegateCrud faz parte do código de suporte fornecido pelo
- Demoiselle Framework. Ao utilizá-la, o desenvolvedor não precisará
- implementar métodos de negócio triviais de uma entidade e tampouco programar a injeção de dependência
- entre as camadas de negócio e persistência. Tal injeção será realizada de forma implícita.
-
-
-
- Recomenda-se usar o sufixo BC nessa classe para indicar que se trata de
- um controlador de negócio (i.e., um BC - Business Controller).
-
-
-
-
-
- Camada de apresentação
-
- Dentro do pacote package br.gov.frameworkdemoiselle.sample.bookmark.view foram criadas as
- classes BookmarkEditMB e BookmarkListMB, onde a primeira é responsável
- por controlar as modificações sobre os bookmarks efetuadas pelo usuário e a segunda é responsável por
- exibir as informações sobre os bookmarks.
-
-
-
- {
-
- private static final long serialVersionUID = 1L;
-
- @Inject
- private BookmarkBC bookmarkBC;
-
- @Override
- @Transactional
- public String delete() {
- this.bookmarkBC.delete(getId());
- return getPreviousView();
- }
-
- @Override
- @Transactional
- public String insert() {
- this.bookmarkBC.insert(getBean());
- return getPreviousView();
- }
-
- @Override
- @Transactional
- public String update() {
- this.bookmarkBC.update(getBean());
- return getPreviousView();
- }
-
- @Override
- protected Bookmark handleLoad(Long id) {
- return this.bookmarkBC.load(id);
- }
-}]]>
-
-
- {
-
- private static final long serialVersionUID = 1L;
-
- @Inject
- private BookmarkBC bc;
-
- @Override
- protected List handleResultList() {
- return this.bc.findAll();
- }
-
- @Transactional
- public String deleteSelection() {
- boolean delete;
- for (Iterator iter = getSelection().keySet().iterator(); iter.hasNext();) {
- Long id = iter.next();
- delete = getSelection().get(id);
-
- if (delete) {
- bc.delete(id);
- iter.remove();
- }
- }
- return getPreviousView();
- }
-}]]>
-
-
-
- A anotação @ViewController trata-se de um estereótipo fornecido
- pelo Demoiselle Framework para indicar que uma classe será tratada
- como controlador da camada de apresentação (i.e., visão) na aplicação.
-
-
- A anotação @NextView serve para definir a próxima
- visão a ser direcionado o fluxo de navegação JSF. De forma semelhante,
- a anotação @PreviousView define a visão anterior
- de um fluxo.
-
-
- A anotação @Inject é fornecida pela especificação CDI. Ela realiza a injeção
- de dependência da camada de negócio dentro do artefato da camada de apresentação.
-
-
- A anotação @Transactional trata-se de uma anotação fornecida pelo
- Demoiselle Framework para indicar que o método em questão
- será incluído na sessão transacional. Caso essa anotação esteja vinculada na classe,
- todos os seus métodos serão considerados transacionais.
-
-
- As classes AbstractEditPageBean e AbstractListPageBean fazem parte
- do código de suporte fornecido pelo Demoiselle Framework (especificamente na extensão JSF).
- Ao utilizá-las, o desenvolvedor não precisará implementar métodos específicos de navegação para uma tela de
- cadastro (i.e., do tipo CRUD).
-
-
-
- Recomenda-se usar o sufixo MB nessa classe para indicar que se trata de
- um bean gerenciado do JSF (i.e., um MB - Managed Bean).
-
-
-
- No diretório /src/main/webapp/ foram criados os arquivos:
-
- bookmark_edit.xhtml - página JSF de cadastro e edição de bookmark;
- bookmark_list.xhtml - página JSF de cadastro e edição de bookmark;
- index.html - página HTML que redireciona para a página jsf;
- index.xhtml - página JSF inicial do sistema;
- menu.xhtml - página JSF que monta o menu de navegação.
-
-
-
- No diretório /src/main/webapp/template foi criado o arquivo:
-
- main.xhtml - página JSF que serve de template referenciada na demais páginas JSF.
-
-
-
-
- Nos arquivos XHTML listados neste exemplo foi empregado o framework
- PrimeFaces, o qual foi um dos primeiros a
- oferecer suporte completo à especificação JSF 2.0.
-
-
-
- No diretório /src/main/resources/ podemos observar que foi criado o arquivo de recursos
- messages.properties. Ao invés de manter fixas as descrições em rótulos, links, botões e
- mensagens em uma aplicação, recomenda-se parametrizar esses textos em arquivos de recursos. Além de ser considerada
- boa prática, essa medida facilita uma posterior internacionalização da aplicação para diversos idiomas.
-
-
-
- O arquivo de recursos messages.properties armazenará textos
- no idioma default da aplicação (neste caso, em Português do Brasil).
-
-
-
-
-
- Executando no servidor
-
- A última etapa consiste em fazer o deploy da Java Web em um servidor de aplicações.
-
-
- Utilizando a IDE Eclipse, basta clicar com o botão direito no projeto bookmark e
- acessar o menu Run As, Run on Server. Em seguida, escolha um
- servidor compatível com Java EE 6 (ex: JBoss AS 7) e aguarde a inicialização deste.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Na visão Console você verá as mensagens decorrentes do servidor de aplicações
- e da inicialização da aplicação bookmark agora hospedada nele.
-
-
-
- Para executar em modo de depuração, na visão Servers, clique com o botão
- direito no servidor desejado e selecione a opção Debug.
-
-
-
- Em seguida, abra o navegador Web de sua preferência e acesse o endereço
- http://localhost:8080/bookmark. Esta é a
- página que deverá ser exibida com a aplicação bookmark em funcionamento:
-
-
- Página principal da aplicação Bookmark
-
-
-
-
-
-
-
-
- Aplicação Bookmark em funcionamento
-
-
-
-
- Para cadastrar um novo bookmark basta ir no menu principal: Bookmarks,
- Novo. Executando-a, será exibida a página a seguir:
-
-
- Tela de cadastro e edição dos dados na aplicação Bookmark
-
-
-
-
-
-
-
-
- Aplicação Bookmark em funcionamento
-
-
-
-
-
-
diff --git a/documentation/quickstart/pt-BR/images/addRemoteArchetypeCatalog01.png b/documentation/quickstart/pt-BR/images/addRemoteArchetypeCatalog01.png
deleted file mode 100644
index 291fc01..0000000
Binary files a/documentation/quickstart/pt-BR/images/addRemoteArchetypeCatalog01.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/addRemoteArchetypeCatalog02.png b/documentation/quickstart/pt-BR/images/addRemoteArchetypeCatalog02.png
deleted file mode 100644
index 61a49c7..0000000
Binary files a/documentation/quickstart/pt-BR/images/addRemoteArchetypeCatalog02.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/appedit.png b/documentation/quickstart/pt-BR/images/appedit.png
deleted file mode 100644
index 402d257..0000000
Binary files a/documentation/quickstart/pt-BR/images/appedit.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/apphome.png b/documentation/quickstart/pt-BR/images/apphome.png
deleted file mode 100644
index 0dccba4..0000000
Binary files a/documentation/quickstart/pt-BR/images/apphome.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/appmsg.png b/documentation/quickstart/pt-BR/images/appmsg.png
deleted file mode 100644
index c7aa936..0000000
Binary files a/documentation/quickstart/pt-BR/images/appmsg.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/apppage.png b/documentation/quickstart/pt-BR/images/apppage.png
deleted file mode 100644
index f47a3da..0000000
Binary files a/documentation/quickstart/pt-BR/images/apppage.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/appvalid.png b/documentation/quickstart/pt-BR/images/appvalid.png
deleted file mode 100644
index 95b0cdf..0000000
Binary files a/documentation/quickstart/pt-BR/images/appvalid.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/demoiselle-logo.png b/documentation/quickstart/pt-BR/images/demoiselle-logo.png
deleted file mode 100644
index 19b77c4..0000000
Binary files a/documentation/quickstart/pt-BR/images/demoiselle-logo.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/new-maven-project.png b/documentation/quickstart/pt-BR/images/new-maven-project.png
deleted file mode 100644
index fa121e8..0000000
Binary files a/documentation/quickstart/pt-BR/images/new-maven-project.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/new-maven-project01.png b/documentation/quickstart/pt-BR/images/new-maven-project01.png
deleted file mode 100644
index 65d37b4..0000000
Binary files a/documentation/quickstart/pt-BR/images/new-maven-project01.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/new-maven-project02.png b/documentation/quickstart/pt-BR/images/new-maven-project02.png
deleted file mode 100644
index b5dbeaa..0000000
Binary files a/documentation/quickstart/pt-BR/images/new-maven-project02.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/newproj.png b/documentation/quickstart/pt-BR/images/newproj.png
deleted file mode 100644
index 6f3bbbf..0000000
Binary files a/documentation/quickstart/pt-BR/images/newproj.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/newwiz.png b/documentation/quickstart/pt-BR/images/newwiz.png
deleted file mode 100644
index a2d68c9..0000000
Binary files a/documentation/quickstart/pt-BR/images/newwiz.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/viewproj.png b/documentation/quickstart/pt-BR/images/viewproj.png
deleted file mode 100644
index aa69107..0000000
Binary files a/documentation/quickstart/pt-BR/images/viewproj.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/images/viewserver.png b/documentation/quickstart/pt-BR/images/viewserver.png
deleted file mode 100644
index b2da74c..0000000
Binary files a/documentation/quickstart/pt-BR/images/viewserver.png and /dev/null differ
diff --git a/documentation/quickstart/pt-BR/instalacao.xml b/documentation/quickstart/pt-BR/instalacao.xml
deleted file mode 100644
index 6ff60b3..0000000
--- a/documentation/quickstart/pt-BR/instalacao.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
- Instalação
-
- Ambiente recomendado
-
-
-
-
-
-
-
-
- Software
-
-
- Versão
-
-
- Site (Download)
-
-
-
- Java Development Kit (JDK)
- 6.0
-
-
- openjdk.org
-
-
-
-
- Apache Maven
- 2.2
-
-
- maven.apache.org
-
-
-
-
- Eclipse IDE
- 3.7
-
-
- www.eclipse.org
-
-
-
-
- m2eclipse plugin
- 0.12
-
-
- m2eclipse.sonatype.org
-
-
-
-
- JBoss Application Server
- 7.1.1
-
-
- www.jboss.org
-
-
-
-
-
-
-
-
- Demoiselle Infra
-
- Para auxiliar no preparo do ambiente integrado de desenvolvimento utilizado na presente
- documentação, recomenda-se a utilização dos pacotes de software fornecidos pelo projeto
- Demoiselle Infra.
- Neste link você encontrará as orientações necessárias para a sua configuração.
-
-
-
- Atualmente são disponibilizados pacotes exclusivamente para a plataforma GNU/Linux
- e distribuições baseadas no Debian, tal como Ubuntu.
-
-
-
- Se você não utiliza nenhum dos sistemas operacionais citados, terá que baixar e instalar
- todos os softwares listados acima. Para auxiliar um pouco o processo, disponibilizamos alguns
- vídeos
- aqui de demonstração de algumas fases.
-
-
-
diff --git a/documentation/quickstart/pt-BR/master.xml b/documentation/quickstart/pt-BR/master.xml
deleted file mode 100644
index a15cea6..0000000
--- a/documentation/quickstart/pt-BR/master.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
- Sobre o QuickStart - versão &version;
-
- Este documento é um tutorial do tipo "passo a passo" que visa ilustrar de forma rápida, clara e prática a criação
- de uma aplicação simples utilizando o Demoiselle Framework &version;.
-
-
-
- Apesar de o Demoiselle Framework &version; ser simples de usar, o desenvolvimento de aplicações
- não triviais requer o conhecimento das diversas tecnologias envolvidas na especificação
- Java EE, incluindo:
-
- Linguagem Java
- Servlets, JSP e Tag Libraries
- JavaBeans
- HTML e XML
- Contêineres e Servidores Web
-
-
-
-
-
- Esta documentação refere-se à versão &version; do Demoiselle Framework e pode diferir
- significativamente das versões anteriores.
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/documentation/quickstart/pt-BR/melhoria.xml b/documentation/quickstart/pt-BR/melhoria.xml
deleted file mode 100644
index c7a79ea..0000000
--- a/documentation/quickstart/pt-BR/melhoria.xml
+++ /dev/null
@@ -1,254 +0,0 @@
-
-
-
-
- Melhorando a aplicação
-
-
- Exibindo mensagens para o usuário
-
- Uma vez que o objetivo principal da aplicação foi concluído (i.e., listagem e edição de bookmarks),
- veremos algumas funcionalidades adicionais fornecidas pelo Demoiselle Framework,
- iniciando pelo tratamento de mensagens.
-
-
- Dentro do pacote br.gov.frameworkdemoiselle.sample.bookmark.message crie a interface
- InfoMessages, a qual servirá para armazenar mensagens informativas a serem
- exibidas ao usuário:
-
-
-
-
-
-
- A unidade básica de manipulação de mensagens no Demoiselle Framework
- é a interface Message. Ou seja, basta que esta última seja implementada na
- aplicação para que o contexto de mensagens possa manipulá-la.
- A classe DefaultMessage é oferecida como implementação padrão dessa interface.
-
-
-
- No exemplo em questão, o texto das mensagens será recuperado do arquivo de recursos
- messages.properties previamente criado no diretório
- /src/main/resources/. Para isso, adicione as seguintes linhas nesse arquivo:
-
-
-
-
-
- Dentro do pacote br.gov.frameworkdemoiselle.sample.bookmark.business altere a classe
- BookmarkBC incluindo os trechos de código indicados a seguir:
-
-
-
-
-
-
-
-
-
-
-
- {
-
-@Inject
-private MessageContext messageContext;
-
-...
-
-@Override
-public void insert(Bookmark bookmark) {
- super.insert(bookmark);
- messageContext.add(InfoMessages.BOOKMARK_INSERT_OK, bookmark.getDescription());
-}
-
-@Override
-public void update(Bookmark bookmark) {
- super.update(bookmark);
- messageContext.add(InfoMessages.BOOKMARK_UPDATE_OK, bookmark.getDescription());
-}
-
-@Override
-public void delete(Long id) {
- super.delete(id);
- messageContext.add(InfoMessages.BOOKMARK_DELETE_OK, id);
-}
-}]]>
-
-
-
- No ponto contendo @Inject será injetado via CDI o contexto de mensagens
- presente na aplicação, ou seja, uma instância da interface MessageContext
- que poderá ser utilizada em qualquer método nessa classe.
-
-
-
-
- Aqui os métodos insert(), update() e
- delete() da classe DelegateCrud são sobrescritos
- para permitir com que o contexto de mensagens seja manipulado em cada invocação destes.
- O método add() de MessageContext faz com que a
- mensagem passada como parâmetro seja adicionada ao contexto, que ao final será exibida
- para o usuário na camada de apresentação.
-
-
-
-
-
-
- O contexto de mensagens, representado pela interface MessageContext, é capaz de
- armazenar diversas mensagens em uma mesma requisição. Ele não é restrito à aplicações do tipo Web,
- isto é, pode ser usado também para aplicações do tipo desktop (i.e., Swing).
-
-
-
- Ao término das modificações propostas até aqui, reconstrua o projeto Java e faça novo deploy
- no servidor de aplicações. Acesse a aplicação bookmark e efetue inclusões,
- modificações e exclusões de bookmarks. As mensagens informativas devem aparecer em caixas de
- mensagens na tela, tal como ilustrado a seguir:
-
-
- Exibição de mensagens na aplicação Bookmark
-
-
-
-
-
-
-
-
- Aplicação Bookmark em funcionamento
-
-
-
-
-
-
- Criando regras de validação nos campos
-
- Sendo aderente à especificação Java EE 6, o Demoiselle Framework
- recomenda e faz uso do mecanismo de validação provido pela especificação
- JSR-303 (Bean Validation).
-
-
- A fim de testarmos mais essa funcionalidade, utilizaremos a implementação de validação
- Hibernate Validator. Para tal, abra o arquivo pom.xml
- do projeto bookmark e inclua nele a seguinte dependência:
-
-
-
- ...
-
- org.hibernate
- hibernate-validator
- 4.3.0.Final
-
-]]>
-
-
-
- O objetivo dessa abordagem de validação é auxiliar na criação de restrições diretamente nas
- entidades de domínio. Tais restrições serão utilizadas de forma conjunta nas camadas de
- persistência e apresentação da aplicação. A vantagem é que elas são facilmente configuráveis,
- bastando apenas incluir certas anotações (ex: @NotNull, @Size)
- nos campos da classe a ser validada.
-
-
-
- No pacote br.gov.frameworkdemoiselle.sample.bookmark.domain altere a entidade de domínio
- Bookmark incluindo as anotações de validação nos campos description
- e link conforme ilustrado a seguir:
-
-
-
-
-
-
-
-
-
-
-
-
- No campo description, a anotação @NotNull serve
- para impedir que o valor nulo seja atribuído a ele. Já a anotação @Size
- restringe a quantidade mínima e máxima de caracteres no campo.
-
-
-
-
- No campo link mais restrições são aplicadas. Além de não permitir o valor
- nulo (com @NotNull) e estipular o comprimento máximo de 255 caracteres
- (com @Size), o campo não pode ficar vazio (com @NotBlank)
- e seu conteúdo deve ser um endereço de Internet válido (com @URL).
-
-
-
-
-
-
- Validações de campos específicos para a comunidade brasileira são oferecidos pelo componente
- Demoiselle Validation. Com ele, as seguintes anotações podem ser aplicadas nas
- classes de domínio: @Cep, @Cnpj, @Cpf,
- @InscricaoEstadual e @PisPasep.
-
-
-
- Assim que você efetuar as modificações, reconstrua o projeto Java e faça novo deploy no servidor de
- aplicações. Acesse a aplicação bookmark e, na tela de edição de bookmarks, deixe
- vazios os campos no formulário e clique em Salvar. Tente também preencher um
- endereço de Internet inválido no campo Link. Caixas de erro com as mensagens
- referentes as validações devem aparecer ao lado de cada campo, tal como ilustrado:
-
-
- Validação de campos na aplicação Bookmark
-
-
-
-
-
-
-
-
- Aplicação Bookmark em funcionamento
-
-
-
-
-
- As mensagens exibidas na tela durante a validação estão contidas no arquivo de
- recursos ValidationMessages.properties presente no diretório
- /src/main/resources/.
-
-
-
-
-
\ No newline at end of file
diff --git a/documentation/quickstart/pt-BR/revhistory.xml b/documentation/quickstart/pt-BR/revhistory.xml
deleted file mode 100644
index 4a692ce..0000000
--- a/documentation/quickstart/pt-BR/revhistory.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
- 2.0.4
- 17/11/2011
- mc
- Atualizações de acordo com a versão 2.2.0 do Framework Demoiselle .
-
-
- 2.0.3
- 26/04/2011
- rh
- Correções ortográficas e de formatação.
-
-
- 2.0.2
- 04/02/2011
- es
- Melhoria no procedimento de criação da aplicação.
-
-
- 2.0.1
- 03/01/2011
- rh
- Códigos em fonte monoespaçada.
-
-
- 2.0.0
- 27/12/2010
- rh
- Primeira release da documentação.
-
-
\ No newline at end of file
diff --git a/documentation/reference/.gitignore b/documentation/reference/.gitignore
deleted file mode 100644
index 8cf413e..0000000
--- a/documentation/reference/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-/bin
-/target
-/.project
-/.classpath
-/.settings
-/.externalToolBuilders
-/.DS_Store
-/target
diff --git a/documentation/reference/pt-BR/arquetipo.xml b/documentation/reference/pt-BR/arquetipo.xml
deleted file mode 100644
index 570fc1d..0000000
--- a/documentation/reference/pt-BR/arquetipo.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
- Arquétipos
-
-
- O projeto Demoiselle recomenda e usa a ferramenta Apache-Maven, para gerenciamento do ciclo de vida do desenvolvimento
- de projeto. Baseada nesta ferramenta, além do fornecimento dos POMs Parentes, também fornece as estruturas chamadas arquétipos
- para facilitar a criação de aplicações, garantido a estrutura recomendada pelo framework e o conceito de gerenciamento do próprio Maven.
- Atualmente estão disponíveis os seguintes artefatos:
-
-
-
- demoiselle-minimal
-
- Fornece um conjunto mínimo de artefatos para criar uma aplicação Java, utiliza o Demoiselle-Minimal-Parent,
- sendo útil quando os outros arquétipos disponíveis não se enquadram nas características do projeto a ser criado.
-
-
-
-
- demoiselle-jsf-jpa
-
- Útil para os projetos que precisam de uma arquitetura que utilize as tecnologias JSF e JPA,
- é baseado no demoiselle-jsf-parent
- e já traz uma estrutura padrão de pacotes e todas
- as dependências necessárias para rodar a aplicação. Ao usar este
- arquétipo, você terá uma pequena aplicação de
- Bookmarks já pronta para rodar. Para isto, basta instalá-la em um
- servidor da sua preferência! Para mais detalhes
- sobre esta aplicação de exemplo e em como usar o arquétipo, acesse
- a sessão de documentação chamada QuickStart.
-
-
-
diff --git a/documentation/reference/pt-BR/arquitetura.xml b/documentation/reference/pt-BR/arquitetura.xml
deleted file mode 100644
index 9af072e..0000000
--- a/documentation/reference/pt-BR/arquitetura.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
- Arquitetura
-
-
- Estrutura
-
- Visando uma melhor modularização, o Demoiselle está dividido por funcionalidades. Isto significa que o framework
- não é monolítico, no qual todas as suas funcionalidades estão contidas em um único pacote. Aliás, esta estratégia não é
- a mais indicada, pois projetos com um propósito específico, que não necessitam de persistência ou interface Web, por
- exemplo, teriam dependências desnecessárias. Assim, o Demoiselle é separado em Core, Extensões e Componentes.
-
-
-
- O Core do Demoiselle contém aquelas funcionalidades comuns a todas as extensões e aplicações. O core é simples,
- leve e formado majoritariamente por interfaces e poucas implementações. O Core é a base do framework, sem ele, as
- extensões e a própria aplicação não funcionariam.
-
- As Extensões, como o próprio nome sugere, estendem o Core com funcionalidades extras e bem específicas a um domínio ou
- tecnologia. Neste contexto, caso sua aplicação necessite de persistência com JPA, o framework fornecerá facilidades
- para você; contudo, estas funcionalidades não estão no Core. Para este propósito existem as extensões como a
- demoiselle-jpa, por exemplo. Cabe destacar que as extensões não possuem vida própria,
- pois estão diretamente ligadas ao núcleo do framework, inclusive o ciclo de vida das extensões está
- totalmente acoplado ao do Core.
-
-
- Já os Componentes são artefatos separados e que, portanto, não são dependentes diretamente do Core. Aliás, os
- Componentes podem até mesmo existir sem referenciar o Core. Desta forma, o seu ciclo de vida é totalmente
- independente do Core e Extensões. Um componente não precisa, necessariamente, estender o comportamento do Core, mas
- permitir disponibilizar novas funcionalidades ao usuário. Outra diferença importante é que, diferente de Core e
- Extensões, os Componentes não necessariamente são aderentes a alguma especificação. Um exemplo é o
- demoiselle-validation.
-
-
-
-
- Pacote Internal
-
- As boas práticas de programação nos alertam para que nunca sejamos dependentes de implementações, mas sempre de
- interfaces ou, como alguns costumam dizer, depender de contratos.
- Portanto a sua aplicação precisará apenas depender das interfaces que o Demoiselle provê. As implementações específicas
- e internas do Framework serão injetadas automaticamente pelo CDI.
-
-
-
- As classes do pacote internal nunca devem ser referenciadas pela sua aplicação!
-
-
-
- Qual o motivo de toda esta explicação? Os programadores mais curiosos irão encontrar classes do framework que estão
- inseridas no pacote br.gov.frameworkdemoiselle.internal.
- As classes deste pacote não devem ser usadas diretamente pela sua aplicação, caso contrário você
- estará acoplando-a com a implementação interna do Framework. A equipe do
- Demoiselle possui atenção especial quanto às suas interfaces (contratos) e não irá modificá-las sem antes tornar
- públicas as mudanças. Contudo, tudo que consta no pacote br.gov.frameworkdemoiselle.internal
- pode sofrer mudanças repentinas. Se você referenciar tais classes internas, a sua aplicação pode deixar
- de funcionar ao atualizar a versão do Demoiselle.
-
-
-
-
- Arquitetura das aplicações
-
- É importante reforçar que o Demoiselle não obriga nenhum tipo de arquitetura para as aplicações, que podem ser
- constituídas por quantas camadas forem necessárias. Contudo, é prudente não exagerar! Para quem não sabe por onde
- começar, sugerimos uma arquitetura e padrões largamente utilizados pelo mercado, de forma a facilitar a manutenção e
- para melhor modularização de seu projeto.
-
-
- Usualmente, as aplicações são constituídas por pelo menos três camadas, desta forma é comum separar as lógicas de
- apresentação, regras de negócio e persistência. O Demoiselle já fornece estereótipos que visam tornar esta
- separação mais clara, respectivamente:
- @ViewController, @BusinessController e @PersistenceController.
- Maiores detalhes sobre cada anotação serão dados no decorrer desta documentação.
-
-
-
- Cabe destacar que estamos falando de uma macro-visão arquitetural. Cada camada pode ser organizada
- internamente da melhor forma possível, ou conforme os padrões vigentes no mercado. Para uma aplicação Swing, por
- exemplo, o padrão de projeto Presentation Model
- é bastante indicado. Para aplicações Web, os frameworks
- especialistas geralmente aplicam o padrão MVC (Model/View/Controller).
-
-
-
-
diff --git a/documentation/reference/pt-BR/authorgroup.xml b/documentation/reference/pt-BR/authorgroup.xml
deleted file mode 100644
index 1311e0d..0000000
--- a/documentation/reference/pt-BR/authorgroup.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
- Cleverson
- Sacramento
-
-
- Danilo
- Viana
-
-
- Emerson
- Oliveira
-
-
- Emerson
- Saito
-
-
- Luciano
- Borges
-
-
- Marlon
- Carvalho
-
-
-
-
-
-
- Rodrigo
- Hjort
-
-
- Serge
- Rehem
-
-
- Thiago
- Mariano
-
-
- Wilson
- Guimarães
-
-
diff --git a/documentation/reference/pt-BR/bookinfo.xml b/documentation/reference/pt-BR/bookinfo.xml
deleted file mode 100644
index 652fb30..0000000
--- a/documentation/reference/pt-BR/bookinfo.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
- Framework Demoiselle
- Guia de Referência
-
-
diff --git a/documentation/reference/pt-BR/bundle.xml b/documentation/reference/pt-BR/bundle.xml
deleted file mode 100644
index a01a264..0000000
--- a/documentation/reference/pt-BR/bundle.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-
-
- Resource Bundle
-
-
- Um dos requisitos para se construir uma aplicação nos dias de hoje é o de que seja utilizada por pessoas
- em vários lugares no mundo e em diferentes línguas. Portanto, é preciso que as aplicações sejam facilmente
- internacionalizáveis. Para isso, existe um recurso no java chamado de Resource Bundle,
- que nada mais é do que um esquema de arquivos properties, onde cada arquivo representa
- uma língua e cada um desses arquivos possui um conjunto de chaves e valores, sendo que os valores são os textos
- que serão exibidos na aplicação e estão na língua correspondente à língua que o arquivo representa.
-
-
- O arquivo properties que será utilizado para montar a aplicação é escolhido pelo próprio
- usuário, seja através da língua definida no browser ou no próprio sistema operacional. Caso o usuário escolha
- uma língua que não está disponível na aplicação, uma língua default será utilizada. Por exemplo: vamos imaginar
- que em uma aplicação existem dois arquivos properties, um em português e outro em inglês, e
- que o arquivo default é o inglês. Vamos imaginar também que a aplicação é Web, portanto a língua escolhida está
- definida no próprio browser. Caso esteja configurado no browser do usuário a língua alemã e como não existe nenhum
- arquivo de properties para alemão, a aplicação será exibida na língua inglesa, que é a língua configurada como
- default.
-
-
- Todos os arquivos são criados praticamente com o mesmo nome. O que diferencia um arquivo do outro é o acréscimo
- da sigla que representa a língua daquele arquivo. O arquivo que representa a língua default não tem essa sigla
- ao fim do nome. Seguindo o exemplo citado acima e imaginando que o nome dos nossos arquivos é messages, ficaria
- da seguinte forma: messages.properties seria o arquivo default que representaria a língua
- inglesa e messages_pt.properties seria o arquivo da língua portuguesa. Veja abaixo um
- exemplo com esses dois arquivos.
-
-
- messages.properties:
-
-
-
- messages_pt.properties:
-
-
-
-
- Utilizando Resource Bundle no Demoiselle
-
- Na versão 2 do Demoiselle Framework, existe uma fábrica de Resource Bundle que fica no
- Core e permite seu uso através da injeção ou através de uma instanciação normal. O grande detalhe é que nessa
- fábrica é injetado um objeto do tipo Locale, isso quer dizer que é necessário criar também
- uma fábrica de Locale. Como a definição de Locale varia de acordo com a
- camada de apresentação, essas fábricas foram criadas nas extensões de apresentação:
- demoiselle-servlet, demoiselle-jsf e demoiselle-se.
- Na extensão demoiselle-se a definição do Locale é dada através do
- Locale definido na máquina do usuário, enquanto que nas extensões
- demoiselle-servlet e demoiselle-jsf essa definição
- acontece através do Locale do browser do usuário, por se tratarem de extensões para camada
- de apresentação Web. Por default, a fábrica de Resource Bundle vai injetar um bundle apontando para o arquivo
- messages, mas isso pode ser facilmente alterado através da anotação
- @Name. Veja abaixo como utilizar o Resource Bundle no Demoiselle.
-
-
- Utilizando Resource Bundle através da injeção:
-
-
-
- Utilizando Resource Bundle sem uso de injeção:
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/configuracao.xml b/documentation/reference/pt-BR/configuracao.xml
deleted file mode 100644
index 056eef8..0000000
--- a/documentation/reference/pt-BR/configuracao.xml
+++ /dev/null
@@ -1,662 +0,0 @@
-
-
-
-
- Configuração
-
-
- Configurações em uma aplicação
-
- Muitas vezes, por motivos diversos, é necessário parametrizar a aplicação à partir de algum mecanismo de
- configuração. E em java é comum se utilizar as seguintes abordagens para armazenas as configurações:
-
-
-
- arquivo de propriedades: tratam-se de simples arquivos de texto nomeados com a
- extensão .properties, os quais são escritos com a sintaxe chave=valor,
- armazenando uma única chave por linha;
-
-
-
-
- arquivo XML: são arquivos de texto altamente estruturados com a sintaxe de tags e
- que permitem uma maior validação dos seus valores, sendo geralmente nomeados com a extensão.xml;
-
-
-
-
- variáveis de ambiente: valores definidos no sistema operacional, independente de
- plataforma (Windows, Linux, Mac OS, etc) e que podem ser recuperados durante a execução da aplicação.
-
-
-
-
-
- Esse capítulo mostra de que maneira o Demoiselle Framework pode facilitar a utilização dessas
- formas de configuração, oferencendo vários recursos interessantes para a sua aplicação.
-
-
-
-
- As classes de configuração
-
- O primeiro passo para a utilização do mecanismo de configuração em uma aplicação consiste em criar uma classe
- específica para armazenar os parâmetros desejados e anotá-la com @Configuration. O código
- abaixo mostra um exemplo de classe de configuração:
-
-
-
-
- As classes anotadas com @Configuration são instanciadas uma única vez (seguindo o padrão
- de projeto singleton) e podem ser injetadas em qualquer ponto da aplicação. Seu ciclo
- de vida é gerenciado automaticamente pelo CDI. Os recursos (arquivo ou variável de ambiente) são lidos no
- primeiro acesso à respectiva classe de configuração, quando os seus atributos são preenchidos automaticamente.
-
-
-
-
- Recomenda-se usar o sufixo Config nas classes de configuração, e que sejam criados
- apenas os acessores para leitura (getters).
-
-
-
-
-
- Esse é um exemplo bastante simples, no qual não são especificados nem nome nem tipo do arquivo de configuração. Nessa
- situação os parâmetros de nome applicationTitle e loadInitialData serão
- procurados em um arquivo de propriedades de nome demoiselle.properties. Ou seja, quando não
- especificados nome e tipo do arquivo, assume-se que o arquivo é do tipo propriedades
- e seu nome é demoiselle. Mas como fazer para não utilizar o valor padrão e definir
- nome e tipo do arquivo? Bastante simples. Basta adicionar esses parâmetros à anotação @Configuration, como mostra o
- exemplo a seguir:
-
-
-
-
- Devemos atribuir o nome do arquivo de configuração ao parâmetro resource, sem a extensão.
- Ao parâmetro type pode ser atribuída uma das três possibilidades:
- ConfigType.PROPERTIES, que é o valor padrão e indica que as configurações daquela classe
- estão em um arquivo do tipo properties; ConfigType.XML, que indica que
- as configurações daquela classe estão em um arquivo do tipo xml; e
- ConfigType.SYSTEM, que indica que as configurações daquela classe são valores definidos pelo Sistema
- Operacional. Nesse exemplo, ao definir resource e type os parâmetros de
- nome applicationTitle e loadInitialData serão procurados em um arquivo
- xml de nome my-property-file (my-property-file.xml).
-
-
- Outro parâmetro que você pode ajustar nessa anotação é o prefixo. Ao definir um valor de prefixo você informa que
- o nome das propriedades definidas naquela classe devem ser concatenados com o prefixo, de forma que o nome dos
- atributos procurados no arquivo seja prefixo.nomeatributo. O exemplo abaixo mostra a
- utilização desse parâmetro. Nesse caso, os parâmetros de nome info.applicationTitle e
- info.loadInitialData serão procurados em um arquivo de propriedade de nome
- my-property-file (my-property-file.properties).
-
-
-
-
- O Demoiselle Framework adiciona automaticamente o ponto entre o prefixo e o nome do
- atributo, você não precisa se preocupar com isso.
-
-
-
-
- No arquivo xml o prefixo corresponde a uma tag acima das tag que correspondem aos
- atributos. O exemplo acima ficaria da seguinte forma em um arquivo xml:
-
-
- Demoiselle Application<\applicationTitle>
- true<\loadInitialData>
-
-
-]]>
-
-
-
-
-
- Especificando os parâmetros
-
- Atualmente são suportados nativamente pelo Demoiselle Framework parâmetros de sete categorias
- diferentes. São eles: tipos primitivos (int, float, boolean, etc), classes wrapper (Integer, Float, Boolean, etc.)
- , String, Class, Map, Array e instâncias de Enum.
- A seguir vamos explicar e exemplificar como utilizar cada um desses
- tipos, e alertar para as possíveis exceções que poderão ser lançadas para sua aplicação.
-
-
-
- A partir da versão 2.4.0 não são mais reconhecidas as convenções de substituição de nomes. Os parâmetros serão procurados exatamente
- como foram definidos na classe de configuração.
-
-
-
-
-
-
-
-
- Primitivos
-
-
-
-
-
- A utilização dos tipos primitivos é bastante simples. Veja no exemplo abaixo uma classe de configuração um arquivo
- de configurações, que ilustram como é o procedimento para adicionar parâmetros do tipo primitivo.
-
-
-
-
- Para essa classe, o arquivo de propriedade correspondente (demoiselle.properties) deveria
- apresentar o seguinte conteúdo:
-
-
-
- Bastante simples, não? Mesmo assim, é bom ficarmos atentos, pois alguns cenários diferentes podem
- acontecer. Vamos supor por exemplo que, por um motivo qualquer, a classe de configuração não esteja associada a um arquivo que contenha a chave de um de
- seus parâmetros. Nesse caso será atribuido o valor padrão da linguagem ao atributo, que para os tipos primitivos
- é 0, exceto para os tipos boolean, cujo valor padrão é false, e
- char, cujo valor padrão é o caracter nulo ('\u0000').
- Outro cenário possível é a existência da chave, mas sem valor atribuído (pageSize=). Nesse
- caso o valor encontrado no arquivo é equivalente a uma String vazia, e a exceção
- ConfigurationException, cuja causa foi uma ConversionException, será
- lançada.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Wrappers
-
-
-
-
-
- Os atributos do tipo wrapper devem ser utilizados da mesma forma que os atributos do tipo
- primitivo. A única diferença entre eles é que o valor padrão atribuído a um parâmetro, no caso da classe de
- configuração não estar associada a um arquivo que contenha sua chave, é nulo.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Strings
-
-
-
-
-
- Por sua vez, as configurações do tipo String tem funcionalidade bastante similar às
- configurações do tipo Wrapper. A diferença fica por conta de que, ao deixar a chave sem valor atribuído, para
- atributo desse tipo, não será lançada exceção, pois que não haverá o problema de conversão, e à configuração
- será atribuido o valor de uma String vazia.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Class
-
-
-
-
-
- A partir da versão 2.4.0 é possível ter atributos do tipo Class como parâmetro. O atributo
- pode ou não ser tipado, e no arquivo o valor atribuído à chave deve corresponder ao nome (
- Canonical Name) de uma classe existente. Abaixo temos um exemplo de uma classe de configuração com
- dois atributos do tipo Class, um tipado e outro não tipado:
-
- typedClass;
-
- private Class> untypedClass;
-
- public Class getTypedClass() {
- return typedClass;
- }
-
- public Class> getUntypedClass() {
- return untypedClass;
- }
-}
- ]]>
- O arquivo de propriedades teria o seguinte conteúdo:
-
-
- Caso uma chave de uma configuração do tipo Class não tenha valor atribuído ou seja
- atribuído um nome de classe que não existe (ou não possa ser encontrada pela aplicação), no momento do
- seu carregamento sera lançada uma exceção do tipo ConfigurationException, cuja causa é uma
- ClassNotFoundException. Caso a classe de configuração não esteja associada a um
- arquivo que contenha a chave de um de seus parâmetros do tipo Class, este será carregado
- com valor nulo.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Map
-
-
-
-
-
- Para utilizar parâmetros do tipo Map, o arquivo de configurações deve usar a seguinte
- estrutura na formação da chave: prefixo+nomedoatributo+chavedomap. Vejamos um exemplo.
- Se temos em nossa aplicação uma classe de configuração como a mostrada abaixo:
-
- connectionConfiguration;
-
- public Map getConnectionConfiguration() {
- return connectionConfiguration;
- }
-}
- ]]>
-
- O arquivo de configuração deverá ser preenchido no seguinte formato (se for do tipo properties):
-
-
-
- Dessa forma, ao fazer a chamada connectionConfiguration.get("gateway"); por exemplo, o valor retornado será
- 192.168.0.1.
-
-
-
-
- Você pode utilizar a chave do Map com nome "default" para indicar que, no arquivo de configuração, a chave é formada
- apenas pela junção do prefixo com o atributo, sem utilizar a própria chave do Map. Por exemplo, se o seu arquivo de propriedades
- contiver uma chave:
-
-
- então seu código poderá ter um comando:
-
- e o valor de value será "Default Value".
-
-
- Caso a classe de configuração não esteja associada a um arquivo que contenha a chave de um de seus parâmetros
- do tipo Map, este será carregado com valor nulo, e estará sujeito às exceções
- informadas anteriormente, conforme o tipo de variáveis que ele contenha.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Array
-
-
-
-
-
- No caso do Array, a principal diferença em relação às demais formas de declarar
- configurações é a maneira de atribuir valores aos seus respectivos elementos no arquivo de configuração.
- Por exemplo, para que um Array de inteiros, de nome integerArray
- tenha o conteúdo {-1, 0, 1}, você deve criar um arquivo de propriedades que contenha
- as seguintes linhas:
-
-
-
- Exceto a forma de atribuir os valores às configurações, se comporta de acordo com o tipo de variável que ele
- contém, conforme o espeficifcado para cada um.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Enum
-
-
-
-
-
- É possível criar uma lista de constantes do tipo Enum e carregar um valor de constante
- através de um arquivo de configuração. Por exemplo, caso exista o seguinte Enum
-
-
-
-
- e ele seja usado no seguinte arquivo de configuração
-
-
-
- O arquivo do tipo properties pode ser criado assim:
-
-
-
-
-
- O valor definido no arquivo de configuração para atributos do tipo Enum deve
- ser idêntico ao nome da constante definida no Enum, inclusive casando letras maiúsculas e
- minúsculas. De fato, o valor da propriedade deve casar com o valor retornado no código:
- Enum.name().
-
-
-
- Caso o valor definido no arquivo de configuração não case com nenhuma constante definida no Enum,
- uma exceção de tipo ConfigurationException de causa ConversionException
- será lançada. Já se à propriedade for atribuido um valor vazio, o atributo do tipo Enum receberá
- o valor null.
-
-
-
-
-
-
-
-
-
-
-
- Mais Recursos
-
- Além das possibilidades relacionadas acima, existem ainda algumas anotações e recursos extras que o
- Demoiselle Framework oferece para o desenvolvedor na utilização das configurações. A seguir
- listamos e explicamos como utilizar esses recursos em sua aplicação.
-
-
-
-
-
-
-
-
- Ignore
-
-
-
-
-
- Por padrão, todos os atributos existentes em uma classe anotada com @Configuration são tratados
- como parâmetros de configuração e serão automaticamente preenchidos durante a leitura do recurso. Porém, caso você
- não queira que determinado atributo seja tratado como parâmetro dentro desse tipo de classe, basta anotá-lo com
- a anotação @Ignore, que o atributo será ignorado (como indica a própria anotação) pelo carregador
- de configurações.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Valor Padrão
-
-
-
-
-
- Muitas vezes é interessante que especifiquemos um valor padrão para o parâmetro, para o caso dele não estar
- presente no arquivo de configuração. Para isso, basta atribuir o valor desejado no momento da declaração do
- atributo, como exemplificado abaixo:
-
-
-
- Com essa atribuição, se no arquivo de propriedades não existir uma chave com valor applicationTitle
- esse parametro será carregado com o valor My App.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Bean Validation
-
-
-
-
-
- Fazer validação mantém a integridade dos dados e pode ser fator importante na lógica da aplicação. A partir da
- versão 2.4.0 o Demoiselle permite que os atributos das classes de configuração sejam
- anotados com todas as anotações definidas pela JSR 303 (Bean Validation). Com esse recurso você pode exigir que
- determinado parâmetro não seja nulo (@NotNull), limitar um valor máximo ou mínimo para ele
- (@Max e @Min, respectivamente), dentre outras restrições (que podem
- ser feitas simultâneamente). A lista completa das restrições que podem ser aplicadas nos atributos das classes
- de configuração pode ser conferida aqui:
-
- http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html.
-
-
- Para utilizar esse recurso você deve ter como dependência de seu projeto alguma implementação da especificação
- Bean Validation. A implementação de referência é o
- Hibernate Validator.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Name
-
-
-
-
-
- Em alguns casos você pode querer que um determinado parâmetro tenha nomes diferentes na classe de configuração e
- no arquivo de propriedades. Para isso você pode utilizar a anotação @Name. Basta anotar
- o atributo passando como parâmetro o nome pelo qual você deseja que ele seja procurado no arquivo de propriedades,
- como mostra o exemplo abaixo:
-
-
-
- Com essa anotação, ao invés de procurar pela chave applicationTitle, o
- Demoiselle irá buscar pela chave app.title.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Escopo
-
-
-
-
-
- A partir da versão 2.3.3 do Demoiselle Framework as classes anotadas com
- @Configuration estarão por padrão no escopo estático (@StaticScoped).
-
-
-
-
-
-
-
-
-
-
-
-
-
- Extratores
-
-
-
-
-
- Você precisa de parâmetros de um tipo que ainda não é suportado pelo Demoiselle? Você
- pode implementar sua própria classe extratora. A partir da versão 2.4.0 as aplicações
- podem implementar a interface ConfigurationValueExtractor, e ter um
- extrator de configurações para atributos de qualquer tipo. Essa interface obriga a classe
- a implementar os métodos: boolean isSupported(Field field), que retorna true
- caso a classe seja extratora daquele tipo de campo, e
- Object getValue(String prefix, String key, Field field, Configuration configuration)
- throws Exception que deve extrair o valor do campo da forma correta.
-
-
-
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/controlador.xml b/documentation/reference/pt-BR/controlador.xml
deleted file mode 100644
index bc31c56..0000000
--- a/documentation/reference/pt-BR/controlador.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
- Controlador
-
-
- No Demoiselle Framework os controladores ou controllers servem para identificar as camadas da
- arquitetura de sua aplicação. É comum que as aplicações utilizem apenas três camadas: visão, negócio e persistência.
- Existem aplicações que utilizam fachadas. Por esse motivo, foram implementados nessa versão do framework cinco controllers:
-
- ViewController
- FacadeController
- BusinessController
- PersistenceController
- ManagementController
-
-
-
-
-
- Além de identificar as camadas, os controllers são pré-requisitos para utilização da funcionalidade de tratamento de exceções,
- através do uso da anotação @ExceptionHandler. Isso quer dizer que para utilizar essa funcionalidade, a classe
- precisa usar um dos controllers citados acima ou a própria anotação @Controller, ou ainda um controller criado
- exclusivamente para sua aplicação. Todos os controllers criados no framework são estereótipos e podem ser usados também para
- definição de características como, por exemplo, o escopo. Isso quer dizer que se um controller tem um determinado escopo, todas
- as classes desse controller também terão o mesmo escopo. Foi falado que é possível criar um controller para uso exclusivo em sua
- aplicação, mas como fazer isso? Veja na seção abaixo.
-
-
-
-
- Como criar seu controlador
-
- É comum nos depararmos com situações onde precisamos criar controllers exclusivos com determinadas características ou
- que sirvam apenas para determinar algum tipo de funcionalidade. Para criar um novo controller no Demoiselle, basta que ele
- esteja anotado com @Controller, como no exemplo abaixo.
-
-
-
- Neste exemplo foi criado um controlador chamado SeuController que tem a característica de ter um escopo de
- View. Isto quer dizer que toda classe que seja desse tipo de controlador também terá o escopo de View.
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/excecao.xml b/documentation/reference/pt-BR/excecao.xml
deleted file mode 100644
index 0c49eb7..0000000
--- a/documentation/reference/pt-BR/excecao.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-
-
- Exceções
-
-
- Esta funcionalidade foi feita para você que acha muito verboso encher o código de try/catch.
- E o que dizer de repetir o tratamento de exceções em vários métodos da mesma classe na base do copiar/colar?
- Oferecemos a você uma alternativa para resolver estes problemas, mas você estará livre para usá-la: isoladamente,
- misturando com a forma verbosa ou até mesmo não usá-la.
-
-
-
- Configurando
-
- Para um correto funcionamento do Demoiselle é necessário inserir o interceptador de exceção no arquivo src/main/WEB-INF/beans.xml.
-
-
-
- br.gov.frameworkdemoiselle.exception.ExceptionHandlerInterceptor
-
-]]>
-
-
-
- Tratadores de exceção
-
- Para definir um tratador de exceção, basta anotar o método com @ExceptionHandler.
- O tratamento de exceções só é possível em classes anotadas com @Controller ou os derivados
- desta anotação. Para ver mais detalhes sobre controladores no Demoiselle, leia o capítulo Controladores.
-
-
-
- Neste exemplo, qualquer exceção do tipo NullPointerException que ocorrer nos métodos
- da classe Simples terá o tratamento delegado para o método tratador().
- Para as exceções não tratadas, o comportamento seguirá o padrão da linguagem.
-
-
-
-
- Múltiplos tratadores
-
- Não se limite a apenas um tratador por classe, você pode ter vários.
-
-
-
- Caso as exceções NullPointerException ou AbacaxiException ocorram
- nos métodos da classe Simples, o tratamento será delegado para o seu tratador.
-
-
-
-
- Misturando os dois mundos
-
- É possível que, em determindas situações no seu projeto, você precise misturar o tratamento sofisticado com a
- tradicional forma verbosa. Como fazer isso?
-
-
- Suponha que no método inserir() você precise dar um tratamento exclusivo para uma exceção.
- Para isso, misture as duas abordagens para atingir o seu objetivo.
-
-
-
- Neste caso a exceção AbacaxiException só será tratada no método inserir().
-
-
-
-
- Exceção de Aplicação
-
- 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
- rollback. 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 diferenciada. Estas duas opções são possíveis através do uso da anotação @ApplicationException.
- Utilize-a em suas exceções e informe os atributos rollback e severity para alcançar os objetivos acima.
-
-
-
- No exemplo citado acima, estamos informando que caso esta exceção seja lançada por um método anotado com @Transactional, este
- método sofrerá um rollback. Ao mesmo tempo, sua camada de exibição apresentará uma mensagem automática para o usuário, conforme o nível de severidade.
- O comportamento padrão para o rollback é realizar o rollback sempre que a exceção for lançada.
- O grau de severidade padrão é informativo (INFO).
-
-
-
-
- Tratamento Padrão
-
- 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 de outra tecnologia de visão. Qualquer exceção lançada que chega até a camada de apresentação recebe um tratamento
- especial. Inicialmente, ela é encapsulada de forma que possa ser exibida de forma elegante para o usuário. No caso do JSF, é utilizado o mecanismo
- de Messages próprio desta tecnologia.
-
-
- 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 exceções que não usam a anotação @ApplicationException, um rollback é realizado
- de forma automática. Por último, sem o uso desta anotação, toda exceção é vista como tendo nível de gravidade igual a ERROR.
-
-
-
-
diff --git a/documentation/reference/pt-BR/gerenciamento.xml b/documentation/reference/pt-BR/gerenciamento.xml
deleted file mode 100644
index 1902921..0000000
--- a/documentation/reference/pt-BR/gerenciamento.xml
+++ /dev/null
@@ -1,305 +0,0 @@
-
-
-
-
- Monitoração e Gerenciamento de Recursos
-
-
- Por que monitorar e gerenciar aplicações
-
- Ao implantar um sistema para produção, muitas vezes é necessário monitorar aspectos sobre o funcionamento desse sistema. Quanta memória
- ele está utilizando? Qual o pico de MIPS utilizados? Quantas sessões estão autenticadas no momento?
-
- Além de monitorar um sistema, as vezes é necessário gerenciá-lo alterando aspectos de seu comportamento. Se o sistema está implantado em um
- servidor alugado, talvez seja necessário ajustar o uso de MIPS para reduzir custos ou talvez deseje-se solicitar que o sistema limpe dados de sessão
- de autenticação abandonados por usuários que desligaram suas estações sem efetuar "logoff".
-
- Para esse fim existem diversas tecnologias que permitem ao desenvolvedor expor aspectos monitoráveis e gerenciáves de seu sistema
- para clientes de gerenciamento. Exemplos dessas tecnologias incluem o Simple Network Management Protocol (SNMP) e o
- Java Management Extension (JMX).
-
- O Demoiselle Framework dispõe de uma série de ferramentas para nivelar
- o conhecimento do desenvolvedor e facilitar o uso e integraçao de várias tecnologias de gerenciamento e
- monitoração. Através de seu uso o desenvolvedor pode facilmente integrar tais tecnologias, despreocupando-se
- com detalhes de implementação de cada uma delas.
-
-
-
- Introdução ao mecanismo
-
- Para expor aspectos monitoráveis da sua aplicação, o primeiro passo é criar uma interface contendo os atributos monitoráveis e as operações
- de gerenciamento que serão expostas para clientes de gerenciamento. Isso é feito através de uma simples classe Java (ou POJO)
- anotada com o estereótipo @ManagementController.
-
-
-
- Essa anotação é suficiente para o mecanismo de gerenciamento descobrir sua classe e disponibilizá-la para ser monitorada e gerenciada.
-
- Contudo, a simples anotação acima não informa ao mecanismo quais aspectos da classe serão expostos. Por padrão, um Management Controller
- não expõe nenhum aspecto seu. Para selecionar quais aspectos serão expostos usamos as anotações
- @ManagedProperty e @ManagedOperation. Além disso outras anotações podem ser usadas para personalizar o funcionamento
- de classes anotadas com @ManagementController.
-
-
-
-
-
- Anotação
- Descrição
- Atributos
-
-
-
-
-
-
- @ManagedProperty
-
-
-
- Marca um atributo na classe como uma propriedade gerenciada, significando que clientes externos podem ler e/ou escrever valores nesses atributos.
- Um atributo marcado pode estar disponível para leitura e/ou escrita. Por padrão, o que determina a visibilidade de um atributo
- marcado é a presença dos métodos getAtributo e setAtributo, respectivamente disponibilizando o atributo
- para leitura e escrita.
- Para sobrescrever esse comportamento existe na anotação @ManagedProperty o atributo accessLevel.
- Com ele é possível criar um atributo apenas para leitura, mas que contenha um método set. O contrário também é possível.
-
-
-
-
- description: Um texto descritivo documentando o propósito da propriedade.
- accessLevel: Sobrescreve o nível padrão de acesso de uma propriedade. Os valores possíveis são
- READ_ONLY, WRITE_ONLY e DEFAULT, que significa que a presença de métodos get e set vai determinar o nível de acesso.
-
-
-
-
-
-
- @ManagedOperation
-
-
-
- Marca um método da classe gerenciada como uma operação, o que significa que clientes externos podem invocar esse método remotamente.
- Operações gerenciadas normalmente são criadas para executar intervenções em um sistema já em execução. Por exemplo, é possível criar uma
- operação que, ao ser invocada, destrua todas as seções abertas no servidor e não utilizadas nos últimos 30 minutos.
-
-
-
-
- description: Um texto descritivo documentando o propósito da operação.
- type: Documenta o propósito da operação. ACTION informa que a operação modificará
- o sistema de alguma forma. INFO diz que a operação coletará e retornará informações sobre o sistema. ACTION_INFO
- informa que a operação modificará o sistema de alguma forma e retornará informações sobre o resultado. UNKNOWN é o padrão
- e significa que o resultado da execução da operação é desconhecido.
-
-
-
-
-
-
- @OperationParameter
-
-
-
- Esta anotação opcional pode ser usada para cada parâmetro de um método anotado com @ManagedOperation.
-
- Ele permite detalhar melhor parâmetros em uma operação gerenciada. O efeito desta anotação é dependente da
- tecnologia utilizada para comunicação entre cliente e servidor. Na maioria das tecnologias, essa anotação meramente permite ao cliente
- exibir informações sobre cada parâmetro: nome, tipo e descrição.
-
-
-
-
- name: O nome do parâmetro quando exibido para clientes.
- description: Um texto descritivo documentando o propósito do parâmetro.
-
-
-
-
-
-
-
-
-
-
-
-
- Expondo aspectos de sua aplicação para monitoração
-
- Uma vez que uma classe esteja anotada com @ManagementController e seus atributos e operações estejam expostos, a classe está pronta para
- ser monitorada.
-
- Suponha que a aplicação deseje expor o número de usuários que efetuaram login. A operação de login será processada em
- uma classe de negócio ControleAcesso. Vamos supor também que existe uma classe chamada MonitorLogin responsável
- por expor o número de usuários que efetuaram login no sistema.
-
-
-
-
-
- Como é possível ver, classes anotadas com @ManagementController podem ser injetadas em qualquer ponto do código. Valores definidos
- para seus atributos retêm seu estado, então um cliente que acesse remotamente o sistema e monitore o valor do atributo contadorLogin verá
- a quantidade de logins efetuados no momento da consulta.
-
-
- Enviando notificações da aplicação
-
-
- É comum que aplicações monitoradas permaneçam em estado de espera - é função do cliente de monitoração acessar a aplicação e obter
- as informações necessárias. No entanto existem casos onde é necessário que a aplicação comunique clientes de eventos ocorridos no sistema. Um exemplo é um monitor
- de espaço em disco que envia um alerta quando esse espaço for menor que 20% do total.
-
-
-
- Para essa funcionalidade o Demoiselle Framework disponibiliza o utilitário NotificationManager, que
- pode ser injetado em sua aplicação a qualquer momento para notificar clientes externos de eventos importantes.
-
-
- Considere o exemplo abaixo:
-
-
-
-
- Como é possível ver no exemplo, o utilitário NotificationManager é usado para enviar notificações em decorrência
- de eventos ocorridos na sua aplicação. O uso mais comum é notificar avisos ou problemas para que ações sejam tomadas, mas é possível também
- usar essa técnica para tomar ações preventivas ou informativas - uma notificação que o backup noturno foi feito com sucesso por exemplo.
-
-
-
- A interface Notification é a base das notificações enviadas e possui apenas um método:
- Object getMessage(). A API de monitoração não força o tipo específico da mensagem e usualmente essa mensagem
- será uma String (como no exemplo acima), mas algumas extensões podem utilizar tipos específicos de mensagem
- capazes de carregar mais informações.
-
-
-
- O demoiselle-core disponibiliza por padrão o tipo concreto de notificação DefaultNotification - uma
- implementação direta da interface Notification que permite definir a mensagem a ser retornada por getMessage().
- Além disso o demoiselle-core disponibiliza o tipo especial de mensagem AttributeChangeMessage, que permite
- especificar além do texto da mensagem enviada, dados sobre a mudança de valor de um atributo, como o nome do atributo alterado, o valor antigo e o novo.
-
-
- Notificações contendo mensagens do tipo AttributeChangeMessage são automaticamente enviadas por padrão pelo framework quando um
- agente de monitoração altera o valor de uma propriedade anotada com @ManagedProperty, mas você também pode enviar mensagens desse tipo
- quando propriedades de sua aplicação são alteradas. Extensões e componentes compatíveis com a API de monitoração do Demoiselle Framework
- (por exemplo, a extensão demoiselle-jmx) podem fornecer implementações específicas da interface Notification e
- tipos especializados de mensagem. Consulte a documentação desses componentes para aprender sobre seus usos.
-
-
-
-
-
-
- Conectando um cliente de monitoração
-
- O demoiselle-core contém as funcionalidades necessárias para marcar aspectos monitoráveis de sua aplicação,
- mas não conta com nenhum mecanismo para estabelecer uma conexão com um cliente de monitoração. Para isso utiliza-se extensões do framework.
-
- A extensão padrão do framework Demoiselle responsável pela tecnologia de monitoração é a demoiselle-jmx.
- Essa extensão utiliza a especificação JMX (JSR 3) e permite registrar as classes marcadas para monitoração como MBeans.
- Uma vez que as classes sejam registradas como MBeans, seus atributos e operações expostos para monitoração podem ser
- acessados via JMX por um cliente adequado, como o JConsole que acompanha por padrão o JDK da Oracle.
-
-
- Para acrescentar a extensão demoiselle-jmx em um projeto Maven, adicione a dependência abaixo no arquivo pom.xml.
-
-
- br.gov.frameworkdemoiselle
- demoiselle-jmx
- compile
-]]>
-
-
-
- A API de monitoração é compatível com o uso de múltiplas extensões simultãneas. Adicione em seu projeto a dependência às extensões desejadas e configure-as
- individualmente, as classes monitoradas serão então expostas para todas as extensões escolhidas.
-
-
- A figura mostra como uma classe monitorada é exibida no JConsole.
-
-
-
- JConsole acessando uma aplicação monitorada
-
-
-
-
- JConsole acessando a aplicação Bookmark
-
-
-
-
- É possível perceber os seguintes elementos nessa imagem:
-
- Uma classe gerenciada HelloWorldManager com uma operação chamada saySomething
- Uma classe geradora de notificações NotificationBroadcaster responsável por converter as notificações para a API JMX
-
-
-
-
- Através do JConsole é possível invocar comandos e acessar atributos em todas as classes anotadas com @ManagementController
- em aplicações que usam o demoiselle-jmx. Também é possível inscrever-se às notificações enviadas por NotificationBroadcaster
- e receber todas as notificações enviadas pela aplicação.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/documentation/reference/pt-BR/images/jmx-jconsole-example.png b/documentation/reference/pt-BR/images/jmx-jconsole-example.png
deleted file mode 100644
index 696a86a..0000000
Binary files a/documentation/reference/pt-BR/images/jmx-jconsole-example.png and /dev/null differ
diff --git a/documentation/reference/pt-BR/inicializacao.xml b/documentation/reference/pt-BR/inicializacao.xml
deleted file mode 100644
index 17d18ba..0000000
--- a/documentation/reference/pt-BR/inicializacao.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-
-
-
-
- Inicialização
-
-
- Introdução ao mecanismo
-
- Uma aplicação qualquer, seja do tipo Web ou desktop, geralmente necessita efetuar determinadas tarefas durante a sua
- inicialização e ou finalização. Eis alguns exemplos: abertura de conexão a um servidor de banco de dados, carregamento de
- parâmetros de configuração a partir de arquivos externos e execução de scripts específicos. Ou seja, normalmente essas ações
- são definidas como funções estruturais da aplicação.
-
-
- Para que a execução dessas ações ocorra de forma concisa, faz-se necessário o uso de um mecanismo padronizado para inicialização
- do ambiente. O Demoiselle Framework fornece esse mecanismo através da especificação CDI introduzindo duas
- anotações: @Startup e @Shutdown.
-
-
-
-
- Implementação na aplicação
-
- A fim de utilizar o mecanismo inerente do Demoiselle Framework, é preciso simplesmente anotar os métodos
- contendo as instruções desejadas com @Startup, para a inicialização, ou
- @Shutdown, para a finalização.
-
-
-
- O mecanismo de inicialização do Demoiselle Framework é independente da natureza da aplicação Java, isto é,
- visa tanto aplicações do tipo Web quanto do tipo desktop (ex: Swing).
-
-
-
- As instruções contidas em um método anotado com @Startup serão executadas automaticamente quando a aplicação
- Java for inicializada, seja ela hospedada em um contêiner Web ou executada através de um método main().
- Nenhum outro arquivo ou classe precisa ser definido. A anotação @Startup pode ser utilizada em conjunto com a anotação
- @Priority, que recebe como parâmetro um número inteiro que serve para definir a prioridade de execução do respectivo
- método, na existência de mais de um inicializador para a aplicação.
-
-
- De maneira análoga, um método anotado com @Shutdown será executado no momento de finalização de uma aplicação,
- obedecendo também à ordem de prioridade definida com a anotação @Priority.
-
-
- Eis um exemplo de implementação de inicializador em uma aplicação:
-
-
-
-
- Para a definição de prioridade de execução de um método na inicialização ou finalização, podem ser
- utilizadas as constantes MIN_PRIORITY ou MAX_PRIORITY presentes em
- br.gov.frameworkdemoiselle.annotation.Priority.
-
-
-
-
-
- Um exemplo prático
-
- Eis um interessante caso de uso de inicialização e finalização: rodar um servidor de modo standalone em paralelo à
- execução da aplicação principal. Eis o código referente a essa implementação:
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/instalacao.xml b/documentation/reference/pt-BR/instalacao.xml
deleted file mode 100644
index abbe98b..0000000
--- a/documentation/reference/pt-BR/instalacao.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
- Instalação
-
-
- Pré-requisitos
-
-
-
-
-
-
-
-
- Software
-
-
- Versão
-
-
- Site
-
-
-
- Java Development Kit (JDK)
- 6.0
- http://openjdk.org/
-
-
- Apache Maven
- 2.2
- http://maven.apache.org/
-
-
- Eclipse IDE
- 3.6
- http://www.eclipse.org/
-
-
- m2eclipse plugin
- 0.10
- http://m2eclipse.sonatype.org/
-
-
- JBoss Application Server
- 6.0
- http://www.jboss.org/
-
-
-
-
-
-
-
- Demoiselle Infra
-
- Para auxiliar no preparo do ambiente integrado de desenvolvimento utilizado na presente
- documentação, recomenda-se a utilização dos pacotes de software fornecidos pelo projeto
- Demoiselle Infra.
-
-
-
- Atualmente são disponibilizados pacotes exclusivamente para a plataforma GNU/Linux
- e distribuições baseadas no Debian, tal como Ubuntu.
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/intro.xml b/documentation/reference/pt-BR/intro.xml
deleted file mode 100644
index 0f900f2..0000000
--- a/documentation/reference/pt-BR/intro.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
- Introdução
-
-
- O que é o Demoiselle?
-
- O Demoiselle Framework implementa o conceito de
- framework integrador.
- Seu objetivo é facilitar a construção de aplicações minimizando tempo dedicado à escolha e integração de frameworks
- especialistas, o que resulta no aumento da produtividade e garante a manutenibilidade dos sistemas. Disponibiliza
- mecanismos reusáveis voltados as funcionalidades mais comuns de uma aplicação (arquitetura, segurança, transação,
- mensagem, configuração, tratamento de exceções, etc).
-
-
- O nome Demoiselle
- é uma homenagem à série de aeroplanos construídos por Santos Dummont entre 1907 e 1909. Também conhecido como
- Libellule, as Demoiselles foram os melhores, menores e mais baratos aviões da sua época. Como
- sua intenção era popularizar a aviação com fabricação em larga escala, o inventor disponibilizou os planos em revistas
- técnicas para qualquer pessoa que se interessasse.
-
-
- O Demoiselle Framework usa a mesma filosofia do Pai da Aviação, tendo sido
- disponibilizado como software livre em abril de 2009, sob a licença livre LGPL version 3. Mais informações no portal
- "www.frameworkdemoiselle.gov.br
-
-
-
-
- Sobre a versão 2
-
- O principal objetivo da versão 2 do
- Demoiselle Framework
- é a completa aderência à especificação
- JSR 316: Java Platform, Enterprise Edition 6, ou simplesmente
- Java EE 6. Para saber mais, recomendamos os links
- Introducing the Java EE 6 Platform
- e
- As novidades da JEE 6.
-
-
- Esta documentação é referente às especificações da versão 2 cadastradas no
- tracker
- do Demoiselle, as quais foram publicamente discutidas no fórum
- demoiselle-proposal.
-
-
- Os capítulos a seguir entram em detalhes sobre cada uma das principais funcionalidades do framework. Tenha uma
- boa leitura!
-
-
-
-
diff --git a/documentation/reference/pt-BR/logger.xml b/documentation/reference/pt-BR/logger.xml
deleted file mode 100644
index 09e5a11..0000000
--- a/documentation/reference/pt-BR/logger.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- Logger
-
-
- Uma API de logging é um recurso interessante para informar o usuário e o desenvolvedor sobre os erros, alertas,
- resultados de operações, os recursos acessados e outras informações a respeito do sistema. Por esse motivo foi
- implementada na versão 2.X do Demoiselle Framework uma fábrica de logger que fica no core
- e visa permitir a injeção desse recurso baseado na classe org.slf4j.Logger. Veja abaixo como
- usar o logger no Demoiselle:
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/master.xml b/documentation/reference/pt-BR/master.xml
deleted file mode 100644
index 7e74c94..0000000
--- a/documentation/reference/pt-BR/master.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
-
-
- Sobre o Guia de Referência - versão &version;
-
- Este documento tem como objetivo ser um guia de referência destinado a todos
- que desejem conhecer melhor o Framework Demoiselle &version; e
- suas funcionalidades.
-
-
-
- Esta documentação refere-se à versão &version; do Demoiselle Framework
- e pode diferir significativamente das versões anteriores.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/mensagem.xml b/documentation/reference/pt-BR/mensagem.xml
deleted file mode 100644
index 83c1013..0000000
--- a/documentation/reference/pt-BR/mensagem.xml
+++ /dev/null
@@ -1,439 +0,0 @@
-
-
-
-
- Tratamento de Mensagens
-
-
- Mensagens em uma aplicação
-
- Uma aplicação bem estruturada, seja na plataforma Web ou Desktop, deve exibir mensagens informativas,
- de aviso, ou de erro para o usuário após efetuar determinadas tarefas. Por exemplo, após gravar um registro
- no banco de dados, é aconselhável que a aplicação exiba uma mensagem informativa. Se alguma exceção
- ocorreu, é preciso exibir uma mensagem de erro. Ou seja, a severidade da mensagem deve ser escolhida de
- acordo com o resultado da execução.
-
-
- Veja na tabela a seguir a definição de cada um dos níveis de severidade da mensagem em uma aplicação e
- um exemplo de texto associado:
-
-
- Níveis de severidade em mensagens
-
-
-
-
-
-
- Severidade
- Utilização
- Exemplo de texto
-
-
-
-
- Informação
-
-
- Usada quando da ocorrência normal ou esperada no fluxo, com o objetivo de confirmar ao
- usuário uma situação de sucesso.
-
-
- Aluno incluído com sucesso.
-
-
- Aviso
-
-
- Usada quando uma regra de negócio ou validação qualquer da aplicação tenha desviado o
- fluxo normal de execução.
-
-
- A turma selecionada já está lotada. Matrícula do aluno não efetuada.
-
-
- Erro
-
-
- Reservado para o caso de uma situação anormal, tal como exceções provenientes de
- ambiente (falha de conexão na rede, queda de um servidor de banco de dados, etc)
- tenha impedido a execução.
-
-
- Não foi possível efetuar a modificação do aluno.
-
-
-
-
-
- Em uma aplicação construída usando-se arquitetura em camadas, as mensagens geralmente são originadas em
- uma determinada camada e precisam ser transmitidas às demais até chegar ao usuário. Por exemplo, se ocorre
- um erro de gravação no banco de dados, isto é, na camada de persistência, tal informação precisa ser
- repassada às camadas subsequentes, ou seja, as camadas de negócio e posteriormente de controle e visão.
- Este conceito é justamente chamado de tratamento de mensagens, o qual, ao lado do
- tratamento de exceções, auxilia o fluxo de execuções em uma aplicação bem arquiteturada. Em resumo, é
- preciso programar a troca de mensagens entre as diversas camadas de uma aplicação orientada a objetos.
-
-
- Veremos na seção a seguir como o Demoiselle Framework pode ajudar o
- desenvolvedor na tarefa de troca de mensagens em uma aplicação.
-
-
-
-
- Introdução ao mecanismo
-
- Ortogonalmente às camadas verticais da aplicação (i.e., apresentação, negócio e persistência), a arquitetura
- proposta pelo Demoiselle Framework fornece os contextos de transação, segurança e mensagem.
- Este último é justamente responsável pela troca de mensagens entre as camadas.
-
-
- Tecnicamente falando, o contexto de mensagens no Demoiselle Framework é representado pela
- interface MessageContext. Esta interface contém métodos destinados a inclusão, recuperação e
- limpeza de mensagens no contexto.
-
-
- Para obter uma instância do contexto de mensagens, basta injetá-lo na classe:
-
-
-
- A maneira mais simples de se inserir uma mensagem no contexto é invocando o método add() de
- MessageContext passando como argumento o texto literal da mensagem:
-
-
-
- Opcionalmente, pode-se indicar a severidade da mensagem:
-
-
-
-
- Quando a severidade não é informada (argumento de tipo SeverityType), será considerado
- o nível informativo, isto é, INFO.
-
-
-
- Para a transmissão das mensagens no contexto é também fornecida a interface Message, a qual
- permite com que os textos sejam obtidos de catálogos especializados, tais como arquivos de propriedades ou banco
- de dados. Essa interface precisa ser implementada em uma classe customizada pelo desenvolvedor.
- Sua estrutura é bem simples:
-
-
-
- A classe DefaultMessage fornecida pelo Demoiselle Framework
- é uma implementação da interface Message que faz uso dos arquivos de recurso da aplicação
- para obtenção das descrições das mensagens. Especificamente utiliza o arquivo messages.properties.
-
-
-
- A unidade básica de manipulação de mensagens no Demoiselle Framework
- é a interface Message. Basta que ela seja implementada na aplicação para que o
- contexto de mensagens possa manipulá-la. A classe DefaultMessage é oferecida
- como implementação padrão dessa interface.
-
-
-
- Para incluir uma mensagem no contexto usando o tipo Message é preciso invocar o método
- add() de MessageContext passando o objeto como argumento. Eis um
- exemplo disso utilizando a classe DefaultMessage:
-
-
-
- A extensão para demoiselle-jsf
- transfere automaticamente as mensagens incluídas no MessageContext
- para o FacesContext.
-
-
- O contexto de mensagens, representado pela interface MessageContext, é capaz de
- armazenar diversas mensagens em uma mesma requisição. Ele não é restrito a aplicações do tipo Web,
- isto é, pode ser usado também para aplicações do tipo desktop (i.e., Swing).
-
-
-
-
- Parametrização das mensagens
-
- Um recurso importante no tratamento de mensagens de uma aplicação consiste na parametrização dos textos que
- elas carregam. Isso é extremamente útil para indicar com detalhes uma situação específica, com o objetivo de
- melhor informar o usuário. Por exemplo, ao invés de simplesmente exibir
- Exclusão de disciplina não permitida é preferível mostrar o seguinte texto mais explicativo
- Exclusão não permitida: disciplina está sendo usada pela turma 301.
- Para efetuar essa parametrização, é preciso usar a formatação de textos padronizada pela classe
-
- java.text.MessageFormat da API do Java, que basicamente considera a notação de
- chaves para os argumentos.
-
-
- O Demoiselle Framework usa a MessageFormat para efetuar a
- parametrização e formatação dos valores. Para usar essa funcionalidade, basta incluir as chaves na string
- da mensagem e ao inseri-la no contexto especificar os parâmetros:
-
-
-
- Eis um exemplo mais avançado do uso de parametrizações em mensagens:
-
-
-
- O resultado da execução deste código seria um texto como:
- Às 13:45:05 do dia 03/01/11 houve falta do professor na turma 502.
- Ou seja, os argumentos {0}, {1} e {2}
- são substituídos por seus respectivos elementos na ordem em que são passados no método
- add(), sendo que ainda podemos formatar esses valores.
-
-
-
- É possível passar mais de um parâmetro nas mensagens adicionadas no contexto, usando para isso a
- sintaxe de formatação da classe java.text.MessageFormat. A ordem dos argumentos
- passados no método add() reflete nos elementos substituídos na string.
-
-
-
-
-
- Internacionalização das mensagens
-
- A DefaultMessage oferece a funcionalidade de internacionalização da aplicação, ou seja,
- a disponibilização dos textos em diversos idiomas. Numa aplicação do tipo Web, o mecanismo de internacionalização
- faz com que as mensagens e textos sejam exibidos de acordo com o idioma selecionado pelo usuário na configuração
- do navegador.
-
-
- Como já foi citado anteriormente, a implementação DefaultMessage busca os textos das mensagens
- no arquivo de recursos messages.properties, o qual possui entradas no conhecido formato
- chave=valor. Todavia, para fazer uso desses textos, é preciso passar a chave da mensagem
- desejada como argumento na invocação do construtor da classe. Este identificador precisa estar entre sinais de
- chaves, tal como no exemplo a seguir:
-
-
-
- Ou seja, ao invés de usar a string literal, passamos o identificador da chave presente no arquivo de propriedades.
-
-
-
- O símbolo de chaves {} na string do construtor da classe DefaultMessage
- indica se o texto da mensagem será recuperado de um arquivo de recursos ou considerado o texto literal.
-
-
-
- Eis um exemplo de conteúdo do arquivo messages.properties destinado a manter por padrão os
- textos no idioma português brasileiro (i.e., pt-BR). Veja que ele contém a chave
- ALUNO_INSERIR_OK usada no exemplo anterior:
-
-
-
- A fim de prover internacionalização para o idioma inglês americano (i.e., en-US) no exemplo
- em questão, eis o conteúdo do arquivo messages_en_US.properties:
-
-
-
- Similarmente, o arquivo messages_fr.properties se destina a prover as mensagens no idioma
- francês (independente do país), contendo as linhas a seguir:
-
-
-
-
- As chaves das mensagens (ex: ALUNO_INSERIR_OK) devem ser as mesmas em todos os arquivos de
- propriedades. São elas que identificam unicamente uma mensagem, que ao final do processo tem o seu texto
- automaticamente traduzido para o idioma preferido do usuário.
-
-
-
-
- É possível ainda configurar de modo genérico o idioma, especificando apenas a língua. Por exemplo, ao invés de
- inglês britânico (en_GB) e inglês americano (en_US), podemos simplesmente
- definir o idioma inglês (en). Neste caso, o arquivo deverá ser o
- messages_en.properties.
-
-
-
-
- Internamente o Demoiselle Framework usa a classe
- java.util.Locale
- presente na API do Java para manipular os textos das mensages durante a internacionalização.
-
-
-
-
- A seleção de idioma na internacionalização de uma aplicação consiste na definição de:
-
- língua: códigos formados por duas letras em minúsculo listados na ISO-639 (ISO Language Code) - exemplos: pt, en, fr, es, de;
- país: códigos formados por duas letras em maiúsculo listados na ISO-3166 (ISO Country Code) - exemplos: BR, PT, US, GB.
-
-
-
-
-
-
- Destino das mensagens
-
-
- O Framework Demoiselle permite configurar o destino das mensagens enviadas. Por padrão, mensagens enviadas em um ambiente SE (Swing por exemplo)
- são exibidas como registros de log no console, já mensagens enviadas em um ambiente WEB usando JSF 2.0 são redirecionadas para a classe
- FacesContext. Caso esse comportamento padrão não seja suficiente para você, é possível personalizar o mecanismo de redirecionamento
- de mensagens, fazendo-o enviar as mensagens para um local de seu interesse.
-
-
-
- Para isso existe a interface MessageAppender. Para toda mensagem enviada, o Framework Demoiselle vai determinar a implementação
- mais adequada de MessageAppender a utilizar e vai redirecionar qualquer mensagem para essa implementação.
-
-
- public interface MessageAppender extends Serializable {
-
- /**
- * Method that must hold message in an appropriate way and in an appropriate local.
- * Demoiselle holds a message in a Logger or in a FacesContext, depending on the project.
- *
- * @param message
- * message to be stored.
- */
- void append(Message message);
-}
-
-
- Para criar seu próprio MessageAppender, implemente essa interface e anote-a com a anotação @Priority - o Framework
- Demoiselle irá selecionar a implementação adequada paseada na maior prioridade. Não é necessário configurar mais nada, o Framework Demoiselle
- selecionará a implementação automaticamente. Cabe-lhe então a tarefa de implementar o método append(Message message) para tratar
- a mensagem da forma que melhor se adequar a seu projeto.
-
-
-
-
- Exemplos de implementação
-
- A fim de auxiliar a manutenção das descrições das mensagens em uma aplicação diversas soluções podem ser escolhidas
- pelos arquitetos e empregadas pelos desenvolvedores. Nesta seção serão mostradas duas sugestões para essa questão,
- usando interfaces e enumeradores.
-
-
- A vantagem em se utilizar ambas as soluções é que diversas mensagens relacionadas podem ser agrupadas, reduzindo assim
- a quantidade de arquivos a serem mantidos e centralizando a configuração das mensagens.
-
-
- Sendo assim, uma possível solução é criar uma interface destinada a armazenar todos os modelos de mensagens de
- uma determinada severidade a ser usada na aplicação. Nesta interface são declarados campos do tipo Message
- com o modificador final (implicitamente também será public e static).
- Veja o exemplo de código para a interface InfoMessages:
-
-
-
- No exemplo em questão, o texto das mensagens será recuperado do arquivo de recursos messages.properties
- presente no diretório /src/main/resources/. Eis o conteúdo desse arquivo:
-
-
-
-
- Recomenda-se criar uma interface para cada tipo de severidade (ex: InfoMessages,
- WarningMessages, ErrorMessages e FatalMessages),
- agrupando nestas as mensagens usadas exclusivamente para o mesmo fim.
-
-
-
- Já a segunda abordagem consiste no uso de enumerações para centralizar os modelos de mensagem.
- É utilizado o mesmo arquivo de recursos messages.properties ilustrado na abordagem anterior.
- Porém, neste caso cada enumerador da enumeração corresponderá a uma chave no arquivo de propriedades.
-
-
-
- A fim de adicionar mensagens ao contexto, eis um exemplo de código que faz uso do artefato InfoMessages,
- que funciona não importa qual abordagem escolhida (interface ou enumeração):
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- No ponto contendo @Inject será injetado via CDI o contexto de mensagens
- presente na aplicação, ou seja, uma instância da interface MessageContext
- que poderá ser utilizada em qualquer método nessa classe.
-
-
-
-
- Aqui os métodos insert(), update() e
- delete() na classe BookmarkBC manipulam o
- contexto de mensagens em cada invocação destes.
- O método add() de MessageContext faz com que a
- mensagem passada como parâmetro seja adicionada ao contexto, que ao final é exibida
- para o usuário na camada de apresentação.
-
-
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/paginacao.xml b/documentation/reference/pt-BR/paginacao.xml
deleted file mode 100644
index 3c226c6..0000000
--- a/documentation/reference/pt-BR/paginacao.xml
+++ /dev/null
@@ -1,319 +0,0 @@
-
-
-
-
- Paginação
-
-
- Neste capítulo serão considerados os seguintes assuntos:
-
- Motivação para o uso de um mecanismo padronizado para paginação;
- Funcionamento e uso da estrutura Pagination e do contexto de paginação
- (PaginationContext).
-
-
-
-
- Introdução ao mecanismo
-
- A apresentação de conjuntos de registros de médio a grande porte em formato de tabelas em aplicações Web geralmente requer um
- mecanismo de paginação, o qual permite ao cliente ver apenas um pedaço do resultado final, podendo este
- navegar para frente e para trás através dos registros. A menos que o conjunto de registros seja garantidamente pequeno, qualquer
- aplicação do tipo Web com funcionalidades de busca e/ou listagem de registros, precisa ser dotada de paginação.
-
-
- O mecanismo de paginação para as aplicações fornecido pelo Demoiselle Framework consiste em um algoritmo
- direcionado ao banco de dados (i.e., Database-Driven Pagination). Essa abordagem, apesar de requerer instruções SQL específicas
- para obter porções determinadas de registros, é a mais utilizada por ser mais eficiente e produzir menos redundância de dados,
- diminuindo assim tráfego de rede, consumo de memória e reduzindo o tempo de resposta.
-
-
- É fornecido em tempo de execução um contexto de paginação, o qual tem escopo de sessão e armazena a informação
- de paginação de cada entidade (i.e., bean) que necessite de tal mecanismo. Esse contexto é compartilhado entre as diversas camadas
- da aplicação, especificamente entre as camadas de visão e persistência. Dessa maneira, a paginação dos dados é transparente para a
- camada intermediária (i.e., negócio) e não interfere na modelagem das classes de um projeto.
-
-
-
-
- Códigos de suporte
-
-
- O mecanismo de paginação do Demoiselle Framework permite que os parâmetros para a consulta
- no banco sejam configurados de forma bastante prática. Por outro lado, a consulta paginada ao banco já é feita pela extensão
- demoiselle-jpa. Dessa forma, basta ajustar os parâmetros da paginação, e pedir as consultas normalmente.
- O resultado da consulta é então passado para algum componente de iteração de dados com suporte ao mecanismo conhecido como Lazy
- Load (ou Lazy Loading).
-
-
- Farão parte do código de suporte para paginação:
-
-
-
- A classe Pagination: usada para manipular a paginação dos dados resultantes, contendo os campos currentPage
- (página atual, selecionada na camada de visão), pageSize (tamanho da página, a quantidade de registros que ela comportará)
- e totalResults (a quantidade de resultados existentes na base de dados);
-
-
-
-
- A classe PaginationContext: contexto usado para armazenar e fornecer estruturas do tipo Pagination;
-
-
-
-
- A classe PaginationConfig: armazenador de configurações referentes à paginação.
-
-
-
-
-
- Códigos internos de suporte no Core:, Pagination> map;
- public Pagination getPagination(Class> clazz) { ... }
- public Pagination getPagination(Class> clazz, boolean create) { ... }
-}
-
-@Configuration
-public class PaginationConfig {
-
- @Name("default_page_size")
- private int defaultPageSize = 10;
-
- @Name("max_page_links")
- private int maxPageLinks = 5;
-}]]>
-
- Códigos internos de suporte em JPA: implements Crud {
-
- @Inject
- private PaginationContext paginationContext;
- // ...
-
- public List findAll() {
-
- final String jpql = "select this from " + getBeanClass().getSimpleName() + " this";
- final Query query = getEntityManager().createQuery(jpql);
- final Pagination pagination = paginationContext.getPagination(getBeanClass());
-
- if (pagination != null) {
- if (pagination.getTotalPages() == null) {
- pagination.setTotalResults(this.countAll());
- }
- query.setFirstResult(pagination.getFirstResult());
- query.setMaxResults(pagination.getPageSize());
- }
- // ...
- }
-}]]>
-
- Códigos internos de suporte em JSF: extends AbstractPage implements ListPageBean {
-
- @Inject
- private PaginationContext paginationContext;
-
- @Inject
- private PaginationConfig paginationConfig;
- // ...
-
- public Pagination getPagination() {
- return paginationContext.getPagination(getBeanClass(), true);
- }
-
- public int getPageSize() {
- return paginationConfig.getDefaultPageSize();
- }
-
- public int getMaxPageLinks() {
- return paginationConfig.getMaxPageLinks();
- }
-}]]>
-
-
-
- Implementação na aplicação
-
- Veremos nessa seção como implementar a paginação em uma aplicação Java. Para esse exmplo tomamos como base a aplicação de Bookmarks
- fornecida pelo arquétipo JSF com JPA do Demoiselle Framework (para maiores detalhes
- ver Arquétipos). Iremos utilizar o componente DataTable do PrimeFaces,
- que oferece o mecanismo de Lazy Loading conhecido como LazyDataModel, muito útil para paginação
- e classificação de dados.
-
-
- Primeiro é preciso configurar um objeto LazyDataModel no construtor do Managed Bean
- (BookmarkList nesse exemplo): instancia-lo e sobrescrever o método abstrado load, que recebe
- vários argumentos. Esses argumentos são recuperados na página jsf que carrega a instância do objeto LazyDataModel.
-
-
- Dentro do método load iremos pegar do contexto de paginação uma instância da implementação da interface Pagination
- e ajustar alguns dos seus parâmetros para: indicar a partir de qual item a paginação deve iniciar, e o tamanho (quantidade de itens) de cada página.
- Esses dados são usados no método findAll(), da classe JPACrud (extensão JPA), que utiliza o contexto de
- paginação para pegar os parâmetros e fazer a consulta no banco buscando apenas os itens que estão dentro da página que o parâmetro
- first indicar. O resultado é passado para a instancia do LazyDataModel, que é responsável por exibir
- os dados de forma apropriada.
-
-
- À classe BookmarkList devem ser adicionados os seguintes trechos de código:
- lazyModel;
- lazyModel = new LazyDataModel() {
-
- @Override
- public List load (int first, int pageSize, String sortField,
- SortOrder sortOrder, Map filters){
-
- Pagination pagination = getPagination();
- pagination.setPageSize(pageSize);
- pagination.setFirstResult(first);
-
- List itemsList = bc.findAll();
-
- lazyModel.setRowCount(pagination.getTotalResults());
-
- return itemsList;
- }
- };
- // ...
- public LazyDataModel getLazyModel() {
- return lazyModel;
- }
- // ...
-}]]>
-
-
- No arquivo messages.properties adicione as linhas:
-
-
- Na página JSF bookmark_list.xhtml, substitua a linha:
-
- ]]>
-
-
- por:
- ]]>
-
-
- Com essas alterações simples, a aplicação Bookmarks passa a utilizar o mecanismo de paginação oferecido pelo Demoiselle Framework.
-
-
-
-
- O método getPagination() do contexto PaginationContext é sobrecarregado, podendo aceitar
- os seguintes argumentos: Class ou Class e boolean.
-
-
-
-
- A JPA 2.0, através da Query API, suporta controle de paginação independente de fornecedor de banco de dados.
- Para controlar a paginação, a interface Query define os métodos setFirstResult() e
- setMaxResults() para especificar o primeiro resultado a ser recebido e o número máximo de resultados a
- serem retornados em relação àquele ponto. Internamente, são usadas instruções específicas do SGBD (ex: LIMIT e OFFSET no
- PostgreSQL).
-
-
-
-
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/parametro.xml b/documentation/reference/pt-BR/parametro.xml
deleted file mode 100644
index f77b7de..0000000
--- a/documentation/reference/pt-BR/parametro.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-
-
-
-
- Parâmetro
-
-
- É muito comum em uma aplicação web haver a necessidade de passar parâmetros através da URL. A passagem de
- parâmetros até que é algo fácil e tranquilo de fazer. O chato é a captura do parâmetro dentro do Page Bean,
- pois toda vez que quisermos fazê-lo, temos que acessar o FacesContext, para a partir daí
- pegar o HttpServletRequest e depois recuperar o valor passado.
- Veja abaixo como ficaria o código.
-
-
- Passagem do parâmetro:
-
-
-
- Captura do parâmetro pelo Page Bean
-
-
-
-
-
- Passagem de parâmetros
-
-
- Visando facilitar essa recuperação do parâmetro passado através da URL, foi disponibilizada na versão 2.X do
- Demoiselle Framework uma funcionalidade através da interface Parameter
- e de sua implementação ParameterImpl, que permite capturar esse valor através do uso de
- injeção. Para isso, basta criar no seu Page Bean um objeto do tipo
- br.gov.frameworkdemoiselle.util.Parameter e anotá-lo com @Inject.
- O nome desse objeto é o nome que será usado para buscar o valor do parâmetro. Caso o usuário queira dar um
- nome diferente ao objeto, ele pode anotá-lo com @Name e no valor dessa anotação, colocar o
- nome do parâmetro. Por default o objeto criado tem o escopo de request, mas é possível usar o escopo de sessão
- ou de visão, bastando anotar o objeto com @SessionScoped ou @ViewScoped,
- respectivamente. Veja abaixo como ficaria essa passagem de parâmetros na versão 2.X do Demoiselle.
-
-
- Passagem do parâmetro:
-
-
-
- Captura do parâmetro pelo Page Bean:
-
- parametro;
-
- @Name("parametroString")
- @SessionScoped
- @Inject
- private Parameter objetoComNomeDiferenteDoParametro;
-}]]>
-
-
-
- As classes de parâmetro
-
- A interface Parameter e sua implementação ParameterImpl disponibilizam
- alguns métodos, como setValue(T value), getKey(),
- getValue() e getConverter(), que servem respectivamente para atribuir o
- valor do objeto, capturar o nome do parâmetro passado na URL, recuperar o valor passado para aquele parâmetro
- e capturar o conversor de tipo utilizado. Logo, para usar o valor daquele objeto, basta utilizar o método
- getValue(), tal como mostrado a seguir:
-
- parametro;
-
- public void metodo() {
- System.out.println("Valor do parametro: " + parametro.getValue());
- }
-}]]>
-
-
-
diff --git a/documentation/reference/pt-BR/persistencia.xml b/documentation/reference/pt-BR/persistencia.xml
deleted file mode 100644
index 2121933..0000000
--- a/documentation/reference/pt-BR/persistencia.xml
+++ /dev/null
@@ -1,430 +0,0 @@
-
-
-
-
- Persistência
-
-
- Persistência é um dos aspectos mais importantes de sistemas corporativos - grande parte desses sistemas devem
- em algum ponto persistir informações em um sistema gerenciador de banco de dados. A tecnologia Java conta
- hoje com algumas formas de facilitar o acesso a SGBD's - algumas são especificações Java como o JDBC
- e o JPA, outras são tecnologias desenvolvidas por terceiros como o Hibernate.
-
-
-
- O Framework Demoiselle facilita o acesso e a configuração a algumas dessas tecnologias fornecendo produtores
- padrão para seus pontos de entrada e centralizando a configuração. Tudo que o desenvolvedor deve fazer
- é apenas injetar o recurso adequado em seu código e o Framework Demoiselle se encarregará de
- produzi-lo e configurá-lo.
-
-
-
- JPA
-
-
- O Framework Demoiselle fornece um produtor padrão para contextos de persistência da JPA. Esse produtor lê o arquivo
- de configuração persistence.xml de seu projeto e toma as providências necessárias para fabricar uma instância
- da classe EntityManager que pode ser usada para gerenciar as entidades de sua aplicação. Além disso, instâncias
- de EntityManager produzidas pelo Framework Demoiselle participam automaticamente de transações abertas através da
- anotação @Transactional, conforme apresentado no capítulo sobre Transações.
-
-
-
-
- Para acrescentar a dependência à extensão demoiselle-jpa, adicione esse código
- em seu arquivo pom.xml, na seção dependencies.
-
-
-
- br.gov.frameworkdemoiselle
- demoiselle-jpa
- compile
-]]>
-
-
-
- Introdução ao mecanismo
-
-
- Para injetar uma instância de EntityManager em sua aplicação, basta usar a anotação @Inject.
-
-
- @PersistenceController
-public class BookmarkDAO extends JPACrud<Bookmark, Long> {
-
- private static final long serialVersionUID = 1L;
-
- @Inject
- private EntityManager entityManager;
-
- public void persistBookmark(Bookmark bookmark){
- entityManager.persist(bookmark);
- }
-
-}
-
-
- O produtor padrão injetará o EntityManager configurado no arquivo persistence.xml. Se houver
- mais de um contexto de persistência configurado em persistence.xml, será necessário especificar qual será
- injetado no ponto de injeção. Para isso use a anotação @Name.
-
-
- @PersistenceController
-public class BookmarkDAO extends JPACrud<Bookmark, Long> {
-
- private static final long serialVersionUID = 1L;
-
- @Inject
- @Name("persistence_unit_1")
- private EntityManager entityManager;
-
- public void persistBookmark(Bookmark bookmark){
- entityManager.persist(bookmark);
- }
-
-}
-
-
- É possível invocar o utilitário Beans para injetar instâncias de EntityManager programaticamente.
-
-
- @PersistenceController
-public class BookmarkDAO extends JPACrud<Bookmark, Long> {
-
- private static final long serialVersionUID = 1L;
-
- public void persistBookmark(Bookmark bookmark){
- EntityManager entityManager = Beans.getReference(EntityManager.class);
- entityManager.persist(bookmark);
- }
-
- public void persistBookmarkInHistory(Bookmark bookmark){
- EntityManager entityManager = Beans.getReference(EntityManager.class , new NameQualifier("history_persistence_unit"));
- entityManager.persist(bookmark);
- }
-
-}
-
-
-
- Configuração
-
-
- Alguns comportamentos do produtor podem ser configurados através das propriedades abaixo, que devem ser configuradas
- no arquivo demoiselle.properties.
-
-
-
-
-
-
-
-
-
-
- Propriedade
- Descrição
- Padrão
-
-
-
-
-
- frameworkdemoiselle.persistence.default.unit.name
-
-
- Define o nome da unidade de persistência padrão (configurada em persistence.xml) que será injetada
- caso a anotação @Name não seja usada. Não é necessário se apenas uma unidade de persistência for configurada.
-
-
-
-
-
-
- frameworkdemoiselle.persistence.entitymanager.scope
-
-
- Permite determinar o escopo de unidades de persistência injetadas. Dentro do escopo determinado, todos os pontos
- de injeção receberão a mesma instância de EntityManager.
-
-
- Os valores possíveis são:
-
- request
- session
- view
- conversation
- application
- noscope
-
-
-
- request
-
-
-
-
-
-
-
- O escopo especial noscope desliga o gerenciamento de escopo de instâncias de EntityManager
- produzidas pelo Framework Demoiselle. Isso permite ao desenvolvedor controlar totalmente o ciclo de vida de um
- EntityManager injetado e ainda reter o recurso do produtor padrão.
-
-
- Note que ao usar a opção noscope, o desenvolvedor é o responsável por controlar o ciclo de vida do gerenciador
- de persistência. Ele não participará de transações JPA abertas através da anotação @Transactional (transações JTA funcionam normalmente)
- e multiplos pontos de injeção durante uma requisição receberão múltiplas instâncias de EntityManager.
-
-
-
-
-
- Deve-se usar cautela ao alterar o escopo padrão das instâncias de EntityManager. Na grande maioria dos casos o escopo
- padrão request é o suficiente e alterar esse padrão deve ser feito apenas após extensa análise dos prós e contras
- de cada escopo.
-
-
- Dê especial atenção aos escopos que podem ser serializados pelo servidor de aplicação (session, view
- e conversation) pois a especificação não define o comportamento de instâncias de EntityManager que são
- serializadas.
-
-
-
-
-
-
-
- JDBC
-
-
- O Framework Demoiselle fornece um produtor padrão para conexões JDBC puras. Esse produtor possui suporte
- ao acesso direto utilizando uma URL e ao acesso via DataSource, acessando a conexão através
- de um nome JNDI configurado em um servidor de aplicação.
-
-
-
- A persistência de dados usando JDBC está disponível na extensão demoiselle-jdbc. Para ter acesso
- a essa extensão em um projeto Maven declare sua dependência no arquivo pom.xml de seu projeto.
-
-
-
-
- Para acrescentar a dependência à extensão demoiselle-jdbc, adicione esse código
- em seu arquivo pom.xml, na seção dependencies.
-
-
-
- br.gov.frameworkdemoiselle
- demoiselle-jdbc
- compile
-]]>
-
-
-
- Configuração
-
-
- A conexão será criada pela fábrica do Demoiselle de acordo com as configurações no arquivo de propriedade (demoiselle.properties).
- Para configurar uma conexão diretamente através de uma URL utilize as propriedades abaixo:
-
-
-
-
-
-
-
-
-
- Propriedade
- Descrição
-
-
-
-
-
- frameworkdemoiselle.persistence.driver.class
-
-
- Implementação da interface java.sql.Driver que dá acesso
- ao SGBD utilizado pela aplicação.
-
-
-
-
-
- frameworkdemoiselle.persistence.url
-
-
- URL de conexão no formato jdbc:vendor:database-properties.
-
-
-
-
-
- frameworkdemoiselle.persistence.username
-
-
- Login de acesso ao SGBD.
-
-
-
-
-
- frameworkdemoiselle.persistence.password
-
-
- Senha de acesso ao SGBD.
-
-
-
-
-
-
-
-
- Também é possível configurar o acesso indicando um nome JNDI que esteja
- configurado no servidor de aplicação.
-
-
-
-
-
-
-
-
-
- Propriedade
- Descrição
-
-
-
-
-
- frameworkdemoiselle.persistence.jndi.name
-
-
- Nome JNDI criado no servidor de aplicação para dar acesso
- à conexão ao banco de dados.
-
-
-
-
-
-
-
-
- É possível configurar mais de uma conexão JDBC. Para isso acrescente nas propriedades nomes
- separados para cada conexão como no exemplo abaixo:
-
-
-
- Criando múltiplas conexões
-
- frameworkdemoiselle.persistence.conn1.driver.class=MinhaClasse
-frameworkdemoiselle.persistence.conn1.url=MinhaURL
-frameworkdemoiselle.persistence.conn1.username=MeuLogin
-frameworkdemoiselle.persistence.conn1.password=MinhaSenha
-
-frameworkdemoiselle.persistence.conn2.driver.class=MinhaClasse
-frameworkdemoiselle.persistence.conn2.url=MinhaURL
-frameworkdemoiselle.persistence.conn2.username=MeuLogin
-frameworkdemoiselle.persistence.conn2.password=MinhaSenha
-
- frameworkdemoiselle.persistence.conn1.jndi.name=MeuJndiName1
-frameworkdemoiselle.persistence.conn2.jndi.name=MeuJndiName2
-
-
-
- Caso várias conexões sejam configuradas, é possível determinal a conexão padrão - aquela
- que será utilizada quando o desenvolvedor não especificar qual deseja utilizar.
-
-
-
-
-
-
-
-
-
- Propriedade
- Descrição
-
-
-
-
-
- frameworkdemoiselle.persistence.default.datasource.name
-
-
- Caso múltiplas conexões sejam criadas, define a conexão padrão
- quando uma Connection é injetada no código sem utilizar
- a anotação @Name.
-
-
-
-
-
-
-
-
-
- Utilização
-
-
- Para utilizar uma conexão JDBC em seu código, basta injetá-la. O Demoiselle se encarregará de produzir
- o tipo adequado de conexão.
-
-
-
-
-
- Caso multiplas conexões tenham sido definidas, é possível utilizar a anotação @Name para injetar
- uma conexão específica.
-
-
-
-
-
-
- Caso a propriedade frameworkdemoiselle.persistence.default.datasource.name seja utilizada para
- especificar uma conexão padrão, a anotação @Name só é necessária para utilizar conexões diferentes
- da padrão. Caso essa propriedade não seja utilizada e existam múltiplas conexões configuradas, torna-se obrigatório
- o uso da anotação @Name em todos os pontos de injeção.
-
-
-
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/properties.xml b/documentation/reference/pt-BR/properties.xml
deleted file mode 100644
index 48c92a1..0000000
--- a/documentation/reference/pt-BR/properties.xml
+++ /dev/null
@@ -1,365 +0,0 @@
-
-
-
-
- Atributos do demoiselle.properties
-
-
- Em um projeto com o Demoiselle Framework, algumas propriedades e configurações
- do Framework podem ser ajustadas no arquivo demoiselle.properties.
- A seguir listamos as propriedades e configurações do Demoiselle Framework que o usuário pode modificar,
- acompanhados de alguns exemplos ilustrativos.
-
-
-
-
-
- Configurações do Core
-
-
-
-
-
-
-
- Propriedade
- Descrição
- Valor padrão
-
-
-
-
- frameworkdemoiselle.security.enabled
-
-
- Habilita o mecanismo de segurança.
-
-
- true
-
-
- frameworkdemoiselle.security.authenticator.class
-
-
- Define a classe que implementa a estratégia de autenticação.
-
-
-
-
-
- frameworkdemoiselle.security.authorizer.class
-
-
- Define a classe que implementa a estratégia de autorização.
-
-
-
-
-
- frameworkdemoiselle.transaction.class
-
-
- Define a classe que implementa a estratégia de controle transacional.
-
-
-
-
-
- frameworkdemoiselle.pagination.page.size
-
-
- Define o tamanho da página padrão do mecanismo de paginação.
-
-
- 10
-
-
-
-
-
- Configurações da extensão JSF
-
-
-
-
-
-
-
- Propriedade
- Descrição
- Valor padrão
-
-
-
-
- frameworkdemoiselle.security.login.page
-
-
- Define a página de login da aplicação.
-
-
- "/login"
-
-
- frameworkdemoiselle.security.redirect.after.login
-
-
- Define a tela para qual o usuário será redirecionado após o processo de login bem sucedido.
-
-
- "/index"
-
-
- frameworkdemoiselle.security.redirect.after.logout
-
-
- Define a tela para qual o usuário será redirecionado após o processo de logout bem sucedido.
-
-
- "/login"
-
-
- frameworkdemoiselle.security.redirect.enabled
-
-
- Habilita os redirecionamentos relacionados aos processos de login e logout.
-
-
- true
-
-
- frameworkdemoiselle.exception.application.handle
-
-
- Habilita o tratamento automático das exceções da aplicação anotadas com @ApplicationException.
-
-
- true
-
-
- frameworkdemoiselle.exception.default.redirect.page
-
-
- Define o redirecionamento das exceções da aplicação anotadas com @ApplicationException ocorridas
- durante a fase de renderização da página (PhaseId.RENDER_RESPONSE).
-
-
- "/application_error"
-
-
- frameworkdemoiselle.pagination.max.page.links
-
-
- Configura a quantidade de links que será exibido em uma página.
-
-
- 5
-
-
-
-
-
- Configurações da extensão JDBC
-
-
-
-
-
-
-
- Propriedade
- Descrição
- Valor padrão
-
-
-
-
- frameworkdemoiselle.persistence.jndi.name
-
-
- Define o nome JNDI onde o DataSource está disponível.
-
-
-
-
-
- frameworkdemoiselle.persistence.driver.class
-
-
- Define a classe que implementa o Driver de conexão com a base de dados.
-
-
-
-
-
- frameworkdemoiselle.persistence.url
-
-
- Define a URL de conexão com a base de dados.
-
-
-
-
-
- frameworkdemoiselle.persistence.username
-
-
- Define o username para estabelecer a conexão com a base de dados.
-
-
-
-
-
- frameworkdemoiselle.persistence.password
-
-
- Define o password para estabelecer a conexão com a base de dados.
-
-
-
-
-
- frameworkdemoiselle.persistence.default.datasource.name
-
-
- Define a configuração de banco de dados padrão para aplicações que possuem mais
- de um datasource configurado.
-
-
-
-
-
-
-
-
- Configurações da extensão JPA
-
-
-
-
-
-
-
- Propriedade
- Descrição
- Valor padrão
-
-
-
-
- frameworkdemoiselle.persistence.default.unit.name
-
-
- Define o nome da unidade de persistência padrão (configurada em persistence.xml) que será injetada
- caso a anotação @Name não seja usada. Não é necessário se apenas uma unidade de persistência for configurada.
-
-
-
-
-
-
- frameworkdemoiselle.persistence.entitymanager.scope
-
-
- Permite determinar o escopo de unidades de persistência injetadas. Dentro do escopo determinado, todos os pontos
- de injeção receberão a mesma instância de EntityManager.
-
-
- Os valores possíveis são:
-
- request
- session
- view
- conversation
- application
- noscope
-
-
-
- request
-
-
-
-
-
- Configurações da extensão JMX
-
-
-
-
-
-
-
- Propriedade
- Descrição
- Valor padrão
-
-
-
-
- frameworkdemoiselle.management.mbean.domain
-
- Define o domínio padrão onde classes anotadas com @ManagementController serão registradas no MBeanServer.
- Na especificação JMX, um MBean é registrado no MBeanServer com um nome no formato domain:name=MBeanName
- (ex: br.gov.frameworkdemoiselle:name=NotificationBroadcaster). Esse parâmetro controla a porção domain
- desse formato.
-
- O pacote da classe anotada com @ManagementController
-
-
- frameworkdemoiselle.management.notification.domain
-
- O mesmo que frameworkdemoiselle.management.mbean.domain, mas apenas para o domínio do
- MBean br.gov.frameworkdemoiselle.internal.NotificationBroadcaster. Esse MBean é automaticamente
- registrado para receber notificações enviadas usando a classe br.gov.frameworkdemoiselle.management.NotificationManager
-
- br.gov.frameworkdemoiselle.jmx
-
-
- frameworkdemoiselle.management.notification.name
-
- O nome usado para registrar a classe br.gov.frameworkdemoiselle.internal.NotificationBroadcaster como MBean.
-
- NotificationBroadcaster
-
-
-
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/security.xml b/documentation/reference/pt-BR/security.xml
deleted file mode 100644
index 229eb15..0000000
--- a/documentation/reference/pt-BR/security.xml
+++ /dev/null
@@ -1,620 +0,0 @@
-
-
-
-
- Segurança
-
-
- Neste capítulo será tratada uma questão de grande importância para a maioria das aplicações e motivo de infindáveis
- discussões nas equipes de desenvolvimento: controle de acesso. Assim como tudo relacionado ao framework, a
- implementação de segurança foi projetada de forma simples e flexível, independente de camada de apresentação ou
- tecnologia, te deixando livre para implementar sua própria solução ou utilizar as extensões existentes.
-
-
- Para utilizar o modelo de segurança proposto basta utilizar o Framework Demoiselle, pois no núcleo do framework estão as
- interfaces e anotações que definem o comportamento básico da implementação.
-
-
-
- Configurando
-
-
- Para um correto funcionamento do Demoiselle é necessário inserir os interceptadores de segurança no arquivo src/main/webapp/WEB-INF/beans.xml.
-
-
-
-
- br.gov.frameworkdemoiselle.security.RequiredPermissionInterceptor
- br.gov.frameworkdemoiselle.security.RequiredRoleInterceptor
-
-]]>
-
-
- Opcionalmente é possível configurar o comportamento do módulo de segurança definindo propriedades no arquivo demoiselle.properties
- da sua aplicação.
-
-
-
- Propriedades de segurança do Framework Demoiselle
-
-
-
-
-
-
-
- Propriedade
- Descrição
- Valor padrão
-
-
-
-
- frameworkdemoiselle.security.enabled
-
-
- Habilita ou desabilita o mecanismo de segurança
-
-
- true
-
-
-
- frameworkdemoiselle.security.authenticator.class
-
-
- Define a classe que implementa o mecanismo de autenticação.
- (Detalhes na seção Criando sua implementação)
-
-
-
- -
-
-
-
-
- frameworkdemoiselle.security.authorizer.class
-
-
- Define a classe que implementa o mecanismo de autorização.
- (Detalhes na seção Criando sua implementação)
-
-
-
- -
-
-
-
-
-
-
-
-
-
- Autenticação
-
- O mecanismo de autenticação busca verificar a identidade do usuário de um sistema. A forma mais conhecida - e comum - para
- executar essa verificação se dá por meio de um formulário de login, geralmente solicitando um nome de usuário e
- sua respectiva senha. No entanto, outras formas como reconhecimento biométrico e autenticação por token, para citar
- apenas duas, tem ganhado um grande número de adeptos.
-
-
- O Framework Demoiselle deixa o desenvolvedor livre para definir qual forma usar, de acordo com a sua conveniência e necessidade.
- A peça chave para tornar isso possível é o contexto de segurança, representado pela interface SecurityContext. Nessa
- estão definidos os métodos responsáveis por gerenciar os mecanismos de autenticação como, por exemplo, executar
- login/logout de usuários e verificar se os mesmos estão ou não autenticados.
-
-
- Para utilizar o SecurityContext, basta injetá-lo em seu código. O método login ativa o mecanismo de autenticação
- e o método logout remove as credenciais atualmente autenticadas do sistema. A classe SecurityContext possui
- outros métodos que permitem verificar se há um usuário autenticado e acessar o objeto gerente (representado pela
- classe javax.security.Principal), um objeto que contém dados adicionais sobre o usuário atualmente autenticado. Consulte
- a documentação da classe SecurityContext para consultar as funcionalidades que ela oferece.
-
-
- Um exemplo do uso do SecurityContext para autenticação segue abaixo:
-
-
-
-
-
- Autorização
-
- Em certos sistemas é necessário não apenas autenticar um usuário, mas também proteger funcionalidades individuais e separar
- usuários em grupos que possuem diferentes autorizações de acesso. O mecanismo de autorização é responsável por garantir que apenas
- usuários autorizados tenham o acesso concedido a determinados recursos de um sistema.
-
-
-
- No modelo de segurança do Framework Demoiselle, a autorização pode acontecer de duas
- formas:
-
- Permissão por funcionalidade, através da anotação @RequiredPermission
- Permissão por papel, através da anotação @RequiredRole
-
-
-
-
-
- Protegendo o sistema com @RequiredPermission
-
-
- A anotação @RequiredPermission permite marcar uma classe ou método e informar que acesso a esse recurso requer
- a permissão de executar uma operação. Operação nesse contexto é um nome definido pelo desenvolvedor
- que representa uma funcionalidade do sistema. Por exemplo, determinada classe pode ter métodos responsávels por criar, editar,
- listar e remover bookmarks, o desenvolvedor pode decidir agrupar esses métodos sobre a operação gerenciar bookmark.
-
-
- listarBookmarks() {
- //Codigo do metodo
- }
-
- @RequiredPermission
- public List apagarBookmark(Long idBookmark) {
- public List listarBookmarks() {
- }
-}]]>
-
-
- Perceba que a anotação @RequiredPermission sobre o método apagarBookmark não contém parâmetros. Quando não
- são passados parâmetros o valor padrão para o parâmetro resource é o nome da classe e o valor padrão para operation
- é o nome do método.
-
-
-
- É possível anotar a classe inteira com @RequiredPermission, isso protegerá o acesso a todos os métodos dessa classe.
-
- listarBookmarks() {
- //Codigo do metodo
- }
-
- public List apagarBookmark(Long idBookmark) {
- public List listarBookmarks() {
- }
-}]]>
-
-
-
-
- Protegendo o sistema com @RequiredRole
-
-
- Diferente de @RequiredPermission, a anotação @RequiredRole utiliza o conceito
- de papéis - ou perfís - para proteger recursos. Uma classe ou método anotado com @RequiredRole
- exigirá que o usuário autenticado possua o papel indicado para acessar o recurso.
-
-
-
- Voltando ao exemplo de nosso aplicativo de bookmarks, vamos supor que a função de listar os bookmarks existentes
- pode ser acessada por qualquer usuário autenticado, mas apenas administradores podem criar um novo bookmark. A classe
- responsável por tais funcionalidades pode ser criada da seguinte forma:
-
-
- listarBookmarks() {
- }
-
-}]]>
-
- É possível informar mais de um papel para a anotação @RequiredRole, neste caso basta que o usuário
- autenticado possua um dos papéis listados para ter acesso ao recurso.
-
-
-
- Da mesma forma que a anotação @RequiredPermission, a anotação @RequiredRole pode ser usada
- a nível de classe para proteger todos os métodos contidos nessa classe.
-
-
-
-
- Protegendo porções do código
-
-
- É possível proteger apenas parte de um código ao invés de todo o método ou toda a classe. Isso pode ser necessário em
- expressões condicionais, onde um trecho só deve ser executado caso o usuário possua a autorização necessária.
- Para isso voltamos a usar a interface SecurityContext, pois ela contém métodos que são funcionalmente equivalentes
- às anotações @RequiredPermission e @RequiredRole.
-
-
-
- Como um exemplo, vamos supor que ao remover um bookmark um email seja enviado ao administrador, mas se o próprio
- administrador executou a operação não é necessário enviar o email.
-
-
-
-
-
-
-
- Protegendo porções de páginas Java Server Faces
-
-
- As restrições de segurança podem ser utilizadas ainda em páginas web, com o auxílio de Expression Language. A interface
- SecurityContext está automaticamente disponível para páginas Java Server Faces como um bean
- de nome securityContext, bastando então acessar seus métodos a partir deste bean.
-
-
- ]]>
-
-
- Nesse caso, a habilitação de um botão está condicionada à existência de permissão para o usuário autenticado no momento
- executar a operação “insert” no recurso “contact”.
-
-
-
-
-
- Redirecionando automaticamente para um formulário de acesso
-
-
- Se sua aplicação usa a extensão demoiselle-jsf ou se você utilizou o arquétipo demoiselle-jsf-jpa
- durante a criação de seu projeto, então você pode definir uma página de login e o Framework Demoiselle vai automaticamente lhe redirecionar
- para essa página caso haja a tentativa de acessar um recurso protejido e nenhum usuário esteja autenticado no sistema.
-
-
-
- Para acrescentar a extensão demoiselle-jsf em um projeto Maven, adicione a dependência abaixo
- no arquivo pom.xml.
-
-
- br.gov.frameworkdemoiselle
- demoiselle-jsf
- compile
-]]>
-
-
- O arquétipo demoiselle-jsf-jpa já contém essa extensão, se você criou seu projeto
- baseado nesse arquétipo nada precisa ser feito.
-
-
-
-
- Por padrão a página contendo o formulário de login deve se chamar login.jsp ou login.xhtml
- (a depender de como sua aplicação esteja configurada para mapear páginas JSF). Para mudar esse padrão, é possível
- editar o arquivo demoiselle.properties para configurar qual página deve ser utilizada.
-
-
-
- Propriedades de segurança da extensão demoiselle-jsf
-
-
-
-
-
-
-
- Propriedade
- Descrição
- Valor padrão
-
-
-
-
- frameworkdemoiselle.security.login.page
-
-
- Define a página de login da aplicação.
-
-
- "/login"
-
-
- frameworkdemoiselle.security.redirect.after.login
-
-
- Define a tela para qual o usuário será redirecionado após o processo de login bem sucedido.
-
-
- "/index"
-
-
- frameworkdemoiselle.security.redirect.after.logout
-
-
- Define a tela para qual o usuário será redirecionado após o processo de logout bem sucedido.
-
-
- "/login"
-
-
- frameworkdemoiselle.security.redirect.enabled
-
-
- Habilita ou desabilita o redirecionamento automático para a página de login após uma tentativa
- de acessar recurso protegido.
-
-
- true
-
-
-
-
-
-
-
-
- Integrando o Framework Demoiselle com a especificação JAAS
-
-
- Até agora vimos como criar código protegido em uma aplicação Demoiselle, mas nada foi dito sobre a tecnologia que implementa essa
- proteção. A verdade é que o Framework Demoiselle dá ao desenvolvedor a liberdade de implementar a solução que mais se adequa ao sistema
- desenvolvido, mas o framework também conta com suporte nativo à especificação JAAS (Java Authentication and
- Authorization Service).
-
-
-
- O suporte a JAAS é fornecido para aplicações WEB e está implementado na extensão
- demoiselle-servlet, então é necessário declarar a dependência a essa extensão em sua aplicação.
-
-
-
- Para acrescentar a extensão demoiselle-servlet em um projeto Maven, adicione a dependência abaixo
- no arquivo pom.xml.
-
-
- br.gov.frameworkdemoiselle
- demoiselle-servlet
- compile
-]]>
-
-
-
-
- O arquétipo demoiselle-jsf-jpa já conta com a dependência à extensão demoiselle-jsf, que
- por sua vez depende da extensão demoiselle-servlet. Se sua aplicação é baseada no arquétipo
- demoiselle-jsf-jpa você já possui a extensão demoiselle-servlet.
-
-
-
-
- Uma vez que sua aplicação contenha a extensão demoiselle-servlet, tudo que você precisa fazer é configurar
- o suporte a JAAS em seu servidor de aplicação e criar os usuários e papéis necessários. Esta configuração depende do servidor de
- aplicação utilizado e foge ao escopo deste documento.
-
-
-
- Para autenticar um usuário presente no servidor de aplicação através do JAAS, a extensão demoiselle-servlet
- oferece a classe Credentials, que deve ser injetada em seu código. O código abaixo mostra como realizar a autenticação a partir de um servlet.
-
-
-
-
-
- Uma vez autenticado o usuário, a anotação @RequiredRole passará a verificar se o usuário presente no JAAS possui o papel informado.
-
-
-
-
- A especificação JAAS não prevê o uso de permissões para proteger recursos, apenas papéis de usuários. Por isso ao utilizar a segurança
- da especificação JAAS o uso da anotação @RequiredPermission fica vetado. Utilizar essa anotação em um sistema que utilize
- JAAS para autorização causará uma exceção quando o recurso for acessado.
-
-
-
-
-
- É possível utilizar o JAAS para autenticar e autorizar papéis de usuários mas criar sua própria implementação para
- implementar a autorização de permissões. Para isso crie uma classe que herde a classe
- br.gov.frameworkdemoiselle.security.ServletAuthorizer e sobrescreva o método hasPermission(String resource, String operation)
- para implementar seu próprio mecanismo. Feito isso, basta definir sua classe no arquivo demoiselle.properties usando
- a propriedade frameworkdemoiselle.security.authorizer.class.
-
-
-
- Mais detalhes sobre como criar sua própria implementação ou extender uma implementação existente podem
- ser vistos na seção Criando sua implementação.
-
-
-
-
-
-
- Criando sua implementação
-
-
- Para os mecanismos de autenticação não cobertos pelo Framework Demoiselle, é possível criar sua própria implementação e integra-la
- ao framework. Também é possível extender uma implementação existente e acrescentar funcionalidades inexistentes.
-
-
-
- O ponto de extensão para o módulo de segurança são as interfaces Authenticator e Authorizer. Para criar
- um novo mecanismo de autenticação e autorização, é necessário apenas implementar essas duas interfaces em sua aplicação. Segue
- abaixo um exemplo de implementação.
-
-
-
-
-
-
- Fique atento! Note que para garantir que o usuário não esteja logado, não basta lançar uma
- exceção (InvalidCredencialsException) no método authenticator.autenticate(), mas é preciso que o método
- authenticator.getUser() retorne null para que o método securityContext.isLoggedIn() retorne false.
-
-
-
- Pronto! Sua aplicação já possui uma implementação de segurança definida.
-
-
-
-
- Você nunca deve chamar diretamente em sua aplicação as implementações das interfaces Authenticator
- e Authorizer, o Framework Demoiselle vai automaticamente chamar os métodos implementados
- quando for necessário.
-
-
-
-
- Em um sistema que use as anotações @RequiredRole ou @RequiredPermission, deve haver pelo menos uma implementação
- dessas duas interfaces. Ao processar essas anotações, o Framework Demoiselle vai buscar uma implementação para essas interfaces
- e disparar uma exceção caso não encontre uma implementação adequada.
-
-
-
- Se existe mais de uma implementação de Authenticator e/ou Authorizer (o que pode acontecer, por exemplo, quando
- seja necessário uma implementação na aplicação principal e outra para os testes), é possível definir no arquivo demoiselle.properties
- a classe que deve ser usada por padrão:
-
-
-
-
-
-
-
-
-
-
- Propriedade
- Descrição
- Valor padrão
-
-
-
-
- frameworkdemoiselle.security.authenticator.class
-
-
- Define a classe concreta utilizada como implementação da interface Authenticator
-
-
-
-
- nenhum, se houver apenas uma implementação o framework a detectará
- automaticamente sem necessidade de definir essa propriedade
-
-
-
-
-
- frameworkdemoiselle.security.authorizer.class
-
-
- Define a classe concreta utilizada como implementação da interface Authorizer
-
-
-
-
- nenhum, se houver apenas uma implementação o framework a detectará
- automaticamente sem necessidade de definir essa propriedade
-
-
-
-
-
-
-
-
diff --git a/documentation/reference/pt-BR/templates.xml b/documentation/reference/pt-BR/templates.xml
deleted file mode 100644
index 6c92bc3..0000000
--- a/documentation/reference/pt-BR/templates.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-
-
-
-
- Templates
-
-
- O Demoiselle Framework
- provê abstrações de classes para as camadas de apresentação, negócio e
- persistência. Tais classes podem ser encontradas no pacote
- br.gov.frameworkdemoiselle.template
- e auxiliam o desenvolvedor ao disponibilizar métodos comuns à maioria das
- aplicações. A seguir iremos exemplificar o uso de cada uma delas.
-
-
-
- Camada de persistência
-
- A classe abstrata JPACrud implementa as operações básicas de inclusão,
- remoção, atualização e recuperação de registros no banco de dados.
- Sendo assim, possibilita que o desenvolvedor concentre-se na criação de
- métodos específicos para atender as regras de negócio da sua aplicação.
- Esta classe recebe dois parâmetros em notação de genéricos:
-
- T representa a entidade que será tratada
- I representa o tipo do identificador da entidade
-
-
-
- No exemplo abaixo demonstra-se a utilização da JPACrud, onde o
- desenvolvedor precisou implementar apenas um método específico.
-
- {
-
- public List findByAlgumCriterioEspecifico(final String criterio) {
- Query query = getEntityManager().createQuery("select se from SuaEntidade se where se.criterio = :criterio ");
- query.setParameter("criterio", criterio);
- return query.getResultList();
- }
-}]]>
-
-
-
- Camada de negócio
-
- De forma semelhante à classe JPACrud, a classe DelegateCrud foi criada
- com o intuito de dispensar o desenvolvedor de implementar métodos que
- serão comuns à maioria das entidades. Além disso, esta classe
- implementa a injeção de dependência entre as camadas de negócio e
- persistência. Para utilizá-la, três parâmetros devem ser passados em notação de genéricos:
-
- T representa a entidade
- I representa o tipo do identificador da entidade
- C representa uma classe que implemente a interface CRUD
-
-
-
- Segue abaixo um exemplo da utilização do DelegateCrud.
- Neste caso, foi implementado um método para validar a entidade antes
- de proceder com a inclusão no banco de dados. Para isso, o método
- insert() fornecido pela classe foi sobrescrito.
-
- {
-
- private void validateInsert(SuaEntidade se) {
- // valida os atributos da entidade
- }
-
- @Override
- @Transactional
- public void insert(SuaEntidade se) {
- validateInsert(se);
- super.insert(se);
- }
-}]]>
-
-
-
- Camada de apresentação
-
- Para a camada de apresentação, existem duas classes que implementam os
- comportamentos básicos de navegação para páginas de listagem e edição.
- Estas classes são AbstractListPageBean e AbstractEditPageBean,
- respectivamente. De forma semelhante à DelegateCrud, estas classes realizam a
- injeção de dependência da camada de negócio dentro do artefato da
- camada de apresentação. Ambas recebem dois parâmetros em notação de genéricos:
-
- T representa a entidade que será tratada
- I representa o tipo do identificador da entidade
-
-
-
- Estendendo o AbstractListPageBean:
-
- {
-}]]>
-
- Estendendo o AbstractEditPageBean:
-
- {
-}]]>
-
-
-
\ No newline at end of file
diff --git a/documentation/reference/pt-BR/transacao.xml b/documentation/reference/pt-BR/transacao.xml
deleted file mode 100644
index 48b5e62..0000000
--- a/documentation/reference/pt-BR/transacao.xml
+++ /dev/null
@@ -1,274 +0,0 @@
-
-
-
-
- Transação
-
-
- Esta funcionalidade utiliza os recursos do CDI para interceptar e delegar adequadamente o tratamento das transações.
- Em outras palavras, não reinventamos a roda. Criamos algumas estratégias de delegação e
- controle de transação com base no que está sendo mais utilizado no mercado, algumas mais simples de configurar,
- outras mais completas para utilizar.
-
-
- Além de plugar e usar as estratégias prontas que fizemos para você, é possível também criar a sua. Vai que você
- precise de algo que não pensamos ainda. O importante é que você tenha opções, e uma das opções também é não
- utilizar a nossa solução. Caso você esteja utilizando o Demoiselle Framework em conjunto
- com outro framework (tais como o JBoss Seam, Spring ou Google Guice) que ofereça o controle de transação,
- você pode usá-lo também. Viva a liberdade de escolha!
-
-
- Neste capítulo apresentaremos para você como usar a nossa solução de controle de transação, as estratégias
- prontas que oferecemos e a criação de sua própria estratégia.
-
-
-
- Configurando
-
- Para um correto funcionamento do Demoiselle é necessário inserir o interceptador de transação no arquivo src/main/WEB-INF/beans.xml.
-
-
-
-
- br.gov.frameworkdemoiselle.transaction.TransactionalInterceptor
-
-]]>
-
-
-
- Métodos transacionais
-
- Vamos começar pelo mais importante: como declarar os métodos como transacionais? Como informar ao
- Demoiselle Framework que o método deve participar da sessão transacional?
- A resposta é muito simples: anote seu método com @Transactional.
-
-
-
- Se você desejar que todos os métodos de sua classe sejam transacionais, anote diretamente a classe:
-
-
-
- Neste exemplo, os métodos inserir(), alterar() e
- excluir() da classe Simples participarão do contexto transacional.
-
-
-
-
- E se acontecer uma Exception?
-
- Caso ocorra uma exceção na execução de um método transacional, o mecanismo fará rollback na transação
- automaticamente. É possível mudar este comportamento utilizando exceções de aplicação (para maiores detalhes ver Exceção).
-
-
-
-
-
- O objeto Transaction
-
- Para ter acesso à instância da transação corrente, basta injetar TransactionContext em sua classe e obter a transação corrente.
-
-
-
-
-
- A estratégia mais adequada
-
- Para o controle transacional funcionar corretamente é preciso escolher a estratégia mais adequada para o seu
- caso. Não existe a bala de prata, você tem que avaliar a melhor estratégia para o seu projeto.
-
-
- Você também pode optar por não utilizar controle de transação. Neste caso, basta não utilizar a anotação @Transactional. Contudo,
- caso você a utilize, você poderá escolher entre as estratégias JPA, JDBC, JTA (ambas fornecidas pelo Framework) e uma estratégia que você
- pode criar ou importar para seu projeto.
-
-
- 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,
- o framework lançará uma exceção lhe avisando sobre isto!
-
-
-
-
- Estratégia JDBC
-
- Esta estratégia, que está disponível na extensão demoiselle-jdbc, delega o
- controle das transações para o java.sql.Connection da
- especificação JDBC. Você deve escolher esta estratégia quando estiver persistindo dados
- com JDBC e utilizando apenas uma base de dados em sua aplicação. Como um Connection
- acessa apenas uma base de dados, não há como fazer o controle transacional de base de dados distintas.
-
-
- A transação JDBC é simples de configurar e não exige nenhum recurso externo à sua aplicação.
- Para utilizá-la basta que seu projeto adicione no arquivo pom.xml dependência à extensão demoiselle-jdbc, que o
- Demoiselle fará a seleção por essa estratégia de forma automática.
-
-
- Para utilizar a estratégia de transação JDBC, inclua a dependência para extensão JDBC
- no arquivo pom.xml.
-
- br.gov.frameworkdemoiselle
- demoiselle-jdbc
- compile
-]]>
-
-
-
- Estratégia JPA
-
- Esta estratégia, que está disponível na extensão demoiselle-jpa, delega o
- controle das transações para o javax.persistence.EntityManager da
- especificação JPA. Você deve escolher esta estratégia quando estiver persistindo dados
- com JPA e utilizando apenas uma base de dados em sua aplicação. Como um EntityManager
- acessa apenas uma unidade de persistência, não há como fazer o controle transacional de unidades distintas.
-
-
- A transação JPA é simples de configurar e não exige nenhum recurso externo à sua aplicação.
- Para utilizá-la basta que seu projeto adicione no arquivo pom.xml dependência à extensão demoiselle-jpa, que o
- Demoiselle fará a seleção por essa estratégia de forma automática.
-
-
- Caso não esteja utilizando o arquétipo JSF-JPA fornecidos pelo Demoiselle, confira se a dependência para a
- extensão está indicada corretamente no arquivo pom.xml.
-
- br.gov.frameworkdemoiselle
- demoiselle-jpa
- compile
-]]>
-
-
-
- Estratégia JTA
-
- Esta estratégia, também disponível através de uma extensão (demoiselle-jta), é
- responsável por delegar o controle de transação para um container JEE. Com a JTATransaction
- é possível incluir várias unidades de persistência de uma mesma aplicação no mesmo contexto transacional.
- Isso mesmo, o famoso Two-Phase Commit (2PC).
-
-
- A estratégia JTA não serve apenas para persistência em banco de dados, serve também para integrar com
- tecnologias que façam acesso ao contexto JTA, como é o caso do EJB. Para ativar esta estratégia basta
- que seu projeto adicione no arquivo pom.xml a dependência à extensão demoiselle-jta, que o
- Demoiselle fará a seleção por essa estratégia de forma automática, pois essa estratégia tem prioridade em relação
- à estratégia JPA e JDBC.
-
-
-
- Feito isto, o controle transacional será delegado para a transação acessível via JNDI com o nome
- UserTransaction. A estratégia acessa o objeto da seguinte maneira:
- Beans.getReference(UserTransaction.class). Portanto, para você utilizar esta estratégia,
- você precisa de um container JEE ou de um servidor JTA qualquer.
-
-
- Caso você esteja persistindo os dados com JPA, é preciso também informar no arquivo persistence.xml
- o endereço da conexão JTA gerenciada. Veja um exemplo utilizando o servidor de aplicações JBoss AS7 e com o
- provider Hibernate (embutido no JBoss AS) como implementação JPA:
-
-
-
-
-
- java:jboss/datasources/ExampleDS
-
-
-
-
-
-
-
-]]>
-
- Caso não esteja utilizando o arquétipo JSF-JPA fornecidos pelo Demoiselle, confira se a dependência para a
- extensão está indicada corretamente, no arquivo pom.xml.
-
- br.gov.frameworkdemoiselle
- demoiselle-jta
- compile
-]]>
-
-
- Caso você esteja persistindo os dados com JDBC, é preciso informar no arquivo demoiselle.properties
- o endereço da conexão JTA gerenciada. Veja um exemplo utilizando o servidor de aplicações JBoss AS7:
-
-
-
-
-
-
- Criando sua própria estratégia
-
- Caso nenhuma das estratégias oferecidas sirva para você, crie a sua. Basta escrever uma
- classe não-final que implemente a interface Transaction do pacote
- br.gov.frameworkdemoiselle.transaction. É preciso que sua classe não possua construtores explícitos ou
- que possua um construtor público sem parâmetros. É possível fazer injeções nesta classe.
-
-
-
-
- Pronto, é só isso! Agora, os métodos anotados com @Transactional irão utilizar a estratégia criada em seu projeto de forma automática,
- mesmo que as extensões demoiselle-jdbc, demoiselle-jpa e demoiselle-jta sejam adicionadas ao
- projeto, pois o framework dará prioridade máxima à estratégia criada no projeto.
-
-
-
-
- Escolhendo a estratégia manualmente
-
- 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
- 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
- arquivo demoiselle.properties qual estratégia será utilizada. Veja alguns exemplos de definição de estratégias própria,
- JDBCTransaction, JPATransaction e JTATransaction. É importante notar que apenas uma estratégia
- pode estar ativa por vez:
-
- frameworkdemoiselle.transaction.class=projeto.MyTransaction
-frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JDBCTransaction
-frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JPATransaction
-frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JTATransaction
-
-
-
--
libgit2 0.21.2