Debug Remoto em Aplicação Web no NetBeans

Eu que desenvolvo aplicações web com o WI, sei como é difícil criar conectores e tentar achar os bugs no erro e acerto, utilizando System.out em todo o processo.
Uma vez estava cansando disso e resolvi achar uma maneira melhor de achar esses bugs. Uma forma rápida e fácil é utilizar o modo debug do NetBeans, porém não conseguia integrá-lo com o meu tomcat.
Após algumas pesquisa consegui achar uma solução que compartilho com vocês agora, não lembro em que site foi que achei, pois faz muito tempo.

Vamos la!!!

Crie um arquivo .bat(será por ele que vamos iniciar nosso tomcat), pode ser satartup_tomcat.bat

Abra o arquivo e cole esse código

@echo off

cd C:\Program Files\Java\jre1.6.0_06\bin\

call java.exe  -jar -Djavax.net.debug=all -Xdebug -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7001 -Duser.dir="C:\Tomcat6" -Djava.endorsed.dirs="C:\Tomcat6\common\endorsed" "C:\tomcat6\bin\bootstrap.jar" start

:end

Agora substitua os caminhos do JRE e tomcat por da sua máquina.

Agora execute o .bat que foi criado, espere inciar.

Abra o NetBeans, vá no menu Depurar e clique em Anexar Depurador, em porta coloque 7001, em host coloque localhost ou seu ip, em timeout coloque 6000, agora clique em OK e seja feliz, agora todo conector que for executado o debug será ativado.

Tratamento de Objetos Entre Conectores JAVA – WebIntegrator

Pessoal, conforme prometido, segue meu primeiro post, é um tutorial abordando como tratar objetos entre conectores, ou seja, exportar um objeto para a sessão do WI e outro lendo este objeto da sessão. O que me motivou a tentar fazer esse processo, foi um caso aqui no trabalho, onde eu consumia um WebService que me retornava um array de objetos e precisava usar esse objeto em outro momento dentro de outra pagina. Para resolver este problema eu criei um conetor que lia esse objeto exportado e montava um GRID JAVA(Posso fazer um outro tutorial explicando como usar essa GRID JAVA, em caso de pedidos 🙂 ) com o resultado do WebService. Bom, então vamos ao que interessa.

1 – Primeiro Passo
Primeiro vamos criar um projeto de teste, chamado projeto_objeto. (Assume-se que já saiba criar um projeto no WI):

imagem_1

Feito isto criaremos um projeto JAVA que conterá os 2 conectores, um sendo que exportará um objeto chamado  FRUTAS’ e outro conector que lerá esse objeto e mostrará na página.(Para criação do conector usaremos o NetBeans)

imagem_2

Selecione a opção Aplicação Java e clique em next.

imagem_3

Coloque o nome do projeto e clique em finalizar. Usaremos o nome ProjetoConector.

Crie a seguinte classe exportaobjeto que exportará nosso obejeto para a sessão e exportaobjetorecebe que recebe o objeto, todos no pacote br.com.projetoteste. Ficará na seguinte
disposição:

imagem_4

2- Vamos criar o conetor

Para que o WI reconheça um conector em seu projeto é necessário estender as seguintes interfaces em suas classes: InterfaceConnector, InterfaceParameters:

public class exportaobjetorecebe implements InterfaceConnector, InterfaceParameters{

}

Para corrigir o erro, faz-se necessário importar a lib do wi. Clique com o botão direito do projeto no netbeans, depois clicar no botão propriedades. Ao abrir uma janela, selecione bibliotecas, após clicar em Adicionar JAR/Pasta. Selecione a lib do WI que pode ser encontrada dentro do projeto criado pelo próprio WI(projeto_objeto).

imagem_5

Feito isto, clique na sugestão do NetBeans e importe os métodos abstratos das intefaces:
Dois métodos serão criados, o getOutputParameters() que exporta os parâmetros desejados.
Conforme exemplo a seguir:

   @Override
    public JavaParameter[] getOutputParameters() {
        JavaParameter[] out = new JavaParameter[1];
        out[0] = new JavaParameter("tmp.objeto", "Retorna Obejto");
        return out;
    }

E o getInputParameters() serve para ler os parâmetros que estão na sessão do WI. Podemos determinar os nomes do parâmetros de entrada, como no exemplo a seguir.

    @Override
    public JavaParameter[] getInputParameters() {
        JavaParameter[] in = new JavaParameter[1];
        in[0] = new JavaParameter("tmp.objeto", "Retorna Obejto");
        return in;
    }

