Integração de Tecnologias UML – CORBA - Java A Convergência das Tecnologias Tutorial por José Eduardo Zindel Deboni Voxxel Consultoria de Sistemas Objetivos do Tutorial Observando que tudo esta orientado a objetos Análise/Modelagem……….UML Projeto…………………….UML e CORBA Implementação……………IDL e Java Analisar como o desenvolvimento de sistemas pode tirar vantagens da integração de tecnologias Estudar através de um exemplo como a UML pode integrar-se a CORBA e Java O que é um Tutorial ? Verbete: tutorial 2. Diz-se da modalidade de ensino exercido por tutor (4). Verbete: tutor [Do latim: tutore.] 4. Aluno designado como professor de outros alunos, em formas alternativas de ensino. Fonte: Dicionário Aurélio em CD-ROM V.1.4 Os sistemas atuais são… … complexos Negócios estão cada vez mais complexos Integração de mercados, globalização Competitividade crescente … feitos para a internet Confiabilidade: o negócio depende do sistema e_bussiness: O negócio é o sistema … distribuídos em n camadas Especialização de cada atividade do sistema Facilidade de manutenção e portabilidade e_business: O negócio é a rede A arquitetura de n camadas Camada de Apresentação Camada de Negócios Camada de Dados Corba/iiop Corba/iiop objetos ok Corba/iiop Http/cgi HTMLs CGIs webserver RDBMS OODBMS Arquivos Convergência para objetos Análise e Modelagem UML Projeto e Arquitetura Implementação CORBA Java Lente convergente Da Orientação a Objetos Tecnologias Orientadas a Objeto Linguagem de Modelagem Orientada a Objetos UML – Unified Modeling Language Arquitetura de Aplicações de Objetos Distribuidos CORBA – Common Object Request Broker Architecture Ambiente flexível e portável para desenvolvimento Java (Aplicações, Applets, Servlets, JDBC, Swing, RMI, EJB…) Como fica a Engenharia de Software? É necessário fazer Engenharia de Software? É possivel se fazer Engenharia do Software? Integrar :Analise – Projeto - Implementação Projetar a solução antes de construir Criar uma “planta” do software Utilizar um método para desenvolvimento de sistemas Simular, prever resultados antes da construção Como desenvolver em tempo de internet? Com agregar as novas tecnologias disponíveis? Respostas: Sim, é indispensável usar as técnicas da Eng. de Software, para atender à complexidade e garantir confiabilidade às soluções distribuidas. Sim, é possível realizar a Eng. de Software porque tudo esta Orientado a Objetos. Modelagem Orientada a Objetos (UML) Arquitetura de Objetos distribuidos (CORBA) Implementação para internet (Java) Novas questões: Como integrar estas novas tecnologias com os métodos de Engenharia de Software? Como integrar a UML (analise/projeto) com CORBA (Arquitetura da solução) e com Java (implementação) serm perder as vantagens individuais de cada uma A UML é capaz de modelar e dar uma visão completa do todo tão heterogêneo? Abordagem Analisar a UML e a sua integração com Java e CORBA Propor um método para o trabalho em conjunto destas tecnologias Exemplificar a integração Integração entre as tecnologias Dominio do Problema UML Analise e Projeto CORBA Arquitetura da Solucao Java Ambiente de Implementacao O que é a UML? UML Unified Modeling Language É uma linguagem de modelagem de sistemas É orientada a objetos É padronizada pela OMG É suportada por diversas ferramentas CASE Ainda é pouco difundida, e utilizada Seqüência de diagramas* Casos de Uso Comportamento Externo Comportamento interno Estrutura Implementação Eventos Colaboração Atividades Classes Componentes Estados Pacotes Distribuição * esta seqüência não faz parte da UML é apenas uma sugestão Casos de Uso Descreve os cenários de interação Identifica elementos externos Caracteriza os objetivos de cada um com o sistema Um Ator se comunica com Casos de Uso Define-se a fronteira do sistema Diagramas de Casos de Uso Sistema Fazer Pedidos Vendedor Cliente Aprovar Crédito Entregar Material Gerente Diagramas de Classes Estrutura das partes que formam o sistema Expõe os componentes internos Estabelece as relações entre as classes É um diagrama estrutural estático e não dinâmico Possui uma relação direta com a estrutura dos códigos Exemplos de representação Pessoa Pessoa Pessoa nome: Texto idade: inteiro cadastrar() {abstrata, autor=JEDeboni} +nome: Texto #RG : inteiro +casado : boolean=false +cadastra() +criar(RG:inteiro) Modelo de Classes Usuarios Nome Local 1 Telefone Senha FazReserva Consultar 1 Empréstimo 1 DataEmpréstimo DataRetorno ATRASO Novo Materiais Codigo Assunto 1 Titulo Autor Emprestar Devolver Reservas DataReserva DataValidade Criar Cancelar Livros Editora Edição ISBN MostraDetalhes Diagramas de Interação Diagramas de Seqüência de Eventos Diagramas de Colaboração As classes se comunicam pelos métodos Descreve a troca de mensagens Mostra a dinâmica observável entre as classes Uma mensagem se da pela invocação de um método de outra classe e pela passagem de parâmetros Diagrama de seqüência de eventos Diagrama de Estados [DataReserva<Hoje] Disponível Reservado Devolver [AvisarGerente] Retornar Emprestar Retornar [ExisteReserva] Emprestado Devolver [ExisteReserva] /AvisarUsuario Emprestar [DataEmprestimo>Hoje] /AvisarUsuário Atrasado Diagramas de Implementação Descrição dos componentes de software que formam o sistema e a arquitetura de hardware Diagramas de Componentes Diagramas de Distribuição Diagrama de Componentes GUI Libs BancoDeDados Diagrama de Dsitribuição Servidor:Host1 Impressora Cliente:PC Integração da implementação Cliente:PC GUI Libs Servidor:Unix BancoDeDados Pacotes Agrupam os objetos interfaces Classes Aulixiares Classes de Negócio Classes Persistentes (Banco de Dados) Pode-se usar para identificar as camadas Integração entre os diagramas Mapeamento de um URL www.empresa.com.br \horas\ <<pagina>> index http://www.empresa.com.br/aplic/horas/index.html Integração entre as tecnologias Dominio do Problema UML Analise e Projeto CORBA Arquitetura da Solucao Java Ambiente de Implementacao Modelo UML de sistemas Java Representação gráfica dos sistemas Visão do todo, integrada e coerente Permite uma visão sistêmica Facilita o entendimento da arquitetura Permite esconde os detalhes do código durante a visão da arquitetura UML + Java uma união vantajosa para os dois UML e Java – ida e volta Geração de Código Tradução dos diagramas em código Java Os diagramas de classe geram estruturas Java Engenharia Reversa Gerar modelo com base em código Java Identificar classes, componentes e relações Mapeamento em uma classe java Funcionario nome telefone ativo novo public class Funcionario { private String nome = ""; private int telefone = 0; private boolean ativo = false; public } } void novo () { Mapeamento de uma Applet java Applet {abstract} Funcionario {final} -nome:String -telefone:int -ativo:boolean +novo( ):void import java.applet.*; import java.awt.*; public class Funcionario extends Applet { private String nome = ""; private int telefone = 0; private boolean ativo = false; public } } void novo () { Exemplo de diagrama de estado INIT fechar [teclaOK()==true] /BD.fechar() iniciar [teste1==true] /modifica=false EditandoItens editar [teclaEdit()==true] /BD.abrir() fechar [TeclaCancel()==true] /BD.fechar( ListandoItens fechar [teclaCancel=true] /BD.fechar() CLOSE Código do diagrama de estado class DEMO { private String currentState = "INIT" ; //States: INIT, CLOSE, ListandoItens, EditandoItens //Events: nullEvent, iniciar, fechar, editar void process ( String anEvent ) { if ( ( currentState == "INIT" ) && ( anEvent == "iniciar" ) && ( teste1==true ) ) { currentState = "ListandoItens" ; modifica=false return; } if ( ( currentState == "ListandoItens" ) && ( anEvent == "fechar" ) && ( teclaCancel=true ) ) { currentState = "CLOSE" ; BD.fechar() return; } if ( ( currentState == "ListandoItens" ) && ( anEvent == "editar" ) && ( teclaEdit()==true ) ) { currentState = "EditandoItens" ; BD.abrir() return; } … else return; } } Métodos para relacionar classes Interfaces Uma descrição do que deve ser feito, sem se preocupar com a implementação Herança Trasferir para uma classe filha os métodos, atributos e relacionamentos da classe mãe Composição Criar uma instância de uma classe para poder utilizar os serviços que ela dispõe Interface UML, Java ou CORBA Permite descrever como deve ser uma classe sem dizer como ela deve ser implementada. Uma classe com assinaturas de operações Uso: integrar análise/projeto e sistemas Pode usada para representar o resultado da análise, A análise define as assinaturas das operações, No projeto as assinaturas serão implementadas As classes devem implementar as interfaces Interfaces UML e Java ClasseModelo public +criar(String):void public } public interface ClasseModelo { void criar (String p1); class impClasse implements ClasseModelo{ public void criar (String p) { // // aqui devem ser inserido o código // do método // <<implementa>> impClasse +criar(String):void } } Herança classeMae public class classeFilha extends classeMae { } classeFilha Toda a funcionalidade da mãe é Transferida para a classe filha como Se fosse dela. Agregação public { Recursos class ClasseA +funcao( ):void private Recursos oRec = new Recursos() ; 1 } oRec A ClasseA agora dispões dos recursos da classe Recursos atraves da instância oRec A classe de Recursos deve estar diponível ClasseA 1 Todas as opções juntas Recursos ClasseModelo +funcao( ):void +criar(String):void 1 oRec <<implementa>> minhaClasse 1 public class minhaClasse extends classeMae implements ClasseModelo { private Recursos oRec = new Recursos() ; } classeMae Integração entre as tecnologias Dominio do Problema UML Analise e Projeto CORBA Arquitetura da Solucao Java Ambiente de Implementacao O que é a tecnologia CORBA? CORBA Common Object Request Broker Architecture Uma camada de software que distribui objetos Oferece uma série de serviços de objeto É padonizada pela OMG IDL - Interface Definition Language Padrão para definição dos Serviços dos objetos Linguagem semelhate ao C Portabilidade para Java, C++, Delphi, VB etc.. Permite integração entre sistemas heterogêneos. Integração Cliente/Servidor Invoca método () no objeto Z IDL Objeto Z método() IDL Requisições de Objeto ORB – barramento de objetos Object Request Broker Os serviços são distribuidos na forma de Objetos em um barramento CORBA algumas características Invocação estática Os parâmetros podem ser conhecidos Invocação dinâmica Os parâmetros podem ser “descobertos” Escalabilidade Criação de uma rede de serviços intergalática Segurança, Transparência e Controle Serviços disponíveis pela arquitetura Coexistência com sistemas atuais (legados) Anatomia do CORBA 2.0 interface Servico Cliente _SKELTON _STUB ORB BOA IIOP - Internet InterORB Protocol A UML modela as interfaces Account A linguagem IDL suporta Os princípios da Orientação a Objetos float balance makeDeposit makeWithdrawal Exemplo de interface IDL Account float balance makeDeposit makeWithdrawal // IDL interface Account { //Attributes attribute float balance; readonly attribute string owner; //Operations void makeDeposit(in float amount, out float newBalance); void makeWithdrawal(in float amount, out float newBalance); }; A interface IDL faz a ligação Cliente IDL compiler Cliente Stub Interface IDL Compilador em linguagem nativa Server Stub Servidor idl2java Cliente InterfaceHolder.java InterfaceHelper.java _st_Interface Interface.idl idl2java _sk_Interface _InterfaceImplBase.java Interface.java Servidor _exemplo_Interface.java Distribuição da aplicação org.omg.CORBA.ORB org.omg.CORBA.ORB org.omg.CORBA.Object Interface.java _InterfaceImplBase.java Cliente ImplementacaoInterface.java Servidor Passos para a criação de Ling. Nativa Cria aplicação Cliente 7 9 6 8 ORB Cliente Stub 1 Definiçãodas Interfaces IDL 2 Implementação dos métodos (ling. nativa) 4 3 Servidor Server Stub 5 CORBA e UML O modelo da analise recebe elementos da arquitetura da solução na fase de projeto Os modelos devem ser trabalhados para refletir a arquitetura do projeto O resultado da análise deve ser preservado nas manipulações do projeto CORBA e Java O uso de Java na Arquitetura CORBA ... ... Dá mobilidade de código portabilidade ... Facilita a ida do CORBA para a WEB ... Permite a construção de Agentes ... Permite a integração do mundo OO Java “concorre” com CORBA no RMI e EJB (alternativas semelhantes) Metodo para desenvolvimento Análise Modelo Codigo Servidor Java/outras Negócio Interface IDL ORB Cliente Java/outras Servidor Web Projeto Modelagem UML/CORBA Implementação CORBA/Java Browser Seqüência de passos Análise interface Projeto Servico Cliente _SKELTON _STUB Implementação ORB BOA IIOP - Internet InterORB Protocol Apresentação do Problema Levantar o problema a ser resolvido O que ? Porque? e não da implementação Como? Trabalho do Especialista da Aplicação e do Engenheiro de Software CASOS DE USO Análise Entendimento do problema Modelagem Conceitual Modelo de Casos de Uso Modelo se Eventos Modelo Conceitual de Classes Produtos da análise. Analise Desenvolver Modelos em um CASE Com a UML (Linguagem padronizada) Representar o sistema (problema) Criar um Modelo de Interfaces Projeto Aplicação de alguns padrões de projeto. Modelagem da arquitetura Componentização do sistema Definir a Interfaces do negócio (IDL) Definir a camada de apresentação (IHM) Definir a camada de persistência (BD) Projeto Integrar a arquitetura CORBA ao modelo Proposta de componentes e distribuição Integração com Java em alto nível Definição da estrutura das classes Criar Classes de Implementação das Interfaces, Aplicar patterns e manipular o modelo de análise Relacionar (herança, implementação ou composição) com as classes da arquitetura e da linguagem de programação Implementação Contrução dos componentes de negócio IDL2Java Construção dos códigos do servidor Integração com serviço de Banco de Dados Teste local Construção da Interface Homem Máquina Integração com ORB Implementação Programas Java Geração de Códigos Criação dos componentes e dos programas Gerar código dos modelos Complementar os códigos com programação Fazer a Engenharia Reversa para atualizar os modelos Resumo do Método Análise Criar um Modelo de Interfaces do problema Projeto Criar Classes de Implementação das Interfaces, Relacionar as classes com a arquitetura Aplicar patterns e manipular o modelo de projeto Implementação Gerar código dos modelos Complementar os códigos com programação Fazer a Engenharia Reversa para atualizar os modelos Importância de um CASE CASE – Computer-Aided Software Engineering Funções Principais Facilidade de Uso, interface gráfica amigável Aderência à UML, sem mudanças proprietárias Integração entre os diagramas Teste (cheklist) dos diagramas Geração de Relatórios (textos e gráficos) Geração de Código (linguagens OO, BD) Engenharia Reversa Repositório de Modelos e Objetos Controle de Versão (integração com software 3o) Exemplo de Aplicação Demonstrar que a UML é capaz de ajudar na modelagem e projeto de aplicações distribuidas pela tecnologia CORBA Receita … Aplicação Local (UML <> Java) Projetar uma aplicação local com UML Gerar o código Java do projeto UML Construir a aplicação em Java Executar a aplicação local Fazer a atualização do modelo UML Aplicação Distribuída (UML <> CORBA <> Java) Distribuir a aplicação com CORBA no modelo UML Construir os elementos auxiliares CORBA Construir os novos códigos em Java Executar a aplicação distribuída Visitem nossa cozinha… Ambiente de Desenvolvimento Ferramenta CASE Ambiente Java (jdk) Editor Java Banco de Dados (opcional) ORB com suporte Java (idl2java) Ambiente de Processamento Navegador Internet (se for executar uma Applet) Servidor CORBA (ORB) Ferramenta CASE Produtos do Mercado, Shareware, Demos Rational Rose (www.rational.com) System Architect (www.choose.com.br) WithCLASS (www.microgold.com) ToghetherJ Exemplo de Ferramenta CASE Ambiente Java JDK1.1.X (JDK1.1.5) JDK1.2, JDK 1.3, … Visual Café (Symantec) Jbuilder (Imprise) Visual Age (IBM) FreeJava (RealJ) Editor Java Ferramentas CASE WithCLASS 99 JDK 1.1.5 (com jdbc) FreeJava 3.0 (RealJ) – editor Java shareware JBuilder (opcional para o projeto gráfico) Ambiente de rede - execução VisiBroker for Java 3.1 VisiBroker Naming Service fo Java 3.0 Internet Explorer 5.0 Windows 98 Arquitetura Servidor Cliente Desenvolvedor navegador Servidor WEB Servidor ORB Servidor BD CASE Ambiente Desenv. Bibliotecas O prato principal… Sistema para consulta em uma lista de telefones Diagrama de Caso de Uso ConsultarTelefone Usuario O usuário entra com um nome e consulta o telefone de uma lista de telefones armazenada em um arquivo Diagrama de Classes (inicial) Usuario Lista 1 1 +procura( ) Diagrama de seqüência de eventos Usuario Lista procura(nome) Modelo de estados do Usuario Fechar EntrandoNome OK Procurando Modelo de Classes final Usuario Lista consulta -procura( String):String 1 lis oUsuario 1 +lis:Lista +l:Label +b:Button +t:TextField +main( String):void +oUsuario( ) +handleEvent( Event):boolean +action( Event, Object):boolean aLista +procura( String):String Diagrama de Implementação Usuario Lista lista.txt Exemplo da apresentação Código da aplicação import java.io.*; public class aLista implements Lista{ public String procura(String texto){ String linha,alinha="não encontrei :"+texto; try { FileInputStream is = new FileInputStream("lista.txt"); DataInputStream ds = new DataInputStream(is); while ((linha = ds.readLine())!=null) { if(linha.indexOf(texto)!=-1) alinha=linha; } ds.close(); is.close(); } catch (IOException e) { System.out.println("Erro: "+e); } return(alinha);} } Aplicação distribuida SERVIDOR Li sta l i sta.txt CLIENTE Usuari o Tradução da interface para IDL Lista -procura( string ):string Código gerado pelo CASE interface Lista{ string procura(in string texto); }; Pré-compilador idl2java Cliente InterfaceHolder.java InterfaceHelper.java _st_Interface Interface.idl idl2java _sk_Interface _InterfaceImplBase.java Interface.java Servidor Interface.java Usuario {interface} Lista {interface} +procura( java.lang.String):java.lang.String oUsuario +lis:Lista {static} +l:Label +b:Button +t:TextField +orb:org.omg.CORBA.ORB {static} _ListaImplBase -__ids:java.lang.String[] {array} #_ListaImplBase {abstract} #_ListaImplBase{constructor} +_ids:java.lang.String[] +_methods:org.omg.CORBA.portable.MethodPointer[] +_execute:boolean +_execute:boolean {static} +main( String):void {static} +Usuario( ){constructor} +handleEvent( Event):boolean +action( Event, Object):boolean 1 aLista -aLista( String){constructor} +procura( String):String 1 l 1 ListaServer +l:aLista {static} +orb:org.omg.CORBA.ORB {static} +boa:org.omg.CORBA.BOA {static} +main( String):void {static} 1 org.omg.CORBA.Object {abstract} 1 boa 1 org.omg.CORBA.BOA {abstract} org.omg.CORBA.ORB {abstract} 1 orb Classes analise (UML) Classes CORBA Classes de implementação Java 1 orb Interface Lista.java (gerada) public interface Lista extends org.omg.CORBA.Object { /** <p> Operation: <b>::Lista::procura</b>. <pre> string procura( in string texto ); </pre> </p> */ public java.lang.String procura( java.lang.String texto ); } A interface Lista Deve ser traduzida para IDL Pre compilada pelo idl2java _ListaImplBase Lista {interface} aLista A implementação da interface Deve herdar da classe gerada pelo idl2java _ListaImplBase Lista {interface} aLista public class aLista extends _ListaImplBase{ Criar uma aplicação servidora public static void main(String args[]){ try { // inicializa o ORB orb = org.omg.CORBA.ORB.init(args,null); // inicializa o BOA boa = orb.BOA_init(); // criar o objeto l = new aLista("minha lista"); // exportar o objeto criado boa.obj_is_ready(l); // Pronto para atender os pedidos boa.impl_is_ready(); } catch (org.omg.CORBA.SystemException e) { System.err.println(e); } } Inicilização do serviço ORB BOA ListaServer aLista init init new obj_is_ready impl_is_ready Usuario {interface} Lista {interface} +procura( java.lang.String):java.lang.String oUsuario +lis:Lista {static} +l:Label +b:Button +t:TextField +orb:org.omg.CORBA.ORB {static} _ListaImplBase -__ids:java.lang.String[] {array} #_ListaImplBase {abstract} #_ListaImplBase{constructor} +_ids:java.lang.String[] +_methods:org.omg.CORBA.portable.MethodPointer[] +_execute:boolean +_execute:boolean {static} +main( String):void {static} +Usuario( ){constructor} +handleEvent( Event):boolean +action( Event, Object):boolean 1 aLista -aLista( String){constructor} +procura( String):String 1 l 1 ListaServer +l:aLista {static} +orb:org.omg.CORBA.ORB {static} +boa:org.omg.CORBA.BOA {static} +main( String):void {static} 1 org.omg.CORBA.Object {abstract} 1 boa 1 org.omg.CORBA.BOA {abstract} org.omg.CORBA.ORB {abstract} 1 orb Classes analise (UML) Classes CORBA Classes de implementação Java 1 orb Classe Usuario (cliente) Deve se ligar ao ORB Deve instanciar o objeto // inicializa o orb orb = org.omg.CORBA.ORB.init(arg,null); // liga no objeto lis = ListaHelper.bind(orb, "minha lista"); Modificações na classe Usuario public class oUsuario extends Frame{ public static Lista lis; public Label l = new Label("Procura :"); public Button b = new Button("Ok"); public TextField t = new TextField(40); public static org.omg.CORBA.ORB orb; public static void main(String arg[]) { // inicializa o orb orb = org.omg.CORBA.ORB.init(arg,null); // liga no objeto lis = ListaHelper.bind(orb, "minha lista"); Usuario u = new Usuario(); ... Sequencia para execução C:> start osagent Coloca no ar o ORB e os seus serviços C:> start java –DOAid=Tsession ListaServer Coloca no ar o serviço de Lista C:> java Usuario Executa a aplicação no cliente Seqüência de execução Usuario oUsuario ORB ListaHelper :Lista aLIsta init bind OK procura(nome) procura(nome) TextField.SetText() Exemplo de resultado Leitura Recomendada UML Jacobson, I; Rumbaugh, J; Booch, G. UML: Guia do Usuário. Editora Campus, 2000. CORBA com JAVA ORFALI, R. e HARKEY, D. Client/Server Programming with Java and CORBA. 2nd Ed. John Wiley & Sons Ed. 1998. Excelente LIVRO e CD-ROM OMG www.omg.org Artigos e Documentação da UML, CORBA, IDL, etc… Conclusão Demanda crescente por Flexibilidade Desempenho Baixo custo Leva à distribuição dos negócios Padrões vão garantir os investimentos em sistemas distribuídos Dúvidas? para não perder o contato: José Eduardo Zindel Deboni [email protected] www.voxxel.com.br/deboni