Demoiselle Manual

Embed Size (px)

Citation preview

Mdulo 1O Demoiselle uma composio de projetos, e no apenas um framework Java como muita gente acha. fcil entender porque pensam assim: o Framework surgiu primeiro e at hoje o carrochefe. Ento vamos deixar bem claro, o projeto Demoiselle um agregado de subprojetos, que so: Framework. Este o foco do curso. Vamos conhecer e praticar as facilidades que este projeto oferece para o desenvolvimento de aplicaes Java baseado nas tecnologias da JEE 6. Definio em duas palavras: simplicidade e flexibilidade. Component. Conjunto de componentes reusveis que do mais poder ao Framework. Nem todos componentes esto atrelados ao Framework, mas os utilizados neste curso esto. Infra. Se voc sente calafrios ao pensar na trabalheira que d para preparar um ambiente de desenvolvimento, este projeto foi feito para voc. Sim, vamos utiliz-lo neste curso. Sample. Est precisando de exemplos para entender melhor o Framework e os Componentes? Disponibilizamos algumas amostras para voc. Neste curso no utilizaremos este projeto. Process. Trata-se de um processo livre de desenvolvimento de software inspirado em metodologias geis. No utilizaremos este projeto neste curso. Community. Todos os projetos Demoiselle so livres e colaborativos. Este projeto promove a gesto transparente e a participao ativa da comunidade. Citaremos algumas ferramentas no decorrer deste curso. Tools. So ferramentas focadas em produtividade que podem ser usadas em conjuntos com o Framework. Especificamente a ferramenta Demoiselle Nimble ser citada neste curso.

ObjetivoO objetivo deste curso bsico do Demoiselle mostrar, explicar e experimentar as principais funcionalidades do Framework, tais como: Testes Log Resource Bundle Tratamento de excees Configurao Persistncia Transao Controladores Inicializadores Controle de acesso Web Mensagem

ApoioAo final deste curso voc ser capaz de compreender o funcionamento do Demoiselle e utiliz-lo para construir suas aplicaes. Para facilitar a sua vida, adicione nos favoritos do seu browser: http://demoiselle.sourceforge.net/docs. Neste link voc encontrar dois guias de referncia muito importantes: do Framework e dos Componentes. Recorra a eles sempre que precisar de detalhamentos. Aproveite o embalo e cadastre-se na lista de usurios, ferramenta indispensvel para quem quer mandar bem e se manter atualizado: https://lists.sourceforge.net/lists/listinfo/demoiselle-users. Alm de tirar dvidas bsicas e avanadas, voc poder colaborar com outros usurios.

InfraChega de lero-lero e vamos para a prtica, o primeiro passo a preparao do ambiente. Se voc utiliza uma distribuio Linux baseada no Debian, como o Ubuntu, no tem com o que se preocupar, o Demoiselle Infra vai ajudar muito nesta tarefa: 1. Acesse o menu Instalao no site do Infra: http://demoiselle.sourceforge.net/infra. 2. Neste curso convencionamos utilizar a distribuio Linux via APT (Advanced Package Tool). Siga o passa-a-passo e instale o pacote demoiselle-dev. 3. Instale tambm o pacote demoiselle-jboss-6.0. 4. No terminal, rode o comando demoiselle-workspace para poupar tempo com configurao do Eclipse. 5. Abra o Eclipse no menu do sistema: Aplicativos / Desenvolvimento / Demoiselle Eclipse 3.7. 6. Veja que o Eclipse j est todo configurado e voc poupou bastante tempo. Ponto para o Demoiselle! Se usurio de Windows ou outro sistema operacional, precisar montar seu ambiente. No menu Instalao no site do Infra tambm tem a explicao de como montar o ambiente no Windows o onde a instalao feita.

Novo projetoAgora que o ambiente est instalado, vamos criar o nosso primeiro projeto. nele que experimentaremos as funcionalidades do Framework: 1. No Eclipse, acesse File / New / Project. 2. Agora v em Maven / Maven project e clique em Next duas vezes. 3. Escolha o Catalog Demoiselle. 4. Na listagem, escolha o demoiselle-minimal e clique em Next. 5. Defina o Group Id br.gov.serpro, o Artifact Id inscricao conforme mostrados abaixo e clique em Finish.

