Mostrando postagens com marcador JAVA-SOA. Mostrar todas as postagens
Mostrando postagens com marcador JAVA-SOA. Mostrar todas as postagens

sexta-feira, 11 de fevereiro de 2011

Aplicação SOA

Caso de Uso:

Tínhamos que buscar alguns dados de tabelas diferentes para utilizarmos em nosso aplicativo.
Para isso, fizemos um barramento SOA (que não vou postar por motivo de sigilo da empresa...) e conectamos este cliente a ele.

Problemas resolvidos com este código:
Swing: Utilização de tabelas dentro de abas, sem a utilização de containers.
Popular tabelas com array bidimensional de strings

SOA: Transportar strings entre o barramento e o Cliente.


-----------------------------------------------------------------------------------------------------------------



-----------------------------------------------------------------------------------------------------------------
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.encoding.XMLType;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class Unitizacao implements ActionListener{
   
    JFrame tela = new JFrame();
    JTextField TfOdex;
    JTable tbData1, tbData2, tbData3, tbData4, tbData5;
    JTextArea area6 = new JTextArea();
       
    public static void main(String args[]){
       
        // Cria o Objeto para tirar o swing de um método static
        Unitizacao u = new Unitizacao();
        u.run();
    }
   
    public void run(){
       
        // Tenta utilizar uma biblioteca de aparencia para o Swing
        try{
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        }catch(Exception e){
            area6.setText(e.getMessage());
        }
       
        // Layout null para posicionamento manual dos itens
        tela.setLayout(null);
       
        // INÍCIO GRUPO DE OBJETOS DO CABEÇALHO
       
        // Objeto do texto Odex
        JLabel LbOdex = new JLabel("ODEX");
        // Objeto Font para ajustar o tipo, estilo e tamanho da fonte
        Font t = new Font("Arial", Font.BOLD, 20);
        // Atribuindo o Objeto Font ao Objeto do texto Odex
        LbOdex.setFont(t);
     // ajustar posição do elemento no JPanel: (coluna, linha, largura, altura)
        LbOdex.setBounds(10, 40, 60, 30);
               
        // Objeto da caixa de diálogo
        TfOdex = new JTextField("");
        // ajustar posição do elemento no JPanel: (coluna, linha, largura, altura)
        TfOdex.setBounds(80, 40, 370, 30);
               
        // Objeto do botão Consultar
        JButton consulta = new JButton("Consultar");
        consulta.setBounds(480, 40, 120, 30);
        // Adiciona o listner ao Botão
        consulta.addActionListener(this);
        // Determina o comando que o listener recebe ao clicar no Botão
        consulta.setActionCommand("consultar");
       
        // Objeto do botão Sair
        JButton sair = new JButton("Sair");
        sair.setBounds(630, 40, 120, 30);
        sair.addActionListener(this);
        sair.setActionCommand("sair");
       
        // FIM DO GRUPO DE OBJETOS DO CABEÇALHO
       
        // INÍCIO DO GRUPO DE OBJETOS DE ABAS
       
        // Cria o Objeto do conjunto de Abas
        JTabbedPane tabelaDePaineis = new JTabbedPane(JTabbedPane.TOP);
        tabelaDePaineis.setBounds(0, 100, 800, 500); 
       
        // ABA 1
        // Objeto da Aba 1
        JPanel painel01 = new JPanel(null);
       
        // Objeto da Tabela
        tbData1 = new JTable();
        tbData1.setBounds(5,5,685,360);
        tbData1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
       
        // Crio o objeto do Scroll e coloco a tabela dentro dele.
        JScrollPane sc = new JScrollPane(tbData1);
        sc.setBounds(5,5,780,430);
        // Indica que a scroll bar vertical é necessária
        sc.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        // Indica que a scroll bar horizontal é necessária
        sc.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
       
        // Adiciona a Scroll (com a tabela dentro) no objeto da primeira aba.
        painel01.add(sc);
     
        // ABA 2
        JPanel painel02 = new JPanel(null);
       
        tbData2 = new JTable();
        tbData2.setBounds(5,5,685,360);
        tbData2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
       
        JScrollPane sc2 = new JScrollPane(tbData2);
        sc2.setBounds(5,5,780,430);
        sc2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
        sc2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
               
        painel02.add(sc2);
       
        // ABA 3
       
        JPanel painel03 = new JPanel(null);
       
        tbData3 = new JTable();
        tbData3.setBounds(5,5,685,360);
        tbData3.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
       
        JScrollPane sc3 = new JScrollPane(tbData3);
        sc3.setBounds(5,5,780,430);
        sc3.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
        sc3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
               
        painel03.add(sc3);
       
        // ABA 4
       
        JPanel painel04 = new JPanel(null);
        tbData4 = new JTable();
        tbData4.setBounds(5,5,685,360);
        tbData4.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
       
        JScrollPane sc4 = new JScrollPane(tbData4);
        sc4.setBounds(5,5,780,430);
        sc4.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
        sc4.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
               
        painel04.add(sc4);
       
        // ABA 5
       
        JPanel painel05 = new JPanel(null);
        tbData5 = new JTable();
        tbData5.setBounds(5,5,685,360);
        tbData5.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
       
        JScrollPane sc5 = new JScrollPane(tbData5);
        sc5.setBounds(5,5,780,430);
        sc5.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
        sc5.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
               
        painel05.add(sc5);
       
        // ABA 6 - LOG
       
        JPanel painel06 = new JPanel(null);
       
        area6.setBounds(5,5,685,360);
         
        JScrollPane sc6 = new JScrollPane(area6);
        sc6.setBounds(5,5,780,430);
        sc6.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
        sc6.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
       
        painel06.add(sc6);
       
        // adiciona as abas no objeto de abas
        tabelaDePaineis.addTab("Informações",painel01);
        tabelaDePaineis.addTab("Detalhes",painel02);
        tabelaDePaineis.addTab("MaterialUC",painel03);
        tabelaDePaineis.addTab("MaterialCOM",painel04);
        tabelaDePaineis.addTab("Serviços",painel05);
        tabelaDePaineis.addTab("Log",painel06);
       
        // ADICIONANDO OS OBJETOS AO FRAME
       
        tela.add(LbOdex);
        tela.add(TfOdex);
        tela.add(consulta);
        tela.add(sair);
        tela.add(tabelaDePaineis);
               
        // SETANDO DETALHES DO FRAME
        tela.setTitle("Unitização"); 
        tela.setSize(800, 600);
        tela.setBounds(100,100, 800, 600);
        tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        tela.setResizable(false);
        tela.setVisible(true);   
    }
   
    public void actionPerformed(ActionEvent e){
        if(e.getActionCommand().equals("consultar")){
           
            String[][] resposta = null;
           
            // chama o método de conexão, passando o método que será invocado.
            resposta = conecta("Informacoes");
            // ajusta a tabela com o array retornado pela conexão.
            tbData1.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));
           
            resposta = conecta("Detalhes");
            tbData2.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));
           
            resposta = conecta("MaterialUC");
            tbData3.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));
           
            resposta = conecta("MaterialCOM");
            tbData4.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));
           
            resposta = conecta("Servicos");
            tbData5.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));

        }  
        if(e.getActionCommand().equals("sair")){
            System.exit(0);
        }
    }
   
    public String[][] conecta(String operacao){
       
        String[][] resposta = null;
        Service  service  = new Service();
        Call call;
        String odex = TfOdex.getText();
       
        try {

            call = (Call) service.createCall();
           
            // Atribuindo a URL do Servico
            // Importante: é necessário um serviço SOA para conexão
            call.setTargetEndpointAddress(new java.net.URL("<<INSERIR AQUI A URL DO BARRAMENTO SOA IMPLEMENTADO>>"));

            // Definindo o metodo a ser invocado
            call.setOperationName(operacao);

            // Definindo os parametros de entrada
            call.addParameter("odex", XMLType.XSD_STRING, ParameterMode.IN);

            // Definindo o tipo do parametro de retorno
            call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_ARRAY);
           
            // Invocando o servico
            resposta = (String[][]) call.invoke(new Object[] {odex});

        } catch (Exception ex) {
           
            String a = "Serviço "+operacao+" "+ex.getMessage();
            area6.setText(a);
        }
        return resposta;
    }
}

