Arlindo Rodrigues / Raphael Medeiros Arquitetura
Arquitetura dos
Sistemas Institucionais
Agenda
● Introdução
● Divisão em Camadas
○ Camada de Acesso a Dados ○ Camada de Domínio/Negócio ○ Camada de Aplicação
○ Camada de Apresentação
● Integração entre Sistemas
● Segurança e Auditoria
Cronograma
● Visão Geral da Arquitetura
● Camada de persistência
● Camada de Domínio/Negócio e Aplicação
● Integração Entre Sistemas
Introdução
● Metas ○ Interoperabilidade ○ Segurança ○ Escalabilidade ○ Alta Disponibilidade ○ Abstrair complexidadeTecnologias Utilizadas
● Java 6 ● Hibernate 3.2.5 ● JavaServer Faces 1.2 ● RichFaces 3.3.3 ● Struts 1.2 ● EJB 2.1 ● Spring 3.2.1 ● JBoss 5.1.0Métricas de código*
Métricas de Banco de Dados *
Definição
● Acesso a dados: realiza a persistência e
recuperação de dados.
● DAOs, Hibernate, JDBC, JDBCTemplate,
Banco de Dados
● ADMINISTRATIVO: base de dados para armazenar dados
relacionados aos sistemas administrativos e de recursos humanos.
● ACADÊMICO: base de dados para armazenar dados
relacionados ao sistema acadêmico.
● SISTEMAS COMUM: base de dados com informações
comuns a todos os sistemas, como por exemplo, a base de dados para autenticação de usuários, cadastro de
permissões, entre outras.
● BASE ARQUIVOS: base de dados para armazenamento de
arquivos.
● SISTEMAS LOG: base de dados para armazenamento de
Banco de Dados
● PostgreSQL, versão 9.5
○ Utiliza Pool de Conexões
○ Gerenciado pelo servidor de aplicações ■ Utiliza o protocolo X/Open XA
● Permite que os vários banco de dados sejam acessados dentro de uma mesma transação
● Transações distribuídas ● Two-Phase Commit ● Prepared Transaction
● Utiliza o framework Hibernate para realização
de mapeamento objeto relacional.
● Padrão de Projetos DAO (Data Access Object)
Banco de Dados
Configuração de DataSources
Banco de Dados
● Datasources ○ jdbc/ComumDB ○ jdbc/SIPACDB ○ jdbc/SIGRHDB ○ jdbc/SIGAADB ○ jdbc/SIGEDDB ○ jdbc/SIGPPDB ○ jdbc/SIGAdmin ○ jdbc/ArquivosDB ○ Jdbc/LogOperacaoDBHibernate
● Framework para mapeamento objeto-relacional;
● Facilita a utilização de bancos de dados relacionais em sistemas orientados a objetos;
● Mapeia tabelas de bancos de dados em classes, linhas de uma tabela em objetos e colunas em atributos;
● Versão 3.2.5;
● Mapeamentos em:
○ Arquivos XML (Arquitetura e SIPAC)
Configuração do Hibernate
● Arquivo .cfg.xml
○ Comum: comum.cfg.xml ○ SIPAC: sipac.cfg.xml
Geração de Chave Primária
● SequenceStyleGenerator
○ Solução híbrida para geração de chave primária. Quando o banco suportar sequence, utiliza sequence, quando
não suportar, usa uma tabela com o mesmo nome da sequence para simular seu comportamento;
○ Poucas mudanças em relação à estratégia original; ○ Sem problemas com travamentos. Cada sequence é
simulada por uma tabela diferente; ○ Foi considerada a solução ideal;
Geração de Chave Primária
● Nova Configuração: @Id @GeneratedValue(generator="seqGenerator") @GenericGenerator(name="seqGenerator", strategy="br.ufrn.arq.dao.SequenceStyleGenerator", parameters={ @Parameter(name="sequence_name", value="schema.seq_name") })DAO’s
● Desvincula dos usuários da arquitetura a
dependência do framework e/ou do banco de dados;
● Objetos para abstrair e encapsular todo o
DAO’s
Realizando consultas com Hibernate
● GenericDAO disponibiliza método getSession()
para consultas com Hibernate;
● O SessionFactory utilizado dependerá do
sistema que foi setado no DAO;
JdbcTemplate
int count = 0; try {
PreparedStatement st = getConnection().
prepareStatement(“select count(*) from cliente”); ResultSet rs = st.executeQuery();
if (rs.next()) count = rs.getInt(1); } catch(SQLException e) {
log.error(e); } finally {
try { if (stmt != null) stmt.close(); } catch(SQLException e) { log.warn(e); } try { if (conn != null) conn.close(); } catch(SQLException e) { log.warn(e); } }
JdbcTemplate
int count = getJdbcTemplate().
JdbcTemplate
●
queryForInt
●
queryForLong
●
query
●
queryForObject
●
queryForList
●
queryForMap
●
update
●
RowMapper
●
ResultSetExtractor
Camada de Negócio
● Negócio: lógica que o sistema precisa realizar
com o domínio que se está trabalhando.
● Envolve cálculos baseados em entradas e
Processadores
● Implementam lógica de negócio e gerenciam a
Camada de Aplicação
● Realiza a transição da camada de apresentação
para a camada de negócio
● Adiciona serviços (transações) aos sistemas
○ Movimentos
■ Transferem objetos da apresentação para um processador
○ Comandos
■ Indicam que processador deve ser utilizado para realizar a lógica de negócio
Comandos
● Para chamar um processador a partir da
camada de apresentação:
○ Criar um movimento contendo os objetos que se deseja enviar para a camada de negócio
○ Passar para o objeto movimento o objeto comando que informa qual processador deve ser executado
○ Chamar o método execute na action (Struts) ou managed bean (JSF) passando o movimento e o comando como parâmetros
Camada de Apresentação
● Camada de Apresentação: responsável por
controlar a interação entre o usuário e o software ou entre dois softwares;
● Páginas HTML, interfaces baseadas em janelas,
webservices, etc.Exibem informação a um usuário (ou outro software) e interpretam ações do usuário (ou outro software);
Camada de Apresentação
● MVC
● “Divide a interação do usuário com a interface em
três diferentes papéis”;
● Iniciou como um framework para a plataforma
Smalltalk na década de 70;
● Exerce bastante influência nos frameworks de UI e
Camada de Apresentação
● Três papéis:
● Model: objetos que representam alguma informação sobre o domínio;
● View: representa a visualização do estado atual do model na interface;
● Controller: recebe entrada do usuário,
manipula o model e provoca uma atualização da view.
Camada de Apresentação
● MVC ≠ Camadas
● MVC define interação entre componentes
● Camadas definem separação entre
componentes
Camada de Apresentação
● Frameworks de Apresentação
● SIPAC: Struts e JSF ● SIGAA: Struts e JSF
● SIGRH, SIGAdmin, SIGED: JSF ● Controllers:
○ JSF: Managed Beans
Struts
● Framework MVC;
● Utilizado no início dos projetos;
● Substituído pelo JavaServer Faces;
● Existem muitos casos de uso, principalmente
Struts
● AbstractAction ○ Métodos auxiliares ○ getUsuarioLogado ○ checkRole ○ getDAO ○ Etc.Struts
public class CadNotaFiscalAction extends AbstractAction { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req,
HttpServletResponse res) { // ...
} }
JSF
● Substituto do Struts para a camada de
apresentação
● Especificação JCP (Java Community Process)
● JavaServer Faces 1.2
JSF
● Não necessita estender classes ou implementar
interfaces
● Classes apenas auxiliares
○ AbstractController
○ AbstractControllerCadastro ○ <Sistema>AbstractController
JSF
● Integração com Spring
● @Component define que uma classe será um
managed bean
JSF
● RichFaces: biblioteca de componentes para dar
suporte a AJAX
● Tags a4j
● Tags rich
● Demonstração online:
ViewFilter
● Filtro de Servlet com diversas funções
○ Segurança
○ Fechamento da sessão do Hibernate ○ Tratamento de Exceções
ViewFilter
● Segurança:
○ Verifica se existe usuário logado e se a página que se está tentando acessar é pública
○ Se não existir usuário logado e a página não for pública, redireciona para a tela de login
○ Páginas públicas são configuradas como parâmetro de inicialização do ViewFilter
■ Parâmetro paginasPermitidas
ViewFilter
● Fechamento da sessão do Hibernate
● Sessão aberta só é fechada ao final do request
● OpenSessionInView
ViewFilter
● Tratamento de Exceções:
○ Classe ExceptionHandler ○ Chain of Responsibility
○ JsfExceptions, HibernateExceptions, etc.