Vous êtes sur la page 1sur 76

Mustang Relatrios Dolphin JBoss JMS EasyMock

6
0
0
2
e
n
O
a
Jav
Especial

A Revista da Comunidade Java Brasileira

ta do Evento
Cobertura Comple
pen Source
Novos produtos O
ectiva Tcnica
p
rs
e
P
a
m
u
e
d
s
o
Annci
tBeans
Novidades do Ne
a 6 e Java 7
O que vir no Jav

Edio 37 - Ano IV - R$ 9,90

Aprenda OO com BlueJ


Utilizando o ambiente gratuito focado no
ensino de Java e orientao a objetos

Relatrios Passo a Passo


Como criar relatrios mestre-detalhe
na web com JasperReports e iReport

Testes com Mock Objects


Aprenda passo a passo a tcnica que
traz muito mais controle para seus testes

JMS com JBoss


Conceitos da tecnologia Java Message
Service e utilizao prtica no JBoss

Eclipse
Os 10 Mais do Eclipse 3.2
Detalhes sobre as principais
novidades da nova verso, de
melhorias a novos projetos

Criao de Plug-ins

Aprenda a estender o
Eclipse criando um plug-in
completo, passo a passo

Contedo
JavaOne 2006
Leonardo Galvo
Apresentando a dcima edio do maior evento
para desenvolvedores

06

Anncios e Participao Brasileira

JavaOne 2006

Fabio Velloso
Foco em produtividade, desenvolvimento corporativo
e novas tecnologias

xx

Uma Perspectiva Tcnica


Yara Senger e Vinicius Senger
Tecnologias, APIs, especificaes e nmeros que
marcaram a conferncia

xx

Open Source em Foco


Bruno Souza
Novidades em projetos open source e discusses
que movimentaram o JavaOne

xx

Os 10 Mais do Novo Eclipse


Osvaldo Pinali Doederlein

Capa

A nova verso do Eclipse traz centenas de pequenas e grandes


melhorias, do novo suporte a ferramentas atualizadas, a novos
projetos de amplo alcance

20

Criao de Plug-ins Eclipse


Andr Dantas Rocha
Aprenda a criar plug-ins, dos conceitos fundamentais a um exemplo
completo e passo a passo, e tire mais proveito do Eclipse e do
Plug-in Development Environment

40

Introduo ao JMS
Fernando Lozano

Especial

Conceitos e motivao para middlewares de mensagens,


e quando e como usar o JMS com o JBoss, com exemplos

Sun

Tech
Days 2006

Java na Era da
Participao

30

Sun Tech Days 2006


Leonardo Galvo
Cobertura do evento nacional que prenuncia o JavaOne, com
O
participao de importantes executivos e evangelistas da Sun
quarto Sun Tech Days, realizado
nos dias 11 e 12 de abril, trouxe
mais de 1.500 desenvolvedores ao
Transamerica Expo Center, em So PauloSP, e contou com a presena de importantes executivos da Sun Microsystems. Entre
eles, estavam o recm-nomeado CEO da
Sun, Jonathan Schwartz, que acumula
este cargo com o de presidente. Tambm
participou do evento um extenso grupo de
evangelistas e desenvolvedores de vrios
pases, tanto da Sun como de empresas
parceiras.
As sesses de abertura foram realizadas
na grande sala principal, com capacidade
para mais de mil pessoas e cinco teles.
Reggie Hutcherson, que gerencia o grupo
de evangelistas de tecnologia da Sun, foi
mais uma vez o mestre de cerimnias,
responsvel pelas principais brincadeiras
e premiaes, e por apresentar os palestrantes das sesses especiais.

50

Relatrios na Web Passo a Passo


Ana Abrantes e Yara Senger
lotaram a sala principal
Mais de 1.500 pessoas
Tecnologia ao vivo: sobre tecnologias e ferramentas Java.
para palestras tcnicas

50 Java Magazine Edio 37

Aproveite as facilidades do iReport para criar relatrios baseados no


JasperReports, montando um relatrio mestre-detalhe completo

52

Era da participao: Jonathan Schwartz destaca a importncia das comunidades e a apresenta a viso
da Sun para o open source.

Introduo ao BlueJ
Marcelo Daibert e Marco Antnio Arajo

Core

Conhea o ambiente que cada vez mais usado para ensinar a


orientao a objetos e desenvolvimento Java em universidades

62

Testes sob Controle com Mock Objects


Vincius Mnhes Teles
Usando na prtica uma tcnica que permite deixar seus testes mais
auto-contidos e gerenciveis, com a ferramenta EasyMock

68

Esp

Ano V Edio 37 2006 ISSN 1676-8361

Direo
Diretor Editorial Leonardo Galvo
Diretor de Marketing Gladstone Matos
Diretor Comercial Casseano Filho

Edio
Publisher e Editor-Chefe
Leonardo Galvo (leonardo@javamagazine.com.br)
Editores-Adjuntos
Fernando Lozano (lozano@javamagazine.com.br)
Osvaldo Doederlein (osvaldo@javamagazine.com.br)
Colaboraram nesta edio
Ana Abrantes, Andr Rocha, Bruno Souza, Fabio Velloso,
Felipe Leme, Fernando Lozano, Leonardo Galvo,
Marcelo Daibert, Marco Antnio Arajo, Osvaldo Doederlein,
Vincius Teles, Vinicius Senger, Yara Senger

Arte
Diretor de Arte Tarcsio Bannwart (phdesign@phdesign.com.br)
Diagramao Jaime Peters Junior, Lais Pancote e Tersis Zonato
Ilustraes Felipe Machado e Francisco Peixoto

Produo
Gerncia de Marketing Kaline Dolabella
Distribuio
Fernando Chinaglia Distribuidora S.A.
Rua Teodoro da Silva, 907, Graja - RJ
CEP 20563-900, (21) 3879-7766 - (21) 2577-6362

Atendimento ao leitor
A DevMedia possui uma Central de Atendimento on-line, onde voc pode
tirar suas dvidas sobre servios, enviar crticas e sugestes e falar com um
de nossos atendentes. Atravs da nossa central tambm possvel alterar
dados cadastrais, consultar o status de assinaturas e conferir a data de envio
de suas revistas. Acesse www.devmedia.com.br/central, ou se preferir
entre em contato conosco atravs do telefone 21 2283-9012.

Edies anteriores
Adquira as edies anteriores da revista Java Magazine ou de qualquer outra
publicao do Grupo DevMedia de forma prtica e segura, em
www.devmedia.com.br/anteriores.

Publicidade
publicidade@javamagazine.com.br, 21 2213-0940
Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia,
voc divulga sua marca ou produto para mais de 100 mil desenvolvedores
de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com
detalhes sobre preos e formatos de anncios.
Reprints Editoriais Se foi publicado na Java Magazine um artigo que
possa alavancar as suas vendas, multiplique essa oportunidade! Solicite a
reimpresso da matria junto com a capa da edio em que saiu, e distribua
esse reprint personalizado entre seus clientes.
Encarte de CDs Faa como nossos maiores anunciantes. Encarte um CD
com uma amostra de seus produtos na Java Magazine e atinja um pblico
segmentado e formador de opinio.
Realizao

om mais uma cobertura do JavaOne, chegamos ao quinto ano da Java Magazine. Isso num momento em que a tecnologia Java est mostrando que
pode ser madura e tradicional, ao mesmo tempo que se mantm gil e em
constante renovao. Como voc ver, os anncios e lanamentos feitos no evento
confirmam que a tecnologia continua num processo rpido de evoluo, e que vem
se consolidando em mercados nobres e atuais, como SOA, Web 2.0 e aplicaes
distribudas. Com quatro artigos por cinco autores, nossa cobertura vai alm de
um relato detalhado do que aconteceu, aproveitando as novidades apresentadas
para explicar conceitos e discutir as conseqncias prticas do que foi divulgado
no evento.
No s de novidades vive o desenvolvedor, e essa edio traz artigos sobre relatrios, testes, JMS e Eclipse, o tema de capa. No primeiro artigo sobre o Eclipse,
voc ver uma seleo com as dez principais novidades da verso 3.2, desde a nova
integrao com o JUnit 4 at o importante projeto Callisto que est mudando as bases
do Eclipse. Na segunda matria de capa, voc aprende a criar plug-ins para o Eclipse
3.x, atravs de uma conceituao slida e um exemplo real e completo.
Relatrios constituem uma parte essencial de muitos projetos corporativos. Nesta
edio, um tutorial detalhado volta ao tema, revendo o JasperReports e o iReport
e criando um relatrio de pedidos, desde a definio do modelo de dados at a
criao de uma aplicao web para iniciar a gerao, no esquecendo, claro, da
criao do relatrio em si.
Temos tambm um artigo sobre a tecnologia Java Message Service (JMS), com
exemplos prticos no servidor de aplicaes JBoss 4. O JMS usado freqentemente na criao de sistemas de grande porte. Se bem aplicado, pode reduzir muito
o acoplamento e aumentar a responsividade e confiabilidade de suas aplicaes
corporativas.
Em uma aplicao OO, objetos geralmente se organizam em um rede complexa de
dependncias, e fazer testes de unidade que verifiquem isoladamente a funcionalidade de um objeto no uma tarefa simples. Uma soluo elegante o uso de mock
objects objetos que funcionam como substitutos sobre os quais o desenvolvedor tem
controle total. Veja como usar essa tcnica em um artigo que apresenta o conceito e
mostra como usar a ferramenta EasyMock, que automatiza boa parte do processo.
Por fim, temos um artigo sobre o ambiente de desenvolvimento BlueJ, que focado
no aprendizado de Java e orientao a objetos, e permite a criao visual de classes
e instanciao interativa de objetos. Uma tima maneira de comear com Java e conhecer o essencial de tcnicas OO.

Apoio

Boa leitura!

Parceiros

Leonardo Galvo

ao do Leitor
Volume de informaes
Sou assinante da Java Magazine h quatro meses
e sou apaixonado pela revista. Realmente fico espantado com o volume de informaes. Parabns!
Thiago Alvarenga Lechuga

Eclipse TPTP
Gostaria de dar parabns a todos vocs da Java
Magazine. A revista est muito boa. Sou assinante
h pouco tempo, mas antes disso j acompanhava a
revista. A ltima edio sobre Logging e otimizao
foi boa, mas indo por esse tpico vocs poderiam
fazer uma matria sobre o Projeto Eclipse TPTP
(Test and Performance Tools Platform). Trabalho
com testes de software e h pouco conheci o TPTP.
Em alguma edio futura vocs publicaro um
artigo sobre o assunto? At mais e continuem com
o timo trabalho!
Jaime Gabriel Valrio
Jaime, obrigado pela apreciao. Planejamos
sim artigos sobre vrios projetos da Fundao
Eclipse, j comeando na prxima edio. O TPTP
est na nossa pauta.

Seduzido por Java


Gostaria de parabenizar todaa equipe Java
Magazine pela excelente qualidade do contedodos artigos publicados periodicamente, bem
como o material grfico utilizado para este fim.
Aps a leitura de uma de suas edies para fazer
um trabalho acadmico, fui seduzido pela ma-

Participe!
Envie sua dvida, comentrio, correo
ou sugesto, com nome completo,
cidade e estado, para:
cartas@javamagazine.com.br
Cartas publicadas podem ser editadas
por motivos de clareza ou extenso.

ravilhas e possibilidades que a plataforma Java


tem a oferecer.
William de Jesus Rende

Na unha
Gostaria de parabenizar Osvaldo Doederlein pela
matria Persistncia Turbinada, na Edio 25. Um
artigo com excelente grau tcnico fazendo uso de
APIs que raramente utilizamos (ex.: Proxy Class),

e que vai muito alem do habitual Hello World.


Estou implementando muitas das idias deixadas
no artigo. No meu ambiente de trabalho, por medida de segurana, no podemos realizar SELECTs
diretamente nas tabelas. As tabelas so acessveis
somente via Stored Procedures, o que dificulta a
utilizao de uma ferramenta de mapeamento objeto-relacional como o Hibernate. Tudo aqui feito
na unha, e o artigo de Osvaldo veio bem a calhar!
Andr Sass Chaves

Grficos em 3D
E

stou desenvolvendo um software cientifico


e gostaria de saber se existe alguma biblioteca para plotar grficos em trs dimenses.
Estou testando o JFreeChart mas pelo que vi
at agora, ele no adequado.
Thiago Paulista
Se voc quer criar grficos comerciais no
estilo do JFreeChart, ou seja, grficos de
pizza, barras etc., s que com um aspecto
3D (como no Excel ou OpenOffice.org Calc),
realmente o JFreeChart deixa a desejar. Ele
suporta alguns grficos mais ou menos 3D
mas estes so muito limitados (no permitem criar sries em trs eixos, ou configurar
uma perspectiva no-isomtrica).
Por outro lado, qualquer grfico 3D de alta
qualidade pode ser feito com a JOGL (jogl.
dev.java.net) ou a Java 3D (j3d.org). A Java 3D
uma API mais antiga, acelerada tanto por
OpenGL (multiplataforma) quanto Direct3D
(Windows), e mais fcil de usar. Mas esta
API ficou um pouco abandonada por uns
anos, at ser transformada em 2004 num
projeto open source hospedado no java.net,
e ser usada num projeto popular, o Looking
Glass (sun.com/software/looking_glass).
A JOGL uma API mais nova, que em comparao com a Java
3D, muito mais
leve e eficiente,
sendo apenas
um binding Java

da OpenGL inclusive com suporte a diversas extenses e recursos recentes, como a


nova linguagem de shading. Recentemente
foi padronizada pela JSR-231. A desvantagem da JOGL ser uma API de mais baixo
nvel, orientada a desenvolvedores de jogos
e outros que precisam de desempenho
visual mximo.
Qualquer uma dessas APIs, se comparadas ao JFreeChart, bem trabalhosa de
usar, a no ser que voc tenha um bom
background em matemtica (geometria
analtica, trigonometria etc.). Entretanto, se
voc quiser gerar grficos 3D sofisticados,
como os que pode fazer, por exemplo, no
Mathematica ou Maple, ou em ferramentas
CAD/CAE, dificilmente vai achar bibliotecas
prontas que faam isso de forma direta e
simplificada. Nestes casos, APIs como JOGL
e Java 3D costumam ser a
nica opo.

Edio 32 Java Magazine

JavaOne

Apresentando a 10a edio

Palavras-chave

mais popular JavaOne dos ltimos


anos, com 15 mil
participantes, reafirmou a maturidade e a
fora da tecnologia Java. Vrios anncios
importantes preencheram as apresentaes principais, e a participao brasileira
teve outra vez destaque. Nesta edio do
evento, no houve um anncio com o apelo
geral de um Tiger, como no JavaOne 2004,
mas um conjunto de novidades e lanamentos mostrou que Java continua firme,
mantendo sua posio de lder entre as
tecnologias mais utilizadas no mundo.

Se tivssemos que indexar


para consulta o contedo do
JavaOne 2006, as seguintes
palavras-chave, que formam os
pilares desta edio do evento,
certamente teriam que ser
includas:
JEE 5 Lanado dias antes da
conferncia, a nova verso do
JEE uma das mais importantes
na histria do Java corporativo,
com seu foco na facilidade de
desenvolvimento.
NetBeans A verso 5.5 teve seu primeiro beta lanado s vsperas do JavaOne, e
traz o novo Enterprise Pack, com recursos
abrangentes para criar aplicaes JEE 5 e
SOA. Foram tambm anunciados novos
mdulos de extenso importantes.
SOA A arquitetura orientada a servios uma soluo cada vez mais popular
para a criao de aplicaes a partir de
servios independentes e desacoplados.

Terminologia do JavaOne

omo acontece em eventos de tradio, o


JavaOne define uma terminologia prpria,
usada em muitos artigos e blogs escritos sobre o
evento. Conhea alguns termos fundamentais:
General Session So as principais apresentaes do JavaOne, geralmente realizadas nas primeiras horas de cada dia. Nas General Sessions
so feitos grandes anncios e realizados debates
e demonstraes, em uma sala que comporta
mais de 12 mil pessoas (e que se expande a cada
edio do evento).
Technical Session As Technical Sessions
so as palestras mais formais e mais nobres do
JavaOne. Algumas chegam a ter milhares de
presentes. A partir deste ano, as sesses tcnicas
exigiram o cadastro antecipado via web. Todos
os slides das apresentaes esto disponveis

 Java Magazine Edio 37

em PDF no site do evento.


BoF Palestras mais informais, os BoFs so
realizados noite (os ltimos comeam depois
das 22:00), e no preciso cadastro antecipado.
So mais especficos e tm pblico menos numeroso, envolvendo no entanto um grau maior
de participao dos presentes.
Dukes Choice Awards A premiao dada a
projetos e iniciativas de destaque que utilizam
Java. H prmios (informalmente chamados
de dukies) para vrias reas de aplicaes
corporativas, a pequenos dispositivos e projetos
sociais.
Pavillion O pavilho de exposies tradicional no JavaOne, com estandes (booths) de
empresas, e demonstraes de equipamentos,
tecnologias e produtos

Mais de 250 palestras: na abertura, John Gage exibe o


livreto com a programao resumida do evento
Foi tema de general sessions e apresentaes tcnicas.
AJAX Muito falada em todo o evento,
esta tecnologia a base para programas
populares como o GMail e o novo Google
Spreadsheets.
Open Source Vrios softwares foram liberados sob licena open source,
entre eles produtos da Sun h anos no
mercado. E a abertura da implementao
de Java foi novamente assunto de discusses ainda inconclusivas durante
todo o evento.
Web 2.0 Esse termo, que cresce exponencialmente em popularidade (j so 80
milhes de resultados no Google), representa uma mudana de paradigma na web
com a interatividade de aplicaes AJAX,
o foco em participao com wikis e blogs,
e a descentralizao radical.
Glassfish O servidor JEE 5 que
implementao de referncia da nova
especificao Java Enterprise Edition tem
a comunidade mais ativa e numerosa do
Java.net e vem obtendo resultados de performance que impressionam.
Voc ver mais sobre todas essas tecnologias e anncios relacionados nos artigos
que completam essa cobertura.

2006

do maior evento para desenvolvedores


Leonardo Galvo
Futuro garantido
As discusses neste JavaOne tiveram um enfoque
mais tcnico que nos ltimos
anos. As novas verses do
JSE estiveram na topo da
agenda nas apresentaes,
e nota-se uma colaborao
maior da comunidade nos
projetos Mustang e Dolphin
(que definiro as novas verComunidade: Jonathan Schwartz reafirma a importncia da participao
ses do Java). Benchmarks
e destaca os mais de mil membros do JCP, entre eles o SouJava, o primeiro
recentes mostram um augrupo de usurios Java a participar
mento de performance e
estabilidade significativos
do futuro JSE 6.0, e h vrias novidades
Lanamento de camisetas
interessantes em sintaxe e APIs prometidas para o Dolphin, o JSE 7.
este ano, o Brasil participou pela
Considerando o nmero de apresentaprimeira vez do tradicional concurso
es voltadas ao futuro de Java, o grande
de lanamento de camisetas organizado
interesse sobre o assunto e o volume de
por James Gosling, o criador de Java e
inovaes prometidas, alm do esforo
responsvel pelas demonstraes mais
visvel por abertura e colaborao das
interessantes do JavaOne.
A equipe brasileira, formada por Bruno
maiores empresas envolvidas com Java,
Souza,
Yara Senger, Vinicius Senger e Milpodemos ficar certos de que a tecnologia
ton
Lapido,
foi selecionada como uma das
tem um futuro garantido, com muitos
trs
finalistas.
O mecanismo criado pela
anos de crescimento e renovao pela
equipe foi simples, mas eficaz, lanando
frente.
as camisetas a distncias superiores a
40 metros. Um estilingue atrs de uma
bandeira do Brasil era disparado com um
chute pelo jogador JNaldo caracterizado

Rede de conhecimentos: estandes de empresas, palestras,


brindes e coquetis criam uma oportunidade para expandir
a rede de contatos e conhecer mais sobre o que est acontecendo no universo Java.

java.sun.com/javaone/sf
Site oficial do JavaOne
java.sun.com/javaone/sf/sessions/
general
Webcasts com o contedo completo dos General
Sessions
java.sun.com/javaone/sf/sessions/main_
session_pdfs.jsp
Slides de todas as Technical Sessions
java.sun.com/javaone/sf/tshirt_hurling.jsp
Mais sobre o campeonato de lanamento de
camisetas

com a camisa da seleo. Comemorando


muito durante os lanamentos, Yara Senger vestia a fantasia do jogador, e Vinicius,
Bruno e Milton ficavam encarregados
de preparar o estilingue para o prximo
disparo.
Apesar de o mecanismo brasileiro ser o
que lanou as camisetas maior distncia,
no agradou ao jri composto pelos apresentadores do programa Myth Busters
(Caadores de Mitos), Jamie Hyneman
e Adam Savage. Foi usado como critrio
mais tecnologia do que eficcia ou originalidade, e a equipe brasileira terminou
em terceiro lugar.

Equipe brasileira com os MythBusters: Adam


Savage, Vinicius Senger, Yara Senger, Bruno Souza, James
Gosling, Milton Lapido e Jamie Hyneman

Camisetas de alto alcance: JNaldo prepara-se para


disparar o prximo lanamento

Edio 37 Java Magazine

JavaOne 2006

Anncios e a Parti

Foco em produtividade e no desenvolvim

JavaOne 2006 estava completamente lotado, com filas para todos


os lados (e um novo sistema de
pr-inscrio que tornava as filas ainda
maiores). O primeiro general session foi
iniciado por John Gage, Cientista Chefe da
Sun, que abriu o JavaOne com a j tradicional frase Dont be shy, dizendo que esta
deveria ser a regra para a semana, e que
todos deviam fazer como os brasileiros,
que representam esse esprito.
Jonathan Schwartz, CEO e Presidente
da Sun, falou sobre a importncia do Java
Community Process (rgo em que so
discutidas e especificadas as tecnologias
do Java), convidando a todos a participar e ajudar na evoluo da plataforma.
Schwartz ento recebeu vrios convidados
no palco.
Ed Zander, Chairman e CEO da Motorola,
falou sobre novos dispositivos com suporte
a Java e Linux, e sobre as oportunidades
que oferecem aos desenvolvedores. J h
mais de um bilho de dispositivos suportando a tecnologia. Zander recebeu ainda
o Dukes Choice Awards (espcie de Oscar
do Java, que premia projetos importantes
e aplicaes inovadoras) na categoria Best

Mobile Phone, pelo desenvolvimento do


Motorola SLVR com iTunes.
Mark Fleury, General Manager do JBoss,
anunciou oficialmente o ingresso do JBoss
na comunidade de desenvolvimento do
NetBeans, e reiterou o apoio e a participao do JBoss no Java Community Process,
principalmente para a definio de um
modelo de programao mais simples para
JEE. Ressaltou tambm que o NetBeans
uma plataforma com suporte completo a
JEE 5 e ao final Schwartz simbolicamente
o presenteou com uma camiseta contendo
a inscrio I Love NetBeans.

Temas principais

Os general sessions que seguiram deram


o tom dos principais assuntos abordados
no evento: EJB 3, JEE 5, SOA, WEB 2.0 e
AJAX. Os representantes das empresas do
Expert Group de JEE 5, especificao finalizada recentemente, foram chamados ao
palco para uma homenagem, e destacaram
a preocupao com compatibilidade.
Jeff Jackson, Vice-Presidente de Plataformas Java Corporativas e Produtos de
Desenvolvimento da Sun, falou sobre a
compatibilidade, uma caracterstica que
continua sendo o principal
valor da plataforma Java.
Listou tambm os principais objetivos do Java EE 5:
facilidade de desenvolvimento, suporte a Web 2.0,
interoperabilidade e simplificao da service-oriented architecture (SOA).
Jackson destacou que o
JEE 5 est pronto para ser
utilizado, com anotaes
simplificando o modelo de
desenvolvimento, EJB 3.0
com POJOS e a nova Java
Persistence API. (Veja mais
JBoss no NetBeans: Jonathan Schwartz presenteia Mark Fleury, de chapu
no quadro Novas tecnolovermelho em homenagem Red Hat, com uma camiseta do NetBeans

 Java Magazine Edio 37

gias corporativas.)
A Oracle foi a responsvel pelo general
session do segundo dia. Apresentou suas solues e estratgias
baseadas em SOA, e reforou
a importncia de novas
tecnologias, como EJB 3
e JavaServer Faces, para
simplificar o desenvolvimento e suportar novas aplicaes da Web
2.0, com JSF e AJAX.
No terceiro dia, Erich
Gamma (o pri ncipal
autor do clssico livro
Desig n Patterns) e
John Wiegand, ambos
Distinguished Engineers
da IBM Rational Software, apresentaram o general
session da IBM. Trataram
detalhadamente do projeto
Eclipse e seu processo de desenvolvimento, e demonstraram um
plug-in que faz a integrao com
o Bugzilla (ferramenta open source
para gerncia de bugs e correes).
Apresentaram ainda a evoluo do
desenvolvimento do produto atravs de
vrios grficos.

Pavilho
Os dias do evento so tomados por centenas de palestras, mas vale a pena reservar
algumas horas para visitar o Pavillion,
com estandes de empresas
e produtos. O pavilho,
alm de apresentar
aplicaes de vrios tipos, foi um
show de tecnologia, mostrando entre
outras
coi-

cipao Brasileira
ento corporativo

Fabio Velloso
sas jogos escritos em Java, celulares
e outros dispositivos JME.
Entre os celulares, destaque para
o Jasper S20 da Savaje, empresa
que desenvolveu um sistema
operacional baseado em Java para
dispositivos. Com este celular a
Savaje conseguiu demonstrar na
prtica a aplicao do conceito. O
celular ainda uma verso para desenvolvedores, e talvez no tivesse
sucesso no mercado para usurios
comuns, mas incorpora muitas tecnologias, incluindo APIs recentes do JME,
como suporte a Bluetooth, mensagens, grficos em 2D e 3D, segurana com suporte a
JCE, JSSE, JAAS e a nova JSR-209 (Advanced Graphics and User Interface Optional
Package for the J2ME), que especifica um
subconjunto de funcionalidades do Swing
e Java 2D para pequenos dispositivos.
Tambm chamou ateno o estande com
aplicaes Java Real Time. Alm de robs,
foi demonstrado um autorama, com os
carrinhos controlados pela tecnologia
Java Real-Time System (Java RTS), onde
passei um bom tempo me divertindo com
as corridas.

Sesses finais
A general session do ltimo dia do evento
foi voltada a inovaes, comeando com
uma apresentao do novo Flow Designer para MIDP 2.0 do NetBeans; e uma
aplicao de RFID com Web Services, em
que um celular mandava mensagens
SOAP atravs de uma aplicao JME.
As ltimas apres e nt a e s fora m
do Java Real-Time
System (Java RTS)
com aplicaes
de imagem e
vdeo e uma

competio de carrinhos no autorama


mostrado no pavilho. Alguns dos finalistas vieram de universidades alems, onde
venceram concursos importantes. Ao final,
a empresa Perrone Robotics apresentou
um carro conceito, apelidado Tommy e
controlado por um sistema em Java, que
dirige o veculo dispensando motorista
(apesar de ser possvel dirigi-lo normal-

mente). O veculo composto por vrios


sensores controlados por aplicaes JSE,
JME (CLDC 1.1) e a Java Communications
API. Foi tambm exibido um vdeo com
James Gosling dentro do veculo.

As novas verses do Java


As novas funcionalidades previstas nas
prximas verses do JSE foram apresenta-

Novas tecnologias corporativas

em dvida, o principal anncio do JavaOne 2006 foi o lanamento do JEE 5, que


teve sua especificao final disponibilizada
uma semana antes do evento, tendo como
implementao de referncia o servidor
Glassfish.
Com este lanamento, o JCP torna realidade um desejo de empresas e desenvolvedores corporativos: proporcionar produtividade e facilidade de desenvolvimento na
plataforma JEE, que consagrada por sua
escalabilidade e estabilidade.
Os grandes avanos do JEE 5 esto no EJB 3
que tem como principais novidades:
A utilizao de anotaes, simplificando
o desenvolvimento e eliminando o necessidade de criao de interfaces em verses
anteriores como Home, Remote e Local
Configurao por exceo, eliminando a
necessidade de o desenvolvedor escrever o
deployment descriptor. Agora este descritor
s precisa ser editado quando necessria
uma configurao diferente do padro
Uso de injeo de dependncias para
configuraes de ambiente e JNDI (Java
Naming and Directory Interface)
Simplificao do modelo de persistncia
de Entity Beans, com a utilizao de classes
Java comuns (POJOS) e possibilidade de
definir herana e polimorfismo. Foi tambm

criada uma nova API com estas funcionalidades chamada Java Persistence API que pode
ser usada fora de containers JEE, por exemplo em aplicaes desktop com Swing.
Outro assunto importante foi JavaServer
Faces, o framework web com modelos de
componentes visuais e de eventos que possibilita criar aplicaes web com maior interatividade. Alm do JSF, tecnologias como
AJAX e RIA tiveram bastante destaque, por
serem fundamentais para a chamada Web
2.0. Destaque para o Google Web Toolkit,
um framework para desenvolvimento de
aplicaes AJAX com Java que foi lanado
durante o evento.
Outro assunto destacado foi SOA e Web
Services, com muitas palestras e referncias
em general sessions, porm sem grandes
novidades em relao tecnologia. Dois
tpicos relacionados, relativamente novos
e que merecem ateno so:
Java Business Integration (JBI), que prov
um barramento para comunicao de aplicaes SOA padronizado atravs da JSR 208, e
j apresentado na Java Magazine.
REST Web Services, uma arquitetura para
Web Services, com conceitos da Web 2.0,
usando protocolos stateless e operaes
simples de cadastro em banco de dados.

Edio 37 Java Magazine

JavaOne 2006 Anncios e a Participao Brasileira

detalhes sobre sobre as novas


funcionalidades podem ser
vistos no artigo de Yara e
Vinicius Senger a seguir.
Alguns dados apresentados
sobre os testes de compatibilidade e funcionalidade do Java
impressionam:
O Java 6 est sendo testado
em 24 sistemas operacionais,
em 84 configuraes
So executados 20.244 testes funcionais e 6.930 testes de
unidade e de regresso.
Movido a Java: Tommy, veculo controlado por um sistema 100% Java,
H 92.316 testes de comvencedor de um Dukes Choice Award
patibilidade, para que uma
JVM seja certificada como
das na palestra Mastering Mustang and
Java Compatible.
Developing Dolphin. No Mustang (Java 6)
teremos mais suporte a XML e Web SerPara o Dolphin (JSE 7) os trabalhos esto
vices, inclusive com um micro Web Server
atualmente focados em:
na JVM, caracterstica que a meu ver s
Suporte a linguagens de scripting (JSRservir para que o download da JVM fique
292)
maior. Alm disso, o JDK da Sun ter o
Uma nova forma de empacotamento,
Java DB, um banco de dados totalmente
versionamento e distribuio de pacotes
escrito em Java baseado no Apache Derby,
(JSR-277: Java Module System) para faciintegrado no pacote, porm este no faz
litar o trabalho com JARs, localizao e
parte da especificao e nem do JRE. Mais
mudana de classpath

Palestras de brasileiros

eja a seguir os BoFs e Sessions apresentados


por brasileiros na conferncia:

BOF-234 Creating NetBeans Plug-ins for


Integration With JavaServer Faces, Hibernate,
Spring, and EJB 3.0 Technology Edgar A. Silva e
Alexandre Gomes.

Aconteceram tambm vrias palestras informais


no Java.net Community Corner 2006, um grande
estande localizado no Pavillion:
Java Tools Community Fabiane Nardon
Greenbox in Detail Edgar Silva

BOF-2000 Object-Based Reports for Java


Desktop Technology and the Java EE Platform
Fernando Lozano.

Java Champions Bruno Souza and Yakov Fain


interview each other

BOF-7831 Device Management for Mobile


Applications Fabiano Cruz e Jens Paetzold

The Virtual Health Network at WHO Milton


Lapido

BOF-2368 Restructuring a Web Application,


Using Spring and Hibernate Gustavo de Paula e
Devendra Tewari
TS-3881 Full-Scale Java Platform Diagnostics for
Production Environments Flavio Bergamaschi.
BOF-0518 Multi JVM Control Panel: A Mechanism for Monitoring and Controlling Java Virtual
Machines Flavio Bergamaschi.
TS-4619 How to Represent the Architecture
of Your Enterprise Application Using UML 2.0 and
More Paulo Merson

