1 RODISON DOS SANTOS FERREIRA UMA APLICAÇÃO PRÁTICA DE UML PARA SISTEMAS J2EE Trabalho de Conclusão de Curso apresentado ao Curso de Bacharelado em Sistemas de Informação da Universidade Federal de Santa Catarina como requisito parcial para obtenção do grau de bacharel em Sistemas de Informação Orientador: Prof. Raul Sidnei Wazlawick, Dr. Florianópolis 2004 2 RODISON DOS SANTOS FERREIRA UMA APLICAÇÃO PRÁTICA DE UML PARA SISTEMAS J2EE Florianópolis, 14 de junho de 2004 BANCA EXAMINADORA ______________________________ Prof. Raul Sidnei Wazlawick Universidade Federal de Santa Catarina Orientador _______________________________ ______________________________ Prof. José Eduardo De Lucca Prof. Frank Augusto Siqueira Universidade Federal de Santa Catarina Universidade Federal de Santa Catarina 3 AGRADECIMENTOS Agradeço primeiramente à minha família, por todo o apoio que me deram e por terem sempre me mostrado o caminho certo para o meu crescimento. Agradeço aos meus amigos por toda a força e diversão proporcionada quando eu precisava, e por saber que eu sempre posso contar com eles para qualquer coisa. Agradeço aos meus professores que me ensinaram não só suas matérias, mas também um pouco do que é a vida. E, por fim, agradeço à Universidade Federal de Santa Catarina por me possibilitar aprender tudo o que eu aprendi até hoje. 4 SUMÁRIO 1. INTRODUÇÃO ..................................................................................................... 9 1.1. Contextualização ........................................................................................... 9 1.2. Objetivos do Trabalho ................................................................................. 11 1.2.1. Objetivo Geral ....................................................................................... 11 1.2.2. Objetivos Específicos............................................................................ 11 1.2.3. Justificativa do Trabalho ....................................................................... 12 1.2.4. Escopo .................................................................................................. 12 1.2.5. Meta ...................................................................................................... 13 2. A ARQUITETURA J2EE .................................................................................... 14 2.1. Java ............................................................................................................. 14 2.2. O Modelo de Componentes......................................................................... 15 2.3. Componentes J2EE .................................................................................... 17 2.3.1. Clientes J2EE ........................................................................................... 17 2.3.1.1. Clientes Web ......................................................................................... 17 2.3.1.2. Clientes da Aplicação ............................................................................ 17 2.3.2. Componentes JavaBeans ..................................................................... 18 2.3.3. Componentes Web ............................................................................... 18 2.3.4. Componentes de Negócios (Enterprise JavaBeans) ............................ 18 2.3.5. Servidor J2EE (Application Server)....................................................... 19 2.3.6. APIs J2EE ............................................................................................. 21 2.4. Componentes?! ........................................................................................... 22 3. UML ................................................................................................................... 23 3.1. Componentes UML versus Componentes de Software e Componentes EJBs. .......................................................................................................................... 33 4. PROPOSTAS PARA O MAPEAMENTO EJB/UML ............................................ 34 4.1. Especificação UML 1.5 – Tratamento do Mapeamento EJB/UML. .............. 36 4.2. Java Specification Request-26 – UML/EJB Mapping Specification (JSR-26) .................................................................................................................................... 38 4.3. Proposta de AHMED ................................................................................... 43 5 5. Mapeamento J2EE para UML ............................................................................ 44 5.1. Servlets ....................................................................................................... 44 5.1.1. Relacionamentos .................................................................................. 44 5.2. Páginas Web e JSPs ................................................................................... 47 5.2.1. JSPs ..................................................................................................... 47 5.2.2. Páginas Web ........................................................................................ 47 5.2.3. Relacionamentos .................................................................................. 48 5.3. Struts ........................................................................................................... 48 5.3.1. Classe ActionServlet do Struts ............................................................. 48 5.3.2. Classe Form do Struts .......................................................................... 49 5.3.3. Classe Action do Struts......................................................................... 50 5.4. EJBs ............................................................................................................ 51 5.4.1. Interfaces .............................................................................................. 51 5.4.2. Session e Entity Beans ......................................................................... 52 5.4.3. SessionBeans ....................................................................................... 52 5.4.4. EntityBeans ........................................................................................... 55 5.4.5. Relacionamentos CMR ......................................................................... 57 5.4.6. EJBs e os diagramas de interação ....................................................... 57 5.5. WebServices ............................................................................................... 59 5.5.1. Interface ................................................................................................ 60 5.5.2. Visão externa e interna do WebService ................................................ 60 5.5.3. Padrões de Nomes ............................................................................... 61 5.5.4. WebServices e os diagramas de interação ........................................... 61 Bibliografia ............................................................................................................. 63 6 Lista de Figuras Figura 1: Diagrama de Casos de Uso 24 Figura 2: Diagrama de Classes 25 Figura 3: Diagrama de classes utilizado para representar dependências entre pacotes. 26 Figura 4: Diagrama de estados 27 Figura 5: Diagrama de Atividades 28 Figura 6: Diagrama de Seqüência 29 Figura 7: Diagrama de Colaboração 30 Figura 8: Diagrama de Componentes 31 Figura 9: Diagrama de Distribuição 32 Figura 10: Exemplo de Modelagem externa e interna de um EJB segundo a especificação UML 1.5 37 Figura 11: Exemplo de uma modelagem interna de um EJB segundo a especificação UML 1.5 38 Figura 12: Exemplo de modelagem externa de EJBs segundo a JSR-26. 41 Figura 13: Exemplo de Modelagem Interna de EJBs segundo a JSR-26. 42 Figura 14: Diagrama de Distribuição de EJBs segundo a JSR-26. 42 Figura 15: Representação de um Servlet 44 Figura 16: Relacionamentos de um Servlet 44 Figura 17: Especificando parâmetros através de nota 45 Figura 18: Especificando os tipos de parâmetros 45 Figura 19: Utilização do estereótipo <<Submit>> ao invés do <<POST>> e do <<GET>>. 46 Figura 20: Relacionamento entre dois Servlets através do estereótipo <<Forward>>. 46 Figura 21: À esquerda, o ícone de uma página JSP. À direita, a representação de uma página JSP através do estereótipo <<ServerPage>>. 47 Figura 22: À esquerda, o ícone de uma página Web. À direita, a representação de uma página Web através do estereótipo <<ClientPage>>. 47 7 Figura 23: Relacionamentos entre ServerPages e ClientPages. 48 Figura 24: Representação do Action Servlet do Struts. 48 Figura 25: Página Web chamando o ActionServlet do Struts. 49 Figura 26: Representação de uma classe Form do Struts. 49 Figura 27: Classe Form do Struts sendo chamada pelo ActionServlet do Struts. 50 Figura 28: Representação da classe Action do Struts 50 Figura 29: Uma classe Action do Struts sendo chamada pelo ActionServlet do Struts. 51 Figura 30: Exemplo de representação um EJB utilizando o símbolo de subsistemas da UML. 51 Figura 31: Representação de um EJB e alguma de suas interfaces 52 Figura 32: Representação de um SessionBean 53 Figura 33: Visualização externa de um SessionBean. 53 Figura 34: Visualização interna de um SessionBean 54 Figura 35: Representação de um EntityBean. 55 Figura 36: Representação externa de um EntityBean. 55 Figura 37: Representação interna de um EntityBean 56 Figura 38: Exemplo de modelagem de relacionamentos CMR 57 Figura 39: Exemplo de diagrama de interação segundo AHMED 58 Figura 40: Exemplo de uma outra alternativa para a utilização de EJBs em diagramas de seqüência. 59 Figura 41: Exemplo de um WebService modelado como um subsistema da UML. 60 Figura 42: Representação do WebService com sua interface. 60 Figura 43: Representação da visão interna do WebService 61 Figura 44: Representação da utilização de WebServices em diagramas de interação. 62 8 Resumo FERREIRA, Rodison dos Santos. Uma Aplicação Prática de UML para Sistemas J2EE. Florianópolis, 2004. 32f. Trabalho de Conclusão de Curso (Bacharelado em Sistemas de Informação) – Curso de Bacharelado em Sistemas de Informação, UFSC, 2004. O presente trabalho busca fornecer, através de uma visão prática, uma forma de modelar sistemas baseados na arquitetura J2EE. Primeiramente, são apresentadas cada uma das três propostas de mapeamento J2EE/UML, a proposta da própria especificação da UML 1.5, a proposta da Sun Microsystems, a JSR-26 e a proposta feita por Kawar Zaman Ahmed. Além de um pouco destas três propostas, o autor ainda sugere alguns acréscimos a estas propostas, principalmente para tratar do mapeamento UML de tecnologias novas como o framework web Jakarta Struts e a tecnologia de WebServices. Todos estes conceitos são mais bem discutidos através da implementação de um sistema feito pelo autor, utilizando na prática o que é sugerido. 9 1. INTRODUÇÃO 1.1. Contextualização No início da computação existiam apenas sistemas simples, isto porque a computação naquele tempo não podia ser muito complexa devido às limitações do hardware. À medida que o tempo foi passando o hardware foi evoluindo e o software também. Com máquinas mais potentes passou a ser possível executar operações mais complexas. Com o barateamento da memória, um software já podia trabalhar com milhares de dados armazenados. E até hoje é assim, quanto mais o hardware evolui e se torna barato, mais a complexidade do software aumenta. Antigamente, um software de alto nível era aquele software desktop monousuário que era instalado no computador e que vez ou outra dava algum problema, pois se formatava o computador ou se excluía algum arquivo e o sistema deixava de funcionar; daí era necessário reinstalá-lo. Com o advento da Internet, passou a surgir a necessidade destes sistemas desktops se comunicarem com a Internet. Estes sistemas agora podiam acessar uma única base de dados através da Internet. Os sistemas evoluíram para sistemas multiusuários. Só que à medida que os sistemas evoluíram, os problemas também aumentaram. Agora era necessário lidar com acesso concorrente e distribuído, era necessário fazer controles de transação de dados, era necessário implementar uma política de segurança para o sistema para impedir que qualquer pessoa não-autorizada acessasse os dados do sistema pela Internet. O problema é que os programadores começaram a perder mais tempo se preocupando com todas estas implementações do que com a implementação das regras de negócios. E a evolução não parou por aí. Tamanha foi a integração da 10 Internet com os sistemas corporativos que hoje em dia a maior parte dos sistemas estão sendo migrados para o ambiente Web. Com o tempo, notou-se que as arquiteturas de programação existentes já não conseguiam acompanhar a evolução do software por isso surgiram arquiteturas de programação mais evoluídas como a arquitetura J2EE e o .NET. O objetivo dessas arquiteturas é fazer com que o programador não se concentre em questões de baixo nível como segurança, múltiplos acessos, acesso concorrente, transações, etc, mas sim na lógica do negócio. Com isso, pode-se tentar resolver o grande paradoxo da computação: “desenvolver sistemas cada vez mais complexos em um tempo cada vez menor”. No entanto, não bastou apenas a arquitetura de software evoluir; a forma como os sistemas são construídos, pensados também precisou mudar. Mudou o paradigma: saiu a programação estruturada e surgiu a programação orientada a objetos. Surgiu a Engenharia de Software, área responsável por estudar tudo o que é e pode ser utilizado para construir e planejar um software. Surgiu a necessidade de seguir uma metodologia de desenvolvimento de software. Várias surgiram no mercado, cada uma utilizando uma notação gráfica própria para representar classes, relacionamentos, etc. Logo, havia dezenas de notações diferentes para representar a mesma coisa. Então, os autores de três das mais importantes metodologias da área se uniram para unificar e padronizar a linguagem para representar o desenvolvimento de softwares. Assim, surgiu a UML. Porém, existem vários elementos utilizados na arquitetura J2EE que não foram muito bem pensados na especificação UML. Muitos analistas de sistemas e programadores começaram a encontrar dificuldades na hora de especificar sistemas J2EE com a UML. A própria OMG – Object Management Group, grupo responsável pela linguagem UML – começou a incluir conceitos da arquitetura J2EE na especificação da UML. A criadora da arquitetura J2EE, a SUN Microsystems, também criou um perfil da UML para mapeamento EJB/UML. Além desses dois, houve mais um grupo de autores 11 – ligados à empresa Rational, criadora da linguagem UML – que propuseram um outro perfil da UML para J2EE e sistemas Web. Felizmente, a linguagem UML é uma linguagem desenvolvida para evoluir. É possível que uma dessas propostas venha a ser a proposta oficial da linguagem. Porém, o que fazer enquanto essas propostas não são aprovadas uma vez que as empresas já estão a anos utilizando essas tecnologias? E o que fazer com as novas tecnologias utilizadas como a tecnologia Jakarta Struts? Como utilizar a UML para criar testes automatizados? Como representar tudo isto na prática, utilizando a linguagem UML para tal fim? É este o ponto que será procurado alcançar neste trabalho. 1.2. Objetivos do Trabalho 1.2.1. Objetivo Geral O objetivo geral deste trabalho é apresentar, de uma forma prática, algumas dicas para adaptar a linguagem UML à arquitetura de desenvolvimento J2EE. 1.2.2. Objetivos Específicos Estudar a arquitetura J2EE; Estudar a linguagem de modelagem de sistemas UML; Estudar as três propostas de mapeamento da arquitetura J2EE para UML; Estudar a proposta de mapeamento de sistemas Web utilizando a UML; Estudar o framework Jakarta Struts; Estudar a tecnologia de WebServices. Estudar design patterns e os J2EE design patterns; Apresentar todos os conceitos citados acima; Desenvolver uma aplicação para pôr em prática os conceitos acima; Avaliar a utilização destes conceitos em um sistema de verdade. 12 1.2.3. Justificativa do Trabalho Como analista de sistemas de uma empresa que começou a ingressar na arquitetura J2EE, percebe-se que muitos conceitos que se julgavam dominados não são totalmente compreendidos. Ao migrar para a arquitetura J2EE, sente-se a necessidade de se especificar características desta arquitetura com a linguagem UML. Porém, nota-se que a especificação UML não é suficiente, faltam algumas lacunas a serem preenchidas e isto pode prejudicar na hora de fazer a modelagem de um sistema. Além da questão do J2EE existem outras questões como a utilização de frameworks para a parte Web como o Jakarta Struts e a adoção de novas tecnologias como os WebServices no processo de desenvolvimento de um software. 1.2.4. Escopo Esta proposta não tem como fim a geração automática de código, principalmente porque seria necessário uma ferramenta que fosse integrada com a presente proposta e a ferramenta utilizada para geração de código. Ela tem como finalidade fornecer uma forma de representar o código o mais perto do real possível para que não haja colunas em branco entre o que foi modelado e o que está no código. Da mesma forma que a metodologia XP diz "teste primeiro, codifique depois", esta proposta se baseia em um incremento desta frase, no sentido de "modele primeiro, depois elabore os testes e, só por último, codifique". O objetivo da modelagem é fornecer uma visão mais clara do sistema que está sendo construído não só para os analistas, mas principalmente para os programadores, aqueles que vão tornar o projeto em realidade. Fazendo a modelagem do sistema antes de tudo, pode-se garantir que o sistema foi bem pensado e bem organizado, bem estruturado. Com a modelagem, os programadores e analistas de sistemas podem perceber onde aplicar determinado design patterns, onde são necessários tais estruturas de objetos, etc. O ideal, seria que o programador NUNCA mexesse no código sem mexer na modelagem antes. PRINCIPALMENTE na fase de manutenção do sistema, ou seja, depois que o sistema já está considerado pronto, já está rodando em produção e é 13 necessário fazer aquelas alterações "mínimas" em 1 hora. De nada adianta os programadores e os analistas fazerem a modelagem de um sistema, se depois que o sistema estiver pronto a modelagem não refletir o código e vice-versa. 1.2.5. Meta A presente proposta visa representar o mais fielmente possível o código gerado da forma mais simples possível, sem necessitar utilizar certas "burocracias" que algumas propostas sugerem para que o processo de modelagem se torne prático, completo, sem ser demorado. O desafio deste trabalho será fazer a modelagem completa de um sistema utilizando os conceitos mostrados nesta proposta. O sistema será desenvolvido utilizando ferramentas baseadas em código livre e ferramentas freeware. O objetivo é mostrar como fazer a modelagem de um sistema completo, do início até o fim, passando por todas as dificuldades de desenvolvimento, restrições de ferramentas, utilização e adaptação de tecnologias novas, etc. Para desenvolver o sistema, será utilizada uma metodologia de desenvolvimento que pode ser considerada uma mescla entre RUP, ICONIX e eXtreme Programming. OBS: O Sistema a ser desenvolvido ainda está sendo escolhido e definido. O objetivo desta primeira fase do projeto é aprender a utilizar as tecnologias que serão aqui utilizadas (EJBs, Struts, Design Patterns, Ant, JUnit, etc) e estudar as principais propostas de mapeamento J2EE/UML. 14 2. A ARQUITETURA J2EE Com o aumento da complexidade do software, surgiu a necessidade de uma arquitetura mais avançada. Segundo AHMED (1), “o J2EE, Java 2 Platform Enterprise Edition, é tal estrutura. O J2EE é uma plataforma completa para distribuir sistemas complexos. Ela aumenta o nível de abstração para a equipe de desenvolvimento oferecendo um conjunto de mecanismos (JSP, Enterprise JavaBeans, servlets) e serviços (JDBC, JMS e RMI, para citar alguns), permitindo que a equipe se concentre em seu valor comercial central em vez de construir a intra-estrutura”. Segundo BODOFF (2), “o J2EE é uma tecnologia baseada em componentes de software para projeto, desenvolvimento, montagem e implantação de aplicações comerciais. Ela apresenta um modelo de aplicação distribuída multicamada, a capacidade de reutilização de componentes, troca de dados integrada baseada na Extensible Markup Language (XML), um modelo de segurança unificado e um flexível controle de transações”. 2.1. Java O J2EE é uma das três áreas da plataforma Java. A plataforma Java é composta por uma linguagem de programação chamada Java e por uma máquina virtual, chamada Java Virtual Machine (JVMTM), onde os programas Java são executados. Para cada sistema operacional é feita uma JVM específica. Desta forma, qualquer software feito em Java é independente de plataforma. Qualquer sistema operacional (Windows, Linux, Unix, Solaris, PalmOS, celulares) que tenham um JVM instalada pode rodar programas Java. A plataforma Java se divide em três áreas: Java 2 Micro Edition (J2ME): arquitetura Java para aplicações móveis como celulares, handhelds (computadores de mão como o PalmTop TM), dispositivos 15 (MP3 Players, GPS, relógios, etc), eletrodomésticos (microondas, geladeira, etc), computadores de bordo (utilizados em carros, aviões, etc) e outras aplicações do mesmo tipo. Ela contém uma JVM reduzida para rodar aplicações simples. Java 2 Standard Edition (J2SE): arquitetura Java para aplicações tradicionais como aplicações desktop de modo console (ou terminal, ou modo texto) ou de modo gráfico (através das bibliotecas gráficas Swing, SWT, AWT, etc). Java 2 Enterprise Edition (J2EE): arquitetura Java para aplicações comerciais. Esta é a arquitetura tratada neste trabalho. 2.2. O Modelo de Componentes A tecnologia J2EE é uma tecnologia baseada em componentes. O desenvolvimento baseado em componentes oferece muitas vantagens, entre elas a reutilização de programação. Quando se vai fazer um sistema novo, ao invés de desenvolver uma classe que gera um texto PDF a partir de uma página HTML, pode-se utilizar um componente que faz essa conversão automaticamente. Dessa forma não se perde tempo “refazendo a roda”, ou seja, criando algo que alguém já criou antes. O modelo de componentes é um conceito que é utilizado na indústria automobilística, por exemplo. Se a cada vez que se fosse construir um carro fosse necessário também criar um motor, rodas, freios e todos os outros componentes que um carro contém, levaria muito tempo para se construir um carro novo e o custo de construção do carro seria muito maior. Até pouco tempo atrás, era exatamente isso que se fazia, sempre que se ia construir um software novo, tudo era criado do zero. Exatamente para evitar isso é que a indústria de software passou a utilizar o modelo de componentes. 16 Como explicitado por AHMED (1), estas são algumas vantagens do modelo de componentes: Produtividade mais alta: Menos desenvolvedores podem conseguir mais reunindo uma aplicação a partir de componentes pré-definidos e testados previamente em vez de implementar uma solução personalizada a partir do zero. Desenvolvimento rápido: Os componentes existentes podem ser reunidos rapidamente para criar novas aplicações. Qualidade mais alta: Em vez de testar as aplicações inteiras, os desenvolvedores podem se concentrar em testar a integração e a funcionalidade geral da aplicação conseguida através dos componentes pré-definidos. Manutenção mais fácil: Como os componentes são independentes, a manutenção é muito mais fácil e com um custo menor. Deve-se ressaltar, porém que é muito importante que todos os componentes utilizados estejam muito bem testados, principalmente se quem fez os componentes é a própria empresa (o que acontece hoje em dia na maior parte dos casos). Quando se compra o componente de uma outra empresa, é necessário ter garantias que o componente utilizado não contém erros. O sistema não pode correr o risco de não funcionar direito por causa de um erro de um componente de terceiros. Infelizmente ainda não há um mercado de componentes de software muito amadurecido e muito menos órgãos que fiscalizem a qualidade destes componentes. O mercado de componentes é um mercado que está marcado para crescer faz anos, mas que ainda não se manifestou com força, principalmente no Brasil. 17 2.3. Componentes J2EE A especificação J2EE define os seguintes componentes J2EE: Clientes da aplicação e applets: componentes executados no cliente; Componentes da tecnologia Java Servlet e JavaServer PagesTM (JSPTM): componentes Web executados no servidor; Componentes Enterprise JavaBean (EJB, ou enterprise beans): componentes de negócios que são executados no servidor. Há ainda o modelo de componentes JavaBeans, pertencentes à plataforma J2SE 2.3.1. Clientes J2EE Um cliente J2EE pode ser um cliente Web ou um cliente da aplicação. 2.3.1.1. Clientes Web Um cliente Web pode ser um conjunto de páginas Web dinâmicas (como páginas HTML, XML, etc) que são executadas em um navegador Web ou um conjunto de applets (mini aplicações gráficas que são executadas em um navegador Web através do Plugin Java). 2.3.1.2. Clientes da Aplicação Um cliente da aplicação é geralmente uma aplicação desktop de modo console (ou terminal, ou modo texto) ou de modo gráfico (através das bibliotecas gráficas Swing, SWT, AWT, etc). 18 2.3.2. Componentes JavaBeans Os componentes JavaBeans são na verdade classes que têm uma estrutura definida. JavaBeans são classes simples que contém atributos e métodos get e set para acessar os dados destes atributos. Eles são muito utilizados para transportar dados de objetos entre as diferentes camadas da aplicação e também para criar componentes gráficos. 2.3.3. Componentes Web Os componentes Web da arquitetura J2EE podem ser servlets ou JSPs. Os servlets são classes da linguagem de programação Java que processam dinamicamente solicitações (requests) e constroem respostas (responses). Eles ainda podem trabalhar com outros serviços como controle de sessão, redirecionamento de informação, etc. São geralmente utilizados em sistemas Web. As páginas JSP são como páginas HTML, mas elas contém trechos de código de programação embutida dentro dela. É até possível fazer programas apenas utilizando páginas JSP. 2.3.4. Componentes de Negócios (Enterprise JavaBeans) Os componentes de negócios são representados pelos Enterprise JavaBeans (EJBs). Um EJB é um conjunto de classes Java que implementam as regras de negócio de um sistema e que se comunicam com elementos externos (outras classes ou outros EJBs) através de interfaces locais (quando se acessa um EJB da mesma máquina onde ele se encontra) ou remotas (quando se acessa um EJB através da rede, de uma outras máquina). Existem três tipos de EJBs: 19 Beans de Sessão (Session Beans): Responsáveis por implementar a lógica do negócio. Beans de Entidade (Entity Beans): Responsáveis por persistir os dados da aplicação em bancos de dados, arquivos e outros meios. Beans Orientados a Mensagens (Message-Driven Beans): Responsáveis por se comunicar com serviços externos de forma assíncrona. Este trabalho se concentrará apenas nos session beans e nos entity beans. 2.3.5. Servidor J2EE (Application Server) O servidor J2EE (ou servidor de aplicações) é um servidor responsável por implementar serviços de middleware, por ser a ponte de ligação entre a programação de alto nível e a programação de baixo nível como serviços de rede, segurança, transações, etc. Todos estes serviços de baixo nível são implementados pelo servidor J2EE. Estes são alguns serviços implementados pelo servidor de aplicações: Invocação Remota de Métodos: O servidor J2EE implementa toda a conexão de rede entre cliente e servidor. Balanceamento de Carga: Os clientes são redirecionados para os servidores mais livres. Se um servidor está sobrecarregado, um diferente servidor é escolhido. Tratamento de Falhas Transparente: Se uma conexão de rede cai, ou se um servidor estraga, o próprio servidor de aplicação retoma o serviço de onde ele parou e redireciona os serviços para outro servidor ativo automaticamente. 20 Integração com o Back-End: O desenvolvedor pode configurar o servidor de aplicações para persistir os dados da aplicação em bases de dados, sistemas legados ou outros tipos de persistência. Transações: O servidor trata o acesso simultâneo às bases de dados, bem como faz o controle de erro dessas bases de dados. Clustering: Permite que os serviços, o processamento e o armazenamento sejam divididos em várias máquinas e provê serviços como espelhamento, etc. Reinstalação Dinâmica: Uma aplicação pode ser instalada, iniciada, parada ou desinstalada do servidor sem a necessidade de reiniciar o servidor para isso. Desligamento Limpo: É possível desligar o servido no entanto sem para os serviços principais utilizados pelos clientes. Logging e Auditoria: Todas as operações feitas são registradas em arquivos de log, bem como os erros do sistema. Assim é possível descobrir quem mexeu no servidor e o quê foi alterado. Gerenciamento de Sistemas: O servidor oferece ferramentas para gerenciar as aplicações que ele contém. Threading: O servidor trata o acesso de múltiplos clientes ao mesmo tempo. Orientação a Mensagens: O servidor faz todo o tratamento de enviar e receber mensagens, síncronas ou assíncronas. Ciclo de Vida de Objetos: Os objetos podem ser criados, recriados, destruídos pelo próprio servidor. 21 Pool de Recursos: O servidor pode criar e gerenciar pool de recursos, como pool de conexão ao banco de dados, de acesso aos EJBs, etc. Segurança: O servidor permite configurar toda a parte de segurança do sistema através de autenticações e autorizações a cada componente do sistema. Caching: As consultas mais feitas podem ser armazenadas no cache do servidor, otimizando assim o acesso à base de dados. 2.3.6. APIs J2EE Além de tudo isso, a arquitetura J2EE ainda apresenta as seguintes APIs: Java DataBase Connectivity (JDBC): Responsável por se comunicar com bancos de dados. Java Message Service (JMS): Responsável por enviar, receber, criar e ler mensagens. Java Naming and Directory Interface (JNDI): Serviço de nomeação e diretório. Serviço de nomes utilizados para encontrar, chamar e organizar os componentes dentro do servidor. Java Transaction API (JTA): API para controle de transações. JavaMail API: API responsável por enviar, receber, criar e ler e-mails. Java API for XML Processing (JAXP): API Java para manipular arquivos XML. Java Authentication and Authorization Service (JAAS): API de segurança, autenticação e autorização de usuários. 22 2.4. Componentes?! Segundo FRANK (3), componentes de software são “unidades funcionais de software que executam uma atividade bem definida no sistema, produzidos e implantados independentementes, distribuídos em código binário, combinados para compor aplicações, configurados de acordo com a necessidade do usuário, que podem ser facilmente atualizados e reutilizados e que podem ser criados usando métodos, técnicas e ferramentas de desenvolvimento padronizados”. A tecnologia J2EE se diz ser baseada em componentes. No entanto, um componente de software deveria ser independente de linguagem, ou seja, um componente J2EE poderia ser inserido em um sistema .NET sem nenhum problema e o inverso também deveria ser verdadeiro. Porém, a especificação de componentes EJBs versão 2.1 prevê a inclusão de uma implementação de interfaces de EJBs baseada no modelo de WebServices. Com isso, um EJB poderá ser realmente denomidado um componente, pois através de uma interface WebService qualquer aplicação (não importa a linguagem com a qual ela foi escrita) poderá acessar os serviços de um componentes EJB. 23 3. UML A Unified Modelling Language (UML) é uma linguagem gráfica utilizada para fazer a modelagem e para auxiliar o desenvolvimento de sistemas. A UML não é uma metodologia de desenvolvimento. Ela é apenas uma linguagem gráfica para representar elementos utilizados em um sistema como classes, objetos, pacotes, relações como agregação, herança, etc. A UML surgiu da união de três metodologias existentes: a metodologia Booch (de Grady Booch), a metodologia OOSE (de Ivar Jacobson) e o OMT (de James Rumbaugh). Estes três autores juntos se uniram na empresa Rational Software Corporation (atualmente comprada pela IBM) e criaram a linguagem UML. A especificação UML indica no total oito diagramas utilizados: 24 Diagrama de Caso de Uso: o diagrama de caso de uso mostra os casos de uso, os atores e suas relações. Figura 1: Diagrama de Casos de Uso 25 Diagrama de Classe: diagrama que mostra as classes, seus atributos e métodos, interfaces, pacotes, subsistemas e suas relações um com o outro. Figura 2: Diagrama de Classes 26 Figura 3: Diagrama de classes utilizado para representar dependências entre pacotes. 27 Diagrama de Gráfico de Estados: capturam o comportamento dinâmico do sistema. Mostra todos os estados pelos quais o sistema pode passar e qual evento ocasiona a mudança de estados. Pode ser aplicado ao sistema, a um conjunto de entidades ou a uma classe específica. Figura 4: Diagrama de estados 28 Diagrama de Atividades: é uma extensão do gráfico de estados e é muito parecido com um fluxograma. Serve para mostrar todos os passos do sistema de forma seqüencial ou em paralelo. Também pode ser aplicado ao sistema, a um conjunto de entidades ou a uma classe específica. Também pode ser utilizado para descrever o fluxo de um caso de uso. Figura 5: Diagrama de Atividades 29 Diagramas de Interação: são utilizados para modelar o comportamento dinâmico do sistema. Existem dois tipos de diagramas de interação: o Diagrama de Seqüência: utilizado para modelar a troca de mensagens entre objetos, ou entre o sistema e o mundo externo. Captura a ordem das mensagens trocadas em relação com o tempo. Figura 6: Diagrama de Seqüência 30 o Diagrama de Colaboração: modela a troca de mensagens entre objetos mostrando as relações estruturais entre eles. Figura 7: Diagrama de Colaboração 31 Diagrama de Componentes: representa a manifestação física de uma parte do sistema, como um arquivo, um executável, etc. Figura 8: Diagrama de Componentes 32 Diagrama de Distribuição: representa a arquitetura do sistema. Mostra os servidores, a parte de hardware, os componentes instalados, etc. Figura 9: Diagrama de Distribuição 33 3.1. Componentes UML versus Componentes de Software e Componentes EJBs. Componentes de software, como já citado, são unidades de software que executam uma atividade bem definida no sistema. São exemplos de componentes os EJBs, componentes COM, ActiveX, etc. Geralmente são formados por conjuntos de classes que os implementam. Para a UML, no início, componentes eram manifestações físicas do sistema como arquivos .class, arquivos executáveis, arquivos de empacotamento como os arquivos .JAR, etc, que eram acessíveis através de interfaces. Antigamente a UML não previa uma arquitetura de componentes como os componentes EJBs e isso causou um impasse entre os desenvolvedores de software: “poderiam os componentes UML serem utilizados para representar componentes EJBs?”. O principal problema é que não há uma forma adequada, na UML, de desmembrar um componente em um conjunto de classes. Também não há como ligar um componente a uma classe. Dessa forma, de acordo com a especificação da UML 1.5 proposta pela OMG (6), fica muito difícil fazer uma modelagem mostrando as relações com os componentes EJBs e as classes que se relacionam com eles. Com a versão 2.0 da UML (a próxima versão da linguagem UML a ser lançada), espera-se que o modelo de componentes da UML comece a refletir melhor os conceitos dos componentes EJBs. 34 4. PROPOSTAS PARA O MAPEAMENTO EJB/UML Segundo AHMED (1), existem alguns desafios a serem tratados na hora de fazer um mapeamento da arquitetura J2EE utilizando UML: Um componente EJB implementa métodos comerciais na interface Remote, mas não a interface em si. Isso é contrário ao conceito UML de realização da interface. Um EJB está relacionado com uma interface Remote e Home. É necessário que um modelador UML respeite de modo consistente esse padrão de arquitetura. Os servlets, os EJBs e outros itens da arquitetura contém arquivos descritores da distribuição associados. Diferente da maioria das outras classes Java, os EJBs, servlets e JSPs são enviados em um tipo específico de arquivo de armazenamento (arquivos .JAR, .WAR e .EAR) juntamente com seus descritores de distribuição. Os atributos do componente de entidade mapeia os elementos em um banco de dados. Os EJBs têm a noção de transações e segurança. Os EJBs da sessão podem ter potencialmente um comportamento dinâmico significante. Esquemas permanentes podem ser distribuídos pelos componentes da entidade. 35 Os JSPs são logicamente um híbrido no sentido de que têm aspectos do cliente e do servidor. Além desses desafios, poderia se dizer que existem mais alguns: Hoje em dia, muitas empresas não estão mais utilizando o modelo Servlets/JSP puro. Muitos estão utilizando frameworks de apresentação de dados na parte Web. O principal deles é o framework Jakarta Struts. O Struts é um framework que liga páginas JSP à classes de controle de dados da interface, como classes de validação de dados e classes que modelam as ações que serão feitas pelo usuários na página Web. Tais ligações entre classes de controle do Struts e páginas JSP precisam ser mapeadas. Com o advento do processo de desenvolvimento eXtreme Programming (XP), os desenvolvedores passaram a adotar o paradigma de “teste primeiro, codifique depois”, ou seja, primeiro o desenvolvedor deve elaborar todos os testes que devem ser feitos para só depois de elaborados os testes, começar a codificar o sistema. Atualmente, a UML não sugere nenhum artifício para ajudar a criar testes de unidade e testes de validação. A UML não fornece uma sintaxe específica para representar design patterns e os design patterns da arquitetura J2EE (J2EE Design Patterns). Para suprir uma parte destas necessidades, surgiram no mercado três propostas para o mapeamento J2EE/UML: a proposta apresentada pela OMG na própria especificação UML 1.5, a proposta apresentada pela SUN Microsystems com a Java Specification Request-26 – UML/EJB Mapping Specification (JSR-26) e a proposta apresentada por AHMED (1). 36 4.1. Especificação UML 1.5 – Tratamento do Mapeamento EJB/UML. A especificação UML 1.5 apresentam algumas sugestões para o mapeamento EJB/UML: Componentes EJBs devem ser mapeados com o símbolo de componentes da UML e representados no diagrama de componentes da UML. As interfaces Home e Remote devem ser representadas como interfaces do componente. As ligações entre componentes devem ser representadas através de relações de dependências. Dentro do componente, podem ser representados as classes que compõe o componente EJB. A classe Bean do componente EJB deve ser representado com o estereótipo <<focus>> dentro do componente. Classes utilizadas pelos EJBs – como as classes de chaves primárias de um entity bean ou classes auxiliares – devem ser representadas com o estereótipo <<auxiliary>> dentro do componente. O arquivo de empacotamento do componente EJB (um arquivo EJB-JAR, por exemplo) deve ser representado como uma classe dentro do componente com o estereótipo <<file>>. 37 O problema desta representação são os mesmos falados anteriormente, ou seja, não há como ligar classes ou entidades Web aos componentes, não há como representar uma classe completa (com seus atributos e métodos) em um diagrama de componentes e mais, não há a sugestão de nomenclaturas mais específicas para os componentes EJBs (qual é o estereótipo para um entity bean com persistência CMP? Ou um session bean stateless?). Estes e outros defeitos desta proposta fez com que muitos desenvolvedores não se sentissem à vontade para utilizá-la. Por isso, surgiu a necessidade de outras propostas para este mapeamento. Exemplos de modelagem EJB segundo a especificação UML 1.5: Figura 10: Exemplo de Modelagem externa e interna de um EJB segundo a especificação UML 1.5 38 Figura 11: Exemplo de uma modelagem interna de um EJB segundo a especificação UML 1.5 4.2. Java Specification Request-26 – UML/EJB Mapping Specification (JSR-26) A JSR é uma proposta feita pela SUN Microsystems (empresa criadora da plataforma JAVA e da arquitetura J2EE) para fazer um mapeamento mais completo de EJBs com a UML. Para isso, ela sugere que seja criado um perfil específico da UML para EJBs. Um perfil da UML é uma extensão da gramática UML para representar casos específicos. Existem atualmente vários perfis já aprovados pela OMG, tais como o perfil UML para Modelagem de Negócios e o perfil UML para processo de desenvolvimento de software. 39 Este perfil, sugere a adoção de alguns estereótipos, como: <<JavaInterface>>: Indica a interface de uma classe Java padrão. <<EJBCreateMethod>>: Indica um método EJB Create. <<EJBFinderMethod>>: Indica um método EJB Finder. <<EJBRemoteMethod>>: Indica um método EJB Remoto. <<EJBRemoteInterface>>: Indica que a classe é uma Interface Remota EJB. <<EJBSessionHomeInterface>>: Indica que a classe representa um EJB Session Home. <<EJBEntityHomeInterface>>: Indica que a classe representa um EJB Entity Home. <<EJBPrimaryKey>>: Indica que a classe é uma classe EJB Primary Key, utilizada em um entity bean. <<EJBRealizeHome>>: Indica que a classe bean realiza uma interface Home. <<EJBRealizeRemote>>: Indica que a classe bean realiza uma interface Remote. <<EJBImplementation>>: Indica que a classe é a classe de implementação do EJB, é uma classe bean. <<EJBEnterpriseBean>>: Indica que o componente é um EJB. 40 <<EJBSessionBean>>: Indica que o componente é um Sesion Bean. <<EJBEntityBean>>: Indica que o componente é um Entity Bean. <<JavaClassFile>>: Indica que o elemento é um arquivo .class. <<JavaArchiveFile>>: Indica que o elemento é um arquivo de empacotamento “.jar”. <<EJB-JAR>>: Indica que o elemento é um arquivo de empacotamento “ejb-jar”. <<EJBDescriptor>>: Indica que o elemento é um arquivo de descrição (um arquivo deployment descriptor). <<EJBClientJAR>>: Indica que o elemento é um arquivo de empacotamento “ejbclient-jar”. Além destes estereótipos, o perfil EJB/UML sugere a adoção dos seguintes valores marcados (tagged values): EJBSessionType: Aceita os valores Stateful ou Stateless. Valor marcado que indica se um EJB Session Bean é um session stateful ou stateless. EJBTransType: Aceita os valores Bean ou Container. Indica se o método de persistência de um EJB Session Bean é gerenciado pelo próprio EJB ou se é gerenciado pelo contêiner. EJBPersistenceType: Aceita os valores Bean ou Container. Indica se o EJB Entity Bean é um entity BMP (persistência gerenciada pelo próprio EJB) ou se é um entity CMP (persistência gerenciada pelo contêiner). 41 Neste perfil EJB/UML, os EJBs não são representados com o símbolo de componentes da UML, mas sim com o símbolo de subsistemas da UML. Exemplos de modelagem de EJBs segundo a JSR-26: Figura 12: Exemplo de modelagem externa de EJBs segundo a JSR-26. 42 Figura 13: Exemplo de Modelagem Interna de EJBs segundo a JSR-26. Figura 14: Diagrama de Distribuição de EJBs segundo a JSR-26. 43 4.3. Proposta de AHMED AHMED (1) apresenta uma proposta de mapeamento EJB/UML baseado na proposta da Sun, a JSR-26. No entanto, esta proposta inclui mais alguns detalhes ausentes na especificação JSR-26, como: A utilização de diagramas de robustez para a modelagem dos EJB segundo a arquitetura MVC. A utilização do perfil de mapeamento UML/Web proposto por Jim Conallen. A aplicação dos estereótipos <<WebArchiveFile>> (representa um arquivo de empacotamento .WAR), <<EnterpriseArchiveFile>> (representa um arquivo de empacotamento .EAR), <<ApplicationServer>> <<WebServer>> (representa um navegador Web), (representa um servidor de aplicações) e <<DataBaseServer>> (representa um servidor de banco de dados). Esta é a proposta na qual se baseará este trabalho. Toda a descrição desta proposta será demonstrada na prática com o desenvolvimento da aplicação de exemplo sugerida por este autor. 44 5. MAPEAMENTO J2EE PARA UML 5.1. Servlets Os Servlets podem ser representados através do estereótipo <<HTTPServlet>>. Figura 15: Representação de um Servlet 5.1.1. Relacionamentos Existem duas formas de se chamar um Servlet, através de um método POST ou GET. Logo, quando uma página web, uma classe, um EJB ou outro servlet acessa um servlet, essa representação pode ser expressa com o estereótipo <<POST>> ou <<GET>>. Figura 16: Relacionamentos de um Servlet Quando são passadas variáveis para o servlet (seja argumentos na própria URL no caso de GETs - ou através de atributos setados na sessão, pode-se expressar estes parâmetros através de uma nota: 45 Figura 17: Especificando parâmetros através de nota Pode-se ainda especificar o tipo do atributo através dos seguintes estereótipos: <<HTTPSessionVariable>> : Para atributos setados na sessão. <<HTTPRequestVariable>> : Para atributos setados no Request. <<URLVariable>> : Para variáveis setadas pela URL. <<HTTPContextVariable>> : Para variáveis setadas no Contexto. Exemplo: Figura 18: Especificando os tipos de parâmetros 46 Em um diagrama de classes, se uma classe se relaciona com o Servlet através de GETs e POSTs, pode-se utilizar uma ação genérica para representar esse relacionamento através do estereótipo <<Submit>>. Figura 19: Utilização do estereótipo <<Submit>> ao invés do <<POST>> e do <<GET>>. Após a sua execução, normalmente o Servlet redireciona para outro Servlet ou para uma Página Web. Esse relacionamento é dado pelo estereótipo <<Forward>>. Figura 20: Relacionamento entre dois Servlets através do estereótipo <<Forward>>. 47 5.2. Páginas Web e JSPs 5.2.1. JSPs Uma página JSP é denominada ServerPage. Um ServerPage tem um ícone próprio de representação ou pode ser representado também pelo estereótipo <<ServerPage>>. Figura 21: À esquerda, o ícone de uma página JSP. À direita, a representação de uma página JSP através do estereótipo <<ServerPage>>. 5.2.2. Páginas Web Uma página Web é denominada ClientPage. Um ClientPage também tem um ícone próprio de representação ou pode ser representado pelo estereótipo <<ClientPage>>. Figura 22: À esquerda, o ícone de uma página Web. À direita, a representação de uma página Web através do estereótipo <<ClientPage>>. 48 5.2.3. Relacionamentos Um ClientPage ou um ServerPage podem se comunicar com outras páginas. Esse relacionamento é expresso através do estereótipo <<Link>>. Figura 23: Relacionamentos entre ServerPages e ClientPages. 5.3. Struts Uma página simples utilizando Struts é composta pela página JSP, por uma classe ActionServlet, uma classe Form e uma classe Action. 5.3.1. Classe ActionServlet do Struts O ActionServlet é na verdade um Servlet responsável pelo controle MVC do Struts. O ActionServlet recebe uma requisição de uma página Web e repassa essa requisição para o Form e para o Action. O ActionServlet pode ser representado através do estereótipo <<StrutsActionServlet>>. Figura 24: Representação do Action Servlet do Struts. 49 A chamada de uma página para um ActionServlet é representada através do estereótipo <<submit>>. Figura 25: Página Web chamando o ActionServlet do Struts. 5.3.2. Classe Form do Struts A classe Form do Struts é utilizada para fazer a validação dos dados passados pela página JSP. Esta classe pode ser representada através do estereótipo <<StrutsForm>>. Figura 26: Representação de uma classe Form do Struts. A chamada de um Struts Form por um Struts Action Servlet é representada através do estereótipo <<Forward>>. 50 Figura 27: Classe Form do Struts sendo chamada pelo ActionServlet do Struts. 5.3.3. Classe Action do Struts A classe Action do Struts é utilizada para executar as ações esperadas a partir da chamada da página JSP. É nesta classe Action que estará o código a ser executado. Esta classe Action pode criar novos objetos, chamar um EJB, etc. Esta classe pode ser representada com o estereótipo <<StrutsAction>>. Figura 28: Representação da classe Action do Struts A chamada de um Struts Action por um Struts ActionServlet é representada também através do estereótipo <<Forward>>. 51 Figura 29: Uma classe Action do Struts sendo chamada pelo ActionServlet do Struts. 5.4. EJBs Tanto a proposta de AHMED (1) quanto a proposta da JSR-26 (7) utilizam subsistemas de UML para representar EJBs. Esta parece ser realmente a melhor alternativa para esta representação devido às limitações do símbolo de componentes da UML conforme visto anteriormente. Figura 30: Exemplo de representação um EJB utilizando o símbolo de subsistemas da UML. 5.4.1. Interfaces Um EJB deve ser mostrado juntamente com suas interfaces. Existem quatro tipos de interfaces para um EJB: a interface Home Remota, a interface Remota, a interface 52 Home Local e a interface Local. Estas interfaces podem ser representadas através dos seguintes estereótipos: <<EJBRemoteHomeInterface>> : representa a interface Home Remota; <<EJBRemoteInterface>> : representa a interface Remota; <<EJBLocalHomeInterface>> : representa a interface Home Local; <<EJBLocalInterface>> : representa a interface Local. Figura 31: Representação de um EJB e alguma de suas interfaces 5.4.2. Session e Entity Beans Esta proposta se concentra em dois tipos de EJB, os SessionBeans e os EntityBeans. 5.4.3. SessionBeans Os SessionBeans podem ser representados <<EJBSessionBean>> no símbolo de subsistema. através do estereótipo 53 Figura 32: Representação de um SessionBean Externamente, os session beans podem ser representados da seguinte maneira: Figura 33: Visualização externa de um SessionBean. Internamente, os SessionBeans podem ser representados de uma maneira semelhante à visualização mostrada acima. Porém, deve ser mostrada também a classe de implementação do EJB. Esta classe é representada com o estereótipo <<EJBImplementation>>. 54 Figura 34: Visualização interna de um SessionBean Para a representação de um EJB, foram adotados os seguintes padrões de nomes: - Nome do EJB: [nome da classe] + EJB. Exemplo: ShoppingCartEJB - Nome da interface Home Remota: [nome da classe] + Home. Exemplo: ShoppingCartHome - Nome da interface Remota: [nome da classe]. Exemplo: ShoppingCart - Nome da interface Home Local: [nome da classe] + LocalHome. Exemplo: ShoppingCartLocalHome - Nome da interface Local: [nome da classe] + Local. Exemplo: ShoppingCartLocal - Nome da classe de implementação do EJB: [nome da classe] + Bean. Exemplo: ShoppingCartBean 55 Um SessionBean pode ser um SessionBean Stateless ou Stateful. No caso, essa informação pode ser representada através do valor marcado EJBSessionType. {EJBSessionType = Stateful} : quando o Session é Stateful {EJBSessionType = Stateless} : quando o Session é Stateless 5.4.4. EntityBeans Os EntityBeans podem ser representados através do estereótipo <<EJBEntityBean>> no símbolo de subsistema. Figura 35: Representação de um EntityBean. Externamente, os session beans podem ser representados da seguinte maneira: Figura 36: Representação externa de um EntityBean. 56 Internamente, os EntityBeans contém uma classe a mais que os SessionBeans. Além da classe de implementação do Bean, os EntityBeans ainda podem ter uma classe para definir a chave primária do EJB. Esta classe pode representada através do estereótipo <<EJBPrimaryKey>>. Para esta classe também foi adotado um padrão de nome: - Nome da classe de chave primária: [nome da classe] + PK. Exemplo: CustomerOrderPK. Assim, internamente os EntityBeans podem ser representados da seguinte maneira: Figura 37: Representação interna de um EntityBean Um EntityBean pode ter dois tipos de persistência, a persistência gerenciada pelo bean, ou Bean Managed Persistence (BMP), ou persistência gerenciada pelo Contêiner, ou Container Managed Persistence (CMP). Essa informação pode ser representada através do valor marcado EJBPersistenceType. 57 {EJBPersistenceType = Bean} : quando o Entity tem persistência BMP {EJBPersistenceType = Container} : quando o Entity tem persistência CMP. 5.4.5. Relacionamentos CMR Quando um EntityBean é do tipo CMP, é possível fazer relacionamentos entre os EntityBeans simulando os relacionamentos das tabelas do banco de dados que elas representam. Este relacionamento é chamado de CMR (Container Managed Relashionship). Estes relacionamentos podem ser expressos através de um diagrama de classes, fazendo eles como se fosse a modelagem de dados de uma base de dados relacional. Figura 38: Exemplo de modelagem de relacionamentos CMR 5.4.6. EJBs e os diagramas de interação A especificação JSR-26 (7) não traz nenhuma informação sobre como os EJBs podem ser representados em um diagrama de interação. Já AHMED (1) apresenta a seguinte proposta: 58 Figura 39: Exemplo de diagrama de interação segundo AHMED A desvantagem desta proposta é que são necessários muitos objetos no diagrama representando as interfaces. Além do que, segundo esta proposta, temos uma interface (no caso a classe Control) que acessa outra interface. Na verdade é o EJB que acessa a outra interface. Por isso, sugere-se que em um diagrama de interação não seja mostrada as interfaces do EJB, mas sim o próprio EJB. Para cada mensagem enviada deve mostrar qual a interface utilizada segundo o padrão abaixo: <<EJBRemoteInterface>> : representa uma mensagem enviada a um método da interface Remota; <<EJBLocalInterface>> : representa uma mensagem enviada a um método da interface Local. <<EJBRemoteCreateMethod>> : representa uma mensagem executando o método create da interface Home Remota; 59 <<EJBLocalCreateMethod>> : representa uma mensagem executando o método create da interface Home Local; <<EJBRemoteFinderMethod>> : representa uma mensagem executando um método Finder da interface Home Remota; <<EJBLocalFinderMethod>> : representa uma mensagem executando um método Finder da interface Home Local; Figura 40: Exemplo de uma outra alternativa para a utilização de EJBs em diagramas de seqüência. 5.5. WebServices Quando se vai criar um WebService, geralmente são necessárias duas classes: uma interface e uma classe de implementação do WebService. Nesse sentido, ele tem um comportamento muito parecido com um EJB pois a classe de implementação do WebService não mostra no código a realização da interface; esse relacionamento é definido através de arquivos XML. Por isso, os WebServices também podem ser representados como um subsistemas de UML. Um WebService pode ser representado através do estereótipo <<WebService>>. 60 Figura 41: Exemplo de um WebService modelado como um subsistema da UML. 5.5.1. Interface Um WebService sempre deve ser mostrado em um diagrama de classes com a sua interface. A interface do WebService define quais os métodos que serão disponibilizados no WebService, quais os parâmetros e o que retorna este método. A interface do WebService pode ser representada através do estereótipo <<WebServiceInterface>>. Figura 42: Representação do WebService com sua interface. 5.5.2. Visão externa e interna do WebService A figura acima mostra a visão externa de um WebService. Na visão interna, é necessário mostrar a classe de implementação do WebService. A classe de implementação do WebService pode ser representada através do estereótipo <<WebServiceImplementation>>. 61 Figura 43: Representação da visão interna do WebService 5.5.3. Padrões de Nomes Para representar um WebService, foi utilizado o seguinte padrão de nomes: - Nome do WebService: [nome do WebService] + WS. Exemplo: StringProcessorWS - Nome da Interface: [nome do Webservice]. Exemplo: StringProcessor - Nome da Classe de Implementação: [nome do WebService] + Impl. Exemplo: StringProcessorImpl 5.5.4. WebServices e os diagramas de interação Em um diagrama de interação (da mesma forma que os EJBs), é mostrado apenas o WebService sem as suas interfaces. 62 Em um cliente do WebService, é necessário primeiramente obter a referência do WebService. Esta ação pode ser representada através do estereótipo <<WebServiceCreate>>. Figura 44: Representação da utilização de WebServices em diagramas de interação. 63 BIBLIOGRAFIA 1.AHMED, Khawar Zaman. UMRYSH, Cary E. Desenvolvendo Aplicações Comerciais em Java com J2EETM e UML. Rio de Janeiro: Editora Ciência Moderna Ltda., 2002. 2.BODOFF, Stephanie. GREEN, Dale. &. Tutorial do J2EETM. Rio de Janeiro: Editora Campus, 2002. 3.FRANK, Augusto Siqueira. INE 5612, Desenvolvimento de Sistemas Orientados a Objetos II. Unidade I, Introdução à Tecnologia de Componentes. Florianópolis, 2002. <http://www.inf.ufsc.br/~frank>> 4.BOOCH, Grady. RUMBAUGH, James. JACOBSON, Ivar. UML, Guia do Usuário. Rio de Janeiro: Editora Campus, 2000. 5.ROMAN, Ed. AMBLER, Scott. JEWELL, Tyler. Mastering Enterprise JavaBeansTM. Second Edition. USA: The Middleware Company, 2002. 6.OMG. OMG Unified Modeling Language Specification. Versão 1.5. USA: OMG, 2003. <<http://www.omg.org/technology/documents/formal/uml.htm>> 7.GREENFIELD, Jack. UML Profile for EJB. USA: Rational Software Corporation, 2001. <<http://jcp.org/aboutJava/communityprocess/review/jsr026/>>