Baixe o app para aproveitar ainda mais
Prévia do material em texto
Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 1/29 Projeto de Arquitetura de Software Versão do Documento: 1.15 Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 2/29 Histórico de Revisão Data Versão do Documento Descrição Autor 1.1 Descrição da atividade realizada no documento. Rodolfo Lace 06/01/2006 1.2 Descrição da atividade realizada no documento. Flávio Junior 15/02/2006 1.3 Descrição da atividade realizada no documento. Flávio Junior 05/03/2006 1.4 Descrição da atividade realizada no documento. Flávio Junior 17/04/2006 1.5 Descrição da atividade realizada no documento. Flávio Junior 19/06/2006 1.6 Descrição da atividade realizada no documento. Flávio Junior / Miguel Garz 29/07/2006 1.7 Atualização de elementos arquiteturais: DisplayTag Miguel Garz / Flávio Junior 29/08/2006 1.8 Atualização de elementos de boas práticas: Concatenação de query Miguel Garz/ Flávio Junior 29/09/2006 1.9 Atualização das versões dos frameworks utilizados Miguel Garz / Flávio Junior 29/10/2006 1.10 Inserção do requerimento de log de navegação Miguel Garz / Daniel Bernd 16/11/2006 1.11 Inserção de requisitos de qualidade para sistemas em produção. Miguel Garz / Daniel Bernd 13/12/2006 1.12 Inserção de boas práticas e requisitos de usabilidade referentes a problemas de dupla submissão de formulários. Inserção do Ancine Batch Processing Framework Atualização dos requisitos para recebimento de sistema. Miguel Garz/ Daniel Bernd Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 3/29 06/08/2007 1.13 Atualização dos requisitos da fábrica de software Miguel Garz / Douglas Matheus 14/09/2007 1.14 Atualização de algumas regras após avaliação do SALIC e Fiscalização 1.3 - Forma de listagem - Nomes de métodos na camada DAO. Miguel Garz / Douglas Matheus 23/10/2008 1.15 Atualização das versões das tecnologias utilizadas Carlos Alferes Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 4/29 Sumário 1. Introdução............................................................................................................................................6 2. Representação da Arquitetura...........................................................................................................6 3. Visão de Lógica...................................................................................................................................6 4. Visão de Implantação .........................................................................................................................7 5. Visão de Implementação ....................................................................................................................7 5.1 Introdução..............................................................................................................8 5.2 Modelagem do diagrama de seqüência .................................................................9 5.3 Metodologia de Desenvolvimento..........................................................................9 5.3.1 Data Access Object (DAO) e Hibernate...........................................................................9 5.3.1.1 Contexto......................................................................................................................9 5.3.1.2 Problema...................................................................................................................10 5.3.1.3 Solução .....................................................................................................................10 5.3.1.4 Benefícios .................................................................................................................11 5.3.1.5 Implantação ..............................................................................................................12 5.3.2 Struts ................................................................................................................................12 5.3.2.1 Contexto....................................................................................................................12 5.3.2.2 Problema...................................................................................................................12 5.3.2.3 Solução .....................................................................................................................13 5.3.2.4 Benefícios .................................................................................................................13 5.3.3 Log de atividades do usuário a nível de aplicação...................................................13 5.3.3.1 Contexto ...................................................................................................................13 5.3.3.2 Problema...................................................................................................................13 5.3.3.3 Solução .....................................................................................................................14 5.3.3.4 Benefícios .................................................................................................................14 5.3.4 Tratamento de Exceções e Log de aplicação...........................................................14 5.3.4.1 Contexto....................................................................................................................14 5.3.4.2 Problema...................................................................................................................14 5.3.4.3 Solução .....................................................................................................................15 5.3.4.4 Benefícios .................................................................................................................15 5.3.5 Segurança ........................................................................................................................16 5.3.5.1 Contexto....................................................................................................................16 5.3.5.2 Problema...................................................................................................................16 5.3.5.3 Solução .....................................................................................................................16 5.3.5.4 Benefícios .................................................................................................................16 5.3.6 Convenção de Código Java............................................................................................165.3.6.1 Contexto....................................................................................................................16 5.3.6.2 Problema...................................................................................................................17 5.3.6.3 Solução .....................................................................................................................17 5.3.6.4 Benefícios .................................................................................................................17 5.3.7 Identificação de páginas dinâmicas. .............................................................................17 5.3.7.1 Contexto....................................................................................................................17 5.3.7.2 Problema...................................................................................................................18 5.3.7.3 Solução .....................................................................................................................18 5.3.7.4 Benefícios .................................................................................................................18 5.3.8 Convenção de Empacotamento de Classes.............................................................19 Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 5/29 5.3.9 Paginação.........................................................................................................................20 5.3.9.1 Contexto....................................................................................................................20 5.3.9.2 Problema...................................................................................................................20 5.3.9.3 Solução .....................................................................................................................20 5.3.9.4 Benefícios .................................................................................................................20 5.3.10 Padronização de Nomes .................................................................................................21 5.3.10.1 Nome de Classes, JSP e Actions .............................................................................21 5.3.10.2 Estrutura de Diretórios ..............................................................................................21 5.3.10.3 Datasources..............................................................................................................21 5.3.10.4 Manipulação de Dados .............................................................................................21 5.3.11 Framework Ancine de Processamento Batch...........................................................22 5.3.11.1 Contexto....................................................................................................................22 5.3.11.2 Problema...................................................................................................................22 5.3.11.3 Solução .....................................................................................................................22 5.3.11.4 Benefícios .................................................................................................................22 5.3.12 Recepção de novos desenvolvimentos ....................................................................22 5.3.13 Requisitos de software para release de produção. ..................................................23 5.4 Requisitos não funcionais para recebimento de software da fábrica. ......................24 5.4.1 Pré-requisitos Gerais. ...............................................................................................24 5.5 Diagrama de Divisão de Camadas.......................................................................27 5.6 Diagrama de Seqüência de Implementação ........................................................28 6. Visão de Distribuição .......................................................................................................................29 7. Requisitos e Restrições da Arquitetura .........................................................................................29 8. Referências........................................................................................................................................29 9. Assinaturas........................................................................................................................................29 Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 6/29 Projeto de Arquitetura 1. Introdução Este documento apresenta a arquitetura proposta para todos os sistemas ANCINE. A arquitetura é apresentada através de um conjunto de visões que juntas visam cobrir os principais aspectos técnicos relativos ao desenvolvimento e implantação dos sistemas. O objetivo é capturar e formalizar as principais decisões tomadas com relação à arquitetura dos sistemas. 2. Representação da Arquitetura A arquitetura dos sistemas é representada através das seguintes visões arquiteturais: • Visão de Lógica; • Visão de Implantação; • Visão de Implementação; • Visão de Distribuição [utilizar esta visão somente se ela for aplicável ao projeto]. 3. Visão de Lógica Não se aplica neste documento. Toda visão lógica a ser implementada será anexada: definição do sistema, caso de uso, diagrama de classe e de seqüência. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 7/29 4. Visão de Implantação 5. Visão de Implementação Esta visão provê como os componentes serão distribuídos em suas camadas. Está dividido em dois diagramas, um de divisão de camadas, e outro de seqüência de implementação. Foram adotadas essas camadas, para facilitar na implementação, delegar as atividades de uma forma correta, atendendo os padrões da arquitetura, tornando assim um sistema de fácil manutenção. Para cada objeto de negócio, será implementado um componente por camada. Todos os sistemas da ANCINE são baseados na tecnologia Java, sendo utilizada atualmente a versão 1.5. A versão do servidor de aplicação JBoss utilizada é a 4.0.3SP1 e a versão do banco de dados Oracle Enterprise utilizada é 9.2.0.7.0. -Beans -Struts & extensões -Hibernate -Helpers << Jdbc >> -Javascript -AJAX App Server (Jboss) Oracle Enterprise Secretaria de Gestão Interna Gerência de Tecnologiada Informação Projeto de Arquitetura de Software Página 8/29 5.1 Introdução Visando atender uma necessidade de fácil criação, manutenção e a separação das camadas do aplicativo. Adotamos o padrão de projeto Model - View - Controller (MVC), para a plataforma Java. Estrutura do MVC: Esta separação permite que múltiplos visualizadores compartilhem o mesmo modelo de dados, com isso o suporte a diferentes tipos de usuários é mais fácil de implementar, testar e manter. • Camada de Negócio ( Model ) – representa os dados corporativos e as regras de negócio que governam o acesso e a atualização desses dados. Utilizaremos nessa camada os padrões: Data Access Object (DAO) que na nossa arquitetura utilizamos a ferramenta Hibernate na vesão 3.1.3 Para acesso a dados, Transfer Object (TO), Busisness Object (BO), Actions e DispacthActions. • Camada de Apresentação ( View ) – exibe o conteúdo de um modelo ao usuário. Nesta camada são utilizados Java Server Pages (JSP’s) , TagLib(TagStruts) para a geração do código HTML. • Camada de Controle ( Controller ) – transfere as interações entre a camada de apresentação e o que deve ser executado pela camada de modelo. Nesta camada usamos o framework Struts / XML. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 9/29 5.2 Modelagem do diagrama de seqüência A principal função do diagrama de seqüência é comunicar a ordem dos eventos que devem ocorrer e quais componentes devem processar tais eventos de forma a que o objetivo do caso de uso seja concretizado. Existem diversas discussões sobre a abrangência da quantidade e forma de informações que devem estar contidas no diagrama de seqüência. Estudiosos como Martin Fowler define três níveis diferentes de utilização de um diagrama UML: Utilização como rascunho, Utilização como planta-baixa e utilização como linguagem de programação. (Ver mais em: http://www.martinfowler.com/bliki/UmlMode.html e http://www- 128.ibm.com/developerworks/rational/library/3101.html). Nós da ANCINE decidimos por adotar a abordagem do diagrama de seqüência de implementação como uma planta-baixa do caso de uso. Isto significa que o diagrama de seqüência deve refletir a implementação de chamadas às classes do sistema de modo que o programador, ao receber o diagrama de seqüência deva somente se preocupar em preencher a lógica dos métodos e não a criação dos métodos. 5.3 Metodologia de Desenvolvimento 5.3.1 Data Access Object (DAO) e Hibernate 5.3.1.1 Contexto O acesso a dados varia dependendo da origem dos dados. Do acesso ao armazenamento persistente, como a um banco de dados, varia muito dependendo do tipo de armazenamento (banco de dados relacionais, bancos de dados orientados a objetos, arquivos planos e assim por diante) e da implementação do fornecedor. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 10/29 5.3.1.2 Problema Muitas aplicações J2EE do mundo real precisam utilizar dados persistentes em algum momento. Para muitas aplicações, o armazenamento persistente é implementado com mecanismos diferentes e há diferenças marcantes nas APIs utilizadas para acessá-las. Outras aplicações talvez precisem acessar dados que residem em sistemas separados. Por exemplo, os dados podem residir em um sistema mainframe, em repositórios de Lightweight Directory Access Protocol (LDAP). Há uma variação maior com tipos diferentes de armazenamentos persistentes. Mecanismos de acesso, suportados por APIs e recursos variam entre diferentes tipos de armazenamento persistentes como o RDBMS, bancos de dados orientados a objetos, arquivos, planos e assim por diante. As aplicações que precisam acessar dados de um sistema legado ou diferente (como um mainframe ou um serviço B2B) são freqüentemente obrigadas a utilizar APIs que podem ser exclusivas. Dessa maneira, origens de dados diferentes oferecem desafios à aplicação e podem potencialmente criar uma dependência direta entre o código da aplicação e código de acesso a banco de dados. Quando componentes de negócios – beans de entidade, beans de sessão e ainda componentes de apresentação como servlets e objetos auxiliares Java Server Pages (JSPs) precisam acessar uma origem de dados, podem utilizar a API adequada para obter conectividade e manipular a origem de dados. Mas incluir a conectividade e o código de acesso de dados dentro desses componentes introduz um acoplamento estrito entre os componentes e a implementação da origem de dados. Assim as dependências de códigos em componentes tornam a migração da aplicação de um tipo de origem de dados para outro difícil e cansativa. Quando a origem de dados muda, os componentes precisam ser alterados para tratar o novo tipo de origem de dados. 5.3.1.3 Solução O uso do Hibernate um framework Open-Source que oferece uma gama de facilidades e agilidade no desenvolvimento da camada de persistência. Oferecendo-nos a praticidade de apenas mapear os atributos das Classes com os campos da tabela no Banco de Dados, sem precisar implementar qualquer linda de código, além de oferecer uma linguagem para consulta chamada HSQL para realizar filtros e busca de dados. O Hibernate é um dos Frameworks mais utilizados para realizar a operação de persistência, sua implementação permite o uso de qualquer banco de dados. A utilização de drivers JDBC para fazer a comunicação com o RDBMS sem qualquer alteração na aplicação. Por isso optamos por utilizar esse framework como padrões para os projetos ANCINE. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 11/29 5.3.1.4 Benefícios • Permite a transparência: Os objetos de negócios podem utilizar a origem de dados sem conhecer os detalhes específicos da implementação da origem de dados. O acesso é transparente porque os detalhes da implementação estão ocultos dentro do DAO. • Permite a migração mais Fácil: Uma camada de DAOs torna mais fácil para uma aplicação migrar para uma implementação de banco de dados diferente. Os objetos de negócios não têm nenhum conhecimento da implementação de dados subjacente. Assim, a migração envolve alterações apenas para a camada de DAO, além disso, e empregar uma estratégia é possível fornecer uma implementação de factory concreta para cada implementação de armazenamento subjacente. Nesse caso, a migração para uma implementação de armazenamento diferente significa fornecer uma nova implementação de factory para a aplicação. • Reduz a complexidade dos códigos nos objetos de negócios: Como os DAOs gerenciam todas as complexidades de acesso a dados, simplifica os códigos nos objetos de negócios e outros clientes de dados que utilizem os DAOs. Todas as implementações relativas a códigos (como declarações SQL) estão contidas no DAO e não no objeto de negócios. Com isso a legibilidade dos códigos juntamente com a produtividade do desenvolvimento é melhorada. • Centraliza todo acesso de dados em uma camadaseparada: Como todas as operações de acesso a dados estão agora delegadas aos DAOs, a camada de acesso a dados separada pode ser visualizada como a camada que pode isolar o resto da aplicação da implementação de acesso a dados. Essa centralização torna mais fácil de manter e gerenciar. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 12/29 5.3.1.5 Implantação O padrão a ser seguido pela fábrica está descrito no link abaixo. DAOFactory.java • A interface do DAO, não deverá lançar exceptions especificas do Hibernate. Quando necessário o lançamento de uma exception, deverá ser lançado DAOException. • As querys sejam elas HSQL sejam SQL puro não podem ser concatenadas no código fonte. Ao invés disto deve ser utilizado o prepared statement ou então um formatador de strings através de parâmetros (parametrização de strings). • Os nomes nos métodos das classes de acesso a dados (DAO) devem seguir as seguintes regras: + Qualquer método que faça uma pesquisa que retorne somente um elemento deve iniciar com a string “findBy”. O resto do método deve anunciar qual é o critério de pesquisa. Ex. findByPrimaryKey + Qualquer método que retorne uma coleção ou lista de entidades do banco de dados deve ser nomeada iniciando com a palavra “select”. O resto do método deve dizer as condições do select realizado caso haja. Ex. selectProjetosCadastrados; selectProjetosCadastradosPorMunicipios; selectObrasCadastradasDiretor. • Cada entidade lógica deve possuir uma classe DAO, obedecendo a critérios de herança e o pattern Template definido por Gamma (ver referência em 5.4.1.15). 5.3.2 Struts 5.3.2.1 Contexto Nas aplicações Web a integração entre a camada de apresentação e de negócio é feita através de mecanismos de controle, podendo ser gerenciados de forma centralizada ou descentralizada. Outra necessidade é otimizar a transferência de dados entre as camadas. 5.3.2.2 Problema As aplicações exigem um ponto de acesso que tratam as solicitações da camada de apresentação para suportar a integração de serviços do sistema, recuperação de conteúdo, gerenciamento e navegação de visualização. Quando não é utilizado um mecanismo centralizado, dois problemas podem ocorrer: • Cada visualização é solicitada a fornecer seus próprios serviços de sistema, resultando freqüentemente em códigos duplicados. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 13/29 • O controle distribuído é mais difícil de manter, visto que as alterações precisarão freqüentemente ser feitas em diversos locais. A transferência de dados entre a camada de apresentação e de negócio exige um esforço de codificação, pois todos os campos devem ser preenchidos tanto no envio como no recebimento de informações entre uma camada e outra. 5.3.2.3 Solução O uso do Struts, framework baseado na arquitetura MVC fornece um ponto de entrada centralizado que controla e gerencia o tratamento de solicitações da Web. Centralizando pontos e controles de decisão, o Struts também ajuda a reduzir a quantidade de códigos Java, denominada scriptlets, incluídos na JSP. O controle centralizado reduz a lógica de negócios na visualização favorecendo a reutilização de códigos através de solicitações. No Struts o controle é configurado através de arquivo XML, não requerendo nenhum esforço de codificação nesta camada. Para a transferência de dados entre a camada de apresentação e de negócio, o Struts fornece uma infra-estrutura que simplifica o processo. 5.3.2.4 Benefícios • Centraliza o controle: um controlador fornece um local central para tratar os serviços dos sistemas e a lógica de negócios através de solicitações múltiplas. Ele gerencia o processamento da lógica de negócios e o tratamento de solicitação. O acesso centralizado para uma aplicação significa que as solicitações são facilmente rastreadas e acessadas. • Melhora a capacidade de gerenciamento de segurança: Com o controle centralizado, é promovido um ponto de restrição para tentativas de acessos ilícitos na aplicação. 5.3.3 Log de atividades do usuário a nível de aplicação 5.3.3.1 Contexto Um erro intermitente é aquele que ocorre sem a possibilidade de reproduzi-lo através de uma simples navegação, sendo este conseqüência de um conjunto maior de atividades do usuário. 5.3.3.2 Problema Definir o conjunto exato de atividades executadas que contribuíram para a degradação dos sistemas. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 14/29 5.3.3.3 Solução A utilização de um filtro para cada requisição realizando um log de informações tais como: - usuário logado - url requisitada - tempo da transação A classe de filtro está definida no pacote br.gov.ancine.commons.util.NavegationLogFilter dentro do projeto BiblioAncine. Para maiores informações sobre o uso ver javadoc da referida classe. 5.3.3.4 Benefícios A utilização de um ponto central na aplicação para verificar quais são os caminhos utilizados que podem gerar uma exceção em tempo de execução prejudicando o serviço. 5.3.4 Tratamento de Exceções e Log de aplicação 5.3.4.1 Contexto Exceções são desvios do fluxo normal durante a execução de programa. Toda exceção deve ser logada no sistema 5.3.4.2 Problema Sem uma regra estabelecida para o tratamento de exceções e controle de logs, não há como enumerar e controlar de forma adequada todas as variantes existentes. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 15/29 5.3.4.3 Solução Todas as exceções devem ser impressas no log, exibindo toda a sua “Stack Trace”. A seguir os passos para tratamentos de exceptions. Passo 1 => As exceptions geradas pelo Java, deverão ser lançadas até a última camada (Action). Passo 2 => As exceptions deverão ser mapeadas no "struts-config.xml". Ex.: <action path="/<seu_path>" type="br.gov.ancine.<nome_projeto>.web.action.<Sua_Class_Action><>" name="<nome_do_form>" scope="request" parameter="method" > <exception key="<chave_do_txt_no_"ApplicationResources.properties"> Ex.: mensagem.erro.cadastrousuario.usuarioCadastrado" type="<exception_gerada> Ex.: br.gov.ancine.controleacesso.ejb.exception.LoginEncontradoException" path="/jsp/msg/erro.jsp" /> <exception key="<chave_do_txt_no_"ApplicationResources.properties"> Ex.: mensagem.erro.exception" type="<exception_gerada> Ex.: java.lang.Exception" path="/jsp/msg/erro.jsp" /> </action> OBS.: O tratamento de exception "java.lang.Exception" é obrigatório, deverá sempre ser feito por último e em todas as Actions. Passo 3 => Ex.: <bean:define id="exceptionStackTrace" name="org.apache.struts.action.EXCEPTION" type="java.lang.Exception"/> <logic:notEmpty name="exceptionStackTrace"> <!-- <% exceptionStackTrace.printStackTrace(new java.io.PrintWriter(out));%>--> </logic:notEmpty> 5.3.4.4 Benefícios Utilizando essa solução o padrão é mantido no desenvolvimento, e no fluxo das exceções. Em uma posterior manutenção o desenvolvedor não encontrará dificuldades para identificar e corrigir o problema. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 16/29 5.3.5 Segurança 5.3.5.1 Contexto O Modelo de Segurança J2EE oferece diversas opções de segurança práticas e robustas, desde uma simples Security Socket Layer (SSL) até mesmo ao controle de acesso a métodos de Enterprise Java Beans (EJB) ou acesso à Servlets e Java Server Pages (JSP). 5.3.5.2 Problema Em um ambiente computacional corporativo, existem muitos riscos de segurança para as aplicações que estão em produção. 5.3.5.3 Solução Definir um modelo de segurança único que atenda de forma otimizada, robusta e eficiente os requisitos de segurança exigidos pela ANCINE. Para isso a aplicação deve ser aderente ao controle de acesso e utilizar as taglibs definidas na biblioteca de controle de acesso, juntamente com a biblioancine. Caso seja necessário adicionar alguma nova classe de segurança, documentar e justificar. 5.3.5.4 Benefícios • Controle de segurança totalmente declarativo através do uso de XML. • Controle de autenticação e restrições de acesso à aplicação e seus componentes. 5.3.6 Convenção de Código Java 5.3.6.1 Contexto Existem muitas maneiras de codificar uma aplicação. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 17/29 5.3.6.2 Problema Em uma equipe de desenvolvedores cada um tende a trabalhar à sua maneira tornando uma posterior manutenção no código complicada, pois uma pessoa nem sempre consegue entender de forma clara o que outra estava pensando no momento da fabricação do código. 5.3.6.3 Solução No processo de utilização da linguagem Java existe diversos padrões que auxiliam o projeto e o desenvolvimento de sistemas. A arquitetura adota o modelo MVC (Model-View-Controller) abrangendo Struts, DAO (Persistência) utilizando o Hibernate e outros processos. Todo o esforço para construir uma equipe e guiar seu processo de desenvolvimento no ciclo de vida é apresentado como um padrão. O empenho para se entregar tal produto chama-se projeto e o padrão de atividade dentro da organização e dentro de seu projeto é chamado de processo aplicado. O padrão adotado para convenção de codificação do projeto de sistema é o especificado pela Sun Microsystems (Anexo I), podendo ser localizado no endereço: http://java.sun.com/docs/codeconv/ . 5.3.6.4 Benefícios • Aumenta a legibilidade de código facilitando manutenção. • Reduz tempo e esforço de treinamento. • Nivela a linguagem de comunicação da equipe. • Padroniza os recursos de pessoal aplicados. 5.3.7 Identificação de páginas dinâmicas. 5.3.7.1 Contexto Atualmente com as novas tecnologias, as páginas jsps são dinâmicas. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 18/29 5.3.7.2 Problema Ao se depurar um erro visual na página ou quando se tem a necessidade de descobrir qual a página jsp que deve ser alterada, muitas vezes por conta das novas tecnologias de jsp como struts e jsf é mais difícil de encontrar exatamente qual a página que deve ser alterada para surtir o efeito desejado da mudança. 5.3.7.3 Solução Em cada página dinâmica da aplicação, deve-se inserir um comentário que não interfira no código na primeira linha válida informando o nome da página. Este comentário deve ser visível para consulta no browser ao se solicitar ao mesmo a visão do código fonte. 5.3.7.4 Benefícios • Permite maior agilidade na identificação de erros em páginas HTMLs. • Facilita a localização do código-fonte a ser alterado. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 19/29 5.3.8 Convenção de Empacotamento de Classes Visando uma melhor organização na classificação dos arquivos da aplicação a Sun Microsystems criou o recurso de pacote, já implementado no Java 2. Esse recurso nos dá facilidade de localizar, identificar e subentender o que cada fonte do aplicativo se propõe a fazer. Qualquer pacote fora do padrão deve ser justificado. A árvore de empacotamento adotada utilizando padrões universais, subdividido em pais, organização, empresa, sistema e suas divisões: Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 20/29 5.3.9 Paginação 5.3.9.1 Contexto A paginação de consultas do sistema é uma necessidade e pode ser realizada em várias camadas diferentes, na model, na view ou na controller. Cada escolha tem prós e contra. Além disso, a lógica de paginação é igual em todos os casos. Isto torna passível de utilizar um componente para esta finalidade. 5.3.9.2 Problema Em cada camada possível de ser responsável pela paginação, podemos encontrar prós e contras. Através de estudos realizados e lições aprendidas, foi avaliado que a camada que apresenta maior custo/benefícios ao realizar a paginação é a camada de model. Sendo assim fica estabelecido que a paginação deve ser feita no Banco de dados. 5.3.9.3 Solução A solução para a paginação é realizar a paginação no banco de dados. Deve ser feita a paginação no banco de dados. Fica a critério do desenvolvedor como será feito isso. Entretanto recomendamos utilizar as classes utilitárias disponibilizadas pela arquitetura da ANCINE. 5.3.9.4 Benefícios • Menor consumo de memória ao prevenir instanciação de todos os objetos no Servidor de Aplicação. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 21/29 5.3.10 Padronização de Nomes 5.3.10.1 Nome de Classes, JSP e Actions • NomeDaAcaoNomeDoCasoDeUsoAction.java • NomeDaAcaoNomeDoCasoDeUsoForm.java • nomeDaAcaoNomeDoCasoDeUso.jsp • nomeDaAcaoECE.do OBS: nome da ação + nome do caso de uso abreviado com todas as letras em caixa-alta. Exemplos de ações: Cadastrar, pesquisar, alterar, habilitar, selecionar, apagar, emitir, etc. Exemplos de abreviações: • pesquisarECE.do => pesquisar empresa contribuinte estrangeira. • selecionarEENO => selecionar empresa estrangeira não optante. 5.3.10.2 Estrutura de Diretórios • /jsp • /jsp/nomeDoCasoDeUso • /jsp/include • /jsp/msg 5.3.10.3 Datasources Os datasources utilizados para acessar o banco de dados devem conter as iniciais “ds.”+nome da aplicação ex.: ds.controleacesso os datasources utilizam classes jdbc fornecidas pela oracle junto com o seu client 9i o “ojdbc14.jar”. Utilizaremos o datasouce do Jboss utilizando o arquivo oracle-ds.xml. 5.3.10.4 Manipulação de Dados Todos os dados inseridos, atualizados e consultados nas Aplicações devem ser em caixa alta “UPPERCASE”. As consultas de dados do tipo “caractere” podem ser feitas em “case-insensitive”, devendo ser convertida naaplicação em UPPERCASE para poder realizar a consulta. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 22/29 5.3.11 Framework Ancine de Processamento Batch 5.3.11.1 Contexto Existem algumas atividades dentro de uma aplicação que necessita de um processamento em um tempo mais longo, e muitas vezes não precisa de uma interação direta com o usuário. Para tais tipos de processamentos que podem onerar a CPU do servidor de aplicação principal deve se separar estas atividades da aplicação principal. 5.3.11.2 Problema Um dos principais problemas referentes a este tipo de processamento de aplicação é o fato da mesma geralmente ocupar grande parcela da CPU do sistema e sob o aspecto da arquitetura da aplicação, estar diretamente dependente da operação do servidor de aplicação. Um problema acarretado por isso é, por exemplo, o envio de e-mail fica comprometido caso o servidor de aplicação tenha que ser parado. 5.3.11.3 Solução Caso seja necessário realizar algum processamento batch pelas aplicações em um servidor de aplicação java, deve ser utilizado o framework Ancine de processamento batch. A idéia é separar o processamento batch das aplicações Java. 5.3.11.4 Benefícios Independência dos procedimentos batch para com o servidor de aplicação. 5.3.12 Recepção de novos desenvolvimentos Um dos problemas recorrentes da ANCINE é realizar o rápido mapeamento entre as funcionalidades implementadas pelo caso de uso e seus correspondentes artefatos. Mesmo o desenvolvedor de apoio localizado na ANCINE ou qualquer interessado em mapear rapidamente as mudanças necessárias em cada caso de uso despende de grande tempo para entender onde cada elemento de qual caso de uso está. Para solucionar tal problema a solução adotada é a criação de um diagrama de componente para cada caso de uso implementado. Tal diagrama deve informar quais componentes ele utiliza para a execução de seu trabalho. A partir da leitura deste, deve ser claro quais EJB, páginas, Actions, DAOs e outros elementos são utilizados. Na atividade de recebimento de produtos do processo de gerência de software da ANCINE, juntamente com o código-fonte do aplicativo deve ser enviado o conjunto de diagramas que representam para cada caso de uso, os artefatos utilizados. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 23/29 Abaixo segue um exemplo de diagrama de componentes que deve ser seguido: 5.3.13 Requisitos de software para release de produção. A gerência de arquitetura de sistemas e qualidade da ANCINE tem como parâmetro de qualidade para passagem de um sistema para o ambiente de produção que os sistemas devem obedecer às seguintes especificações: 1. A utilização do sistema em produção sob condições de configurações corretas da aplicação não deve gerar exceção. 2. Uma funcionalidade qualquer não deve exceder o tempo de execução de 20.000 milissegundos. Caso por algum motivo como processamento intensivo, cálculos complexos ou envio de e-mails deve ser documentada previamente tal funcionalidade e comunicada à equipe de arquitetura para verificação da melhor implementação possível. (Considerar processamento intensivo, algoritmos que possuam uma complexidade maior que O(n)). 3. Fica a cargo do pessoal de homologação avaliar os itens acima. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 24/29 5.4 Requisitos não funcionais para recebimento de software da fábrica. A gerência de arquitetura de sistemas e qualidade da ANCINE tem como parâmetro de qualidade para passagem de um sistema para o ambiente de desenvolvimento da ANCINE através do fornecimento do código-fonte. Este deve vir da referida fábrica de software contendo: 1. Instrução de instalação quando possuir alguma especificidade que justifique. 2. Código fonte da aplicação. 3. Scripts necessários para a configuração inicial da aplicação, quando necessário. 4. Arquivos de parâmetros e propriedades da aplicação, necessários para o funcionamento do sistema, quando pertinente. 5. Arquivos e scripts necessários para a montagem e empacotamento da aplicação. 5.4.1 Pré-requisitos Gerais. 5.4.1.1 Não serão permitidos métodos deprecate. 5.4.1.2 Não serão permitidas regras de negócio nas Actions. 5.4.1.3 Toda BO deverá ter uma interface e será instanciada a partir de uma BOFactory.java. 5.4.1.4 A classe DAOFactory, deverá ser: DAOFactory.java. 5.4.1.5 A classe BOFactory, deverá ser: BOFactory.java. 5.4.1.6 Todas as críticas de valores obrigatórios deverão ser feitas com javascript, mas as mesmas também deverão existir na camada de BO. 5.4.1.7 Tais regras que utilizarem javascript, deverão ser feitas a partir do validation.xml do Struts. 5.4.1.8 É proibido o uso de scriptlet, devendo utilizar Tags do Struts e JSTL. 5.4.1.9 Todas as exceptions geradas pela camada de BO, deverão ser encapsuladas em uma exception do tipo BOException. Lembrando que a exception original deverá sempre ser passada no construtor da classe para que mantenhamos a stacktrace atualizada. 5.4.1.10 Deverá haver controle de Lock Otimista para classes de cadastramento e caso seja levantado uma exceção, o usuário deverá receber uma mensagem: “Os dados desse registro já estão sendo atualizados pelo usuário: ” + var_NomeLogin. O tratamento desta exceção deverá manter os mesmos dados digitados pelo usuário nos campos das páginas a fim de oferecer uma nova tentativa de confirmação sem que o usuário tenha de repetir a digitação. As páginas dos Sistemas desenvolvidos devem implementar uma solução de TOKEN para impedir a submissão repetitiva das mesmas. Um exemplo de código pode ser encontrado no livro Core J2EE patterns, também disponível no site da SUN pelo link: http://java.sun.com/blueprints/patterns/. Existe uma implementação de exemplo da proposta de refactoring “synchronizer token”, provida pela equipe de arquitetura da ANCINE na biblioteca de objetos ANCINE. Para maiores informações verificar o Javadoc da biblioteca. 5.4.1.11 As páginas devem desabilitar o botão de submissão de página após ser pressionado, a fim de impedir que a mesma página seja solicitada mais de uma vez. Isto deve ser realizado na camada de apresentação. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 25/29 5.4.1.12 As telas que realizam pesquisas em campos tipo String, como por exemplo, “nome da obra” devem validar o campo de pesquisa em questão para esta conter no mínimo três caracteres. Isto serve para evitar pesquisas intensas como, por exemplo, pesquisar todas as obras que tenham a letra “A” no nome. 5.4.1.13 Todos os sistemas desenvolvidos devem seguir os padrões propostos pela SUN. Estes podem ser encontrados no seguinte site: http://java.sun.com/blueprints/patterns/ 5.4.1.14 Na modelagem dos sistemas, devem ser levados em consideração os patterns propostos pelo GOF (Gang Of Four) localizados no livro: GAMMA, Erich HELM, Richard JOHNSON, Ralph VILISSIDES, John Padrões de Projeto: soluções reutilizáveis de software orientados a objetos Bookman, Porto Alegre, 2000 5.4.1.15 Todas as exceptions geradas pela camada de DAO, deverão ser encapsuladas em uma exception do tipo DAOException. Lembrando que a exception original deverá sempre ser passada no construtor daclasse para que mantenhamos a stacktrace atualizada. 5.4.1.16 Toda regra escrita em um BO, deverá seguir a seguinte ordem: +Instanciar CLASS necessárias; +Validar campos que fazem parte do processo; +Processar regra de negocio +Lançar possíveis exceptions geradas, incluindo na string de texto da exceção, o Nome do Sistema, o método executado e parâmetro passado se houver. 5.4.1.17 Quando houver Agregação ou Associação no Hibernate, deverá ser habilitado o recurso “LAZY”. 5.4.1.18 Não vamos aplicar o Pattern Facade, pois o BO desempenha o papel do mesmo. 5.4.1.19 Quando uma regra X de um determinado BO1 tiver como pré-condição ou pós-condição uma regra Y pertencente a um BO2, o BO1 pode fazer referência ao BO2 para cumprir a pré- condição ou pós-condição. Com isso estaremos estabelecendo um relacionamento entre BOs. Isto não significa que, não podemos instanciar dois BOs dentro de uma mesma Action. Se para executar uma ação (Action), seja necessário mais de um BO com objetivos totalmente diferentes e independentes, este é um caso que se assume duas instancias de BOs diferentes na mesma Action. 5.4.1.20 Existe uma biblioteca de métodos comuns que deverá ser fornecida à fábrica de software e consultada antes de se criar métodos de apoio às aplicações. Sua localização e nome são: ../server/default/lib/ancine-commons.jar. 5.4.1.21 Deixamos como sugestão a utilização da JPA como camada de persistência junto com o aproveitamento do recurso “Annotations” nas classes POJO´s para o mapeamento objeto- relacional. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 26/29 5.4.1.22 Não é permitido métodos vazios ou que retornam null não executando nenhum processamento. Entenda-se por processamento código que realize alguma operação que agregue funcionalidade à aplicação. 5.4.1.23 Para as páginas de listagem de entidades é necessária a utilização de objetos POJOs para o preenchimento das mesmas. Nestes devem existir somente os campos a serem exibidos na tela, não pode ter referências a outros objetos e não pode ter nenhum campo lazy. Paralelamente estes objetos devem ser mapeados para views correspondentes com os campos a serem exibidos na tela. 5.4.1.24 Todos os erros de banco de dados referentes à primary key, foreing key e unique key devem ser tratados na aplicação e exibir retorno ao usuário explicando o problema com o código do erro. Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 27/29 5.5 Diagrama de Divisão de Camadas Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 28/29 5.6 Diagrama de Seqüência de Implementação JSP/Tags(View) ActionServlet ActionForm ActionX Transfer ObjectBusiness Object DAO Database post/get validar dados validados execute dados Secretaria de Gestão Interna Gerência de Tecnologia da Informação Projeto de Arquitetura de Software Página 29/29 6. Visão de Distribuição Não se aplica neste documento. 7. Requisitos e Restrições da Arquitetura Não se aplica neste documento. 8. Referências Não se aplica neste documento. 9. Assinaturas Os abaixo assinados estão de acordo com o conteúdo do documento “Projeto de Arquitetura”. Data: ___/___/_____ Data: ___/___/_____ Sergio Augusto Santos de Moraes Coordenador Técnico GTI Roberto Souza de Holanda Coordenador Técnico GTI Data: ___/___/_____ Data: ___/___/_____ Carlos Júlio Ferreira Alferes Arquiteto de Sistemas GTI Leandro Paranhos Carvalho de Souza Arquiteto de Sistemas GTI
Compartilhar