segunda-feira, 17 de janeiro de 2011

SOA TomCat-Axis


 Guia para implementação de WebServices em Container TomCat:

Introdução:

O objetivo deste guia é mostrar – passo a passo – como implementar um webService, com servidor e cliente, funcional, em ambiente TOMCAT.
Um WebService é qualquer aplicação que é dividia em cliente e servidor.
            O Servidor: É a parte do sistema responsável pelo processamento dos dados, CRUD e encaminhamento dentro da rede.
            O Cliente pode coletar (do usuário ou de outros aplicativos ou bancos), enviar e/ou receber dados do servidor e/ou apresentar os dados enviados pelo servidor (a usuários ou encaminhar a outras aplicações).
Através dos estudos de caso, notou-se que o Container Tomcat serve para publicar páginas e aplicações web, mas não possui muito suporte sobre o processamento dos serviços. Isso porque, pelo menos para JAVA, o TomCat não disponibiliza API’s necessárias para referência nas aplicações. Assim, o princípio do servidor, de processar dados, não pode ser alcançado pela falta de capacidade de interpretação de componentes necessários.
Foi aferido que existem outros Container’s que mostram mais suporte às aplicações, como o GlassFish e o JBossESB. Destes dois, em específico, o GlassFish mostrou-se o mais simples, apresentando pouco mais que as API’s básicas para uma aplicação CRUD convencionais. O Container JBossESB, por sua vez, além de suportar aplicações JAVA, estende-as com API’s específicas para implementação de barramentos web, auxiliando desde o processo de codificação (ampliando a gama de extensões suportadas pelo Eclipse com JbossTools, por exemplo), passando por automações na comunicação entre clientes e servidores chegando a oferecer até um ambiente gráfico mais eficiente para manipulação dos arquivos que participam do webService. Claro que cada facilidade apresentada por estes outros Container’s implica em tamanho maior do Container e demora significativa no tempo de execução das aplicações.