10 Java Magazine Edio 37

Rybena: Java cell phone for the deaf community


Daniel deOliveira
8 years of DFJUG: A vision Daniel de Oliveira
The State of F/OSS Java VM's Fernando Lozano
Packaging Java apps for Linux using JPackage
Fernando Lozano
Fedora Core Linux Bundled Java Apps
Fernando Lozano
Mouse Gestures Plugin for NetBeans Paulo
Silveira and Evandro Machado

Facilidade de desenvolvimento para desktop, com melhorias no binding, um mecanismo que


faz a ligao entre dados da aplicao
e os componentes de interface grfica,
automatizando o preenchimento dos
componentes e dos dados (JSR-295:
Beans Binding e JSR-296: Swing
Application Framework).
Alm disso, durante o
evento foram divulgados
nmeros interessantes sobre a plataforma Java:
O Mercado Java tem
um valor estimado de
100 bilhes de dlares
H no total 3.3 bilhes de dispositivos
com suporte tecnologia.
J somos 5 milhes de
desenvolvedores Java.

Referncias ao Brasil e
a participao brasileira
Alm da referncia de John
Gage aos brasileiros na abertura do evento, fomos citados
vrias vezes nos general sessions. Jonathan Schwartz (o CEO
da Sun) disse que a comunidade
Java nunca foi to vibrante, falou do
crescimento do JCP, que atualmente
tem 1052 membros, mostrando um slide
com alguns membros de peso como Sun,
Oracle, Apple, Philips, BEA, IBM e entre
eles estava o SouJava. Continuou falando sobre projetos do governo brasileiro
relacionados a open source, TV Digital e
uso de padres. Terminou dizendo que a
comunidade brasileira esta in fire.
Jeff Jackson falou sobre o
crescimento da comunidade NetBeans,
que j tem mais de
200 committers, e

exibiu um slide com os Community


Stars do NetBeans, entre eles dois
brasileiros: Bruno Souza e Flvia
Coelho. Ao fundo, o slide mostrava
um Duke jogando futebol vestindo
uma bandeira do Brasil como
camiseta.
Ao final do session, mais uma
meno a brasileiros; Flavio
Bianchi, que iniciou o projeto
de traduo do JavaDoc do JDK,
teve seu nome exibido no slide
do JDK Community Stars. Esta
traduo tambm foi citada na
palestra Mastering Mustang and
Developing Dolphin, que destacou o
projeto como primeira iniciativa para traduzir o JavaDoc (o projeto j conta com 150
voluntrios). E no slide de participantes do
Expert Group do JEE 5, estava outro nome
conhecido: Felipe Leme (colaborador da
Java Magazine).
Apesar de grande destaque nos general
sessions, tivemos menos palestras brasileiras aprovadas neste ano do que nos

ltimos. Foram ao todo sete apresentaes,


j contando as realizadas por brasileiros
radicados no exterior.
Um destaque foi o Java.net Community
Corner, um pequeno auditrio montado
no pavilho, onde lderes de projetos e
comunidades puderam fazer pequenas
palestras. Vrios brasileiros marcaram
presena. Veja o quadro Palestras de
brasileiros para uma lista completa.
Outro ponto importante na participao
brasileira foi a presena de vrios representantes de empresas como Petrobras,
UOL e Globo.com, mostrando o interesse
e a utilizao de Java nas grandes corporaes brasileiras.

Concluses
O JavaOne 2006 teve como principais
assuntos JEE 5, SOA e Web 2.0, os quais
certamente estaro presentes no dia-a-dia
dos desenvolvedores e empresas. importante estarmos preparados para desenvolver aplicaes com estas tecnologias. Para
ns brasileiros, ficou a sensao de termos

NetBeans Day 2006

JavaOne o grande encontro da comunidade Java mundial, com vrios eventos


paralelos, reunies do java.net e festas patrocinadas por empresas. O maior desses eventos foi a segunda edio do NetBeans Day,
realizado no dia 15 de maio, um dia antes do
JavaOne, com a presena de mais de mil desenvolvedores. As palestras e demonstraes
foram divididas em dois grandes temas:
Suporte a JEE 5 e SOA do NetBeans 5.5
(atualmente em beta).
Aplicaes desktop com Swing e suporte
a JME no NetBeans
Para JEE 5, o NetBeans proporciona mais produtividade,
com uma srie de wizards
para a criao de aplicaes utilizando EJB 3
e a nova API padro
de persistncia em
Java. O suporte a
SOA e criao
de Web Services
tambm conta
com wizards.
Destaque para

a ferramenta de design visual para BPEL que


facilita a criao de aplicaes que fazem a
orquestrao de Web Services. Essas e outras
funcionalidades, como suporte a padres de
segurana de Web Services e uma ferramenta
de modelagem UML, esto disponveis em
um pacote adicional chamado NetBeans
Enterprise Pack.
Durante o dia, houve ainda algumas apresentaes sobre a evoluo no suporte
ao desenvolvimento de aplicaes Swing,
com o uso do editor visual de interfaces
Matisse, alm de palestras sobre plug-ins
para desenvolvimento de aplicaes para
celulares baseadas em CDC/ JME, com demonstraes da integrao do NetBeans
com a JSR-209 (Advanced Graphics and
User Interface Optional Package for the
J2ME Platform).
Outros anncios importantes foram o de um
plug-in para integrao com o Subversion, e
do Jackpot, um conjunto de extenses do NetBeans para refatorao de cdigo que permite
a definio de regras usando uma linguagem
simples, a Jackpot Rule Language . O Jackpot
permite ainda a exportao e o compartilhamento de scripts de refatorao.

participado da melhor edio do evento


para o nosso pas e para a comunidade
Java brasileira.
Agora vamos nos preparar para submeter
palestras para o prximo ano, e aguardar o
que nos reserva o JavaOne 2007 (que ser
realizado entre 8 a 11 de maio). Ou ainda
este ano, no JavaPolis, o JavaOne europeu, cujo organizador, Stephan Janssen,
cobrou a participao dos brasileiros

java.sun.com/javaone
Site do JavaOne 2006
java.sun.com/javaone/sf/sessions/
general
Vdeos e podcasts com os general sessions
www28.cplan.com/javaone06_cv_124_1/
sessions_catalog.jsp
Download das palestras do evento
jnpodcasts.dev.java.net
Podcasts do java.net Community Corner 2006
glassfish.dev.java.net/
Servidor JEE 5 open source download e
documentao
www.perronerobotics.com/tommy.htm
Site do carro conceito vencedor de um Dukes
Choice Award
jcp.org/en/jsr/detail?id=220
JSR 220 Enterprise JavaBeans 3.0
jcp.org/en/jsr/detail?id=209
JSR 209 Advanced Graphics and User Interface
Optional Package for the J2ME Platform
jcp.org/en/jsr/detail?id=295
JSR 295 Beans Binding
jcp.org/en/jsr/detail?id=296
JSR 296 Swing Application Framework
jackpot.netbeans.org
Jackpot, extenso do NetBeans para refactoring
inteligente

Fabio Luis Velloso


(fabio@soujava.org.br) Bacharel em Cincia da Computao
pela Universidade Federal de So
Carlos (UFSCar), diretor e fundador
do SouJava.Trabalha em projetos de desenvolvimento
utilizando diversas tecnologias da plataforma Java e
professor de Arquitetura Orientada a Servios e Web
Services do curso Desenvolvimento de Software para
Web da UFSCar.
Edio 37 Java Magazine

11

JavaOne 2006

Uma Perspectiva

Tecnologias, APIs, especificaes e nme

odos os anos, esperamos ver no


JavaOne grandes anncios, mas boa
parte da comunidade j conhece e
acompanha as novidades mesmo antes
do evento. Isso porque, como sabemos, o
processo de evoluo da tecnologia Java
acontece atravs do Java Community
Process (JCP), com muitas informaes
publicamente discutidas em fruns e blogs, e decises

e requisies disponveis atravs do site


jcp.org. Por outro lado, o JavaOne confirma
tendncias, e uma oportunidade de ver
os lderes de projetos e executivos de grandes empresas envolvidas com a tecnologia
Java apresentarem as principais novidades
em especificaes, APIs e produtos.
Como sempre, o JavaOne apresenta um
grande tema tcnico, que pode ser resumido, na edio de 2006, em trs palavras:
AJAX, Web 2.0 e SOA. Essas tecnologias
j estavam presentes nos anos anteriores,
mas com muito menos destaque. E os
grandes temas dos anos anteriores
como Web Services, Java ME e novas
verses do Java SE e Java EE, continuaram presentes neste ano.

Principais destaques tcnicos


Apresentamos aqui uma
seleo dos principais assuntos abordados no JavaOne,
com enfoque tcnico. Foram
tratados outros assuntos
importantes como Java ME,
performance e tuning de
aplicaes e JVMs, mas
no JavaOne preciso
escolher uma famlia de
temas para acompanhar,
e apresentamos aqui
nossa perspectiva do
evento.

AJAX (Asynchronous JavaScript and XML)


Poucos meses atrs, a comunidade no
conseguia discernir exatamente o papel do
AJAX no cenrio de desenvolvimento, ou
mesmo o quanto de inovao existia nesta
tecnologia. Hoje j fica mais fcil arriscar
dizer que, embora no haja nenhuma
grande novidade nos conceitos apresentados com AJAX, a tecnologia realmente
veio para ficar.
Houve um grande nmero de sessions
com AJAX no ttulo, e muitas outras que
citavam suporte a essa tecnologia atravs
de frameworks e componentes. A maioria
estava lotada. Alm disso, diversos estandes no pavilho apresentaram solues
para utilizao de AJAX. Veja um pouco
mais sobre a tecnologia no quadro O que
AJAX?.
A grande estrela entre os exemplos
de AJAX foram os servios oferecidos
pelo Google, principalmente o Google
Maps, que pode ser utilizado por outras
aplicaes atravs de um Web Service.
Foram mostrados exemplos onde o servio
Google Maps utilizado para mostrar os
bares onde possvel tomar cerveja perto
do local do evento, entre outras demonstraes mais srias.

Web 2.0
O termo Web 2.0 refere-se nova gerao de servios disponveis na web, que
possibilitam aplicaes mais parecidas
com aplicaes desktop, com a utilizao
de Web Services, AJAX, e podendo incluir
outras ferramentas como Wikis e blogs.
O Web 2.0 tem como principais smbolos
aplicaes como Google Maps e Flickr, entre outras, e o assunto esteve presente em
diversas technical sessions do evento.

SOA
Um dos destaques relacionado a SOA
(Service-Oriented Architecture) este ano foi

12 Java Magazine Edio 37

Tcnica

ros que marcaram a conferncia


Yara Senger e Vinicius Senger
o suporte que as IDEs Java comeam a oferecer para BPEL (Business Process Execution Language). Esta linguagem, baseada
em XML, utilizada para orquestrao
de servios, permitindo que estes sejam
incorporados em workflows e processos
em aplicaes compostas (composite applications outro destaque do JavaOne 2006),
que so construdas atravs da utilizao
de mltiplos servios.
Houve demonstraes no NetBeans e
tambm no JDeveloper da Oracle, IDEs que
trazem recursos fascinantes para suporte a
BPEL, Web Services e XML Schema.

Tiger, Mustang e Dolphin


As prximas verses do Java SE seguem
o padro de numerao adotado no Java
5 (Tiger); ou seja, teremos o Java SE 6
(Mustang) e o Java SE 7 (Dolphin).
Houve vrias menes s novidades do
Mustang e perspectivas do Dolphin nos
General Sessions, assim como Technical
Sessions especficas sobre alguns dos

recursos mais importantes. A seguir


apresentamos as principais novidades
planejadas para cada uma dessas verses,
assim como alguns fatos anunciados sobre
a verso atual.

Tiger
Na technical session Mastering Mustang,
Developing Dolphin (TS-3439), apresentada
por Danny Coward (Senior Staff Engineer)
e Mark Reinhold (Java SE Chief Engineer), ambos da Sun, foram apresentados
nmeros interessantes sobre o Java SE 5.
O objetivo era demonstrar a consolidao
desta verso do Java no cenrio de desenvolvimento atual:
Mais de 260 milhes de downloads
Estimativa de que 60% das mquinas
novas j venham com o Java 5 instalado
Benchmarks indicando que Java SE 5
mais rpido no cliente e no servidor, e
perspectivas de que Java SE 6 ser ainda
melhor (veja a Figura 1).

Performance do Java
Normalizado para performance do J2SE 1.2.2

Server Benchmark: SPECjbb2000


350
325
300
275
250
225
200
175
150
125
100
75
50
25
0
J2SE 1.3.1

J2SE 142

Tiger

Figura 1. Benchmark da performance na JVM com as configuraes para servidor extrado


do material apresentado na sesso TS-3439

Mustang Beta

Mustang
O Early Draft da especificao do JSE 6
foi publicado em 21 de dezembro de 2005,
atravs da JSR-270, e o lanamento do release final est previsto para outubro deste
ano. Algumas das novidades e JSRs que
estaro presentes no Mustang so:
Facilitar o desenvolvimento atravs de
processadores de annotations (JSR 269);
JDBC 4.0 (JSR-221);
Suporte a Scripting Languages (JSR223);
Anotaes comuns para suporte a Web
Services (JSR-250);
Incluso do Java DB no JDK
Incorporao do gerenciador de layout
GroupLayout, utilizado pelo construtor de
interfaces grficas Matisse do NetBeans,
para facilitar a criao de telas com dragand-drop em IDEs.

Suporte a Scripting Languages


A JSR-223, Scripting Pages in Java Web
Applications, ainda em estgio inicial,
define como ser realizada a ponte entre
linguagens de scripting e a plataforma
Java como escrever e empacotar classes
Java que devero ser acessadas por diferentes linguagens de script, e tambm
quais objetos de uma aplicao web, como
Session, ServletContext, HttpServletRequest e
HttpServletResponse devero estar expostos
para acesso por linguagens de scripting
(ex.: PHP). provvel que estes objetos
sejam disponibilizados para as linguagens
atravs de uma API Java que utilize JNI
(Java Native Interface).
A especificao ser definida baseandose na linguagem PHP e ser construdo
(na implementao de referncia) um
engine para esta linguagem. No entanto
ser garantindo que o engine seja vivel
para outras linguagens e independente
de PHP, sendo possvel criar mecanismos
para JavaScript e Groovy, por exemplo.
Edio 37 Java Magazine

13

JavaOne 2006 Perspectiva Tcnica

Veja a seguir um exemplo de como ficaria


o cdigo PHP para criao e impresso
de um objeto da classe java.util.Date, com
a JSR-223.

Novo formato de deployment e empacotamento;


Simplificao do desenvolvimento
Swing.

//Criao de um objeto Date


$javadate = new Java(java.util.Date);
// Chamada ao mtodo toString()
$date =$javadate->toString());
// Impresso da data
echo($date);

Na General Session apresentada por


Graham Hamilton, arquiteto lder dos
releases do JDK 1.3, 1.4 e 5.0, e agora responsvel pelo planejamento das prximas
verses do Java SE, foi ressaltada a cautela
necessria para alteraes na sintaxe da
linguagem. Foram tambm indicadas
algumas funcionalidades que, embora
solicitadas por parte da comunidade,
provavelmente no estaro presentes no
Dolphin; por exemplo, a sobrecarga de
operadores (operator overloading).
Hamilton disse tambm que o JSE 7
provavelmente suportar a passagem de
mtodos como parmetros. Citou como
exemplo os listeners de eventos de Swing.
Neste caso, com o novo recurso, poderamos passar um mtodo, eliminando a
necessidade de implementar uma interface
listener.
Apresentamos a seguir, com mais detalhes, algumas das novidades citadas.

Suporte a JavaScript
Alm do engine PHP citado, tambm ser
includo no projeto Mustang um engine
JavaScript baseado no projeto Mozilla Rhino, que uma implementao open source
de JavaScript. Isso permitir que cdigo
JavaScript seja misturado a cdigo Java.

JDBC 4.0
A JSR-221 JDBC 4.0 API Specification
visa atualizar e facilitar a utilizao da
API JDBC aproveitando recursos do Java
SE 5 como Generics e Annotations, alm
de prover novas classes utilitrias.

Java DB
O Java DB uma verso do gerenciador
de banco de dados open source Apache
Derby, com mesmo cdigo fonte e mesmos
binrios, mas com suporte da Sun. Este
banco de dados relacional escrito em
Java, e pode ser facilmente distribudo com
suas aplicaes.

Dolphin
Embora a verso Java SE 6 ainda no esteja pronta, o planejamento para a verso
Java SE 7 (Dolphin) j comeou. Apresentamos aqui alguns itens de destaque que
podero fazer parte do Java 7:
Passagem de mtodos como referncia;
Suporte a propriedades
(para o padro JavaBeans
getPropriedade() e setPropriedade());
Supor te n at ivo a
XML;
Criao de novos
engines para suporte a linguagens de
script, como BeanShell;

14 Java Magazine Edio 37

Suporte nativo a XML na linguagem


A idia do suporte nativo a XML na linguagem minimizar o trabalho necessrio
para criar, popular e alterar arquivos XML
em aplicaes Java.
Atualmente h formas comuns de se
fazer isto. A primeira utilizar um parser

DOM ou SAX mas mesmo as APIs mais


simples ainda so complexas de usar, exigindo muitas linhas de cdigo para cada
operao. A segunda forma utilizar uma
API de XML binding, como por exemplo
o JAXB, que vincula objetos Java a documentos XML, possibilitando que algumas
operaes sejam realizadas nos objetos e
depois serializadas em XML (neste caso
necessrio a utilizao de um DTD ou
XML Schema).
O suporte nativo a XML na linguagem
Java tem como objetivo atender especialmente aos casos em que precisamos
manipular ou criar documentos XML que
no esto mapeados para um objeto e no
tm DTD ou XML Schema associado. Isso
ser til, por exemplo, em cenrios onde
cada parte de um documento XML criado
separadamente para que no final do processo, as partes sejam unidas e validadas
com um XML Schema ou DTD.
A sintaxe que ser utilizada ainda no foi
definida, e h duas opes em avaliao.
A primeira baseada em tags XML, como
a seguir:
XML cliente1 = <cliente>
<nome>{Joao}</nome>
</cliente>

Embora tenhamos que abrir e fechar cada


elemento, a notao ser muito familiar
para quem utiliza XML.
A segunda forma apresentada utiliza o
caractere de sustenido:

O que AJAX ?

JAX uma abreviao para Asynchronous


JavaScript + XML. No uma nova tecnologia, mas uma forma de utilizar tecnologias
j existentes para melhorar a usabilidade e
a interatividade das interfaces web. O termo
foi criado por Jesse James Garret, da empresa
Adaptive Path, e engloba as seguintes tecnologias:
Apresentao baseada em tecnologias padronizadas, utilizando XHTML e CSS;
Exibio e interao dinmica utilizando
DOM;
Troca e manipulao de dados utilizando
XML e XSLT;
Recuperao de dados assncrona utilizando

XMLHttpRequest;
Uso de JavaScript para a ligao entre todos
esses elementos.
O princpio bsico para obter uma maior
interatividade nas interfaces web, adotado
pelo AJAX, consiste em atualizar somente a
parte da pgina que deve sofrer alterao e
no o documento inteiro. Isto pode ser feito
atravs do elemento XMLHttpRequest, que
cria uma thread para enviar uma requisio
para o servidor. A resposta do servidor depois
recebida atravs de um documento XML, que
processado por cdigo JavaScript que faz a
extrao dos dados e atualizao da pgina.

XML cliente2 = #cliente {


#nome { Maria}
}

Observe que esta sintaxe um pouco


mais enxuta, visto que marcamos apenas
o incio das tags.
Qual voc gosta mais? Foi assim que foi
concludo este assunto na palestra Mastering Dolphin and Developing Mustang,
com uma rpida pesquisa de opinio sobre
o assunto.

Beans Binding
A nova funcionalidade de Beans Binding,
descrita na JSR-295, foi criada para minimizar os problemas encontrados na sincronizao de propriedades de JavaBeans.
Em uma aplicao Swing, por exemplo,
muito comum a necessidade de sincronizar
o contedo de um JavaBean que representa
o objeto do modelo (ex.: um objeto Cliente),
e uma propriedade do JavaBean que representa um componente de interface com o
usurio, como um JTextField.
Com a nova JSR, o vnculo entre as
propriedades poder ser configurado facilmente, indicando se deve ser realizada
uma converso de tipos, ou feita uma validao antes dos valores serem copiados
de um JavaBean para outro.

Swing Application Framework


Grande parte das aplicaes desktop
possui as mesmas necessidades para
inicializao, finalizao, gerenciamento
do estado da aplicao, gerenciamento de
recursos e aes de reposta para interao
com o usurio. No entanto, no h nenhum
framework padro para construo de
aplicaes desktop, como h para aplicaes web (por exemplo, Struts e WebWork).
Assim, atualmente os desenvolvedores
tm que criar toda a infra-estrutura para
a aplicao a partir do zero.
O Swing Action Framework, definido
pela JSR-296, visa suprir esta lacuna,
oferecendo um framework extensvel que
suporta funcionalidades comuns a muitas
aplicaes desktop.

Java Module System


Embora arquivos JAR sejam amplamente
utilizados para distribuio e execuo de
aplicativos Java, eles no oferecem alguns

recursos que facilitariam muito a distribuio, como especificar e garantir quais


so as dependncias de um JAR.
A JSR-277 (Java Module System) tem como
objetivo criar um novo formato para distribuio de aplicaes. Ela define mdulos
Java para empacotar todos os recursos
necessrios para uma aplicao. Tambm
especifica os metadados da aplicao, que
indicaro as dependncias e elementos
do mdulo, alm de uma lista indicando
quais elementos do mdulo devem estar
expostos (evitando que elementos sejam
expostos desnecessariamente).
Dever ainda ser oferecido pela implementao da JSR-227 um conjunto de ferramentas de suporte instalao e remoo
de mdulos Java.

Project Simplice
Visual Basic na plataforma Java
O objetivo do projeto Simplice reaproveitar o conhecimento que os programadores Visual Basic tm da linguagem,
permitindo que cdigo VB seja escrito dentro de mtodos Java e que possa invocar
mtodos Java. O cdigo VB ser compilado
para classes Java que podero ser executadas pela JVM. Note que o Simplice no
visa portar aplicaes escritas em Visual
Basic para Java, pois essas aplicaes so
geralmente fortemente vinculadas a APIs
do Windows sendo portanto dependentes
de plataforma.

Expandindo a plataforma
Java para outras linguagens
Atualmente a linguagem Python suportada em Java atravs do projeto Jython,
e Ruby atravs do JRuby. O objetivo
permitir que a mquina virtual suporte
diretamente linguagens dinmicas e
de scripting, expandindo a plataforma
Java. Esta funcionalidade est definida
na JSR -292: Supporting Dynamically-Typed
Languages on the Java Platform.

Concluses
Participar do JavaOne sempre bom;
uma somatria de coisas interessantes,
contatos, palestras, discusses, novidades.
Faz a gente admirar ainda mais a evoluo
da tecnologia Java, e tudo que est a seu

redor.
Se voc no pde participar, aqui esto
algumas sugestes para tirar proveito do
que foi gerado e discutido no evento:
Assistir os General Sessions que esto
disponveis no site do JavaOne.
Procurar pelas apresentaes sobre
assuntos de seu maior interesse no site
do evento. Os slides de todas as Technical
Sessions esto disponveis em PDF.
Ficar atento aos blogs dos lderes das
principais especificaes (h vrios no
portal Java.net)

jcp.org
JCP onde voc poder encontra a
especificao de todas as JSR citadas no
artigo
java.sun.com/javaone/sf/sessions/general/
index.jsp
Videos das General Sessions
developers.sun.com/prodtech/javadb
JavaDB
blogs.sun.com/roller/page/dannycoward?
entry=mastering_mustang_developing_
dolphin
Danny Coward blog com link direto para
apresentao do JavaOne

Yara M. H. Senger
(yara@globalcode.com.br)
formada em Cincias da Computao na USP em So Carlos,
especialista em desenvolvimento web;
possui as certificaes SCJA, SCJP e SCWCD. Atualmente
Instrutora e Diretora Educacional da Globalcode, criadora e coordenadora de diversos cursos das carreiras
Academia do Java e Academia do Web Developer.
Vinicius Senger
(vinicius@globalcode.com.br) com
mais de 15 anos de experincia em
desenvolvimento, diretor e fundador
da Globalcode especialista em Arquiteturas Java e desenvolvimento Java Enterprise Edition;
possui as certificaes SCJA, SCJP e SCEA (1). Criador
e coordenador das carreiras Academia do Arquiteto e
Academia do Enterprise Developer na Globalcode.

Edio 37 Java Magazine

15

JavaOne 2006

Open Source em F

Lanamento de projetos como open sour

era-feira, 16 de maio. J passavam


do meio dia no Brasil, mas o JavaOne estava apenas comeando em
So Francisco, Califrnia. A poucos metros
do palco principal, duas fileiras de cadeiras
ocupadas por brasileiros: a nossa pequena
e ruidosa delegao j se mostrava presente. Aps a introduo inicial de John Gage,
Jonathan Schwartz sobe ao palco, anunciase como o novo CEO da Sun Microsystems,
fala sobre Open Source e, assim sem mais
nem menos, cita a enorme comunidade
brasileira e nominalmente fala do SouJava.
Comeava bem o JavaOne 2006, o maior
evento de desenvolvedores do planeta.
Mesmo depois de anos participando do
JavaOne, cada edio uma nova experincia. Esse ano participei do T-Shirt
Hurling Contest (concurso de lanamento
de camisetas) com uma equipe formada
por vrios brazucas, e co-produzi durante
o evento um filme amador com alguns dos
principais astros da tecnologia Java. S
essas atividades j fizeram valer o JavaOne
2006, mas o que me chamou ateno desde
o primeiro minuto foi a nfase dada a open
source dentro do evento, e em especial
pela Sun. Desde

16 Java Magazine Edio 37

o incio da tecnologia Java, quando nem o


termo open source existia, a comunidade
Java usa, adota e desenvolve projetos sob
licenas que promovem a liberdade. Mas
neste ano o movimento open source foi
tratado com especial importncia.
A Sun, atravs do seu CEO e outros
executivos, falou no assunto j no incio
do evento, como que para deixar claro
seu comprometimento com open source.
Do seu jeito sem rodeios, Schwartz foi
direto ao tema. Ao apresentar Rich Green,
executivo que acaba de voltar empresa
e que no passado foi responsvel por
fazer renascer a ferramenta NetBeans,
Schwartz perguntou de bate-pronto:
Rich, quando vamos colocar Java sob
uma licena open source?. Green, que de
acordo com Schwartz ser o responsvel
por fazer isso acontecer, respondeu com
a frase que deu o tom discusso: no
uma questo de se, mas de como.
Infelizmente, foi uma resposta muito
fraca para uma pergunta to importante.
No ano passado, Schwartz j havia deixado
claro que a Sun, no momento certo, iria
disponibilizar todos os seus softwares sob
licena open source, inclusive sua
implementao de Java. E
isso j estava embutido na pergun-

ta que no foi se, mas sim quando. Green


apenas respondeu o mesmo que Schwartz
perguntou, algo que j est definido h
mais de um ano. E com essa no-resposta, conseguiu no agradar a ningum, ao
mesmo tempo que tirou a ateno dos
outros anncios sobre open source feitos
pela Sun, que foram brilhantes...
Portanto, vamos esquecer por um minuto
essa discusso sobre a implementao da
Sun, e ir direto para os outros anncios sobre open source feitos durante o primeiro
dia do JavaOne. E ver de que forma isso
afeta ns desenvolvedores Java.
Em um esforo chamado genericamente
de OpenJava, a Sun disponibilizou sob
licena open source diversos softwares que
sero de uso imediato nos mais diversos
projetos Java. Desde um servidor de aplicaes JEE completo a um engine de portal,
ferramentas de desenvolvimento e mais.

Projeto Glassfish: Open JEE


Para quem vem acompanhando o desenvolvimento da nova verso da especificao Java Enterprise Edition (JEE), no ser
novidade

oco

ce movimentam o JavaOne
Bruno Souza
que o projeto Glassfish a implementao
de referncia do JEE 5, e que est sendo
desenvolvido em um projeto open source
(sob licena CDDL) desde o seu anncio no
JavaOne do ano passado. A novidade que
o Glassfish, agora tambm chamado de
Open JEE, est disponvel em sua verso
final, e o primeiro servidor de aplicaes
a suportar a nova especificao.
Com o Glassfish os desenvolvedores
j tm acesso s novas funcionalidades
do padro JEE 5, como suporte a EJB 3.0,
incluindo as novidades em persistncia e
o suporte s ultimas verses de especificaes de Web Services. O Glassfish ainda
traz um servidor web (Projeto Grizzly)
completamente reimplementado usando
Java NIO, com performance melhor e
suporte a um maior nmero de conexes
simultneas.
No palco principal do JavaOne, reuniramse representantes de todas as empresas que
participaram da definio da especificao
JEE, para formar a frase Compatibility
Matters (Compatibilidade importante).
O comprometimento demonstrado por
essas empresas, junto ao lanamento de
um produto open source como o primeiro servidor JEE 5 no mercado, fortalece o
padro, que foi uma das grandes vedetes
deste JavaOne.

Open Message Queue


e WebServices Integration
Para quem se interessa
por SOA e Web Services, a Su n anu nciou o projeto Open
M e s s a g e Q u e u e,
uma implementao open source
do Java Message
System (JMS). O
Open MQ baseado no cdigo

Abertura em destaque: Jonathan Schwartz e Richard Green discutem participao e open source
do produto Sun Java System Message
Queue, e por isso j traz funcionalidades
como clustering e criptografia segura,
integrao com mensagens SOAP e HTTP,
e uma API permitindo uso por aplicaes
no-Java. portanto um projeto recente,
mas que j traz funcionalidades maduras
para o ambiente corporativo, o que deve
permitir o uso imediato no apenas em
aplicaes internas que necessitem de uma
implementao de messaging robusta,
mas tambm em projetos de integrao
business-to-business.
Ainda na linha SOA, outro anncio
importante foi a disponibilizao como
open source da Web Services Interoperability Technology (WSIT), uma coleo
de implementaes de Web Services que
abrange segurana, mensagens, qualidade
de servio e outros. Conhecido como Projeto Tango, o WSIT facilita a integrao
com o ambiente .NET da Microsoft, simplificando a vida de quem precisa interagir
com o ambiente Windows Communication
Foundation (WFC), a infra-estrutura de comunicao para Web Services da Microsoft
(antigamente conhecida como Indigo).
mais um projeto open source que ir dimi-

nuir os custos de implantao de solues


Java, e em especial facilitar a migrao para
Java daqueles desenvolvedores que ainda
esto presos a um nico fornecedor.

Servidor de Portal
e Business Integration
Continuando na direo de disponibilizar todos os seus softwares sob licena
open source, a Sun lanou mais dois projetos relacionados a servidores de aplicaes
e SOA: um servidor de portal, e um sistema
de Business Integration (BI).
Baseado no produto Sun Java System
Portal Server, o projeto OpenJava Portal
um servidor de portais completo, que tambm ser liberado sob licena open source.
Compatvel com a JSR-168 (Portlets), esse
servidor inclui um container para execuo de portlets, servios de colaborao
e federao de portais, e um engine de
busca, bem como recursos para integrao
com web services e dispositivos mveis. O
projeto inclui ainda vrios portlets prontos
que podero ser utilizados diretamente no
seu portal.
J o Open ESB uma implementao da
Edio 37 Java Magazine

17

JavaOne 2006 Open Source em Foco

JSR-208 (Java Business Integration JBI),


e junto com o servidor Glassfish, ser
uma plataforma completa para Business
Integration, incluindo um engine BPEL
(Business Process Execution Language),
que permite processar fluxos de trabalho
complexos em interaes corporativas
ou business-to-business. O Open ESB
um sistema corporativo que antes estava
disponvel como produto da SeeBeyond,
empresa que a Sun comprou em 2005.

