Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico ARQUITETURA SISGRAD Manual de Utilização Versão: 2.0 Criação: 05 de julho de 2007 Autor: André Penteado Última Revisão: 09 de outubro de 2009 Autor: Alessandro Moraes Controle Acadêmico - Arquitetura SISGRAD 1 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico Sumário 1.ESTRUTURA DE APLICAÇÕES WEB............................................................. 3 WEB.............................................................3 2.ARQUITETURA................................................................................................. 4 2.ARQUITETURA.................................................................................................4 a)Bibliotecas e Ferramentas........................................................................4 b)Outros Recurso.........................................................................................5 c)Principais Fluxos.......................................................................................5 3.BEANS............................................................................................................... 6 3.BEANS...............................................................................................................6 4.AÇÕES.............................................................................................................. 7 4.AÇÕES..............................................................................................................7 a)Configuração do Fluxo..............................................................................7 b)Validações de Dados................................................................................7 c)Tratamento de Erros.................................................................................8 5.SERVIÇOS......................................................................................................... 8 5.SERVIÇOS.........................................................................................................8 a)Instanciação de Objetos de Serviço.........................................................8 b)Auditoria e Validações de Negócio...........................................................9 c)Tratamento de Erros.................................................................................9 6.AUTORIZAÇÃO................................................................................................ 9 6.AUTORIZAÇÃO................................................................................................9 7.CONFIGURAÇÕES DE SISTEMA.................................................................. 10 SISTEMA..................................................................10 8.PADRONIZAÇÃO DE CÓDIGO...................................................................... 11 CÓDIGO......................................................................11 a)Sufixos nos nomes de classes................................................................11 b)Nomes de métodos de busca.................................................................11 c)Nomes de métodos de alteração no banco de dados............................11 9.IMPLANTAÇÃO............................................................................................... 11 9.IMPLANTAÇÃO...............................................................................................11 Controle Acadêmico - Arquitetura SISGRAD 2 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico ESTRUTURA DE APLICAÇÕES WEB Embora existam diversos servidores web para rodar aplicações Java, suas estruturas são semelhantes. A estrutura de diretórios apresentada a seguir refere-se ao Apache Tomcat versão 6, disponível em http://tomcat.apache.org: - apache-tomcat-6.0.18 - bin - conf - lib - logs - temp + webapps + work Os nomes dos diretórios são auto-explicativos, cabendo apenas lembrar que as bibliotecas Java adicionadas ao diretório lib poderão ser acessadas por todas as aplicações instaladas neste servidor. No diretório webapps estarão as aplicações Java, cuja estrutura nos convém detalhar um pouco mais: Diretório O que é /minhaAplicacao Diretório principal da aplicação Web. Todos os arquivos JSP* e XHTML estão aqui. /minhaAplicacao/WEB-INF Diretório que contém todos recursos relacionados a aplicação, organizados em pastas e arquivos que serão detalhadas a seguir. Este diretório não é público, ou seja, todo arquivo e diretório contido nele não pode ser acessado diretamente pelo cliente. /minhaAplicacao/WEB-INF/web.xml Arquivo XML com diversas definições a respeito da aplicação, tais como Servlets e Filters. /minhaAplicacao/WEB-INF/classes Diretório onde estão localizados as classes Java, organizadas em subdiretórios conforme seus pacotes. /minhaAplicacao/WEBINF/classes/br/unesp/actions Exemplo de um diretório que contém as classes do pacote br.unesp.actions. /minhaAplicacao/WEB-INF/lib Diretório onde devem ser adicionados os arquivos de bibliotecas e taglibs a serem utilizados pela aplicação. Ex.: JDBCs, bibliotecas de frameworks diversos. /minhaAplicacao/META-INF/context.xml Esse arquivo, que também está em um diretório não público, define algumas propriedades da aplicação/contexto, sendo que na arquitetura CORE, utilizamos para ligar a aplicação ao banco de dados que iremos utilizar. *Na arquitetura CORE apenas os arquivos referentes a leiaute (CSS, Javascript, imagens, etc) ficam no diretório principal da aplicação. As páginas JSP ficam dentro de WEB-INF/jsp, que é um diretório não-público, possibilitando seu acesso apenas através de Actions, forçando assim que se siga corretamente o modelo MVC. Controle Acadêmico - Arquitetura SISGRAD 3 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico 2. ARQUITETURA VISUALIZAÇÃO AÇÕES SERVIÇOS Exibe e captura dados do Validação e organização usuário. Páginas JSP. Regras de Negócio. Única dos dados para chamada camada que tem acesso dos serviços ao banco de dados BEANS Arquitetura baseada na divisão de responsabilidades em camadas, facilitando assim, a especialização do trabalho da equipe. Representa o banco de dados no modelo orientado a objetos. É o único objeto que transita entre as camadas a) Bibliotecas e Ferramentas → Acesso ao Banco de Dados: JPA; Hibernate; Core; → Controlador de Ações Mentawai; → Disponibilização dos Serviços Core; → Autenticação e Autorização: Mentawai; Core; → Single Sign-On (Autenticação única e centralizada): Core; → Auditoria: Log4J; Core; → Gerenciador de Configurações: Apache commons-configurator; Controle Acadêmico - Arquitetura SISGRAD 4 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico Core; → Gerenciador de Leiautes: Sitemesh; → Relatórios: JasperReports; iReport; → Paginação WEB: DisplayTable; → Controle de Versões: CVS; → IDE: Eclipse; → Scripts: Apache-Ant; Bash; b) Outros Recurso → Envio e armazenamento de mensagens eletrônicas; → Captcha (Evita que programas robôs preencham formulários); → Protocolo de Leitura de Email; c) Principais Fluxos Diagrama 1: Fluxo padrão para realizar pesquisas no banco de dados Controle Acadêmico - Arquitetura SISGRAD 5 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico Diagrama 2: Fluxo padrão para gravar informações no banco de dados 3. BEANS Classes no formato de JAVABEANS, ou seja, objetos sem lógica de negócio, que apenas armazenam dados, são utilizados para representar as tabelas do banco de dados. As classes, obrigatoriamente, precisam estar no pacote br.unesp.beans, onde cada classe é uma tabela, cada atributo um campo e cada objeto uma linha no banco de dados. Exemplo de uso: @Entity @Table(name = "curso") public class Curso implements Serializable { private static final long serialVersionUID = -6730719503656934127L; @Id @SequenceGenerator(name = "SEQ", sequenceName = "seq_curso", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ") @Column(name = "id", nullable = false) private Integer id; @Column(name = "nome", nullable = false) private String nome; @Column(name = "sigla", nullable = false) private String sigla; @JoinColumn(name = "id_departamento", referencedColumnName = "id") @ManyToOne private Departamento departamento; (…) gets e sets omitidos (…) } Controle Acadêmico - Arquitetura SISGRAD 6 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico 4. AÇÕES Ações são responsáveis por receber os dados vindos do cliente (ex: página jsp), organizar esses dados, executar o método de negócio apropriado (objetos de serviço) e devolver a resposta para o cliente. a) Configuração do Fluxo Basicamente as ações executadas são configuradas através do mapeamento da URL de submissão de um formulário html enviado. Toda URL de submissão com o sufixo “.action” é considerada uma ação. Exemplo: <form method="post" action="/curso.gravar.action"> <%-- Formulário --%> </form> O mapeamento do fluxo, ou seja, de onde veio a requisição e para onde vai a resposta, é realizado na própria classe da ação, através de anotações: @ActionClass(prefix = "/curso") public class CursoAction extends BaseAction { @Consequences(outputs = { @ConsequenceOutput(result = SUCCESS, page = "/mensagem_ok.jsp"), @ConsequenceOutput(result = ERROR, page = "/mensagem_erro.jsp") }) public String gravar() { (…) Código da ação (…) if (erro) return ERROR; return SUCCESS; } } Dessa forma, ao enviar o formulário, o sistema irá executar o método gravar() da classe e redirecionará após o término da execução com sucesso para a página CursoAction mensagem_ok.jsp. ou no caso de execução com falha, para a página mensagem_erro.jsp. No caso das duas condições (sucesso e erro) direcionarem para a mesma página podemos declarar apenas uma consequência, como abaixo: @Consequences(outputs = @ConsequenceOutput(page = "/listagem.jsp")) Os requisitos a serem atendidos pelas classes de ações são: ● O sufixo do nome da classe deve ser, preferivelmente, Action; ● Estar, preferivelmente, no pacote br.unesp.<nome_da_aplicação>.actions; ● A classe ActionsManager deve herdar br.unesp.web.AbstractActionsManager. Controle Acadêmico - Arquitetura SISGRAD 7 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico b) Validações de Dados A validação nas ações serão a nível de campo, como, por exemplo, testando se o campo foi preeenchido, seu formato e tamanho, etc. E, em caso de não validado, uma mensagem de erro será exibida ao usuário. Como nos serviços, a validação de dados serão feitas utilizando métodos da classe br.unesp.core.Log4jWrapper, conforme exemplo abaixo: public String gravar() { try { Log4jWrapper log = new Log4jWrapper(CursoAction.class, null); Curso curso = (Curso)session.getAttribute("curso"); curso.setNome(input.getStringValue("txt_nome")); curso.setSigla(input.getStringValue("txt_sigla")); curso.setDataInicio(input.getDate("txt_data_inicio", "dd/MM/yyyy")); if (curso.getNome() == null) throw new ServiceValidationException("Nome é um campo obrigatório"); academicoService.gravarCurso(curso); } catch (ServiceValidationException unespex) { addError(unespex.getMessage()); return ERROR; } catch (Exception ex) { addError(ConfigHelper.get().getString("error.general")); log.error(ConfigHelper.get().getString("error.general"), ex); return ERROR; } return SUCCESS; } c) Tratamento de Erros As ações irão capturar, caso br.unesp.exception.ServiceValidationException necessário, as exceções do tipo e exibir a mensagem nela contida para o usuário. Deverão, obrigatoriamente, capturar exceções do tipo java.lang.Exception e exibir uma mensagem de erro genérica para o usuário. Quando capturado uma exceção do tipo java.lang.Exception pela classe de ação, ela deve, obrigatoriamente, registrar no log a exceção em nível de error. Como visto acima, no exemplo nas validações. Controle Acadêmico - Arquitetura SISGRAD 8 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico 5. SERVIÇOS Serviços são objetos que encapsulam toda a regra de negócio do sistema. São os únicos objetos que tem acesso às informações do banco de dados. a) Instanciação de Objetos de Serviço Para que a classe sejam reconhecida como sendo de serviço, ela precisa obedecer a alguns requisitos como: ● Deve herdar da classe abstrata br.unesp.core.AbstractBasicService; ● Deve estar no pacote br.unesp.services; ● Ter o construtor sem modificador de visibilidade (public, protected ou private); ● Pode ou não receber como parâmetro no construtor um array da classe Object[] para ser usado nos métodos de negócio; ● O sufixo do nome da classe deve ser, preferivelmente, DocumentoService, ● Service (ex: MatriculaService, etc); Não devem manter estado, ou seja, não devem ter atributos de visibilidade public, que possam ser usados em outra classe a não ser ela mesma; Como o construtor dessa classe não é público, objetos de serviço não podem ser instanciados com o comando new. Ele deve ser instanciado através de uma fábrica, conforme sintaxe abaixo: MatriculaService objetoService = (MatriculaService)ServicesFactory. getInstance(MatriculaService.class, new Object[] { userLogin }); No exemplo acima, objetoService seria o objeto de serviço instanciado. b) Auditoria e Validações de Negócio Sendo a única camada com acesso ao banco de dados, os serviços são onde é possível alterar suas informações. Portanto, todo método de serviço que alterar dados no banco de dados deve registrar a operação. A validação nas classes de serviço serão referentes a regras que exijam algum processamento (Ex: checagem de pré-requisitos de matrícula). A mensagem registrada será exibida para o usuário. Tanto a auditoria quanto a validação de dados serão feitas utilizando métodos da classe br.unesp.core.Log4jWrapper, conforme exemplo abaixo: public void gravarDisciplina(Disciplina disciplina) throws ServiceValidationException { Log4jWrapper log = new Log4jWrapper(ClasseService.class, null); if (disciplina.getNome() == null || "".equals(disciplina.getNome())) { log.warn("Nome é um campo obrigatório"); 5 throw new ServiceValidationException("Nome é um campo obrigatório"); 6 } saveAndCommit(disciplina); 10 log.info("Gravado disciplina ID: " + disciplina.getNome()); } Controle Acadêmico - Arquitetura SISGRAD 9 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico Onde o objeto log é utilizado para registrar tanto a validação, nas linha 5 e 6 quanto a auditoria na linha 10. c) Tratamento de Erros As classes de serviço não irão tratar nenhum tipo de exceção de sistema, como por exemplo, o banco de dados fora do ar. Os serviços sempre irão repassar para o nível acima (classes de ações). No caso dos serviços terem que comunicar algum tipo de erro para o nível superior, ela deve disparar a exceção do tipo br.unesp.exception.ServiceValidationException passando o texto da mensagem de erro formatada como argumento da exceção, em nível de warning. Como visto acima, no exemplo nas validações. 6. AUTORIZAÇÃO A classe a ser mantida na sessão do usuário para autorização nas classes de ações é a classe br.unesp.beans.UserLoginWrapper. Caso o sistema seja web br.unesp.web.SSOAuthorizationFilter br.unesp.beans.UserLoginWrapper e use como autenticação o filtro da classe de Single-Sign-On, automaticamente o objeto do tipo será incluído na sessão do usuário. Para autorizar o usuário em uma classe de ação, ela deve implementar a interface org.mentawai.authorization.Authorizable e seu método public boolean authorize(String innerAction, Object user, List groups). Exemplo: public class CadastroCursoAction extends BaseAction implements Authorizable, Validatable { @SuppressWarnings("unchecked") public boolean authorize(String innerAction, Object user, List groups) { if (user == null || groups == null) return false; instanciarServicos((UserLoginWrapper)user); if (groups.indexOf(KGlobal.CATEGORIA_ADMINISTRADOR) != -1) return true; return false; } } Controle Acadêmico - Arquitetura SISGRAD 10 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico 7. CONFIGURAÇÕES DE SISTEMA As configurações de sistema podem estar no formato de arquivos de propriedades (.properties) ou em arquivos xml. Obrigatoriamente, devem estar dentro do diretório config do diretório raiz das classes do sistema (em aplicações web, o diretório é /WEB-INF/classes/config). Dentro do diretório config podemos ter outros subdiretórios com o nome da maquina e nome de domínio para conter arquivos de configuração. Nome de domínio é um subconjunto qualquer, passado como parâmetro pela aplicação. Os arquivos de configurações seguirão uma ordem de prioridades conforme seus diretórios, onde prevalecerá sobre os demais da seguinte forma: 1) /config/<nome_da_máquina>/<nome_do_domínio>/* 2) /config/<nome_do_domínio>/* 3) /config/<nome_da_máquina>/* 4) /config/* Para exemplificar, digamos que temos uma entrada em um arquivo de propriedades chamado email.properties com a seguinte linha: # Arquivo email.properties host.smtp = localhost Para acesso ao valor da chave, utilizamos no código fonte java: // Código JAVA ConfigHelper.get().getString("host.smtp"); Podemos passar parâmetros para substituição nas configurações, podendo assim gerar, por exemplo, mensagens em tempo de execução. Exemplo: # Arquivo error.properties error.required = O campo {0} é obrigatório para o cadastro {1}. Para passar os parâmetros de substituição: // Código JAVA String[] valoresASubstituir = { "nome", "aluno de graduação" }; addError(ConfigHelper.getProperty("error.required", valoresASubstituir)); O valor retornado acima seria: "O campo nome é requerido para o cadastro de aluno de graduação". Controle Acadêmico - Arquitetura SISGRAD 11 Grupo Técnico de Estudos, Desenvolvimento e Gerenciamento do Projeto de Controle Acadêmico 8. PADRONIZAÇÃO DE CÓDIGO a) Sufixos nos nomes de classes ● Para classes de serviço: Sufixo "Service". Ex: CommonService ● Para classes de ações: Sufixo "Action". Ex: PublicAction ● Para classes de exceções: Sufixo "Exception": Ex: ServiceException b) Nomes de métodos de busca ● Métodos que buscam um objeto específico: Iniciar com "buscar". Ex: buscarEntidadePorId(int ● id) Métodos que filtram e trazem uma lista de objetos: Iniciar com "filtrar". Ex: filtrarEntidadePorNome(String ● nome) Métodos que listam todos objetos sem restrição: Iniciar com "listar". Ex: listarPaises() c) Nomes de métodos de alteração no banco de dados ● Métodos que incluem e alteram dados: Iniciar com "gravar". Ex: gravarFuncionario(Funcionario ● funcionario) Métodos excluem dados. Iniciar com “excluir”. Ex: excluirFuncionario(int id). 9. IMPLANTAÇÃO A implantação de um sistema será feito através do script bash cvs_download.sh na linha de comando de um sistema Linux, pré-configurado com o servidor de aplicações. Ele utiliza o repositório CVS para buscar o código do sistema. Para a compilação e checagem das configurações é utilizado o script bash build_java.sh junto com a biblioteca java apache-ant. Controle Acadêmico - Arquitetura SISGRAD 12