Um Padrão para o Desenvolvimento de Software Baseado em
Transcrição
Um Padrão para o Desenvolvimento de Software Baseado em
Um Padrão para o Desenvolvimento de Software Baseado em Componentes Distribuídos1 Eduardo Santana de Almeida [email protected] Calebe de Paula Bianchini [email protected] Antonio Francisco do Prado Luis Carlos Trevelin [email protected] [email protected] Departamento de Computação – DC Universidade Federal de São Carlos – UFSCar 1. Contexto O Padrão proposto está inserido no contexto do Desenvolvimento Baseado em Componentes Distribuídos (DBCD), onde a intenção é a criação de componentes distribuídos reutilizáveis para diferentes domínios de aplicações. 2. Motivação De maneira a motivar o uso do Padrão, parte de um domínio de Ordem de Serviços (OS) foi construído. O domínio possui componentes de negócio, como clientes, funcionários, ordens de serviço e tarefas. Outros requisitos não funcionais, como persistência em banco de dados, arquitetura distribuída e interfaces, também, foram utilizados no padrão. Adicionalmente, é utilizado um processo para o desenvolvimento de aplicações, reutilizando os componentes construídos. 3. Problema O Desenvolvimento Baseado em Componentes se preocupa com a criação de componentes que possam ser reutilizados em outras aplicações. A reutilização caracteriza-se pela utilização de produtos de software, em uma situação diferente daquela para qual estes produtos foram originalmente construídos [21]. Para aumentar a reutilização de software, pesquisas [8, 16, 21] apontam, como passo fundamental, a sistematização do processo de análise e criação de componentes para um determinado domínio de aplicações. Para que a reutilização possa ser efetiva, deve-se considerá-la em todas as fases do processo de desenvolvimento do software. Portanto, o Desenvolvimento Baseado em Componentes (DBC) deve oferecer métodos, técnicas e ferramentas que suportem desde a identificação e especificação dos componentes, referente ao domínio do problema, até o seu projeto e implementação em uma linguagem executável. Além disso, o DBC deve empregar inter-relações entre componentes já existentes, que tenham sido previamente testados, visando reduzir a complexidade e o custo de desenvolvimento do software [21]. Apesar das recentes e constantes pesquisas na área de DBC, ainda há carência de métodos, técnicas e ferramentas que suportem tanto o desenvolvimento quanto a reutilização de componentes, em aplicações de um determinado domínio. Outro problema importante relaciona-se com a dificuldade de integração das diferentes técnicas e ferramentas que apóiam o DBC. Considerando o caso de componentes distribuídos, como ocorre na rede Internet, com plataforma cliente e servidor, o problema é ainda maior. 1 Copyright (c) 2002, Eduardo Santana de Almeida. Permission is granted to copy for the SugarloafPLoP 2002 Conference. All other rights reserved. Diferentes métodos, técnicas e ferramentas têm sido propostos para suportar o DBC, destacando-se as ferramentas CASE [7, 9, 17]. Entretanto, a maioria destes métodos, técnicas e ferramentas, cobrem parcialmente o DBC, principalmente no caso de aplicações distribuídas. Assim, o Padrão de DBCD permite: • a integração de diferentes tecnologias, como UML [3, 12], Catalysis [5, 8], CORBA [1, 6, 14], e Java [11] em uma ferramenta CASE, para apoiar o DBC, particularmente o de aplicações distribuídas. A ferramenta CASE automatiza grande parte das atividades do DBC Distribuídos; • cobrir todo o ciclo de vida dos componentes distribuídos, desde a fase de especificação, em alto nível de abstração, na ferramenta CASE, até a sua implementação em uma linguagem orientada a objetos; • definir mudanças no código de comunicação dos componentes, de uma forma minimizada, com a utilização do padrão DAP (Distributed Adapters Pattern) [1]. 4. Solução Assim, combinando as idéias do método Catalysis de desenvolvimento de software baseado em componentes, a arquitetura CORBA para especificação dos componentes distribuídos, os frameworks baseado em Padrões e a ferramenta MVCase [15], definiu-se um padrão para o Desenvolvimento de Software Baseado em Componentes Distribuídos. O padrão cobre os três níveis de Catalysis, e é realizado em quatro passos: Definir Problema, Especificar Componentes, Projetar Componentes e Implementar Componentes, conforme mostra a Figura 1. Figura 1 – Padrão de DBC Distribuídos. Segue-se uma apresentação de cada passo do padrão, instanciado para desenvolver componentes para um domínio de Ordem de Serviços, o qual faz parte de um domínio maior, 176 o de Gestão de Recursos de Negócio, conforme mostra a Figura 2. Embora o domínio de Ordem de Serviços não esteja completo, o exemplo serve para mostrar detalhes das técnicas empregadas, e os principais artefatos gerados em cada passo do padrão. Figura 2 – Estrutura geral da Gestão de Recursos de Negócio. 4.1 Definir Problema Conforme mostra a Figura 3, as aplicações do domínio de Ordem de Serviços se dividem em três grandes módulos: o primeiro, Clientes, é responsável pelo cadastro e notificação dos clientes de uma determinada ordem de serviço. O segundo, Funcionários, é responsável pelo cadastro de funcionários e controle das tarefas da ordem de serviço. O terceiro, Relatórios, é responsável pela emissão de relatórios para a gerência, relacionados com a consulta de tarefas realizadas e pendentes, ordens de serviços de determinado cliente e dos funcionários responsáveis por cada tarefa. Figura 3 – Domínio Ordem de Serviços. Neste primeiro passo do padrão, é dada ênfase no entendimento do problema, especificando-se “o quê” os componentes devem atender para solucionar o problema. Inicialmente, são identificados os requisitos do sistema, usando técnicas como storyboards ou mind-maps [16], visando representar as diferentes situações e cenários do domínio do problema. Em seguida, os requisitos identificados são especificados em Modelos de Colaborações [3, 8, 12], representando a coleção de ações e os objetos participantes. Finalmente, os modelos de colaborações são refinados em Modelos de Casos de Uso [3, 8, 12]. A Figura 4 resume o primeiro passo do padrão, onde um mind-map, definido na identificação dos requisitos do domínio Ordem de Serviços, é especificado num Modelo de 177 Colaborações, e, posteriormente, refinado e particionado em um Modelo de Casos de Uso, visando diminuir a complexidade e melhorar o entendimento do domínio do problema. Figura 4 - Primeiro Passo do Padrão: Definir Problema. 4.2 Especificar Componentes Este passo cobre o segundo nível de Catalysis, onde é descrito o comportamento externo do sistema de uma forma não ambígua. Na ferramenta CASE, o engenheiro de software refina as especificações do nível anterior, visando obter as especificações dos componentes. Esse passo tem início com o refinamento dos modelos do domínio do problema. Especifica-se o Modelo de Tipos [3, 8, 12], conforme mostra a Figura 5, mostrando atributos e operações dos tipos de objetos, sem se preocupar com a implementação. Ainda neste passo, pode-se utilizar o dicionário de dados para especificar cada tipo encontrado, e a Object Constraint Language (OCL) [3, 12], para detalhar o comportamento dos objetos, sem ambigüidades. Figura 5 – Modelo de Tipos do passo Especificar Componentes. 178 Conforme mostra a Figura 6, o Modelo de Tipos é organizado em um Framework de Modelos de Tipos de componentes [4, 7], com os seus atributos e relacionamentos. O framework é reutilizado através do Modelo de Aplicação do Framework [4, 7], representando a dependência dos tipos do framework, com os tipos estendidos na aplicação. Os Modelos de Casos de Uso, do passo anterior, são refinados em Modelos de Interações representados pelos diagramas de seqüência [4, 7, 11], para detalhar os cenários de utilização dos componentes nas diferentes aplicações do domínio do problema. Figura 6 – Segundo Passo do Padrão: Especificar Componentes. Em resumo, as atividades deste passo, realizadas pelo engenheiro de software, na ferramenta MVCase, compreendem a especificação do: a) Modelo de Tipos; b) Framework de Modelos de Tipos de componentes; c) Modelo de Aplicação do Framework, baseado nos Modelos de Tipo de componentes; e d) Modelos de Interações representados pelos diagramas de seqüência, baseado nos Modelos de Casos de Uso. Estes modelos são utilizados no próximo passo do padrão, para obter o projeto interno dos componentes. 4.3 Projetar Componentes Neste passo, o engenheiro de software faz o projeto interno dos componentes, conforme o terceiro nível de Catalysis. Agora, os detalhes de implementação são importantes, destacando-se: segurança, persistência, arquitetura distribuída e a linguagem de implementação. Como passo inicial, refina-se o Modelo de Tipos em Modelos de Classes de componentes, onde são modeladas as classes, e seus relacionamentos, preocupando-se com a definição dos componentes com suas interfaces, conforme mostra a Figura 7. Os Modelos de Interações, representados pelas técnicas dos diagramas de seqüência são refinados para mostrar detalhes de projeto dos comportamentos dos métodos dos em cada classe. 179 Figura 7 – Modelo de Classes obtido do Modelo de Tipos. A partir do Modelo de Classes, pode-se construir o Modelo de Componentes [3, 8, 12], que mostra a organização e a dependência entre os componentes. O Modelo de Componentes pode reutilizar componentes de outros frameworks já existentes. Assim, podem ser reutilizados componentes de domínios relacionados com requisitos não funcionais, como, por exemplo, para criação de interfaces (GUI) [10], persistência em Banco de Dados (Persistencia) [10, 19, 23] e distribuição de componentes (Broker) [1, 10]. A Figura 8 mostra o Modelo de Componentes obtido do Modelo de Classes da Figura 7, fazendo reuso dos componentes dos frameworks GUI, Persistencia e Broker. Figura 8 – Modelo de Componentes. A utilização de Padrões de Projeto do Catálogo de Gamma [10], Abstract Factory, Factory Method, e Singleton, na construção dos componentes, pode aumentar a sua reutilização. A Figura 9 mostra, por exemplo, os componentes do framework GUI. O componente AbstractToolkit permite criar componentes básicos de widgets, como frames, textfields, labels, botões, e demais elementos que compõem a interface do usuário. Para melhor visualização das interfaces, existem, ainda, outros widgets que compõem a interface do usuário, como: combobox, panel, e textarea que não aparecem na figura, assim como os componentes da biblioteca swing [11] do Java. Os componentes LinToolkit e WinToolkit 180 implementam os métodos definidos pelo componente AbstractToolkit para as plataformas Linux e Windows, respectivamente, mantendo a portabilidade da aplicação para diferentes ambientes. O framework GUI dispõe, ainda, de interfaces para cada tipo de widget, como: IFrame, ITextField, ILabel, e IButton. Os componentes WinFrame, LinFrame, WinTextField, LinTextField, WinLabel, LinLabel, WinButton, e LinButton implementam os widgets, conforme a plataforma de execução da interface. Figura 9 – Framework GUI. Da mesma forma, têm-se os componentes dos demais frameworks, como no caso do framework Persistencia, que suporta a persistência das informações em banco de dados relacional. Baseia-se nos padrões de Projeto do Catálogo de Gamma, Singleton, Facade e outros, como PersistentObject [10, 23] e ObjectPool [10, 23]. A Figura 10 mostra componentes do framework Persistencia. O componente ConnectionPool, através de sua interface IConnectionPool, faz a gerência e conexão com o banco de dados utilizado na aplicação. O componente DriversUtil, com base em definições eXtensible Markup Language (XML) [22], contém as informações do banco de dados disponibilizadas, através de sua interface IDriverUtil. O componente TableManager gerencia o mapeamento de um objeto para tabelas do banco de dados, disponibilizando seus métodos pela interface ITableManager. O componente persistente da estrutura FacadePersistent, através de sua interface IPersistentObject, disponibiliza os valores que devem ser adicionados ao banco de dados, passando parâmetros ao componente TableManager. Figura 10 – Framework Persistencia. Os componentes do framework Broker utilizam o Padrão Distributed Adapters Pattern (DAP) [1] para comunicação remota entre dois componentes. A técnica adotada pelo DAP 181 para oferecer esta funcionalidade é introduzir um par de componentes adaptadores, visando conseguir um melhor desacoplamento dos componentes dentro de uma arquitetura distribuída. Os adaptadores, basicamente, encapsulam a API, necessária para permitir o acesso remoto, para componentes Targets. Deste modo, componentes Sources de uma aplicação possuem autonomia em relação à camada de distribuição, e as mudanças nesta camada não causam impactos. A Figura 11 mostra a estrutura do framework Broker. Os componentes Source e Target abstraem regras de negócio, do domínio de um problema. A interface TargetInterface abstrai o comportamento do componente Target em um cenário distribuído. Tanto esta interface, como os componentes, Source e Target, não possuem código de comunicação. Estes três elementos constituem uma camada independente de distribuição. Os principais componentes do framework Broker são SourceAdapter e TargetAdapter. Estes elementos estão conectados a uma específica API de distribuição e encapsulam os detalhes de comunicação. SourceAdapter é um adaptador que isola o componente Source do código de distribuição. Reside na mesma máquina que o Source e trabalha como um proxy para o TargetAdapter. TargetAdapter reside em outra máquina, isolando o componente Target do código de distribuição. SourceAdapter e TargetAdapter, usualmente, residem em máquinas diferentes, e não interagem diretamente. TargetAdapter implementa a RemoteInterface usada para conectar com SourceAdapter. O componente Initializer reside na mesma máquina que os componentes Target e TargetAdapter, e é responsável pela criação dos componentes TargetAdapter e Target [1]. Figura 11 – Estrutura do Framework Broker. A Figura 12 resume os principais artefatos e a seqüência de atividades do passo Projetar Componentes, que incluem: a) Refinamento dos Modelos de Tipos em Modelos de Classes; b) Refinamento dos Modelos de Interações; e c) Criação dos Modelos de Componentes, com reutilização de componentes já disponíveis. Figura 12 – Terceiro passo do Padrão: Projetar Componentes. 182 4.4. Implementar Componentes Por último, após o projeto dos componentes, o engenheiro de software determina, na MVCase, que se faça a geração automática do código dos stubs e skeletons, e interfaces dos componentes. A Figura 13 mostra parte dos componentes projetados do Domínio Ordem de Serviços, e os respectivos códigos em IDL e Java gerados. A geração do código é feita com o utilitário idlj, nativo do Java Development Kit (JDK), disponibilizado na ferramenta. Figura 13 – Quarto passo do Padrão: Implementar Componentes. Resumindo, as principais atividades do passo Implementar Componentes, realizada pelo engenheiro de software, na ferramenta MVCase, incluem a geração dos códigos IDL e Java dos componentes distribuídos. 5. Consequências O Padrão de Desenvolvimento de Software Baseado em Componentes Distribuídos oferece os seguintes benefícios: • Modularidade: o Padrão permite separar os aspectos de distribuição, interface e persistência em banco de dados; • Reutilização: através dos aspectos de modularidade oferecidos com a divisão em camadas, os desenvolvedores podem reutilizar os componentes para diversas aplicações do domínio construído, diminuindo a redundância de código; • Automação Parcial: com o suporte da ferramenta MVCase, grande parte das atividades propostas no padrão podem ser executadas de forma automática. Mesmo com as vantagens listadas acima, as seguintes desvantagens podem ser apresentadas: • Incremental número de classes [1]: com a utilização do padrão DAP, usa-se um par de adaptadores, componentes de inicialização e nomeação que são necessários; de qualquer modo, estas estruturas podem ser geradas através da automação parcial, utilizando a ferramenta MVCase; • Conhecimento de outras tecnologias: com o uso do framework Persistencia, o engenheiro de software necessita conhecer tecnologias, como o XML, para definição das informações referentes aos sistemas gerenciadores de banco de dados, como porta de conexão, nome do usuário, senha, e outros. 183 6. Implementação Para suportar o padrão proposto para DBC Distribuídos, são utilizados diferentes métodos, técnicas e ferramentas, apresentados a seguir. 6.1 Método Catalysis O padrão baseia-se no método Catalysis [5, 8] para DBC, que é executado em três níveis: Definição do Domínio do Problema, onde é dada ênfase no entendimento do problema, especificando-se “o quê” o sistema deve atender para solucionar o problema; Especificação dos Componentes, onde é descrito o comportamento do sistema de uma forma não ambígua; e, Projeto Interno dos Componentes, onde define-se como serão implementados os requisitos especificados para os componentes. Catalysis fundamenta-se nos princípios de abstração, precisão e componentes “plugin”. O princípio abstração orienta o desenvolvedor na busca dos aspectos essenciais do sistema, dispensando detalhes que não são relevantes para o contexto do sistema. O princípio precisão tem como objetivo descobrir erros e inconsistências na modelagem e o princípio componentes “plug-in” suporta o reuso de componentes para construir outros sistemas. 6.2 Common Object Request Broker Architecture (CORBA) No DBC é necessário estabelecer uma relação formal entre os componentes e a aplicação que os utiliza, por meio de interfaces bem definidas. Para atender a este requisito, o padrão de DBC Distribuídos baseia-se na arquitetura CORBA [1, 6, 14], que é um padrão estabelecido pela Object Management Group (OMG) para suporte a objetos distribuídos. CORBA apresenta interfaces bem definidas e independentes de aplicações, através da Interface Definition Language (IDL), que se encaixa perfeitamente no contexto de DBC. Outros aspectos que motivaram o uso do CORBA foram: a independência de linguagem de programação, devido ao mapeamento da IDL para diversas linguagens; a portabilidade entre ambientes computacionais; e os serviços de Segurança, Nomeação e Notificação, oferecidos pela especificação. 6.3 Frameworks e Padrões Para especificar e construir componentes de software mais seguros, confiáveis, fáceis de manter e de utilizar, o DBC emprega técnicas de frameworks, baseados em Padrões [10, 12]. Framework é um conjunto de classes relacionadas, que fazem reuso de um projeto para classes específicas de software [10]. A utilização de padrões em sistemas complexos de softwares permite que soluções previamente testadas sejam reutilizadas, tornando o sistema mais compreensível, flexível, fácil de desenvolver e de manter. O objetivo do uso de padrões de software é a disseminação das soluções de desenvolvimento de software já existentes. O uso de padrões na construção de frameworks objetiva torná-los ainda mais flexíveis, e, principalmente, facilitar a reutilização dos componentes no desenvolvimento das aplicações. 6.4 Ferramenta MVCase Ferramentas CASE têm sido empregadas, com sucesso, no projeto ou reprojeto de sistemas a serem reconstruídos. Dentre as ferramentas CASE, destaca-se a MVCase [15], que suporta a especificação do sistema em linguagens de modelagem orientadas a objetos, gera código, automaticamente, em uma linguagem de programação orientada a objetos, a partir das especificações em alto nível, usando componentes distribuídos especificados em IDL. A MVCase utiliza uma arquitetura em três camadas para construção de componentes. As três camadas permitem que o engenheiro de software separe as aplicações clientes das 184 regras de negócio, e dos serviços de armazenamento em banco de dados, ou outro meio de armazenamento. Os componentes destas camadas podem ser distribuídos em diferentes plataformas, suportando aplicações cliente-servidor, que podem ser executadas pela internet. 7. Exemplo de Aplicação do Padrão Uma vez construídos, os componentes podem ser reutilizados pelas aplicações do domínio. A Figura 14 mostra os passos para o desenvolvimento das aplicações. Parte-se dos requisitos da aplicação e segue-se o ciclo de vida normal de desenvolvimento, que compreende: Especificar Aplicação, Projetar Aplicação, Implementar Aplicação e Testar Aplicação. As principais diferenças do ciclo de vida normal do software estão na reutilização dos componentes previamente construídos e na distribuição de objetos, baseado na arquitetura CORBA. Figura 14- Desenvolvimento de aplicações usando Componentes. Para melhor compreensão, o desenvolvimento será instanciado para uma aplicação que registra uma ordem de serviço, do domínio Ordem de Serviço (OS), cujos componentes foram construídos. 7.1 Especificar Aplicação Este passo tem inicio com o entendimento do problema, identificando-se os requisitos da aplicação. Antes de iniciar a especificação dos requisitos da aplicação, na MVCase, o engenheiro de software importa os componentes do domínio do problema, no caso OS, que serão reutilizados pela aplicação. Em seguida, o engenheiro de software especifica os requisitos em Diagramas de Casos de Uso e de Seqüência. A Figura 15 mostra o Caso de Uso RegistrarOrdemServico e o Diagrama de Seqüência do seu curso normal. 185 Figura 15 – Diagrama de Caso de Uso e Seqüência. Continuando a modelagem, o engenheiro de software especifica o modelo de classes da aplicação. No caso, foi criada a classe FrameRegistrarOrdemServico, que reutiliza os serviços dos componentes do domínio OS. A Figura 16 mostra quatro componentes (sombreados), reutilizados na aplicação Registrar Ordem de Serviço. Figura 16 – Componentes reutilizados para Aplicação Registrar Ordem de Serviço. 7.2 Projetar Aplicação As especificações do passo anterior são refinadas pelo engenheiro de software para obter o projeto da aplicação. Neste passo, são especificados os requisitos não funcionais, relacionados com: segurança da aplicação, arquitetura distribuída, linguagem de implementação, e outros. A Figura 17 mostra o diagrama de componentes do projeto da aplicação, onde foram adicionados os componentes DriversUtil, ConnectionPool, FacadePersistent e TableManager para tratar o acesso a banco de dados e os componentes OrdemServicoSourceAdapter, 186 TargetOrdemServico, Initializer e OrdemServicoTargetAdapter para tratar a distribuição dos objetos. Figura 17 – Projeto da Aplicação. 7.3 Implementar Aplicação Com base no projeto da aplicação, o engenheiro de software utiliza o gerador de código da MVCase para fazer sua implementação. A Figura 18 mostra parte do código gerado para a aplicação Registrar Ordem de Serviço. Figura 18 – Implementação da Aplicação Registrar Ordem de Serviço. Após a implementação da aplicação, o engenheiro de software passa para o último passo, que consiste em testar a aplicação. 187 7.4 Testar Aplicação Neste passo, o engenheiro de software realiza os testes com a aplicação, para verificar se a mesma atende aos requisitos especificados. Os testes ficam facilitados, considerando que os componentes reutilizados já foram previamente testados. A Figura 19 mostra o ambiente de execução e teste da aplicação, utilizando os pacotes de componentes GUI, Broker, Persistencia e OS numa arquitetura distribuída cliente e servidor. Figura 19 – Teste da Aplicação de Ordem de Serviço. A aplicação pode ser executada em diferentes sistemas operacionais e CPUs, e os resultados das execuções são analisados pelo engenheiro de software, para verificar se atendem aos requisitos da aplicação. Estes resultados fornecem um feedback para os passos anteriores, orientando as correções. 8. Padrões Relacionados • • • • Abstract Factory, Factory Method e Singleton. O framework GUI é implementado usando os padrões de projeto [9] Abstract Factory, Factory Method e Singleton. Broker e Trader. O Broker [4] e o Trader [4] são padrões arquiteturais com o principal objetivo de permitir mecanismos de distribuição específicos, como empacotamentos de parâmetros e protocolos de mensagens. DAP usa estes padrões e provê um alto nível de abstração, com transparência de API de distribuição para ambos, clientes e servidores [1]. Wrapper-Facade [18] e DAP possuem objetivos comuns de minimizar variações no código das aplicações com mudanças de plataformas. De qualquer modo, Wrapper-Facade encapsula existentes APIs não orientadas a objetos (como sockets, threads), enquanto DAP encapsula APIs de distribuição orientada a objetos, como RMI (Remote Method Invocation) [20] e CORBA. Facade, PersistentObject e ObjectPool. O framework Persistencia é implementado usando os padrões de projeto Singleton e Facade, e, padrões para persistência em banco de dados [20], como PersistentObject e ObjectPool. 188 9. Agradecimentos Os autores gostariam de agradecer ao Shepherd Dr. Jugurta Lisboa Filho pelas criticas e sugestões recebidas durante o andamento deste processo. 10. Referências [1] ALVES, V., BORBA, P. Distributed Adapters Pattern: A Design Pattern for Object-Oriented Distributed Applications, I Conferência Latino Americana em Linguagens de Padrões para Programação. Rio de Janeiro 2001. [2] BEM-NATAN, R. CORBA A Guide to the Common Object Request Broker Architecture. Mc-Graw-Hill, 1995. [3] BOOCH, G. UML Guia do Usuário. Editora Campus, 2000. [4] BUSCHMANN, F., MEUNIER, R., ROHNERT, H., SOMMERLAD, P., STAL, M. Pattern Oriented Software Architecture: A System of Patterns. John Wiley & Sons, 1996. [5] CATALYSIS. Catalysis Enterprise Components with UML. Disponível: site URL: http://www.catalysis.org. Consultado em 10/08/2001. [6] CORBA. The Common Object Request Broker: Architecture and Specification. Disponível: site OMG (1996). URL: http://www.omg.org. Consultado em 10/04/2001. [7] COOL:GEN. Ferramenta Cool:Gen. Disponível: site URL: http://cai.com/acq/sterling. Consultado em 10/07/2001. [8] D’SOUZA, D.; WILLS, A. Objects, Components and Frameworks with UML – The Catalysis Approach. USA:Addison Wesley, 1998. [9] ERWIN. Ferramenta Erwin. Disponível: site URL: http://www.cai.com. Consultado em 10/07/2001. [10] GAMMA, E. et al. Design Patterns. Elements of Reusable Object-Oriented Software. Ed. Addison-Wesley. USA.1995. [11] HORSTMANN, S, C. Core Java2 Volume2-Advanced Features. Sun Microsystems Hal 1999. [12] LARMAN, C. Utilizando UML e Padrões. Prentice Hall , Inc, 1999. [13] NETSCAPE. Introduction to SSL. Disponível site DevEdge OnLine (1998). URL: http://developer.netscape.com/docs/manuals/security/sslin/index.htm. Consultado em 02/05/2001. [14] ORFALI, R., HARKEY, D. Client/Server Programming with Java and CORBA. John Wiley & Sons, Second Edition, 1998. [15] LUCRÉDIO, D., PRADO, A. F. Ferramenta MVCASE – Estágio Atual: Especificação, Projeto e Construção de Componentes, XV Simpósio Brasileiro de Engenharia de Software, Sessão de Ferramentas. Outubro de 2001. [16] PRESSMAN, R. S. Software Engineering: A Practitioner's Approach. 5th Edition, june 2000. [17] ROSE. Ferramenta Rational Rose. Disponível: site URL: http://www.rational.com. Consultado em 10/07/2001. [18] SCHMIDT, D., STAL, M., ROHNERT, H., BUSCHMANN, F. Pattern Oriented Software Architecture. John Wiley & Sons, 1996. [19] SOBRAL, D. Framework para Comércio Eletrônico Mediado por Agentes de Software. Dissertação de Mestrado. DC UFSCar fevereiro de 2002. [20] SUN. RMI Specification. Disponível: site URL: http://www.sun.com/products/jdk/rmi/index.html. Consultado em 10/01/2002. [21] WERNER, C.M.L., BRAGA, R. M.M. Desenvolvimento Baseado em Componentes. XIV Simpósio Brasileiro de Engenharia de Software SBES2000 – Minicursos e Tutoriais – pg. 297-329 – 2-6 de Outubro, 2000. 189 [22] XML. Extensible Markup Language (XML) 1.0 Second Edition. Disponível: site URL: http://www.w3.org/TR/2000/REC-xml-2000-10-06. Consultado em 10/07/2001. [23] YODER, J.W., JOHNSON, R.E., WILSON, Q.D. – Connecting Business Objects to Relational Databases. In: Conference on the PLOP, 5, Monticello-IL, EUA. Proceedings 1998. 190