Ferramentas de Desenvolvimento:
Adies Corporativas para o NetBeans
claro que nenhum evento voltado para
desenvolvedores poderia estar completo
sem anncios a respeito de ferramentas de
desenvolvimento. O NetBeans, que esteve
em foco durante boa parte do JavaOne,
ganhou uma srie de funcionalidades
nos ltimos meses, desde recursos vindos
de produtos consagrados, at novidades
diretamente sadas dos laboratrios de
pesquisa.
O primeiro dos projetos anunciados, e
que j est disponvel nas ltimas verses
beta do NetBeans, o Enterprise Pack, um
conjunto de extenses voltadas para projetos corporativos, que antes compunham o
produto Java Studio Enterprise. O Enterprise Pack open source e traz suporte a
todas as funcionalidades do JEE 5, alm
de editores de UML e BPEL, entre outras
novidades.
O editor visual de UML mantm sincronizados o cdigo Java e os diagramas. So
suportados os diagramas mais importantes, e a ferramenta traz funcionalidades
para levantamento de requisitos e mesmo
modelagem abstrata (ex.: modelos de domnio), sem utilizao da linguagem Java.
Com isso, possvel integrar, em uma
ferramenta, as necessidades
variadas de desenvolvedores, arquitetos,
projetistas e documentadores.
O editor
visual de

18 Java Magazine Edio 37

BPEL e WSDL j vem integrado com o


engine BPEL de que falamos anteriormente, e adiciona ao NetBeans o suporte
a Business Integration. possvel fazer
o desenho visual de fluxos de trabalho e
interligaes de processos, alm da criao
de servios desacoplados e sua composio
em aplicaes SOA. Tudo isso integrado
com o resto da ferramenta, permitindo por
exemplo o uso do debugger do IDE para a
depurao passo a passo dos processos de
negcio. O Enterprise Pack traz ainda funcionalidades de gerenciamento de identidade, com integrao com Web Services e
tambm federao de servios atravs do
Projeto Liberty.

A Sun tambm anunciou a futura disponibilizao do Sun Java Studio Creator


como open source. As funcionalidades da
ferramenta sero integradas como plugins do NetBeans ainda este ano. O Studio
Creator uma ferramenta para desenvolvimento visual de aplicaes web. Com isso,
o NetBeans, que j possui um sofisticado
construtor de interfaces grficas (o Matisse), passar a contar com a facilidade da
construo visual de interfaces JSF e Web
2.0 (AJAX etc.) que existe no atual Studio
Creator.

Direto do laboratrio de pesquisas


A Sun disponibilizou tambm alguns

Mais do que palestras

ntre as caractersticas mais marcantes


do JavaOne est o fato de ser um desfile
de estrelas da tecnologia Java. Todo mundo
est la. um circulo virtuoso: todos acham
que todos iro e ningum quer ficar de fora.
Em um mundo to virtual como o nosso, onde
projetos e amigos parecem mais uma lista de
convocados da seleo brasileira cada um
joga em um pas o JavaOne acaba sendo a
grande oportunidade do ano de se conversar
e trocar idias, e de ter aquele contato cara
a cara que to importante para formar
amizades e fortalecer relacionamentos.
Tambm, como John Gage procura sempre
repetir, o lugar ideal para se fazer novos
amigos e conhecer pessoas. Os brasileiros
costumam tirar isso de letra. A estratgia
de sermos poucos, mas barulhentos, atrai a
ateno e quebra o gelo. Os relacionamentos
criados a partir disso se tornam importantes
na volta, e ajudam a integrar a comunidade
brasileira comunidade internacional. Por
isso, ir ao JavaOne no s assistir
palestras ; estamos sempre
tentando colocar o Brasil
em evidncia.
Esse ano, o Brasil j
comeou a se destacar
desde o primeiro
m o m e nto. J n o
N e tB eans Day, a
vedete do show foi
u m a r e v is t a q u e
apresentava artigos

sobre a IDE open source da Sun. Com verso


impressa distribuda a poucos e disputada
por todos a NetBeans Magazine foi inteiramente produzida e editada no Brasil (em
ingls), inclusive com artigos de Fernando
Lozano e Osvaldo Doederlein, e edio de
Leonardo Galvo, colocando os brasileiros
em destaque desde o dia zero do JavaOne.
E na categoria outras atividades esse ano,
pelo menos para mim, foi especial. Participar
do Concurso de Lanamento de Camisetas
(T-Shirt Hurling Contest), foi muito divertido.
Desde as conversas para submeter a idia
e construir a mquina aqui no Brasil, o que
gerou horas de conversas sobre Java, fsica
e idias mirabolantes (muitas das quais no
levaram a lugar algum); at a apresentao
no evento, ao lado de James Gosling.
Mas o lanador de camisetas foi o pano de
fundo para uma experincia jamais realizada no JavaOne. Com a desculpa de termos
que treinar para chutar camisetas, eu, Ean
Schuessler (provavelmente o mais maluco
dos desenvolvedores Java) e nosso f iel
parceiro, Juggy, mascote mundial dos JUGs,
entrevistamos alguns dos maiores nomes da
tecnologia Java (incluindo James Gosling e
John Gage), e literalmente os chutamos
na cara, com uma gigante, e brasileirssima,
chuteira verde. O resultado um vdeo,
filmado, editado e apresentado no JavaOne
est disponvel para a sua diverso em
javabloggers.gobof.org/JavaOneVideo.

mdulos de extenso para o NetBeans,


vindos de seu laboratrio de pesquisas.
O Projeto Jackpot, desenvolvido pelo Sun
Labs, adiciona ao IDE a possibilidade de
criar scripts de refactoring, capazes de
varrer o cdigo buscando ms prticas
de codificao, ou identificando padres
de cdigo que possam ser melhorados ou
modificados, e realizando as alteraes necessrias. Outro mdulo destacado foi o de
Real Time, que permite o desenvolvimento
e depurao de aplicaes utilizando a especificao Java RTS. O mdulo foi usado
durante o JavaOne em uma competio
de carrinhos de corrida, controlados por
essa tecnologia.
Apesar de quase todo o cdigo disponibilizado ser oriundo de produtos prexistentes, e portanto ser de qualidade
de produo, os projetos citados so
todos projetos open source recentes, e a
grande quantidade de cdigo disponibilizada ainda levar algum tempo para
ser digerida pela comunidade. A maior
parte dos produtos anunciados j est
disponvel como projetos open source imediatamente, mas no todos. No entanto, a
expectativa que todos os projetos anunciados estejam efetivamente ativos at o
final desse ano.

No-anncio
Com todos esses anncios de liberao
de cdigo sob licena open source, a Sun
no precisava ter feito o no-anncio
no incio da palestra do Schwartz. Green,
que justia seja feita estava h apenas
uma semana de volta Sun, acabou dando
a impresso de que a empresa est mais
uma vez empurrando com a barriga a
deciso de liberar sua implementao de
Java como open source. E vendo o histrico dos ltimos anos, bem provvel
que esteja mesmo. Como esse sempre
um assunto polmico, atraiu muitas das
atenes, e acabou por fazer passar despercebida a grande quantidade de projetos
e produtos disponibilizados como open
source, praticamente de uma vez, como
vimos acima.
Mas os projetos open source no se restringiram aos anncios da Sun. Enquanto
Schwartz e Green faziam jogos de palavras, Geir Magnusson, vice-presidente da

Compatibilidade importa: empresas que definiram o JEE 5 demonstram seu comprometimento com compatibilidade
Apache, liderou durante o JavaOne uma
apresentao sobre a situao do projeto
Harmony. O Harmony uma iniciativa
da Apache para construir uma implementao Java certificada e open source.
Magnusson, acompanhado de desenvolvedores que trabalham no projeto, demonstrou entre outras coisas, a implementao
de Swing sendo desenvolvida, que j
capaz de rodar diversas aplicaes de
porte. Apesar do Harmony no ser o nico
projeto indo nessa direo, vem ganhando
importantes contribuies de empresas
interessadas em ver uma implementao
open source do JSE.
At o ano passado, a implementao JEE
da Sun no era open source, embora j
existissem servidores open source certificados como JBoss e JOnAS. Quem sabe, no
prximo JavaOne teremos implementaes
open source do JSE, como Classpath, Kaffe,
GCJ e Harmony, ainda que a Sun at l no
tenha decidido como. A verdade que
a comunidade Java est definitivamente
enraizada nos conceitos de open source, e
temos muito a ganhar com isso.

Concluses
O JavaOne 2006 foi, mais uma vez,
um evento nico e especial. O Brasil foi
lembrado de forma importante, a nossa
delegao contou com representantes
de grandes empresas brasileiras, e o
evento todo foi muito voltado para open
source uma viso adotada fortemente
em empresas e no governo Brasileiro. O
JavaOne um termmetro da direo que
a comunidade Java est indo no mundo
inteiro, e ano aps ano, percebemos que
o Brasil est muito bem posicionado
nessa caminhada.

Bruno F. Souza
(bruno@javaman.com.br) o JavaMan, veterano da tecnologia
Java e um dos lderes do movimento Java no Brasil. Consultor Snior
da Summa Technologies, fundador da Sociedade de
Usurios Java (SouJava), e diretor da OSI (a organizao
que define o termo Open Source mundialmente),
expert individual no JCP e coordenador da comunidade
mundial de JUGs no Java.net.

Edio 37 Java Magazine

19

10 Mais do Ecli

As dez principais melhorias do mais novo r

uando escrevi o artigo Por dentro


do Eclipse (Edio 23), o Eclipse
3.1 ainda demoraria um pouco
at o release final. Aps 16 meses, quando
voc estiver lendo esta edio, o release
final do novo Eclipse o 3.2 j estar
pronto. Para a maioria dos desenvolvedores, chegou de novo a hora de avaliar um
major update da sua principal ferramenta
de trabalho.
Eu disse maioria? Segundo estudos recentes, o Eclipse goza de uma liderana
folgada, mesmo contando somente a distribuio open source1. Entre os concorrentes,
os produtos da IBM j so baseados no
Eclipse, os da Oracle, BEA e Borland vo

pelo mesmo caminho, e o IntelliJ IDEA no


supera nmeros modestos h anos.
Hoje, o maior concorrente outro IDE
open source, o NetBeans, que apesar da
fatia menor de mercado, tem sido um
forte desafio, inovando em reas como
desenvolvimento Swing (com o construtor
de telas Matisse) e Profiling, e saindo
frente do Eclipse em suporte integrado s
plataformas JEE e JME. A Sun tem se tornado ainda mais agressiva recentemente,
doando ao NetBeans ferramentas Enterprise antes s disponveis nos seus IDEs
comerciais2. A disputa entre ambos os
projetos tem sido bonita e acirrada. No NetBeans, temos importao de projetos do
Eclipse, associaes de teclas do Eclipse,
e o NetBeans Rich Client Platform para
fazer frente ao j popular RCP. J
no MyEclipseIDE (um IDE
comercial baseado no

+
20 Java Magazine Edio 37

Eclipse), existe agora um porte do Matisse.


difcil no admirar esta disputa leal num
mercado to importante e competitivo
sem vestgio de tticas como processos
de patentes, explorao de formatos de
arquivo, APIs proprietrias etc. Se os projetos Eclipse e NetBeans provam uma coisa
juntos, que o modelo de cdigo aberto
fora cada projeto a competir satisfazendo o usurio, e oferecendo cada vez mais
funcionalidades e qualidade.
Mas, voltando ao assunto principal, neste
artigo apresentaremos o novo Eclipse 3.2.
Novas funcionalidades individuais so
bem ilustradas pelos j famosos relatrios
New and Noteworthy do projeto Eclipse,
mas pode ser difcil ter uma viso rpida
dos avanos mais importantes, e das conseqncias globais de vrias melhorias.
Neste artigo, tentamos oferecer esta viso,
nos concentrando numa classificao das
10 principais novidades ou melhorias do
novo release.

Suporte a JUnit 4

10

Como sabemos, o JUnit a principal


ferramenta de testes unitrios para Java
(apesar da recente competio com o
TestNG); seu suporte integrado no
Eclipse excelente e certamente
sempre ser. Ocorre que ambos
os projetos so parentes de sangue: o JUnit foi criado por Kent
Beck e Erich Gamma, e Gamma

1
Exemplo:

5 Java

Use and Awareness


Survey, SD Times, Dezembro de 2005.

2
Estas ferramentas, disponibilizadas
como preview no NetBeans 5.5 Enterprise Pack, faro parte da verso 6.0.

pse 3.2

A nova verso do Eclipse


traz centenas de pequenas
e grandes melhorias, do
suporte a ferramentas
atualizadas, a novos
projetos de amplo alcance

elease do Eclipse

Osvaldo Pinali Doederlein


tambm um dos principais arquitetos do
Eclipse, sendo lder do projeto JDT.
O release recente do JUnit 4 uma importante melhoria deste framework de
testes, permitindo a escrita ainda mais
fcil de testes unitrios, ao substituir a
necessidade de herdar de classes como
TestCase ou de seguir convenes como
criar mtodos iniciados por test, pelo
novo recurso de anotaes do Java 5. A
Listagem 1 mostra um exemplo de teste
unitrio criado com a nova verso do JUnit.
Note que s precisamos aplicar a anotao
@Test aos mtodos que so testes unitrios.
Existem mais anotaes, para mtodos
before/after e outras necessidades. Veja
tambm que, como no precisamos estender a classe TestCase, podemos usar a
sintaxe import static do Java 5 para que seja
possvel invocar mtodos como assertTrue()
(que um mtodo static da classe Assert) de
forma direta. O resultado que voc pode
escrever testes unitrios com bem menos
cdigo do que antes.
Note que a API do JUnit 4 no compatvel com a verso 3.x, e a nova verso exige
o JSE 5+. Mas como o JUnit 3.x coloca suas
classes em packages junit.* e o JUnit 4 muda
para org.junit.*, pode-se utilizar ambos
num mesmo projeto, o que permite uma
migrao gradual, ou a convivncia entre
testes unitrios mais antigos feitos com
o JUnit 3.x, e outros novos feitos com a
verso 4.
O suporte a JUnit do Eclipse 3.2 inclui
as bibliotecas das duas verses do JUnit,
Listagem 1. Testando o JUnit 4, suportado pelo Eclipse 3.2.
import static org.junit.Assert.*;
import org.junit.Test;
public class TestJUnit4 {
@Test public void meuPrimeiroTeste () {
assertTrue(Adio, 2 + 2 == 4);
}
}

recon hece ambos os


tipos de teste, e executa
a todos de forma indistinta. Veja um exemplo
na Figura 1. inclusive
possvel criar test suites
misturando testes feitos
com ambas as verses
(o JUnit 4 tem APIs que
permitem isso).
Outra melhoria importante do suporte
do Eclipse para JUnit
a possibilidade de
executar vrios testes Figura 1. Integrao com o JUnit 4.
concorrentes, o que
muito bom para conseguir paralelismo, eslogo, onde um campo no canto superior
pecialmente entre testes de longa durao
esquerdo permite excluir todos os itens
e de baixo consumo de CPU local (como
do dilogo que no contenham a string
testes que acessam bancos de dados).
digitada, foi mais explorado, nos dilogos
Show View, New, Import e Export (estas
duas ltimas agora tambm so categorizadas). Tambm se pode filtrar as opes
de lanamento (Window>Preferences>Run/
Debug>Launching>Launch Configurations).
Escalabilidade e controle
As views de problemas, tasks e bookmade complexidade
rks, que j suportavam filtros, agora aceiAlguns desenvolvedores podem ter
tam filtros mltiplos (veja a Figura 2).
workspaces enormes, com dezenas de
projetos e milhes de linhas de cdigo. Ou,
Working Sets
mesmo sem tanto cdigo, podem ter que
O recurso de working sets, introduzido
utilizar um nmero muito grande de plugno Eclipse 3.1, permite criar grupos de
ins. O resultado acaba sendo uma grande
projetos (ou partes de projetos). Foi tamconfuso. O design de Perspectivas, que
bm muito expandido no Eclipse 3.2. H
vem desde o Eclipse 1.0, foi a primeira
aes de atualizao (refresh), abertura
ao importante no sentido de adminise fechamento de projetos sobre working
trar complexidade, mas como sabemos,
sets; working sets de breakpoints; filtro
o desenvolvimento de software s fica
de projetos visveis no Package Explorer
mais complexo a cada ano; assim todas as
por working set; e working sets de janelas
atualizaes do Eclipse tm introduzido
visveis (tambm filtra os itens do Problems
novas tcnicas para simplificar o ambiente
View e dos dilogos de lanamento).
de desenvolvimento.
Se voc tiver um workspace muito
complexo, vale a pena configurar alguns
Filtros
working sets que filtram somente os eleO recurso de filtros em caixas de dimentos necessrios para suas atividades

Edio 37 Java Magazine

21

10 Mais do Eclipse 3.2

principais. Por exemplo, para depurar


um servidor EJB, poderia criar working
sets que incluem somente o projeto do
servidor (e suas dependncias), e as views,
breakpoints e outras opes realmente utilizadas ao codificar ou depurar o servidor.
Esta configurao s tomar alguns minutos, e a partir da voc poder selecionar
o working set MinhaAplicacaoServer e
ter um IDE mais simples, organizado e
produtivo para aquela tarefa.

Trabalho em equipe
Outro fator importante na rea de complexidade o suporte ao trabalho eficiente
de projetos com grandes equipes. O Eclipse
3.2 permite exportar/importar grupos de
breakpoints, facilitando a depurao em
equipe. H vrias melhorias na infra-estrutura de controle de verses e suporte
a CVS, como templates para comentrios
de commit, melhorias na resoluo de
conflitos (com opo de merge no cliente),
histrico de alteraes unificado (para o
Local History e CVS ou outro servidor
de controle de verses), e uma opo de
visualizar anotaes no editor com as
alteraes do repositrio.

Evoluo em refactoring

A tcnica de refactoring (refatorao)


hoje considerada essencial por qualquer
desenvolvedor experiente. Mesmo quem

no for adepto de processos geis como


XP que prega o uso contnuo e intenso de refactoring concordar que esta
funcionalidade uma excelente extenso
do editor de cdigo, poupando tempo e
minimizando riscos.
Transformaes de cdigo complexas,
como extrair um bloco de cdigo de um
mtodo para um novo mtodo auxiliar,
se feitas usando recursos de refactoring,
sero feitas sem risco de introduo de
bugs. E transformaes simples mas trabalhosas, como criar um novo parmetro
num mtodo que invocado em centenas
de lugares, sero feitos rapidamente, sem
erros nem esforo adicional poupando
um enorme tempo de edio e reviso de
cdigo manual.
O Eclipse 3.2 adiciona alguns refactorings novos ou melhorados, mas neste
release as mudanas mais importantes so
na arquitetura geral de refactoring, cujos
benefcios se aplicam a todos os tipos de
refatoraes e devem elevar a convenincia
desta tcnica a um novo patamar.

Refactorings novos e melhorados


Introduzir indireo a mtodo: Substitui todas as invocaes a um mtodo
X.m(params) por invocaes a um novo mtodo static n(X x, params), que inicialmente s
invoca m(params).
Extrair superclasse: Cria uma nova
superclasse comum a um conjunto de
classes, contendo elementos comuns s
classes de origem.
Renomear e deletar package: Agora

esses refactorings oferecem uma opo


para renomear ou deletar tambm todos
os sub-packages.
Renomear tipo (classe ou interface):
Agora possui uma opo para renomear
variveis do tipo afetado, cujos nomes
sejam iguais ao do tipo (exceto pelo caractere inicial, minsculo). Por exemplo,
digamos que voc tenha uma declarao
Conta conta, e renomeie a classe Conta para
Investimento. Anteriormente, o resultado
disso que ficaramos com declaraes
estranhas, como Investimento conta: no
um bug, mas confuso. Com a nova opo, o refactoring detecta que a varivel
investimento tem um nome baseado no
nome do seu tipo, e altera a declarao
para Investimento investimento.
Inlining para mtodos binrios: Podese fazer inlining de um mtodo de uma
biblioteca externa, sem que o projetocliente precise depender de um projeto do
Eclipse contendo os fontes desta biblioteca.
Basta associar o projeto-cliente ao JAR da
biblioteca, e tambm aos seus fontes, que
podem estar num diretrio qualquer ou
mesmo num arquivo ZIP.

Refactoring sem quebra de APIs


Diversos refactorings que alteram ou
eliminam mtodos ganharam uma opo
para manter o mtodo original com um
cdigo stub (opcionalmente marcado
como @deprecated) que invoca o novo cdigo. Assim, voc pode fazer alteraes
incompatveis na API, como renomear
mtodos, mas sem quebrar o cdigo que
dependia da API anterior. Veja a Figura 3
para um exemplo.

Scripts e histrico de refactoring


Quando voc fizer um refactoring pelo
IDE, um histrico desta operao ser
preservado no workspace, como mostra
a Figura 4. Digamos que num projeto A,
voc renomeie um mtodo m() para n(); o
Eclipse ir corrigir todas as referncias
a este mtodo em todos os projetos do
mesmo workspace. Porm, imagine que
m() era utilizado por um projeto B que no
estava no workspace3. Isto costumava ser

Figura 2. Novas opes de filtros para a view Problems.

22 Java Magazine Edio 37

3
Ou

que no estivesse aberto, ou que no fosse configurado como dependente do projeto A (e sim de um
arquivo JAR produzido por A).

Mais diagnsticos do compilador