6. Aguarde o Maven criar o seu projeto. Voc acabou de utilizar o Maven, uma ferramenta livre que auxilia na criao de projetos. Na realidade ele muito mais que isto, porm tudo que voc precisa saber no momento. No catlogo Demoiselle esto todos os moldes de projeto que fizemos. O Maven denomina-os de archetypes, portanto utilizaremos o termo arqutipos. O demoiselle-minimal o arqutipo que traz o bsico para utilizar o Demoiselle. Confira o vdeo de demonstrao clicando no link abaixo: http://www.youtube.com/watch?v=Hq8nPJztXsE ou www.frameworkdemoiselle.gov.br/documentacaodoprojeto/manuais-e-tutoriais/tutoriais-da-versao2/videos/demoiselle-e-d_-modulo-1-video-1

O que gerou?No Maven tudo artefato, inclusive este seu novo projeto. Todos os artefatos so identificados pelo Group Id acrescidos do Artifact Id, e foi isto que voc informou para gerao do seu projeto. Seguindo o padro do Maven, seu projeto possui a seguinte estrutura: Pasta src/main/java: aqui ficaro todas as classes do seu projeto. Pasta src/main/resources: armazenar os arquivos de configurao de sua aplicao. Pasta src/test/java: coloque aqui suas classes de teste. Pasta src/test/resources: os arquivos de configurao dos seus testes ficaro aqui. Pasta target: esta uma pasta temporria utilizada exclusivamente pelo Maven para armazenar as classes compiladas e arquivos de configurao processados. Voc no precisa mexer nela. Arquivo pom.xml: configurao do Maven para o seu projeto. Geralmente este arquivo contm muitas informaes, porm, com a utilizao da herana de configuraes, conseguimos torn-lo bem simples para voc. Tudo graas ao demoiselle-minimal-parent.

Abra o pom.xml e d uma olhada. Simples, no?!

DesafioVamos incrementar o projeto gerado para criar uma aplicao de verdade. cada mdulo deste curso exploraremos algumas funcionalidades do Framework. O desafio criar um sistema simples de inscrio com as seguintes regras: Possibilitar a matrcula do aluno na turma. O aluno s pode matricular-se uma vez. A turma tem um limite de alunos matriculados.

At o final do curso, voc criar uma aplicao web utilizando JSF, JPA, JTA, CDI e diversas outras siglas. No momento apropriado voc saber o significado de cada uma delas. Um passo de cada vez, assim que vamos evoluir.

TestesVoc j ouviu falar em TDD? a sigla para Test Driven Development, algo como Desenvolvimento Orientado a (ou Dirigido por) Testes. Resumidamente, a ideia criar os testes antes da soluo propriamente dita (por isso, alguns usam o termo Test First). Em quase todos os mdulos deste curso praticaremos o desenvolvimento orientado a testes. Ento vamos converter as regras da nossa aplicao-desafio em casos de teste: 1. No Eclipse, abra a pasta src/test/java e selecione o pacote br.gov.serpro.inscricao. 2. Acesse o menu v em File / New / Class. 3. Defina o nome da classe TurmaTest e clique em Finish.

4. Crie os mtodos public void matricularAlunoComSucesso(), public void falhaAoTentarMatricularAlunoDuplicado() e public void falhaAoTentarMatricularAlunoNaTurmaCheia(). 5. Anote os mtodos com @Test. A sua classe vai ficar assim:public class TurmaTest { @Test public void matricularAlunoComSucesso(){ } @Test public void falhaAoTentarMatricularAlunoDuplicado(){ } @Test public void falhaAoTentarMatricularAlunoNaTurmaCheia(){ }

}

Confira o vdeo de demonstrao clicando no link abaixo: http://www.youtube.com/watch?v=nVS21PrmEdM ou http://www.frameworkdemoiselle.gov.br/documentacaodoprojeto/manuais-e-tutoriais/tutoriais-daversao-2/videos/modulo-1-video-2

