Demoiselle Tutorial Documentation Release 1.0.0 Demoiselle Framework January 29, 2010 CONTENTS 1 Arquitetura 1.1 Laboratório – Arquitetura e Configuração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 2 Persistência 2.1 Laboratório – Persistência . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 3 Indices and tables 23 i ii Demoiselle Tutorial Documentation, Release 1.0.0 Contents: CONTENTS 1 Demoiselle Tutorial Documentation, Release 1.0.0 2 CONTENTS CHAPTER ONE ARQUITETURA 1.1 Laboratório – Arquitetura e Configuração Este laboratório tem por objetivo fixar os conceitos abordados no Módulo 01 do tutorial que trata as questões de arquitetura do Framework Demoiselle e orientar o processo de instalação e configuração do ambiente de desenvolvimento e da aplicações instanciadas por ele. Caso esteja optando por não utilizar a ferramenta MAVEN, Demoiselle-Tutorial-Modulo01-Arquitetura-Anexo-I, ao invés deste. utilize o documento Para o bom andamento deste laboratório, espera-se que o ambiente do desenvolvedor contenha os seguintes softwares: Software Compilador Java (JDK) Eclipse Ganymede AspectJ Development Tools for Eclipse Maven Integration for Eclipse Servidor de Aplicação Tomcat Demoiselle Wizard Jboss Tools Versão 1.5.0_17* 3.4.2 1.6.4 0.9.7* 6.0.18 1.0.2 3.0 Objetivo Compilação dos projetos IDE para desenvolvimento Compilação de aspectos Integração com projetos Maven Servidor de aplicação Web Gerador de código do Framework Demoiselle Kit de acessórios para desenvolvimento • Mínima 1.1.1 Objetivos • Criar e configurar projetos via arquétipo Maven; • Criar projeto do tutorial (projeto que terá continuidade nos demais laboratórios); • Configurar projeto via Demoiselle Wizard. 3 Demoiselle Tutorial Documentation, Release 1.0.0 Figura 1: Lista de update sites configurados no Eclipse 1.1.2 Exercício 1.0 – Instalação e configuração do Ambiente 1. Baixar e instalar a JDK JAVA (http://java.sun.com/javase/downloads/index_jdk5.jsp), também é possível utilizar JAVA 6, mas mantendo a compatibilidade com JAVA 5. 2. Baixar e instalar a IDE Eclipse Ganymede (http://www.eclipse.org/ganymede/). 3. Inicie o uso do Eclipse. 4. Já no interface do Eclipse utilize a opção de Software Updates: Menu-> Help-> Software Updates. 5. Utilize a opção Add Site... (figura 1) para instalar os seguintes softwares: • AspectJ Development Tools for Eclipse (http://download.eclipse.org/tools/ajdt/34/update/) • Maven Integration for Eclipse (http://m2eclipse.sonatype.org/update/) • Demoiselle Wizard (http://demoiselle-wzd.sourceforge.net/updatesite/) • JBoss Tools (http://download.jboss.org/jbosstools/updates/stable/) 1.1.3 Exercício 1.1 – Arquétipo Demoiselle 1. Configuração do repositório Maven 4 Chapter 1. Arquitetura Demoiselle Tutorial Documentation, Release 1.0.0 Abra o Eclipse. A primeira vez que plugin do Eclipse (m2) é instalado, o repositório local é criado na pasta .m2, que fica na Pasta do Usuário (USER_HOME). No Windows, normalmente fica em “C:Documents and Settings$USER_HOME.m2”; no Linux, em “/home/$USER_HOME/.m2/”). Dica: A pasta .m2 é protegida, portanto pode não estar visível por padrão. Para acessá-la, se estiver numa máquina Windows, configure a exibição de arquivos ocultos. No Linux, utilize as teclas Ctrl+H para exibir e esconder arquivos ocultos. No seu repositório local ($USER_HOME/.m2) crie o arquivo archetype-catalog.xml e copie o conteúdo abaixo: <?xml version="1.0" encoding="UTF-8"?> <archetype-catalog> <archetypes> <archetype> <groupId>br.gov.component.demoiselle.archetypes</groupId> <artifactId>demoiselle-archetype-webapp-sample</artifactId> <version>1.0.0</version> <repository> http://demoiselle.sourceforge.net/repository/release </repository> </archetype> </archetypes> </archetype-catalog> 1. Criando um novo projeto Volte ao Eclipse é acione o menu: File → New → Project... Selecione a opção Maven Project (figura 2): 1.1. Laboratório – Arquitetura e Configuração 5 Demoiselle Tutorial Documentation, Release 1.0.0 Figura 2: Seleção de projeto Maven Na próxima tela é possível configurar o local onde o projeto será criado. Mantenha sua tela conforme a figura 3 para que o projeto seja criado dentro do Workspace padrão. 6 Chapter 1. Arquitetura Demoiselle Tutorial Documentation, Release 1.0.0 Figura 3: Criação de um novo projeto Maven a partir de arquétipo • Na tela seguinte (figura 4) são exibidos todos os arquétipos cadastros no archetype-catalog.xml; • Selecione no campo Catalog a opção: Default Local; • Selecione a última versão do arquétipo demoiselle (demoiselle-archetype-webapp-sample). 1.1. Laboratório – Arquitetura e Configuração 7 Demoiselle Tutorial Documentation, Release 1.0.0 Figura 4: Configuração do catálogo local de arquétipos Maven Vá à próxima tela. Informe os dados do seu projeto. • Group Id: representa a identificação da organização; • Artifact Id: representa o nome do projeto; • Version: versão do projeto; • Package: pacote raiz da aplicação. 8 Chapter 1. Arquitetura Demoiselle Tutorial Documentation, Release 1.0.0 Figura 5: Parâmetros do projeto Maven Acione o botão Finish para iniciar a criação do projeto. Seu projeto deverá ser criado conforme estrutura da figura 6: 1.1. Laboratório – Arquitetura e Configuração 9 Demoiselle Tutorial Documentation, Release 1.0.0 Figura 6: Estrutura de pacotes do projeto escola O Arquétipo Maven constrói uma aplicação JEE compatível com os seguintes componentes/frameworks: • JSF Api 1.2.08 • RichFaces 3.1.2 • Weblets Api 1.1 • MyFaces Tomahawk 1.1.7 10 Chapter 1. Arquitetura Demoiselle Tutorial Documentation, Release 1.0.0 • JSF-Facelets 1.1.14 • Postgresql 8.0-318 • JasperReports 3.1.0 1.1. Laboratório – Arquitetura e Configuração 11 Demoiselle Tutorial Documentation, Release 1.0.0 12 Chapter 1. Arquitetura CHAPTER TWO PERSISTÊNCIA 2.1 Laboratório – Persistência Este laboratório tem por objetivo fixar os conceitos da camada de persistência do Framework Demoiselle e orientar o processo de configuração das aplicações. 2.1.1 Objetivos • Configurar a camada de Persistência através do Demoiselle Wizard utilizando JPA. • Criar a camada de persistência da aplicação Escola. – Interfaces DAO; – Implementações DAO; – Filtros de Consulta; • Testar o funcionamento da camada de persistência. 2.1.2 Exercício 2.1 – Configuração do Projeto 1. Este laboratório utilizará o projeto escola criado no laboratório anterior. 2. Clique com o botão direito sob o projeto a acione a opção Demoiselle -> Configurar Projeto. Figura 1: Configurar Projeto 1. Na guia JPA, você poderá adicionar, alterar ou remover suas Persistence Units. Para incluir uma Persistence Unit, clique no botão adicionar. 13 Demoiselle Tutorial Documentation, Release 1.0.0 Figura 2: Configurar Persistence Unit Para incluir uma Persistence Unit, preencha os seguintes campos: Obs.: Este tutorial utilizará como exemplo o HypersonicSQL. • Nome: EscolaPU • Provider: org.hibernate.ejb.HibernatePersistence • Tipo: Resource Local • Data Source: Não vamos usar JNDI • Propriedades: Key hibernate.dialect hibernate.show_sql hibernate.format_sql hibernate.hbm2ddl.auto hibernate.connection.driver_class hibernate.connection.url hibernate.connection.username hibernate.connection.password hibernate.use_sql_comments Value org.hibernate.dialect.HSQLDialect true false update org.hsqldb.jdbcDriver jdbc:hsqldb:. sa false 1. Clique no botão Salvar e caso não queira adicionar nenhuma outra Persistence Unit clique no botão Finish. O Wizard irá configurar o arquivo persistence.xml na pasta resources/META-INF do projeto conforme figura abaixo: 14 Chapter 2. Persistência Demoiselle Tutorial Documentation, Release 1.0.0 Figura 3: Persistence.xml 1. Adicione a linha framework.demoiselle.persistence.default_persistence_unit=EscolaPU ao final do arquivo demoiselle.properties. 2. Adicione a dependência do HSQLDB versão 1.8.0.1 no arquivo pom.xml da aplicação (logo após a tag <profiles>) conforme abaixo: <dependencies> ... <dependency> <groupId>hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>1.8.0.1</version> </dependency> ... </dependencies> 2.1.3 Exercício 2.2 – Desenvolvimento da camada de persistência Pacote Bean 1. No pacote br.gov.demoiselle.escola.bean Implemente o Pojo de Aluno conforme abaixo: package br.gov.demoiselle.escola.bean; import import import import import import import import import import import import import import java.util.ArrayList; java.util.Date; java.util.HashSet; java.util.List; java.util.Set; javax.persistence.Entity; javax.persistence.SequenceGenerator; javax.persistence.Table; javax.persistence.Column; javax.persistence.FetchType; javax.persistence.GeneratedValue; javax.persistence.Id; javax.persistence.Temporal; javax.persistence.TemporalType; 2.1. Laboratório – Persistência 15 Demoiselle Tutorial Documentation, Release 1.0.0 import import import import javax.persistence.CascadeType; javax.persistence.OneToMany; javax.persistence.GenerationType; br.gov.framework.demoiselle.core.bean.IPojo; @Entity @Table(name="aluno") @SequenceGenerator(name="AlunoSequence", sequenceName="aluno_seq", allocationSize=1) public class Aluno implements IPojo { private static final long serialVersionUID = 1L; @Id @GeneratedValue(generator="AlunoSequence", strategy=GenerationType.SEQUENCE) @Column(name="id_aluno") private Long id; @Column(name="nome", length=100) private String nome; @Column(name="pai", length=100) private String pai; @Column(name="mae", length=100) private String mae; @Column(name="nascimento") @Temporal(value=TemporalType.DATE) private Date nascimento; @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) private Set<Endereco> enderecos; public Aluno() { enderecos = new HashSet<Endereco>(); } public Aluno(long id) { this(); this.id = id; } public Long getId() { return id;} public void setId(Long id) { this.id = id;} public String getNome() {return nome;} public void setNome(String nome) {this.nome = nome;} public String getPai() {return pai;} public void setPai(String pai) {this.pai = pai;} public String getMae() {return mae;} public void setMae(String mae) {this.mae = mae;} 16 Chapter 2. Persistência Demoiselle Tutorial Documentation, Release 1.0.0 public Date getNascimento() {return nascimento;} public void setNascimento(Date nascimento) {this.nascimento = nascimento;} public Set<Endereco> getEnderecos() { return enderecos; } public List<Endereco> getListaEndereco() { return new ArrayList<Endereco>(enderecos); } public void setEnderecos(Set<Endereco> enderecos) { this.enderecos = enderecos; } } 1. No mesmo pacote implemente o Pojo de Endereço: package br.gov.demoiselle.escola.bean; import import import import import import import import import import import import import import javax.persistence.Column; javax.persistence.Entity; javax.persistence.FetchType; javax.persistence.GeneratedValue; javax.persistence.GenerationType; javax.persistence.Id; javax.persistence.JoinColumn; javax.persistence.ManyToOne; javax.persistence.SequenceGenerator; javax.persistence.Table; br.gov.component.demoiselle.common.pojo.extension.Description; br.gov.component.demoiselle.common.pojo.extension.EqualsField; br.gov.component.demoiselle.common.pojo.extension.PojoExtension; br.gov.framework.demoiselle.core.bean.IPojo; @Entity @Table(name="endereco") @SequenceGenerator(name="EnderecoSequence", sequenceName="Endereco_seq", allocationSize=1) public class Endereco extends PojoExtension implements IPojo { private static final long serialVersionUID = 1L; @EqualsField @Id @GeneratedValue(generator="EnderecoSequence", strategy=GenerationType.SEQUENCE) @Column(name="id_endereco") private Long id; @EqualsField @Description @Column(name="logradouro", length=100) private String logradouro; @Description @Column(name="numero", length=100) private String numero; @Description 2.1. Laboratório – Persistência 17 Demoiselle Tutorial Documentation, Release 1.0.0 @Column(name="complemento", length=100) private String complemento; @Description @Column(name="bairro", length=100) private String bairro; @Description @Column(name="cep", length=100) private String cep; @Column(name="municipio", length=100) private String municipio; @Description @Column(name="tipo") private Integer tipo; @Description @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="aluno") private Aluno aluno; public Endereco() { } public Endereco(String logradouro, String numero, String complemento, String bairro, String cep, String Municipio, Integer tipo) { super(); this.logradouro = logradouro; this.numero = numero; this.complemento = complemento; this.bairro = bairro; this.cep = cep; this.municipio = Municipio; this.tipo = tipo; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getLogradouro() { return logradouro; } public void setLogradouro(String logradouro) { this.logradouro = logradouro; } public String getNumero() { return numero; } 18 Chapter 2. Persistência Demoiselle Tutorial Documentation, Release 1.0.0 public void setNumero(String numero) { this.numero = numero; } public String getComplemento() { return complemento; } public void setComplemento(String complemento) { this.complemento = complemento; } public String getBairro() { return bairro; } public void setBairro(String bairro) { this.bairro = bairro; } public String getCep() { return cep; } public void setCep(String cep) { this.cep = cep; } public Integer getTipo() { return tipo; } public void setTipo(Integer tipo) { this.tipo = tipo; } public String getMunicipio() { return municipio; } public void setMunicipio(String Municipio) { this.municipio = Municipio; } public Aluno getAluno() { return aluno; } public void setAluno(Aluno aluno) { this.aluno = aluno; } } 1. Agora os beans foram criados será necessário fazer o mapeamento deles no arquivo persistence.xml. Para isso clique com o botão direito em cima do projeto e em seguida clique em Demoiselle -> Configurar Projeto. 2.1. Laboratório – Persistência 19 Demoiselle Tutorial Documentation, Release 1.0.0 Figura 4: Configurar Projeto Na aba JPA, clique em cima da Persistence Unit criada com o nome de EscolaPU e em seguida clique em Editar. Figura 5: Editar Persistence Unit No lado direito da tela aparecerá as configurações feitas anteriormente e aparecerá também um botão chamado Adicionar Pojo. Clique nesse botão. 20 Chapter 2. Persistência Demoiselle Tutorial Documentation, Release 1.0.0 Figura 6: Adicionar Pojo Em seguida aparecerá as classes que já foram criadas. Selecione os dois beans (Aluno e Endereço) conforme a figura abaixo e clique em Finish. 2.1. Laboratório – Persistência 21 Demoiselle Tutorial Documentation, Release 1.0.0 Figura 7: Selecionar Pojos Verifique que os dois beans foram mapeados no aquivo persistence.xml conforme abaixo: <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0" <persistence-unit name="EscolaPU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>br.gov.sample.demoiselle.escola.bean.Aluno</class> <class>br.gov.sample.demoiselle.escola.bean.Endereco</class> <properties> <property name="hibernate.connection.username" value="sa" /> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriv <property name="hibernate.format_sql" value="false" /> <property name="hibernate.connection.password" value="" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.use_sql_comments" value="false" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" <property name="hibernate.connection.url" value="jdbc:hsqldb:." /> </properties> </persistence-unit> </persistence> ... 22 Chapter 2. Persistência CHAPTER THREE INDICES AND TABLES • Index • Module Index • Search Page 23