580 likes | 703 Views
BASEGen – Visão Geral. Sumário. BASEGen Arquitetura Tecnologias Padrão Fachada Camada de Apresentação Customização de páginas JSF Relatórios Ajax Camada de Comunicação. Camada de Negócios Controle de Transação Segurança Camada de Persistência Configuração e Tuning Jobs
E N D
Sumário • BASEGen • Arquitetura • Tecnologias • Padrão Fachada • Camada de Apresentação • Customização de páginas JSF • Relatórios • Ajax • Camada de Comunicação • Camada de Negócios • Controle de Transação • Segurança • Camada de Persistência • Configuração e Tuning • Jobs • Customização das Camadas • Caso de Uso • Links
BASEGen O BASEGen é um framework de geração automática de código baseado no paradigma MDA. Utiliza o AndroMDA framework para realizar a geração de código a partir do modelo UML. A partir do modelo UML do sistema, o BASEGen gera uma aplicação completa, totalmente funcional, com as operações padrões de CRUD (inserir, atualizar, remover, recuperar) para todas as entidades do sistema. O aplicação gerada é fundamentada sobre a arquitetura BASE da Persapiens, baseada na arquitetura em camadas, padrão fachada e padrão CRUD.
BASEGen (2) A partir do código gerado é possível inserir as regras de negócios que farão as funcionalidades específicas do sistema. O código gerado é também passível de customização. A principal forma de customização do código gerado é através do modelo UML, usando estereótipos e tagged values. Para os casos onde não é satisfatória a customização pelo modelo, a aplicação ainda pode ser customizada de diversas formas, utilizando recursos de orientação a objetos e mecanismos de merge do BASEGen.
Arquitetura O BASEGen cria uma aplicação baseada na arquitetura BASE, de quatro camadas: Camada de apresentação: Contém componentes necessários para a interação do usuário com a aplicação. São componentes como páginas Web, classes de controle das páginas, etc. Camada de comunicação: Provê uma interface entre a camada de apresentação e a camada de negócios. Essa interface pode ser tanto para comunicação local quanto para comunicação entre aplicações remotas.
Arquitetura (2) Camada de negócios: Encapsula as funcionalidades das regras de negócios da aplicação. Permite que sejam implementadas desde lógica de negócios simples, até funções mais complexas, envolvendo transações. Camada de persistência: Provê uma API simples para acessar e manipular os dados. Os componentes dessa camada abstraem a semântica da tecnologia usada no acesso aos dados permitindo a camada de negócios focar nas regras de negócios. Provê métodos de inserir, recuperar, atualizar e remover cada entidade específica de negócios (operações conhecidas como CRUD).
Tecnologias Camada de apresentação: É resolvida com JSF (JavaServer Faces), tecnologia padrão Java para desenvolvimento de aplicações Web que segue o paradigma MVC. Camada de comunicação: Utiliza Web Services para disponibilizar o acesso remoto da aplicação. Camada de negócios: Utiliza o mecanismo de AOP do Spring Framework para controle de transação e controle de segurança com o Acegi Security System for Spring.
Tecnologias (2) Camada de persistência: Resolvida com Hibernate, framework para realizar mapeamento objeto/relacional. Instanciação do Sistema O Spring Framework, através do mecanismo de injeção de dependência, é utilizado para instanciar e integrar as camadas do sistema.
Arquitetura - Tecnologias Camada de Apresentação PáginasWeb e Classes de Controle JSF Camada de Comunicação Web Services Instanciação do Sistema Spring Framework Camada de Negócios Entidades e Regras de Negócios Camada de Persistência Hibernate
Padrão Fachada O Façade, ou fachada, é um padrão de projeto utilizado para esconder detalhes e complexidade dos serviços das camadas mais baixas, deixando os serviços mais fáceis de usar, além de prover um ponto de acesso único entre as camadas do software. A arquitetura BASE utiliza uma fachada que reúne todas as operações da camada das regras de negócios que ficarão disponíveis no sistema. A camada de apresentação então só pode fazer uso das regras de negócios através da fachada. O BASE fornece uma fachada para acesso local e outra para acesso remoto. Ambas fornecem os mesmos serviços, a diferença reside no fato de que uma é implementada localmente e a outra é implementada remotamente, com Web Services. O BASEGen gera completamente as fachadas do sistema, sem necessidade de codificação manual.
Arquitetura – Padrão Fachada Camada de Apresentação da Aplicação Local Camada de Apresentação da Aplicação Remota Fachada Local Fachada Remota Camada de Comunicação Camada de Negócios Camada de Persistência
Camada de Apresentação Pode ser dividida em cinco partes principais: Páginas JSF Classes backing-beans JSF (chamadas aqui de PageBeans) Arquivos de mensagens Arquivos de configuração JSF Relatórios Utiliza implementação e componentes JSF do projeto Apache MyFaces. Utiliza técnicas de Ajax através do AjaxAnywhere. Utiliza o JasperReports para produzir relatórios em diversos formatos, como por exemplo PDF.
Camada de Apresentação (2) A camada de apresentação é totalmente gerada pelo BASEGen para as funções de CRUD de cada entidade do sistema. Conteúdo gerado: 3 tipos de páginas JSF: inserção/edição visualização listagem/busca 2 tipos de PageBeans Para as páginas de inserção/edição e visualização Para a página de listagem/busca
Camada de Apresentação (3) Conteúdo gerado (continuação): Configurações JSF (faces-config.xml) Declaração de backing-beans Navegação de páginas Mensagens Arquivo de propriedades que externaliza todas as mensagens do sistema. Além de páginas e classes secundárias
Camada de Apresentação (4) Para customização das páginas JSF, pode-se: Inserir páginas completamente novas Sobrescrever por inteiro as páginas geradas Utilizar o recurso de merge de páginas JSF do BASEGen para customizar partes específicas de uma página gerada. A customização dos PageBeans é baseada em extender os PageBeans gerados, sobrescrevendo ou adicionando as funcionalidades desejadas. Também é possível criar PageBeans completamente novos.
Camada de Apresentação (5) As configurações JSF (faces-config.xml) customizadas são feitas em um arquivo a parte, no qual é feito um merge com o faces-config.xml gerado. A customização das mensagens é feita criando novos arquivos de propriedades: Para tradução das mensagens atuais para outras línguas Ou para adição de novas mensagens
Exemplo – Geração de uma página JSF Modelo UML:
Exemplo – Geração de uma página JSF Trecho de código do template ... <h:dataTableid="${property.name}"styleClass="base-h-dataTable" headerClass="base-h-dataTableHeader"footerClass="base-h-dataTableFooter" rowClasses="base-h-dataTableRow, base-h-dataTableRow2" value="#{${uClassName}PageBean.${property.name}List}"var="${uPropertyTypeName}"> #buildColumns($property.type) <h:columnid="view${capPropertyName}Action-column"> <h:commandLinkid="view${capPropertyName}Action-commandLink"styleClass="base-h-commandLink"action="#{${uClassName}PageBean.view${capPropertyName}Action}"immediate="true"> <h:graphicImagestyleClass="base-h-graphicImage"id="iconView"title="#{msg${moduleId}['label.view']}"url="/images/icons/view.gif"></h:graphicImage> <f:paramname="outcome"value="${uClassName}ViewConfirm"/> </h:commandLink> </h:column> </h:dataTable> ...
Exemplo – Geração de uma página JSF Trecho de código gerado (personViewConfirm.jsp) ... <h:dataTable id="car" styleClass="base-h-dataTable" headerClass="base-h-dataTableHeader" footerClass="base-h-dataTableFooter" rowClasses="base-h-dataTableRow, base-h-dataTableRow2" value="#{personPageBean.carList}"var="car"> <h:column id="car-brand-column"> <f:facet name="header"> <h:outputText id="car-brand-column-header" styleClass="base-h-outputText“ value="#{msgopenerp['car.attribute.brand']}"/> </f:facet> <h:outputText id="car-brand-column-text" styleClass="base-h-outputText" value="#{car.brand}"> </h:outputText> </h:column> <h:column id="car-model-column"> <f:facet name="header"> <h:outputText id="car-model-column-header" styleClass="base-h-outputText“ value="#{msgopenerp['car.attribute.model']}"/> ...
Customização de páginas JSF O BASEGen possui um mecanismo que permite que apenas partes específicas de uma página JSF gerada seja customizada, sem a necessidade de alterar a página completa. Baseado no id do componente gerado, o BASEGen permite alterar ou remover esse componente, ou ainda adicionar um novo componente à página.
Exemplo – Customização de páginas JSF Trecho da página gerada (carInsertUpdate.jsp) ... <h:form id="mainForm" styleClass="base-h-form"> <h:inputHidden id="focusElement“ binding="#{carPageBean.focusElementInput}"/> <h:messages id="msgs-error“ errorClass="base-h-messagesError" showSummary="false" showDetail="true“ layout="table" /> <h:panelGrid columns="2" styleClass="base-h-panelGrid-view" headerClass="base-h-panelGridHeader-view" footerClass="base-h-panelGridFooter-view" rowClasses="base-h-panelGridRow-view" columnClasses="base-h-panelGridColumn-view" > <h:outputLabel id="brand-outputLabel“ for="brand" styleClass="base-h-outputLabel“ value="#{msgopenerp['car.attribute.brand']}“ /> <h:inputText id="brand" styleClass="base-h inputText“ value="#{carPageBean.car.brand}"> </h:inputText> <h:outputLabel id="model-outputLabel“ for="model" styleClass="base-h-outputLabel" value="#{msgopenerp['car.attribute.model']}" /> <h:inputText id="model" styleClass="base-h-inputText“ value="#{carPageBean.car.model}“> </h:inputText> </h:panelGrid> ...
Exemplo – Customização de páginas JSF Código de customização (carInsertUpdate.mrg) <?xml version="1.0"?> <customize xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:x="http://myfaces.apache.org/tomahawk" xmlns:tags="http://www.persapiens.org/tags" version="1.0"> <!-- inserindo novos componentes depois do componente com id="brand" --> <insert-after id=“brand"> <h:outputText value=“Color:" /> <h:selectOneMenu id=“color" value="#{carPageBean.car.color}"> <f:selectItem itemValue="red" itemLabel="Red"/> <f:selectItem itemValue="blue" itemLabel="Blue"/> <f:selectItem itemValue="black" itemLabel="Black"/> </h:selectOneMenu> </insert-after> </customize>
Relatórios A construção de um relatório na arquitetura BASE é formada por: Uma página JSF, para a tela de consulta do relatório; Uma classe PageBean, para controle da página JSF e da geração do relatório; E o relatório JasperReports, feito utilizando o iReport. Há também a possibilidade de consulta nativa SQL ou HQL para construção do relatório.
Exemplo – RelatórioClasse PageBean publicclass BarterReportPageBean extends DateReportPageBean { ... protected Map getParameters() throws Exception { Map result = super.getParameters(); BarterPageBean barterPageBean = new BarterPageBean(); if(getBarterState() == null) { result.put("barterState","Todos"); } else { result.put("barterState",barterPageBean.getBarterStateString().get(getBarterState())); } if (getEstablishment().getId() == null) { result.put("establishment", "Todos"); } else { result.put("establishment", getOpenerpFacade().retrieveEstablishment(getEstablishment().getId()).getFantasyName()); } return result; } protected BaseIterator getBaseIterator() throws Exception { ...
Ajax O Ajax permite agilizar a interatividade, fazendo reloads parciais das páginas. O uso do Ajax é feito através de Javascripts e componentes JSF do AjaxAnywhere: ... <aa:zoneJSF id= "zoneDescription"> <h:inputText id="description" value="#{brandPageBean.brand.description}“ /> </aa:zoneJSF> ... <script> ajaxAnywhere.getZonesToReload = function(url,submitButton) { return "zoneDescription"; } </script> ...
Camada de Comunicação A camada de comunicação permite que a aplicação tenha acesso remoto através de Web Services. Implementado utilizando o Apache Axis. Conteúdo gerado pelo BASEGen: Fachada Remota implementada utilizando Web Services equivalente a fachada padrão. Todos os artefatos de Web Services e classes secundárias (stubs, converters, etc...). Na camada de comunicação não é necessária nenhuma customização manual, pois ela se resume a utilização da Fachada Remota, que é totalmente gerada.
Camada de Negócios Formada por: Classes POJO de cada entidade de negócios Classes de regras de negócios para cada entidade, chamada de BusinessLogic Classes de operações, que não acessam a camada de persistência, para cada entidade, chamada de Operations. Configurações do Spring Framework
Camada de Negócios (2) Conteúdo gerado pelo BASEGen: 100% das classes POJO de todas as entidades do sistema BusinessLogic de todas as entidades do sistema com operações de negócios padrões de CRUD: inserir, remover, atualizar e recuperar Assinatura dos métodos das BusinessLogic e das Operations modeladas no diagrama de classes. Configurações do Spring para injeção de dependência nas BusinessLogic
Camada de Negócios (3) A criação das regras de negócios se baseia em modelar os métodos no diagrama de classe como uma operation da respectiva classe. Esses métodos irão fazer parte da fachada gerada pelo BASEGen. Deve-se então customizar as BusinessLogic, geradas com as assinaturas dos métodos do modelo UML, que extendem as regras de negócios padrões. Dessa forma é possível: Sobrescrever as operações padrões de CRUD (inserir, atualizar, remover e recuperar) Criar novas regras de negócios
Exemplo – Geração de uma classe POJO Modelo UML:
Exemplo – Geração de uma classe POJO Trecho de código do template /** $class.getDocumentation(" * ") #set ($tableName = "T_$commonsString.upperCase($className)") #if (!$class.generalization) * @hibernate.class * table="${tableName}" * @hibernate.cache * usage="read-write" #else * @hibernate.joined-subclass * table="${tableName}" * @hibernate.joined-subclass-key * column="id" * @hibernate.cache * usage="read-write" #end */ public $!abstract class ${className}$!extends$!implements { #foreach ($attribute in $class.attributes) ... private $attribute.type.name$attribute.name; /** $attribute.getDocumentation(" * ") * @hibernate.property #hibernateAttrColumn($attribute) */ public $attribute.type.name${attribute.getterName}() { return this.$attribute.name; } public void ${attribute.setterName}($attribute.type.name $attribute.name) { this.${attribute.name} = $attribute.name; } #end
Exemplo – Geração de uma classe POJOTrecho de código gerado (Car.java) ... /** * @hibernate.class * table="T_CAR" * @hibernate.cache * usage="read-write" */ public class Car implements IdBean { // --------------- attributes ------------- private String brand; /** * @hibernate.property * @hibernate.column * name="brand" */ public String getBrand() { return this.brand; } public void setBrand(String brand) { this.brand = brand; } private String model; /** * @hibernate.property * @hibernate.column * name="model" */ public String getModel() { return this.model; } public void setModel(String model) { this.model = model; } ...
Exemplo – Criação de Regra de Negócios Passos para criação de uma Regra de Negócios: Cria-se o método da regra de négocios (que irá para a fachada) na respectiva classe no modelo UML. A partir da BusinessLogic gerada com as assinaturas dos métodos, cria-se a lógica das regras de negócios ou sobrescreve as regras de negócios padrões.
Exemplo – Criação de Regra de Negócios Modelo UML:
Exemplo – Criação de Regra de NegóciosCódigo da BusinessLogic da entidade WebClient public class WebClientBusinessLogic extends WebClientAbstractBusinessLogic { public void releaseWebClient(WebClient webClient) throws BusinessLogicException, RepositoryException { webClient.setReleased(true); super.update(webClient); } }
Controle de transação A fachada do BASEGen é o ponto de controle das transações. Toda chamada a um método da fachada inicia uma transação, que finaliza ao fim deste método. O controle de transação é feito sem intervenção direta no código, através do mecanismo de AOP do Spring Framework. O controle de transação é todo gerado pelo BASEGen, não havendo necessidade de nenhuma customização ou codificação manual.
Controle de Transação – Exemplo de configuração gerada <!-- Transaction manager for a Hibernate SessionFactory --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"><ref bean="sessionFactory"/></property> </bean> <bean id="matchAllWithPropReq" class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource"> <property name="transactionAttribute"><value>PROPAGATION_REQUIRED, -Exception</value></property> </bean> <!-- Interceptor for transactions --> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"> <ref local="transactionManager"/> </property> <property name="transactionAttributeSource"><ref local="matchAllWithPropReq"/></property> </bean> <!-- ProxyFactoryBean for org.persapiens.openerp.model.OpenerpFacade --> <bean id="openerpFacade" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>org.persapiens.openerp.model.OpenerpFacade</value> </property> <property name="targetName"> <value>openerpFacadeTarget</value> </property> <property name="interceptorNames"> <list> <idref local="transactionInterceptor"/> <idref bean="modelSecurityInterceptor"/> </list> </property></bean>
Segurança Resolvida com o Acegi Security, é feita em três níveis: O primeiro nível se refere a cada usuário ter login e senha para poder acessar o sistema. O segundo nível diz respeito a camada de apresentação. Dependendo das permissões do usuário determinadas funcionalidades do sistema irão ser mostradas na tela ou não. O terceiro nível é a permissão para executar determinada operação. A cada tentativa do usuário executar uma operação do sistema, o Acegi Security, através de interceptadores AOP do Spring, verifica se este usuário tem permissão para executar essa operação ou não.
Segurança (2) Permissões padrões e permissões para operações da fachada são automaticamente geradas pelo BASEGen. Permissões adicionais são facilmente criadas, através de um arquivo texto. Baseada em perfis: Cada usuário pode ter vários perfis (administrador, vendedor, etc). A cada perfil é atribuído as permissões devidas.
Exemplo – SegurançaCustomização de permissões (permission.txt) bypassWebClient errorDetail USER
Camada de Persistência A camada de persistência envolve basicamente a API do BASE. Implementada com Hibernate. Fornece as seguinte operações para todas as entidades de negócio: insert, update, delete, retrieve, list, count, sum, maximum, minimum Essas operações são usadas em conjunto com a API Query do BASE que permite construir consultas SQL em uma linguagem própria e orientada a objetos, abstraindo até mesmo o Hibernate.
Camada de Persistência (2) Toda a informação sobre persistência de objetos fica no modelo, não sendo necessário criar nenhuma informação adicional no código. Conteúdo gerado pelo BASEGen: Arquivos de mapeamento do Hibernate (hbm) para todas as entidades de negócios persistentes. Script SQL para criação das tabelas do banco. Configurações do Spring para injeção de depêndencia das configurações de acesso ao banco e integração com a camada de negócios.