GRUPO DATA David, André, Thiago e Alexandre WEBCOMPONENTS.

Slides:



Advertisements
Apresentações semelhantes
Programação em Java Prof. Maurício Braga
Advertisements

JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF Atualizado em Novembro/2008.
JDBC aplicado no projeto PAIPUC Integrantes: Eduardo M. Nsimba - 4º Ano Gian Paolo Peduto - 2º Ano Heloísa H. S. Santos - 2º Ano Orientador: Prof. Dr.
Prof. Alessandro J. de Souza
Web Application Interface Grupo ECFJ Edson e Jorge.
Projeto Maven AcademicNet Grupo DGMR Daniel Isidoro Born Guilherme Amaral Márcio Percilio Roberto Rutz.
Java Conexão com Banco de Dados
APLICAÇÕES DE LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS ACESSO A BANCO DE DADOS COM O JDBC Prof. Thiago Pereira Rique
28.5 Instruções para instalar o MySQL e o MySQL Conector/J
Linguagens de Programação Orientadas a Objetos
Professor Ismael H F Santos –
Introdução a JDBC Eduardo Martins Guerra Instituto Tecnológico de Aeronáutica Curso de Pós-Graduação em Engenharia de Software Programação Distribuída.
B ANCO DE D ADOS E JDBC Profa. Msc. Cintia Carvalho Oliveira Mestre em Ciência da Computação – UFU Bacharel em Ciência da Computação - UFJF 1.
Java & Bancos de Dados Universidade Salgado de Oliveira Goiânia
Hibernate com JPA Prática
Java :: Persistência de Dados
Acesso a Base de Dados JDBC Trabalho Realizado por:
O Mecanismo de Threads em Java 2. Criar uma classe herdeira da super classe Thread public class minhaThread extends Thread{ public class minhaThread extends.
Concorrência em Java Threads em Java.
Conexão com Bancos de Dados Carlos Bazilio Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade Federal Fluminense.
Conceitos de SGBD Objeto-Relacional Oracle 10g [2]
Desenvolvendo para a web com Grails
Capítulo 2 Java Servlets.
DBUnit Framework Componentes: Fábio Gomes Claver Pari Eni Conde
Integração com Banco de Dados
Anexo A. JDBC  Conjunto de interfaces e classes java que faz envio de consultas para um banco de dados.  Objetos(tipos)  Conexão (Driver e Connection)
JSP / Servlets Avançado
Chamada Remota de Procedimentos
Desenvolvimento de Aplicações CORBA
JUnit “Keep the bar green to keep the code clean” JUnit Site.
Um Framework Para Testes
JDBC Java Database Connectivity. JDBC Especificação para uso de base de dados em aplicações e applets JAVA; API para uso de drivers JDBC; Compatível com.
The Factory Esclarecendo a arquitetura utilizada no projeto Piloto Autor: Wabber Filho.
Pilhas Profa. Nádia Félix.
Acessando o WI Após fazer o deploy pelo Tomcat, digite
Desnvolvimento de Projetos e Aplicações Web Ceça Moraes – Ceça.
Configuração do Ambiente de programação
Entity Beans Marco Antonio Arquiteto de Software Dezembro/2007.
Implementação MVC Pedro Antonino.
Tratamento de Exceções
Java Kickstart, day 2 Semelhanças com linguagem C.
Aula Prática 4 Monitoria IP/CC (~if669).
Capítulo 6 Exceções.
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
Programação para Web Unidade 06 – Java Beans e BDs Prof.: Henrique Santos.
Classes Abstratas e Interface
Triggers (Gatilhos) Professor Esp. Diego André Sant’Ana
Fundamentos da Linguagem C#
Exemplo de desenvolvimento com testes (JUNIT - estudo de caso) Alfredo Goldman.
Java Conexão com Baco de dados Saulo Bazzi Oberderfer Fonte:
Aglets.
Socket em Java.
Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP MAC5700.
April 05 Prof. Ismael H. F. Santos - 1 Modulo II Verifier Professor Ismael H F Santos –
Factory.
Paulo Borba Centro de Informática Universidade Federal de Pernambuco Exceções.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Leo Silva Leonardo Murta Luiz Viana Persistência em Java.
Aprendendo como funciona o NHibernate Elvis Medeiros Programador .NET
Utilizando subversion como controle de versão
Desenvolvimento WEB II Aula 3 – Conexão com o Banco de Dados
RMI Java Remote Method Invocation em Java. Introdução Java Remote Method Invocation (Java RMI) permite desenvolver sistemas distribuídos baseados em Java.
Acessando banco de dados com JAVA.  Linguagem independente de plataforma; ◦ “Write once, run anywhere” ◦ JVM  Java Virtual Machine  Mecanismo que permite.
Desenvolvimento WEB II Professora: Kelly de Paula Cunha.
V Seminário RSJUG Confraria do Java JavaDB Um Banco de Dados 100% Java Profa. Me. Karen Selbach Borges.
JavaServer Faces – JSF Fernando Freitas Costa Bacharel em Sistemas de Informação Especialista em Gestão e Docência Universitária blog.fimes.edu.br/fernando.
Persistência de dados e padrão DAO
Prof.: Jean Carlo Mendes
Persistência de dados e padrão DAO Padrões de Projeto Orientado a Objetos Profa. Danielle Martin/Mauricio Universidade de Mogi das Cruzes.
Atividade ASP.NET Portal da Memoria Atividade Desenvolver uma aplicação ASP.NET com funcionalidade similar à existente no site centenário.ifrn.edu.br utilizando.
Transcrição da apresentação:

GRUPO DATA David, André, Thiago e Alexandre WEBCOMPONENTS

Conteúdo: Antes de começar Visão Geral Principais Dependências Externas JAR - Acesso a Dados Pacote dao Pacote memory_dao Pacote jdbc_dao Conexão com JDBC Conexão com JDBC e Spring WAR – Acesso a Dados Log4J Junit DbUnit Selenium Pontos a melhorar no projeto

Antes de começar Informações Úteis No repositório do projeto há uma pasta DOC com o presente slide e um passo- a-passo para criar o banco de dados do projeto. O script do banco de dados se encontra dentro do pacote jdbc_dao, no projeto JAR. Seu nome é academicNetDB.sql. Os testes com o Selenium estão configurados para executar (por padrão) com o navegador Google Chrome ( ) Algumas explicações no final do slide, em Pontos a Melhorar no Projeto podem auxiliar a entender alguns pontos do projeto. Esta apresentação possui alguns pontos com explicação evolutiva. Por exemplo, é mostrada a estrutura antes do uso de Spring e depois.

Visão Geral

Principais Dependências Externas

JAR Acesso a Dados

Acesso a Dados - Pacote dao IDAOFactory

Acesso a dados – IDAOFactory Abstract Factory (GoF)

Acesso a dados - IDAOFactory

Acesso a dados - JdbcDAOFactory Conexão com o Bando de Dados

Conexão com JDBC - JdbcPostgreConnectionFactory public class JdbcPostgreConnectionFactory { public static final String LOCAL_PADRAO = "jdbc:postgresql://localhost:5432/academicNetDB"; public static final String DRIVER_PADRAO = "org.postgresql.Driver"; private static final String USUARIO = "postgres"; private static final String SENHA = "post"; public Connection Create() { Connection conexao = null; try { Class.forName( DRIVER_PADRAO ); conexao = DriverManager.getConnection( LOCAL_PADRAO, USUARIO, SENHA ); } catch (final Exception e) { e.printStackTrace(); return null; } return conexao; }

public class SingletonDAOFactory { public static IDAOFactory Get () { return Instance (). _daoFactory ; } public Object clone () throws CloneNotSupportedException { throw new CloneNotSupportedException (); } private static SingletonDAOFactory Instance () { if ( null == _instance ) { _instance = new SingletonDAOFactory (); } return _instance ; } private SingletonDAOFactory () { // Substituir por outro DAO Factory caso desejado //_daoFactory = new MemoryDAOFactory(); daoFactory = new JdbcDAOFactory ( ( new JdbcPostgreeConnectionFactory () ). Create () ); } Privat static SingletonDAOFactory _instance ; private IDAOFactory _daoFactory ; } Escolha do acesso a dados - SingletonDAOFactory Instancia a fábrica desejada Cria a conexão com o BD

Parametrizando a conexão JDBC usando Spring Refatorando JdbcPostgreConnection Factory

Conexão JDBC e Spring – Refactoring Replace Type Code with Class em JdbcPostgreConnectionFactory criando ParametrosConexao 1

Conexão JDBC e Spring – Refactoring 2 Replace Type Code with Class em JdbcPostgreConnectionFactory criando ParametrosConexao Após, Rename em JdbcPostgreConnectionFactory para ConnectionFactory

Conexão JDBC e Spring - applicationContext.xml Servirá para instanciar ParametrosConexao com os valores desejados......

Conexão JDBC e Spring – IDAOFactoryCreator FactoryMethod (GoF) public interface IDAOFactoryCreator { IDAOFactory create(ParametrosConexao parametros); } public class JdbcDAOFactoryCreator implements IDAOFactoryCreator { public IDAOFactory create(ParametrosConexao parametros) { ConnectionFactory connectionFactory = new ConnectionFactory( parametros ); JdbcDAOFactory daoFactory = new JdbcDAOFactory( connectionFactory.create() ); return ( daoFactory ); }

Conexão JDBC e Spring – Carregando os parâmetros Alteração em SingletonDAOFactory public class SingletonDAOFactory {... private SingletonDAOFactory() { ApplicationContext appC = new ClassPathXmlApplicationContext( "applicationContext.xml" ); IDAOFactoryCreator daoFactoryCreator = (IDAOFactoryCreator) appC.getBean( "daoFactoryCreator" ); ParametrosConexao parametros = (ParametrosConexao) appC.getBean( "paramConexao" ); _daoFactory = daoFactoryCreator.create( parametros ); }... }

WAR Acesso a Dados

Escolhendo a fábrica de DAOs com Spring XML similar. Carregamento agora pelo Servlet (enquanto usamos Servlet). public class MainServlet extends HttpServlet { private IDAOFactory _daoFactory = null; public MainServlet() { super(); loadFactory(); } private void loadFactory() { ApplicationContext appC = new XmlWebApplicationContext(); IDAOFactoryCreator daoFactoryCreator = (IDAOFactoryCreator) appC.getBean( "daoFactoryCreator" ); ParametrosConexao parametros = (ParametrosConexao) appC.getBean( "paramConexao" ); _daoFactory = daoFactoryCreator.create( parametros ); }... }

Log4J Configuração e Uso

Log4J – Configuração da dependência - pom.xml... log4j compile

Configuração do Log4J por XML - log4j.xml <appender name="myAppender" class="org.apache.log4j.RollingFileAppenderr">

Exemplo de Uso do Log4J no projeto public class JdbcAlunoDAO implements IAlunoDAO {... private static Logger logger = Logger.getLogger( JdbcAlunoDAO.class.getName() );... public void Adicionar(Aluno aluno) throws DAOException { try { String sql = "INSERT INTO ALUNO ( NOME, MATRICULA ) VALUES ( ?, ? )"; PreparedStatement pre = _conexao.prepareStatement( sql ); pre.setString( 1, aluno.getNome() ); pre.setString( 2, aluno.getMatricula() ); pre.executeUpdate(); } catch (Exception e) { logger.error( e.getMessage(), e ); throw new DAOException( e.getMessage() ); }... }

EMMA, Clover, Cobertura, etc. Configuração

org.codehaus.mojo emma-maven-plugin 1.0-alpha-1 true process-classes instrument... EMMA – Configuração do Plugin - pom.xml org.codehaus.mojo emma-maven-plugin 1.0-alpha-1 true...

SureFire – Configuração do Plugin - pom.xml org.apache.maven.plugins maven-surefire-plugin true once xml ${project.build.directory}/generated- classes/emma/classes... org.codehaus.mojo surefire-report-maven-plugin true...

Clover – Configuração do Plugin - pom.xml com.atlassian.maven.plugins maven-clover2-plugin 50% verify instrument check...

Cobertura – Configuração - pom.xml org.codehaus.mojo cobertura-maven-plugin...

jUnit, DbUnit, Selenium Testes e Configuração

Cobertura – Configuração - pom.xml org.codehaus.mojo cobertura-maven-plugin...

@Test public void naoPermiteTurmasIguais() { Turma t1 = new Turma(); t1.setCodigo("1"); t1.setDiaSemana("segunda"); t1.setTurno("manhã"); Turma t2 = new Turma(); t2.setCodigo("2"); t2.setDiaSemana("segunda"); t2.setTurno("manhã"); boolean chamouExcecao = false; try { sala.alocarTurma( t1 ); sala.alocarTurma( t2 ); // Deve falhar ! } catch (Exception e) { chamouExcecao = true; } assertTrue( chamouExcecao ); } JUnit – Exemplo de teste - TesteSala.java

org.dbunit dbunit test DbUnit – Configuração Básica - pom.xml

DbUnit – XML com dados de teste - DAOTestData.xml

DbUnit – Execução do teste pelo XML - JdbcDAOTest.java public void insertIntoCurrentDataSet() throws DatabaseUnitException, SQLException { DatabaseOperation.INSERT.execute( _testDatabaseConnection, _currentDataSet ); } public void compareTables() throws Exception { ITable actualTable = newTableFromConnection(); ITable expectedTable = newTableFromFile(); ITable filteredTable = DefaultColumnFilter.includedColumnsTable( actualTable, expectedTable.getTableMetaData().getColumns() ); Assertion.assertEquals( expectedTable, filteredTable ); public void testInsertionFromFile() throws Exception { insertIntoCurrentDataSet(); compareTables(); }

public class TesteJdbcEmentaDAO extends JdbcDAOTest { private static final String TABELA_EMENTA = "EMENTA"; private static final String ARQUIVO_EMENTA = "DAOTestData.xml"; public TesteJdbcEmentaDAO() throws Exception { super( TABELA_EMENTA, ARQUIVO_EMENTA ); } DbUnit – Criação simplificada dos testes Classes de teste que herdam de JdbcDAOTest só configuram o nome da tabela e o XML. A classe já faz a execução dos testes, como inserção e remoção e comparação dos valores esperados com base no XML. Assim, as classes terão seu BD testado e necessitam, então, só de testar o acesso via DAO.

public void testInsereERecuperaCorretamente() throws Exception { final int ID = ; Ementa ementa = novaEmenta( ID ); Ementa ementaGravada = null; IEmentaDAO dao = daoFactory().CriarEmentaDAO(); dao.Adicionar( ementa ); ementaGravada = dao.CarregarPeloID( ID ); assert( ementaGravada != null ); assert( ementa.equals( ementaGravada ) ); } dbUnit – Exemplo de teste - TesteJdbcEmentaDAO.java Exemplo de teste do DAO

Selenium – Configuração Básica - pom.xml org.openqa.selenium.server selenium-server test org.seleniumhq.selenium.client-drivers selenium-java-client-driver test

private void entrarEmEmenta() { selenium.click( "name=ementa" ); selenium.waitForPageToLoad( _helper.TEMPO_ESPERA ); } public void testInserir() throws Exception { entrarEmEmenta(); selenium.click( "name=ementaInserir" ); selenium.waitForPageToLoad( _helper.TEMPO_ESPERA ); final String CONTEUDO = "TDD"; selenium.type( "conteudo", CONTEUDO ); selenium.type( "numeroAulas", "20" ); selenium.type( "dataEmenta", "05/10/2008" ); selenium.click( "btnConfirma" ); selenium.waitForPageToLoad( _helper.TEMPO_ESPERA ); entrarEmEmenta(); selenium.click( "name=ementaListar" ); selenium.waitForPageToLoad( _helper.TEMPO_ESPERA ); assertTrue( selenium.isTextPresent( CONTEUDO ) ); } Selenium – Exemplo de Teste - TesteEmentaSelenium.java

Pontos a melhorar no projeto DbUnit Atualmente os parâmetros do banco de dados estão sendo carregados com o Spring. O ideal é colocar a configuração no próprio POM, informando o(s) arquivo(s) XML e operações desejadas para execução. Assim, pouparia-se tempo criando testes para novas classes. Porém, no presente trabalho foi criada uma classe JdbcDAOTest que bastando parametrizar o nome da tabela e o arquivo XML ela executa testes sobre o banco de dados, o que elimina o trabalho da reimplementação de testes do mesmo tipo. Por causa do carregamento via Spring, os testes do banco de dados funcionam corretamente quando executados pelo ambiente JUnit. Porém, executando pelo maven test, como a configuração não está no POM, ele não reconhece no processo os parâmetros do Spring, o que faz com que não consiga a conexão com o banco, dando falha no teste. Assim, para verificação atual do BD e dos DAOs, os testes são rodados usando JUnit.

Pontos a melhorar no projeto Exemplo de como poderia ser a configuração do DbUnit org.dbunit dbunit postgresql jdbc4 org.postgresql.Driver jdbc:postgresql://localhost:5432/academicNetDB postgres post pre-integration-test test-compile --> start-server operation --> CLEAN_INSERT DAOTestData.xml

Pontos a melhorar no projeto Selenium Atualmente os parâmetros do site, como url, porta e tempo de carregamento da página estão definidas como constantes na classe SeleniumTestHelper. Poderia-se criar esta configuração usando o próprio Spring, ou no própria configuração do POM. Observação: Com o uso do Jetty como servidor (e não do TomCat, que era o utilizado em trabalhos anteriores) foi notado em alguns momentos que era preciso executar o projeto (maven jetty:run) para iniciar o servidor e, então, iniciar os testes (maven test). Com o Tomcat, era comum se iniciar o servidor pelo próprio Eclipse e então executar os testes. Spring Usou se no projeto o Servlet padrão. Poderia ter sido utilizado o Servlet do Spring, de forma que seria dispensado a criação dos Commands, bastando fazer um mapeamento dados páginas do projeto. A implementação com Commands foi mantida por falta de tempo hábil (assim como ocorreu com os demais pontos).