Outro método criado e muito importante é o execute. Dentro dele é criada toda a lógica que precisamos, pois é o primeiro método que o WI executa em um conector.

    @Override
    public void execute(ExecuteParams ep) throws UserException {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

Feito isto, criaremos nosso bean que será o objeto a ser exportado, chamaremos de fruta com os seguintes campos, ds_nome, nr_preco, nr_peso.

public class fruta {
    private String ds_nome;
    private Double nr_preco;
    private Double nr_peso;

    /**
     * @return the ds_nome
     */
    public String getDs_nome() {
        return ds_nome;
    }

    /**
     * @param ds_nome the ds_nome to set
     */
    public void setDs_nome(String ds_nome) {
        this.ds_nome = ds_nome;
    }

    /**
     * @return the nr_preco
     */
    public Double getNr_preco() {
        return nr_preco;
    }

    /**
     * @param nr_preco the nr_preco to set
     */
    public void setNr_preco(Double nr_preco) {
        this.nr_preco = nr_preco;
    }

    /**
     * @return the nr_peso
     */
    public Double getNr_peso() {
        return nr_peso;
    }

    /**
     * @param nr_peso the nr_peso to set
     */
    public void setNr_peso(Double nr_peso) {
        this.nr_peso = nr_peso;
    }
}

Veremos que para exportar o objeto não será nenhum bicho de sete cabeças, faremos simplesmente instanciar nossa classe bean frutas, populá-la e chamar o método WIMap.putobj, conforme imagem a seguir:

    @Override
    public void execute(ExecuteParams ep) throws UserException {
        fruta f = new fruta();
        f.setDs_nome("MANGA");
        f.setNr_peso(1.0);
        f.setNr_preco(8.55);

        ep.getWIMap().putObj("tmp.objeto", f);
    }

Deste jeito o WI exportará o objeto fruta para a sessão do seu projeto WEB em uma variável chamada tmp.obejeto.

Agora para ler esse objeto é só fazer o processo contrário. Na classe exportaobjetorecebe leremos  essa variável tmp.objeto convertendo-a em nosso bean frutas, conforme imagem abaixo:

    @Override
    public void execute(ExecuteParams ep) throws UserException {
        fruta f = (fruta) ep.getWIMap().getObj("tmp.objeto");

        ep.getWIMap().put("tmp.ds_nome", f.getDs_nome());
        ep.getWIMap().put("tmp.nr_preco", String.valueOf(f.getNr_preco()));
        ep.getWIMap().put("tmp.nr_peso", String.valueOf(f.getNr_peso()));
    }

    @Override
    public boolean exit() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public JavaParameter[] getInputParameters() {
        JavaParameter[] in = new JavaParameter[1];
        in[0] = new JavaParameter("tmp.objeto", "Retorna Obejto");
        return in;
    }

Perceba que dessa vez usamos o método put do WI para exportar as variáveis do nosso objeto recebido da classe exportaobjeto.
Feito isto vamos compilar nosso projeto, gerar os .class e colocar dentro no nosso projeto WEB. O projeto final ficará na seguinte disposição:

imagem_4

Para jogar as classes compiladas em nosso projeto WEB é só copiar a raiz do pacote(br.com.projetoteste) e jogá-lo na pasta webapps/projetoteste/WEB-INF/classes. Caso a pasta classes não exista em seu projeto, crie-a. Ficará na seguinte disposição:

imagem_7

3- Reinicie o tomcat.

4- Executando o processo

Agora vamos fazer a chamada do conetor em uma pagina de teste que criaremos no WI.

Em uma pagina de teste selecione o Pré-Pagina. No Pré-Pagina existe uma opção Conetor Java, conforme imagem abaixo:

imagem_8

Na tela que irá se abrir, digite o caminho completo de sua classe no campo Nome da Classe, conforme imagem abaixo:

imagem_9

Volte para o pré-pagina e clique novamente em Conector Java. Faça o mesmo procedimento, porém para a classe exportaobjetorecebe.

imagem_14

Perceba que apareceu um campo em Parâmetros de Entrada, este campo será recebido do conector de cima, do qual exporta o objeto. Seu pré-página deverá ficar da seguinte maneira:

imagem_11

Agora clique na opção Editar HTML no WI e coloque os campos que são exportados do conector que lê o objeto. Ficando da seguinte maneira:

imagem_12

Agora basta apenas clicar em Vizualizar no WI.

imagem_13

Então é isso galera, espero que vocês tenham gostado do meu primeiro post, espero que seja de extrema ajuda para alguns e de estudo para outros, até o próximo post.