RetrospectivaO Demoiselle composto por diversos outros projetos. Vimos que o Framework prov vrias funcionalidades que sero exploradas neste curso. Aprendemos como chegar na documentao de referncia e onde pedir ajuda. Preparamos o ambiente de desenvolvimento e criamos o projeto que ser utilizado nos demais mdulos deste curso. Descobrimos os artefatos gerados automaticamente pelo arqutipo demoiselle-minimal e vimos que o pom.xml do projeto ficou bem simples graas s facilidades providas pelo Demoiselle Conhecemos o problema desafio e preparamos o terreno para consolidar os requisitos em forma de testes automatizados. No prximo mdulo, utilizaremos o componente demoiselle-junit experimentando as funcionalidades de log e internacionalizao da aplicao.

Mdulo 2No mdulo anterior configuramos o ambiente de desenvolvimento e geramos um projeto vazio. Criamos tambm uma classe com a definio de alguns testes. Neste mdulo implementaremos os testes, a soluo e conheceremos algumas funcionalidades do Demoiselle. Se voc ainda no tomou nota, no esquea de guardar o link para as documentaes de referncia nos favoritos do seu browser: http://demoiselle.sourceforge.net/docs. Vale a pena cadastrar-se na lista de usurios tambm: https://lists.sourceforge.net/lists/listinfo/demoiselle-users. Nos prximos mdulos no haver mais citao a estes links. Quem avisa, amigo !

MatrculaVamos comear pelo mais simples, a matrcula do aluno. Para facilitar, consideraremos que s existe uma turma. 1. Crie a classe Turma na pasta src/main/java no pacote br.gov.serpro.inscricao. 2. Crie os mtodos public void matricular(String aluno) e public boolean estaMatriculado(String aluno). 3. Apenas corrija os erros de compilao, faa o mtodo estaMatriculado retornar false. Pelo nome dos mtodos voc j imaginou para que servem, no ? Sua classe vai ficar assim:public class Turma { public void matricular(String aluno){ } public boolean estaMatriculado(String aluno){ return false; } }

Antes de elaborar a soluo, vamos fazer o teste. Abra a classe TurmaTest e implemente o mtodo de teste matricularAlunoComSucesso. Utilizaremos as assertivas do JUnit para verificar se o aluno foi matriculado. Seu teste vai ficar assim:@Test public void matricularAlunoComSucesso(){ Turma turma = new Turma(); turma.matricular("Santos Dumont"); Assert.assertTrue(turma.estaMatriculado("Santos Dumont")); }

Importe a classe org.junit.Assert. Na linha Assert.assertTrue(turma.estaMatriculado(Santos Dumont)) utilizamos a o mtodo assertTrue do JUnit que verifica se o retorno da chamada turma.estaMatriculado(Santos Dumont) true. Caso no seja, o teste falhar. Rode o teste e veja o resultado: 1. Clique com o boto direito na classe TurmaTest. 2. No menu que apareceu acesse Run As / JUnit Test. O resultado ser este:

Agora implemente a sua soluo na classe Turma. Para facilitar, vamos armazenar os alunos matriculados numa lista. 1. Crie o atributo private List alunosMatriculados = new ArrayList(). 2. Implemente o mtodo matricular que inclui o aluno na lista de matriculados. 3. Implemente o mtodo estaMatriculado que verifica se o aluno est na lista. A classe Turma vai ficar assim:public class Turma { private List alunosMatriculados = new ArrayList(); public void matricular(String aluno){ alunosMatriculados.add(aluno); } public boolean estaMatriculado(String aluno){ return alunosMatriculados.contains(aluno); }

}

Rode o teste novamente e perceba que agora vai passar:

Voc deve estar se perguntando: Onde est o Demoiselle neste cdigo?. Por enquanto, em lugar nenhum! Confira o vdeo de demonstrao clicando no link abaixo: http://www.youtube.com/watch?v=47lbMgC2tog ou http://www.frameworkdemoiselle.gov.br/documentacaodoprojeto/manuais-e-tutoriais/tutoriais-daversao-2/videos/video-1-do-modulo-2