Figura 3. Ao renomear um mtodo, temos uma opo para manter o mtodo original como um stub (deprecated) que somente delega a invocao ao mtodo atualizado.
Listagem 2. Exemplo de script de refactoring
<?xml version=1.0 encoding=utf-8 standalone=no?>
<session version=1.0>
<refactoring comment=
Rename method Banco.findConta(...) to localizaConta&#13;&#10;
- Original element: Banco.findConta(...)&#13;&#10;
- Renamed element: Banco.localizaConta(...)&#13;&#10;
- Update references to refactored element&#13;&#10;
- Keep original element as deprecated delegate to refactored element
delegate=true deprecate=true
description=Rename method findConta flags=589830
id=org.eclipse.jdt.ui.rename.method
input=/src&lt;{TestRefactoring.java[Banco~findConta~QString;
name=localizaConta project=JM37 references=true version=1.0/>
</session>

um problema, sendo preciso corrigir os


projetos quebrados mo, ou desfazer o
refactoring e refaz-lo aps colocar todos
os projetos dependentes no workspace.
Com o novo histrico de refactoring, basta colocar o projeto B no workspace e, no
menu Refactor, usar as opes Create Script...
para gerar um script a partir do histrico
de A, e depois a opo Apply Script... para
re-execut-lo. Este script pode inclusive
ser enviado para outro desenvolvedor,
que j tem o projeto B configurado no seu
workspace. Assim, a equipe que programa
um projeto de uma biblioteca utilizada
por vrios outros projetos no obrigada
a manter todos os projetos dependentes
desta biblioteca no seu workspace, para
conseguir atualizar a todos quando tiver
que fazer alguma alterao incompatvel
em APIs pblicas.
Ainda melhor, estes scripts (que so arquivos XML) tambm podem ser escritos
ou alterados mo e versionados como
parte do projeto. Veja um exemplo na

O Eclipse notabilizado pelo uso de


um compilador Java prprio: ao invs do
javac, o JDT tem seu prprio compilador
de fontes para bytecode. Este compilador
incremental, muito mais rpido que o
javac (mesmo em modo no-incremental),
e tambm faz um nmero enorme de diagnsticos adicionais. Estes diagnsticos,
que so todos opcionais e configurveis
(veja a Figura 5), geram mensagens de erro
ou de advertncia indicando problemas
potenciais que normalmente passariam
despercebidos.

Novos diagnsticos do Eclipse 3.2


O Eclipse 3.2 inclui diversos novos diagnsticos:
Tags $NON-NLS$ desnecessrias:
Estas tags, inseridas em comentrios
aps linhas de cdigo com literais string,
indicam que uma literal no precisa ser
internacionalizada. O diagnstico flagra
usos desnecessrios desta tag (comum,
por exemplo, aps refactoring de literais
para constantes).
Uso de tipos brutos (raw): Especfico ao
JSE 5+. Detecta utilizaes no-genricas
de classes genricas; por exemplo, um
atributo declarado como List x (ao invs
de List<elemento> x).
Labels no utilizados: Detecta labels no
utilizados por nenhum statement break label
ou continue label. (Se voc no conhece esta
facilidade do Java, timo: meu conselho
no aprender!)

Listagem 2 (as nicas partes importantes


so as destacadas em negrito; os demais
campos so de documentao).
Assim, sempre que voc fechar um novo
release de uma biblioteca, projeto de infraestrutura, ou um projeto contendo classes
utilizadas por outros projetos, no precisa
mais criar um documento explicando as
alteraes de API e os passos para migrar
manualmente os projetos dependentes (e preparar os ouvidos para as
reclamaes). Ao invs
disso, voc pode fornecer
um script de refactoring
que executa todas estas
migraes automaticamente. Ao exportar um
projeto para um arquivo
JAR, o Eclipse permite
incluir os scripts de refactoring neste JAR (sob
a pasta META-INF), faciFigura 4. Histrico de refactorings.
litando sua utilizao.

Edio 37 Java Magazine

23

10 Mais do Eclipse 3.2

Estruturas switch com cases sem break: Isso


muitas vezes um bug, e mesmo quando
proposital (fall-through), muitos consideram mau estilo.
De-referncias a null: Detecta usos de
variveis locais cujo valor pode ser nulo
onde teoricamente possvel ocorrer
uma NullPointerException. Pode ser usado
para forar um estilo de programao
defensiva, com clusulas de guarda como
if (ref != null)....
Atribuies a parmetros: Detecta usos
de parmetros como variveis. A boa
prtica recomendada declarar todos os
parmetros de mtodos e construtores com
o modificador final. Veja detalhes sobre esta
regra no artigo Qualidade Aplicada, na
edio anterior.
Atribuies sem efeito: Este diagnstico
j existia, mas foi bastante melhorado, capturando novos casos de atribuio intil
como x = x = y ou x = ++x, sendo que este
ltimo quase sempre um bug.

Quick fixes e Clean-Up


Se os diagnsticos de problemas potenciais j so bons, ficam ainda melhores com
outro recurso popular do Eclipse, os quick
fixes comandos de correo automtica
de vrios problemas. Por exemplo, se o
compilador indica um typecast desnecessrio, existe um quick fix que elimina
o typecast. O Eclipse 3.2 introduz novos
quick fixes:
Remover as chaves de blocos contendo
um nico statement.
Quick fixes para as anotaes do
JSE 5: adicionar um atributo faltante, e adicionar membro de
anotao.
Eliminar tipos brutos
(raw types) do Java 5. Por
exemplo, se o seu cdigo

24 Java Magazine Edio 37

declara uma List x e executa


x.add(string), o quick fix deduz que a declarao poderia
ser List<String>.
Sempre me perguntei se no
seria possvel aplicar um determinado quick fix, de forma
automtica, a vrias ocorrncias do mesmo problema,
talvez at a um projeto inteiro.
Pois isto foi implementado de
duas formas no Eclipse 3.2.
Na melhoria mais simples, ao
selecionar o quick fix, pode-se
optar por aplic-lo a todos os
problemas do mesmo tipo na
mesma classe.
Mas uma opo muito mais
poderosa o novo Clean Up
Figura 5. Diagnsticos avanados do compilador do JDT, inclusive alguns
novos no 3.2, como a deteco de uso de referncias nulas.
Wizard. Este wizard capaz de
executar 29 tipos de operaes
FindBugs, podem incluir diagnsticos complexos
de limpeza de cdigo, automaticamente,
que consumam muita CPU e RAM sem que isso
sobre um volume de cdigo arbitrrio. Esseja um problema, pois estas ferramentas no
tas operaes incluem opes como introprecisam ser executadas a cada rebuild.
duzir o modificador final onde for possvel;
transformar loops for na verso estendida
do JSE 5; forar o acesso a variveis static
atravs da sua classe (e no de alguma
instncia desta classe, algo desnecessrio
e confuso); eliminar imports, typecasts
Melhorias de infra-estrutura
e outros cdigos desnecessrios; ou at
Quem quer um IDE cheio de recursos,
mesmo, adicionar cdigo faltante, como
mas que seja lento ou inflexvel? Desempeos serialVersionUID de classes serializveis,
nho e extensibilidade so qualidades que
ou anotaes como @Override (JSE 5).
dependem de detalhes de design e implementao que podem no ser evidentes
O JDT compete com ferramentas de
para o usurio final. Mas interessante
validao de cdigo, mas no provconhecer os avanos nesta rea.

vel que avance at o ponto de tornar


estas ferramentas obsoletas, pois
s pode implementar validaes
que no aumentem sensivelmente
o tempo de compilao. J as ferramentas especializadas, como PMD e

Cache
O Eclipse gasta bastante memria com
objetos que modelam o contedo das
classes utilizadas pelos projetos abertos
no seu workspace. Isto inclui tanto os seus
prprios fontes (.java) quanto as bibliotecas
referenciadas (.jar, .zip, .class). Este cache
de objetos torna operaes como busca,
referncia cruzada, refatorao, outlining,
auto-completamento de cdigo, exibio
de JavaDocs etc. muito mais rpida, porque
o Eclipse no precisa ficar analisando o
contedo de JARs ou fazendo parsing de
fontes Java a todo instante.
Mas como um workspace pode ser arbi-

trariamente grande, o Eclipse s mantm


um cache de modelos para os fontes e
JARs mais acessados. No Eclipse 3.2, este
cache foi muito aperfeioado. Pode-se
usar automaticamente uma quantidade
maior de memria, se voc configurar um
heap maior para o Eclipse (com a opo
-vmargs -Xmx, que pode ser adicionada ao
atalho de lanamento do Eclipse ou ao
arquivo eclipse.ini na sua raiz de instalao).
Foram resolvidos problemas de escalabilidade da implementao do cache, que
ocorriam em workspaces com grande nmero de JARs. Se voc um dos usurios
do Eclipse que se viu forado a configurar
heaps enormes (como 256 Mb ou at mais)
para evitar OutOfMemoryException ou mau desempenho com workspaces muito grandes,
experimente reduzir esta configurao
no 3.2 (talvez voc possa reduzir o heap
metade do tamanho atual!).

do Ant), sem que o Eclipse se confunda


com isso.
O editor de cdigo Java d suporte
muito melhor a arquivos externos (no
pertencentes a source folders de projetos
do workspace), funcionando inclusive o
auto-completamento.
A exportao de configuraes de projeto para scripts do Ant foi melhorada.
Diversas ferramentas do JDT (compilador, formatador de cdigo e outros) podem
ser invocadas da linha de comando; til
(mais uma vez) para automao via Ant.
Na configurao de build path, pode-se
criar, em qualquer nvel de diretrio, links
simblicos para pastas fora da estrutura de
arquivos do projeto ou do workspace.

Recuperao de sintaxe

A programao a principal tarefa do


desenvolvimento de quase todas as aplicaes, e acompanhar as ltimas verses
da plataforma (linguagem e APIs) uma
prioridade de qualquer IDE. No ano passado, a espera pelo release final do Eclipse
3.1 foi bastante incmoda para quem j
queria utilizar o JSE 5 (o Eclipse 3.1 final
veio com 8 meses de atraso), mas dessa
vez, a Fundao Eclipse foi muito mais
gil com o JSE 6.

O parser de cdigo Java do JDT utilizado no s para compilar classes, mas


tambm para outras funcionalidades,
como auto-completamento de cdigo e
refactoring. s vezes voc pode querer
usar estas funcionalidades em classes que
apresentam erros de sintaxe, pois ainda
no esto completas, ou esto no meio de
uma faxina pesada.
No Eclipse 3.2, o parser foi melhorado
de forma a ser muito mais inteligente para
contornar trechos errados de um fonte,
continuando capaz de compreender a
parte do arquivo que est correta. Para o
usurio, o efeito visvel desta melhoria
que funcionalidades como auto-completamento, e at refactorings locais, quase
sempre funcionaro da forma esperada,
mesmo em classes contendo erros (que
so justamente os casos onde voc pode
precisar mais destas facilidades!).

Estrutura de build mais aberta e robusta


H vrios itens que tornam o Eclipse
mais flexvel e adaptvel a projetos legados
ou com necessidades especiais de organizao e compilao:
Projetos podem ser configurados para
que a compilao do cdigo seja feita por
um mecanismo externo (como um script

Suporte ao JSE 5 (Tiger) e 6 (Mustang)

JSE 6
O novo Eclipse suporta a plataforma
JSE 6, apesar de que esta s ser finalizada depois (o release final do Eclipse 3.2
previsto para junho, mas o do Mustang
s para o incio do segundo semestre). O
suporte especfico exigido pelo novo JSE
consiste principalmente na compilao
de bytecodes, que agora inclui atributos
de pr-verificao, os quais tornam o carregamento das classes mais rpido (uma
otimizao que o JSE 6 tomou emprestado
da plataforma JME). Alm disso, o Eclipse
funciona corretamente sobre uma JVM
6.0.

JSE 5
O Mustang ainda est no mdio a longo
prazo, especialmente em ambientes JEE,

de evoluo mais lenta. Mas o Java 5


j notcia velha4. Embora o Eclipse
3.1 j tenha introduzido o suporte
ao JSE 5, este release ainda possua
limitaes e bugs (inclusive de compilao, ainda que contornveis)
que prejudicam seu suporte ao JSE
5. O release 3.1.1 corrigiu 53 deste
bugs, e o 3.1.2 mais 77. O Eclipse
3.2 corrige mais algumas dezenas
de bugs relacionados a suporte
ao JSE 5.
No se alarme: alguns destes
bugs so na verdade novas
funcionalidades, e vrios so
problemas em convenincias
no essenciais ao uso do Java 5
coisas beirando o suprfluo,
como o bug 87868 (gerao
de advertncia indevida para
comentrios contendo tags
do javadoc que usam certas
sintaxes de tipos genricos).
Mas tambm existem algumas correes de problemas
crticos (muitas j portadas
para o Eclipse 3.1.2). Acompanhar a evoluo de uma
linguagem s vezes no
fcil. Por exemplo, para a
classe:
public class A {
public void teste() {
new Runnable() {
public void run () {
new Runnable() {
public void run() {...}
};}};
}
}

...o javac 1.4 ou inferior geraria os arquivos: A.class, A$1.


class para a primeira inner class
annima (a mais externa), e
A$2.class para a segunda (a mais
interna). Mas no JSE 5, decidiu-se
que as classes geradas deveriam
preservar o aninhamento existente nos fontes, mesmo para classes
annimas. O correto (somente se
4

At mesmo para os usurios de produtos da


IBM: o IBM JDK 5.0 j est disponvel h alguns
meses, e o WebSphere 6.1, com suporte a este JDK,
estar disponvel quando voc tiver esta edio em
mos.

Edio 37 Java Magazine

25

10 Mais do Eclipse 3.2

compilando para JSE 5+) gerar as classes


A.class, A$1.class, e A$1$1.class. O Eclipse
3.1 falhava em respeitar esta diretriz do
JSE 5, o que poderia ser um problema de
compatibilidade, por exemplo ao usar reflection para manipular as inner classes.
Mas isto foi corrigido no Eclipse 3.2.
Resumindo, se voc desenvolve com os
novos recursos de linguagem do Java 5,
o Eclipse 3.2 uma atualizao excelente, mas se no quiser fazer este update
agora, considere pelo menos o 3.1.2 como
obrigatrio.

Gerao de hashCode() e equals()

Este recurso discreto: uma nova ao


de gerao de cdigo, disponvel em
Source>Generate hashCode() and equals().
Mas considero-o importante ao ponto
de figurar nos 10 Mais do Eclipse 3.2,
porque a gerao correta destes mtodos
uma tarefa delicada, e muitas vezes esquecida ou feita inadequadamente. Sabemos
da importncia destes mtodos e como
implement-los, mas no seria muito mais
fcil deixar o IDE fazer isso?
A Listagem 3 mostra uma classe de
exemplo, da qual digitamos somente as
declaraes de atributos. Todo o cdigo
destacado em negrito foi gerado pelo Eclipse, com o assistente ilustrado na Figura 6.

Pode-se ver que o cdigo criado eficiente,


gera hashcodes de alta qualidade, e seguro (defensivo contra a possibilidade de valores null em qualquer atributo). Mtodos
equals() e hashCode() escritos e otimizados
mo podero ser um pouco melhores que
estes, mas no muito.

Suporte a outros plug-ins

O Eclipse 3.2 a base para novos releases


de vrias extenses crticas, como o VE,
WTP e TPTP. Destes, o WTP (Web Tools
Platform), que d suporte a desenvolvimento JEE (Web, EJB, Web Services, XML
etc.) hoje o mais importante e popular; o
novo WTP 1.5 uma grande atualizao,
que eu consideraria essencial para desenvolvedores que usam Eclipse+WTP para
JEE. Mas como o WTP 1.5 s funciona
com o Eclipse 3.2, a atualizao do IDE
ser obrigatria.
Outros plug-ins importantes do eclipse.
org esto aparecendo o tempo todo, e os
mais recentes s funcionaro no Eclipse
3.2. Alm disso, no tero verses mais antigas (exceto, talvez, milestones instveis)
que funcionem no Eclipse 3.1 ou verses
anteriores. Os itens mais importantes nesta
categoria so:
DTP (Data Tools Platform): implementa facilidades para trabalho com bancos

de dados relacionais. O DTP muito mais


poderoso que outros plug-ins de conexo
a SGBDs (QuantumDB etc.), e compete at
mesmo com ferramentas de cliente SQL
tradicionais como SQuirreL ou TOAD.
Alm disso, o DTP ser altamente integrado a outros projetos do Eclipse que podem
precisar trabalhar com bancos de dados,
tais como o WTP e o BIRT.
ECF (Eclipse Communications Framework): implementa facilidades de
distribuio e colaborao entre desenvolvedores5. Isto incluir mensagens instantneas, quadro-branco compartilhado,
compartilhamento de arquivos, e j se
fala at em recursos de VoIP (voz sobre
IP). O benefcio destas ferramentas ser
semelhante ao de muitas aplicaes j disponveis, mas tudo ser integrado ao IDE,
possibilitando cenrios de uso extremamente interessantes, como fazer depurao
remotamente de um projeto rodando num
workspace de outra mquina.
TPTP (Test and Performance Tools
Platform): A prxima verso ir suportar
profiling com a JVMTI (nova API da JVM
para debugging e profiling, introduzida no
JSE 5, de uso obrigatrio no JSE 6). Isso trar
benefcios importantes de desempenho e de
funcionalidade (o NetBeans Profiler uma
evidncia destas vantagens). Alm disso, o
TPTP 4.2 tambm suporta relatrios sofisticados com o BIRT (Business Intelligence
and Reporting Tools) e outras novidades.

Plug-ins de terceiros
Listagem 3. Resultado do novo comando Generate hashCode() and equals().
public class TestHashcodeEquals {
private String nome;
private int idade;
public int hashCode () {
final int PRIME = 31;
int result = 1;
result = PRIME * result + idade;
result = PRIME * result + ((nome == null) ? 0 : nome.hashCode());
return result;
}
public boolean equals (Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final TestHashcodeEquals other = (TestHashcodeEquals)obj;
if (idade != other.idade) return false;
if (nome == null) {
if (other.nome != null) return false;
}
else if (!nome.equals(other.nome)) return false;
return true;
}
}

26 Java Magazine Edio 37

Uma boa notcia que todos os plug-ins


de terceiros (ou seja, os no criados pela
Fundao Eclipse), que funcionam no
Eclipse 3.1, devem funcionar no 3.2. A
plataforma de plug-ins do Eclipse um dos
principais pontos fortes da sua arquitetura, sendo tradicionalmente muito estvel
(pelo menos em comparao com outros
IDEs extensveis).
Houve alguns releases com alteraes
incompatveis que quebraram vrios plugins, especialmente as verses ponto zero
como o Eclipse 3.0. Mas isso tem mudado

5
Estas

funcionalidades so uma tendncia recente


e, aposto, a prxima grande coisa na rea de IDEs. O
NetBeans tambm vai acelerado nessa direo, com o
NetBeans Collaboration Project.

bastante, graas a melhorias contnuas


(desde o 3.0) do PDE e da arquitetura de
plug-ins; em especial, novas facilidades
para flagrar plug-ins que utilizam classes
internas do Eclipse que no so APIs
pblicas e no deveriam ser usadas por
plug-ins. Muitos dos casos de plug-in
quebrado pelo novo Eclipse so culpa dos
autores dos plug-ins, e no dos projetos do
eclipse.org!
Parece que todos estes esforos de arquitetura renderam resultado, pois o nmero de
problemas de compatibilidade que tive com
plug-ins de terceiros, durante todo o ciclo de
desenvolvimento do 3.2, foi mnimo. Hoje
no conheo nada que funcione no 3.1 mas
no no 3.2, e no vi nenhum plug-in que
tenha precisado disponibilizar downloads
separados para o Eclipse 3.1 e 3.2.

Ambientes de execuo

Em projetos complexos, pode ser difcil


manter a mesma configurao para cada
desenvolvedor diretrios de instalao
do JDK, o prprio Eclipse, servidores de
aplicaes e bibliotecas em geral. O Eclipse
conta com vrios recursos para abstrair
estas configuraes, como variveis de
classpath, user libraries, e configuraes
de JRE/JDKs. Por exemplo, se um projeto precisa do JDK 1.5, pode-se ir em
Preferences>Java>Installed JREs>Add e
apontar para a sua instalao local do JDK
1.5, setando JRE name para JDK 1.5.0.
Numa empresa ou equipe isolada, vivel pedir a todos os desenvolvedores que
faam esta configurao: pode-se instalar
o JDK 1.5.0 em qualquer diretrio, desde
que isso seja registrado no Eclipse com
o nome JDK 1.5.0. Mas h projetos em
que difcil padronizar at mesmo estas
configuraes de alto nvel. Em projetos
envolvendo vrias empresas (com parceiros, outsourcing etc.), ou em projetos open
source e outros distribudos globalmente,
pode ser difcil impor at mesmo um padro mnimo de configurao do IDE.
No caso das configuraes de plataforma
JSE (e tambm JME), o Eclipse 3.2 encontrou uma soluo de configurao por

capacidades. A opo ...>Installed JREs>Execution Environments (Figura 7) mostra


uma lista de ambientes
de execuo, que so as
definies de plataforma
reconhecidas pelo Eclipse.
Por exemplo, o ambiente
J2SE-1.2 qualquer JDK ou
JRE compatvel com a plataforma Java 2, ou seja, um
JDK/JRE 1.2.0 ou superior.
Como mostrado na figura, o Figura 6. Gerador de hashCode() e equals(), onde podemos
Eclipse exibe todos os JREs escolher quais atributos so considerados para ambos os mtodos.
cadastrados que so compatveis com este ambiente.
Tambm apresenta os perfect matches opes com
coincidncia exata da verso
principal; por exemplo, para
o J2SE-1.2, isso incluiria os
JRE/JDK 1.2.0, 1.2.1 e 1.2.2,
mas no 1.3.0 e superiores.
A diferena mais importante entre um ambiente de
execuo e um JRE que o Figura 7. Ambientes de execuo.
primeiro no configurvel.
O Eclipse determina automaticamente o
downloads separados (Platform e JDT) 6,
nvel de compatibilidade de cada JRE, e
e para contar com itens to fundamentais
os nomes dos ambientes de execuo so
como um construtor de GUIs, suporte a
fixos. Projetos podem ser configurados
J2EE ou um profiler, era exigido instalar
para depender de um ambiente, e no de
um nmero muito grande de plug-ins. E
um JRE, o que facilita o intercmbio de
para piorar a confuso dos iniciantes, estes
projetos. A nica opo que voc pode fazer
plug-ins so projetos independentes da
determinar, quando houver vrios runtiFundao Eclipse, com nmeros de verso
mes compatveis com a mesma plataforma,
e cronogramas independentes.
qual ser o utilizado (por default, o Eclipse
J vi at programadores experientes
usar um perfect match).
deixarem de aproveitar os benefcios das
Os ambientes de execuo tambm podem
verses mais atuais de algum componente
ser utilizados nas configuraes de lanado Eclipse, somente por impacincia de
mento. E para criadores de plug-ins, o PDE
acompanhar constantemente os novos
permite declarar o ambiente de execuo
releases de vrios subprojetos e suas demnimo exigido por um plug-in, evitando
pendncias. Quem utiliza, por exemplo, o
erros estranhos se for instalado um plug-in
Web Tools Platform para J2EE, no pode
que exige, por exemplo o JSE 5, e for execuatualizar para uma nova verso do Eclipse,
tado o Eclipse com um runtime 1.4.2.
antes que a nova verso correspondente do
WTP seja disponibilizada.
Em contrapartida, IDEs concorrentes
sempre ofereceram um instalador nico

Callisto

O Eclipse sempre teve um ponto fraco:


mesmo o IDE Java bsico exigia dois

6
A no ser que se baixasse o Eclipse SDK, no recomendado por incluir muita coisa que a enorme maioria
dos usurios no precisa (o cdigo-fonte completo do
Eclipse, e o PDE).

Edio 37 Java Magazine

27

10 Mais do Eclipse 3.2

com todos os recursos essenciais (ou no


caso do NetBeans, trs instaladores, sempre atualizados simultaneamente).
Por isso escolhi como novidade mais importante do Eclipse 3.2 o projeto Callisto.
No, no se trata de mais um plug-in. O
Callisto um meta-projeto de coordenao de vrios outros projetos, cujo objetivo
simples: sincronizar os releases dos 10
projetos mais importantes do eclipse.org,
oferecendo instaladores e sites de update
unificados para todos eles.
Tradicionalmente, j havia uma sincronizao razovel entre os principais projetos.
Por exemplo, se numa semana fosse declarado o Eclipse x.yMz, poderamos contar
com o milestone compatvel do EMF na
semana seguinte; o do GEF aps mais
uma semana; do VE dentro de outras 1-2
semanas, e do WTP em mais 2-3 semanas.
Esta ordem dada pelas dependncias;
por exemplo, como o GEF utiliza o EMF,
uma vez declarado um milestone do EMF,
a equipe do GEF precisa de alguns dias
para adotar o novo EMF, migrar cdigo
dependente de APIs alteradas e resolver
bugs de integrao.
O Callisto se trata de um esforo redobrado
para que todos os projetos faam releases paralelos. Como resultado disso, o atraso entre
cada dois releases dependentes diminuiu
sensivelmente na gerao encabeada pelo
Eclipse 3.2. Por exemplo, percebi que aps
cada release do ncleo do Eclipse (sempre
feito numa sexta ou num sbado), o milestone correspondente do EMF costumava

sair na quinta-feira seguinte, e o GEF aps


somente 1-2 dias a mais. Alm disso, o Callisto ir livrar os usurios de saber qual verso
do plug-in A compatvel com a verso B do
plug-in C...

Instalando o Callisto
Para testar o Callisto, comece baixando
e instalando, da forma tradicional, s o
Eclipse Platform (no precisa nem mesmo
do JDT). Depois

entre em Help>Software
Updates>Find and Install>Search for new
features to install.
Voc ver que, alm do
tradicional Eclipse.org update site, existe
um Callisto Discovery Site. Selecione este
site de update e clique em Finish. O Eclipse
primeiro apresenta uma lista de mirrors;
selecione o mais prximo, e voc ver algo
como o mostrado na Figura 8.
As opes de update deste site seguem
um versionamento do prprio projeto
Callisto, do qual at mesmo o ncleo do
Eclipse um subprojeto (ainda que o
principal deles).
O primeiro release, Callisto 1.0, ser
formado dos seguintes subprojetos:
1. Eclipse (Runtime, JDT e PDE) 3.2
2 . E M F ( E c l ip s e
Mo d e l i n g F r a m e work) / SDO (Service
Data Objects) / XSD
(XML Schema Infoset
Model) 2.2.0
3. GEF (Graphical
Editor Framework)
3.2

28 Java Magazine Edio 37

4. VE (Visual Editor) 1.2


5. WTP (Web Tools Platform) 1.5
6. BIRT (Business Intelligence and Reporting Tools) 2.1
7. TPTP (Test and Performance Tools
Platform) 4.2
8. CDT (C/C++ Development Tool)
3.1.0
9. DTP (Data Tools Platform) 0.9
10. GM F (Graph ical Model i ng
Framework) 1.0
Se esta sopa de letrinhas e nmeros assustava muitos iniciantes e aborrecia at os
veteranos, isso acabou, com o Callisto.
Entre no site de update e selecione as
ferramentas que voc precisa, ex.: WTP.
Use o boto Select Required para detectar
e selecionar, se preciso, outros itens exigidos (por serem dependncias dos solicitados). Agora s confirmar e aguardar
o download e instalao, sem risco de
quebrar a instalao do Eclipse devido
a uma mistura de verses incompatveis
ou falta de dependncias.
A combinao de recursos dos dez
projetos do Callisto 1.0 iguala ou supera

Figura 8. Callisto Discovery Site.

qualquer outro IDE tudo-em-um. Inclui


ferramentas para JEE, Swing, bancos de
dados, gerao de relatrios, testes e profiling, e at desenvolvimento de cdigo
nativo em C/C++.
Alm disso, o Callisto oferecer um
download unificado, para quem quiser
todas ou a maioria destas ferramentas, ou
no quiser que dezenas de desenvolvedores na mesma empresa fiquem fazendo downloads repetidos pelo Update Manager
(~200 Mb para uma instalao total do
Callisto 1.0). Este download unificado
ter a metade do tamanho da soma dos
tradicionais arquivos ZIP com componentes isolados, pois utilizar compresso
Pack200 (o super-compressor de bytecode
introduzido pelo JSE 5).
Em resumo, o Callisto terminar com a
fama do Eclipse de ser um IDE que no
suporta muitos recursos importantes
fora da caixa, e que difcil de instalar e
atualizar. Tambm eliminar a impresso
de instabilidade que pode ocorrer quando
algum faz uma instalao ou atualizao
errada. Isto sem dvida aumentar ainda
mais o apelo do Eclipse. Verses futuras
do Callisto provavelmente agregaro um
nmero ainda maior de subprojetos.

vrias ferramentas. Estas mincias so


melhor ilustradas pelo documento New
and Improved (veja links), de tamanho
provavelmente descomunal, que j dever
estar disponvel para o 3.2-final quando
voc ler este artigo. Mas pensando bem,
para aprender as novidades de um IDE,
o melhor pr as mos massa!
Osvaldo Pinali Doederlein
(opinali@gmail.com) Mestre em
Engenharia de Software Orientado a Objetos, membro individual
do Java Community Process (tendo
participado do Expert Group da JSR-170: Tiger/J2SE
5.0), e trabalha como desenvolvedor e consultor.

eclipse.org
Projeto Eclipse.
eclipse.org/callisto
Callisto, o release unificado do Eclipse.
eclipsecon.org/2006
Conferncia EclipseCon 2006, com muito material
disponvel sobre as ltimas novidades e prximos
planos.
www28.cplan.com/javaone06_cv_124_1/
sessions_catalog.jsp?ip=yes
O JavaOne 2006 tambm possui muitas
apresentaes sobre o Eclipse. Para baix-las,
filtre com keyword=Eclipse. Se o site pedir, use o
login=contentbuilder e password=doc789 ( um
login/senha liberado para uso geral).

Concluses
O Eclipse 3.2 no um update revolucionrio, como o 3.0, que introduziu grandes
mudanas na arquitetura de plug-ins;
nem um update to crtico quanto o
3.1, que trouxe o suporte s novidades
de linguagem do JSE 5. Ainda assim, somando o enorme nmero de melhorias,
temos um importante release que ir
certamente beneficiar qualquer usurio
atual do Eclipse. E para os iniciantes, as
facilidades de instalao e configurao
do Callisto so um timo motivo para
reavaliar este IDE.
Mesmo tendo descrito tantas melhorias,
deixamos de mencionar vrias coisas. O
PDE, SWT, JFace, Help e RCP tambm
trazem muitos avanos para desenvolvedores de plug-ins ou de aplicaes ricas.
Mesmo no IDE Java, tivemos que passar
por cima de vrias pequenas melhorias
em praticamente todos os componentes
do Eclipse editor de cdigo, debugger,
views auxiliares, Ant etc. inclusive
algumas importantes, como o suporte
muito melhorado ao CamelCase em
Edio 37 Java Magazine

29

Introduo ao

Primeiros passos com Java Message Service

API JMS uma das mais


estveis de todo o Java
EE: a verso 1.1 no tem
atualizaes desde os tempos
do Java EE 1.3, o que atesta
sua maturidade e funcionalidade. Infelizmente os
desenvolvedores que tiveram sua formao em
microinformtica, longe
dos grandes CPDs corporativos e seus mainframes, provavelmente
nunca foram expostos a
algo similar ao JMS, que
fornece um messaging
middleware (middleware
de troca de mensagens,
ou apenas middleware
de mensagens) e deixam
de usufruir das vantagens
e possibilidades oferecidas
por essa tecnologia.
O JMS um componente
central na arquitetura de
grandes aplicaes web, onde
h necessidade de atender a
requisitos extremos de performance, escalabilidade,
manutenibilidade e segurana. Mesmo componentes EJB e Web Services
no oferecem os mesmos benefcios do JMS
nestes quesitos. E o
melhor de tudo, a
API bem simples,
fcil de aprender,
e as configuraes
necessrias em um
servidor de aplicaes Java EE so igualmente simples.

30 Java Magazine Edio 37

JMS

utilizando o JBoss

Conceitos e motivao para


middlewares de mensagens,
e quando e como usar o
JMS com o servidor de
aplicaes Java EE livre mais
popular do mercado

Fernando Lozano
Este artigo apresenta uma introduo ao
JMS, com exemplos bsicos, e demonstra
como rodar os exemplos no JBoss 4 (mas
acreditamos que todos os cdigos funcionem sem modificaes em qualquer verso
desde a 3.0.8).
Alguns desenvolvedores acreditam erroneamente que seja necessrio usar EJB
para usufruir do JMS, talvez por causa
da existncia dos Message-Driven Beans,
atrelados ao JMS na especificao EJB. Na
verdade, o servio e as API do JMS so totalmente independentes dos EJBs. Pode-se
fazer uma analogia com os Entity Beans,
que permitem persistncia em bancos de
dados via JDBC, mas nada impede o desenvolvedor de usar JDBC diretamente, sem
passar por EJBs. Reforando esta independncia entre o JMS e EJBs, os exemplos de
cdigo neste artigo sero de clientes JMS
independentes, e no EJBs.

Porque usar messaging middlewares


Quem j fez uma compra em sites como
amazon.com deve ter percebido que, logo
aps o checkout (confirmao da compra),
enviado um e-mail confirmando os detalhes da compra, a forma de pagamento e o
endereo de entrega. Algum tempo depois,
que pode variar de alguns minutos a algumas horas, enviado um segundo e-mail
confirmando as mesmas informaes.
fcil entender o motivo do primeiro email: fornecer ao comprador um registro
da operao realizada, e tambm uma
oportunidade de contestar qualquer erro,
ou informar a possibilidade de fraude (ex.:
outra pessoa fez uma compra usando o seu
e-mail). Mas o segundo e-mail parece um
tanto redundante.
O usurio mais atento, no entanto, ir
perceber que o texto no segundo e-mail
um pouco diferente, e verificar que

este e-mail que informa que a compra foi


realmente aceita, o pagamento efetuado e a
entrega agendada. Antes dele, h a possibilidade de ter havido algum problema com
o pagamento (por exemplo, a operadora de
carto de crdito no aprovou o crdito),
com a compra (algum dos itens no est
disponvel em estoque, e ter que ser
entregue mais tarde) ou com o envio (um
endereo no interior pode demorar mais e
custar mais caro para os correios).
Muitos visitantes pensam que sites como
Amazon (e outros portais de comrcio eletrnico) processam as compras de forma
on-line. Mas na verdade eles apenas registram o pedido. Outro sistema, operando
na retaguarda da loja virtual, quem
efetivamente processa a ordem de compra.
Isto traz para o site vrios benefcios:
Tempo de resposta menor: Como o
registro do pedido no tem que aguardar
pelo OK da instituio financeira que fornece o crdito, nem pelo OK da empresa
que realmente fornece o produto (j ouviu
falar de lojas sem estoque?), o site pode
responder ao comprador de forma bem
rpida. E o comprador sai satisfeito com
um OK, sua compra foi efetuada que
na verdade significa apenas sua compra
foi registrada, mais tarde iremos process-la. Pense na quantidade de sistemas
ou bancos de dados que teriam que ser
acessados para confirmar uma ordem
de compra, e no tempo de resposta que
isto iria gerar para um grande volume de
compras simultneas.
Maior volume de transaes por dia:
sempre mais eficiente agrupar operaes
para execuo conjunta, em batch, do que
execut-las uma a uma sob demanda.
O batch permite otimizar operaes de
rede, de disco e de processamento. Ento
o mesmo hardware pode sustentar uma

carga de trabalho maior, se for possvel


atrasar algumas operaes para realiz-las depois em conjunto. Por exemplo,
em vez de enviar pedidos isolados de
validao de crdito para uma operadora
de carto de crdito, so enviados pedidos
para validar de uma s vez dezenas de
contas diferentes.
Tolerncia a falhas: A loja virtual no
controla os sistemas das instituies
financeiras, dos produtores de mercadorias, nem dos correios e outras empresas
que fazem a entrega (couriers). Se algum
deles estiver indisponvel, ou momentaneamente saturado, o processamento em
batch pode ser re-executado mais tarde,
sem que o comprador tome conhecimento
disto. Ento a loja no deixa de vender por
causa de problemas de comunicao ou
problemas locais nos sistemas das outras
empresas.
Segurana: Uma vez que o sistema da
loja virtual no necessita de acesso direto
aos bancos de dados de estoques, agendamento de entrega etc., e sim apenas a um
banco de dados onde registrado o pedido
de compra ( aqui que entra o messaging
middleware), todos os sistemas internos da
loja podem estar protegidos do site por um
firewall. Assim um cracker teria bem mais
dificuldade em conseguir acesso a estes
sistemas para roubar ou adulterar informaes. Mais importante, o sistema que
efetivamente processa as compras estaria
do lado de dentro do firewall corporativo,
mais protegido, em vez de estar no lado de
fora (dentro da DMZ1) exposto a ataques
diretos de crackers pela internet.
1
DMZ, sigla em ingls para zona desmilitarizada, o
termo usado por especialistas em segurana de rede para
a rede semi-protegida (mas aberta para acesso pela internet), onde uma empresa coloca seus servidores pblicos
de e-mail ou web.

Edio 37 Java Magazine

31

Introduo ao JMS

Internet

Rede
Corporativa

Crdito

Usurio / Comprador

Vendas

Frente de Loja

Estoque

Rede DMZ

Entrega

Ordens de compra

Figura 1. Viso conceitual de uma grande loja virtual, em termos de componentes de alto nvel
Conceitualmente, o sistema da loja
virtual segue a arquitetura apresentada
na Figura 1. O sistema de Frente de Loja
apenas registra ordens de compra que
sero processadas posteriormente pelo
verdadeiro Sistema de Vendas. E o Sistema
de Vendas quem interage com os sistemas
de Crdito, Estoque e Entrega. Estes ltimos freqentemente so sistemas externos
empresa que mantm a loja virtual.
As principais caractersticas desta arquitetura que os dois sistemas (Frente de Loja e Vendas) so totalmente
desacoplados e a comunicao entre eles
assncrona. Estes conceitos valem uma
explicao mais detalhada:

O acoplamento entre dois componentes de software (programas, bibliotecas,


classes) indica o quanto modificaes em
um deles podem provocar a necessidade
de modificaes no outro. Se dois componentes so desacoplados, modificaes em
um deles no afetam o outro. Na verdade,
um dos grandes objetivos de todas as
prticas da Orientao a Objetos reduzir
o acoplamento entre os componentes de
um software.
A comunicao assncrona existe sempre quando quem envia uma mensagem
no fica esperando por uma resposta do

32 Java Magazine Edio 37

receptor (sem poder executar outras operaes). o oposto da comunicao sncrona,


onde quem envia uma mensagem fica
aguardando at que chegue uma resposta,
e no realiza nenhum trabalho til neste
meio tempo. fcil perceber que sncrona
a comunicao entre um navegador web e
um servidor web, ou entre dois objetos Java
de uma aplicao.
Se o sistema de vendas desacoplado da
Frente de Loja web, fica fcil fazer com que
ele processe tambm ordens de compras
obtidas por meio de um call-center (por
telefone) ou recebidas pelo correio. No
ser necessrio modificar o sistema de
vendas para integr-lo a outros tipos de
frentes de loja. E, se a comunicao com
o sistema de vendas assncrona, ele pode
estar fora do ar (para sofrer upgrade, por
exemplo) sem que isto implique em uma
parada nas atividades das frentes de lojas,
que so quem realizam as vendas sob o
ponto de vista dos compradores.
O desacoplamento e a comunicao
assncrona entre os sistemas de vendas
e a Frente de Loja possvel graas ao
componente Ordens de Compra, ilustrado
no diagrama. Este componente no um
sistema, mas sim parte da infra-estrutura

utilizada pelos demais sistemas, como o


seriam bancos de dados de produtos e de
clientes (no representados na figura).
O sistema da Frente de Loja se limita a registrar os pedidos no componente Ordens
de Compra, e o sistema de vendas pega os
pedidos registrados nele. Como os dois
sistemas no se comunicam diretamente,
eles no esto acoplados. E como o sistema
de vendas no precisa processar imediatamente um pedido registrado nas Ordens
de Compra, a comunicao entre ele e a
Frente de Loja se torna assncrona.
Embora seja possvel implementar o
componente Ordens de Compra utilizando um simples banco de dados, esta
no a implementao mais usual, pois
exigiria trabalho extra (de programao)
nos sistemas que se comunicam por meio
do componente. Por exemplo, necessrio
garantir que todas as ordens de compra
sejam processadas, e que nenhuma delas
seja processada em duplicidade. E deve
ser prevista a possibilidade de falha do
prprio componente, ou dos sistemas que
interagem com ele, preservando a consistncia das informaes armazenadas.
A implementao mais usual de um
componente como o Ordens de Compras
por meio de um middleware de mensagens.
Esse middleware o responsvel por agir
como intermedirio na comunicao assncrona entre dois sistemas desacoplados
e, no processo, garantir a coerncia e
integridade desta comunicao, poupando
os desenvolvedores de aplicaes dos
detalhes envolvidos.
A especificao JMS define
como deve ser um middleware
de mensagens dentro da plataforma Java EE. Servidores Java EE devem
fornecer este componente para obter a
certificao. Desse modo, o recurso est
prontamente disponvel para todos os
desenvolvedores Java que j utilizam um
servidor como JBoss, Geronimo, Weblogic
ou Websphere.
Mas o conceito de middleware de mensagens no foi criado no Java EE. Produtos
como o MQSeries da IBM existem desde
os tempos do mainframe, e mesmo a linha
Microsoft j tinha o seu componente deste

tipo, chamado Microsoft MQ (Message


Queue) antes mesmo da criao do .NET.

Conceitos do JMS
Um servio JMS, assim como todo middleware de mensagens, manipula informaes na forma de mensagens. O formato da
mensagem quais informaes ela contm
e como ela deve ser interpretada opaco
para o JMS. Ou seja, o JMS apenas cuida
de armazenar as mensagens at que sejam
consumidas por algum cliente; ele no
interpreta de nenhuma forma as informaes contidas nas mensagens. Isto permite
inclusive que um servio JMS atenda a
clientes no-Java, ou que middlewares de
mensagens implementados com outras
tecnologias possam ser transformados em
servios JMS.
Uma mensagem no JMS possui propriedades (properties), atributos (attributes) e
um corpo (body):
A informao em si da mensagem est
no seu corpo, que no JMS pode ser um
array de bytes, um texto (String), um mapa
(java.util.Map) ou um objeto serializado.
Caso o volume de informaes contidas
na mensagem seja muito grande, h ainda
a possibilidade de se acessar o corpo da
mensagem como um stream do java.io, que
a aplicao pode aninhar dentro de qual-

quer tipo de stream desejado, por exemplo


um ObjectInputStream.
Os atributos so pares nome/valor
quaisquer definidos pela aplicao, e podem ser utilizados para configurar filtros
de seleo de mensagens, que permitem a
um cliente consumir apenas um subconjunto das mensagens entregues ao JMS.
As propriedades so informaes utilizadas pelo prprio JMS, como a prioridade
da mensagem e outros parmetros de QoS
(qualidade de servio). Com elas possvel, por exemplo, dizer ao JMS que ele pode
descartar a mensagem caso o servidor seja
reiniciado.
No JMS, uma mensagem no endereada a um destinatrio especfico (ao
contrrio do que acontece com correio
eletrnico, por exemplo). Qualquer cliente
JMS pode consumir qualquer mensagem,
independentemente de quem foi o cliente
responsvel por armazenar a mensagem
originalmente. As mensagens so essencialmente transitrias, deixando de existir
uma vez consumidas. Assim, o servio
JMS no substitui um banco de dados ou
outro mecanismo de persistncia. Uma implementao do servio JMS tem liberdade
total em relao a onde e como armazenar
uma mensagem at que ela seja consumida, e vrios deles usam bancos de dados
embutidos para fazer isso2.

Na verdade, uma mensagem endereada a uma fila, de modo que as mensagens


sejam consumidas na mesma ordem em
que foram entregues a esta fila. O JMS
prev dois tipos de filas, chamados genericamente de destinations: os queues e os
topics. A Figura 2 ilustra o funcionamento
de cada um deles.
Um queue (pronuncia-se ku) uma
fila no sentido usual, em que existe apenas
uma cpia de cada mensagem, e o primeiro
cliente a consumir a mensagem retira a
mensagem da fila. Queues so perfeitos
para situaes onde uma mensagem deve
ser processada uma nica vez, como uma
ordem de compra em uma loja virtual.
J um topic trabalha com o conceito de
assinaturas (subscriptions). Cada assinatura recebe uma cpia da mensagem, o
que o torna adequado como mecanismo
para propagao de eventos pela rede; por
exemplo em um sistema de monitorao
que deve informar a diversos operadores
sobre a falha de um servidor de rede. O
fato de um dos assinantes consumir a sua
cpia da mensagem no afeta os demais
assinates, que tm suas prprias cpias
para consumir.

2
A configurao padro do JBoss utiliza o HSQLDB,
mas ela pode ser modificada para usar outros bancos de
dados ou mesmo arquivos simples, sem perda de funcionalidade.

Queue JMS
Produtor
de
Mensagens

Mensagem
A

Mensagem
B

Mensagem
C

Consumidor
de
Mensagens

Topic JMS

Produtor
de
Mensagens

Mensagem
A

Mensagem
B

Mensagem
C

Mensagem
A

Mensagem
B

Mensagem
C

Assinante
de
Mensagens

Assinante
de
Mensagens

Figura 2. Tipos de destinos JMS, queues e topics


Edio 37 Java Magazine

33

Introduo ao JMS

Como uma mensagem no pode ser alterada


depois de colocada em um queue ou topic, esperase que um servio JMS no duplique mensagens,
mas apenas registre para cada mensagem quais
assinantes j a consumiram e quais ainda no o
fizeram, de modo a poupar memria e/ou disco

javax.jms.ConnectionFactory na rvore JNDI3 do


servidor de aplicaes. Isto bem coerente
com o Java EE em geral, onde todos os
tipos de recursos, como DataSources JDBC
e interfaces Home para EJBs devem ser
localizados via JNDI.

no servidor. Desde que conceitualmente tudo funcione como se cada assinante tivesse sua prpria
cpia de cada mensagem, qualquer otimizao

Em servidores Java EE 5.0, ser possvel substituir a busca explcita no JNDI (mtodo lookup())

por injeo de dependncias, via a anotao


@ Resource.

Mais especificamente, o cliente JMS


deve localizar no JNDI uma subinterface
de ConnectionFactory especfica para o tipo
de fila sendo manipulada, no caso um
queue, portanto a busca espera encontrar
um javax.jms.QueueConnectionFactory.

permitida.

O JMS prev dois tipos de assinaturas:


durveis e no-durveis. Em uma assinatura no-durvel, o assinante deve estar
executando no momento em que uma
nova mensagem entregue ao topic, caso
contrrio ele no receber a mensagem.
Um exemplo de uso de assinaturas nodurveis seria um display de cotaes
da bolsa de valores. Caso o display esteja
desligado, no h necessidade de se reenviar as mensagens perdidas quando ele for
novamente ligado.
J uma assinatura durvel garante que o
cliente que dono da assinatura no perca
nenhuma mensagem at que decida cancelar a assinatura. Neste caso, o servio JMS
deve armazenar uma cpia da mensagem
at que todos os assinantes do topic tenham
consumido a mensagem.

A API JMS
Vamos conhecer a API JMS por meio de
exemplos. A Listagem 1 apresenta um
cliente simples, que insere uma mensagem de texto dentro de uma fila chamada
queue/testQueue. Esta fila pr-definida
na instalao do JBoss. Assim, o exemplo
pode ser executado sem necessidade de
nenhuma configurao prvia no servidor. Mais adiante ser apresentado como
compilar e executar este cliente.
Todo cliente JMS, independente de ser
um produtor ou consumidor de mensagens (e nada impede que ele desempenhe ambos os papis) deve obter um
O JNDI (Java Naming and Directory Interface) um
servio e API padro do Java EE que permite localizar recursos locais ou remotos baseado em um nome textual.
Estes recursos podem ser desde objetos Java at usurios
e servidores de rede. O cliente do JNDI parte do Java
SE, e do servidor integrado ao servio JMS, podendo ser
compartilhado por outros servios Java EE.
3

34 Java Magazine Edio 37

Listagem 1. EnviaFila.java - Cliente que envia uma mensagem de texto para um queue JMS
import javax.jms.*;
import javax.naming.*;
public class EnviaFila {
public static void main(String[] args)
throws NamingException, JMSException
{
// obtm referncias ao QueueConnectionFactory e fila via JNDI
Context jndiContext = new InitialContext();
QueueConnectionFactory connectionFactory =
(QueueConnectionFactory)jndiContext.lookup(ConnectionFactory);
Queue queue = (Queue)jndiContext.lookup(queue/testQueue);
// conecta fila e inicia uma sesso
QueueConnection connection =
connectionFactory.createQueueConnection();
QueueSession session = connection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
// envia uma nica mensagem de texto
QueueSender sender = session.createSender(queue);
TextMessage message = session.createTextMessage();
message.setText(Oi via JMS);
sender.send(message);

// libera recursos
sender.close();
session.close();
connection.close();

ConnectionFactory

Destination

Message

QueueConnectionFactory

Queue

TextMessage

TopicConnectionFactory

Topic

BytesMessage

Connection

Session

StreamMessage

QueueConnection

QueueSession

MapMessage

TopicConnection

TopicSession

ObjectMessage

MessageProducer

MessageConsumer

QueueSender

QueueReceiver

TopicPublisher

TopicSubscriber

Figura 3. Principais interfaces e classes da API JMS

JMSException

Edio 37 Java Magazine

35

Introduo ao JMS

Listagem 2. RecebeFila.java - Cliente que recebe uma mensagem de texto de um queue JMS
import javax.jms.*;
import javax.naming.*;
public class RecebeFila {
public static void main(String[] args)
throws NamingException, JMSException
{
// obtm referncias ao QueueConnectionFactory e fila via JNDI
Context jndiContext = new InitialContext();
QueueConnectionFactory connectionFactory =
(QueueConnectionFactory)jndiContext.lookup(ConnectionFactory);
Queue queue = (Queue)jndiContext.lookup(queue/testQueue);
// conecta fila e inicia uma sesso
QueueConnection connection =
connectionFactory.createQueueConnection();
QueueSession session = connection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
// recebe mensagens
QueueReceiver receiver = session.createReceiver(queue);
connection.start();
while (true) {
TextMessage message = (TextMessage)receiver.receive(1);
if (message != null)
System.out.println(Recebi: + message.getText());
}

// libera recursos no encerramento da JVM

necessrio localizar no JNDI tambm


a fila desejada, no caso um javax.jms.Queue.
O ConnectionFactory utilizado para se obter
uma conexo fila, e esta conexo utilizada juntamente com o objeto fila (no caso
um Queue) recuperado anteriormente do
JNDI para iniciar uma sesso (Session).
A sesso ento utilizada para instanciar
um javax.jms.QueueSender, e este por sua vez
utilizado para enviar uma mensagem de
texto (TextMessage). Por fim, o exemplo libera os recursos vinculados ao servidor JMS,
no caso o Sender, a sesso e a conexo.

36 Java Magazine Edio 37

Em uma aplicao real, as vrias chamadas a


close() estariam dentro de um bloco finally, para
garantir sua execuo e a liberao de recursos
mesmo em caso de excees.

Toda API JMS espelhada em termos


de queues e topics, gerando dois conjuntos
paralelos de interfaces (veja as principais
interfaces da API na Figura 3). Dessa forma, um cliente que envie ou receba mensagens de um queue praticamente igual
ao que envia ou recebe de um topic. Na
verdade, possvel usar as superinterfaces
(como Destination, Connection e Session) para
criar clientes genricos, que podem
trabalhar indistintamente com queues e
topics. Apenas as interfaces de mensagens no so especializadas para queues
e topics.
A Listagem 2 mostra o cliente complementar ao apresentado na Listagem 1,
que recebe (consome) uma mensagem do
queue com nome queue/testQueue.
Observe a simetria entre este exemplo
e o anterior. O cdigo para localizar o
ConnectionFactory e o Queue o mesmo, assim
como a instanciao do Session e do Message.
A diferena est na instanciao de um
QueueReceiver em vez de um QueueSender.

O QueueReceiver deve ser iniciado (com o


mtodo start()) antes que seja possvel receber mensagens por ele. Depois o exemplo
fica em um loop infinito consumindo mensagens, at que seja terminado utilizando
os recursos do seu sistema operacional,
como o Ctrl-C. ( claro, em uma aplicao
real deve ser prevista uma forma ordenada
de se encerrar o cliente e limpar os recursos JMS inicializados por ele.)

Compilando e testando
os exemplos no JBoss
Para que seja possvel compilar os
dois exemplos para o JBoss, basta inserir no classpath do sistema o pacote
client/jboss-j2ee.jar fornecido com o servidor.
Outros servidores Java EE podero fornecer as interfaces da API JMS em um pacote
com nome diferente; ainda assim dever
ser possvel rodar os mesmos programas
em qualquer servidor Java EE (inclusive
usando os mesmos .class compilados com o
JBoss), desde que seja previamente criado
o queue queue/testQueue.
A execuo dos exemplos um pouco
mais complicada. Primeiro, o servidor
JBoss deve estar em execuo, utilizando
a configurao default inalterada em
relao ao pacote jboss-4.0.3SP1.zip (ou
mais recente) fornecido em jboss.org. Alm
disso, vrios pacotes JAR contidos na pasta
client do JBoss devem ser acrescentados ao
classpath.
Para facilitar, os fontes para download
deste artigo incluem um buildfile para
o Ant com alvos para compilar todos
os exemplos e executar cada um deles.
O buildfile configura para a execuo
dos exemplos todos os pacotes JAR na
pasta client do JBoss, o que no atrapalha apenas coloca no classpath alguns
pacotes que no seriam estritamente
necessrios.
Ento, basta editar o arquivo build.
xml e modificar o valor da propriedade
jboss para indicar o diretrio correto de
instalao do JBoss em seu computador.
E, com o JBoss ativo, digitar os comandos
destacados em negrito a seguir (o sinal $
representa o prompt de comandos e, claro,
no deve ser digitado):

$ ant compila
Buildfile: build.xml
init:
compila:
[javac] Compiling 10 source files to
/home/fernando/JavaMagazine/jms/jmsjboss/classes
BUILD SUCCESSFUL
Total time: 6 seconds
$ ant envia
Buildfile: build.xml
init:
envia:
[java] log4j:WARN No appenders could be found for
logger (org.jboss.mq.referenceable.SpyConnectionFactory
ObjectFactory).
[java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 3 seconds

As advertncias geradas pelo Log4j decorrem do fato do JBoss utilizar internamente


este framework de logging (apresentado
aqui na Edio 35). Se for fornecida uma
configurao adequada para o Log4j, ser
possvel ver mensagens de depurao dos
clientes JNDI e JMS do JBoss.
Antes mesmo de se executar o receptor
de mensagens, j possvel confirmar
que a mensagem foi recebida e armazenada pelo servio JMS do JBoss. Basta
abrir o JBoss Web Console, pela URL
http://127.0.0.1:8080/web-console/ e ento
expandir o n J2EE Domains/Manager/
JBoss/J2EE Resources/LocalJMS/Queues/
testQueue. A Figura 4 ilustra o resultado
esperado.
A primeira tabela apresenta estatsticas
acumuladas em todas as execues do
servidor, at que elas sejam explicitamente
zeradas (o que feito clicando o link Reset
Stats no final da pgina). A segunda tabela
apresenta estatsticas da execuo corrente
do JBoss.

de envio de mensagens (porque o exemplo


de recepo de mensagens fica em um
loop infinito). E nesta outra janela, digite
o comando ant recebe. A sada ser como
mostrado a seguir:
Buildfile: build.xml
init:
recebe:
warnings sobre logging
[java] Recebi: Mensagem 1
[java] Recebi: Oi via JMS

Uma atualizao (refresh) da pgina da


fila no JBoss Web Console dever mostrar
a fila com zero mensagens (veja o valor de
message count). Caso o exemplo de envio
seja executado novamente, o receptor ir
acusar imediatamente o recebimento da
nova mensagem, at que ele seja terminado
pelo fechamento da janela de comando, ou
pressionando-se Ctrl-C.

Configurando novas filas JMS no JBoss


Caso se deseje remover as filas configuradas por padro no JBoss, basta
editar o arquivo server/default/deploy/jms/
jbossmq-destinations-service.xml e remover os elementos <mbean code=org.jboss.
mq.server.jmx.Queue> ou <mbean code=org.

jboss.mq.server.jmx.Topic> indesejados. Na
verdade, todo o arquivo pode ser removido sem prejuzo para o funcionamento
do servio JMS do JBoss. O nico cuidado a se tomar no remover a fila DLC
(dead letter queue). Felizmente, esta
fila definida em outro arquivo, chamado
jbossmq-service.xml, que no deve ser editado a no ser por profundos conhecedores
da arquitetura interna do JBoss.
Para criar uma nova fila, basta criar um
arquivo com um nome qualquer, e o sufixo
-service.xml (ex.: minhaFila-service.xml), seguindo o modelo na Listagem 3, e copi-lo
para a pasta deploy da sua configurao
do servidor (na configurao padro,
server/default/deploy). O JBoss ir processar
o arquivo e imediatamente ativar todas as
filas (queue ou topic) definidas por ele.
Ser possvel ento modificar os exemplos apresentados nas Listagens 1 e 2 para
que eles usem a fila queue/minhaFila em
vez de queue/testQueue, e ser tambm
possvel verificar a presena de mensagens
na fila por meio do JBoss Web Console.
O JBoss sempre acrescenta ao nome JNDI de
uma fila o prefixo queue/ ou topic/, conforme

Estas estatsticas so definidas pela JSR-77 e


portanto estaro disponveis da mesma forma
(porm sob um caminho diferente na rvore de
objetos gerenciados JMX) em qualquer outro
servidor de aplicaes Java EE.

Para fechar o ciclo, temos que executar o


cliente que consome a mensagem na fila.
Abra outra janela de comandos, independente da que foi utilizada para o exemplo

Figura 4. JBoss Web Console aps a execuo do primeiro exemplo, indicando a presena de uma mensagem na fila
queue/testQueue aguardando para ser consumida
Edio 37 Java Magazine

37

Introduo ao JMS

o tipo de fila. Este prefixo no deve ser incluso


no nome da fila no arquivo de configurao
fila-service.xml.

Implementando segurana
Este foi um exemplo trivial de criao de
fila. Em aplicaes reais, haver necessidade de configurar regras de autenticao
e de controle de acesso, para definir que
clientes (ou usurios) podem enviar e receber mensagens de cada fila. As filas de
Listagem 3. minhaFila-service.xml Arquivo de configurao para definir uma nova fila JMS no JBoss
<?xml version=1.0 encoding=UTF-8?>
<server>
<mbean code=org.jboss.mq.server.jmx.Queue

name=jboss.mq.destination:service=Queue,name=minhaFila>
<depends optional-attribute-name=DestinationManager>
jboss.mq:service=DestinationManager</depends>
<depends optional-attribute-name=SecurityManager>
jboss.mq:service=SecurityManager</depends>
<attribute name=MessageCounterHistoryDayLimit>-1</attribute>
</mbean>
</server>

Listagem 4. RecebeAssincrono.java cliente que recebe assincronamente mensagens de uma fila JMS
import javax.jms.*;
import javax.naming.*;
public class RecebeAssincrono {
private class RecebeUmaMensagem implements MessageListener {
public void onMessage(Message msg) {
try {
TextMessage message = (TextMessage)msg;
if (message != null)
System.out.println(Recebi: + message.getText());
}
catch (JMSException e) {
System.out.println(Erro ao receber mensagem: + e);
e.printStackTrace();
}
}
};
public RecebeAssincrono() throws NamingException, JMSException {
// obtm referncias ao QueueConnectionFactory e fila via JNDI
// ... cdigo omitido por ser igual listagem 2 ...
// conecta fila e inicia uma sesso
// ... cdigo omitido por ser igual listagem 2 ...
// recebe mensagens
QueueReceiver receiver = session.createReceiver(queue);
receiver.setMessageListener(new RecebeUmaMensagem());
connection.start();
}
public static void main(String[] args) throws
NamingException, JMSException, InterruptedException
{
new RecebeAssincrono();
while (true)
Thread.sleep(10000);
}
}

38 Java Magazine Edio 37

exemplo fornecidas com o JBoss demonstram como fazer estas configuraes, segundo o modelo de segurana declarativa
padro do Java EE (apresentado nesta coluna na Edio 23). Reunindo os exemplos
deste artigo, os exemplos fornecidos com
o JBoss, e o artigo sobre segurana citado,
o leitor no dever ter dificuldades em
configurar queues e topics seguros.

Outros recursos da API JMS


Os exemplos disponveis para download
apresentam vrios outros recursos da API
JMS, que sero de fcil entendimento,
especialmente para os desenvolvedores
j habituados criao de servlets4. Eles
ilustram:
Envio e recebimento de mensagens em
topics (Publica.java e Assina.java);
Recebimento assncrono de mensagens
por meio de um event listener (RecebeAssincrono.java e AssinaAssincrono.java);
Adio de atributos a uma mensagem, e o seu uso posterior para filtrar
as mensagens recebidas por um outro
cliente JMS (EnviaComPropriedade.java e
RecebeComSeletor.java);
Criao de assinaturas durveis, de
modo que o cliente ir receber mensagens enviadas para um topic mesmo que
ele (o cliente) no esteja ativo no momento em que a mensagem foi entregue
ao servidor JMS (PublicaDuravel.java e
AssinaDuravel.java);
Como fornecer login e senha para conexo segura a uma fila (AssinaDuravel.java,
j citado nesta relao).
Como afirmamos no incio, nenhum dos
exemplos para download envolve EJBs,
mas os interessados em usar JMS com
essa tecnologia podem consultar o quadro
JMS e EJBs; o cdigo dos exemplos poder ser aproveitado com modificaes
mnimas.
4
Por exemplo, o conceito de atributo em uma mensagem JMS o mesmo de atributo da requisio HTTP.

5
Os demais exemplos apenas trocam as classes de
queue pelas classes de topic, ou acrescentam uma ou
duas chamadas novas a mtodos da API JMS.

JMS e EJB

esenvolvedores interessados em
usar o JMS junto com EJBs tambm
podero utilizar os exemplos fornecidos,
com pequenas modificaes.
Um Message-Driven EJB (MDB) sempre
consome mensagens de forma assncrona, de modo que seu cdigo nada
mais do que uma verso resumida de
RecebeAssincrono.java ( Listagem 4 ) .
O MDB basicamente se limita a implementar o mtodo onMessage(), enquanto
que o container EJB quem registra o
MDB como listener do QueueReceiver (ou
TopicSubscriber) configurado no descritor
de deployment.
J um EJB que envia mensagens para
uma fila pode ser de qualquer tipo (mas
em geral ser um Session EJB), e utilizar
exatamente o mesmo cdigo de cliente
JMS apresentado nos exemplos de envio
de mensagens.
O uso de seletores com MDBs no exige
o uso direto da API JMS, pois a condio
do seletor especificada no descritor de
deployment do EJB. (Seletores so filtros
de mensagens baseados nas propriedades das prprias mensagens)
Na verdade, o uso de JMS com EJBs
to simples e to parecido com o uso de
JMS sem EJBs que no achamos necessrio incluir exemplos especficos para
download. Qualquer desenvolvedor com
conhecimento de EJBs ter mo vrios
exemplos de Message-Driven EJBs, e este
artigo fornece o conhecimento bsico
sobre a API JMS que ele necessitar para
entender estes exemplos.

Va mos exa m i na r aqu i o exemplo


RecebeAssincrono.java (Listagem 4), pois
ele o nico que muda significativamente em relao aos j apresentados5. Este
cliente recebe mensagens da mesma fila

queue/testQueue usada nos exemplos


anteriores, portanto pode ser experimentado em conjunto com o exemplo
EnviaFila.java.
Observe primeiramente a classe aninhada (inner class) RecebeUmaMensagem, que
implementa a interface MessageListener do
JMS. Este estilo de programao, usando
classes aninhadas, basicamente o mesmo
utilizado em aplicaes Swing. O mtodo
onMessage() da classe aninhada chamado
pelo JMS sempre que estiver disponvel
uma nova mensagem. A prpria mensagem passada como argumento para o
mtodo, de modo que no h necessidade
de ser ler explicitamente a mensagem.
Depois temos o construtor da classe
RecebeAssincrono, que contm cdigo bastante semelhante ao presente no mtodo main()
do exemplo RecebeFila.java (Listagem 2).
A diferena est na chamada ao mtodo
setMessageListener() do QueueReceiver, que associa uma instncia da classe aninhada ao
evento que indica a chegada de uma nova
mensagem na fila. Mas os eventos s sero
efetivamente recebidos aps a chamada ao
mtodo start() do QueueConnection.
O mtodo main() deste exemplo se limita a criar uma instncia da classe
RecebeAssincrono, e depois fica em um loop
infinito para que a instncia possa aguardar pelos eventos do JMS.
Mesmo que haja a opo de se receber
mensagens sincronamente (chamando
receive()), ou assincronamente (por meio de um
MessageListener), a comunicao entre o produtor e o consumidor de mensagens sempre assncrona. A comunicao sncrona para recepo de
mensagens apenas entre o cliente consumidor
de mensagens e o servio JMS.

Concluses
Este artigo apresentou conceitos sobre
middlewares de mensagens, e os primeiros
passos para trabalhar com a API JMS e a
configurao e monitorao do servio
JMS no servidor JBoss. Procuramos no
duplicar o contedo de outros exemplos
e tutoriais disponveis na internet, mas
sim reunir em um s lugar todo o que o
leitor necessita para iniciar o desenvolvimento de aplicaes JMS e dar uma idia
de situaes onde o uso de JMS pode ser
vantajoso. Dada a simplicidade da API e
sua maturidade, no h motivos para no
us-la sempre que houver uma oportunidade!

java.sun.com/products/jms
Pgina da Sun sobre JMS, incluindo artigos
e tutoriais
jboss.org
Downloads e documentao do servidor JBoss
jcp.org/en/jsr/detail?id=914
Especificao JMS, muito til especialmente para
obter o Javadoc da API
javamagazine.com.br/downloads/jm37/
jm-jmsjboss.zip
Fernando Lozano
(flozano@javamagazine.
com.br, www.lozano.eti.br)
trabalha h mais de 10 anos
com desenvolvimento de sistemas
de informaes e integrao de redes, sendo um dos
pioneiros do uso do Software Livre no Brasil. Dentro
da comunidade, atua como Conselheiro do LPI
Brasil, Webmaster da FSF e Community Manager do
Java.net. Atualmente consultor associado Neki
Technologies (www.neki.com.br).

Edio 37 Java Magazine

39

Criando Plug-ins pa
Iniciando com o Eclipse Plug-in Development

possibilidade de customizao ,
sem dvida, um dos pontos que
devem ser considerados durante
a escolha de uma ferramenta de desenvolvimento. O Eclipse oferece muitas facilidades de personalizao e extenso, e no

toa que se tornou lder de mercado. Neste


artigo abordaremos o funcionamento dos
plug-ins desta IDE e os passos para criar
um plug-in totalmente funcional, para o
Eclipse 3.x.

A arquitetura do Eclipse
Grande parte do sucesso do IDE Eclipse
deve-se sua arquitetura extensvel (uma
IDE aberta e extensvel para tudo
e nada em especfico). O
Eclipse (neste artigo
usaremos Eclipse para nos

referirmos ao IDE e no ao projeto como


um todo) constitudo de um pequeno
ncleo e um imenso conjunto de plug-ins,
que trabalham juntamente para fornecer as
diversas funcionalidades da IDE1.
A plataforma Eclipse gerencia todo o
ciclo de vida dos plug-ins, sendo responsvel por localizar, carregar e executar os
plug-ins instalados. Quando o Eclipse
iniciado ele descobre quais plug-ins esto disponveis (procurando no diretrio
plugins) e constri um repositrio, denominado plug-in registry, que utilizado
posteriormente para carregar os plug-ins2.
A Figura1, adaptada da documentao do
Eclipse, ilustra a arquitetura da plataforma
e do SDK (que inclui a plataforma), e seus
principais componentes.
Para permitir extensibilidade, o Eclipse
foi projetado com baixo acoplamento entre suas partes, e um timo exemplo de
arquitetura modular e extensvel. Com a
exceo de um pequeno ncleo de runtime,
todas as outras partes do Eclipse so
plug-ins. A customizao da IDE conseguida estendendo-se seus plug-ins, o que
feito atravs de extension points (pontos
de extenso).
A idia simples: sempre que um plug-in
deseja permitir a extenso ou a customizao de uma de suas funcionalidades, ele
deve declarar um ponto de extenso. Os
pontos de extenso definem contratos

Como no apenas o Eclipse, mas diversas IDEs permitem extenso de suas funcionalidades atravs da adio
de plug-ins, isso motivou o desenvolvimento da JSR-198
(A Standard Extension API for Integrated Development
Environments), cujo objetivo permitir que plug-ins
possam ser implementados independentemente da IDE
onde sero utilizados.

O Eclipse no carrega os plug-ins at que eles sejam


usados pela primeira vez, o que economiza recursos e minimiza o tempo que a IDE demora para iniciar.

40 Java Magazine Edio 37

ra o Eclipse
Environment

Aprenda a criar plug-ins,


dos conceitos fundamentais
a um exemplo completo e
passo a passo, e tire ainda
mais proveito do Eclipse

Andr Dantas Rocha


(normalmente documentos XML e interfaces Java) que devem ser obedecidos
pelos plug-ins que implementam a extenso/customizao. interessante notar
que o plug-in que est sendo estendido
no conhece (nem precisa conhecer) cada
implementao especfica. Isso permite
que plug-ins de diferentes autores trabalhem conjuntamente com facilidade.
Enquanto alguns plug-ins so extremamente complexos e compostos de
arquivos de diversos tipos, outros so
simplesmente bibliotecas Java que podem ser utilizadas por outros plug-ins.
A plataforma Eclipse organizada em
nveis, com plug-ins de baixo nvel fornecendo pontos de extenso para plug-ins
de mais alto nvel. Alguns dos plug-ins
bsicos so:
Standard Widget Toolkit (SWT):
um toolkit que oferece uma API grfica
portvel e integrada com o sistema operacional (SO), o SWT utiliza JNI para
acessar as bibliotecas grficas nativas do
SO e renderizar os componentes grficos utilizados na IDE (botes, imagens,
labels etc.);
JFace: extenso de alto nvel do SWT,
que oferece mecanismos para construo
de dilogos, wizards, actions etc. O JFace
implementa a arquitetura MVC;
Java Developer Toolkit (JDT): ferramentas para manipulao de cdigo
Java;
GEF (Graphical Editing Framework):
APIs para construo de editores grficos;
EMF (Eclipse Modeling Framework):
APIs para construo de modelos;
Help: ferramentas para criao de
arquivos de ajuda;
Team: APIs para acesso a repositrios
e versionamento de arquivos.

Alm desses, dois outros plug-ins merecem ateno especial: o Workbench


(interface grfica comum para recursos e
ferramentas) e o Workspace (que gerencia
os recursos relativos aos projetos criados
pelo usurio). Extenses do Workbench
permitem alterar a aparncia do Eclipse,
criando novas views3, menus e editores,
enquanto que extenses do Workspace
permitem interagir com novos recursos,
como projetos e arquivos.

Estrutura de um plug-in
A partir da verso 3.0 do Eclipse, a descoberta e a ativao de plug-ins passaram
a ser comandadas por um mecanismo
baseado no Open Services Gateway initiative (OSGi). O uso dessa tecnologia
melhorou a portabilidade da ferramenta
entre diversos sistemas operacionais, e
fez com que os plug-ins passassem a ser
implementados segundo um novo modelo
(OSGi bundles).

O OSGi foi concebido originalmente para aplicaes mveis, mas aos poucos tem sido adotado
por aplicaes fora desse mercado. Seu objetivo
padronizar a maneira como os componentes devem ser registrados em uma aplicao, permitindo
que sejam carregados ou descarregados dinamicamente. O OSGi tem ganhado bastante destaque
ultimamente, e diversos projetos da Apache j
utilizam a tecnologia (ex.: Apache Directory).

Plug-ins podem ser compostos de diversos tipos de arquivos (classes, imagens,


bibliotecas etc.), e incluem descritores com
informaes sobre suas caractersticas
(verso, classpath, pacotes exportados,
pontos de extenso, classes envolvidas,
cones etc.). Essas informaes so usadas
pelo Eclipse para configurar o ambiente de
execuo do plug-in e seus componentes.

As views fazem parte do Workbench. Alguns exemplos bastante conhecidos de views so Console, Tasks e
Properties.

Figura1. Arquitetura do Eclipse.


Edio 37 Java Magazine

41

Criando Plug-ins para o Eclipse

Antes da verso 3.0 do Eclipse, cada


plug-in era armazenado em um diretrio
prprio (um subdiretrio do diretrio
plugin) e todas as informaes do plug-in
estavam contidas no arquivo plugin.xml,
tambm localizado nesse diretrio. Aps a
migrao para o modelo OSGi, os plug-ins
passaram a ser empacotados em arquivos
JAR4. Alm disso, as informaes bsicas
sobre suas caractersticas foram movidas
para o arquivo de manifest (META-INF/
MANIFEST.MF). Assim, plug-ins construdos a partir da verso 3.0 contm dois
descritores: plugin.xml e MANIFEST.MF.

O arquivo plugin.xml
O documento XML a seguir, extrado da
documentao do Eclipse, ilustra um descritor de plug-in simples, que implementa
uma nova view no Eclipse:
<?xml version=1.0 encoding=UTF-8?>
<?eclipse version=3.0?>
<plugin>
<extension point=org.eclipse.ui.views>
<category name=Hello Category
id=com.example.helloworld>
</category>
<view name=Hello View
icon=icons/sample.gif
category=com.example.helloworld
class=com.example.helloworld.HelloWorldView
id=com.example.helloworld.HelloWorldView>
</view>
</extension>
</plugin>

A implementao da nova view conseguida atravs do uso do ponto de extenso


org.eclipse.ui.views, indicado no elemento
<extension>. No elemento <category> so
descritos o nome (name) e o cdigo identificador (id) da categoria. A nova view
descrita no elemento <view>, onde so
indicados seu cone (icon), a referncia
sua categoria (category), a classe
implementadora (class) e o cdigo
identificador da nova view (id).
Os atributos de baixo nvel do
plug-in (ex.: informaes sobre
como o plug-in deve ser empacotado) so descritos no arquivo
MANIFEST.MF que, por simplicidade, no
mostrado neste artigo.
4
A estrutura utilizada em verses anteriores do Eclipse
(diretrios ao invs do JAR) continua vlida.

42 Java Magazine Edio 37

Como veremos adiante, o


Eclipse disponibiliza recursos que facilitam muito a
gerao e manuseio dos descritores de plug-ins (plugin.
xml e MANIFEST.MF).

Plug-in Development
Environment (PDE)
Vimos que a plataforma
Eclipse responsvel por
gerenciar todo o ciclo de
vida de um plug-in, escondendo do desenvolvedor os
detalhes de infra-estrutura.
Assim, o desenvolvedor
passa a se preocupar apenas com a implementao
Figura2. Informando os dados bsicos do projeto.
da lgica de negcios do
plug-in, podendo aproveiA utilizao do plug-in ser feita da
tar os recursos de uma ferramenta bastante
valiosa (que tambm um plug-in!): o
seguinte maneira: o usurio seleciona,
Eclipse PDE. O Plug-in Development Enno Package Explorer, o arquivo que deseja
vironment um ambiente completo para
editar, clica com o boto direito e seleciona
desenvolvimento de plug-ins, que contemno menu popup o item correspondente.
pla recursos para sua construo, teste,
Todos os caracteres especiais do arquivo
(que deve estar aberto no editor) sero
depurao e empacotamento. O Eclipse
SDK j inclui o PDE, que vem configurado
substitudos automaticamente, e uma
barra de progresso indicar o andamento
e pronto para uso.
da operao.

Um exemplo completo
As funcionalidades do PDE sero apresentadas atravs do desenvolvimento
completo de um plug-in que automatiza a
codificao de caracteres especiais.
Quando escrevemos documentao
JavaDoc ou arquivos de propriedades
(.properties), um boa prtica utilizar
codificao HTML para caracteres especiais, permitindo que o texto seja exibido
corretamente em diversos browsers.
Desse modo, o caractere deve
ser substitudo por &atilde;, o
caractere por &ccedil; e assim sucessivamente (veja referncia
ao final do artigo).
O maior problema dessa abordagem que
o desenvolvedor deve conhecer os cdigos
dos caracteres e digit-los corretamente. O
nosso plug-in far isso automaticamente,
substituindo caracteres especiais por seus
correspondentes em HTML.

Criando o projeto do plug-in


A maneira mais fcil de criar um plug-in
usando um wizard disponvel no Eclipse. Selecione File|New>Project e escolha a
opo Plug-in Project dentro da categoria
Plug-in Development. A primeira tela do
wizard ser exibida (Figura2). Nesta tela
devem ser informadas as caractersticas
do projeto.
possvel perceber que a criao de
um projeto de plug-in semelhante de
um projeto Java comum. Vamos aceitar
as opes default, e fornecer br.com.
jm.plugin como o nome do projeto (
uma boa prtica utilizar nomenclatura de
pacotes para o nome do plug-in). Ao clicar
no boto Next, o wizard direcionado para
a prxima pgina (Figura3).
Nessa tela devemos informar os dados
bsicos do plug-in, como identificador
(Plug-in ID), nome (Plug-in Name) e classe

de gerenciamento (Class
Name). Alm disso,
necessrio informar
se o plug-in faz alguma
contribuio para a interface grfica do Eclipse e se uma aplicao
rich client5 deve ser gerada.
Novamente vamos aceitar as opes
default, preenchendo os campos ID,
Name, Provider e Class. Nosso plug-in ser
identificado como br.com.jm.plugin (
uma conveno utilizar o mesmo nome
do projeto). E como o plug-in adiciona um
menu popup IDE, deixaremos marcada
a opo This plug-in will make contributions
to the UI.
A terceira tela do wizard (Figura4)
permite escolher um dentre diversos
templates de plug-ins disponveis no
PDE. O uso de um template facilita o desenvolvimento: baseado nele, o PDE gera
automaticamente o esqueleto de todas
as classes envolvidas e configura adequadamente os pontos de extenso necessrios. claro que ainda sero necessrias
alteraes no cdigo gerado para ajustar o
comportamento do plug-in, como veremos
a seguir. Para desenvolver o nosso plug-in

Figura3. Informando os dados bsicos do plug-in.

usaremos o template
Plug-in with a popup
menu.
A ltima tela do wizard (Figura5) configura
o novo popup. Como especificado anteriormente, um
menu popup ser exibido
sempre que o usurio selecionar um arquivo e clicar
com o boto direito. A filtragem
dos arquivos que sero vlidos para essa
operao (aqueles para os quais o popup
estar disponvel) configurada atravs
de duas propriedades: Target Objects Class
e Name Filter.
Na propriedade Target Objects Class, utilizaremos org.eclipse.core.resources.IResource,
especificando que qualquer recurso
disponibilizar o menu (adiante faremos
um refinamento dos arquivos que efetivamente permitiro o popup). A propriedade Name Filter ser preenchida com *
(indicando qualquer nome de recurso). O
novo submenu popup ser denominado
Java Magazine (propriedade Submenu
Name) e conter um nico item, denominado Substituir caracteres especiais
(propriedade Action Label). A classe
br.com.jm.plugin.popup.actions.SubstituirAction

(o valor da propriedade Action Class) responsvel por gerenciar as aes desse item
de menu e ser descrita mais adiante.

Analisando o plugin.xml
Na Listagem1 exibido o cdigo do
plugin.xml, gerado pelo wizard. Vamos
agora analisar esse descritor e entender
cada uma de suas partes.
O primeiro elemento, <extension>, especifica o nico ponto de extenso utilizado
pelo plug-in:
<extension point=org.eclipse.ui.popupMenus>

O elemento <objectContribution>, que aparece logo em seguida:


<objectContribution
objectClass=org.eclipse.core.resources.IResource
nameFilter=*
adaptable=true
id=br.com.jm.plugin.contribution1>

Este elemento adiciona uma contribuio (extenso) para menus popup, mas
este s ser exibido se o objeto selecio-

5
Basicamente, uma aplicao rich client um programa
cliente no-web com interface visual. O Eclipse oferece
facilidades para criao de aplicaes desse tipo atravs
da RCP (Rich Client Platform).

Figura4. Escolhendo um template para o plug-in.


Edio 37 Java Magazine

43

Criando Plug-ins para o Eclipse

nado for compatvel com a especificao


contida nos atributos objectClass (classe do
objeto) e nameFilter (um filtro para o nome
do objeto). O atributo id foi criado automaticamente pelo wizard, e define um
identificador para o elemento. O atributo
adaptable precisa ser adicionado manualmente, para tambm permitir que arquivos
Java sejam selecionados (arquivos Java so
do tipo org.eclipse.jdt.core. ICompilationUnit e
so tratados pelo JDT).
No elemento <menu> so
descritas as caractersticas
do menu que ser exibido
quando o boto direito for
clicado:
<menu
label=Java Magazine
path=additions
id=br.com.jm.plugin.menu1>
<separator name=group1/>
</menu>

Figura5. Configurao do menu popup para o plug-in.

O atributo label define o


nome do submenu a ser
inserido no menu principal
do Eclipse; o atributo path
determina sua localizao
(em qual menu o submenu
ser adicionado); o atributo
id define sua identificao

Listagem 1. Arquivo plugin.xml


<?xml version=1.0 encoding=UTF-8?>
<?eclipse version=3.0?>
<plugin>
<extension point=org.eclipse.ui.popupMenus>
<objectContribution
objectClass=org.eclipse.core.resources.IResource
nameFilter=*
adaptable=true
id=br.com.jm.plugin.contribution1>
<menu
label=Java Magazine path=additions
id=br.com.jm.plugin.menu1>
<separator name=group1></separator>
</menu>
<action
label=Substituir caracteres especiais
class=br.com.jm.plugin.popup.actions.SubstituirAction
menubarPath=br.com.jm.plugin.menu1/group1
enablesFor=1
id=br.com.jm.plugin.newAction>
<enablement>

<and>

<objectState name=readOnly value=false/>

<or>

<objectState name=extension value=java/>

<objectState name=extension value=properties/>

</or>

</and>
</enablement>
</action>
</objectContribution>
</extension>
</plugin>

44 Java Magazine Edio 37

nica no arquivo. O elemento <separator>


cria uma referncia ao menu corrente,
permitindo que actions sejam associadas
ao menu (veja a descrio do prximo
elemento).
Por fim, temos o elemento <action>:
<action
label=Substituir caracteres especiais
class=br.com.jm.plugin.popup.actions.SubstituirAction
menubarPath=br.com.jm.plugin.menu1/group1
enablesFor=1
id=br.com.jm.plugin.newAction>

Nele encontra-se a descrio do nico


item de menu (atributo label); a classe que
executar a ao quando o item for clicado (atributo class); o menu ao qual esse
item pertence (atributo menubarPath), e seu
identificador (atributo id). O valor definido
para o atributo enablesFor especifica que
essa ao s estar disponvel quando
um nico objeto for selecionado (seleo
simples).
O framework de actions, parte do JFace, um
recurso bastante interessante da arquitetura do
Eclipse, permitindo a construo e configurao
de classes de forma declarativa (via XML). Essa
abordagem fundamental na performance do
Eclipse, j que permite que os menus sejam acessados sem que necessariamente o plug-in precise ser
carregado (a carga do plug-in exige criao de um
classloader, carregamento de classes etc.).

O cdigo da action gerado pelo PDE foi


incrementado com mais um elemento:
<enablement>. Com vimos anteriormente,
possvel definir de forma declarativa
diversas caractersticas de uma action.
O elemento <enablement>, utilizado aqui,
permite especificar quando o menu popup
estar disponvel, atravs da analise das
caractersticas do objeto que est selecionado no IDE:
<enablement>
<and>
<objectState name=readOnly value=false/>
<or>
<objectState name=extension value=java/>
<objectState name=extension value=properties/>
</or>
</and
</enablement>

No nosso caso, utilizamos uma expresso


baseada no estado do objeto (objectState)

Figura7. O menu popup exibido quando um arquivo selecionado.


Figura6. Direcionando para a perspectiva de plug-ins.

para especificar que apenas arquivos .java e


.properties podero ser editados, e que esses
arquivos no devem ser read-only. As propriedades utilizadas aqui esto descritas
na classe org.eclipse.ui.IResourceActionFilter.

Efetuando o primeiro teste


Aps criar o projeto, a perspectiva de
plug-ins (Plug-in Development) ser acionada (veja a Figura6). Neste ponto, j
possvel efetuar o primeiro teste, para
verificar se essa verso inicial plug-in se
comporta como esperado.
Para testar a implementao, basta clicar
com o boto direito sobre o projeto do
plug-in e escolher a opo Run as>Eclipse
Application. Uma nova instncia da IDE
ser aberta. Ser necessrio criar, nessa
nova instncia, um projeto para o teste
do plug-in. Esse projeto deve conter, no
mnimo, um arquivo .java e um arquivo
.properties, que sero usados para testar
o menu.
Como o PDE j configura o plug-in para
a nova instncia do Eclipse, quando o
boto direito for clicado sobre um arquivo vlido, o submenu Java Magazine e
o item Substituir caracteres especiais
estaro disponveis. Ao clicar em Substituir caracteres especiais, uma mensagem

ser exibida. O processo


ilustrado nas Figuras
7 e 8.
O novo plug-in tambm
estar disponvel na lista
de plug-ins instalados.
Pode-se verificar isso,
selecionando Help|About
Eclipse SDK e depois clicando no boto Plug-in
Details (veja a Figura9).

Figura8. Mensagem de teste (criada automaticamente pelo wizard).

Codificando as classes
Agora que o esqueleto
do plug-in est pronto,
partiremos para sua implementao. O primeiro
passo consiste em indicar Figura9. Aps iniciar a nova instncia da IDE, o plug-in estar disponvel.
as dependncias (outros
MF). As dependncias devem ser aponplug-ins) necessrias para o nosso plug-in.
tadas na aba Dependencies, como indicado
O PDE disponibiliza uma view especial
na Figura10.
para edio das configuraes do plug-in,
Nosso plug-in composto de quatro de clasonde seus atributos podem ser manipuses: br.com.jm.plugin.JMPlugin (Listagem2),
lados de forma amigvel. Clicando duas
vezes no arquivo plugin.xml, as configubr.com.jm.plugin.popup.actions.SubstituirAction
raes so mostradas num editor especial
(Listagem3),br.com.jm.plugin.popup.actions.
com diversas abas. Nessas abas possvel
Substituidor (Listagem4) e br.com.jm.plugin.
visualizar e editar as caractersticas do
popup.actions.Config (Listagem5).
plug-in (inclusive o arquivo MANIFEST.
importante ressaltar que a classe

Edio 37 Java Magazine

45

Criando Plug-ins para o Eclipse

Listagem2. Classe JMPlugin, gerada pelo wizard do PDE.

Listagem4. Classe Substituidor, responsvel pela substituio dos caracteres especiais.

package br.com.jm.plugin;
import org.eclipse.ui.plugin.*;
import org.eclipse.jface.resource.ImageDescriptor;
import org.osgi.framework.BundleContext;

package br.com.jm.plugin.popup.actions;

public class JMPlugin extends AbstractUIPlugin {


private static JMPlugin plugin;
public JMPlugin() {
plugin = this;
}
public void start(BundleContext context) throws Exception {
super.start(context);
}
public void stop(BundleContext context) throws Exception {
super.stop(context);
plugin = null;
}
public static JMPlugin getDefault() {
return plugin;
}

public static ImageDescriptor getImageDescriptor(String path)


{
return AbstractUIPlugin.imageDescriptorFromPlugin(
br.com.jm.plugin, path);
}

Listagem3. Classe SubstituirAction, o controller do plug-in.


package br.com.jm.plugin.popup.actions;
import br.com.jm.plugin.JMPlugin;
import
import
import
import
import
import
import

org.eclipse.jface.action.IAction;
org.eclipse.jface.dialogs.MessageDialog;
org.eclipse.jface.text.Document;
org.eclipse.jface.viewers.ISelection;
org.eclipse.swt.widgets.Shell;
org.eclipse.ui.*;
org.eclipse.ui.texteditor.ITextEditor;

public class SubstituirAction implements IObjectActionDelegate {


public void setActivePart(
IAction action, IWorkbenchPart targetPart) { }
public void run(IAction action) {
IEditorPart editor = JMPlugin.getDefault().getWorkbench().
getActiveWorkbenchWindow().getActivePage().
getActiveEditor();
if (editor instanceof ITextEditor) {
Document doc = (Document) ((ITextEditor) editor).
getDocumentProvider().getDocument(
editor.getEditorInput());
int total = new Substituidor().substituir(doc);

import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.Map;
import
import
import
import
import
import

org.eclipse.core.runtime.IProgressMonitor;
org.eclipse.jface.dialogs.ProgressMonitorDialog;
org.eclipse.jface.operation.IRunnableWithProgress;
org.eclipse.jface.text.*;
org.eclipse.swt.widgets.Shell;
org.eclipse.ui.*;

public class Substituidor {


public int substituir(Document doc) {
int total = 0;
if (doc != null && doc.getLength() > 0) {
MonitorProgresso m = new MonitorProgresso(
doc, Config.getMapa());
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
try {
new ProgressMonitorDialog(
win.getShell()).run(false, false, m);
total = m.substituidos();
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
return total;
}
private class MonitorProgresso
implements IRunnableWithProgress
{
private Document doc;
private Map mapa;
private int substituidos = 0;
MonitorProgresso(Document doc, Map mapa) {
this.doc = doc;
this.mapa = mapa;
}
public int substituidos() {
return substituidos;
}
public void run(IProgressMonitor monitor) {
monitor.beginTask(Convertendo caracteres...,
mapa.size());
try {
FindReplaceDocumentAdapter adapter =
new FindReplaceDocumentAdapter(doc);
Iterator iterator = mapa.keySet().iterator();
while (iterator.hasNext()) {
String antes = (String) iterator.next();
String depois = (String) mapa.get(antes);

if (total > 0) {
MessageDialog.openInformation(new Shell(),
Substituio

de caracteres, total
+ caractere(s) substitudo(s));
}
else

{
MessageDialog.openWarning(new Shell(),
Substituio

de caracteres,
Nenhum caractere substitudo);
}

monitor.subTask(Substituindo + antes + por


+ depois + );
IRegion region = null;
do {
region = adapter.find(0, antes, true, true, false,
false);
if (region != null) {
adapter.replace(depois, false);
substituidos++;
}
}
while (region != null);

public void selectionChanged(


IAction action, ISelection selection) { }

46 Java Magazine Edio 37

monitor.worked(1);

}
catch (Exception e) {
// tratar
}
finally {
monitor.done();
}

Listagem5. Classe Config: para configurao dos caracteres


que sero substitudos.
package br.com.jm.plugin.popup.actions;
import java.util.LinkedHashMap;
import java.util.Map;
public class Config {
private static Map mapa =
new LinkedHashMap();
static {
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,

&oslash;);
&Oslash;);
&szlig;);
&reg;);
&copy;);
&euro;);
&aelig;);

mapa.put(,

&agrave;);
mapa.put(, &acute;);
mapa.put(, &Agrave;);
mapa.put(, &Aacute;);
mapa.put(, &acirc;);
mapa.put(, &Acirc;);
mapa.put(, &auml;);
mapa.put(, &Auml;);
mapa.put(,

&aring;);
mapa.put(, &Aring;);
mapa.put(, &atilde;);
mapa.put(, &Atilde;);
mapa.put(, &ccedil;);
mapa.put(, &Ccedil;);

mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,

&eacute;);
&Eacute;);
&egrave;);
&Egrave;);
&ecirc;);
&Ecirc;);
&euml;);
&Euml;);

mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,

&iuml;);
&Iuml;);
&iacute;);
&Iacute;);

mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,

&ocirc;);
&oacute;);
&Ocirc;);
&Oacute;);
&ouml;);
&Ouml;);
&otilde;);
&Otilde;);

mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,
mapa.put(,

&ugrave;);
&Ugrave;);
&ucirc;);
&Ucirc;);
&uuml;);
&Uuml;);

public static Map getMapa() {


return mapa;

Figura10. Indicando as dependncias do plug-in.


JMPlugin criada automaticamente pelo
wizard do PDE. Essa classe responsvel
por gerenciar o plug-in e, como implementamos um plug-in visual, ela estende
a classe org.eclipse.ui.plugin.AbstractUIPlugin.
Dois mtodos merecem destaque: start(),
que invocado quando algum cdigo do
plug-in chamado pela primeira vez; e
stop(), invocado quando o plug-in descarregado.
A classe SubstituirAction (Listagem3) o
controller do plug-in. Como o plug-in
adiciona um novo menu popup ao Workbench, necessrio implementar a interface org.eclipse.ui.IObjectActionDelegate para
tratar suas aes. O principal mtodo da
classe run(), que disparado sempre que
o item de menu selecionado. No cdigo
a seguir possvel entender o funcionamento desse mtodo.
Inicialmente o editor corrente selecionado6:
IEditorPart editor = JMPlugin.getDefault().
getWorkbench().getActiveWorkbenchWindow().
getActivePage().getActiveEditor();

Se o editor implementar a interface


ITextEditor, o documento atual armazenado na varivel doc e passado como parmetro para o mtodo substituir() da classe
Substituidor, que efetua a substituio de todos os caracteres especiais do documento e
retorna o total de caracteres alterados:

if (editor instanceof ITextEditor) {


Document doc = (Document) ((ITextEditor) editor).
getDocumentProvider().getDocument(
editor.getEditorInput());
int total = new Substituidor().substituir(doc);
...
}

A classe Substituidor (Listagem4) quem


faz todo trabalho pesado. Quando o mtodo substituir() disparado, o trabalho
de substituio de caracteres delegado para uma inner class, denominada
MonitorProgresso. Uma nova instncia dessa
classe criada, passando como parmetros
o documento e o mapa de substituio
(este mapa est configurado na classe
Config, mostrada na Listagem5):
MonitorProgresso m = new MonitorProgresso(
doc, Config.getMapa());

A inner class MonitorProgresso (parte da


Listagem4) foi criada para executar a
operao de substituio de caracteres e
monitorar seu progresso (assim deixamos
o usurio ciente do que est acontecendo). Para que seja possvel acompanhar
o andamento da operao, a nova classe
implementa a interface org.eclipse.jface.
operation.IRunnableWithProgress que define o
6
No

Eclipse o editor o recurso primordial para


criao e modificao de arquivos. O Eclipse disponibiliza alguns editores bsicos, como por exemplo,
org.eclipse.ui.texteditor.ITextEditor (para edio de arquivos
texto em geral, incluindo cdigo Java).

Edio 37 Java Magazine

47

Criando Plug-ins para o Eclipse

mtodo run(), onde a lgica de substituio


implementada.
O mtodo run() recebe como parmetro
um objeto do tipo org.eclipse.core.runtime.
IProgressMonitor, criado automaticamente
pelo Eclipse. Nesse objeto indicado o
progresso da operao:
monitor.beginTask(Convertendo caracteres..., mapa.size());

Para substituio propriamente dita, utilizandos um objeto da classe org.eclipse.jface.


text.FindReplaceDocumentAdapter, que oferece
mtodos para localizao e substituio
de textos:
FindReplaceDocumentAdapter adapter =
new FindReplaceDocumentAdapter(doc);

O processo de substituio muito simples: o mapa de substituio percorrido e,


para cada caractere definido no mapa, faz-

se uma busca no arquivo. Caso a busca seja


bem sucedida, todas as ocorrncias desse
caractere so substitudas pelo smbolo
correspondente em HTML, e o progresso
incrementado:
region = adapter.find(0, antes, true, true, false, false);
if (region != null) {
adapter.replace(depois, false);

}
...
monitor.worked(1);

A instncia da classe MonitorProgresso


(armazenada na varivel m) usada na
classe Substituidor a partir de caixa de dilogo especial (uma instncia de org.eclipse.
jface.dialogs.ProgressMonitorDialog), que exibe
o progresso total da operao:
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow win = wb.getActiveWorkbenchWindow();

new ProgressMonitorDialog(win.getShell()).
run(false, false, m);
total = m.substituidos();

A Figura11 mostra o plug-in em


execuo.

Empacotando o plug-in
Figura11. Progresso da substituio de caracteres.

Figura12. Exportao do plug-in.

48 Java Magazine Edio 37

Aps implementao e
teste do plug-in, necessrio
empacot-lo para distribuio. Para isso o PDE disponibiliza um wizard, que pode
ser acessado atravs do link
Export Wizard, na aba Overview da perspectiva Plug-in
Development (Figura12).
O wizard simples. Aceitando as opes default, o
arquivo br.com.jm.plugin_
1.0.0.zip ser gerado no
diretrio indicado (neste
caso, em c:\teste). Este ZIP
conter um JAR de mesmo
nome, que para instalao
deve ser copiado para o
diretrio plugins do Eclipse.
Depois disso, s reiniciar
o Eclipse e o plug-in estar
disponvel.

Concluses
O Eclipse possui uma grande capacidade
de extenso, e sua arquitetura foi pensada
para permitir que diversas contribuies
possam trabalhar em conjunto para oferecer novos recursos ferramenta.
Uma das principais facilidades para o
desenvolvimento de plug-ins o PDE,
que contm um conjunto de recursos que
auxiliam as tarefas do desenvolvedor e
aceleram a criao de extenses. Aqui
foram apresentados conceitos e exemplos
para iniciar a criao de plug-ins. Portanto
agora s comear a codificar!

Eclipse in Action: A Guide for Java


Developers,
David Gallardo et al. (Manning)
Eclipse: A Java Developers Guide,
Steve Holzner (OReilly)
Contributing to eclipse: Principles Patterns And
Plug-Ins,
Erich Gamma e Kent Beck (Addison Wesley)
Eclipse: Building Commercial-Quality Plug-ins,
Eric Clayberg e Dan Rubel (Addison Wesley)

onjava.com/pub/a/onjava/2005/02/09/
eclipse.html
Introduo aos plug-ins do Eclipse
eclipse.org/articles/
Article-PDE-does-plugins/PDE-intro.html
Introduo ao Eclipse PDE
help.eclipse.org/help31/index.jsp
Help online do Eclipse 3.1
ramsch.org/martin/uni/fmi-hp/
iso8859-1.html
Caracteres especiais em HTML
javamagazine.com.br/downloads/jm37/
jm-eclipseplugins.zip
Andr Dantas Rocha
(ad-rocha@uol.com.br)
bacharel em Cincias da Computao pela UNIFACS, mestre
em Engenharia de Software pela USP
e consultor da Politec. (O autor agradece a Cleiton
Diniz, headshot, pela ajuda na codificao.)

'%.%3)3

/PEN SOUR

&RAMEWORK/PEN3OURCE

'%.%3)3

/FRAMEWORKINTEGRADO'%.%3)3 DESENVOLVIDO
PELA3UMMA4ECHNOLOGIESEDISPONIBILIZADOAO
MERCADODEFORMALIVREEGRATUITAOPENSOURCE
n,'0, PROPICIAIMPLEMENTARSUASAPLICAES
SOBREUMASLIDAINFRA ESTRUTURA PERMITINDOQUE
SOLUESCOMPLEXASPOSSAMSERDESENVOLVIDASDE
FORMAPRTICAERPIDA

'%.%3)3

!JUDANDOSUAEMPRESAAENCONTRAR
OMELHORCAMINHO

/PEN

'%.%3)3
0ARAMAISINFORMAES DOWNLOADDO'%.%3)3
EDESUADOCUMENTAO CONSULTEOSITE
WWWSUMMA TECHCOMBRFRAMEWORKHTML

5MAEMPRESAPREMIADA

$UKE#H
7INNER
/SPROJETOSQUECONTARAMCOMCONSULTORIADA
3UMMA4ECHNOLOGIESINCLUEMOSNICOSSISTEMAS
BRASILEIROSQUEJRECEBERAMOALMEJADOPRMIO
$UKE!WARD CONFERIDOANUALMENTEDURANTEA
*AVA/NE#ONFERENCEEMRECONHECIMENTOAPROJETOS
DEEXTREMAINOVAOEM*AVANOMUNDO0ROJETO
#ARTO.ACIONALDA3ADEDO
$ATASUS E0ROJETO)20&
-ULTIPLATAFORMADA
2ECEITA&EDERALE3ERPRO

