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

quarta-feira, 17 de setembro de 2008

GoogleMaps para JavaServer Faces

Encontrei um site muito interessante que mostra a utilização do google maps dentro do JSF.

O site do projeto é http://code.google.com/p/gmaps4jsf/ e existe exemplo online em http://mashups.s43.eatj.com/gmaps4jsf-examples/home.jsf

Dentre os exemplos é possível localizar um ponto específico no planeta, colocar marcadores, utilizar os controles do gmaps etc...

vale a pena dar uma olhada

quarta-feira, 14 de novembro de 2007

Enviando e-mail com os pés nas costas, em Java

Qualquer aplicação web que se de ao respeito, tem que enviar e-mail. Nem que seja só pra enviar o lembrete da senha ou uma 'recomentação' de visita para um amigo.
Nunca tive grandes dificuldades para fazer o envio de e-mails através do sistemas que desenvolvi, mas tinha que me deparar com Session, Transport, System.properties. Como era a única opção, encarava assim mesmo.

Mas depois que conheci o projeto Apache Commons Email (http://commons.apache.org/email/) tudo ficou mais fácil.

alias, convido a todos para conhecer os projeto do Apache Commons, existem coisas muito interessantes por lah, nos proximos posts foi abordar mais projetos do Commons.

Mas voltando ao e-mail, a facilidade e simplicidade que este projeto provê é muito grande. Veja um primeito exemplo de e-mail:

SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("Test message");
email.setMsg("This is a simple test of commons-email");
email.send()

Precisa autenticar no servidor?

email.setAuthentication("fulano", "teste123");

A porta do servidor não é a padrão?

email.setSmtpPort(25);

Quer enviar a mensagem como prioritária?

email.addHeader("X-Priority", "1");
email.addHeader("Priority", "Urgent");
email.addHeader("Importance", "high");

Quer anexar arquivo?

// Cria o e-mail preparado para os anexos
MultiPartEmail email = new MultiPartEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("The picture");
email.setMsg("Here is the picture you wanted");

// Cria o anexo
EmailAttachment attachment = new EmailAttachment();
attachment.setPath("mypictures/john.jpg");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Picture of John");
attachment.setName("John");

// Adiciona o anexo
email.attach(attachment);

// Envia o e-mail
email.send();
Anexar arquivo externo?

EmailAttachment attachment = new EmailAttachment();
attachment.setURL(new URL("http://www.apache.org/images/asf_logo_wide.gif"));
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Apache logo");
attachment.setName("Apache logo");
email.attach(attachment);
E-mail em HTML e com imagem incorporada?

// Cria a mensagem HTML
HtmlEmail email = new HtmlEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("Test email with inline image");

// incorpora a mensagem e obtem o cid (content ID)

URL url = new URL("file://c:\logos\logo.gif");
String cid = email.embed(url, "Apache logo");

// seta a mensagem em HTML
email.setHtmlMsg("<html>The apache logo - <img src='cid:"+ cid +"' /></html>");

// seta a mensagem correspondente sem HTML
email.setTextMsg("Your email client does not support HTML messages");
// envia o e-mail

email.send();
Se você quiser incorporar imagens locais, poderá passar no construtor do objeto URL o caminho precedido por (file://). Ex: file://c:\image.gif
Mas eu queria usar o Session do JavaMail para ter mais performance no envio de uma grande quantidade de e-mails!
Para isto utilize o método .email.setMailSession(session)
Para debuggar o funcionamento desta biblioteca, ative o DEBUG.
Para ativar o debug, utilize o método setDebug(boolean). Ex: email.setDebug(true)
Informações sobre o andamento interno do envio do e-mail serão impressas no console, via System.out.println()
Bibliotecas necessárias

Para utilizar o apache commons-mail, são necessários os jars abaixo:

Estes jars devem ser incluídos no classpath da sua aplicação, ou colocados em WEB-INF\lib se a sua aplicação for WEB.

Bons e-mails e abraços a todos!

quinta-feira, 11 de outubro de 2007

Primeira Postagem

Olá Pessoal, este é o primeiro post.

Minha idéia aqui é postar experiências, descobertas e artigos interessantes que tenha visto por aih sobre Java, Frameworks, usabilidade, datawarehouse, Business Inteligence e outras coisas interessantes. Mesmo porque não dah pra só pensar em trabalho!

abraços a todos e aguardem novas postagens

Décio Heinzelmann Luckow