LoggerVamos incrementar nossa aplicao. Sempre que um aluno for matriculado o sistema deve gerar um log no console. Se voc pensou em usar System.out.println(), esquea! Esta soluo gera problemas catastrficos de performance, por isso inventaram o Logger. As vantagens de utilizar Logger so vrias: desde melhoria de desempenho em relao ao

preemptivo System.out at flexibilidade no formato do log. Para utilizar, voc precisaria criar o seguinte atributo na classe Turma: private Logger logger = LoggerFactory.getLogger(br.gov.serpro.inscricao.Turma.class); Seria melhor assim: @Inject private Logger logger; Com o Demoiselle voc poder fazer da segunda forma. O que voc precisa saber agora que as duas maneiras so equivalentes, porm na segunda voc est utilizando um recurso importante do Framework: a Injeo de Dependncias. Ento mos obra: 1. Inclua o atributo @Inject private Logger logger na classe Turma. 2. Corrija o erro de compilao, importe a interface org.slf4j.Logger. 3. Acrescente no mtodo matricular a gerao do log utilizando logger.info(...). As modificaes na classe so estas:... @Inject private Logger logger; public void matricular(String aluno){ ... logger.info("Aluno matriculado com sucesso"); } ...

Rode novamente o teste. Desta vez vai falhar com o seguinte erro: java.lang.NullPointerException na linha que contm logger.info(), na classe Turma. Ou seja, a injeo no funcionou! Em outras palavras, ningum criou uma instncia de org.slf4j.Logger e a atribuiu propriedade logger de Turma. Quem deveria fazer isto? Vamos corrigir isto! 1. Na classe TurmaTest a turma no pode ser instanciada com new. Crie o atributo @Inject private Turma turma. 2. Anote a classe de teste com @RunWith(DemoiselleRunner.class). Injees nos casos de teste no funcionam, pois o JUnit no oferece suporte nativo ao CDI. Por isto criamos o componente demoiselle-junit com a classe br.gov.frameworkdemoiselle.junit.DemoiselleRunner. O componente demoiselle-junit cria um ambiente CDI utilizando o projeto Weld (Implementao de referncia da especificao do CDI) tornando possvel a injeo de dependncias. Feitos todos os ajustes, TurmaTest ficar assim:

@RunWith(DemoiselleRunner.class) public class TurmaTest { @Inject private Turma turma; @Test public void matricularAlunoComSucesso(){ turma.matricular("Santos Dumont"); Assert.assertTrue(turma.estaMatriculado("Santos Dumont")); } ... }

Execute o teste novamente, agora passar. Observe o log gerado no console: 18:17:57,187 INFO [inscricao.Turma] Aluno matriculado com sucesso

Confira o vdeo de demonstrao clicando no link abaixo: http://www.youtube.com/watch?v=aR3GJ72HzW8 ou http://www.frameworkdemoiselle.gov.br/documentacaodoprojeto/manuais-e-tutoriais/tutoriais-daversao-2/videos/modulo-2-video-2

Injeo de DependnciasInjeo de dependncia um padro de desenvolvimento utilizado para manter o baixo nvel de acoplamento entre os mdulos da aplicao. Em Java, o conceito foi popularizado por diversos frameworks, tais como: Spring, JBoss Seam, Google Guice e a primeira verso do Demoiselle. Dentre as novidades do JavaEE 6, o mecanismo de injeo de dependncias se tornou padro atravs da JSR-299, comumente referenciada como CDI (Contexts and Dependency Injection). Uma das principais vantagens desse recurso o gerenciamento do ciclo de vida dos objetos pelo container. A anotao @javax.inject.Inject utilizada para solicitar ao container a criao dos seus objetos. Caso seu objeto seja criado com new, o CDI no tomar conhecimento e o gerenciamento do ciclo de vida ser de sua responsabilidade. O Demoiselle 2 permite injetar classes que que no foram originalmente criadas de acordo com a JSR-299, como o caso do org.slf4j.Logger. Se voc estivesse utilizando CDI sem o Demoiselle, voc teria que resolver por conta prpria.