$UKE#HOI
0ROJETO)20&

7INNE
Edio 37 Java Magazine

49

Sun

Tech
Days 2006

Java na Era da
Participao

m a sala principal
1.500 pessoas lotara
de
is
Ma
o:
viv
ao
ferramentas Java.
Tecnologia
sobre tecnologias e
as
nic
tc
s
tra
les
pa
para

50 Java Magazine Edio 37

quarto Sun Tech Days, realizado


nos dias 11 e 12 de abril, trouxe
mais de 1.500 desenvolvedores ao
Transamerica Expo Center, em So PauloSP, e contou com a presena de importantes executivos da Sun Microsystems. Entre
eles, estavam o recm-nomeado CEO da
Sun, Jonathan Schwartz, que acumula
este cargo com o de presidente. Tambm
participou do evento um extenso grupo de
evangelistas e desenvolvedores de vrios
pases, tanto da Sun como de empresas
parceiras.
As sesses de abertura foram realizadas
na grande sala principal, com capacidade
para mais de mil pessoas e cinco teles.
Reggie Hutcherson, que gerencia o grupo
de evangelistas de tecnologia da Sun, foi
mais uma vez o mestre de cerimnias,
responsvel pelas principais brincadeiras
e premiaes, e por apresentar os palestrantes das sesses especiais.

Era da participao: Jonathan Schwartz destaca a importncia das comunidades e a apresenta a viso
da Sun para o open source.

Jonathan Schwartz falou sobre a era da


participao, reforando que os desenvolvedores no compram produtos: eles
participam de projetos. Destacou ainda o
comprometimento da Sun com o software
livre, anunciando que todos os produtos
da empresa se tornaro open source no
futuro (sem no entanto indicar datas ou
outros detalhes desse processo). O foco
da empresa no apoio construo e
expanso de comunidades foi outro tema
de sua sesso.
A sesso especial seguinte foi liderada
por Jeff Jackson, vice-presidente do grupo
de plataformas para desenvolvedores e
Java, e gerente dos programas voltados a
desenvolvedores, incluindo o NetBeans,
o Java SE e o portal java.net (ele chefe
de James Gosling). A apresentao tratou
da facilidade de desenvolvimento, a evoluo da plataforma Java, e comunidades
construdas em torno da tecnologia. Um
aspecto divertido foi o lanamento de camisetas durante a palestra: a cada apario

Jeff Jackson e os Dukes: a cada Duke, um


trio de brasileiros lanava uma camiseta para
a platia usando um super-estilingue.

na tela de um Duke (o mascote do Java),


uma equipe fazia o lanamento com um
grande estilingue usado por Gosling em
edies passadas do evento JavaOne.
Complementando o evento central,
aconteceram no dia 10 de abril o NetBeans
Day, que trouxe importantes evangelistas
e desenvolvedores do NetBeans, alm do
Solaris Day. Ocorreu ainda, no dia 12 de
abril, a segunda edio do Sun Tech Days
for Universities, um evento gratuito voltado a estudantes universitrios de cursos
tecnolgicos.
Uma novidade desta edio do Sun Tech
Days foi a realizao de sub-eventos
em vrias cidades do pas iniciativa
liderada pelo grupo de usurios SouJava.
As sesses especiais foram transmitidas
pela internet ao vivo para todas as cidades envolvidas e projetadas em teles.
Depois ocorreram eventos paralelos em
cada cidade, com palestrantes convidados. Foram mais de 3 mil participantes
remotos adicionais, em 14 cidades, nas
cinco regies do Brasil.
Alm das palestras e sesses especiais,
durante todo o evento ficou aberto um
pavilho de exposies com estandes da
Sun, de empresas parceiras e de outros
patrocinadores e apoiadores. Finalmente, o
almoo, os coffee-breaks e um coquetel na
noite do segundo dia foram boas oportunidades para aumentar a rede de contatos
e conhecer novos produtos e empresas.

Schwartz e o Brasil

onathan Schwartz, presidente mundial da Sun e agora CEO da empresa,


participou de vrias atividades no
Brasil, inclusive de uma reunio com o
presidente Lus Incio Lula da Silva. Ficou
impressionado com a fora da comunidade
de desenvolvedores, e relatou a experincia em detalhes no seu blog (blogs.sun.
com/jonathan): acabei de retornar de So
Paulo e Braslia, e posso confirmar que o
Brasil um dos pases mais progressivos
do mundo, quando se trata de software
livre e open source. E tem uma das mais vibrantes comunidades de desenvolvedores
[o SouJava].
Schwartz tambm destacou iniciativas
do Brasil relacionadas a software livre e
incluso digital (que foram temas de sua
conversa com Lula), e citou o que chamou
de Brazilian Effect, realando que os brasileiros tm especial orgulho pelo progresso
e evoluo nacionais. H uma energia
palpvel, escreveu Schwartz.

O novo CEO da Sun, Jonathan Schwartz:


Eu compreendo o Brazilian Effect

Edio 37 Java Magazine

51

Relatrios na Web P
Criando um relatrio mestre-detalhe usando

este artigo, vamos destacar pontos importantes e dicas na criao de relatrios, e desenvolver
passo a passo um relatrio mestre-detalhe
usando o JasperReports e o iReport. Vamos
criar tambm uma aplicao web que gera
o relatrio.

Funcionamento do JasperReports
O JasperReports uma biblioteca para
a gerao de relatrios, open source e

52 Java Magazine Edio 37

escrita em Java. Com ela possvel enviar


o relatrio gerado diretamente para a tela
ou impressora, armazenar esse contedo
em disco em forma serializada, e transform-lo em um documento nos formatos
PDF, HTML, XLS, RTF, CSV, TXT ou XML.
Relatrios criados com o JasperReports
podem ser usados tanto em aplicaes
web quanto desktop. O JasperReports e
o iReport j foram apresentados na Java
Magazine, nas Edies 13 e 21.

O processo de desenvolvimento de um
relatrio (veja a Figura1) comea com a
codificao da definio do relatrio em
XML, usando tags e atributos (que esto
definidos no arquivo jasperreports.dtd).
Depois criado um arquivo com a extenso .jrxml (o template de relatrio), onde
descrita toda a estrutura do relatrio: a
posio de textos, imagens e formas geomtricas; como recuperar os dados necessrios, como fazer clculos de totalizao,
e quais parmetros devem ser passados,
entre outras definies.
Em seguida preciso compilar o arquivo
.jrxml. O resultado da compilao um
arquivo com extenso .jasper, que nada
mais do que uma classe Java compilada,
sendo representado por um objeto da
classe JasperReport.
Aps a compilao, precisamos de uma
fonte de dados para produzir os dados a serem exibidos no relatrio. A fonte de dados
pode ser um datasource, ou uma conexo ao
banco de dados e uma query SQL. Caso
seja um datasource, a fonte de dados deve
ser disponibilizada para o relatrio na
forma de uma classe que implemente a interface JRDataSource. J existem algumas implementaes prontas como as de colees
e arrays de JavaBeans (JRBeanArrayDataSource
e JRBeanCollectionDataSource), ou a utilizando
ResultSet (JRResultSetDataSource).
Tendo o objeto JasperReport e a fonte de dados, alm de um objeto Map com alguns parmetros, podemos fazer o preenchimento
do relatrio. O resultado um objeto da
classe JasperPrint, que pode ser serializado
como um arquivo com a extenso .jrprint.
O objeto JasperPrint o relatrio final em
um formato proprietrio do JasperReports.
Ele pode ser visualizado diretamente
com um aplicativo chamado JasperViewer,