Ambiente de Trabalho:

O TomCat, sozinho, não possui capacidade de implementar webServices.
Por isso, a Apache disponibiliza um complemento chamado Axis.

Executável TomCat:

Zip com a pasta Axis:

Complemento xerces:
 
1 – Instale o TomCat normalmente;
2 – Descompacte o zip do Axis;
3 – Mova a pasta "Axis", que encontra-se dentro do diretório webapps do arquivo, para a pasta webapps do TomCat;
4 – Descompactar o zip do xerces;
5 – Mover os arquivos “xercesImpl.jar” e “xml-apis.jar” da pasta xerces para a pasta axis\lib\ (do próprio diretório Axis, descompactado anteriormente).
6 – Criar as seguintes variáveis de ambiente:
(Criar as JAVA, caso ainda não estejam criadas, também.)

AXIS_HOME=C:\axis

AXIS_LIB=%AXIS_HOME%\lib

AXISCLASSPATH=%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging- 1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\jaxrpc.jar

7 – Mover o arquivo tools.jar da pasta lib do JAVA para a pasta lib do Axis, dentro do TomCat.

8 - Pode-se testar se o ambiente está ok abrindo o navegador e digitando a seguinte URL:


Se aparecer a tela do servidor Axis, estará tudo ok.

Desenvolvimento do Servidor:

1 - Abra a IDE e crie a seguinte classe JAVA:

/*
 * Esta classe foi desenvolvida para ser referencia de teste para implementação de SOA.
 * Este é um arquivo de servidor webService.
 * Recebe duas variáveis Inteiras do cliente e devolve a soma delas para o cliente
 */

public class Calculadora {
      public int somar( int a, int b ) {
            return a + b;
      }
}

2 – Salve o arquivo do servidor;
3 – Copie o arquivo do seu contexto para a pasta:
C:\Arquivos de programas\Apache Software Foundation\Tomcat 7.0\webapps\axis\

4 – No Browser, digite a seguinte URL:

Aparecerá a seguinte tela:



