sábado, 12 de setembro de 2009

Novo Blog

Olá! Agora sou um blogueiro com casa própria. Acessem www.decioluckow.com.br para visitar meu novo endereço.
abraços

domingo, 12 de julho de 2009

Bug no RecursiveTreeAdater do RichFaces

Estive fazendo alguns testes com o componente Tree do RichFaces usando a tag recursiveTreeAdator que permite alimentar a Tree com dados já em formato de árvore. Por algum motivo que fugia a minha compreensão, a Tree mostrava apenas 2 níveis de itens, sendo que os meus dados tinha 3 níveis. Para forçar os testes criei mais níveis com dados de teste e nada de funcionar.

Foi quando encontrei um bug registrado no Jira do Richfaces (https://jira.jboss.org/jira/browse/RF-6941) que dizia que isto era ocasionado por um bug na commons-collections 2.x, e na versão 3.x já estava corrigido.

Como eu infelizmente tinha as duas versões no meu classpath e obviamente a Lei de Murphy reina sobre o universo, a versão que estava valendo era que a poderia me causar problemas, a 2.x.

A solução foi simples, apaguei a 2.x e mantive a 3.2, funcionou que é uma beleza!

Então quem estiver tendo o mesmo problema, está ai a solução, rápida e indolor.

abraços

terça-feira, 7 de julho de 2009

Montagem dinâmica de classpath

Se existe um negócio chato no mundo é executar Java por linha de comando quando é necessário acrescentar um monte de jars no classpath. Enquanto a linha de comando está estável, tudo bem, você faz uma vez e utiliza sempre a mesma coisa. Porém quando começa a ser necessário adicionar jars, atualizar versões o negócio começa a ficar desagradável.

A solução que encontrei foi montar dinamicamente uma lista dos jars existentes em um diretório e concatenar tudo na variável de ambiente CLASSPATH. Para isso foi utilizando o comando FOR do MS-DOS (sim no DOS tem FOR, IF, só nao tem CLASS ;)).

Para conseguir isto, o interessante é adotar um padrão como o a seguir.

meuAplicativo
- lib
- executa.bat
- addpath.bat


Na pasta lib mantenha todos os jars do seu projeto.

O arquivo executa.bat segue o modelo abaixo:

@echo off
SET CLASSPATH=
dir /b "lib\*.jar" > temp.tmp
FOR /F %%I IN (temp.tmp) DO CALL addpath.bat lib\%%I
DEL temp.tmp
set CLASSPATH=.;%CLASSPATH%
java meupacote.MinhaClasse

O arquivo addpath.bat tem o conteúdo abaixo:

set CLASSPATH=%CLASSPATH%;%1

Você provalmente está se perguntando porque criar um outro bat só para setar o CLASSPATH e não fazer o set direto no FOR. Bem, pergunte ao Bill Gates, porque isso realmente não funciona.

Em Linux, como as coisas funcionam, é necessário apenas um arquivo de script para o mesmo efeito.

#!/bin/sh

export CLASSPATH=

for jarfile in ./lib/*.jar; do
CLASSPATH=$CLASSPATH:./lib/$jarfile
done
export CLASSPATH=.:$CLASSPATH
java meupacote.MinhaClasse

Também existe a possibilidade de fazer a carga dinâmica de jars pelo próprio java, usando um ClassLoader que irá aceitar a adição dos jars que você quiser. Já fiz alguns testes com essa técnica, mas ainda não funcionou do jeito que eu gostaria, então fica para um próximo post...

então é isso, abraços a todos

sexta-feira, 17 de abril de 2009

TCPMon - Um inteceptador de requisições HTTP

Há muito tempo tenho procurado um interceptador de requisições HTTP, a minha necessidade era saber exatamente o que o meu client estava requisitando e o que o server estava respondendo. Isto é especialmente útil para fazer DEBUG de aplicativos WEB. No meu caso eu estava fazendo testes com chamadas de webservice a partir da linguagem ADVPL-Asp que é a linguagem proprietaria da TOTVS. Mas em outros casos isto também foi útil para verificar a comunicacao do AJAX com o Server, entre outros.

O salvador da patria foi o TCPMon, um aplicativo da Apache que permite interceptar requisições e respostas de um servidor web (http://ws.apache.org/commons/tcpmon/).

O seu uso é muito simples, você simplesmente configura uma porta a ser monitorada, por exemplo 9000, e para qual endereço o TCPMon deve direcionar as requisições que chegarem na porta 9000.

Como exemplo, você pode configurar o TCPMon para ouvir a porta 9000 e repassar a requisição para a localhost:8080. Você salva esta configuração e pronto, o TCPMon já está trabalhando.

Neste caso, se você quiser fazer o DEBUG do seu aplicativo deverá acessar o seu site através do endereço localhost:9000, pois é nesta porta que o TCPMon vai conseguir interceptar as requisições e respostas e repassar para o localhost:8080.

Mas não necessariamente você precisa trabalhar somente com localhost. Qualquer outro endereço pode ser monitorado, desde que você passe a fazer a requisição através da porta que foi configurada no TCPMon.

Espero que esta dica possa ser útil a todos

abraços