asso a Passo
iReport e JasperReports

Aproveite as facilidades do
iReport para criar relatrios
baseados no JasperReports
com todo o poder que o
Java oferece e de maneira
fcil e rpida

Ana Abrantes e Yara Senger


que vem com o JasperReports, ou ser
exportado para os formatos mencionados
anteriormente.
O quadro Glossrio do JasperReports,
na prxima pgina, apresenta conceitos
fundamentais do JasperReports usados
neste artigo.

Sobre o iReport
O iReport uma ferramenta visual que
usa o JasperReports internamente e facilita muito o trabalho do desenvolvedor na
criao de relatrios, dos mais simples aos
mais complexos. No iReport possvel editar visualmente um arquivo de template de
relatrio (.jrxml), e gerar o arquivo .jasper,
entre outras operaes.
Quando utilizamos uma conexo a um
banco de dados em vez de um datasource,
o iReport permite que o relatrio seja executado e exportado para diversos formatos. J quando utilizamos um datasource,
necessrio executar o relatrio dentro
de uma classe Java. Mais detalhes sobre o
funcionamento do iReport e sua operao
so apresentados nas sees a seguir.

especficas para gerao de determinados


formatos de arquivos. J se voc tambm
obtiver o JasperReports em separado, ter
adicionalmente uma documentao bsica
da API, os arquivos-fonte da biblioteca e
uma grande quantidade de projetos de
demonstrao.
Para iniciar o iReport, v at o diretrio
raiz da ferramenta e execute o arquivo
iReport.sh, caso esteja utilizando Linux;
ou em Windows, execute iReport.bat ou
iReport.exe. (Os instaladores nativos criam
um atalho para execuo rpida).
No caso de usar um dos arquivos de script
(.sh ou .bat), pode ser necessrio edit-lo e
acrescentar a linha set classpath=. no comeo do arquivo. Isso evita conflitos de
classes que esto no classpath e erros na
compilao do relatrio.

Sobre o projeto de exemplo


Como exemplo, vamos criar um projeto
baseado em quatro entidades principais:

pedidos, itens de pedido, clientes e produtos. Nosso objetivo gerar um relatrio


de pedidos com seus itens, sendo que um
pedido tem um cliente e cada item tem
um produto.
O projeto completo, com todas as classes
necessrias, os templates de relatrio .jrxml
e o script para criao do banco de dados,
est disponvel no site da Java Magazine.
Nas listagens apresentadas neste artigo,
alguns trechos dos arquivos so omitidos
para poupar espao.
Para o exemplo, precisamos de um banco
de dados que fornecer os dados para o
relatrio; usamos o MySQL. Chamamos a
base de dados de ecommerce e registramos um usurio e uma senha. O modelo
de dados mostrado na Figura2 (o script
completo para a criao da base est includo no arquivo de download).
Como mencionamos, a aplicao de
exemplo ser baseada na web. Vamos criar
um servlet que obtm a conexo com o

Instalao
Tanto o JasperReports como o iReport
esto disponveis em arquivos ZIP contendo classes, fontes, JARs etc. (veja no
final os links para download), e podem
ser instalados em qualquer plataforma
com suporte a Java. Basta descompactar
o arquivo na pasta desejada. H tambm
instaladores nativos do iReport, para
Windows e Mac OS X.
Para a criao de relatrios, pode-se baixar somente o iReport, pois este j vem com
o JAR da biblioteca JasperReports e todas
as outras que so necessrias para a compilao mais simples, alm das bibliotecas

Figura1. Processo de desenvolvimento de um relatrio com JasperReports

Edio 37 Java Magazine

53

Relatrios na Web Passo a Passo

Glossrio do JasperReports
Template de relatrio
Chamamos de template de relatrio o arquivo
.jrxml, que contm todas as informaes a respeito da estrutura e formatao do documento
que ser gerado, quando forem fornecidos
os dados para seu preenchimento. Ou seja,
o template define o layout do relatrio com
todos os seus elementos e configuraes.

Bandas
As bandas so as sees do relatrio, onde
so colocados os elementos grficos e textuais. Exemplos de bandas so title, pageHeader,
columnHeader, detail, pageFooter, columnFooter
e summary.
O comportamento varia para cada banda. A
banda detail, por exemplo, repetida uma vez
para cada registro de uma query ou objeto do
datasource, enquanto as bandas pageHeader
e pageFooter aparecem uma vez em cada
pgina.

Datasource
Um datasource um objeto de uma das classes que implementa a interface JRDataSource. A
fonte de dados, de um relatrio, pode ser um
datasource ou a combinao de uma conexo
com um banco de dados e uma query SQL.
Neste ltimo caso, o JasperReports converte
o conjunto para um datasource da classe
JRResultSetDataSource.
Um datasource se parece com uma tabela,
onde as linhas so os registros e as colunas
so os campos. Cada campo de um objeto do
datasource deve ser mapeado para um field
do relatrio (veja adiante), para que possa ser
usado em expresses do relatrio.

Expresses
As expresses de relatrio so expresses
Java que podem fazer referncia a campos,
variveis e parmetros do relatrio. Pelo fato de
usar a linguagem Java, uma expresso pode referenciar classes com o nome completo (nome
do pacote + nome da classe) ou classes que
esto no classpath. Para configurar o classpath
atravs do iReport, selecione o comando de
menu Options|Classpath.

Parmetros
Parmetros so referncias a objetos, e

54 Java Magazine Edio 37

so passados em tempo de execuo para


o relatrio, para utilizao em expresses e
at mesmo em queries SQL. Normalmente,
parmetros so usados para passar informaes que no fazem parte da fonte de dados
fornecida para o preenchimento do relatrio.
Por exemplo, pode-se passar o nome do autor
do relatrio, o endereo de um arquivo, etc.
J existem vrios parmetros pr-definidos,
como REPORT_CONNECTION, que usado para
fazer referncia ao objeto Connection passado
pela aplicao que executa o relatrio (caso
este utilize uma conexo, claro).
Os parmetros so passados para um relatrio
em tempo de execuo, na forma de um objeto
do tipo Map, que tem os nomes dos parmetros
como chave para acessar seus valores.
Para editar parmetros, execute o comando
Visualizar|Parmetros do Relatrio. Para usar um
parmetro em uma expresso, deve-se colocar
o nome do parmetro dentro das chaves em
$P{}. Por exemplo, para referenciar um parmetro com nome subReport use $P{subReport}

Variables
Variveis so objetos especiais criados para
uso em expresses. Podem simplificar o design
do relatrio, declarando uma nica vez uma
expresso que usada com muita freqncia,
ou ento para fazer clculos.
Existem algumas variveis pr-definidas.
Um exemplo PAGE_NUMBER, que contm o
nmero da pgina corrente do relatrio.
Para editar variveis, execute o comando
Visualizar|Variveis do Relatrio. Para usar uma
varivel em uma expresso, inclua o nome da
varivel dentro das chaves do smbolo $V{}.
Por exemplo, para uma varivel com nome
totalGeral seria usado $V{totalGeral}.

Fields
Os fields so a nica maneira de referenciar
dados do datasource dentro do template de
relatrio. Um field corresponde a um campo do
datasource ou da query SQL definida.
Para editar fields, execute o comando
Visualizar|Campos do Relatrio. Para usar um
field em uma expresso, coloque o nome do
field dentro das chaves do smbolo $F{}. Para
um field com nome descricao, por exemplo,
seria usado $F{descricao}.

banco de dados, carrega os arquivos de


relatrio compilados .jasper, passa parmetros e a fonte de dados exigidos pelo
relatrio, executa o relatrio exportando
para o formato PDF e finalmente manda
o resultado para a tela do navegador web1.
Utilizamos tambm um JSP muito simples,
index.jsp, que contm somente um link que,
ao ser clicado, executa o servlet.

Construindo o relatrio
principal de pedidos
Aps iniciar o iReport, abra um novo
relatrio selecionando Arquivo|Novo
documento, ou clicando no boto
da
barra de ferramentas. Na janela que aparece, defina o nome do relatrio como
RelatorioPedidos, altere a codificao
XML para ISO-8859-1 (na aba i18n) e clique
em OK. A tela do iReport dever ficar como
na Figura3. A Figura4 apresenta as barras
de ferramentas do iReport.
Agora vamos definir a conexo com o
banco de dados. Execute Data|Conexes/
Fonte de dados, clique em New, e faa
Name=ecommerce, Server Address=localhost
e Database=ecommerce. Depois clique em
Wizard para atualizar os valores dos campos. Digite o seu username e password
e clique em Test para verificar o funcionamento da conexo (veja a Figura5). Se
o teste for bem sucedido saia do dilogo
clicando em OK.
Agora vamos definir a query para obteno dos dados, e com ela obter os fields a
serem usados no layout do relatrio. Execute o comando Data|Consultas do Relatrio,
e na aba Report Query digite o comando
SQL a seguir (veja a Figura6):
SELECT p.data, p.numero, c.nome as nomeCliente
FROM pedidos p
JOIN clientes c ON p.id_cliente = c.id
ORDER BY p.numero

Ao se clicar em OK, a query vai retornar


os campos data, nmero e nome do cliente
de todos os registros da tabela de pedidos,
ordenados pelo nmero do pedido; note
1
Em

projetos reais usaramos uma arquitetura mais


complexa, com classes especficas para cada funo. Aqui
colocamos tudo numa classe s para simplificar o exemplo, e focar melhor no iReport e na API do JasperReports.

que para conseguir o nome do cliente foi


feito um join com a tabela de clientes.
Ao digitar a query, os fields sero declarados
automaticamente, ficando disponveis para uso
em todo o relatrio. Cada campo retornado corresponde a um field do relatrio.

Vamos usar apenas as bandas pageHeader,


detail e pageFooter. Devemos ento eliminar
todas as outras, executado o comando
Visualizar|Bandas do Relatrio, colocando
zero no campo Band height de cada uma
e clicando em Apply. Uma opo mais
direta de remover uma banda arrastar
verticalmente a linha abaixo dela at que
a banda desaparea. Veja o resultado final
na Figura7.
Antes de comear a inserir elementos no
relatrio vamos definir alguns estilos de
formatao, que sero usados nos elementos de texto. Execute Formatar|Styles e defina os seguintes estilos (clicando em New):
Normal com todos os valores default
mas tamanho de fonte 10; Destaque com
Parent Style=Normal e fonte em Bold; Titulo com Parent Style=Normal, fonte Bold
e tamanho de fonte 18 (veja a Figura8). Ao
definir os estilos, se o formato de sada
for PDF (que o nosso caso), no esquea
de definir a fonte correspondente no item
PDF font name da definio do estilo
(veja a Figura9). Esta a fonte que ser
usada na gerao do arquivo PDF.

dades, tais como: top e left para a posio no


eixo vertical e horizontal em pixels, width
e height para largura e altura (tambm em
pixels); mode para indicar se o elemento
transparente ou opaco, entre outras.
Voc pode alterar essas propriedades
diretamente na rea Propriedades do
elemento, localizado direita da tela
principal do iReport, ou clicar no elemen-

to com o boto direito e escolher a opo


Propriedades. As propriedades comuns
aparecem na aba Common; veja um exemplo na Figura11.
Ao criar os elementos nos passos seguintes, ser necessrio fazer alguns ajustes
em propriedades comuns como top, left,
width e height, para coloc-los nas posies
indicadas nas figuras.

Figura2. Modelo de dados do projeto de exemplo

Novos parmetros
Precisamos definir dois parmetros
para este relatrio. Execute o comando
Visualizar|Parmetros do Relatrio e clique
em New. Fornea o nome pageRoot e o tipo
java.lang.String e clique em OK. Crie mais um
parmetro com o nome subReport e tipo
net.sf.jasperreports.engine.JasperReport (veja a
Figura10). Veja mais sobre parmetros no
quadro Glossrio do JasperReports.

Propriedades comuns de
elementos de relatrios
Todos os elementos visveis que colocamos
em uma banda do relatrio, como textos,
imagens, figuras geomtricas, linhas e subrelatrios, compartilham algumas proprie-

Figura3. Tela principal do iReport ao criar um novo relatrio


Edio 37 Java Magazine

55

Relatrios na Web Passo a Passo

mude sua propriedade Static Text para


Relatrio de Pedidos e Style para Titulo. Na banda detail insira outros trs
static texts, com os textos Nmero,
Data do Pedido e Cliente, respectivamente. Veja a posio de cada um na
Figura13.

Elemento text field


O elemento text field, ou campo de texto, o que pode ter, alm de texto fixo,
fields, variveis, parmetros e outros
valores dinmicos, definidos por expresses. Num text field, a expresso de
texto pode ter um retorno do tipo String,
Date, Time, TimeStamp, BigDecimal ou alguma
classe wrapper (Integer, Double etc.), e deve
ser definida na propriedade Textfield
Expression class.
Figura4. cones das barras de ferramentas do iReport

Elemento line
O elemento line, permite desenhar
linhas no relatrio. Adicione duas
linhas banda pageHeader e uma
banda pageFooter (clique em
e depois arraste na banda para
definir o tamanho e a posio do
elemento). Veja a posio de cada
linha na Figura12.

Elemento static text

Figura5. Configurao da conexo ao banco de dados

Um elemento static text usado


para incluir textos fixos no relatrio. Adicione um static text
banda pageHeader
(c l ique e m
e
depois arraste na
ba nda para def inir o tamanho do
elemento). Depois

Figura6. Query SQL para obteno dos pedidos (veja na parte de baixo os fields gerados)

56 Java Magazine Edio 37

No iReport, usado o smbolo $F{} para fazer


referncia a um field, $V{} para varivel e $P{}
para parmetro. Para ver todos os fields, variveis
e parmetros definidos no relatrio, execute o
comando Visualizar|Campos do Relatrio. Na tela
mostrada voc encontrar uma aba para fields,
uma para variveis e outra para parmetros.

Vamos colocar trs text fields na banda detail, conforme a Figura14 (clique em
e depois arraste na banda). Defina suas propriedades Textfield
Expression para $F{numero}, $F{data} e
$F{nomeCliente}, e Textfield Expression
Class para java.lang.Integer, java.util.Date e
java.lang.String, respectivamente.
Fique atento para que o retorno da expresso
colocada em Expression seja do tipo definido
em Expression class, pois freqente o caso de
ClassCastException na compilao por causa
disso.

Figura7. Template de relatrio RelatorioPedidos com as bandas no-usadas removidas

nir a localizao do arquivo contendo a


imagem. Esta expresso pode ser do tipo
java.lang.String, java.io.File, java.io.InputStream,
entre outros.
Adicione uma imagem (usando o cone
) na banda pageFooter conforme a
Figura16, e defina suas propriedades
como na Figura17. Repare que o endereo da imagem do tipo String e que est
sendo usado o parmetro pageRoot. Este
parmetro ser passado pela aplicao que
executar o relatrio.

Elemento subreport

Figura8. Definio do estilo Titulo, e os trs estilos criados

Figura9. Configurao da fonte de um estilo


Coloque tambm dois text fields na
banda pageFooter (tambm mostrados na
Figura14) para a numerao da pgina. Estes campos vo usar a varivel pr-definida
PAGE-NUMBER; veja a configurao necessria
na Figura15. Note que o primeiro text field
usa Evaluation time = Now para mostrar o
nmero da pgina corrente, e o segundo
usa Evaluation Time = Report para mostrar o
ltimo nmero de pgina ou a quantidade
total de pginas do relatrio. Para mais detalhes sobre variveis e fields veja o quadro
Glossrio do JasperReports.

Elemento image
Um elemento image no JasperReports/
iReport pode conter imagens de vrios
tipos. Uma expresso usada para defi-

Tambm adicione em Subreport Parameters


um novo parmetro, numeroPedido, com o
valor $F{numero}. Este parmetro ser
passado para o sub-relatrio pelo relatrio principal (veja a segunda parte da
Figura19).

Construindo o sub-relatrio
de itens de pedido
Crie um novo relatrio (Arquivo|Novo
Documento) e mude seu nome para RelatorioItens. Ajuste as dimenses para
500 pixels de largura e 40 pixels de altura;
mude todas as margens para zero na aba

Para incluir os itens do pedido, vamos


usar um elemento subreport (sub-relatrio), que faz a ligao com outro relatrio.
Ou seja, vamos ter um relatrio dentro
de outro.
Um elemento sub-relatrio tambm
um relatrio, portanto deve ser representado por um arquivo .jasper. Alm disso,
deve ter uma conexo ou datasource e
pode ter parmetros.
Para colocar o sub-relatrio dentro do
relatrio principal de pedidos, clique em
e depois arraste na banda detail. Ser
Figura10. Configurao do parmetro subReport
exibido um wizard solicitando a criao
de um novo relatrio. Com vamos fazer
as configuraes diretas fora do wizard,
simplesmente clique em Cancel.
Ajuste a largura do sub-relatrio para
500 e o posicione conforme mostrado na
Figura18. Nas propriedades do elemento (clique com o boto direito e escolha
Properties); defina a conexo indo na aba
Subreport e selecionando Use connection
expression no combobox. Isso faz com que
o sub-relatrio utilize a mesma conexo do
relatrio principal (veja a Figura19).
Na aba Subreport(Other), defina o arquivo .jasper do sub-relatrio selecionando o
Figura11. Propriedades comuns dos elementos do relatrio
tipo net.sf.jasperreports.engine.JasperReport no
combobox, e em Subreport Expression adicione
$P{subReport}. Assim
indicamos que ser passado um objeto do tipo
selecionado contendo
o arquivo .jasper como
um parmetro para o
relatrio principal.
Figura12. Template de relatrio RelatorioPedidos com as linhas horizontais includas
Edio 37 Java Magazine

57

Relatrios na Web Passo a Passo

Page Margin, altere a codificao XML para


ISO-8859-1 (na aba i18n) e clique em OK.
Depois elimine todas as bandas exceto
columnHeader e detail.
Para acessar as propriedades de um relatrio depois de criado, escolha o comando
Editar|Propriedades do relatrio.

Figura13. Template de relatrio RelatorioPedidos com os elementos static text

Precisamos definir o parmetro que


ser passado pelo relatrio principal.
Execute Visualizar|Parmetros do Relatrio
e clique em Novo. Mude o nome para
numeroPedido, o tipo para java.lang.Integer,
e o valor default para new Integer(0).
Precisamos ainda definir o SQL para a
query usando o parmetro numeroPedido
(veja a Figura20):
SELECT it.quantidade, pro.nome as nomeProduto, pro.preco
FROM pedidos_itens it
JOIN pedidos ped ON ped.numero = it.numero_pedido
JOIN produtos pro ON pro.id = it.id_produto
WHERE it.numero_pedido = $P{numeroPedido}

Figura14. Template de relatrio RelatorioPedidos com os text fields

Descrevendo a query: ela retorna os


campos quantidade e nome do produto
de todos os registros da tabela de itens
de pedidos que tiverem o nmero do
pedido igual ao parmetro passado. Para
isso foram feitos joins com as tabelas de
produtos e de pedidos.
Coloque quatro elementos static text na
banda columnHeader com o texto Produto,
Qtde., Preo e Valor. Coloque tambm quatro text fields na banda detail, todos
do tipo String, com exceo da quantidade
que deve ser Integer. Fornea os seguintes
valores para Textfield Expression:

Figura15. Propriedades dos dois text fields para a numerao de pginas

$F{nomeProduto}
$F{quantidade}
NumberFormat.getCurrencyInstance().format($F{preco})
NumberFormat.getCurrencyInstance().format(
$F{quantidade}.intValue()*$F{preco}.doubleValue()).

Veja o resultado final na Figura21.

Compilando o relatrio

Figura16. Template de relatrio RelatorioPedidos com o elemento image na banda pageFooter

58 Java Magazine Edio 37

Existem trs maneiras possveis de se


compilar um relatrio:
Pelo prprio iReport, o que muito fcil
de se fazer: basta clicar em
;
Executando uma task Ant colocada no
build.xml, o que possibilita compilar vrios
relatrios de uma s vez ;
Diretamente na aplicao Java usando a

No servlet so realizados os seguintes


passos:
1. Obtemos uma conexo com o banco de
dados MySql (o objeto da classe Connection),
passando a URL de acesso, o usurio
e a senha.
2. Carregamos os arquivos .jasper em objetos JasperReport usando o caminho real do
arquivo atravs do contexto da aplicao.
Isso porque alm de estarmos criando

uma aplicao web onde a localizao dos


arquivos feita dessa forma, no uma
boa prtica deixar o caminho fixo, pois ele
vai variar com o local em que a aplicao
for instalada.
3. Depois, criamos um Map onde so
colocados os dois parmetros do relatrio. Estes parmetros so: subReport
com um objeto JasperReport, contendo o
sub-relatrio carregado; e pageRoot que

Figura17. Propriedades de um elemento image


API do JasperReports. Esta a opo menos
prtica e menos usada, porque normalmente
compilamos o relatrio somente quando ele
modificado em ambiente de desenvolvimento; na aplicao que utiliza o relatrio
basta fornecer o arquivo compilado e os
dados para execuo.
Portanto, a recomendao compilar
pelo iReport ou usando um script do Ant
(Listagem 1), visto que so as opes
mais indicadas para uso em ambiente de
desenvolvimento.
No nosso projeto de exemplo vamos usar
um script do Ant, que deve estar no diretrio raiz do projeto. O buildfile contm os
seguintes targets:
compile para compilar os relatrios;
java para compilar as classes Java; aqui
temos s uma que o servlet;
war para gerar um arquivo empacotando todos os arquivos: relatrios, classes
Java, imagens e JARs.

Figura18. Resultado final do template de relatrio RelatorioPedidos, j incluindo o sub-relatrio

Figura19. Propriedades do sub-relatrio

Ento, para compilar os relatrios, abra


uma janela de prompt de comando no
Windows ou terminal no Linux, v at o
diretrio do projeto e digite ant compile.

Executando o relatrio
Agora que j temos os relatrios prontos
e compilados, s precisamos desenvolver
o servlet para executar o relatrio. Este
servlet vai precisar dos arquivos .jasper,
dos parmetros que devero estar em um
Map e da conexo com o banco de dados.
Veja na Listagem 2 o cdigo completo do
servlet GeraRelatorioPedidos. O JSP que dispara a gerao mostrado na Listagem 3.

Figura20. Consulta SQL para obteno dos itens do pedido (e fields gerados)
Edio 37 Java Magazine

59

Relatrios na Web Passo a Passo

Figura21. Template do segundo relatrio, RelatorioItens

Listagem 1. build.xml, para compilar o relatrio, as classes do projeto e gerar um war


<project name=ecommerce default=war basedir=.>

<description>Exemplo de relatrio para web.</description>

<property name=classes.dir value=web/WEB-INF/classes />

<property name=reports.dir value=web/WEB-INF/reports />

<property name=lib.dir
value=web/WEB-INF/lib />

<property name=jrxml.dir
value=reports />

<property name=src.dir
value=src />

<path id=classpath>

<pathelement location=${classes.dir} />

<fileset dir=${lib.dir}>

<include name=**/*.jar />

</fileset>

</path>

public class GeraRelatorioPedidos extends HttpServlet {


public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
// obtm a conexo com o banco de dados
Connection conn = null;
try {
Class.forName(com.mysql.jdbc.Driver);
conn = DriverManager.getConnection(
jdbc:mysql://localhost:3306/ecommerce,
user,
// mude para o nome do usurio do seu bd
password); // mude para a senha deste usurio
} catch (Exception e) {...}
// gera o relatrio
ServletContext context = getServletContext();
byte[] bytes = null;
try {
// carrega os arquivos jasper
JasperReport relatorioJasper = (
JasperReport)JRLoader.loadObject(
context.getRealPath(
/WEB-INF/reports/RelatorioPedidos.jasper));
JasperReport subrelatorioJasper = (
JasperReport)JRLoader.loadObject(
context.getRealPath(
/WEB-INF/reports/RelatorioItens.jasper));
// parmetros, se houver
Map parametros = new HashMap();
parametros.put(pageRoot, context.getRealPath(/));
parametros.put(subReport, subrelatorioJasper);

<target name=javac
description=Compila os arquivos fonte em Java.>

<mkdir dir=${classes.dir} />

<javac srcdir=
${src.dir} destdir=${classes.dir} debug=true

optimize=false deprecation=false>

<classpath refid=classpath />

</javac>

</target>

<target name=compile

description=Compila o template e gera o arq. jasper.>

<mkdir dir=${reports.dir} />

<taskdef name=jrc classname=
net.sf.jasperreports.ant.JRAntCompileTask>

<classpath refid=classpath />

</taskdef>

<jrc destdir=${reports.dir} srcdir=${jrxml.dir}>

<classpath refid=classpath />

</jrc>

</target>
<target name=war depends=javac,compile description=
Gera o arquivo war da aplicao.>

<war warfile=ecommerce.war webxml=
web/WEB-INF/web.xml>

<fileset dir=web includes=**/*.jsp />

<fileset dir=web includes=**/*.png />

<fileset dir=web includes=**/*.jasper />

<classes dir=${classes.dir}>