Clicando no Link, você verá o arquivo WSDL:


 Agora, o servidor TomCat/Axis já possui o arquivo de comunicação pronto, aguardando o envio de dados pelo cliente.


Desenvolvimento do Cliente:

1 – Certifique-se que a IDE possui as Lib’s do Axis.
No Eclipse, para incluir as Lib’s, Basta clicar o botão direito sobre a pasta do projeto -> Propriedades.
JavaBuildPaths -> Libraries -> Add External JAR’s
Selecione todas as JAR’s da pasta LIB do Axis -> OK.

2 – Abra a IDE e crie o seguinte arquivo:

import javax.swing.*;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;

public class Cliente {
     
      public Cliente(){
           
      }
     
         private void invocaServico(String endpointURL, int mensagem1, int mensagem2){

                  int resposta = 0;
                  Service  service  = new Service();
                  Call call;

                  try {

                     call = (Call) service.createCall();
                    
                     // Atribuindo a URL do Servico
                     call.setTargetEndpointAddress(new java.net.URL(endpointURL));

                     // Definindo o metodo a ser invocado
                     call.setOperationName("somar");

                     // Definindo os parametros de entrada
                     call.addParameter("a", XMLType.XSD_INT, ParameterMode.IN);
                     call.addParameter("b", XMLType.XSD_INT, ParameterMode.IN);

                     // Definindo o tipo do parametro de retorno
                     call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);

                     // Invocando o servico
                     resposta = (Integer) call.invoke(new Object[] {mensagem1, mensagem2});

                     // Imprimindo a resposta
                     JOptionPane.showMessageDialog(null, "Servico invocado...\n" + resposta);

                  } catch (Exception ex) {
                     ex.printStackTrace();
                  }
               }
        
         public static void main(String args[]){
             args= new String[3];
             // Aqui é colocado o caminho que está indicado no arquivo WSDL.
             args[0]="http://localhost:8080/axis/Calculadora.jws?wsdl";
             args[1]="4";
             args[2]="4";
            
            
            String endpointURL = null;
            int mensagem1   = 0;
            int mensagem2   = 0;

            if (args.length < 3){
               System.out.println("Sintaxe errada. \nInforme a URL e a Mensagem");
               System.out.println("Ex: java ClientHelloWorld http://localhost:8080/axis/HelloWorld.jws \"Ola mundo\"");
               System.exit(0);
            }

            try {
               //Obtendo a URL do Servico Web
               endpointURL = args[0];

               //Obtendo a mensagem 1
               args[1] = JOptionPane.showInputDialog("Digite o primeiro fator da Soma:");
               mensagem1 = Integer.parseInt(args[1]);
              
               //Obtendo a mensagem 2
               args[2] = JOptionPane.showInputDialog("Digite o segundo fator da Soma:");
               mensagem2 = Integer.parseInt(args[2]);
              
            } catch (Exception ex) {
               ex.printStackTrace();
            }

            //Criando uma instancia da classe ClientHelloWorld
            Cliente client = new Cliente();

            //Invocando o metodo 'invocaServico'
            client.invocaServico(endpointURL, mensagem1, mensagem2);
         }
}
 
3 – Compile e Rode.


Conclusão

1 – O cliente vai solicitar dois números para o usuário;
2 – O usuário irá fornecer e clicar “OK” para cada número;
3 – O cliente irá estabelecer uma conexão através do caminho do arquivo WSDL;
3 – O cliente irá enviar dois parâmetros para o servidor: número 1 e número 2;
4 – O servidor irá receber os parâmetros, efetuar a soma e devolver o resultado;
5 – O cliente irá receber a resposta e mostrar na tela a resposta para sua solicitação.

Esta é uma aplicação básica, podendo apenas trabalhar com:
1 – Sempre precisamos ter o fonte Java disponível;
2 – A classe não pode fazer parte de nenhum pacote;
3 – Não pode utilizar outros tipos, senão os básicos do Java (primitivos, wrappers e String).

Mesmo assim, este modo de aplicação pode muito bem ser utilizada como base para vários clientes enviando e recebendo informações para um servidor com vários métodos de controle, que reenvia para os clientes corretos as informações necessárias.