Resource BundleTambm conhecido como I18N, o recurso de internacionalizao permite que a aplicao suporte diversos idiomas. Voc deve estar pensando: Nunca precisei disto na vida!. Ento responda, onde voc guarda as mensagens da aplicao? No prprio cdigo-fonte, em constantes ou em arquivo de mensagens? Sem sombra de dvidas, o pior cenrio espalhar as mensagens pelo cdigo-fonte, o melhor guardar em arquivo.

A plataforma Java prov a classe java.util.ResourceBundle que possibilita a manipulao de arquivos de mensagens, porm no h integrao nativa com CDI. Vejamos como o Demoiselle oferece esta facilidade: 1. Acrescente o atributo @Inject private ResourceBundle bundle na classe Turma. 2. Corrija o erro de compilao, importe a classe java.util.ResourceBundle. 3. Modifique o mtodo matricular para buscar a mensagem utilizando bundle.getString("matricula.sucesso"). 4. Crie o arquivo messages.properties na pasta src/main/resources. 5. Abra o arquivo e inclua a linha matricula.sucesso=Aluno matriculado com sucesso. A classe Turma vai ficar assim:... @Inject private ResourceBundle bundle; public void matricular(String aluno) { ... logger.info(bundle.getString("matricula.sucesso")); } ...

Rode o teste e verifique que a mensagem continua aparecendo no console. Seria interessante que o log indicasse o aluno matriculado? 1. Abra o arquivo messages.properties. 2. Modifique a linha para ficar assim: matricula.sucesso=Aluno {0} matriculado com sucesso. 3. Abra a classe Turma 4. Exclua o import java.util.ResourceBundle . 5. Acrescente o import br.gov.frameworkdemoiselle.util.ResourceBundle. 6. Passe o parmetro na chamada bundle.getString("matricula.sucesso", aluno). A classe Turma vai ficar assim:... @Inject private ResourceBundle bundle; public void matricular(String aluno) { ... logger.info(bundle.getString("matricula.sucesso", aluno)); } ...

A classe java.util.ResourceBundle no suporta a passagem de parmetros, por isso o Framework disponibiliza o utilitrio br.gov.frameworkdemoiselle.util.ResourceBundle. O smbolo {0} ser substitudo pelo primeiro parmetro. possvel utilizar chave={1} {2} {3} desde que os parmetros sejam passados no getString, ex: bundle.getString("chave, param1, param2, param3) e

assim por adiante. Mas se voc precisar de uma aplicao multi-idiomas, o quefazer? Recorra ao guia de referncia, pois no vamos aprofundar nesta funcionalidade no curso bsico. Vamos ver outras situaes agora. Confira o vdeo de demonstrao clicando no link abaixo: http://www.youtube.com/watch?v=7eOKOeKgtLg ou http://www.frameworkdemoiselle.gov.br/documentacaodoprojeto/manuais-e-tutoriais/tutoriais-daversao-2/videos/modulo-2-video-3

Aluno duplicado ou sala cheiaVamos partir para a implementao dos testes do fluxo de exceo, ou seja, quando a nossa aplicao deve falhar propositalmente. No falhaAoTentarMatricularAlunoDuplicado, espera-se que o mtodo matricular da classe Turma lance java.lang.RuntimeException. Se a exceo no ocorrer o teste falhar automaticamente.@Test(expected = RuntimeException.class) public void falhaAoTentarMatricularAlunoDuplicado() { turma.matricular("Orville Wright"); turma.matricular("Orville Wright"); }

Convencionando que a turma lota com 5 alunos, vamos implementar o teste falhaAoTentarMatricularAlunoNaTurmaCheia. Seguindo o mesmo raciocnio do teste anterior, o teste falhar caso a matrcula do 6 aluno no gere a exceo esperada.@Test(expected = RuntimeException.class) public void falhaAoTentarMatricularAlunoNaTurmaCheia() { for (int i = 1; i