<include name=**/*.class />

</classes>

<lib dir=${lib.dir}>

<include name=*.jar />

<exclude name=j2ee.jar/>

</lib>

</war>

</target>
</project>

// direciona a sada do relatrio para um stream


bytes = JasperRunManager.runReportToPdf(
relatorioJasper,parametros,conn);
} catch (JRException e) {...}

Listagem 2. GeraRelatorioPedidos, servlet que executa o relatrio


package br.com.globalcode.servlet;
import java.io.IOException;
import java.sql.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.util.JRLoader;

60 Java Magazine Edio 37

if (bytes != null && bytes.length > 0) {


// envia o relatrio em formato PDF para o browser
response.setContentType(application/pdf);
response.setContentLength(bytes.length);
ServletOutputStream ouputStream =
response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
}

Listagem 3. index.jsp
<%@page contentType=text/html%>
<%@page pageEncoding=UTF-8%>
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
http://www.w3.org/TR/html4/loose.dtd>
<html>
<head>
<meta http-equiv=Content-Type content=
text/html; charset=UTF-8>
<title>Relat&oacute;rio de Pedidos</title>
</head>
<body>
<h1>
<a href=pdf target=_blank>

Executar o relat&oacute;rio de pedidos em PDF
</a>
</h1>
</body>
</html>

um objeto String contendo o endereo


da raiz do contexto da aplicao. Este
ltimo parmetro ser usado para localizao da imagem usada no relatrio
principal.
4. Depois disso, executamos o relatrio
usando o mtodo runReportToPdf(), da classe
JasperRunManager, gerando a sada em PDF.
Passamos o objeto JasperReport, o Map de
parmetros e a Connection, e recebemos seu
retorno num array de bytes.
5. No final, jogamos este array de bytes

no OutputStream do objeto response. Dessa


maneira o relatrio ser visualizado diretamente dentro do navegador web, que
fica responsvel por executar o aplicativo
visualizador correspondente (ex.: o Acrobat Reader).
Para rodar o relatrio, precisamos
primeiro gerar o arquivo ecommerce.war
atravs da target war do Ant do build.xml.
V ao prompt de comando (ou terminal) e
digite ant war. Em seguida, copie o arquivo

ecommerce.war para a pasta webapps do


Tomcat.
Feito isso, inicie o Tomcat, abra o seu navegador web e digite a seguinte URL: http://
localhost:8080/ecommerce. Clique no link que
aparece na tela, e o relatrio ser gerado
conforme se pode ver na Figura22.

Concluses
Neste artigo apresentamos um tutorial
para a criao de um relatrio mestre-detalhe processado e exibido em ambiente
web. Poderamos fazer vrias melhorias
neste exemplo, como colocar totalizaes,
adicionar quebras por cliente, usar um
datasource gerado pela aplicao Java ao
invs de conexo direta com o banco de
dados, e muitas outras. Voltaremos a falar
sobre essas funcionalidades mais avanadas em artigos futuros.

jasperreports.sf.net
Site da biblioteca JasperReports, onde se
pode encontrar pgina para download do
software, documentao, fruns, etc.
ireport.sf.net
Site da ferramenta iReport, tambm com
download, novidades, etc.
lowagie.com/iText
Site da biblioteca de gerao de PDF usada pelo
JasperReports.
javamagazine.com.br/downloads/jm37/
jm-relatorios.zip

Figura 22. Execuo do relatrio completo no navegador web

Dicas de configurao

ara facilitar o desenvolvimento com o


iReport, recomendamos que sejam feitas
algumas configuraes, atravs do comando
Options|Option:
Na aba General:
"Language" = portugus (Brasil) (Para visualizar os itens de menu em portugus)
"Default language for expressions" = Java
(Para indicar que a linguagem de programao
utilizada no relatrio Java)
Na aba Compiler:
"compiler" = JasperRepor ts default

(para usar o compilador jdt-compiler que


vem junto com o iReport) ou Java Compiler
(para usar o compilador da sua JDK; s
copiar o arquivo tools.jar para a pasta lib
do iReport)
selecione use the reports directory for
compiles (para que os arquivos compilados
.jasper sejam gravados no mesmo diretrio que
os arquivo .jrxml)
Na aba External programs:
Fornea o caminho do editor de texto e dos
aplicativos de visualizao de cada formato de
arquivo que desejar.

Ana Abrantes
(ana.abrantes@globalcode.com.br)
desenvolvedora Java na
Globalcode, co-autora do curso
de JasperReports/iReport e possui
algumas certificaes em Java (SCJA, SCJP e SCWCD).
formada pela FATEC-SP e atua na rea de informtica
h mais de 15 anos.
Yara M. H. Senger
(yara@globalcode.com.br) formada
em Cincias da Computao na USP
em So Carlos, especialista em desenvolvimento web; possui as certificaes
SCJA, SCJP e SCWCD. Atualmente Instrutora e Diretora
Educacional da Globalcode, criadora e coordenadora
de diversos cursos das carreiras Academia do Java e
Academia do Web Developer.

Edio 37 Java Magazine

61

Introduo ao Bl
Aprenda Visualmente Programao

BlueJ um ambiente gratuito de


desenvolvimento de aplicaes
orientadas a objetos, utilizando a
linguagem de programao Java. Uma de
suas caractersticas principais a facilidade de aprendizagem de programao OO,
atravs de recursos visuais interativos. Por
exemplo, classes e relacionamentos podem
ser definidos visualmente, e possvel
verificar o comportamento dos objetos em
memria durante a execuo.
O BlueJ resultado de um projeto de
pesquisa voltado ao ensino de orientao a
objetos para iniciantes, desenvolvido pela
Deakin University (Austrlia) e University
of Kent (Inglaterra), com contribuies de
diversos outros grupos. tambm suportado pela Sun Microsystems. O projeto
NetBeans BlueJ Edition, que recentemente
liberou sua primeira verso beta, permite a
migrao suave de iniciantes utilizando do
BlueJ para um IDE profissional.

O ambiente BlueJ
O download do BlueJ pode ser feito em
bluej.org. H instaladores nativos para
Windows e Mac OS X, e um JAR executvel
que pode ser usado em qualquer sistema
operacional com suporte a Java. Para execuo necessrio ter um JDK instalado
(1.4.2 ou mais recente).

62 Java Magazine Edio 37

A Fig ura 1 apresenta a


interface principal do BlueJ. A
grande rea central o Class
Browser, e a parte inferior
chamada de ObjectBench.
O Class Browser possibilita
definir visualmente uma
estrutura de classes (usando
um subconjunto simplificado
da linguagem de modelagem
UML), e tambm instanciar objetos interativamente, que so mostrados no
ObjectBench. Os atributos
dos objetos podem ser examinados atravs do Object
Inspector (no mostrado na
figura), e mtodos podem
ser executados via cliques
do mouse.

Figura 1. Interface principal do BlueJ

Construindo um projeto no BlueJ


Para criar um projeto, deve-se acessar Project|New Project no menu
principal. Para exemplificar o processo de

ueJ

Conhea o ambiente que


cada vez mais usado para
ensinar a orientao a
objetos e desenvolvimento
Java em universidades

OO e Java

Marcelo Daibert e Marco Antnio Arajo


criao de um projeto utilizando o BlueJ,
ser apresentado um estudo de caso
que cria uma hierarquia de classes de
um sistema de RH hipottico. Existem
as classes Funcionario, FuncionarioHorista,
FuncionarioDiarista e FuncionarioMensalista. A
superclasse Funcionario abstrata, servindo
para a definio dos elementos comuns
s suas subclasses. Todos os funcionrios
esto lotados em um Departamento, que pode
ter vrios funcionrios.
Para adicionar uma nova classe ou
interface ao projeto, clique no boto New
Class. Ser apresentado um dilogo permitindo definir o nome e o tipo do elemento a
ser criado (Figura 2). Podem
ser criadas classes concretas
e abstratas e interfaces, alm de
elementos mais
complexos como
applets, testes unitrios do JUnit e
enums (esta ltima
opo est disponvel
apenas no JSE 5.0 ou
superior). Confirmada
a criao, a classe exibida de forma grfica no
Class Browser. Com

isso possvel criar as cinco classes do


exemplo, como mostrado na Figura 3.
possvel tambm adicionar uma nova classe
ao projeto atravs de uma classe j existente armazenada em um arquivo no disco,
atravs do comando Edit|Add Class
from File.

Para criar relacionamentos


de dependncia entre classes,
necessrio clicar no boto
com uma seta tracejada, depois
na classe de origem, e arrastar
at a classe destino. Deve-se
criar duas dependncias entre
Funcionario e Departamento, como
mostrado na Figura 4. Um
funcionrio deve estar lotado
em um departamento e um
departamento pode ter vrios
funcionrios.
Para a criao de relacionamentos de herana, o processo
semelhante. Deve-se pressionar
o segundo boto, selecionar a
classe filha e arrastar at a classe pai. A Figura 5 apresenta a
hierarquia a ser criada.
Para cada elemento do mode-

Figura 2. Criao de uma nova classe

lo, o BlueJ cria um arquivo de cdigo fonte


Java, e mantm sincronizado o cdigo com
o modelo de classes. Ou seja, modificando o
modelo, altera-se o cdigo, e vice-versa.
Com as classes criadas e exibidas no

Figura 3. Criao de classes

Figura 4. Criao de dependncias entre classes

Figura 5. O modelo de classes completo, com relacionamentos de herana


Edio 37 Java Magazine

63

Introduo ao BlueJ

Class Browser, possvel ento edit-las


para adicionar atributos e mtodos, dentre outros. Ao clicar com o boto direito
sobre uma classe e acionar Open Editor,
exibido um editor simples com o cdigo
da classe selecionada (veja a Figura 6).
A Listagem 1 apresenta o cdigo fonte
da classe abstrata Funcionario. H dois atributos: nome e departamento. O construtor da
classe deixa explcita a obrigatoriedade de o
funcionrio estar lotado em algum departamento, uma vez que departamento deve ser
fornecido como parmetro. Ainda no construtor, invocado o mtodo addFuncionario()
para associar o funcionrio que est sendo
instanciado ao seu departamento.
O mtodo abstrato calcularSalario ()
implementado nas classes filhas, permitindo ilustrar o uso de polimorfismo. H
tambm o mtodo toString(), que produz
uma representao textual do objeto. Os
demais mtodos so os gets e sets.
A Listagem 2 exibe a classe FuncionarioHorista,
que especializa Funcionario. Ela tem trs

64 Java Magazine Edio 37

atributos: numHorasDia (nmero de horas


Executando o projeto
trabalhadas por dia), numDiasMes (nmero
O primeiro passo para executar o prode dias trabalhados por ms) e valorHora
jeto a compilao. Isto pode ser feito
(valor de cada hora trabalhada). Note que
atravs do boto Compile, que compila
o construtor da classe invoca o construtor
todas as classes. Ou acionando a opo
da superclasse com super(). O mtodo
Compile disponvel no menu de contexto
calcularSalario() redefine o mtodo abstrato
(boto direito) de cada classe. (Toda vez
herdado de Funcionario.
que uma classe sofre uma alterao, ou se
A i mplementao das classes
ainda no tiver sido salva uma primeira
FuncionarioMensalista e FuncionarioHorista
vez, o BlueJ marca essa classe com linhas
muito semelhante, modificando-se apediagonais).
nas a frmula de clculo do
salrio.
Finalmente, a Listagem 3
mostra o cdigo fonte da classe Departamento, que contm
dois atributos: descricao e uma
lista (ArrayList) de objetos do
tipo Funcionario. Note que h
duas sobrecargas do construtor (verses com assinaturas e
implementaes diferentes).
Em ambos, instanciada a lista de funcionrios definida.
Por fim, o mtodo listAll() percorre seqencialmente a lista
de funcionrios, imprimindo
seus nomes e salrios.
Figura 6. Editor do BlueJ

Listagem 1. Classe abstrata Funcionario


public abstract class Funcionario{
protected String nome;
protected Departamento departamento;

public Funcionario(String nome, Departamento departamento){


this.nome = nome;
this.departamento = departamento;
departamento.addFuncionario(this);
}
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return nome;
}
public abstract float calcularSalario();
public String toString(){
return nome + - + calcularSalario();
}
public void setDepartamento(Departamento departamento){
this.departamento = departamento;
}
public String getDescricaoDepartamento(){
if (departamento != null) {
return departamento.getDescricao();
}
else {
return Funcionario no alocado a departamento;
}
}

Listagem 2. Classe FuncionarioHorista

Listagem 3. Classe Departamento

public class FuncionarioHorista extends Funcionario{


private int numHorasDia;
private int numDiasMes;
private int valorHora;

import java.util.ArrayList;
import java.util.Iterator;

public FuncionarioHorista(String nome, int numHorasDia,


int numDiasMes, int valorHora, Departamento departamento)
{
super(nome, departamento);
this.numHorasDia = numHorasDia;
this.numDiasMes = numDiasMes;
this.valorHora = valorHora;
}
public void setNumHorasDia(int numHorasDia) {
this.numHorasDia = numHorasDia;
}
public void setDiasMes(int numDiasMes){
this.numDiasMes = numDiasMes;
}
public void setValorHora(int valorHora){
this.valorHora = valorHora;
}
public float calcularSalario(){
return numHorasDia * numDiasMes * valorHora;
}
}

public class Departamento{


private String descricao;
private ArrayList funcionarios;

public Departamento(){
funcionarios = new ArrayList();
}
public Departamento(String descricao){
this.descricao = descricao;
funcionarios = new ArrayList();
}
public String getDescricao(){
return descricao;
}
public void setDescricao(String descricao){
this.descricao = descricao;
}
public void addFuncionario(Funcionario funcionario){
funcionarios.add(funcionario);
}
public void listAll (){
for (Iterator i = funcionarios.iterator(); i.hasNext();) {
System.out.println(i.next());
}
}

Edio 37 Java Magazine

65

Introduo ao BlueJ

Feita a compilao, possvel instanciar


objetos clicando numa classe com o boto
direito e selecionando um dos construtores
disponveis. ento exibido um dilogo com
os campos necessrios para a instanciao
do objeto, de acordo com o construtor selecionado. Por exemplo, criamos um objeto
Departamento, escolhendo o segundo construtor (veja a Figura 7). A Figura 8 exibe os
dados fornecidos a este construtor.
Deve ser criado tambm um objeto
FucionarioHorista. Como visto na Figura 9,
criamos um funcionrio com nome Paulo
Silva, que trabalhou quatro horas por dia
e doze dias por ms, e que recebe 23 reais
por hora trabalhada, alm de estar lotado
no departamento financeiro (criado anteriormente). Um detalhe importante a
necessidade de se colocar entre aspas os
valores para campos String.
Objetos criados so most rados no
ObjectBench, na parte inferior da tela.
Todos os mtodos do objeto (inclusive
os herdados) podem ser invocados clicando com o boto direito sobre eles,
como visto na Figura 10. A Figura 11
most ra o resultado da execuo do
mtodo calcularSalario() na instncia de
FuncionarioHorista recm-criada.
Como outro exemplo, pode-se acionar o
mtodo listAll() do objeto depFinanceiro a fim
de visualizar todos os funcionrios lotados naquele departamento. A Figura 12

apresenta o resultado exibido aps a invocao desse mtodo, no Terminal do


BlueJ. O mtodo listaAll() invoca o servio
toString() da classe Funcionario que, por
sua vez, executa o calcularSalario(). Este
invocado polimorficamente na classe
concreta que instanciou o objeto no caso
FuncionarioHorista.
Se o mtodo for executado outra vez, o resultado anterior no eliminado. Para limpar a janela a cada nova execuo,
no Terminal escolha a opo de menu Options|Clear
Screen at Method Call.

Figura 8. Fornecendo dados a


um construtor

Depurao e
documentao
O BlueJ fornece ainda
o recurso de depurao de cdigo fonte,
permitindo visualizar
passo a passo o cdigo
sendo executado. Esta
funcionalidade acessada ao adicionar um
breakpoint no editor de
cdigo. Para isso devese clicar na coluna
esquerda da linha em
que se deseja parar a
execuo, como exemplificado na Figura 13.

Figura 9. Instanciao de FuncionarioHorista

Figura 10. Executando um mtodo de um objeto no ObjectBench

Figura 11. Resultado de execuo de um


mtodo no ObjectBench

Figura 7. Executando um construtor da classe Departamento

66 Java Magazine Edio 37

Figura 13. Breakpoint no editor do BlueJ

Figura 12. Sada do mtodo listAll(),


quando invocado no objeto depFinanceiro

Assim que chegar ao breakpoint,


o BlueJ apre s e nt a
uma interface de
depurao. O
cdigo pode ser
executado linha
a linha, com inspe o de va r ivei s
e de objetos a partir do
breakpoint.
O BlueJ fornece ainda a opo de
gerar documentao JavaDoc automaticamente. Deve-se entrar no editor de cdigo
e, na combobox no canto direito de cima,
alterar a opo de Implementation para
Interface. Ser exibida a documentao
gerada, e criados os arquivos HTML em

disco em uma pasta chamada doc dentro


da pasta do projeto. Outra opo para
gerar e visualizar a documentao pelo
comando Tools|Project Documentation no
menu principal.

Concluses
Cada vez mais, o BlueJ vem sendo
utilizado como ferramenta didtica no
meio acadmico com o intuito de ensinar o paradigma orientado a objetos
e a linguagem de programao Java. A
ferramenta conta com uma excelente
documentao, alm de um ativo grupo
de usurios, prontos para tirar qualquer
dvida de usurios iniciantes. Em seu
site oficial, so disponibilizados links
para o cadastro em listas de discusso,
alm de tutoriais de utilizao da ferramenta e diversos artigos.

bluej.org
Site oficial do BlueJ
edu.netbeans.org/bluej
NetBeans IDE BlueJ Edition
Marco Antnio Pereira Arajo
(maraujo@granbery.edu.br)
professor do Curso de Bacharelado em Sistemas de Informao
da Faculdade Metodista Granbery,
Mestre em Engenharia de Sistemas e Computao pela
COPPE/UFRJ e Analista de Sistemas da Prefeitura de
Juiz de Fora.
Marcelo Santos Daibert
(mdaibert@npq.granbery.edu.br)
graduado em Sistemas de Informao
pela Faculdade Metodista Granbery
e Ps-Graduando em Cincia da
Computao pela Universidade Federal de Viosa.
Desenvolvedor de Sistemas h cinco anos.

Edio 37 Java Magazine

67

Testes sob Controle co


Isolando testes e controlando dependncias

rocessos geis como o Extreme


Programming vm popularizando
o conceito de automao de testes,
sobretudo atravs do uso de testes de
unidade. Mas estes testes, embora sejam
bastante teis para manter a boa sade de
um software, freqentemente so difceis
de serem criados.
Testes de unidade procuram testar classes isoladamente. Mas classes em um sistema normalmente alcanam seus objetivos
com a ajuda de outras classes; no funcionam isoladamente. Quando construmos
um teste de unidade, um dos principais
desafios exatamente isolar a classe sendo testada, para que nenhuma outra seja
envolvida no teste. Para compreender o
problema, vejamos um
exemplo.

68 Java Magazine Edio 37

Exemplo de dificuldade para


testar classes isoladamente
Imagine que estivssemos desenvolvendo um software para automatizar as
operaes de um restaurante. Entre as
muitas funcionalidades desse sistema,
uma essencial seria a gerao da conta.
Uma conta tpica tem muitas caractersticas, mas iremos nos preocupar apenas
com a mais importante: o total a ser pago.
Como exemplo, vamos implementar um
teste para validar se o total da conta est
sendo calculado corretamente.
Nossa classe Conta foi modelada de
acordo com o diagrama apresentado na
Figura1.

A impresso de uma conta, como pode


ser observado na Figura2, composta por
linhas, onde cada linha indica um item,
sua quantidade e o preo total (quantidade
de itens da linha multiplicada pelo preo
unitrio do item). Um item, por sua vez,
possui um nome e um preo unitrio. Na
parte inferior da impresso da conta
apresentado o valor total a ser pago, que
, como esperado, o somatrio do total de
cada linha.
Na Listagem1, voc encontrar o teste
criado, bem como a respectiva classe Conta,
cujo mtodo total() desejamos testar. Note
que as outras duas classes modeladas
precisaram ser usadas durante a criao

Conhea na prtica uma


tcnica que permite
deixar seus testes
mais auto-contidos e
gerenciveis, e use a
ferramenta open source
EasyMock

m Mock Objects
com objetos substitutos

Vincius Manhes Teles


Conta

Linha
item : Item
quantidade : int

adicionar() : void
total() : int

uma classe especial chamada LinhaMock, que


j recebe no construtor o valor total de uma
linha. A classe LinhaItem, por sua vez, passa a
implementar uma interface com um nico
mtodo: total(). Esse mtodo dessa interface
exatamente o que ser utilizado na classe
Conta, como podemos ver a seguir:

Item
nome : String
preco : int

total() : int

Figura1. Classes usadas para modelar uma conta.


Item
Item

Preo Unitrio

Quantidade

public void adiciona(Linha linha) {


total += linha.total();
}

Total

Lasanha

R$ 10.00

R$ 20.00

Refrigerante

R$1.00

R$ 2.00

Sorvete

R$ 4.00

R$ 4.00

Cafezinho

R$ 2.00

R$ 4.00

Total da Conta

Linha

R$ 30.00

Figura2. Exemplo de impresso de conta.


do teste: LinhaItem e Item. Isso tornou o
mtodo de teste maior e mais complexo. E
essa forma de confeccionar o teste faz com
que no seja verdadeiramente um teste de
unidade, pois a classe Conta no est sendo
testada isoladamente: se o teste deixar
de funcionar devido a uma falha no
cdigo, isso pode ter sido causado por
uma falha na classe Conta,
ou mesmo em LinhaItem
ou Item.
Isso ruim,
porque quando
fazemos testes
de unidade, procuramos isolar

cada unidade muito bem, de modo que


eventuais erros nos testes possam resultar
de falhas em um nico ponto (uma nica
unidade) do software. Erros identificados
dessa forma so mais fceis de serem
corrigidos do que os que podem ter sido
causados em inmeros pontos diferentes
da aplicao.

Entram os mock objects


Uma soluo eficaz o uso de mock
objects (objetos de mentira, ou objetos
substitutos), que permitem isolar as classes
de um sistema de forma bastante simples.
No nosso exemplo a classe Conta depende
diretamente da classe LinhaItem. Neste caso,
utilizar um mock object (tambm chamado
mock) significa que, quando estivermos
testando, ao invs de usar a classe LinhaItem
usaremos uma outra classe que finge ser
essa classe, porm mais simples e mais
fcil de ser usada durante os testes.
A Listagem2 mostra as modificaes
realizadas. Durante o teste passamos a usar

Usando uma interface Linha, podemos


evitar o uso da classe concreta LinhaItem
durante os testes e, em seu lugar, usar uma
outra classe que finge ser a classe LinhaItem.
Isso s possvel porque estamos usando
uma interface.
Um mock object, como o nosso exemplo
LinhaMock, um objeto que se comporta
como um substituto mais conveniente que
o objeto real. Ele resolve uma dependncia
importante para que um teste de unidade
possa ser executado mantendo o mximo
de isolamento. Alm disso, frequentemente mais fcil instanciar e configurar
um mock de forma apropriada para ser
utilizado em um teste. Em alguns casos,
o uso desse objeto tambm permite evitar
acessos a recursos mais difceis de configurar e controlar, como bancos de dados
ou recursos na rede. Isso permite que os
testes possam ser executados mais rapidamente e de forma mais previsvel.

Usando o EasyMock
O uso de LinhaMock facilitou nossos testes,
mas nem sempre to fcil escrever um
mock object. Por exemplo, suponha que
quisssemos testar um servlet que implementa um mecanismo simplificado de
login, recebendo dois parmetros: o login
e a senha de um usurio.

Edio 37 Java Magazine

69

Testes sob Controle com Mock Objects

Listagem 1. Teste da conta sem usar mock objects.


Classe ContaTeste

Classe Conta

import junit.framework.TestCase;

public class Conta {


private int total;

public class ContaTeste extends TestCase {


public void testTotalNota() {
Conta conta = new Conta();
Item lasanha = new Item();
lasanha.setNome(Lasanha a Bolognesa);
lasanha.setPreco(10);

Item refrigerante = new Item();


refrigerante.setNome(Guarana);
refrigerante.setPreco(1);

Classe LinhaItem
public class LinhaItem {
private Item item;
private int quantidade;

Item sorvete = new Item();


sorvete.setNome(Sorvete de Chocolate);
sorvete.setPreco(4);
Item cafezinho = new Item();
cafezinho.setNome(Cafe Expresso);
cafezinho.setPreco(2);
LinhaItem
LinhaItem
LinhaItem
LinhaItem

linhaLasanha = new Linha(lasanha, 2);


linhaRefrigerante = new Linha(refrigerante, 2);
linhaSorvete = new Linha(sorvete, 1);
linhaCafezinho = new Linha(cafezinho, 2);

conta.adiciona(linhaLasanha);
conta.adiciona(linhaRefrigerante);
conta.adiciona(linhaSorvete);
conta.adiciona(linhaCafezinho);

70 Java Magazine Edio 37

public LinhaItem(Item item, int quantidade) {


this.item = item;
this.quantidade = quantidade;
}
public int total() {
return item.getPreco() * quantidade;
}

Classe Item
public class Item {
private String nome;
private int preco;

assertEquals(30, conta.total());

Sabemos que, para obter parmetros em um servlet, usamos o mtodo


getParameter(nome_parametro) da interface
HttpServletRequest, como apresentado na
Listagem3. Podemos escrever um teste para
o mtodo loginValido(HttpServletRequest request)
criando um mock object que substitui
um objeto concreto que implementa a
interface HttpServletRequest. Entretanto,
esta uma interface que possui mais de
dez mtodos, e estamos interessados em
apenas um deles: getParameter(). Criar um
mock object para isso significaria criar um
classe com a implementao desejada de
getParameter() e uma implementao vazia
ou mnima de todos os demais mtodos.
Isso seria trabalhoso e poluiria a aplicao
com mais cdigo.
Uma soluo usar APIs para gerar e
manipular mock objects. Uma ferramenta
popular o EasyMock, que permite gerar
mock objects muito mais facilmente. Veja
na Listagem4 um exemplo de teste do login usando o EasyMock. Com ele, ao invs
de criarmos uma classe que implementa
uma interface especfica, deixamos que

public void adiciona(LinhaItem linhaItem) {


total += linhaItem.total();
}
public int total() {
return total;
}

//... Mtodos get/set

o EasyMock faa isso dinamicamente, o


que evita que seja preciso criar um novo
arquivo para nosso mock.
O Ea syMo c k pode ser obt ido em
easymock.org. Em seguida, basta extrair
do download a biblioteca easymock.jar e
coloc-la no classpath de seu projeto.
O primeiro passo ao usar o EasyMock
solicitar a criao de um mock para
uma interface em particular. No exemplo,
pedimos que fosse criado um mock para
a interface HttpServletRequest, conforme a
seguir:

expect(requestMock.getParameter(login)).
andReturn(patricia);
expect(requestMock.getParameter(senha)).
andReturn(floresta);

Esses passos fazem a preparao do mock


e indicam como ele deve se comportar
quando algum teste estiver em uso. Terminada a preparao, precisamos informar
ao mock que ele j no est mais sendo
preparado, ou seja, que hora da ao. Para
isso usamos o mtodo replay():

HttpServletRequest requestMock =
createMock(HttpServletRequest.class);

replay(requestMock);
LoginServlet loginServlet = new LoginServlet();
assertTrue(loginServlet.loginValido(requestMock));

No passo seguinte, criamos comportamentos especficos. O mock do objeto


request ir esperar que alguma outra classe
acesse o seu mtodo getParameter(), passando a string login como parmetro.
Quando isso ocorrer, o mock dever retornar a string patricia. Alm disso, programamos requestMock.getParameter(senha)
para retornar a string floresta, como
mostrado a seguir.

A partir desse ponto o mock pode ser


usado normalmente onde antes teria
sido necessrio utilizar um objeto real da
aplicao.
Os mtodos usados para programar o
mock ficam disponveis para a classe de
testes atravs de um import esttico dos
mtodos da classe EasyMock. Isso implica na necessidade de se usar o Java 5 ou
superior:

Edio 37 Java Magazine

71

Testes sob Controle com Mock Objects

Listagem 2. Teste da conta usando mock objects.

Listagem 3. Servlet implementando um mecanismo de login simplificado.

import junit.framework.TestCase;

import java.io.IOException;

public class ContaTeste extends TestCase {


public void testTotalNota() {
Conta conta = new Conta();
conta.adiciona(new LinhaMock(20));
conta.adiciona(new LinhaMock(2));
conta.adiciona(new LinhaMock(4));
conta.adiciona(new LinhaMock(4));
assertEquals(30, conta.total());
}
}

import
import
import
import
import

Nova interface Linha


public interface Linha {
int total();
}

Classe LinhaMock
public class LinhaMock implements Linha {
private int total;

public class LoginServlet extends HttpServlet {


protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
ServletOutputStream out = response.getOutputStream();
if (loginValido(request)) {
out.println(Bem-vindo);
} else {
out.println(Acesso Negado);
}
}
public boolean loginValido(HttpServletRequest request) {
if (patricia.equals(request.getParameter(login)) &&
floresta.equals(request.getParameter(senha))) {
return true;
}
return false;
}

public LinhaMock(int total) {


this.total = total;
}
public int total() {
return total;
}
}

72 Java Magazine Edio 37

javax.servlet.ServletException;
javax.servlet.ServletOutputStream;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

Listagem 4. Testando se login e senha so vlidos usando EasyMock.


import javax.servlet.http.HttpServletRequest;
import junit.framework.TestCase;
import static org.easymock.EasyMock.*;
public class LoginTeste extends TestCase {
public void testLoginComSucesso() {
HttpServletRequest requestMock = createMock(HttpServletRequest.class);
expect(requestMock.getParameter(login)).andReturn(patricia);
expect(requestMock.getParameter(senha)).andReturn(floresta);
replay(requestMock);

LoginServlet loginServlet = new LoginServlet();
assertTrue(loginServlet.loginValido(requestMock));
}
}

Listagem 5. Servlet modificado.


import
import
import
import
import
import

java.io.IOException;
javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {


protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String proximaPagina;
if (patricia.equals(request.getParameter(login)) &&
floresta.equals(request.getParameter(senha))) {
proximaPagina = bem-vindo;
} else {
proximaPagina = acessoNegado;
}
RequestDispatcher requestDispatcher =
request.getRequestDispatcher(proximaPagina + .jsp);
requestDispatcher.forward(request, response);
}
}

Listagem 6. Teste usando verify() do EasyMock.


import
import
import
import
import

javax.servlet.RequestDispatcher;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
static org.easymock.EasyMock.*;
junit.framework.TestCase;

public class LoginTeste extends TestCase {


public void testLoginComSucesso() throws Exception {
LoginServlet loginServlet = new LoginServlet();

HttpServletRequest requestMock = requestMock();
loginServlet.doGet(requestMock, responseMock());
verify(requestMock);
}
private HttpServletRequest requestMock() {
HttpServletRequest requestMock = createMock(HttpServletRequest.class);
expect(requestMock.getParameter(login)).andReturn(patricia);
expect(requestMock.getParameter(senha)).andReturn(floresta);
expect(requestMock.getRequestDispatcher(bem-vindo.jsp)).andReturn(
requestDispatcher());
replay(requestMock);
return requestMock;
}

import static org.easymock.EasyMock.*;

Se voc estiver usando uma verso mais


antiga do Java, possvel usar um release
do EasyMock anterior ao 2.0 (o 2.2 foi
utilizado neste artigo). Porm nesse caso
a forma de implementar os mocks seria
ligeiramente diferente. Veja um exemplo:
MockControl mockControl =
MockControl.createControl(HttpServletRequest.class);
HttpServletRequest requestMock =
(HttpServletRequest) mockControl.getMock();
mockControl.expectAndReturn(
requestMock.getParameter(login), patricia);
mockControl.expectAndReturn(
requestMock.getParameter(senha), floresta);
mockControl.replay();

Verificando expectativas
Suponha que o servlet tivesse sido programado de forma diferente, tal como mostrado na Listagem5. Nesse caso no seria
possvel fazer o teste utilizando um assert
do JUnit, pois na prtica o teste teria que
verificar qual pgina foi escolhida para dar
continuidade execuo: bemvindo.jsp ou
acessoNegado.jsp.
Usando o EasyMock, possvel criar um
teste que resolve esse problema, conforme
mostrado na Listagem6. Veja a parte mais
importante dessa listagem:
private HttpServletRequest requestMock() {
HttpServletRequest requestMock =
createMock(HttpServletRequest.class);
(...)
expect(requestMock.getRequestDispatcher(
bem-vindo.jsp)).andReturn(requestDispatcher());
replay(requestMock);

Caso o cdigo da aplicao esteja correto, o mock espera que seja executado
getRequestDispatcher(bemvindo.jsp). Caso
isso no ocorra, ser gerado um erro
pelo mtodo verify(), tal como foi usado
a seguir:

private RequestDispatcher requestDispatcher() {


RequestDispatcher dispatcherMock = createNiceMock(RequestDispatcher.class);
replay(dispatcherMock);
return dispatcherMock;
}

private HttpServletResponse responseMock() throws Exception {


HttpServletResponse responseMock = createMock(HttpServletResponse.class);
replay(responseMock);
return responseMock;
}

Edio 37 Java Magazine

73

Testes sob Controle com Mock Objects

public void testLoginComSucesso() throws Exception {


LoginServlet loginServlet = new LoginServlet();
(...)
loginServlet.doGet(requestMock, responseMock());
verify(requestMock);
}

Se introduzirmos um defeito no cdigo, fazendo com que o mesmo utilize


bemvindo no lugar de bem-vindo,
obtemos um erro como o seguinte:
java.lang.AssertionError:
Unexpected method call getRequestDispatcher(bemvindo.
jsp):
getRequestDispatcher(bem-vindo.jsp): expected: 1, actual: 0

O erro indica que o mock esperava que seu


mtodo getRequestDispatcher(bem-vindo.jsp)
fosse chamado uma vez, porm na realidade nunca foi chamado. O verify(), portanto,
pode ser usado sempre que desejamos estabelecer uma expectativa, ou seja, algum
tipo de chamada de mtodo que esperamos que seja realizada no mock.

Estabelecendo restries
O EasyMock tambm nos permite configurar um mock de modo a esperar que
apenas alguns de seus mtodos sejam
chamados. Assim, se algum outro mtodo for executado, acusado um erro. Por
exemplo, note que o mock criado para o
RequestDispatcher no trecho de cdigo a seguir no espera que seu mtodo forward()
seja chamado, o que no entanto acontece
durante a execuo do servlet:
private RequestDispatcher requestDispatcher() {
RequestDispatcher dispatcherMock =
createNiceMock(RequestDispatcher.class);
replay(dispatcherMock);
...

O teste s funciona porque criamos um


nice mock. Existem trs tipos de mock

74 Java Magazine Edio 37

objects que podem ser criados com o EasyMock. Um mock object comum criado
com o mtodo createMock(), e s permite
que o aplicativo chame mtodos do mock
object que foram programados no teste
para serem chamados. Uma chamada a
qualquer outro mtodo ir causar um
erro. Por exemplo, caso tivssemos usado
createMock() no cdigo anterior, obteramos
a seguinte mensagem de erro:
java.lang.AssertionError:
Unexpected method call forward(
EasyMock for interface javax.servlet.http.HttpServletRequest,
EasyMock for interface javax.servlet.http.
HttpServletResponse):

Essa mensagem indica que o mtodo


forward() no deveria ter sido chamado pela
aplicao, pois o mock no foi configurado
para chamadas ao mtodo.
Esse tipo de erro no gerado quando
usamos o segundo tipo de mock object suportado pelo EasyMock. Trata-se do nice
mock. um um mock object bonzinho
ou tolerante, que no acusa erros se voc
tentar executar mtodos para os quais o
objeto no foi programado a responder.
H um terceiro tipo de mock, que o
mais rigoroso de todos, o strict mock. Ele
parecido com o mock comum, criado
com createMock(). Um mock comum exige
que cada mtodo que deva ser executado
tenha sido preparado para isso na etapa de
preparao. Isso normalmente significa que
necessrio usar algum tipo de expect() para
esses mtodos enquanto o mock est sendo
configurado. J um strict mock no apenas
exige que os mtodos tenham sido configurados, mas tambm obriga que a chamada a
esses mtodos siga exatamente a ordem em

que foram configuradas. Cria-se um mock


object deste tipo com createStrictMock().

Concluses
O uso de mock objects fundamental
para se obter um nvel de isolamento desejvel ao criar testes de unidade. Sem essa
tcnica, usar testes de unidade pode se
tornar no apenas doloroso, mas tambm
invivel. O EasyMock uma ferramenta
que possibilita a criao de mock objects
dinamicamente, de maneira simples,
permitindo que o desenvolvedor tenha
total controle sobre o comportamento dos
mocks criados.
Test-driven development
Kent Beck (Addison-Wesley, 2003)
Mostra como criar e executar testes, de forma
detalhada, utilizando exemplos.
Pragmatic Unit Testing
Andrew Hunt, David Thomas
(The Pragmatic Programmers, 2003)
Ensina como automatizar testes e apresenta boas
prticas e padres de testes.

easymock.org
Site oficial do EasyMock.
javamagazine.com.br/downloads/jm37/
jm-easymock.zip
Vincius Manhes Teles
(vinicius@improveit.com.br,
improveit.com.br/vinicius.jsp)
Mestre em Informtica pela UFRJ,
Diretor da Improve It e autor do livro
Extreme Programming Aprenda como encantar
seus usurios desenvolvendo software com
agilidade e alta qualidade.

FORMATO
ERRADO

Se voc anda precisando de ajuda para manter a sua empresa na internet,


est na hora de conhecer as solues completas da LocaWeb.
A LocaWeb torna-se mais completa a cada dia que passa. Hoje ela oferece todos os tipos de servios e
ferramentas de internet, atendendo s diversas necessidades de seus clientes. E para estar ainda mais
prxima deles, a LocaWeb no pra de investir para ter um atendimento cada vez mais gil e eficiente. Mude
para a LocaWeb. A gente garante a sua tranqilidade. www.locaweb.com.br

Na contratao de um Plano de Hospedagem* voc tem: Blog Gratuito E-mails LocaMail com antivrus e anti-spam Completo painel de controle
Suporte s linguagens ASP**, .NET 2.0, JSP e Servlets***, PHP 5***, PERL, Python***, C,C++***, Ruby on Rails***, PERL/CGL, XML, WML/WAP
Diversos componentes para ASP e .NET Relatrios de visita em portugus Certificado seguro com SSL Banco de dados Access**, MySQL
5.0*** e PostgreSQL 8.1*** Podcast Backup dirio incluso Garantia de disponibilidade de 99,5%
E ainda pode contratar servios adicionais hospedagem como: comrcio eletrnico, banco de dados MS SQL Server, Oracle compartilhado, MySQL
para Windows, MySQL adicional para Linux, domnios e pacotes de e-mails adicionais e muito mais.
*Para mais detalhes e complementao de condies, consulte o modelo de contrato disponvel no site www.locaweb.com.br **em Windows ***em Linux

Vous aimerez peut-être aussi