Você está na página 1de 76

 Mustang • Relatórios • Dolphin • JBoss • JMS • EasyMock

A Revista da Comunidade Java Brasileira


 Ja va On e  0 6
 E s pec i iaa l
 2 0
m  p  le
 l e ta
 t a d o E ven to  to
 r t
 Co be r t u ra
 r a  Co
u o
 to
 t  s  O  p en Sou rc  rce
 No v o s  p ro
 r o d  ica
a P e r  p
 s p
 r s e c  i
 t  v
 v a Técn ic
Anúnc io  io s de um
 idade s do Ne tB  tBean s
 No v id
 rá
 
 ir á n o  Ja
 Ja  va
 v a 6  Ja va 7
e Ja
 O que  v
Edição 37 - Ano IV - R$ 9,90

Aprenda OO com BlueJ


Utilizando o ambiente gratuito focado no
 ensino de Java e orientação a objetos

Relatórios Passo a Passo Testes com Mock Objects


Como criar relatórios mestre-detalhe
Aprenda passo a passo a técnica que
na web com JasperReports e iReport
traz muito mais controle para seus testes

 JMS com JBoss


Conceitos da tecnologia Java Message
Service e utilização prática no JBoss

Eclipse
Os 10 Mais do Eclipse 3.2
Detalhes sobre as principais
novidades da nova versão, de
Criação de Plug-ins
Aprenda a estender o
Eclipse criando um plug-in
melhorias a novos projetos completo, passo a passo
Conteúdo
JAVAONE 2006
AVA
LEONARDO GALVÃO
Apresentando a décima edição do maior evento
para desenvolvedores
06

ANÚNCIOS E PARTICIPAÇÃO BRASILEIRA
FABIO VELLOSO

     6 Foco em produtividade, desenvolvimento corporativo


e novas tecnologias
xx
     0
     0
     2 UMA PERSPECTIVA TÉCNICA
YARA SENGER E VINICIUS SENGER
    e Tecnologias, APIs, especificações e números que
marcaram a conferência
xx
    n
     O
    a OPEN SOURCE EM FOCO
    v BRUNO SOUZA
Novidades em projetos open source e discussões xx
    a que movimentaram o JavaOne
     J

OS 10 M AIS DO NOVO ECLIPSE


OSVALDO  PINALI DOEDERLEIN
A nova versão do Eclipse traz centenas de pequenas e grandes
melhorias, do novo suporte a ferramentas atualizadas, a novos
20
projetos de amplo alcance

    a CRIAÇÃO DE PLUG-INS ECLIPSE


    p ANDRÉ DANTAS ROCHA
40
    a
Aprenda a criar plug-ins, dos conceitos fundamentais a um exemplo
completo e passo a passo, e tire mais proveito do Eclipse e do
     C Plug-in Development Environment

INTRODUÇÃO AO JMS
FERNANDO LOZANO
Conceitos e motivação para middlewares de mensagens, 30
e quando e como usar o JMS com o JBoss, com exemplos

SUN TECH DAYS 2006

     l
Sun
Sun LEONARDO GALVÃO
50
Tech Cobertura do evento nacional que prenuncia o JavaOne, com
n
u r

i
i
u n ch

.
ch y , r l i
r li , r u
nv v
l r

participação de importantes executivos e evangelistas da Sun


r n ri c C n r , u l

    a a s 200
, c n uc r n i r n
  cucu iv u n i crcr y . n r
l , v r c n C
u n, J n h n ch r , u cuul

     i
c r c r i n .
r ci i u v n u n r u
v n l i nv vl r v ri
í , n u nc r
rcir.
r ur r r l i

    c
n r n l r nic i l c, c c i
r i i l cinc l .
i u c h r n , u r n ic ru
vn li cn li un, i
i u v “ r c ri ni ”, ”,
r n v l l r in ic i r in c i r
r i , r r n r l

    e
rn cii .

RELATÓRIOS NA WEB PASSO A PASSO


    p ANA ABRANTES E YARA  SENGER
52
    s s  l ri  ic i  l
r
Aproveite as facilidades do iReport para criar relatórios baseados no
JasperReports, montando um relatório mestre-detalhe completo
rti i :J t S r zt s t i r-

     E
. ss s l  t r t i s i s r s t is
c  l  i  i :  is  t s J .
 t c  l  i s  f rr S r s r .
strr st c  ic s s r
r  l st
J z ni i 37

INTRODUÇÃO AO BLUEJ
MARCELO DAIBERT E MARCO ANTÔNIO ARAÚJO
Conheça o ambiente que é cada vez mais usado para ensinar a 62
orientação a objetos e desenvolvimento Java em universidades

    e TESTES SOB CONTROLE COM MOCK OBJECTS


    r VINÍCIUS MÀNHÃES  TELES
    o Usando na prática uma técnica que permite deixar seus testes mais 68
     C auto-contidos e gerenciáveis, com a ferramenta EasyMock 
Direção
Ano V • Edição 37 • 2006 • ISSN 1676-8361

Diretor Editorial Leonardo Galvão


Diretor de Marketing Gladstone Matos
Diretor Comercial Casseano Filho
Edição
Esp
Publisher e Editor-Chefe
Leonardo Galvão ( leonardo@javamagazine.com.br  )
Editores-Adjuntos
Fernando Lozano ( lozano@javamagazine.com.br )
Osvaldo Doederlein (osvaldo@javamagazine.com.br )
Colaboraram nesta edição
Ana Abrantes, André Rocha, Bruno Souza, Fabio Velloso,
Felipe Leme, Fernando Lozano, Leonardo Galvão,

C
Marcelo Daibert, Marco Antônio Araújo, Osvaldo Doederlein,
Vinícius Teles, Vinicius Senger, Yara Senger om mais uma cobertura do JavaOne, chegamos ao quinto ano da Java Ma-
gazine. Isso num momento em que a tecnologia Java está mostrando que
Arte pode ser madura e tradicional, ao mesmo tempo que se mantém ágil e em
Diretor de Arte Ta
Tarcísio
rcísio Bannwart ( phdesign@phdesign.com.br )
 phdesign@phdesign.com.br  constante renovação. Como você verá, os anúncios e lançamentos feitos no evento
Diagramação Jaime Peters Junior, Lais Pancote e Tersis Zonato confirmam
confir mam que a tecnologia
tec nologia continua num processo
process o rápido de evolução
evolução,, e que vem
Ilustrações Felipe Machado e Francisco Peixoto se consolidando em mercados nobres e atuais, como SOA, Web 2.0 e aplicações
distribuídas. Com quatro artigos por cinco autores, nossa cobertura vai além de
Produção um relato detalhado do que aconteceu, aproveitando as novidades apresentadas
Gerência de Marketing Kaline Dolabella para explicar conceitos e discutir as conseqüências práticas do que foi divulgado
Distribuição no evento.
Fernando Chinaglia Distribuidora S.A. Não só de novidades vive o desenvolvedor, e essa edição traz artigos sobre re-
Rua Teodoro da Silva, 907, Grajaú - RJ latórios, testes, JMS e Eclipse, o tema de capa. No primeiro artigo sobre o Eclipse,
CEP 20563-900, (21) 3879-7766 - (21) 2577-6362 você verá uma seleção com as dez principais
princ ipais novidades da versão 3.2, desde a nova
Atendimento ao leitor integração com o JUnit 4 até o importante projeto Callisto que está mudando as bases
A DevMedia possui uma Central de Atendimento on-line, onde você pode do Eclipse. Na segunda matéria de capa, você aprende a criar plug-ins para o Eclipse
tirar suas dúvidas sobre serviços, enviar críticas e sugestões e falar com um 3.x, através de uma conceituação sólida e u m exemplo real e completo.
de nossos atendentes. Através da nossa central também é possível alterar Relatórios constituem uma parte essencial
es sencial de muitos projetos corporativos. Nesta
dados cadastrais, consultar o status de assinaturas e conferir a data de envio
edição, um tutorial detalhado volta ao tema, revendo o JasperReports e o iReport
de suas revistas. Acesse www.devmedia.com.br/central, ou se preferir
entre em contato conosco através do telefone 21 2283-9012.
e criando um relatório de pedidos, desde a definição do modelo de dados até a
criação de uma aplicação web para iniciar a geração, não esquecendo, é claro, da
Edições anteriores criação do relatório em si.
Adquira as edições anteriores da revista Java Magazine ou de qualquer outra Temos também um artigo sobre a tecnologia Java Message Service (JMS), com
publicação do Grupo DevMedia de forma prática e segura, em exemplos práticos no servidor de aplicações JBoss 4. O JMS é usado freqüe ntemen-
www.devmedia.com.br/anteriores. te na criação de sistemas de grande porte. Se bem aplicado, pode reduzir muito
Publicidade o acoplamento e aumentar a responsividade e confiabilidade de suas aplicações
e.com.br , 21 2213-0940
 publicidade@javamagazine.com.br 
 publicidade@javamagazin corporativas.
Anúncios – Anunciando nas publicações e nos sites do Grupo DevMedia, Em uma aplicação OO, objetos geralmente se organ izam em um rede complexa de
você divulga sua marca ou produto para mais de 100 mil desenvolvedores dependências, e fazer testes de unidade que verifiquem isoladamente a funcionalfuncionali- i-
de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com dade de um objeto não é uma tarefa
ta refa simples. Uma solução elegante é o uso de mock
detalhes sobre preços e formatos de anúncios. objects – objetos que funcionam
func ionam como substitutos sobre os quais o desenvolvedor tem
Reprints Editoriais – Se foi publicado n a Java Magazine um artigo que controle total. Veja
Veja como usar essa técnica
téc nica em um artigo
art igo que apresenta o conceito e
possa alavancar as suas vendas, multiplique essa oportunidade! Solicite a mostra como usar a ferramenta EasyMock, que automatiza boa parte do processo.
reimpressão da matéria junto com a capa da edição em que saiu, e distribua
esse reprint personalizado entre seus clientes.
Por fim, temos um artigo
ar tigo sobre o ambiente de desenvolvimento BlueJ,
BlueJ, que é focado
no aprendizado de Java e orientação a objetos, e permite
perm ite a criação visual de classes
class es
Encarte de CDs – Faça como nossos maiores anunciantes. Encarte um CD
com uma amostra de seus produtos na Java Magazine e atinja um público e instanciação interativa de objetos. Uma ótima maneira de co-
segmentado e formador de opinião. meçar com Java e conhecer o essencial de técnicas OO.
Realização Apoio

Boa leitura!

Leonardo Galvão
Parceiros
aço do Leitor
Volume de informações ravilhas e possibilidades que a plataforma Java e que vai muito alem do habitual “Hello World”.
tem a oferecer. Estou implementando muitas das idéias deixadas
Sou assinante da Java Magazine há quatro meses
William de Jesus Rende no artigo. No meu ambiente de trabalho, por me-
e sou apaixonado pela revista. Realmente fico es-
dida de segurança, não podemos realizar SELECTs
 pantado
 panta do com
com o volume
volume de
de informações
informações.. Para
Parabéns! 
béns! 
diretamente nas tabelas. As tabelas são acessíveis
Thiago Alvarenga Lechuga Na unha somente via Stored Procedures, o que dificulta a
Gostaria de parabenizar Osvaldo Doederlein pela utilização de uma ferramenta de mapeamento ob-
Eclipse TPTP matéria “Persistência Turbinada”, na Edição 25. Um  jeto-relacion
 jeto-relacional
al como
como o Hiberna
Hibernate.
te.Tud
Tudoo aqui é feito
Gostaria de dar parabéns a todos vocês da Java artigo com excelente grau técnico fazendo uso de na unha, e o artigo de Osvaldo veio bem a calhar! 
Magazine. A revista está muito boa. Sou assinante  APIs que raramente utilizamos (ex.: Proxy Class),  André Sass Chaves
há pouco tempo, mas antes disso já acompanhava a
revista. A última edição sobre Logging e otimização

Gráficos em 3D
foi boa, mas indo por esse tópico vocês poderiam
fazer uma matéria sobre o Projeto Eclipse TPTP
(Test and Performance Tools Platform). Trabalho
com testes de software e há pouco conheci o TPTP.
TPTP.
Em alguma edição futura vocês publicarão um
artigo sobre o assunto? Até mais e continuem com
o ótimo trabalho! 
E  stou desenvolvendo um software cientifico
e gostaria de saber se existe alguma biblio-
bibli o-
teca para plotar gráficos em três dimensões.
da OpenGL – inclusive com suporte a diver-
sas extensões e recursos recentes, como a
nova linguagem de shading. Recentemente
Jaime Gabriel Valério Estou testando o JFreeChart mas pelo que vi foi padronizada pela JSR-231. A desvanta-
até agora, ele não é adequado. gem da JOGL é ser uma API de mais baixo
Jaime, obrigado pela apreciação. Planejamos Thiago Paulista nível, orientada a desenvolvedores de jogos
sim artigos sobre vários projetos da Fundação e outros que precisam de desempenho
Eclipse, já começando na próxima edição. O TPTP Se você quer criar gráficos comerciais no visual máximo.
está na nossa pauta. estilo do JFreeChart, ou seja, gráficos de Qualquer uma dessas APIs, se compa-
pizza, barras etc., só que com um aspecto radas ao JFreeChart, é bem trabalhosa de
3D (como no Excel ou OpenOffice.org Calc), usar, a não ser que você tenha um bom
Seduzido por Java realmente o JFreeChart deixa a desejar. Ele background em matemática (geometria
Gostaria de parabenizar toda a equipe Java suporta alguns
alg uns gráficos “mais ou menos 3D” analítica, trigonometria etc.). Entretanto, se
Magazine pela excelente qualidade do conteú- mas estes são muito limitados (não permi- você quiser gerar gráficos 3D sofisticados,
do dos artigos publicados periodicamente, bem tem criar séries em três eixos, ou configurar como os que pode fazer, por exemplo, no
como o material gráfico utilizado para este fim. uma perspectiva não-isométrica). Mathematica ou Maple, ou em ferramentas
 Após a leitura de uma de suas edições para fazer Por outro lado, qualquer gráfico 3D de alta a lta CAD/CAE, dificilmente vai achar bibliotecas
um trabalho acadêmico, fui “seduzido” pela ma- qualidade pode ser feito com a JOGL ( jogl. ( jogl. prontas que façam isso de forma direta e
dev.java.net ) ou a Java 3D ( j3d.or
( j3d.orgg). A Java 3D simplificada. Nestes casos, APIs como JOGL
é uma API mais antiga, é acelerada tanto por e Java 3D costumam ser a
OpenGL (multiplataforma) quanto Direct3D única opção.
(Windows), e é mais fácil de usar. Mas esta
API ficou um pouco abandonada por uns
Participe! anos, até ser transformada em 2004 num
projeto open source hospedado no java.net,
Envie sua dúvida, comentário, correção e ser usada num projeto popular, o Looking
ou sugestão, com nome completo, Glass (sun.com/software/looking_glass
(sun.com/software/looking_glass).).
cidade e estado, para: A JOGL é uma API mais nova, que em com-
paração com a Java
cartas@javamagazine.com.br 3D, é muito mais
leve e eficiente,
Cartas publicadas podem ser editadas
por motivos de clareza ou extensão. sendo apenas
um binding Java

Magazine 5
Edição 32 •  Java Magazine
 Java
 JavaOne
Apresentando a 10a edição

Palavras-chave
Se tivéssemos que indexar
para consulta o conteúdo do
 JavaO
 Jav aO ne 202006
06,, as se
segu
gu in
inte
tess
palavras-chave, que formam os
pilares desta edição do evento,
certamente teriam que ser
incluídas:
 JEE 5 – Lançado dias antes da

O mais popular Java-


One dos últimos
anos, com 15 mil
participantes, reafirmou a maturidade
matu ridade e a
força da tecnologia Java. Vários anúncios
conferência, a nova versão do
 JEE é uma das mais importante
importantess
na história do Java corporativo,
corporativo,
com seu foco na facilidade de
desenvolvimento. Mais de 250 palestras: na abertura, John Gage exibe o
importantes preencheram as apresenta- NetBeans – A versão 5.5 teve seu primei- livreto com a programação resumida do evento
ções principais, e a participação brasileira ro beta lançado
la nçado às vésperas do JavaOne, e
teve outra vez destaque. Nesta edição do traz o novo Enterprise Pack, com recursos Foi tema de general sessions e apresenta-
evento, não houve
houve um anúncio
anú ncio com o apelo abrangentes para criar aplicações JEE 5 e ções técnicas.
geral de um Tiger
Tiger,, como no JavaOne 2004, SOA. Foram também anunciados novos AJAX – Muito falada em todo o evento,
mas um conjunto de novidades e lança- módulos de extensão importantes. esta tecnologia é a base para programas
mentos mostrou que Java continua firme,
fir me, SOA – A arquitetura orientada a servi- populares como o GMail e o novo Google
mantendo sua posição de líder entre as ços é uma solução cada vez mais popular Spreadsheets.
tecnologias mais utilizadas no mundo. para a criação de aplicações a partir de Open Source – Vários softwares fo-
serviços independentes e desacoplados. ram liberados sob licença open source,
entre eles produtos da Sun há anos no
mercado. E a abertura da implementação
Terminologia do JavaOne de Java foi novamente assunto de dis-
cussões – ainda inconclusivas – durante
todo o evento.
C omo acontece em eventos de tradição, o
JavaOne define uma terminologi
terminologiaa própria,
usada em muitos artigos e blogs escritos sobre o
em PDF no site do evento.
BoF  – Palestras mais informais, os BoFs são
realizados à noite (os últimos começam depois
Web 2.0 – Esse termo, que cresce expo-
nencialmente em popularidade (já são 80
evento. Conheça alguns termos fundamentais: das 22:00) , e não é preciso cadastro antecipado.
antecipado. milhões de resultados no Google), repre-
General Session – São as principais apresenta- São mais específicos e têm público menos nu- senta uma mudança de paradigma na web
ções do JavaOne, geralmente realizadas nas pri- meroso, envolvendo no entanto um grau maior – com a interatividade
interat ividade de aplicações AJAX,
meiras horas de cada dia. Nas General Sessions de participação dos presentes. o foco em participação
part icipação com wikis e blogs,
são feitos grandes anúncios e realizados debates Duke’s Choice Awards  – A premiação dada a e a descentralização radical.
e demonstrações, em uma sala que comporta projetos e iniciativas de destaque que utilizam Glassfish  – O servidor JEE 5 que é
mais de 12 mil pessoas (e que se expand e a cada Java. Há prêmios (informalmente chamados implementação de referência da nova
edição do evento). de “dukies”) para várias áreas – de aplicações especificação Java Enterprise Edition tem
Technical Session  – As Technical Sessions corporativas, a pequen os dispositivos e projetos a comunidade mais ativa e numerosa do
são as palestras mais formais e mais nobres do sociais.  Java.net
 Java.net e vem
vem obtendo resultados de per-
JavaOne. Algumas chegam a ter milhares de Pavillion – O pavilhão de exposições tradi- formance que impressionam.
presentes. A partir deste ano, as sessões técnicas cional no JavaOne, com estandes (booths) de
exigiram o cadastro antecipado via web. Todos empresas, e demonstrações de equipamentos, Você verá mais sobre todas essas tecno-
os slides das apresentações estão disponíveis tecnologias e produtos
logias e anúncios relacionados nos artigos
que completam essa cobertura.
Magazine • Edição 37
6  Java Magazine
2006
 do maior evento para desenv
desenvolvedores
olvedores
LEONARDO GALVÃO

Futuro garantido  java.sun.com/javaone/sf 


 java.sun.com/javaone/sf 
As discussões neste Java- Site oficial do JavaOne
One tiveram um enfoque
mais técnico que nos últimos  java.sun.com/javaone/sf/sessions/ 
 java.sun.com/javaone/sf/sessions/ 
anos. As novas versões do  general 
 JSE est iver
iveram
am na top
topoo da Webcasts com o conteúdo completo dos General
agenda nas apresentações, Sessions
e nota-se uma colaboração  java.sun.com/javaone/sf/sessions/main_
 java.sun.com/javaone/sf/sessions/main_
maior da comunidade nos  session_pdfs.jsp
 session_pdfs.jsp
projetos Mustang e Dolphin Slides de todas as Technical
Technical Sessions
(que definirão as novas ver-
sões do Java). Benchmarks Comunidade: Jonathan
Jonathan Schwartz reafirma a importância da participação  java.sun.com/javaone/sf/tshirt_hurling.
 java.sun.com/javaone/sf/tshirt_hurling.jsp
jsp
recentes mostram um au- e destaca os mais de mil membros do JCP, entre eles o SouJava, o primeiro Mais sobre o campeonato de lançamento de
mento de performance e grupo de usuários Java a participar camisetas
estabilidade signif icativos
do futuro JSE 6.0, e há várias novidades Lançamento de camisetas
interessantes em sintaxe e APIs prometi-
das para o Dolphin, o JSE 7.
Considerando o número de apresenta-
ções voltadas ao futuro de Java, o grande
N este ano, o Brasil participou pela
primeira vez do tradicional concurso
de lançamento de camisetas organizado
com a camisa da seleção. Comemorando
muito durante os lançamentos, Yara Sen-
ger vestia a fantasia do jogador, e Vinicius,
interesse sobre o assunto e o volume de por James Gosling, o criador de Java e Bruno e Milton ficavam encarregados
inovações prometidas, além do esforço responsável pelas demonstrações mais de preparar o estilingue para o próximo
visível por abertura e colaboração das interessantes do JavaOne. disparo.
maiores empresas envolvidas com Java, A equipe brasileira, formada por Bruno Apesar de o mecanismo brasileiro ser o
podemos ficar certos de que a tecnologia Souza, Yara Senger, Vinicius Senger e Mil- que lançou as camisetas à maior distância,
tem um futuro garantido, com muitos ton Lapido, foi selecionada como uma das não agradou ao júri composto pelos apre-
anos de crescimento e renovação pela três finalistas. O mecanismo criado pela sentadores do programa “Myth Busters”
frente. equipe foi simples, mas eficaz, lançando (“Caçadores de Mitos”), Jamie Hyneman
as camisetas a distâncias superiores a e Adam Savage. Foi usado como critério
40 metros. Um estilingue atrás de uma mais tecnologia do que eficácia ou origi-
bandeira do Brasil era disparado com um nalidade, e a equipe brasileira terminou
chute pelo jogador “JNaldo” caracterizado em terceiro lugar.

Rede de conhecimentos: estandes de empresas, palestras, Equipe brasileira com os MythBusters: Adam Camisetas de alto alcance: JNaldo prepara-se para
brindes e coquetéis criam uma oportunidade para expandir Savage, Vinicius Senger, Yara Senger, Bruno Souza, James disparar o próximo lançamento
a rede de contatos e conhecer mais sobre o que está aconte- Gosling, Milton Lapido e Jamie Hyneman
cendo no universo Java.

Edição 37 •  Java Magazine


Magazine 7
 JavaOne
 JavaOne 2006

Anúncios e a Parti
Foco em produtividade e no desenvolvim

O  JavaOne 2006 estava comple


completa-
mente lotado, com filas para todos
os lados (e um novo sistema de
pré-inscrição que tornava as filas ainda
maiores). O primeiro general session foi
ta- 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
gias corporativas”.)
A Oracle foi a responsável
respons ável pelo general
session do segundo dia. Apresen-
tou suas soluções e estratégias
 baseadas em SOA, e reforçou
iniciado por John Gage, Cientista Chefe da NetBeans, e reiterou o apoio e a participa-
part icipa- a importância de novas
Sun, que abriu o JavaOne com a já tradicio-
t radicio- ção do JBoss no Java Community Process, tecnologias, como EJB 3
nal frase
f rase “Don’t be shy”,
shy”, dizendo que esta principalmente para a definição de um e JavaServer Faces, para
deveria ser a regra para a semana, e que modelo de programação mais simples para simplificar o desenvol
desenvol--
todos deviam fazer como os brasileiros,  JEE. Ressaltou também que o NetBeans é vimento e suportar no-
que representam esse espírito. uma plataforma com suporte completo a vas aplicações da Web
 Jonathan
 Jonat han Schwa
Schwartz,
rtz, CEO e President
Presidentee  JEE 5 e ao final Schwartz simbolicamente 2.0, com JSF e AJAX.
da Sun, falou sobre a importância
importânc ia do Java o presenteou com uma camiseta
camis eta contendo No terceiro dia, Erich
Community Process (órgão em que são a inscrição
insc rição “I Love NetBeans”. Gamma (o principal
discutidas e especificadas as tecnologias autor do clássico livro
do Java), convidando a todos a partici- Temas principais “Design Patterns”) e
par e ajudar na evolução da plataforma. Os general sessions que seguiram deram  Johh n Wi
 Jo Wiegegaa nd
nd,, a mb o s
Schwartz então recebeu vários convidados o tom dos principais assuntos abordados Distinguished Engineers
no palco. no evento: EJB 3, JEE 5, SOA, WEB 2.0 e da IBM Rational Softwa-
Ed Zander, Chairman e CEO da Motorola, AJAX.. Os representantes
AJAX representa ntes das empresas do re, apresentaram o general
falou sobre novos dispositivos com suporte Expert Group de JEE 5, 5, especificação fina-
fi na- session da IBM. Trataram
a Java e Linux, e sobre as oportunidades lizada recentemente, foram chamados ao detalhadamente do projeto
que oferecem aos desenvolvedores. Já há palco para uma homenagem, e destacaradestacaramm Eclipse e seu processo de desen-
mais de um bilhão de dispositivos supor- a preocupação com compatibilidade. volvimento,
volvimen to, e demonstraram um
tando a tecnologia. Zander recebeu ainda  Jeff Jacks
Jackson,
on, Vice-Pre
Vice-Presidente
sidente de Plata- plug-in que faz a integração com
o Duke’s Choice Awards
Awards (espécie
(espé cie de Oscar formas Java Corporativas e Produtos de o Bugzilla (ferramenta open source
do Java,
Java, que premia projetos importantes Desenvolvimento da Sun, falou sobre a para gerência de bugs e correções).
e aplicações inovadoras) na categoria Best compatibilidade
compatib ilidade,, uma característica que Apresentaram ainda a evolução do
continua sendo o principal desenvolvimento do produto através de
valor da plataforma Java. vários gráficos.
Listou também os princi-
pais objetivos
objet ivos do Java EE 5: Pavilhão
facilidade de desenvolvi- Os dias do evento são tomados por cente-
mento, suporte a Web 2.0, nas de palestras, mas vale a pena reser var
interoperabilidade e sim- algumas horas para visitar o Pavillion,
plificação da service-orien- com estandes de empresas
ted architecture (SOA). e produtos. O pavilhão,
 Jacc k so n de
 Ja dest
st ac ou qu e o além de apresentar
 JEE 5 está pronto para ser aplicações de vá-
utilizado, com anotações rios tipos, foi um
simplificando o modelo de show de tecnolo-
desenvolvimento, EJB 3.0 gia, mostran-
com POJOS e a nova Java do entre
 JBoss no NetBeans: Jonathan Schwartz presenteia Mark Fleury, de chapéu
Persistence API. (Veja mais outras
vermelho em homenagem à Red Hat, com uma camiseta do NetBeans no quadro “Novas tecnolo- coi-

Magazine • Edição 37
8  Java Magazine
cipação Brasileira
 ento corporativo
FABIO VELLOSO

sas jogos escritos


escr itos em Java,
Java, celulares competição de carrinhos no autorama mente). O veículo é composto por vários
e outros dispositivos JME. mostrado no pavilhão.
pavilhão. Alguns dos finalis-
fin alis- sensores controlados por aplicações JSE,
Entre os celulares, destaque para tas vieram de universidad
u niversidades
es alemãs, onde  JME (CLDC 1.1.1)
1) e a Java
Java Communications
o Jasper S20 da Savaje, empresa venceram concursos importantes. Ao final, API. Foi também exibido um vídeo com
que desenvolveu um sistema a empresa Perrone Robotics apresentou  James Gosling dentro do veículo.
operacional baseado
base ado em Java para um carro
ca rro conceito, apelidado “Tommy” e
dispositivos. Com este celular a controlado por um sistema em Java, que As novas versões do Java
Savaje conseguiu demonstrar na dirige o veículo
veícu lo dispens
dispensando
ando motorista As novas funcionalidades previstas nas
prática a aplicação do conceito. O (apesar de ser possível dirigi-lo normal- próximas versões do JSE foram apresenta-
celular é ainda uma versão para de-
senvolvedores,
senvol vedores, e talvez não
n ão tivesse
sucesso no mercado para usuários Novas tecnologias corporativas
comuns, mas incorpora muitas tecno-
logias, incluindo APIs recentes do JME,
como suporte a Bluetooth, mensagens, grá-
ficos em 2D e 3D, segurança com suporte a
S em dúvida, o principal anúncio do Java-
One 2006 foi o lançamento do JEE 5, que
teve sua especificação final disponibilizada
criada uma nova API com estas funcionalida-
des chamada Java Persistence API que pode
ser usada fora de containers JEE, por exem-
 JCE, JSSE, JAAS e a nova JSR-2JSR-209
09 (Advan-
(Advan-
uma semana antes do evento, tendo como plo em aplicações desktop com Swing.
ced Graphics and User Interface Optional
implementação de referência o servidor
Package for the J2ME), que especifica um
Glassfish. Outro assunto importante foi JavaServer
subconjunto de funcionalidades do Swing
Com este lançamento, o JCP torna reali- Faces, o framework web com modelos de
e Java 2D para pequenos dispositivos.
dade um desejo de empresas e desenvol- componentes visuais e de eventos que pos-
Também chamou atenção o estande com
vedores corporativos: proporcionar produ- sibilita criar aplicações web com maior inte-
aplicações Java Real Time. Além de robôs,
tividade e facilidade de desenvolvimento na ratividade. Além do JSF, tecnologias como
foi demonstrado um “autorama”, com os
plataforma JEE, que é consagrada por sua AJAX e RIA tiveram bastante destaque, por
carrinhos controlados pela tecnologia
escalabilidade e estabilidade. serem fundamentais para a chamada Web
 Java Real-T
Rea l-Time
ime System (Java RTS), onde
Os grandes avanços do JEE 5 estão no EJB 3 2.0. Destaque para o Google Web Toolkit,
passei um bom tempo me divertindo com
que tem como principais novidades: um framework para desenvolvimento de
as corridas.
• A utilização de anotações, simplificando aplicações AJAX com Java que foi lançado
o desenvolvimento e eliminando o neces- durante o evento.
Sessões finais
sidade de criação de interfaces em versões Outro assunto destacado foi SOA e Web
A general session do último
últi mo dia do evento
anteriores como Home, Remote e Local Services, com muitas palestras e referências
foi voltada a inovações, começando com
• Configuração por exceção, eliminando a em general sessions, porém sem grandes
uma apresentação do novo Flow Desig-
necessidade de o desenvolvedor escrever o novidades em relação à tecnologia. Dois
ner para MIDP 2.0 do NetBeans; e uma
deployment descriptor. Agora este descritor tópicos relacionados, relativamente novos
aplicação de RFID com Web Services, em
só precisa ser editado quando é necessária e que merecem atenção são:
que um celular mandava mensagens
uma configuração diferente do padrão • Java Business Integration (JBI),
(JBI) , que provê
SOAP através
através de uma
u ma aplica-
• Uso de injeção de dependências para um barramento para comunicação de aplica-
ção JME.
configurações de ambiente e JNDI (Java ções SOA padronizado através da JSR 208, e
As últimas apre-
Naming and Directory Interface)  já apresentado na Java Magazine.
sentações foram
• Simplificação do modelo de persistência • REST Web Services, uma arquitetura para
do Java Real-Time
de Entity Beans, com a utilização de classes Web Services, com conceitos da Web 2.0,
System (Java RTS)
Java comuns (POJOS) e possibilidade de usando protocolos stateless e operações
com aplicações
definir herança e polimorfismo. Foi também simples de cadastro em banco de dados.
de imagem e
vídeo e uma

Edição 37 •  Java Magazine


Magazine 9
 JavaOne
 JavaOne 2006 • Anúncios
Anúncios e a Participação
Participação Brasileira

detalhes sobre sobre as novas • Facilidade de desen-


funcionalidades podem ser volvimento para desktop, com me-
vistos no artigo de Yara e lhorias no binding, um mecanismo que
Vinicius Senger a seguir. faz a ligação entre dados da aplicação
Alguns dados apresentados e os componentes de interface gráfica,
sobre os testes de compatibili- automatizando o preenchimento dos
dade e funcionalidade
funciona lidade do JavaJava componentes e dos dados (JSR-295:
impressionam: Beanss Binding e JSR-296:
Bean JSR-296: Swing
• O Java 6 está sendo testado Application Framework).
em 24 sistemas operacionais, Além disso, durante o
em 84 configurações evento foram divulgados
• São executados 20.244 tes- números interessantes so-
tes funcionais
func ionais e 6.930 testes de  bre a plataforma Java:
Java:
unidade e de regressão. • O Mercado Java tem
Movido a Java: Tommy, veículo controlado por um sistema 100% Java, • Há 92.316 testes de com- um valor estimado de
vencedor de um Duke’s Choice Award patibilidade, para que uma 100 bilhões de dólares
 JVM
 JV M se
sejaja cer ti
tifi
ficad
cadaa com
comoo • Há no total 3.3 bi-
das na palestra “Mastering Mustang and  Java Compatible. lhões de dispositivos
Developing Dolphin”.
Dolphin”. No Mustang
Musta ng (Java 6) com suporte à tecnolo-
teremos mais suporte a XML e Web Ser- Para o Dolphin
Dolphin (JSE 7) os trabalhos
trabal hos estão gia.
vices, inclusive com um micro Web Server atualmente focados em: • Já somos 5 milhões
mi lhões de
na JVM, característica que a meu ver só • Suporte a linguagens de scripting (JSR- desenvolvedores Java.
servirá para que o download da JVM fique 292)
maior. Além disso, o JDK da Sun terá o • Uma nova forma de empacotamento, Referências ao Brasil e
 Java DB, um banco de dados totalmente versionamento e distribuição de pacotes a participação brasileira
escrito em Java baseado no Apache Derby, (JSR-277: Java Module System) para faci- Além da referência de John
integrado no pacote, porém este não faz litar o trabalho com JARs, localização e Gage aos brasileiros na aber-
parte da especificação e nem do JRE. Mais mudança de classpath tura do evento, fomos citados
várias vezes nos general ses-
sions. Jonathan Schwartz (o CEO
Palestras de brasileiros da Sun) disse que a comunidade
 Java nunca foi tão vibrante, falou do
V eja a seguir os BoFs e Sessions apresentados
por brasileiros na conferência: Aconteceram também várias palestras informais
no Java.net Community Corner 2006, um grande
crescimento do JCP, que atualmente
tem 1052 membros, mostrando um slide
• BOF-234  – Creating NetBeans Plug-ins for com alguns membros de peso como Sun,
estande localizado no Pavillion:
Integration With JavaServer Faces, Hibernate, Oracle, Apple, Philips, BEA, IBM – e entre
Spring, and EJB 3.0 Technology – Edgar A.
A . Silva e • Java Tools Community – Fabiane Nardon eles estava
estava o SouJava
SouJava.. Continuou
Continuou falan-
Alexandre Gomes. • Greenbox in Detail – Edgar Silva do sobre projetos do governo brasileiro
• BOF-2000  – Object-Based Reports for Java relacionados a open source, TV Digital e
Desktop Technology and the Java EE Platform • Java Champions Bruno Souza and Yakov Fain uso de padrões. Terminou dizendo que a
– Fernando Lozano. interview each other comunidade brasileira esta “in fire”
fire”..
• BOF-7831 – Device Management for Mobile • The Virtual Health Network at WHO – Milton  Jeff Jackson falou sobre o
Applications – Fabiano Cruz e Jens Paetzold Lapido crescimento da comu-
• BOF-2368 – Restructuring a Web Application,
• Rybena: Java cell phone for the deaf community nidade NetBeans,
– Daniel deOliveira que já tem mais de
Using Spring and Hibernate – Gustavo de Paula e
Devendra Tewari • 8 years of DFJUG: A vision – Daniel de Oliveira 200 committers, e
• TS-3881 – Full-Scale Java Platform Diagnostics for • The State of F/OSS Java VM's – Fernando Lo-
Production Environments – Flavio Bergamaschi. zano
• BOF-0518 – Multi JVM Control
Control Panel: A Mecha- • Packaging Java apps for Linux using JPackage
nism for Monitoring and Controlling Java Virtual – Fernando Lozano
Machines – Flavio Bergamaschi. • Fedora Core Linux Bundled Java Apps –
Fernando Lozano
• TS-4619 – How to Represent the Architecture
• Mouse Gestures Plugin for NetBeans – Paulo
of Your Enterprise Application Using UML 2.0 and
Silveira and Evandro Machado
More – Paulo Merson

Magazine • Edição 37
10  Java Magazine
exibiu um slide com os “Community últimos. Foram ao todo sete apresentações, participado da melhor edição do evento
Stars” do NetBeans, entre eles dois  já contando as realizadas por brasileiros para o nosso país e para a comunidade
 brasilei
 bras ileiros
ros:: Bru
Bruno
no Sou
Souza
za e Fláv
Flávia
ia radicados no exterior.  Java brasileira.
brasileira.
Coelho. Ao fundo, o slide mostrava Um destaque foi o Java.net Community Agora vamos nos preparar para submeter
um Duke jogando futebol vestindo Corner, um pequeno auditório montado palestras para o próximo ano, e aguardar o
uma bandeira do Brasil como no pavilhão, onde líderes de projetos e que nos reserva o JavaOne 2007 (que será
camiseta. comunidades puderam fazer pequenas realizado entre 8 a 11 de maio). Ou ainda
Ao final do session, mais uma palestras. Vários brasileiros marcaram este ano, no JavaPolis, o “JavaOne euro-
menção a brasileiros; Flavio presença. Veja o quadro “Palestras de peu”, cujo organizador, Stephan Janssen,
Bianchi, que iniciou o projeto  brasileiros” para uma lista completa. cobrou a participação dos brasileiros
de tradução do JavaDoc do JDK, Outro ponto importante na participação
teve seu nome exibido no slide  brasileira foi a presença de vários repre-
do JDK Community Stars. Esta sentantes de empresas como Petrobras,
tradução também foi citada na UOL e Globo.com, mostrando o interesse  java.sun.com/javaone
 java.sun.com/javaone
palestra “Mastering Mustang and e a utilização de Java nas grandes corpo- Site do JavaOne 2006
Developing Dolphin”, que destacou o rações brasileiras.  java.sun.com/javaone/sf/sessions/ 
 java.sun.com/javaone/sf/sessions/ 
projeto como primeira iniciativa para tra-  general 
duzir o JavaDoc (o projeto já conta com 150 Conclusões Vídeos e podcasts com os general sessions
voluntários). E no slide de participantes do O JavaOne 2006 teve como principais
www28.cplan.com/javaone06_cv_124_1/ 
Expert Group do JEE 5, estava outro nome assuntos JEE 5, SOA e Web 2.0, os quais
 sessions_catalog.jsp
 sessions_catalog.jsp
conhecido: Felipe Leme (colaborador da certamente estarão presentes no dia-a-dia
Download das palestras do evento
 Java Magazine).
Magazine). dos desenvolvedores e empresas. É impor-
Apesar de grande destaque nos general tante estarmos preparados para desenvol
dese nvol--  jnpodcasts.dev.java.net 
 jnpodcasts.dev.java.net 
sessions, tivemos menos palestras bra- ver aplicações com estas tecnologias. Para Podcasts do java.net Community Corner 2006
sileiras aprovadas neste ano do que nos nós brasileiros, ficou a sensação de termos  glassfish.dev.java.net/ 
 glassfish.dev.java.net/ 
Servidor JEE 5 open source – download e
documentação
NetBeans Day 2006 www.perronerobotics.com/tommy.htm
Site do carro conceito vencedor de um Duke’s

O JavaOne é o grande encontro da comu-


nidade Java mundial, com vários eventos
paralelos, reuniões do java.net e festas patro-
a ferramenta de design visual para BPEL que
facilita a criação de aplicações que fazem a
orquestração de Web Services. Essas e outras
Choice Award
 jcp.org/en/jsr/detail?id=220
 jcp.org/en/jsr/detail?id=220
JSR 220 – Enterprise JavaBeans 3.0
cinadas por empresas. O maior desses even- funcionalidades, como suporte a padrões de
tos foi a segunda edição do NetBeans Day, segurança de Web Services e uma ferramenta  jcp.org/en/jsr/detail?id=209 
 jcp.org/en/jsr/detail?id=209 
realizado no dia 15 de maio, um dia antes do de modelagem UML, estão disponíveis em JSR 209 – Advanced Graphics and User Interface
JavaOne, com a presença de mais de mil de- um pacote adicional chamado NetBeans Optional Package for the J2ME Platform
senvolvedores. As palestras e demonstrações Enterprise Pack.  jcp.org/en/jsr/detail?id=295
 jcp.org/en/jsr/detail?id=295
foram divididas em dois grandes temas: Durante o dia, houve ainda algumas apre- JSR 295 – Beans Binding
• Suporte a JEE 5 e SOA do NetBeans 5.5 sentações sobre a evolução no suporte
 jcp.org/en/jsr/detail?id=296
 jcp.org/en/jsr/detail?id=296
(atualmente
(atualmen te em beta). ao desenvolvimento de aplicações Swing,
JSR 296 – Swing Application Framework
• Aplicações desktop com Swing e suporte com o uso do editor visual de interfaces
a JME no NetBeans Matisse, além de palestras sobre plug-ins  jackpot.netbeans.org
 jackpot.netbeans.org
para desenvolvimento de aplicações para Jackpot, extensão
extensão do NetBeans para refactoring
Para JEE 5, o NetBeans pro- celulares baseadas em CDC/ JME, com de- inteligente
porciona mais produtividade, monstrações da integração do NetBeans
com uma série de wizards com a JSR-209 (Advanced Graphics and
para a criação de aplica- User Interface Optional Package for the
ções utilizando EJB 3 J2ME Platform). Fabio Luis Velloso
e a nova API padrão Outros anúncios importantes foram o de um (fabio@soujava.org.br  ) é Bacha-
rel em Ciência da Computação
de persistência em plug-in para integração com o Subversion, e
pela Universidade Federal de São
Java. O suporte a do Jackpot, um conjunto de extensões do Net-
Carlos (UFSCar), diretor e fundador
SOA e à criação Beans para refatoração de código que permite
do SouJava.Trabalha em projetos de desenvolvimento
de Web Services a definição de regras usando uma linguagem
utilizando diversas tecnologias da plataforma Java e
também conta simples, a Jackpot Rule Language . O Jackpot é professor de Arquitetura Orientada a Serviços e Web
com wizards. permite ainda a exportação e o compartilha- Services do curso
curs o Desenvolvimento de Software para
Destaque para mento de scripts de refatoração. Web da UFSCar.

Edição 37 •  Java Magazine


Magazine 11
 JavaO
 JavaOne
ne 2006
2006

Uma Perspectiva
Tecnologias, APIs, especificações e núme

T odos os anos, esperamos ver no


 JavaOne
 JavaOne grandes anúncios, mas boa
parte da comunidade já conhece e
acompanha as novidades mesmo antes
do evento. Isso porque, como sabemos, o
e requisições disponíveis através do site
 jcp.org. Por outro lado, o JavaOne
JavaOne confirma
confir ma
tendências, e é uma oportunidade de ver
os líderes de projetos e executivos de gran-
des empresas envolvidas
envolvidas com a tecnologia
 AJAX (Asynchronous JavaScript and XML)
Poucos meses atrás, a comunidade não
conseguia discernir exatamente o papel do
AJAX no cenário de desenvolvimento,
desenvolvimento, ou
mesmo o quanto de inovação existia nesta
processo de evolução da tecnologia Java  Javaa apresen
 Jav apresentarem
tarem as principais novida
novidades
des tecnologia. Hoje já fica mais fácil arriscar
acontece através do Java Community em especificações,
especif icações, APIs e produtos. dizer que, embora não haja nenhuma
Process (JCP), com muitas informações Como sempre, o JavaOne apresenta um grande novidade nos conceitos apresen-
publicamente discutidas em fó- grande tema técnico, que pode ser resu- tados com AJAX, a tecnologia realmente
runs e blogs, e decisões mido, na edição de 2006, em três palavras: veio para ficar.
AJAX, Web 2.0 e SOA. Essas tecnologias Houve um grande número de sessions
 já estavam presentes nos anos anteriores, com AJAX no título, e muitas outras que
mas com muito menos destaque. E os citavam suporte a essa tecnologia através
grandes temas dos anos anteriores de frameworks e componentes. A maioria
como Web Services, Java ME e novas estava lotada. Além disso, diversos estan-
versões do Java SE e Java EE, conti- des no pavilhão apresentaram soluções
nuaram presentes neste ano. para utilização de AJAX. Veja um pouco
mais sobre a tecnologia no quadro “O que
Principais destaques técnicos é AJAX?”.
Apresentamos aqui uma A grande estrela entre os exemplos
seleção dos principais assun- de AJAX foram os serviços oferecidos
tos abordados no JavaOne
JavaOne,, pelo Google, principalmente o Google
com enfoque técnico. Foram Maps, que pode ser utilizado por outras
tratados outros assuntos aplicações através de um Web Service.
importantes como Java ME, Foram mostrados exemplos onde o serviço
performance e tuning de Google Maps é utilizado para mostrar os
aplicações e JVMs, mas  bares onde é possível tomar cerveja perto
no JavaOne é preciso do local do evento, entre outras demons-
escolher uma “família” de trações mais sérias.
temas para acompanhar,
e apresentamos aqui Web 2.0
nossa perspectiva do O termo Web 2.0 refere-se à nova gera-
evento. ção de serviços disponíveis na web, que
possibilitam aplicações mais parecidas
com aplicações desktop, com a utilização
de Web Services, AJAX, e podendo incluir
outras ferramentas como Wikis e blogs.
O Web 2.0 tem como principais símbolos
aplicações como Google Maps e Flickr,
Flick r, en-
tre outras, e o assunto
as sunto esteve presente em
diversas technical sessions do evento.

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

Magazine • Edição 37
12  Java Magazine
Técnica
ros que marcaram a conf
conferência
erência
YARA SENGER E VINICIUS SENGER

o suporte que as IDEs Java começam a ofe- recursos mais importantes. A seguir Mustang
recer para BPEL (Business Process Execu- apresentamos as principais novidades O Early Draft da especificação do JSE 6
tion Language). Esta linguagem, baseada planejadas para cada uma dessas
dessa s versões, foi publicado em 21 de dezembro de 2005,
em XML, é utilizada para orquestração assim como alguns fatos anunciados sobre através da JSR-270, e o lançamento
lança mento do rele-
de serviços, permitindo que estes sejam a versão atual. ase final está previsto para outubro deste
incorporados em workflows e processos ano. Algumas das novidades e JSRs que
em aplicações compostas (composite appli- Tiger estarão presentes no Mustang são:
cations – outro destaque do JavaOne 2006), Na technical session  Mastering Mustang,
Mustang, •Facilitar o desenvol
desenvolvimento
vimento através de
que são construídas através da utilização Developing Dolphin (TS-3439), apresentada processadores de annotations (JSR 269);
de múltiplos serviços. por Danny Coward (Senior Staff Engineer)  JDBC 4.0 (JSR-221
• (JSR-221););
Houve demonstrações no NetBeans e e Mark Reinhold (Java SE Chief Engine- • Suporte a Scripting Languages (JSR-
também no JDeveloper da Oracle, IDEs que er), ambos da Sun, foram apresentados 223);
trazem recursos fascinantes
fascina ntes para suporte a números interessantes sobre o Java SE 5. •Anotações comuns para suporte a Web
BPEL, Web
Web Services e XML Schema. O objetivo era demonstrar a consolidação Services (JSR-250);
desta versão do Java no cenário de desen- •Inclusão do Java DB no JDK
Tiger, Mustang e Dolphin volvimento atual: •Incorporação do gerenciador de layout
As próximas versões do Java SE seguem •Mais de 260 milhões de downloads GroupLayout, utilizado pelo construtor de
o padrão de numeração adotado no Java • Estimativa de que 60% das máquinas interfaces gráficas Matisse do NetBeans,
5 (“Tiger”); ou seja, teremos o Java SE 6 novas já venham com o Java 5 instalado para facilitar a criação de telas com drag-
(“Mustang”) e o Java SE 7 (“Dolphin”). • Benchmarks indicando que Java SE 5 and-drop em IDEs.
Houve várias menções às novidades do é mais rápido no cliente e no servidor, e
Mustang e perspectivas do Dolphin nos perspectivas de que Java SE 6 será ainda  Suporte a Scripting Languages
General Sessions, assim como Technical melhor (veja a Figura 1). A JSR-223, “Scripting Pages in Java Web
Sessions específicas sobre alguns dos Applications”, ainda em estágio inicial,
define como será realizada a ponte entre
linguagens de scripting e a plataforma
 Java – como escrever e empacotar classes class es
Performance do Java  Java que deverão ser aces acessadas
sadas por di-
Server Benchmark: SPECjbb2000
350 ferentes linguagens de script, e também
    2
 . 325
    2
quais objetos
objeto s de uma aplicação web, como
 .
    1
    E 300 Session , ServletContext , HttpServletRequest e
    S
    2
    J 275 HttpServletResponse deverão estar expostos
   o
    d 250
   e
para acesso por linguagens de scripting
   c
   n 225
   a
(ex.: PHP). É provável que estes objetos
   r 200
   m
   o
sejam disponibilizados para as linguagens
li nguagens
    f
   r 175
   e através de uma API Java que utilize JNI
   p 150
   a
   r (Java Native Interface).
   a 125
   p
   o
A especificação será definida baseando-
    d 100
   a
   z 75
    i
se na linguagem PHP e será construído
    l
   a (na implementação de referência) um
   r 50
   m
   o
    N 25
engine para esta linguagem. No entanto
0 será garantindo que o engine seja viável
J2SE 1. 3.1 J2SE 142 T iger Mustang Beta para outras linguagens e independente
Figura 1. Benchmark da performance na JVM com as configurações para ser vidor extraído
de PHP,
PHP, sendo possível criarcria r mecanismos
mecani smos
do material apresentado na sessão TS-3439 para JavaScript e Groovy
Groovy,, por exemplo.

Edição 37 •  Java Magazine


Magazine 13
 JavaOne
 JavaOne 2006 • Perspectiva
Perspectiva Técnica

Veja a seguir
segu ir um exemplo de como ficaria •Novo formato de deployment e empa- DOM ou SAX – mas mesmo as APIs mais ma is
o código PHP para criação e impressão cotamento; simples ainda são complexas de usar, exi-
de um objeto da classe  java.util.Date , com •Simplificação do desenvolvimento gindo muitas linhas de código para cada
a JSR-223. Swing. operação. A segunda forma é utilizar uma
API de XML binding, como por exemplo
//Criação de um objeto Date Na General Session apresentada por o JAXB, que vincula objetos Java a docu-
$javadate = new Java(“java.util.D
Java(“java.util.Date”);
ate”);
// Chamada ao método toString() Graham Hamilton, arquiteto líder dos mentos XML, possibilitando que algumas
$date =$javadate-
=$javadate->toString());
>toString()); releases do JDK 1.3, 1.4 e 5.0, e agora res- operações sejam realizadas nos objetos e
// Impressão da data ponsável pelo planejamento das próximas depois “serializadas” em XML (neste caso
echo($date);
versões do Java SE, foi ressaltada a cautela é necessário a utilização de um DTD ou
necessária para alterações na sintaxe da XML Schema).
 Suporte a JavaScript  linguagem. Foram também indicadas O suporte nativo a XML na linguagem
Além do engine PHP citado, também será algumas funcionalidades que, embora  Java tem comcomoo obj et
etivo
ivo ate
atende
nderr es
espe
pe--
incluído no projeto Mustang um engine solicitadas por parte da comunidade, cialmente aos casos em que precisamos
 JavaScript
 JavaScript baseado no projeto Mozilla Rhi- provavelmente não estarão presentes no manipular ou criar
cria r documentos XML que
no, que é uma implementação open source Dolphin; por exemplo, a sobrecarga de não estão mapeados para um objeto e não n ão
de JavaScript. Isso permitirá que código operadores (operator overloading). têm DTD ou XML Schema associado.
assoc iado. Isso
 JavaScript seja misturado a código Java.
Java. Hamilton disse também que o JSE 7 será útil, por exemplo, em cenários onde
provavelmente suportará a passagem de cada parte de um documento XML é criado
cr iado
 JDBC 4.0 métodos como parâmetros. Citou como separadamente para que no final do pro-
A JSR-221 –  JDBC 4.0 API Specifi
Specification
cation exemplo os listeners de eventos de Swing. cesso, as partes sejam unidas e validadas
– visa atualizar e facilitar a utilização da Neste caso, com o novo recurso, poderí- com um XML Schema ou DTD.
API JDBC aproveitando recursos do Java amos passar um método, eliminando a A sintaxe que será utilizada ainda não foi
SE 5 como Generics e Annotations, além necessidade de implementar uma interface definida, e há duas opções em avaliação.
de prover novas classes utilitárias. listener. A primeira é baseada em tags XML, como
Apresentamos a seguir, com mais deta- a seguir:
 Java DB lhes, algumas das novidades citadas.
O Java DB é uma versão do gerenciador XML cliente1 = <cliente>
  <nome>{“Joao”}</nome>
de banco de dados open source Apache  Suporte nativo a XML na linguagem
linguagem   </cliente>
Derby,, com mesmo código fonte
Derby fo nte e mesmos A idéia do suporte nativo a XML na lin-
 binários, mas com suporte da Sun. Este guagem é minimizar o trabalho necessário Embora tenhamos que abrir e fechar cada
 banco de dados relacrelacional
ional é escr
escrito
ito em para criar, popular e alterar arquivos XML elemento, a notação será muito familiar
 Java,
 Java, e pode ser facilmente distribuído com em aplicações Java. para quem utiliza XML.
suas aplicações. Atualmente há formas comuns de se A segunda forma apresentada utiliza o
fazer isto. A primeira é utilizar um
u m parser caractere de sustenido:
Dolphin
Embora a versão Java SE 6 ainda não es-
teja pronta, o planejamento para a versão O que é AJAX ?
 Java SE
SE 7 (Dolphin) já começou. Apresen-
Apresen-
tamos aqui alguns itens de destaque que
poderão fazer parte do Java 7:
• Passagem
Passa
7:
gem de métodos como referên-
A JAX é uma abreviação para Asynchronous
JavaScript + XML. Não é uma nova tecno-
logia, mas uma forma de utilizar tecnologias
XMLHttpRequest;
• Uso de JavaScript para a ligação entre todos
esses elementos.
cia;  já exis
existente
tentess para melh orar a usab ilida
ilidade
de e
Suporte a propriedades

a interatividade das interfaces web. O termo O princípio básico para obter uma maior
(para o padrão JavaBeans foi criado por Jesse James Garret, da empresa interatividade nas interfaces web, adotado
getPropriedade() e set- Adaptive Path, e engloba as seguintes tecno- pelo AJAX, consiste em atualizar somente a
Propriedade()); logias: parte da página que deve sofrer alteração e
Suporte nativo a
• • Apresentação baseada em tecnologias pa- não o documento inteiro. Isto pode ser feito
XML; dronizadas, utilizando XHTML e CSS; através do elemento XMLHttpRequest, que
Criação de novos

• Exibição e interação dinâmica utilizando cria uma thread para enviar uma requisição
“engines” para supor- DOM; para o servidor. A resposta do serv idor é depois
te a linguagens de • Troca e manipulação de dados utilizando recebida através de um documento XML, que
script, como Bean- XML e XSLT; é processado por código JavaScript que faz a
Shell; • Recuperação de dados assíncrona utilizando extração dos dados e atualização da página.

Magazine • Edição 37
14  Java Magazine
XML cliente2 = #cliente { recursos que facilitariam muito a distri- redor.
#nome { “Maria”}  buição, como especificar
especif icar e garantir
ga rantir quais
qu ais Se você não pôde participar, aqui estão
}
são as dependências de um JAR. algumas sugestões para tirar proveito do
Observe que esta sintaxe é um pouco A JSR-277 (Java Module
Module System) tem como que foi gerado e discutido no evento:
mais enxuta, visto que marcamos apenas objetivo criar um novo formato para distri- • Assistir os General Sessions que estão
o início das tags.  buição de aplicações. Ela define módulos disponíveis no site do JavaOne.
Qual você gosta mais? Foi assim que foi  Java para empaco
empacotartar todos os recrecurs
ursos
os • Procurar pelas apresentações sobre
concluído este assunto na palestra “Mas- necessários para uma
u ma aplicação. Também
Também assuntos de seu maior interesse no site
tering Dolphin
Dolphi n and Developing Mustang”, especifica os
o s metadados da aplicação, que do evento. Os slides de todas as Technical
com uma rápida pesquisa de opinião sobre indicarão as dependências e elementos Sessions estão disponíveis em PDF
PDF..
o assunto. do módulo, além de uma lista indicando • Ficar atento aos blogs dos líderes das
quais elementos do módulo devem estar principais especificações (há vários no
Beans Binding expostos (evitando que elementos sejam portal Java.n
Java.net)
et)
A nova funcionalidade de Beans Binding, expostos desnecessariamente).
descrita na JSR-295, foi criada para mini- Deverá ainda ser oferecido pela imple-
mizar os problemas encontrados na sin- mentação da JSR-227 um conjunto de ferra-
cronização de propriedades de JavaBeans. mentas de suporte à instalação e remoção
Em uma aplicação Swing, por exemplo, é de módulos Java.
muito comum a necessidade de sincronizar  jcp.org
o conteúdo de um JavaBean
JavaBean que representa Project Simplice – JCP onde você poderá encontra a
o objeto do modelo (ex.: um objeto Cliente ), Visual Basic na plataforma Java especificação de todas as JSR citadas no
e uma propriedade do JavaBean que repre- O objetivo do projeto Simplice é rea- artigo
senta um componente de interface com o proveitar o conhecimento que os progra-  java.sun.com/javaone/sf/sessions/general/ 
 java.sun.com/javaone/sf/sessions/general/ 
usuário, como um  JTextField. madores Visual Basic têm da linguagem,  index.jsp
Com a nova JSR, o vínculo entre as permitindo
permiti ndo que código VB seja escrito den- Videos das General Sessions
propriedades poderá ser configurado fa- tro de métodos Java e que possa invocar
cilmente, indicando se deve ser realizada métodos Java. O código VB será compilado developers.sun.com/prodtech/javadb
uma conversão de tipos, ou feita uma va- para classes Java que poderão ser execu- JavaDB
lidação antes dos valores serem copiados tadas pela JVM. Note que o Simplice não blogs.sun.com/roller/page/dannycoward
blogs.sun.com/roller/page/dannycoward? 

de um JavaBean para outro. visa portar aplicações escritas em Visual entry=mastering_mustang_developing_
Basic para Java, pois essas aplicações são dolphin
 Swing Application Framework 
Framework  geralmente fortemente vinculadas a APIs Danny Coward blog com link direto para
Grande parte das aplicações desktop do Windows sendo portanto dependentes apresentação do JavaOne
possui as mesmas necessidades para de plataforma.
inicialização, finalização, gerenciamento
do estado da aplicação, gerenciamento de Expandindo a plataforma
recursos e ações de reposta para interação  Java para outras linguagens
linguagens  Yara M. H. Senger
com o usuário. No entanto, não há nenhum Atualmente a linguagem Python é su- ( yara@globalcode.com.br 
 yara@globalcode.com.br ) é
framework padrão para construção de portada em Java através do projeto Jython, formada em Ciências da Com-
aplicações desktop, como há para aplica- e Ruby através do JRuby. O objetivo é putação na USP em São Carlos,
ções web (por exemplo, Struts e Web
WebWork
Work).). permitir que a máquina virtual suporte especialista em desenvolvimento web;
Assim, atualmente os desenvolvedores diretamente linguagens dinâmicas e possui as certificações SCJA, SCJP e SCWCD. Atualmente
Atualmente
é Instrutora e Diretora Educacional da Globalcode, cria-
têm que criar toda a infra-estrutura para de scripting, expandindo a plataforma
dora e coordenadora de diversos cursos das carreiras
a aplicação a partir do zero.  Java. Esta fu
funcion
ncionalida
alidade
de está defi
definida
nida Academia do Java e Academia do Web Developer.
O Swing Action Framework, definido na JSR -292: Supporting Dynamically-T
Dynamically-Typed
yped
pela JSR-296, visa suprir esta lacuna, Languages on the Java Platform. Vinicius Senger
oferecendo um framewor
fra meworkk extensível que (vinicius@globalcode.com.br ) com
suporta funcionalidades
funcional idades comuns
comuns a muitas mais de 15 anos de experiência em
aplicações desktop. Conclusões desenvolvimento, diretor e fundador
Participar do JavaOne é sempre bom; é da Globalcode é especialista em Arqui-
 Java Module System
System uma somatória de coisas interessantes, teturas Java e desenvolvimento Java Enterprise Edition;
Embora arquivos JAR sejam amplamente contatos, palestras, discussões,
discu ssões, novidades. possui as certificações SCJA, SCJP e SCEA (1). Criador
utilizados para distribuição e execução de Faz a gente admirar ainda mais
ma is a evolução e coordenador das carreiras Academia do Arquiteto e
Academia do Enterprise Developer na Globalcode.
aplicativos
aplicativos Java, eles não oferecem alguns
algun s da tecnologia Java, e tudo que está a seu

Edição 37 •  Java Magazine


Magazine 15
 JavaO
 JavaOne
ne 2006
2006

Open Source em F
Lançamento de projetos como open sour

T erça-feira, 16 de maio. Já passavam


do meio dia no Brasil, mas o Java-
One estava apenas começando em
São Francisco, Califórnia. A poucos metros
do palco principal, duas fileiras de cadeiras
o início da tecnologia Java, quando nem o
termo open source existia, a comunidade
 Java usa, adota e desenvolve
desenvolve projetos sob
licenças que promovem a liberdade. Mas
neste ano o movimento open source foi
ta – que não 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 não-respos-
ta, conseguiu não agradar a ninguém, ao
ocupadas por brasileiros: a nossa pequena tratado com especial importância. mesmo tempo que tirou a atenção dos
e ruidosa delegação já se mostrava presen- A Sun, através do seu CEO e outros outros anúncios sobre open source feitos
te. Após a introdução inicial de John Gage
Gage,, executivos, falou no assunto já no início pela Sun, que foram brilhantes...
 Jonathan Schwartz sobe ao palco, anuncia- do evento, como que para deixar claro Portanto, vamos esquecer por um minuto
se como o novo CEO da Sun Microsystems,
Microsystem s, seu comprometimento com open source. essa discussão sobre a implementação da
fala sobre Open Source e, assim sem mais Do seu jeito sem rodeios, Schwartz foi Sun, e ir direto para os outros anúncios so-
nem menos, cita a enorme comunidade direto ao tema. Ao apresentar Rich Green,  bre open source feitos
feitos durante o primeiro
primeiro
 brasileiraa e nominalmente fala do SouJa
 brasileir SouJava.
va. executivo que acaba de voltar à empresa dia do JavaOne. E ver de que forma isso
Começava bem o JavaOne 2006, o maior e que no passado foi responsável por afeta nós desenvolvedores Java.
evento de desenvolvedores
desenvolvedores do planeta. fazer renascer a ferramenta NetBeans, Em um esforço chamado genericamente
Mesmo depois de anos participando do Schwartz perguntou de bate-pronto: de “OpenJava”, a Sun disponibilizou sob
 JavaOne, cada edição é uma nova expe- “Rich, quando   vamos colocar Java sob licença open source diversos softwares que
riência. Esse ano participei do “T-Shirt uma licença open
op en source?”. Green, que de serão de uso imediato nos mais diversos
Hurling Contest” (concurso de lançamento acordo com Schwartz será o responsável projetos Java. Desde um servidor de aplica-
de camisetas) com uma equipe formada por fazer isso acontecer, respondeu com ções JEE completo a um engine de portal,
por vários brazucas, e co-produzi durante a frase que deu o tom à discussão: “não é ferramentas de desenvolvimento e mais.
o evento um filme amador com alguns dos uma questão de se, mas de como.
como.””
principais astros da tecnologia Java. Só Infelizmente, foi uma resposta muito Projeto Glassfish: Open JEE
essas atividades já fizeram
fiz eram valer o JavaOne fraca para uma pergunta tão importante. Para quem vem acompanhando o desen-
2006, mas o que me chamou
cha mou atenção desde No ano passado, Schwartz já havia deixado volvimento da nova versão da especifica-
o primeiro minuto foi a ênfase dada a open claro que a Sun, no momento certo, iria ção Java Enterprise Edition (JEE), não será
source dentro do evento, e em especial disponibilizar todos os seus softwares sob novidade
pela Sun. Desde licença open source, inclusiv
i nclusivee sua
implementação de Java. E
isso já estava embu-
tido na pergun-

Magazine • Edição 37
16  Java Magazine
oco
ce movimentam o Jav
JavaOne
aOne
BRUNO SOUZA

que o projeto Glassfish é a implementação


de referência do JEE 5, e que está sendo
desenvolvido
desenvol vido em um projeto open source
(sob licença CDDL) desde o seu anúncio no
 JavaOne
 Jav aOne do ano passado
passado.. A novida
novidade
de é que
o Glassfish, agora também chamado de
Open JEE, está disponível em sua versão
final, e é o primeiro
pri meiro servidor de aplicações
a suportar a nova especificação.
Com o Glassfish os desenvolvedores
 já têm acess
acessoo às novas fufunciona
ncionalidades
lidades
do padrão JEE 5, como suporte a EJB 3.0,
incluindo as novidades em persistência e
o suporte às ultimas versões de especifi-
cações de Web Services. O Glassfish ainda Abertura em destaque: Jonathan Schwartz e Richard Green discutem participação e open source
traz um servidor web (Projeto Grizzly)
completamente reimplementado usando
 Java NIO, com pe perf
rfor
orma
mance
nce mel
melhor
hor e do produto Sun Java System Message nuir os custos
custo s de implantação de soluções
suporte a um maior número de conexões Queue, e por isso já traz funcionalidades  Java,
 Java, e em especial facilitar a migração para
simultâneas. como clustering e criptografia segura,  Java daqueles
daqueles desenvolvedo
desenvolvedoresres que ainda
No palco principal do JavaOne, reuniram- integração com mensagens SOAP e HTTP HT TP,, estão presos a um único fornecedor.
se representantes de todas as empresas que e uma API permitindo uso por aplicações
participaram
participar am da definição da especificação não-Java. É portanto um projeto recente,
 JEE, para formar a frase “Compatibility mas que já traz funcionalidades maduras Servidor de Portal
Matters” (Compatibilidade é importante). para o ambiente corporativo, o que deve e Business Integration
O comprometimento demonstrado por permitir o uso imediato não apenas em Continuando na direção de disponibi-
essas empresas, junto ao lançamento de aplicações internas
interna s que necessitem de uma lizar todos os seus softwares sob licença
um produto open source como o primei- implementação de messaging robusta, open source, a Sun lançou mais
mai s dois proje-
ro servidor JEE 5 no mercado, fortalece o mas também em projetos de integração tos relacionados a servidores de aplicações
padrão, que foi uma das grandes vedetes  business-to-business.
 business-to-busi ness. e SOA: um servidor de portal, e um sistema
deste JavaOne. Ainda na linha SOA, outro anúncio de Business Integration (BI).
importante foi a disponibilização como Baseado no produto Sun Java System
Open Message Queue open source da Web Services Interope- Portal Server, o projeto OpenJav
Op enJavaa Portal é
e WebServices Integration rability Technology (WSIT), uma coleção um servidor de portais
portai s completo, que tam-
Para quem se interessa de implementações de Web Services que  bém será liberado sob licença open source.
por SOA e Web Ser- abrange segurança, mensagens, qualidade
qua lidade Compatível com a JSR-168
JSR-168 (Portlets), esse
vices, a Sun anun- de serviço e outros. Conhecido como “Pro- servidor inclui um container para execu-
ciou o projeto Open  jeto Tango”
Tango”,, o WSIT facilita a integração ção de portlets, serviços de colaboração
Message Queue, com o ambiente .NET da Microsoft, sim- e federação de portais, e um engine de
uma implementa- plificando a vida de quem precisa interagir  busca, bem como recursos para integração
ção open source com o ambiente Windows Communication com web services e dispositivos móveis.
móveis. O
do Java Message Foundation (WFC), a infra-
infra-estrutu
estrutura
ra de co- projeto inclui ainda vários portlets prontos
System (JMS). O municação para Web Services da Microsoft que poderão ser utilizados diretamente no
Open MQ é ba- (antigamente conhecida como Indigo). É seu portal.
seado no código mais um projeto open source que irá dimi-  Já o Open ESB é uma implementação
implementação da

Edição 37 •  Java Magazine


Magazine 17
 JavaOne
 JavaOne 2006 • Open Source em Foco
Foco

 JSR-208 (Java
 JSR-208 ( Java Business Integration – JBI),
J BI), BPEL e WSDL já vem integrado com o A Sun também anunciou a futura dis-
e junto com o servidor Glassfish, será engine BPEL de que falamos anterior- ponibilização do Sun Java Studio Creator
uma plataforma completa para Business mente, e adiciona ao NetBeans o suporte como open source. As funcionalidades da
Integration, incluindo um engine BPEL a Business Integration. É possível fazer ferramenta serão integradas como plug-
(Business Process Execution Language), o desenho visual de fluxos de trabalho e ins do NetBeans ainda este ano. O Studio
que permite processar fluxos de trabalho interligações de processos, além da criação Creator é uma ferramenta para
pa ra desenvolvi-
complexos em interações corporativas de serviços desacoplados e sua composição mento visual de aplicações web. Com isso,
ou business-to-business. O Open ESB é em aplicações SOA. Tudo isso integrado o NetBeans, que já possui um sofisticado
um sistema corporativo que antes estava com o resto da ferramenta, permitindo por construtor de interfaces gráficas (o Matis-
disponível como produto da SeeBeyond, exemplo o uso do debugger do IDEI DE para a se), passará a contar com a facilidade da
empresa que a Sun comprou em 2005. depuração passo a passo dos processos de construção visual de interfaces JSF e Web
negócio. O Enterprise Pack traz ainda fun-
fu n- 2.0 (AJAX etc.) que existe no atual Studio
Ferramentas de Desenvolvimento: cionalidades de gerenciamento de identi- Creator.
Adições Corporativas para o NetBeans dade, com integração com Web Services e
É claro que nenhum
nen hum evento voltado
voltado para também federação de serviços através do Direto do laboratório de pesquisas
desenvolvedores poderia estar completo Projeto Liberty
Libert y. A Sun disponibilizou também alguns
sem anúncios a respeito de ferramentas de
desenvolvimento.
desenvol vimento. O NetBeans, que esteve
em foco durante boa parte do JavaOne,
ganhou uma série de funcionalidades Mais do que palestras
nos últimos meses, desde recursos vindos
de produtos consagrados, até novidades
diretamente saídas dos laboratórios de E ntre as características mais marcantes
do JavaOne está o fato de ser um desf ile
de estrelas da tecnologia Java. Todo mundo
sobre a IDE open source da Sun. Com versão
impressa distribuída a poucos e disputada
por todos a NetBeans Magazine foi inteira-
pesquisa.
O primeiro dos projetos anunciados, e está la. É um circulo virtuoso: todos acham mente produzida e editada no Brasil (em
que já está disponível nas últimas versões que todos irão e ninguém quer ficar de fora. inglês), inclusive com artigos de Fernando
 beta do
do NetBeans,
NetBeans, é o Enterprise
Enterprise Pack,
Pack, um Em um mundo tão virtual como o nosso, onde Lozano e Osvaldo Doederlein, e edição de
projetos e amigos parecem mais uma lista de Leonardo Galvão, colocando os brasileiros
conjunto de extensões voltadas para proje-
convocados da seleção brasileira – cada um em destaque desde o dia zero do JavaOne.
tos corporativos, que antes compunham o
 jogaa em um p aís – o JavaO
 jog Ja vaOnene acab
a cabaa sendo
se ndo a E na categoria “outras atividades” esse ano,
produto Java Studio Enterprise. O Enter-
grande opor tunidade do ano de se conversar pelo menos para mim, foi especial. Participar
prise Pack é open source e traz suporte a
e trocar idéias, e de ter aquele contato “cara do Concurso de Lançamento de Camisetas
todas as funcionalidades do JEE 5, além a cara” que é tão importante para formar (T-Shirt Hurling Contest), foi muito divertido.
de editores de UML e BPEL, entre outras amizades e fortalecer relacionamentos. Desde as conversas para submeter a idéia
novidades. Também,
Tam bém, como John Gage procura sempre e construir a máquina aqui no Brasil, o que
O editor visual de UML mantém sincro- repetir, é o lugar ideal para se fazer novos gerou horas de conversas sobre Java, física
nizados o código Java e os diagramas. São amigos e conhecer pessoas. Os brasileiros e idéias mirabolantes (muitas das quais não
suportados os diagramas mais importan- costumam tirar isso de letra. A estratégia levaram a lugar algum); até a apresentação
tes, e a ferramenta traz funcionalidades de sermos poucos, mas barulhentos, atrai a no evento, ao lado de James G osling.
para levantamento de requisitos e mesmo atenção e quebra o gelo. Os relacioname ntos Mas o lançador de camisetas foi o pano de
modelagem abstrata (ex.: modelos de do- criados a partir disso se tornam impor tantes fundo para uma experiência jamais realiza-
mínio), sem utilização
util ização da linguagem Java. na volta, e ajudam a integrar a comunidade da no JavaOne. Com a desculpa de termos
Com isso, é possível integrar, em uma brasileira à comunidade internacional. Por que treinar para chutar camisetas, eu, Ean
ferramenta, as necessidades isso, ir ao JavaOne nã o é só assistir Schuessler (provavelmente o mais maluco
variadas de desenvol- palestras; estamos sempre dos desenvolvedores Java) e nosso fiel
vedores, arquitetos, tentando colocar o Brasil parceiro, Juggy, mascote mundial dos JUGs,
projetistas e docu- em evidência. entrevistamos alguns dos maiores nomes da
mentadores. Esse ano, o Brasil já tecnologia Java (incluindo James G osling e
O editor começou a se destacar John Gage), e – literalmente – os chutamos
visual de desde o primeiro na cara, com uma gigante, e brasileiríssima,
momento. Já no chuteira verde. O resultado – um vídeo,
NetBeans Day, a filmado, editado e apresentado no JavaOne
vedete do show foi – está disponível para a sua diversão em
uma revista que  java blog gers .go
.gobof.
bof.org
org/Jav
/JavaOn
aOn eVid
eVideo
eo..
apresentava artigos

Magazine • Edição 37
18  Java Magazine
módulos de extensão para o NetBeans,
vindos de seu laboratório de pesquisas.
O Projeto Jackpot, desenvolvido pelo Sun
Labs, adiciona ao IDE a possibilidade de
criar scripts de refactoring, capazes de
varrer o código buscando más práticas
de codificação, ou identificando padrões
de código que possam ser melhorados ou
modificados, e realizando as alterações ne-
cessárias.
cessári as. Outro módulo destacado foi o de
Real Time, que permite o desenvolvimento
e depuração de aplicações
aplicações utilizando
utiliza ndo a es-
pecificação Java RTS. O módulo foi usado
durante o JavaOne em uma competição
de carrinhos de corrida, controlados por
essa tecnologia.
Apesar de quase todo o código dispo-
nibilizado ser oriundo de produtos pré-
existentes, e portanto ser de qualidade
de produção, os projetos citados são
todos projetos open source recentes, e a
grande quantidade de código disponi-
 bilizada ainda levará algum
a lgum tempo para
ser “digerida”
“digerida” pela comunidade. A maior
parte dos produtos anunciados já está
disponível como projetos open source ime- idade importa:  empresas que definiram o JEE 5 demonstram seu comprometimen
Compatibilidade
Compatibil comprometimento
to com compatibilidade
diatamente, mas não todos. No entanto, a
expectativa é que todos os projetos anun-
ciados estejam efetivamente ativos até o Apache, liderou durante o JavaOne uma Conclusões
final desse ano. apresentação sobre a situação do projeto O JavaOne 2006 foi, mais uma vez,
Harmony. O Harmony é uma iniciativa um evento único e especial. O Brasil foi
Não-anúncio da Apache para construir uma imple- lembrado de forma importante, a nossa
Com todos esses anúncios de liberação mentação Java certificada e open source. delegação contou com representantes
de código sob licença open source, a Sun Magnusson, acompanhado
acompan hado de desenvolve-
desenvolve- de grandes empresas brasileiras, e o
não precisava ter feito o “não-anúncio” dores que trabalham no projeto, demons- evento todo foi muito voltado para open
no início da palestra do Schwartz. Green, trou entre outras coisas,
coi sas, a implementação source – uma visão adotada fortemente
que – justiça seja feita – estava há apenas de Swing sendo desenvolvida, que já é em empresas e no governo Brasileiro. O
uma semana de volta
volta à Sun, acabou dando capaz de rodar diversas aplicações de  JavaOne é um termômetro da direção que
a impressão de que a empresa está mais porte. Apesar do Harmony não ser o ú nico a comunidade Java está indo no mundo
uma vez empurrando com a barriga a projeto indo nessa direção, vem ganha ndo inteiro, e ano após ano, percebemos que
decisão de liberar sua implementação de importantes contribuições de empresas o Brasil está muito bem posicionado
 Java como open soursource.
ce. E vendo o his
his-- interessadas em ver uma implementação nessa caminhada.
tórico dos últimos anos, é bem provável open source do JSE.
que esteja mesmo. Como esse é sempre Até o ano passado, a implementação JEE
um assunto polêmico, atraiu muitas das da Sun não era open source, embora já Bruno F. Souza
atenções, e acabou por fazer passar des- existissem servidores open source certifi- (bruno@javaman.com.br ) o “Ja-
percebida a grande quantidade de projetos cados como JBoss e JOnAS.
JOn AS. Quem sabe, no vaMan”, é veterano da tecnologia
Java e um dos líderes do movi-
e produtos disponibilizados como open próximo JavaOne teremos implementações
mento Java no Brasil. Consultor Sênior
source, praticamente de uma vez, como open source do JSE, como Classpath, Kaffe, da Summa Technologies, fundador da Sociedade de
vimos acima. GCJ e Harmony, ainda que a Sun até lá não Usuários Java (SouJava), e diretor da OSI (a organização
Mas os projetos open source não se res- tenha decidido “como”. A verdade é que que define o termo Open Source mundialmente), é
tringiram aos anúncios da Sun. Enquanto a comunidade Java está definitivamente expert individual no JCP e coordenador da comunidade
Schwartz e Green faziam jogos de pala- enraizada nos conceitos de open source,
sou rce, e mundial de JUGs no Java.net
Java.net..
vras, Geir Magnusson, vice-presidente da temos muito a ganhar com isso.

Edição 37 •  Java Magazine


Magazine 19
10 Mais do Ecli
As dez principais melhorias do mais novo r

Q uando escrevi o artigo


ar tigo “Por dentro

3.1 ainda demoraria um pouco


até o release final.
dentro
do Eclipse” (Edição 23), o Eclipse

fi nal. Após 16 meses, quando


você estiver lendo esta edição, o release
pelo mesmo caminho,
camin ho, e o IntelliJ IDEA não
supera números modestos há anos.
Hoje, o maior concorrente é outro IDE
open source, o NetBeans, que apesar da
fatia menor de mercado, tem sido um
Eclipse), existe agora um porte do Matisse.
É difícil não admirar esta disputa leal num
mercado tão importante e competitivo
– sem vestígio de táticas como processos
de patentes, exploração de formatos de
final do novo Eclipse – o 3.2 – já estará forte desafio, inovando em áreas como arquivo, APIs proprietárias etc. Se os pro-
pronto. Para a maioria dos desenvolvedo-
desenvolvedo- desenvolvimento
desenv olvimento Swing (com o construtor  jetos Eclipse e NetBe
NetBeans
ans prov
provam
am uma coisa
res, chegou de novo a hora de avaliar um de telas Matisse) e Profiling, e saindo à  juntos, é que o modelo de código aberto
major update da sua principal ferramenta frente do Eclipse em suporte integrado às força cada projeto a competir satisfazen-
de trabalho. plataformas JEE e JME. A Sun tem se tor- do o usuário, e oferecendo cada vez mais
Eu disse maioria? Segundo estudos re- nado ainda mais agressiva recentemente, funcionalidades e qualidade.
centes, o Eclipse goza de uma liderança doando ao NetBeans ferramentas “Enter- Mas, voltando ao assunto principal, neste
folgada, mesmo contando somente a distri- prise” antes só disponíveis nos seus IDEs artigo apresentaremos o novo Eclipse 3.2.
 buição open source1. Entre os concorrentes, comerciais2. A disputa entre ambos os Novas funcionalidades individuais são
os produtos da IBM já são baseados no projetos tem sido bonita e acirrada.
acir rada. No Ne-  bem ilustradas pelos já famosos relatórios
Eclipse, os da Oracle, BEA e Borland vão tBeans, temos importação de projetos do “New and Noteworthy” do projeto Eclipse,
Eclipse, associações de teclas do Eclipse, mas pode ser difícil ter uma visão rápida
e o NetBeans Rich Client Platform para dos avanços mais importantes, e das con-

+
fazer frente
f rente ao já popular
popula r RCP.
RCP. Já seqüências globais de várias melhorias.
no MyEclipseIDE (um IDE Neste artigo, tentamos oferecer esta visão,
comercial baseado no nos concentrando numa classificação das
10 principais novidades ou melhorias do
novo release.

Suporte a JUnit 4  1 0


Como sabemos, o JUnit é a principal
ferramenta de testes unitários
unitá rios para Java
(apesar da recente competição com o
TestNG); seu suporte integrado no
Eclipse é excelente e certamente
sempre será. Ocorre que ambos
os projetos são “parentes de san-
gue”: o JUnit foi criado
cr iado por Kent
Beck e Erich Gamma, e Gamma

1 Exempl
Exe
Exemplo:
mplo:
o: 5º Jav
Javaa Use and
and Awareness
Aware
Awarenes
nesss
Survey, SD Times, Dezembro de 2005.

2
  Estas ferramentas, disponibilizadas
como preview no NetBeans 5.5 Enterpri-
se Pack, farão parte da versão 6.0.

Magazine • Edição 37
20  Java Magazine
 pse 3.2
A nova versão do Eclipse
traz centenas de pequenas
e grandes melhorias, do
suporte a ferramentas
atualizadas, a novos
elease do Eclipse projetos de amplo alcance

OSVALDO PINALI DOEDERLEIN

também é um dos principais arquitetos do reconhece ambos os


Eclipse, sendo líder do projeto JDT JDT.. tipos de teste, e executa
O release recente do JUnit 4 é uma im- a todos de forma indis-
portante melhoria deste framework de tinta. Veja um exemplo
testes, permitindo a escrita ainda mais na Figura 1. É inclusive
inc lusive
fácil de testes unitários, ao substituir a possível criar test suites
necessidade de herdar de classes como misturando testes feitos
TestCase   ou de seguir convenções como com ambas as versões
criar métodos iniciados por “test”, pelo (o JUnit 4 tem APIs que
novo recurso de anotações do Java 5. A permitem isso).
Listagem 1 mostra um exemplo de teste Outra melhoria im-
unitário criado
c riado com a nova versão do JUnit. portante do suporte
Note que só precisamos aplicar a anotação
a notação do Eclipse para JUnit
@Test aos métodos que são testes unitários. é a possibilidade de
Existem mais anotações, para métodos executar vários testes Figura 1. Integração com o JUnit 4.
“before/after” e outras necessidades. Veja concorrentes, o que é
também que, como não precisamos es- muito bom para conseg
conseguir
uir paralelismo, es- logo, onde um campo no canto superior
tender a classe TestCase, podemos usar a pecialmente entre testes de longa duração esquerdo permite excluir todos os itens
sintaxe import static do Java 5 para que seja e de baixo consumo de CPU local (como do diálogo que não contenham a string
possível invocar métodos como assertTrue() testes que acessam bancos de dados). digitada, foi mais explorado
explorado,, nos diálogos
(que é um método static da classe Assert) de Show View, New,  Import e Export (estas

 9
forma direta. O resultado é que você pode duas últimas agora também são categori-
escrever testes unitários com bem menos zadas). Também se pode filtrar as opções
código do que antes. de lançamento (Window>Preferences>Run/ 
Note que a API do JUnit 4 não é compatí- Debug>Launching>Launch Configurations).
vel com a versão 3.x, e a nova versão exige Escalabilidade e controle As views de problemas, tasks e bookma-
o JSE 5+. Mas como o JUnit
J Unit 3.x coloca suas de complexidade rks, que já suportavam filtros,
f iltros, agora acei-
classes em packages  junit.* e o JUnit 4 muda Alguns desenvolvedores podem ter tam filtros múltiplos (veja a Figura 2).
para org.junit.*, pode-se utilizar ambos workspaces enormes, com dezenas de
num mesmo projeto, o que permite uma projetos e milhões de linhas
lin has de código. Ou, Working Sets
migração gradual, ou a convivência entre mesmo sem tanto código, podem ter que O recurso de working sets, introduzido
testes unitários mais antigos feitos com utilizar
utili zar um número muito grande de plug- no Eclipse 3.1, permite criar grupos de
o JUnit 3.x, e outros novos feitos com a ins. O resultado acaba sendo uma grande projetos (ou partes de projetos). Foi tam-
versão 4. confusão. O design de Perspectivas, que  bém muito expandido no Eclipse 3.2. Há
O suporte a JUnit do Eclipse 3.2 inclui vem desde o Eclipse 1.0, foi a primeira ações de atualização ( refresh), abertura
as bibliotecas das duas versões do JUnit, ação importante no sentido de adminis- e fechamento de projetos sobre working
trar complexidade, mas como sabemos, sets; working sets de breakpoints; filtro
o desenvolvimento de software só fica de projetos visíveis no Package Explorer
Listagem 1. Testando o JUnit 4, suportado pelo Eclipse 3.2.
mais complexo a cada ano; assim todas as por working set; e working sets de janelas
import static org.junit.Assert.*; atualizações do Eclipse têm introduzido visíveis (também filtra os itens do Problems
import org.junit.Test;
novas técnicas para simplificar o ambiente
a mbiente View e dos diálogos de lançamento).
public class TestJUnit4 { de desenvolvimento. Se você tiver um workspace muito
st public void meuPrimeiroTeste () {
 @Test
 @Te
assertTrue(“Adição”, 2 + 2 == 4); complexo, vale a pena configurar alguns
} Filtros working sets que filtram somente os ele-
}
O recurso de filtros em caixas de diá- mentos necessários para suas atividades

Edição 37 •  Java Magazine


Magazine 21
10 Mais do Eclipse 3.2

principais. Por exemplo, para depurar não for adepto de processos ágeis como esses refactorings oferecem uma opção
um servidor EJB, poderia criar working XP – que prega o uso contínuo e inten- para renomear ou deletar também todos
sets que incluem somente o projeto do so de refactoring – concordará que esta os sub-packages.
servidor (e suas dependências),
dependência s), e as views, funcionalidade é uma excelente extensão Renomear tipo (classe ou interface):
 breakpoints e outras opções realmente uti- do editor de código, poupando tempo e Agora possui uma opção para renomear
lizadas ao codificar
codif icar ou depurar o servidor. minimizando riscos. variáveis do tipo afetado, cujos nomes
Esta configuração só tomará alguns minu-
mi nu- Transformações de código complexas, sejam iguais ao do tipo (exceto pelo ca-
tos, e a partir daí você poderá selecionar como extrair um bloco de código de um ractere inicial, minúsculo). Por exemplo,
o working set “ MinhaA
 MinhaAplicacaoS
plicacaoServ er” e
erver método para um novo método auxiliar, digamos que você tenha uma declaração
ter um IDE mais simples, organizado e se feitas usando recursos de refactoring, Conta conta, e renomeie a classe Conta para
produtivo para aquela tarefa. serão feitas sem risco de introdução de Investimento. Anteriormente, o resultado
 bugs. E transformaçõ
transformações es simples
si mples mas tra- disso é que ficaríamos com declarações
Trabalho em equipe  balhosas, como criar
cria r um novo parâmetro estranhas, como Investimento conta : não é
Outro fator importante na área de com- num método que é invocado em centenas um bug, mas é confuso. Com a nova op-
plexidade é o suporte ao trabalho ef iciente de lugares, serão feitos rapidamente
rapidamente,, sem ção, o refactoring detecta que a variável
de projetos com grandes equipes. O Eclipse erros nem esforço adicional – poupando investimento tem um nome baseado no
3.2 permite exportar/importar grupos de um enorme tempo de edição e revisão de nome do seu tipo, e altera a declaração
 breakpoints, facilitando a depuração em código manual. para Investimento investimento.
equipe. Há várias melhorias na infra-es- O Eclipse 3.2 adiciona alguns refacto- Inlining para métodos binários: Pode-
trutura de controle de versões e suporte rings novos ou melhorados, mas neste se fazer inlining de um método de uma
a CVS, como templates para comentários release as mudanças mais importantes são  bibliote
 bibl ioteca
ca ext
extern
erna,
a, sem que o proproje
jeto-
to-
de commit, melhorias na resolução de na arquitetura geral de refactoring, cujos cliente precise depender de um projeto do
conflitos (com opção de merge no cliente),  benefícios se aplicam a todos os tipos
t ipos de Eclipse contendo os fontes desta biblioteca.
histórico de alterações unificado (para o refatorações e devem elevar a conveniência Basta associar o projeto-cliente ao JAR da
Local History e CVS ou outro servidor desta técnica a um novo patamar.  biblioteca, e também aos seus
seu s fontes, que
de controle de versões), e uma opção de podem estar num diretório qualquer ou
visualizar anotações no editor com as Refactorings novos e melhorados mesmo num arquivo ZIP.
alterações do repositório.
repo sitório. Introduzir indireção a método: Subs-
titui todas as invocações a um método Refactoring sem quebra de APIs

 8
 params)) por invocações a um
 X.m( params
 X.m( u m novo mé- Diversos refactorings que alteram ou
todo static n(X x, params
x, params)), que inicialmente só eliminam métodos ganharam uma opção
invoca m(  params)).
m( params para manter o método original com um
Extrair superclasse:  Criauma nova código “stub” (opcionalmente marcado
Evolução em refactoring superclasse comum a um conjunto de como @deprecated ) que invoca o novo có-
A técnica de refactoring (refatoração) é classes, contendo elementos comuns às digo. Assim, você pode fazer alterações
hoje considerada essencial por qualquer classes de origem. incompatíveis na API, como renomear
desenvolvedor experiente. Mesmo quem Renomear e deletar package:  Agora métodos, mas sem quebrar o código que
dependia da API anterior. Veja
Veja a Figura 3
para um exemplo.

 Scripts e histórico de refactoring


refactoring
Quando você fizer um refactoring pelo
IDE, um histórico desta operação será
preservado no workspace, como mostra
a Figura 4. Digamos que num projeto A,
você renomeie um método m( m()) para n(
n()); o
Eclipse irá corrigir todas as referências
a este método em todos os projetos do
mesmo workspace. Porém, imagine que
m()  era utilizado por um projeto B que não
estava no workspace3. Isto costumava ser

3
Ou que
quenão
não estivesse
estive
estivesseaberto
sseaberto,
aberto,, ou que
quenão
nãofossecon-
fosse con-
figurado como dependente do projeto A (e sim de um
Figura 2. Novas opções de filtros para a view Problems . arquivo JAR produzido por A).

Magazine • Edição 37
22  Java Magazine
Mais diagnósticos do compilador
O Eclipse é notabilizado pelo uso de
 7
um compilador Java próprio: ao invés do
 javac, o JDT tem seu próprio compilador
de fontes para bytecode.
byte code. Este compilador
é incremental, é muito mais rápido que o
 javac (mesmo em modo não-incremental),
e também faz um
u m número enorme de diag-
diag-
nósticos adicionais. Estes diagnósticos,
que são todos opcionais e configuráveis
(veja a Figura 5), geram mensagens de erro
ou de advertência indicando problemas
Figura 3. Ao renomear um método
método,, temos uma opção para manter o método original como um stub (deprecated) que somen-
te delega a invocação ao método atualizado.
atualizado. potenciais que normalmente passariam
despercebidos.
Listagem 2. Exemplo de script de refactoring
Novos diagnósticos do Eclipse 3.2
<?xml version=”1.0” encoding=”utf-8” standalone=”no”?>
<session version=”1.0”> O Eclipse 3.2 inclui diversos novos diag-
<refactoring comment= nósticos:
“Rename method ‘Banco.findConta(... )’ to ‘localizaConta’&#13; &#10;
- Original element: ‘Banco.findConta(...) ’&#13;&#10; Tags “$NON-NLS$” desnecessárias:
- Renamed element: ‘Banco.localizaConta(. ..)’&#13;&#10; Estas tags, inseridas em comentários
- Update references to refactored element&#13;&#10;
- Keep original element as deprecated delegate to refactored element” após linhas de código com literais string,
delegate=”true” deprecate=”true” indicam que uma literal não precisa ser
description=”Rename method ‘findConta’” flags=”589830”
id=”org.eclipse.jdt.ui.rename.method” internacionalizada. O diagnóstico flagra
input=”/src&lt;{TestRefactoring.java[Banco~findConta~QString;”
name=”localizaConta” project=”JM37” references=”true”  version=”1.0”/>
usos desnecessários desta tag (comum,
</session> por exemplo, após refactoring de literais
para constantes).
Uso de tipos brutos ( raw ):  Específico ao
um problema, sendo preciso corrigir os Listagem 2 (as únicas partes importantes  JSE 5+. Detecta utilizações não-genéricas
projetos “quebrados”
“quebrados” à mão, ou desfazer
desfaz er o são as destacadas em negrito; os demais de classes genéricas; por exemplo, um
refactoring e refazê-lo após colocar todos campos são de documentação). atributo declarado como “List x” (ao invés
os projetos dependentes no workspace. Assim, sempre que você fechar um novo de List<
List<elemento
elemento> > x”).
Com o novo histórico de refactoring, bas- release de uma biblioteca, projeto de infra- Labels não utilizados: Detecta labels não
ta colocar o projeto B no workspace e, no estrutura, ou um projeto contendo
contendo classes utilizados por nenhum statement break break label 
 label 
menu Refactor, usar as opções Create Script... utilizadas por outros projetos, não precisa ou continue  label . (Se você não conhece esta
continue label 
para gerar um script a partir do histórico mais criar um documento explicando as facilidade do Java,
Java, ótimo: meu conselho
co nselho é
de A, e depois a opção  Apply Script...
Script... para alterações de API e os passos para migrar não aprender!)
re-executá-lo. Este script pode inclusive manualmente os proje-
ser enviado para outro desenvolvedor, tos dependentes (e pre-
que já tem o projeto B configurado
config urado no seu parar os ouvidos para as
workspace. Assim, a equipe que programa reclamações). Ao invés
um projeto de uma biblioteca utilizada disso, você pode fornecer
por vários outros projetos não é obrigada um script de refactoring
a manter todos os projetos dependentes que executa todas estas
desta biblioteca no seu workspace, para migrações automatica-
conseguir atualizar a todos quando tiver mente. Ao exportar um
que fazer alguma alteração incompatível projeto para um arquivo
em APIs públicas.  JAR, o Eclips
Eclipsee perm
permite
ite
Ainda melhor, estes scripts (que são ar- incluir os scripts de re-
quivos XML) também podem ser escritos factoring neste JAR (sob
ou alterados à mão e versionados como a pasta MET A-INF), faci-
 META-INF
parte do projeto. Veja um exemplo na litando sua utilização. Figura 4. Histórico de refactorings.

Edição 37 •  Java Magazine


Magazine 23
10 Mais do Eclipse 3.2

Estruturas switch com cases sem break : Isso declara uma List x  e executa
muitas vezes é um bug, e mesmo quando qua ndo x.add(“string”) , o quick fix de-
proposital ( fall-through), muitos conside- duz que a declaração poderia
ram mau estilo. ser List<String>.
De-referências a null : Detecta usos de
variáveis locais cujo valor  pode  ser nulo Sempre me perguntei se não
– onde é teoricamente possível ocorrer seria possível aplicar um de-
uma NullPointerException . Pode ser usado terminado quick fix, de forma
para forçar um estilo de programação automática, a várias ocorrên-
defensiva, com cláusulas de guarda como cias do mesmo problema,
“if ( ref  !=
 != null)...”. talvez até a um projeto inteiro.
Atribuições
Atribui ções a parâmetros: Detecta usos Pois isto foi implementad
i mplementadoo de
de parâmetros como variáveis. A boa duas formas no Eclipse 3.2.
prática recomendada é declarar todos os Na melhoria mais simples, ao
parâmetros de métodos e construtores com selecionar
selecion ar o quick fix, pode-se
o modificador final. Veja Veja detalhes sobre
s obre esta optar por aplicá-lo a todos os
regra no artigo “Qualidade
“Qua lidade Aplicada”,
Aplicada”, na problemas do mesmo tipo na
edição anterior
a nterior.. mesma classe.
Atribuições sem efeito: Este diagnóstico Mas uma opção muito mais
 já existia, mas foi bastante melhorad
melhorado, o, cap- poderosa é o novo Clean Up Figura 5. Diagnósticos avançados do compilador do JDT JDT,, inclusive alguns
turando novos casos de atribuição inútil Wizard. Este wizard é capaz de novos no 3.2, como a detecção de uso de referências nulas.
como x = x = y ou x = ++x, sendo que este executar 29 tipos de operações
último é quase sempre um bug. de “limpeza” de código, automatica
automaticamente,
mente, FindBugs,, podem incluir diagnósticos complexos
FindBugs
sobre um volume de código arbitrário. Es- – que consumam muita CPU e RAM – sem que isso
Quick fixes e Clean-Up tas operações incluem opções como intro- seja um problema, pois estas ferramentas não
Se os diagnósticos de problemas poten- duzir o modificador final onde for possível;  precisam ser executadas
executadas a cada rebuild. rebuild.
ciais já são bons, ficam ainda melhores com transformar loops for na versão estendida

 6
outro recurso popular do Eclipse, os quick do JSE 5; forçar o acesso a variáveis static
 fixes – comandos de correção automática através da sua classe (e não de alguma
de vários problemas. Por exemplo, se o instância desta classe, algo desnecessário
compilador indica um typecast desne- e confuso); eliminar imports, typecasts Melhorias de infra-estrutura
cessário, existe um quick fix que elimina e outros códigos desnecessários; ou até Quem quer um IDE cheio de recursos,
o typecast. O Eclipse 3.2 introduz novos mesmo, adicionar código faltante, como mas que seja lento ou inflexível? Desempe-
quick fixes: os serialVersionUID   de classes serializáveis, nho e extensibilidade são qualidades que
• Remover as chaves de blocos contendo ou anotações como @Override (JSE 5). dependem de detalhes de design e imple-
um único statement. mentação que podem não ser evidentes
• Quick fixes para as anotações do  O JDT compete com ferramentas de para o usuário final. Mas é interessante
 JSE 5: adicionar um atributo fal- validação de código, mas não é prová- conhecer os avanços nesta área.
tante, e adicionar membro de vel que avance até o ponto de tornar
anotação. estas ferramentas obsoletas, pois Cache
• Eliminar tipos brutos só pode implementar validações O Eclipse gasta bastante memória com
(raw types) do Java 5. Por que não aumentem sensivelmente objetos que modelam o conteúdo das
exemplo, se o seu código o tempo de compilação. Já as ferra- classes utilizadas pelos projetos abertos
mentas especializadas, como PMD e no seu workspace. Isto inclui tanto os seus
próprios fontes (.java) quanto as bibliotecas
referenciadas (.jar, .zip, .class). Este cache
de objetos torna operações como busca,
referência cruzada, refatoração, outlining,
auto-completamento de código, exibição
de JavaDocs etc. muito mais rápida, porque
o Eclipse não precisa ficar analisando o
conteúdo de JARs ou fazendo parsing de
fontes Java a todo instante.
Mas como um workspace pode ser arbi-

Magazine • Edição 37
24  Java Magazine
trariamente grande, o Eclipse só mantém do Ant), sem que o Eclipse se confunda de evolução mais lenta. Mas o Java 5
um “cache de modelos” para os fontes e com isso.  já é notícia velha 4. Embora o Eclipse
 JARs mais acessados. No Eclipse 3.2, este • O editor de código Java dá suporte 3.1 já tenha introduzido o suporte
cache foi muito aperfeiçoado. Pode-se muito melhor a arquivos externos (não ao JSE 5, este release ainda possuía
usar automaticamente uma quantidade pertencentes a source folders de projetos limitações e bugs (inclusive
(i nclusive de com-
maior de memória, se você
você configurar
configu rar um do workspace), funcionando inclusive o pilação, ainda que contornáveis)
heap maior para o Eclipse (com a opção auto-completamento. que prejudicam seu suporte ao JSE
-vmargs -Xmx, que pode ser adicionada ao • A exportação de configurações de pro- 5. O release 3.1.1 corrigiu 53 deste
atalho de lançamento do Eclipse ou ao  jeto para scripts do Ant foi melhorada.
melhorada.  bugs, e o 3.1
3.1.2
.2 mais
ma is 77. O Eclipse
arquivo eclipse.ini na sua raiz de instala- • Diversas ferramentas do JDT (compila- 3.2 corrige mais algumas dezenas
ção). dor, formatador de código e outros) podem de bugs relacionados a suporte
Foram resolvidos problemas de escala- ser invocadas da linha de comando; útil ao JSE 5.
 bilidade da implementação
implementação do cache, que (mais uma vez) para automação via Ant. Não se alarme: alguns destes
ocorriam em workspaces com grande nú- • Na configuração de build path, pode-se “bugs” são na verdade novas
mero de JARs. Se você é um dos usuários criar, em qualquer nível de diretório, links funcionalidades, e vários são
do Eclipse que se viu forçado a configurar simbólicos para pastas fora da estrutura de problemas em conveniências
heaps enormes (como 256 Mb ou até mais) arquivos do projeto ou do workspace. não essenciais ao uso
u so do Java 5
para evitar OutOfMemoryException  ou mau de- – coisas beirando o supérfluo,
supérf luo,

 5
sempenho com workspaces muito grandes, como o bug 87868 (geração
experimente reduzir esta configuração de advertência indevida para
no 3.2 (talvez você possa reduzir o heap à comentários contendo tags
metade do tamanho atual!). do javadoc que usam certas
Suporte ao JSE 5 (Tiger) e 6 (Mustang) sintaxes de tipos genéricos).
Recuperação de sintaxe A programação é a principal tarefa do Mas também existem algu-
O parser de código Java do JDT é utili- desenvolvimento de quase todas as apli- mas correções de problemas
zado não só para compilar classes, mas cações, e acompanhar as últimas versões críticos (muitas já portadas
também para outras funcionalidades, da plataforma (linguagem e APIs) é uma para o Eclipse 3.1.2). Acom-
como auto-completamento de código e prioridade de qualquer IDE. No ano pas- panhar a evolução de uma
refactoring. Às vezes você pode querer sado, a espera pelo release final do Eclipse linguagem às vezes não é
usar estas funcionalidades
funcional idades em classes que 3.1 foi bastante incômoda para quem já fácil. Por exemplo, para a
apresentam erros de sintaxe, pois ainda queria utilizar o JSE 5 (o Eclipse 3.1 final classe:
não estão completas, ou estão no meio de veio com 8 meses de atraso), mas dessa
public class A {
uma “faxina
“faxi na pesada”.
pesada”. vez, a Fundação Eclipse foi muito mais public void teste() {
No Eclipse 3.2, o parser foi melhorado ágil com o JSE 6. new Runnable() {
de forma a ser muito mais inteligente
i nteligente para public void run () {
new Runnable() {
contornar trechos errados de um fonte,  JSE 6 public void run() {...}
continuando capaz de compreender a O novo Eclipse suporta a plataforma   };}};
parte do arquivo que está correta. Para o  JSE 6, apesar de que esta só será finaliza-
fina liza- }
}
usuário, o efeito visível desta melhoria é da depois (o release final do Eclipse 3.2 é
que funcionalidades como auto-comple- previsto para junho, mas o do Mustang ...o  javac 1.4 ou inferior gera-
tamento, e até refactorings locais, quase só para o início do segundo semestre). O ria os arquivos:  A.cl ass ,  A$
 A.class  A$1.
1.
sempre funcionarão da forma esperada, suporte específico exigido pelo novo JSE class para a primeira inner class
mesmo em classes contendo erros (que consiste principalmente na compilação anônima (a mais externa), e
são justamente os casos onde você pode de bytecodes, que agora inclui atributos  A$2.class  para a segunda (a mais
precisar mais destas facilidades!). de pré-verificação, os quais tornam o car- interna). Mas no JSE 5, decidiu-se
regamento das classes mais rápido (uma que as classes geradas deveriam
Estrutura de build mais aberta e robusta otimização
otimiz ação que o JSE 6 tomou emprestado preservar o aninhamento existen-
Há vários itens que tornam o Eclipse da plataforma JME). Além disso,
dis so, o Eclipse te nos fontes, mesmo para classes
mais flexível
flex ível e adaptável
adaptável a projetos legados funciona corretamente sobre uma JVM anônimas. O correto ( somente se
ou com necessidades especiais de organi- 6.0.
zação e compilação: 4Atéé mesmo
At mesm
me smoo para
para
pa ra os
os usuários
usuá
usuári
rios
os de
de produtos
prod
produt
utos
os da
da
Projetos podem ser configurados para
•  JSE 5 IBM: o IBM JDK 5.0 já está disponível há alguns
meses, e o WebSphere 6.1, com suporte a este JDK,
que a compilação do código seja feita por O Mustang ainda está no médio a longo estará disponível quando você tiver esta edição em
um mecanismo externo (como um script prazo, especialmente em ambientes JEE, mãos.

Edição 37 •  Java Magazine


Magazine 25
10 Mais do Eclipse 3.2

compilando para JSE 5+) é gerar as classes Pode-se ver que o código criado é eficiente, de dados relacionais. O DTP é muito mais
 A.class,  A$1.class, e  A$1$ 1.class. O Eclipse
 A$1$1.class gera hashcodes de alta qualidade,
qual idade, e é segu- poderoso que outros plug plug-ins
-ins de conexão
3.1 falhava em respeitar esta diretriz do ro (defensivo contra a possibilidade de va- a SGBDs (QuantumDB
(Quantu mDB etc.), e compete até
 JSE 5, o que poderia ser um problema de lores null em qualquer atributo). Métodos mesmo com ferramentas de cliente SQL
compatibilidade,, por exemplo ao usar
compatibilidade usa r re- equals() e hashCode() escritos e otimizados à tradicionais como SQuirreL ou TOAD.
flection para manipular as inner classes. mão poderão ser um pouco melhores que Além disso, o DTP será altamente integra-
Mas isto foi corrigido no Eclipse 3.2. estes, mas não muito. do a outros projetos do Eclipse
Ec lipse que podem
Resumindo, se você desenvolve com os precisar trabalhar com bancos de dados,

 3
novos recursos de linguagem do Java 5, tais como o WTP e o BIRT.
o Eclipse 3.2 é uma atualização excelen- • ECF  (Eclipse Communications Fra-
te, mas se não quiser fazer este update mework): implementa facilidades de
agora, considere pelo menos o 3.1 3.1.2
.2 como distribuição e colaboração entre desen-
obrigatório. Suporte a outros plug-ins volvedores 5. Isto incluirá mensagens ins-
O Eclipse 3.2 é a base para novos releases tantâneas, quadro-branco compartilhado,

 4
de várias extensões críticas, como o VE, compartilhamento de arquivos, e já se
WTP e TPTP. Destes, o WTP (Web Tools fala até em recursos de VoIP (voz sobre
Platform), que dá suporte a desenvolvi- IP). O benefício destas ferramentas será
mento JEE (Web, EJB, Web Services, XML semelhante ao de muitas aplicações já dis-
Geração de hashCode() e equals() etc.) é hoje o mais importante e popular; o poníveis, mas tudo será integrado ao IDE,
Este recurso é discreto: uma nova ação novo WTP 1.5 é uma grande atualização, possibilitando cenários de uso extrema-
de geração de código, disponível em que eu consideraria essencial para desen- mente interessantes, como fazer depuração
Source>Generate hashCode() and equals(). volvedores que usam Eclipse+WTP para remotamente de um projeto rodando num
Mas considero-o importante ao ponto  JEE. Mas como o WTP 1.5 só fu funcion
ncionaa workspace de outra máquina.
de figurar nos “10 Mais” do Eclipse 3.2, com o Eclipse 3.2, a atualização do IDE • TPTP  (Test and Performance Tools
porque a geração correta destes métodos é será obrigatória. Platform): A próxima versão irá suportar
uma tarefa delicada
delicada,, e muitas vezes esque- Outros plug-ins importantes do eclipse. profiling com a JVMTI (nova API da JVM
cida ou feita inadequadamente. Sabemos org estão aparecendo o tempo todo, e os para debugging e profiling, introduzida no
da importância destes métodos e como mais recentes só funcionarão no Eclipse  JSE 5, de uso obrig
obrigatóri
atórioo no JSE 6). Isso trará
implementá-los,
implemen tá-los, mas não seria muito mais
ma is 3.2. Além disso, não terão versões mais an-  benefícios
 bene fícios impo
importante
rtantess de dese
desempenh
mpenhoo e de
fácil deixar o IDE fazer isso? tigas (exceto, talvez, milestones instáveis) funcionalidade (o NetBeans
NetBeans Profiler é uma
A Listagem 3  mostra uma classe de que funcionem no Eclipse 3.1 ou versões evidência destas vantagens). Além disso, o
exemplo, da qual digitamos somente as anteriores. Os itens mais importantes nesta TPTP 4.2 também suporta relatórios sofis-
declarações de atributos. Todo o código categoria são: ticados com o BIRT (Business Intelligence
destacado em negrito foi gerado pelo Eclip- • DTP (Data Tools Platform): implemen- and Reporting Tools) e outras novidades.
se, com o assistente ilustrado na Figura 6. ta facilidades para trabalho com bancos
Plug-ins de terceiros
Uma boa notícia é que todos os plug-ins
Listagem 3. Resultado do novo comando
comand o “Generate hashCode()
hash Code() and equals()”
equals ()”. de terceiros (ou seja, os não criados pela
public class TestHashcodeEquals { Fundação Eclipse), que funcionam no
private String nome; Eclipse 3.1, devem funcionar no 3.2. A
private int idade;
public int hashCode () { plataforma de plug-ins do Eclipse é um dos
final int PRIME = 31; principais pontos fortes da sua arquitetu-
int result = 1;
result = PRIME * result + idade; ra, sendo tradicionalmente muito estável
result = PRIME * result + ((nome == null) ? 0 : nome.hashCode()); (pelo menos em comparação com outros
return result;
} IDEs extensíveis).
public boolean equals (Object obj) {
if (this == obj) return true;
Houve alguns releases com alterações
if (obj == null) return false; incompatíveis que quebraram vários plug-
if (getClass() != obj.getClass()) return false;
final TestHashcodeEquals other = (TestHashcodeEquals )obj;
ins, especialmente as versões “ponto
“ponto zero”
if (idade != other.idade) return false; como o Eclipse 3.0. Mas isso tem mudado
if (nome == null) {
if (other.nome != null) return false;
}
else if (!nome.equals(other.no me)) return false; 5 Estasfuncionalidades
Estasfuncionalid
Estas funcionalidades
ades são uma tendência
tendência
tendên cia recente
recente
recen te
return true; e, aposto, a próxima “grande coisa” na área de IDEs. O
} NetBeans também vai acelerado nessa direção, com o
}
NetBeans Collaboration Project.

Magazine • Edição 37
26  Java Magazine
 bast ante, graç
 bastante, graças
as a melh
melhoria
oriass cont
contínua
ínuass capacidades. A opção ...>Ins-
(desde o 3.0) do PDE e da arquitetura de talled JREs>Execution Envi-
plug-ins; em especial, novas facilidades ronments (Figura 7) mostra
para flagrar plug-ins que utilizam classes uma lista de “ambientes
internas do Eclipse que não são APIs de execução”, que são as
públicas e não deveriam ser usadas por definições de plataforma
plug-ins. Muitos dos casos de “plug-in reconhecidas pelo Eclipse.
quebrado pelo novo Eclipse” são culpa dos Por exemplo, o ambiente
autores dos plug-ins,
plug-ins, e não
n ão dos projetos do “J2SE-1.2”
“J2SE-1 .2” é qualquer
qua lquer JDK ou
eclipse.org!  JRE compatível com a pla-
Parece que todos estes esforços de arquite-
arqu ite- taforma Java 2, ou seja, um
tura renderam resultado,
resu ltado, pois o número de  JDK/JRE
 JDK/ JRE 1.2.0 ou superior.
problemas de compatibilidade que tive com Como mostrado na figura, o Figura 6. Gerador de hashCode()  e equals(), onde podemos
plug-ins de terceiros, durante todo o ciclo de Eclipse exibe todos os JREs escolher quais atributos são considerados para ambos os métodos.
desenvolvimento do 3.2, foi mínimo. Hoje cadastrados que são com-
não conheço nada que funcione no 3.1 mas patíveis com este ambiente.
a mbiente.
não no 3.2, e não vi nenhum plug-in que Também apresenta os “ per-
tenha precisado disponibilizar downloa
downloadsds  fect matches ” – opções com
separados para o Eclipse 3.1 e 3.2. coincidência exata da versão
principal; por exemplo, para

 2
o J2SE-1.2, isso incluiria os
 JRE/JDK
 JRE/JD K 1.2.0
1.2.0,, 1.2.
1.2.11 e 1.2.2,
mas não 1.3.0 e superiores.
A diferença mais impor-
Ambientes de execução tante entre um ambiente de
Em projetos complexos, pode ser difícil execução e um JRE é que o Figura 7. Ambientes de execução.
manter a mesma configuração para cada primeiro não é configurável.
desenvolvedor – diretórios de instalação O Eclipse determina automaticamente o downloads separados (Platform e JDT) 6,
do JDK, o próprio Eclipse, servidores de nível de compatibilidade de cada JRE, e e para contar com itens tão fundamentais
aplicações e bibliotecas em geral. O Eclipse os nomes dos ambientes de execução são como um construtor de GUIs, suporte a
conta com vários recursos para abstrair fixos. Projetos podem ser configurados  J2EE ou um profiler, era exigido instalar i nstalar
estas configurações, como variáveis de para depender de um ambiente, e não de um número muito grande de plug-ins. E
classpath, user libraries, e configurações um JRE, o que facilita o intercâmbio de para piorar a confusão dos iniciantes,
in iciantes, estes
de JRE/JDKs. Por exemplo, se um pro- projetos. A única opção que você pode fazer plug-ins são projetos independentes da
 jetoo prec
 jet precisa
isa do JDK 1.5, pode
pode-se
-se ir em é determinar, quando houver vários runti- Fundação Eclipse, com números de versão
Preferences>Java>Installed JREs>Add e mes compatíveis com a mesma plataforma, e cronogramas independentes.
apontar para a sua instalação local do JDK qual será o utilizado
utili zado (por default, o Eclipse  Já vi até pro progrgramamado
adore ress ex
exper
per ien
iente
tess
1.5, setando “ JRE name” para “JDK 1.5.0”. usará um perfect match
match). deixarem de aproveitar os benefícios das
Numa empresa ou equipe isolada, é viá- Os ambientes de execução também podem versões mais atuais de algum componente
vel pedir a todos os desenvol
dese nvolvedores
vedores que ser utilizados nas configurações de lança- do Eclipse, somente por impaciência de
façam esta configuração: pode-se instalar mento. E para criadores de plug-ins, o PDE acompanhar constantemente os novos
o JDK 1.5.0 em qualquer diretório, desde permite declarar o ambiente de execução releases de vários subprojetos e suas de-
que isso seja registrado no Eclipse com mínimo exigido por um plug-in, evitando pendências. Quem utiliza, util iza, por exemplo, o
o nome “JDK 1.5.0”. Mas há projetos em erros estranhos se for instalado um plug-in Web Tools Platform para J2EE, não pode
que é difícil padronizar até mesmo estas que exige, por exemplo o JSE 5, e for execu- atualizar
atuali zar para uma nova versão do Eclipse,
configurações de alto nível. Em projetos tado o Eclipse com um runtime
ru ntime 1.4.2.
1.4.2. antes que a nova versão correspondente do
envolvendo
envol vendo várias empresas (com parcei- WTP seja disponibilizada.

 1
ros, outsourcing etc.), ou em projetos open Em contrapartida, IDEs concorrentes
source e outros distribuídos globalmente, sempre ofereceram um instalador único
pode ser difícil impor até mesmo um pa-
drão mínimo de configuração do IDE.
6 A não ser que se baixasse o Eclipse SDK, não reco-
No caso das configurações de plataforma Callisto mendado por incluir muita coisa que a enorme maioria
 JSE (e também JME),
J ME), o Eclipse 3.2 encon-
e ncon- O Eclipse sempre teve um ponto fraco: dos usuários não precisa (o código-fonte completo do
trou uma solução de configuração por mesmo o IDE “Java básico” exigia dois Eclipse, e o PDE).

Edição 37 •  Java Magazine


Magazine 27
10 Mais do Eclipse 3.2

com todos os recursos essenciais (ou no sair na quinta-feira seguinte, e o GEF após 4. VE (Visual Editor) 1.2
caso do NetBeans, três instaladores, sem- somente 1-21-2 dias a mais. Além disso,
dis so, o Callis- 5. WTP (Web Tools Platform) 1.5
pre atualizados simultaneamente). to irá livrar os usuários
usuár ios de saber qual versão 6. BIRT (Business Intelligence and Re-
Por isso escolhi como novidade mais im- do plug-in A é compatível com a versão B do porting Tools) 2.1
2.1
portante do Eclipse 3.2 o projeto Callisto. plug-in C... 7. TPTP (Test and Performance Tools
Não, não se trata de mais um plug-in. O Platform) 4.2
Callisto é um
u m “meta-projeto”
“meta-projeto” de coordena- Instalando o Callisto 8. CDT   (C/C++ Development Tool)
ção de vários outros projetos, cujo objetivo
objet ivo Para testar o Callisto,
Call isto, comece baixando 3.1.0
é simples: sincronizar os releases dos 10 e instalando, da forma tradicional, só o 9. DTP (Data Tools Platform) 0.9
projetos mais importantes do eclipse.org, Eclipse Platform (não precisa nem mesmo 10. GMF  (Graphical Modeling
oferecendo instaladores e sites de update do JDT
JDT).
). Depois
Depois
Depois entre
entre em  Help>Sof
 Help>Software
tware Framework) 1.0
unificados para todos eles. Updates>Find and Install>Search for new
Tradicionalmente
Tradicionalmente,, já havia uma sincroni-  features to install . Voc
V
Você
ocêê vverá
eráá qu
er que
que,
e, além
além do
do Se esta sopa de letrinhas e números as-
zação razoável entre os principais projetos.
projeto s. tradicional “Eclipse.org update site”, existe sustava muitos iniciantes e aborrecia
aborrec ia até os
Por exemplo,
exemplo, se numa semana fosse decla- um “Callisto Discovery Site”. Selecione
Selec ione este veteranos, isso acabou, com o Callisto.
rado o Eclipse x.yMz, poderíamos contar site de update e clique em Finish. O Eclipse Entre no site de update e selecione as
com o milestone compatível do EMF na primeiro apresenta uma lista de mirrors; ferramentas que você precisa, ex.: WTP.
semana seguinte; o do GEF após mais selecione o mais próximo, e você verá algo Use o botão Select Required para detectar
uma semana; do VE dentro de outras 1-2 como o mostrado na Figura 8. e selecionar, se preciso, outros itens exi-
semanas, e do WTP em mais 2-3 semanas. As opções de update deste site seguem gidos (por serem dependências dos soli-
Esta ordem é dada pelas dependências; um versionamento do próprio projeto citados). Agora é só confirmar
confir mar e aguardar
por exemplo, como o GEF utiliza o EMF, Callisto, do qual até mesmo o núcleo do o download e instalação, sem risco de
uma vez declarado um u m milestone do EMF, Eclipse é um subprojeto (ainda que o “quebrar” a instalação do Eclipse devido
a equipe do GEF precisa de alguns dias principal deles). a uma mistura de versões incompatíveis
para adotar o novo EMF, migrar código O primeiro release, Callisto 1.0, será ou à falta de dependências.
dependente de APIs alteradas e resolver formado dos seguintes subprojetos: A combinação de recursos dos dez
 bugs de integração. 1. Eclipse (Runtime, JDT e PDE) 3.2 projetos do Callisto 1.0 iguala ou supera
O Callisto se trata de um esforço redobrado 2 . E M F   (Eclipse
para que todos os projetos façam releases pa- Modeling Frame-
ralelos. Como resultado disso, o atraso entre work) / SDO (Service
cada dois releases dependentes diminuiu Data Objects) / XSD
sensivelmente
sensive lmente na geração encabeçada pelo (XML Schema Infoset

+
Eclipse 3.2. Por exemplo, percebi que após Model) 2.2.0
cada release do núcleo do Eclipse (sempre 3. GEF  (Graphical
feito numa sexta ou num sábado), o miles- Editor Framework)
tone correspondente do EMF costumava 3.2

Figura 8. Callisto Discovery Site.

Magazine • Edição 37
28  Java Magazine
qualquer outro IDE “tudo-em-um”.
“tudo-em-um”. Inclui várias ferramentas. Estas minúcias são
ferramentas para JEE, Swing, bancos de melhor ilustradas pelo documento “New eclipse.org
dados, geração de relatórios, testes e pro- and Improved”
Improved” (veja links), de tamanho
ta manho Projeto Eclipse.
filing, e até desenvolvimento de código provavelmente
provav elmente descomunal, que já deverá eclipse.org/callisto
nativo em C/C++. estar disponível para o 3.2-final quando Callisto, o release unificado do Eclipse.
Além disso, o Callisto oferecerá um você ler este artigo. Mas pen sando bem, eclipsecon.org/2006
download unificado, para quem quiser para aprender as novidades de um IDE, Conferência EclipseCon 2006, com muito material
todas ou a maioria destas ferramentas, ou o melhor é pôr as mãos à massa! disponível sobre as últimas novidades e próximos
não quiser que dezenas de desenvolvedo-
desenvolvedo- planos.
res na mesma empresa fiquem fazendo do- www28.cplan.com/javaone06_cv_124_1/ 
Osvaldo Pinali Doederlein
wnloads repetidos pelo Update Manager  sessions_catalog.jsp?ip=yes
 sessions_catalog.jsp?ip=yes
(opinali@gmail.com) é Mestre em
(~200 Mb para uma instalação total do Engenharia de Software Orienta- O JavaOne 2006 também possui muitas
Callisto 1.0). Este download unificado do a Objetos, membro individual apresentações sobre o Eclipse. Para baixá-las,
terá a metade do tamanho da soma dos do Java Community Process (tendo filtre com
c om keyword=”Eclips
keyword =”Eclipse”
e”. Se o site pedir,
pe dir, use o
tradicionais arquivos ZIP com compo- participado do Expert
Exper t Group da JSR-170:Tiger/J2SE login=”contentbuilder” e password=”doc789” (é um
nentes isolados, pois utilizará compressão 5.0), e trabalha como desenvolvedor e consultor. login/senha liberado para uso geral).
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 não
suporta muitos recursos importantes
“foraa da caixa”
“for caix a”,, e que é difícil
dif ícil de instalar
insta lar e
atualizar.
atualiza r. Também
Também eliminará
elimi nará a impressão
de instabilidade que pode ocorrer quando qua ndo
alguém faz uma instalação ou atualização
errada. Isto sem dúvida aumentará ainda
mais o apelo do Eclipse. Versões futuras
do Callisto provavelmente agregarão um
número ainda maior de subprojetos.

Conclusões
O Eclipse 3.2 não é um
u m update revolucio-
revolucio-
nário, como o 3.0,
3.0, que introduziu grandes
gra ndes
mudanças na arquitetura de plug-ins;
nem é um update tão crítico quanto o
3.1, que trouxe o suporte às novidades
de linguagem do JSE 5. Ainda assim, so-
mando o enorme número de melhorias,
temos um importante release que irá
certamente beneficiar qualquer usuário
atual do Eclipse. E para os iniciantes, as
facilidades de instalação e configuração
do Callisto são um ótimo motivo para
reavaliar este IDE.
Mesmo tendo descrito
descrito tantas
tanta s melhorias,
deixamos de mencionar várias coisas. O
PDE, SWT, JFace, Help e RCP também
trazem muitos avanços para desenvolve-
dores de plug-ins ou de aplicações ricas.
Mesmo no IDE Java, tivemos que passar
por cima de várias pequenas melhorias
em praticamente todos os componentes
do Eclipse – editor de código, debugger,
views auxiliares, Ant etc. – inclusive
algumas importantes, como o suporte
muito melhorado ao “CamelCase” em
Edição 37 •  Java Magazine
Magazine 29
Introdução ao
Primeiros passos com Java Message Service

A API JMS é uma das mais


estáveis de todo o Java
EE: a versão 1.1 não tem
atualizações desde os tempos
do Java EE 1.3, o que atesta
sua maturidade e funcio-
nalidade. Infelizmente os
desenvolvedores que ti-
veram sua formação em
microinformática, longe
dos grandes CPDs cor-
porativos e seus main-
frames, 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 aplicações webweb,, onde
há necessidade de atender a
requisitos extremos de per-
formance, escalabilidade,
manutenibilidade e segu-
rança. Mesmo componen-
tes EJB e Web Services
não oferecem os mes-
mos benefícios do JMS
nestes quesitos. E o
melhor de tudo, a
API é bem simples,
fácil de aprender,
e as configurações
necessárias em um
servidor de aplica-
ções Java EE são igual-
mente simples.

Magazine • Edição 37
30  Java Magazine
JMS Conceitos e motivação para
middlewares de mensagens,
e quando e como usar o
 JMS com o servidor de
aplicações Java EE livre mais
utilizando o JBoss popular do mercado

FERNANDO LOZANO

Este artigo apresenta uma introdução ao este e-mail que informa que a compra foi carga de trabalho maior, se for possível
 JMS, com exemplos básicos, e demonstra realmente aceita, o pagamento efetuado e a “atrasar” algumas operações para reali-
como rodar os exemplos no JBoss 4 (mas entrega agendada. Antes dele, há a possibi- zá-las depois em conjunto. Por exemplo,
acreditamos que todos os códigos funcio- lidade de ter havido algum problema com em vez de enviar pedidos isolados de
nem sem modificações em qualquer versão o pagamento (por exemplo, a operadora de validação de crédito para uma u ma operadora
desde a 3.0.8). cartão de crédito não aprovou o crédito), de cartão de crédito,
c rédito, são enviados
enviados pedidos
Alguns desenvolvedores acreditam er- com a compra (algum dos itens não está para validar de uma só vez dezenas de
roneamente que seja necessário usar EJB disponível em estoque, e terá que ser contas diferentes.
para usufruir do JMS, talvez por causa entregue mais tarde) ou com o envio (um • Tolerância a falhas: A loja virtual não
da existência dos Message-Driven Beans, endereço no interior pode demorar mais e controla os sistemas das instituições
atrelados ao JMS na especif icação EJB. Na custar mais caro para os correios). financeiras, dos produtores de mercado-
verdade,, o serviço
verdade serv iço e as API do JMS são to- Muitos visitantes pensam que sites como rias, nem dos correios e outras empresas
talmente independentes dos EJBs. Pode-se Amazon (e outros portais de comércio ele- que fazem a entrega (couriers). Se algum
fazer uma analogia com os Entity Beans, trônico) processam as compras de forma deles estiver indisponível, ou momenta-
que permitem persistência em bancos de on-line. Mas na verdade eles apenas regis- neamente saturado, o processamento em
dados via JDBC, mas nada impede o desen- tram o pedido. Outro sistema, operando  batch pode ser re-executado mais tarde,
volvedor de usar JDBC diretamente, sem na retaguarda da loja virtual, é quem sem que o comprador tome conhecimento
passar por EJBs. Reforçando esta indepen-
i ndepen- efetivamente processa
proce ssa a ordem de compra. disto. Então a loja não deixa de vender por
dência entre o JMS e EJBs, os exemplos de Isto traz para o site vários benefícios: causa de problemas de comunicação ou
código neste artigo serão de clientes JMS • Tempo de resposta menor: Como o problemas locais nos sistemas das outras
independentes, e não EJBs. registro do pedido não tem que aguardar empresas.
pelo OK da instituição financeira
fina nceira que for- • Segurança: Uma vez que o sistema da
Porque usar messaging middlewares nece o crédito, nem pelo OK da empresa loja virtual não necessita de acesso direto
Quem já fez uma
u ma compra em sites como que realmente fornece o produto (já ouviu aos bancos de dados de estoques, agenda-
amazon.com deve ter percebido que, logo falar de “lojas sem estoque”?), o site pode mento de entrega etc., e sim apenas a um
após o checkout (confirmação da compra), responder ao comprador de forma bem  banco de dados onde é registrado o pedido
é enviado um e-mail confirmando os deta- rápida. E o comprador sai satisfeito com de compra (é aqui que entra o messaging
lhes da compra, a forma de pagamento e o um “OK, sua compra foi efetuada” que middleware), todos os sistemas internos da
endereço de entrega. Algum tempo depois, na verdade significa apenas “sua compra loja podem estar protegidos
proteg idos do site por um
que pode variar de alguns minutos a algu- foi registrada, mais tarde iremos proces- firewall. Assim um cracker teria bem maismai s
mas horas, é enviado um segundo  e-mail sá-la”. Pense na quantidade de sistemas dificuldade em conseguir acesso a estes
confirmando as mesmas informações. ou bancos de dados que teriam que ser sistemas para roubar ou adulterar infor-
É fácil entender o motivo do primeiro e- acessados para confirmar uma ordem mações. Mais importante, o sistema que
mail: fornecer ao comprador um registro de compra, e no tempo de resposta que efetivamente processa as compras estaria
da operação realizada, e também uma isto iria gerar para um
u m grande volume de do lado de dentro do firewall corporativo,
oportunidade de contestar qualquer erro, compras simultâneas. mais protegido, em vez de estar no lado de
ou informar a possibilidade de fraude (ex.: • Maior volume de transações por dia: É  fora (dentro da DMZ1) exposto a ataques
outra pessoa fez uma compra usando o seu sempre mais eficiente agrupar operações diretos de crackers pela internet.
e-mail). Mas o segundo e-mail parece um para execução conjunta, em batch, do que
tanto redundante. executá-las uma a uma sob demanda. 1  DMZ, sigla em inglês
ingl ês para “zona desmilitariz
desmi litariz ada”, é o
O usuário mais atento, no entanto, irá O batch permite otimizar operações de termo usado por especialistas em segurança de rede para
a rede semi-protegida (mas aberta para acesso pela inter-
perceber que o texto no segundo e-mail rede, de disco e de processamento. Então net), onde uma empresa coloca seus servidores públicos
é um pouco diferente, e verificar que é o mesmo hardware pode sustentar uma de e-mail ou web.

Edição 37 •  Java Magazine


Magazine 31
Introdução ao JMS

utilizada pelos demais sistemas, como o


Internet Rede seriam bancos de dados de produtos e de
Corporativa Crédito clientes (não representados na figura).
O sistema da Frente de Loja se limita a re-
Usuário / Comprador gistrar os pedidos
ped idos no componente Ordens
de Compra, e o sistema de vendas pega os
pedidos registrados nele. Como os dois
sistemas não se comunicam diretamente,
eles não estão acoplados. E como o sistema
Vendas Estoque de vendas não precisa processar imediata-
mente um pedido registrado nas Ordens
Rede DMZ de Compra, a comunicação entre ele e a
Frente de Loja Frente de Loja se torna assíncrona.
Embora seja possível implementar o
componente Ordens de Compra utili-
zando um simples banco de dados, esta
Entrega não é a implementação mais usual, pois
Ordens de compra
exigiria trabalho extra (de programação)
nos sistemas que se comunicam por meio
do componente. Por exemplo,
exemplo, é necessário
nece ssário
Figura 1. Visão conceitual de uma grande loja virtual, em termos de componente
componentess de alto nível garantir que todas as ordens de compra
sejam processadas, e que nenhuma delas
Conceitualmente, o sistema da loja receptor (sem poder executar outras opera- seja processada em duplicidade. E deve
virtual segue a arquitetura apresentada ções). É o oposto da comunicação síncrona, ser prevista a possibilidade de falha do
na Figura 1. O sistema de Frente de Loja onde quem envia uma mensagem fica próprio componente, ou dos sistemas que
apenas registra ordens de compra que aguardando até que chegue uma resposta, interagem com ele, preservando a consis-
serão processadas posteriormente pelo e não realiza nenhum trabalho útil neste tência das informações armazenadas.
verdadeiro Sistema de Vendas. E o Sistema meio tempo. É fácil perceber que é síncrona A implementação mais usual de um
de Vendas
Vendas é quem interage com os sistemas
sistema s a comunicação entre um navegador web e componente como o Ordens de Compras
de Crédito, Estoque e Entrega. Estes últi- um servidor
serv idor web,
web, ou entre dois objetos
obj etos Java é por meio de um middleware de mensagens.
mos freqüentemente são sistemas externos de uma aplicação. Esse middleware é o responsável por agir
à empresa que mantém a loja virtual. como intermediário na comunicação as-
As principais características desta ar- Se o sistema de vendas é desacoplado da síncrona entre dois sistemas desacoplados
quitetura é que os dois sistemas (Fren- Frente de Loja web, fica fácil fazer
faze r com que – e, no processo, garantir a coerência e
te de Loja e Vendas) são totalmente ele processe também ordens de compras integridade desta comunicação, poupando
desacoplados e a comunicação entre eles obtidas por meio de um call-center  (por os desenvolvedores de aplicações dos
é assíncrona. Estes conceitos valem uma telefone) ou recebidas pelo correio. Não detalhes envol
envolvidos.
vidos.
explicação mais detalhada: será necessário modificar o sistema de A especificação JMS define
• O acoplamento entre dois componen- vendas para integrá-lo a outros tipos de como deve ser um middleware
tes de software (programas, bibliotecas, “frentes de loja”.
loja”. E, se a comunicação com de mensagens dentro da platafor-
classes) indica o quanto modificações em o sistema de vendas é assíncrona,
assí ncrona, ele pode ma Java EE. Servidores
S ervidores Java EE devem
um deles podem provocar a necessidade estar fora do ar (para sofrer upgrade, por fornecer este componente para obter a
de modificações no outro. Se dois compo- exemplo) sem que isto implique em uma certificação. Desse modo, o recurso está
nentes são desacoplados, modificações em parada nas atividades das frentes de lojas, prontamente disponível para todos os
um deles não afetam
a fetam o outro. Na verdade,
verdade, que são quem realizam as vendas sob o desenvolvedores Java que já utilizam um
um dos grandes objetivos de todas as ponto de vista dos compradores. servidor como JBoss,
J Boss, Geronimo, Weblogic
práticas da Orientação a Objetos é reduzir O desacoplamento e a comunicação ou Websphere.
o acoplamento entre os componentes de assíncrona entre os sistemas de vendas Mas o conceito de middleware de men-
um software. e a Frente de Loja é possível graças ao sagens não foi criado
c riado no Java EE. Produtos
• A comunicação assíncrona existe sem- componente Ordens de Compra Compra,, ilustrado como o MQ Series da IBM existem desde
pre quando quem envia uma mensagem no diagrama. Este componente não é um os tempos do mainframe, e mesmo a linha
não fica esperando por uma resposta do sistema, mas sim parte da infra-estrutura Microsoft já tinha
tin ha o seu componente deste

Magazine • Edição 37
32  Java Magazine
tipo, chamado Microsoft MQ ( Message
 Mes sage quer tipo de stream
strea m desejado, por exemplo Na verdade,
verdade, uma mensagem é endereça-
Queue) antes mesmo da criação
c riação do .NET. um ObjectInputStream . da a uma fila, de modo que as mensagens
  Os atributos são pares nome/valor
• sejam consumidas na mesma ordem em
Conceitos do JMS quaisquer definidos pela aplicação, e po- que foram entregues a esta fila. O JMS
Um serviço JMS, assim como todo midd- dem ser utilizados para configurar filtros prevê dois tipos de filas, chamados gene-
leware de mensagens,
mensagens, manipula informa-
infor ma- de seleção de mensagens, que permitem a ricamente de destinations : os queues e os
ções na forma de mensagens. O formato da um cliente consumir apenas um subcon- topics. A Figura 2 ilustra o funcionamento
mensagem – quais informações
informaçõe s ela contém  junto das mensagens entregues ao JMS. de cada um deles.
e como ela deve ser interpretada – é opaco  As propriedades são informações utili-
• Um queue (pronuncia-se “kíu”) é uma
para o JMS. Ou seja, o JMS apenas cuida zadas pelo próprio JMS, como a prioridade fila no sentido usual, em que existe apenas
de armazenar as mensagens até que sejam da mensagem e outros parâmetros de QoS uma cópia de cada mensagem, e o primeiro
consumidas por algum cliente; ele não (qualidade de serviço). Com elas é possí- cliente a consumir a mensagem retira a
interpreta de nenhuma forma as informa- vel, por exemplo,
exemplo, dizer ao JMS
J MS que ele pode mensagem da fila. Queues são perfeitos
ções contidas nas mensagens. Isto permite perm ite descartar a mensagem caso o servidor
serv idor seja para situações onde uma mensagem
men sagem deve
inclusive que um serviço JMS atenda a reiniciado. ser processada uma única
ú nica vez, como uma
clientes não-Java, ou que middlewares
m iddlewares de ordem de compra em uma loja virtual.
mensagens implementados com outras No JMS, uma mensagem não é ende-  Já um topic trabalha com o conceito de
tecnologias possam ser transformados em reçada a um destinatário específico (ao assinaturas (subscriptions). Cada assina-
serviços JMS. contrário do que acontece com correio tura recebe uma cópia da mensagem, o
Uma mensagem no JMS possui proprie- eletrônico, por exemplo). Qualquer cliente
cl iente que o torna adequado como mecanismo
dades ( properties
 propertie s), atributos ( attributes) e  JMS pode consumir qualquer mensagem, para propagação de eventos pela rede; por
um corpo (body): independentemente de quem foi o cliente
cl iente exemplo em um sistema de monitoração
•  A informação em si da mensagem está responsável por armazenar a mensagem que deve informar a diversos operadores
no seu corpo, que no JMS pode ser um originalmente. As mensagens são essen- sobre a falha de um servidor de rede. O
array de bytes, um texto ( String ), um mapa cialmente transitórias, deixando de existir fato de um dos assinantes consumir
consumi r a sua
( java. util. Map ) ou um objeto serializado. uma vez consumidas. Assim, o serviço cópia da mensagem não afeta os demais
Caso o volume de informações contidas  JMS não substitui
substitu i um banco de dados ou assinates, que têm suas próprias cópias
na mensagem seja muito grande, há ainda outro mecanismo
mecani smo de persistência. Uma im- para consumir.
a possibilidade de se acessar o corpo da plementação do serviço JMS tem liberdade
mensagem como um stream do  java.io, que total em relação a onde e como armazenar
armazena r
a aplicação pode aninhar dentro de qual- uma mensagem até que ela seja consumi-   A configuração padrão do JBoss utiliza o HSQLDB,
2

mas ela pode ser modificada para usar outros bancos de


da, e vários deles usam bancos de dados dados ou mesmo arquivos simples, sem perda de funcio-
embutidos para fazer isso 2. nalidade.

Queue JMS

Produtor Consumidor
Mensagem Mensagem Mensagem
de de
A B C
Mensagens Mensagens

Topic JMS
Assinante
Mensagem Mensagem Mensagem de
A B C Mensagens
Produtor
de
Mensagens
Mensagem Mensagem Mensagem Assinante
A B C de
Mensagens

Figura 2. Tipos de destinos JMS, queues e topics

Edição 37 •  Java Magazine


Magazine 33
Introdução ao JMS

 Como uma mensagem não pode ser alterada  javax.jms.ConnectionFactory na árvore JNDI3 do  por inj
injeção
eção de depe
dependên
ndências
cias,, via a anot
anotação
ação
depois de colocada em um queue ou topic, espera- servidor de aplicações. Isto é bem coerente @ Resource.
se que um serviço JMS não duplique mensagens, com o Java EE em geral, onde todos os
mas apenas registre para cada mensagem quais tipos de recursos, como DataSource s JDBC Mais especificamente, o cliente JMS
assinantes já a consumiram e quais ainda não o e interfaces Home para EJBs devem ser deve localizar no JNDI uma subinterface
fizeram, de modo a poupar memória e/ou disco localizados via JNDI. de ConnectionFactory  específica para o tipo
no servidor. Desde que conceitualmente tudo fun- de fila sendo manipulada, no caso um
cione como se cada assinante tivesse sua própria  Em servidores Java EE 5.0, será possível substi- queue, portanto a busca espera encontrar
cópia de cada mensagem, qualquer otimização tuir a busca explícita no JNDI (método lookup() ) um  javax.jms.Queue
 javax.jms.QueueConnectio nFactory.
ConnectionFactory
é permitida.

Listagem 1. EnviaFila.java - Cliente que envia uma mensagem de texto para um queue JMS
O JMS prevê dois tipos de assinaturas:
duráveis e não-duráveis. Em uma assina- import javax.jms.*;
import javax.naming.*;
tura não-durável, o assinante deve estar
executando no momento em que uma public class EnviaFila {
public static void main(String[] args)
nova mensagem é entregue ao topic, caso throws NamingException, JMSException
{
contrário ele não receberá a mensagem. // obtém referências ao QueueConnectionFacto ry e à fila via JNDI
Um exemplo de uso de assinaturas não- Context jndiContext = new InitialContext();
QueueConnectionFactor y connectionFactory =
duráveis seria um display de cotações   (QueueConnectionFactory)jndiContext.lookup(“ConnectionFactory”);
da bolsa de valores. Caso o display esteja Queue queue = (Queue)jndiContext.loo kup(“queue/testQueue”);

desligado,, não há necessidade de se reen-


desligado // conecta à fila e inicia uma sessão
QueueConnection connection =
viar as mensagens perdidas quando
qua ndo ele for   connectionFactory.createQueueConnection();
novamente ligado. QueueSession session = connection.createQueu eSession(false,
Session.AUTO_ACKNOWLEDGE);
 Já uma assinatura durável
durável garante que o
// envia uma única mensagem de texto
cliente que é dono da assinatura não perca QueueSender sender = session.createSender(qu eue);
nenhuma mensagem até que decida cance- TextMessage message = session.createTextMess age();
message.setText(“Oi via JMS”);
lar a assinatura. Neste caso, o serviço JMS   sender.send(message);
deve armazenar uma cópia da mensagem // libera recursos
até que todos os assinantes do topic tenham   sender.close();
  session.close();
consumido a mensagem. connection.close();
}
}
A API JMS
Vamos conhecer
conhec er a API JMS por meio de
exemplos. A Listagem 1  apresenta um
cliente simples, que insere uma mensa- ConnectionFac tor y Destination Message
gem de texto dentro
dentro de uma fila chamada
cha mada
“queue/
queue/testQueue”
testQueue”.. Esta fila é pré-definida
pré- definida QueueConnectionFactory Queue TextMessage

na instalação do JBoss. Assim, o exemplo


TopicConnectionFactory Topic BytesMessage
pode ser executado sem necessidade de
nenhuma configuração prévia no servi- Connec tion Session StreamMessage
dor. Mais adiante será apresentado como
compilar e executar este cliente. QueueConnection QueueSession MapMessage
Todo cliente JMS, independente de ser
um produtor ou consumidor de men- TopicConnection TopicSession ObjectMessage
sagens (e nada impede que ele desem-
MessageProducer MessageConsumer JMSException
penhe ambos os papéis) deve obter um
QueueSender QueueReceiver
3   O JNDI (Java Naming and Directory Interface) é um
serviço e API padrão do Java EE que permite localizar re-
cursos locais ou remotos baseado em um nome textual. TopicPublisher TopicSubscriber
Estes recursos podem ser desde objetos Java até usuários
e servidores de rede. O cliente do JNDI é parte do Java
SE, e do servidor integrado ao serviço JMS, podendo ser
compartilhado por outros serviços Java EE. Figura 3. Principais interfaces e classes da API JMS

Magazine • Edição 37
34  Java Magazine
Edição 37 •  Java Magazine
Magazine 35
Introdução ao JMS

Listagem 2. RecebeFila.java - Cliente que recebe uma mensagem de texto de um queue JMS
O QueueReceiver  deve ser iniciado (com o
método start()) antes que seja possível rece-
import javax.jms.*;  ber mensagens por ele. Depois o exemplo
import javax.naming.*;
fica em um loop infinito
in finito consumindo men-
public class RecebeFila {
public static void main(String[] args) sagens, até que seja terminado utilizando
throws NamingException, JMSException os recursos do seu sistema operacional,
{
// obtém referências ao QueueConnectionFacto ry e à fila via JNDI como o Ctrl-C. (É claro, em uma aplicação
Context jndiContext = new InitialContext();
QueueConnectionFactor y connectionFactory = real deve ser prevista uma forma ordenada
(QueueConnectionFactory)jndiContext.lookup(“ConnectionFactory”); de se encerrar o cliente e limpar os recur-
Queue queue = (Queue)jndiContext.lookup(“queue/testQueue”);
sos JMS inicializados por ele.)
// conecta à fila e inicia uma sessão
QueueConnection connection =
connectionFactory.createQueueConnection(); Compilando e testando
QueueSession session = connection.createQueu eSession(false,
Session.AUTO_ACKNOWLEDGE); os exemplos no JBoss
// recebe mensagens
Para que seja possível compilar os
QueueReceiver receiver = session.createReceiver (queue); dois exemplos para o JBoss, basta in-
  connection.start();
while (true) { serir no classpath do sistema o pacote
TextMessage message = (TextMessage)receive r.receive(1); client/jboss-j2ee.jar fornecido com o servidor.
if (message != null)
System.out.println(“R ecebi: “ + message.getText()); Outros servidores
serv idores Java
Java EE poderão forne-
}
cer as interfaces da API JMS em um pacote
// libera recursos no encerramento da JVM com nome diferente; ainda assim deverá
}
} ser possível rodar os mesmos programas
em qualquer servidor Java EE (inclusive
usando os mesmos .class compilados com o
É necessário localizar no JNDI também  Em uma aplicação real, as várias chamadas a  JBoss), desde que seja previamente
previamente criado
a fila desejada, no caso um  javax.jms.Queue . close() estariam dentro de um bloco finally  , para o queue “queue/testQueue”.
O ConnectionFactory é utilizado para se obter garantir sua execução e a liberação de recursos A execução dos exemplos é um pouco
uma conexão à fila, e esta conexão é utili- mesmo em caso de exceções. mais complicada. Primeiro, o servidor
zada juntamente com o objeto fila (no caso  JBoss deve estar em execução, utilizando
utili zando
um Queue) recuperado anteriormente do Toda API JMSJ MS é “espelhada” em termos a configuração “default” inalterada em
 JNDI para iniciar uma sessão ( Session). de queues e topics, gerando dois conjuntos relação ao pacote  jbos  jboss- 4.0. 3SP1.zip   (ou
s-4.0.
A sessão é então utilizada para instanciar paralelos de interfaces (veja as principais mais recente) fornecido em jboss.org. Além
um  javax.jms.QueueSe nder, e este por sua vez
 javax.jms.QueueSender interfaces da API na Figura 3). Dessa for- disso, vários pacotes JAR contidos na pasta
é utilizado para enviar uma mensagem de ma, um cliente que envie ou receba men- client do JBoss devem ser acrescentados ao
texto (TextMessage). Por fim, o exemplo libe- sagens de um queue é praticamente igual classpath.
ra os recursos vinculados ao servidor JMS, ao que envia ou recebe de um topic. Na Para facilitar, os fontes para download
no caso o Sender, a sessão e a conexão. verdade,
verdad e, é possível usar
usa r as superinterfaces deste artigo incluem um buildfile para
(como Destination , Connection e Session) para o Ant com alvos para compilar todos
criar clientes “genéricos”, que podem os exemplos e executar cada um deles.
trabalhar indistintamente com queues e O buildfile configura para a execução
topics. Apenas as interfaces de mensa- dos exemplos todos os pacotes JAR na
gens não são especializadas para queues pasta client do JBoss, o que não atrapa-
e topics. lha – apenas coloca no classpath alguns
A Listagem 2 mostra o cliente comple- pacotes que não seriam estritamente
mentar ao apresentado na Listagem 1, necessários.
que recebe (consome) uma mensagem do Então, basta editar o arquivo build.
queue com nome “queue/testQueue”. xml e modificar o valor da propriedade
Observe a simetria entre este exemplo  jboss  para indicar o diretório correto de
e o anterior. O código para localizar o instalação do JBoss
J Boss em seu computador.
computador.
ConnectionFactory e o Queue  é o mesmo, assim E, com o JBoss ativo, digitar os comandos
como a instanciação do Session e do Message. destacados em negrito
negrito a seguir
segui r (o sinal $
A diferença está na instanciação de um representa o prompt de comandos e, claro, cla ro,
QueueReceiver   em vez de um QueueSender . não deve ser digitado):

Magazine • Edição 37
36  Java Magazine
$ ant compila de envio de mensagens (porque o exemplo  jboss.mq.
 jboss .mq.serv
server.jmx.Topi c”>   indesejados.
er.jmx.Topic”> Na
Buildfile: build.xml
de recepção de mensagens fica em um verdade, todo o arquivo pode ser remo-
init: loop infinito). E nesta outra janela, digite vido sem prejuízo para o funcionamento
compila: o comando ant recebe. A saída será como do serviço JMS do JBoss. O único cuida-
[javac] Compiling 10
10 source files to
/home/fernando/JavaMagazine/jms/jmsjboss/classes mostrado a seguir: do a se tomar é não remover a fila DLC
Buildfile: build.xml
(“dead letter queue”). Felizmente, esta
BUILD SUCCESSFUL
Total time: 6 seconds init: fila é definida
defin ida em outro arquivo, chamado
recebe:  jbossmq-service.xml, que não deve ser edita-
$ ant envia … warnings
warnings sobre logging
Buildfile: build.xml [java] Recebi: Mensagem 1 do a não ser por profundos conhecedores
[java] Recebi: Oi via JMS da arquitetura interna do JBoss.
init: Para criar uma nova fila, basta criar um
envia:
[java] log4j:WARN
log4j:WARN No appenders
appenders could be be found for Uma atualização (refresh) da página da arquivo com um nome qualquer, e o sufixo
logger (org.jboss.mq
(org.jboss.mq.referencea
.referenceable.SpyConne
ble.SpyConnectionFactory
ctionFactory fila no JBoss
J Boss Web Console deverá mostrar -service.xml  (ex.: minhaFila-service.xml), se-
ObjectFactory).
[java] log4j:WARN
log4j:WARN Please
Please initialize the log4j system properly.
properly. a fila com zero mensagens mens agens (veja o valor de de guindo o modelo na Listagem 3, e copiá-lo
message count). Caso o exemplo de envio para a pasta deploy da sua configuração
BUILD SUCCESSFUL seja executado novamente, o receptor irá do servidor (na configuração padrão,
Total time: 3 seconds
acusar imediatamente o recebimento da server/default/deploy). O JBoss irá processar
As advertências geradas pelo Log4j decor- nova mensagem, até que ele seja terminado o arquivo e imediatamente ativar todas as
rem do fato do JBoss utilizar
utiliza r internamente pelo fechamento da janela ja nela de comando, ou filas (queue ou topic) definidas por ele.
este framework de logging (apresentado pressionando-se Ctrl-C. Será possível então modificar os exem-
aqui na Edição 35). Se for fornecida uma plos apresentados nas Listagens 1 e 2 para
configuração
configu ração adequada para o Log4j, será Configurando novas filas JMS no JBoss que eles usem a fila “queue/
queue/minminhaFila”
haFila” em
possível ver mensagens de depuração dos Caso se deseje remover as filas con- vez de “queue/testQue
“queue/testQueue” ue”,, e será também
ta mbém
clientes JNDI e JMS do JBoss. figuradas por padrão no JBoss, basta possível verificar a presença de mensagens
Antes mesmo de se executar o receptor editar o arquivo server/default/deploy/jms/  na fila por meio do JBoss Web Console.
de mensagens, já é possível confirmar  jbossmq
 jbos smq-de -destin
stinatio
ations-
ns- ser vice .xml   e remo-
vice.xml
que a mensagem foi recebida e armaze- ver os elementos <mbean code= ”org ”org.jboss.
.jboss.  O JBoss sempre acrescenta ao nome JNDI de
nada pelo serviço JMS do JBoss. Basta mq.server.jmx.Queue”> ou <mbean code=”org. uma fila o prefixo “queue/” ou “topic/”, conforme
abrir o JBoss Web Console, pela URL
http://127.0.0.1:8080/web-console/  e
  e então
expandir o nó  J2EE DomDomainains/
s/ Man ager / 
 JBo ss
ss/J
/J2EE
2EE Re
Resou
source
rces/
s/ Lo
LocalJ
calJMS
MS// Que ue
ues/ 
s/ 
testQueue. A Figura 4 ilustra o resultado
esperado.
A primeira tabela apresenta estatísticas
acumuladas em todas as execuções do
servidor, até que elas sejam explicitamente
expl icitamente
zeradas (o que é feito clicando o lin k Reset
Stats no final da página). A segunda tabela
apresenta
apresen ta estatísticas da execução corrente
do JBoss.

Estas estatísticas são definidas pela JSR-77 e


 portanto estarão disponívei
disponíveiss da mesma forma
(porém sob um caminho diferente na árvore de
objetos gerenciados JMX) em qualquer outro
servidor de aplicações Java EE.

Para fechar o ciclo, temos que executar o


cliente que consome a mensagem na fila.
Abra outra janela de comandos, indepen- Figura 4. JBoss Web Console após a execução do primeiro exemplo, indicando a presença de uma mensagem na fila
dente da que foi utilizada para o exemplo “queue/testQueue” aguardando para ser consumida

Edição 37 •  Java Magazine


Magazine 37
Introdução ao JMS

o tipo de fila. Este prefixo não deve ser incluso exemplo fornecidas com o JBoss demons-
no nome da fila no arquivo de configuração tram como fazer estas configurações, se-
fila-service.xml. gundo o modelo de segurança declarativa
padrão do Java EE (apresentado nesta co-
Implementando segurança luna na Edição 23). Reunindo
Reuni ndo os exemplos
exemplos
Este foi um exemplo trivial de criação de deste artigo, os exemplos fornecidos com
fila. Em aplicações reais,
reai s, haverá necessida- o JBoss, e o artigo sobre segurança citado,
c itado,
de de configurar regras de autenticação o leitor não deverá ter dificuldades em
e de controle de acesso, para definir que configurar queues e topics seguros.
clientes (ou usuários) podem enviar e re-
ceber mensagens de cada fila. As filas de Outros recursos da API JMS
Os exemplos disponíveis para download
Listagem 3. minhaFila-service.xml – Arquivo de configuração para definir uma nova fila JMS no JBoss apresentam vários outros recursos da API
<?xml version=”1.0” encoding=”UTF-8”?>
 JMS, que serã
serãoo de fác
fácilil ente
entendi
ndiment
mento, o,
<server> especialmente para os desenvolvedores
<mbean code=”org.jboss.mq.se rver.jmx.Queue” ser vlets 4. Eles
 já habituados à criação de servlets
  name=”jboss.mq.destination:service=Queue,name=minhaFila”>
<depends optional-attribute-na me=”DestinationManager” > ilustram:
jboss.mq:service=DestinationManager</depends> •  Envio e recebimento de mensagens em
<depends optional-attribute-na me=”SecurityManager”>
jboss.mq:service=SecurityManager</depends> topics (Publica.java e Assina.java);
<attribute name=”MessageCounte rHistoryDayLimit”>-1</a ttribute> •  Recebimento assíncrono de mensagens
  </mbean>
</server> por meio de um event listener ( RecebeAs-
sincrono.java e AssinaAssincrono.java);
Listagem 4. RecebeAssincrono.java – cliente que recebe assincronamente mensagens de uma f ila JMS
RecebeAssincrono.java
•   Adição de atributos a uma mensa-
import javax.jms.*; gem, e o seu uso posterior para filtrar
import javax.naming.*;
as mensagens recebidas por um outro
public class RecebeAssincrono { cliente JMS ( EnviaComPropriedade.java e
private class RecebeUmaMensagem implements MessageListener {
public void onMessage(Message msg) {
RecebeComSeletor.java);
try { •   Criação de assinaturas duráveis, de
TextMessage message = (TextMessage)msg; modo que o cliente irá receber mensa-
if (message != null)
System.out.println( “Recebi: “ + message.getText()); gens enviadas para um topic mesmo que
} ele (o cliente) não esteja ativo no mo-
catch (JMSException e) {
System.out.println(“E rro ao receber mensagem:” + e); mento em que a mensagem foi entregue
  e.printStackTrace(); ao servidor JMS ( PublicaDuravel.java e
}
}  AssinaDuravel.java);
}; • Como fornecer
fornecer login e senha para cone-
cone-
public RecebeAssincrono() throws NamingException, JMSException { xão segura a uma fila ( AssinaDuravel.java
 AssinaDuravel.java,
// obtém referências ao QueueConnectionFactor y e à fila via JNDI  já citado nesta relação).
// ... código omitido por ser igual à listagem 2 ...

// conecta à fila e inicia uma sessão Como afirmamos


afirmamo s no início, nenhum dos
// ... código omitido por ser igual à listagem 2 ...
exemplos para download envolve EJBs,
// recebe mensagens mas os interessados em usar JMS com
QueueReceiver receiver = session.createReceiv er(queue);
receiver.setMessageList ener(new RecebeUmaMensagem());
essa tecnologia podem consultar o quadro
  connection.start(); “JMS e EJBs”; o código dos exemplos po-
} derá ser aproveitado com modificações
public static void main(String[] args) throws mínimas.
NamingException, JMSException, InterruptedException
{ 4 Por exemplo, o conceito de atributo em uma mensa-

new RecebeAssincrono(); gem JMS é o mesmo de atributo da requisição HTTP.


while (true)
  Thread.sleep(10000);   Os demais exemplos apenas trocam as classes de
5

} queue pelas classes de topic, ou acrescentam uma ou


} duas chamadas novas a métodos da API JMS.

Magazine • Edição 37
38  Java Magazine
“queue/testQueue” usada nos exemplos Conclusões
 JMS e EJB anteriores, portanto pode ser experi- Este artigo apresentou conceitos sobre
mentado em conjunto com o exemplo middlewares de mensagens, e os primeiros
D esenvolvedores interessados em
usar o JMS junto com EJBs também
poderão utilizar os e xemplos fornecidos,
EnviaFila.java.
Observe primeiramente a classe aninha-anin ha-
passos para trabalhar com a API JMS e a
configuração e monitoração do serviço
com pequenas modificações. da (inner class) RecebeUmaMensagem, que  JMS no servidor JBoss. Procura
Procuramos
mos não
Um Message-Driven EJB (MDB) sempre implementa a interface MessageListener do duplicar o conteúdo de outros exemplos
consome mensagens de forma assín-
crona, de modo que seu código nada
 JMS. Este estilo
esti lo de programação, usando
u sando e tutoriais disponíveis na internet, mas
mais é do que uma versão resumida de classes aninhadas,
anin hadas, é basicamente
basicamente o mesmo sim reunir em um só lugar todo o que o
RecebeAssincrono.java ( Listagem 4 ) . utilizado em aplicações Swing. O método leitor necessita para iniciar o desenvolvi-
O MDB basicamente se limita a imple- onMessage() da classe aninhada é chamado mento de aplicações JMS e dar uma idéia
mentar o método onMessage(), enquanto pelo JMS sempre que estiver disponível de situações onde o uso de JMS pode ser
que o container EJB é quem registra o uma nova mensagem. A própria mensa- vantajoso. Dada a simplicidade da API e
MDB como listener do QueueReceiver  (ou
gem é passada como argumento para o sua maturidade
matur idade,, não há motivos para não
TopicSubscriber ) configurado no descritor
de deployment. método, de modo que não há necessidade usá-la sempre que houver uma oportuni-
Já um EJB que envia mensagens para de ser ler explicitamente a mensagem. dade!
uma fila pode ser de qualquer tipo (mas Depois temos o construtor da classe
em geral será um Session EJB ), e utilizará RecebeAssincrono, que contém código bastan-
exatamente o mesmo código de cliente te semelhante ao presente no método main()
JMS apresentado nos exemplos de envio  java.sun.com/products/jms
 java.sun.com/products/jms
do exemplo RecebeFila.java (Listagem 2). Página da Sun sobre JMS, incluindo artigos
de mensagens.
O uso de seletores com MDBs não exige
A diferença está na chamada ao método e tutoriais
o uso direto da API JMS, pois a condição setMessageListener()  do QueueReceiver , que as-
 jboss.org
do seletor é especificada n o descritor de socia uma instância da classe aninhada
ani nhada ao Downloads e documentação do servidor JBoss
deployment do EJB. ( Seletores são filtros evento que indica a chegada de uma nova
de mensagens baseados nas proprieda- mensagem na fila. Mas os eventos só serão  jcp.org/en/jsr/detail?id=914
 jcp.org/en/jsr/detail?id=914
des das próprias mensagens) Especificação JMS, muito útil especialmente para
efetivamente recebidos após a chamada ao obter o Javadoc da API
Na verdade, o uso de JMS com EJBs é
tão simples e tão parecido com o uso de
método start() do QueueConnection.
JMS sem EJBs que não achamos neces- O método main()  deste exemplo se li-
 javamagazine.com.br/downloads/jm37/
 javamagazine.com.br/downloads/jm37/
sário incluir exemplos específicos para mita a criar uma instância da classe  jm-jmsjboss.zip
download. Qualquer desenvolvedor com RecebeAssincrono , e depois fica em um loop
conhecimento de EJBs terá à mão vários infinito para que a instância possa aguar-
exemplos de Message-Dr iven EJBs, e este dar pelos eventos do JMS. Fernando Lozano
artigo fornece o conhecimento básico (flozano@javamagazine.
sobre a API JMS que ele necessitará para com.br, www.lozano.eti.br )
entender estes exemplos.   Mesmo que haja a opção de se receber trabalha há mais de 10 anos
mensagens sincronamente (chamando com desenvolvimento de sistemas
receive() ), ou assincronamente
assincronamente (por meio de um de informações e integração de redes, sendo um dos
Vamos examinar aqui o exemplo MessageListener  ), a comunic
comunicação
ação entre o produ-
produ- pioneiros do uso do Software Livre no Brasil. Dentro
RecebeAssincrono.java (Listagem 4), pois tor e o consumidor de mensagens é sempre assín- da comunidade, atua como Conselheiro do LPI
ele é o único que muda significativamen- Brasil, Webmaster
Webmaster da FSF e Community Manager do
crona. A comunicação síncrona para recepção de
Java.net. Atualmente
Atualmente é consultor assoc iado à Neki
te em relação aos já apresentados 5. Este mensagens é apenas entre o cliente consumidor
Technologies ( www.neki.com.br ).).
cliente recebe mensagens da mesma fila de mensagens e o serviço JMS.

Edição 37 •  Java Magazine


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

A possibilidade de customização é,
sem dúvida, um dos pontos que
devem ser considerados durante
a escolha de uma
u ma ferramenta de desenvol-
desenvol-
vimento. O Eclipse oferece muitas facilida-
toa que se tornou
tor nou líder 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.
referirmos ao IDE e não ao projeto como
um todo) é constituído de um pequeno
núcleo e um imenso
imen so conjunto de plug-ins,
que trabalham juntamente
junta mente para fornecer as
diversas funcionalidades da IDE 1.
des de personalização
personali zação e extensão, e não é à A plataforma Eclipse gerencia todo o
A arquitetura do Eclipse ciclo de vida dos plug-ins, sendo respon-
Grande parte do sucesso do IDE Eclipse sável por localizar, carregar e executar os
deve-se à sua arquitetura extensível (“uma plug-ins instalados. Quando o Eclipse é
IDE aberta e extensível para tudo iniciado ele “descobre” quais plug-ins es-
e nada em específico”). O tão disponíveis (procurando no diretório
Eclipse (neste artigo  plugins) e constrói um repositório, deno-
usaremos “Eclip- minado  plug-in registr y, que é utilizado
se” para nos posteriormente para carregar os plug
plug-ins
-ins2.
A Figura 1, adaptada da documentação 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 en-
tre suas partes, e é um ótimo exemplo de
arquitetura modular e extensível. Com a
exceção de um pequeno núcleo de runtime,
todas as outras partes do Eclipse são
plug-ins.
plug -ins. A customização
customi zação da IDE é conse-
guida estendendo-se seusseu s plug-ins, o que
é feito através de extension points (“pontos
de extensão”).
A idéia é simples: sempre que um
u m plug-in
deseja permitir a extensão ou a customi-
zação de uma de suas funcionalidades,
fu ncionalidades, ele
deve declarar um ponto de extensão. Os
pontos de extensão definem “contratos”

1 Como
Co mo não apenas
apenas
ape nas o Eclipse,
Eclips
Eclipse,mas
e,mas
mas diversas
divers
diversas
as IDEs
IDEs permi-
permi-
permi-
tem extensão de suas funcionalidades através da adição
de plug-ins, isso motivou o desenvolvimento da JSR-198
( A Standard Extension API for Integrated Development
Environments),), cujo objetivo é permitir que plug-ins
Environments
possam ser implementados independentemente da IDE
onde serão utilizados.

2O Eclipse
Eclilips
Ec psee não
não carrega
carre
carrega
ga os
os plug-ins
plug
plug-i
-ins
ns até
atéé que
at quee eles
qu eles
elessejam
seja
sejam
m
usados pela primeira vez, o que economiza recursos e mi-
nimiza o tempo que a IDE demora para iniciar.

Magazine • Edição 37
40  Java Magazine
Aprenda a criar plug-ins,

ra o Eclipse dos conceitos fundamentais


a um exemplo completo e
passo a passo, e tire ainda
mais proveito do Eclipse
Environment
ANDRÉ DANTAS ROCHA

(normalmente documentos XML e in- Além desses, dois outros plug-ins me-  O OSGi foi concebido originalmente para apli-
terfaces Java) que devem ser obedecidos recem atenção especial: o Workbench cações móveis, mas aos poucos tem sido adotado
pelos plug-ins que implementam a exten- (interface gráfica comum para recursos e  por aplicações fora
fora desse mercado.
mercado. Seu objetivo é
são/customização. É interessante notar ferramentas) e o Workspace (que gerencia  padronizar a maneira como os componentes
componentes de-
que o plug-in que está sendo estendido os recursos relativos aos projetos criados vem ser registrados em uma aplicação, permitindo
não conhece (nem precisa conhecer) cada pelo usuário). Extensões do Workbench que sejam carregados ou descarregados dinami-
implementação específica. Isso permite permitem alterar a “aparência” do Eclipse, camente. O OSGi tem ganhado bastante destaque
que plug-ins de diferentes autores traba- criando novas views3, menus e editores, ultimamente, e diversos projetos da Apache já
lhem conjuntamente com facilidade. enquanto que extensões do Workspace utilizam a tecnologia (ex.: Apache Directory).
Enquanto alguns plug-ins são extre- permitem interagir com novos recursos,
mamente complexos e compostos de como projetos e arquivos. Plug-ins podem ser
Plug-ins s er compostos de diver-
arquivos de diversos tipos, outros são sos tipos de arquivos (classes, imagens,
simplesmente bibliotecas Java que po- Estrutura de um plug-in  bibliotecas etc.), e incluem descritores com
dem ser utilizadas por outros plug-ins. A partir da versão 3.0 do Eclipse, a des- informações sobre suas características
A plataforma Eclipse é organizada em coberta e a ativação de plug-ins
plug-ins passaram
passa ram (versão, classpath, pacotes exportados,
níveis, com plug-ins
plug-ins de “baixo nível” for- a ser comandadas por um mecanismo pontos de extensão, classes envolvidas,
necendo pontos de extensão para plug-ins  baseado
 bas eado no Open Services Gateway ini- ícones etc.). Essas informações são usadas
de mais alto nível. Alguns dos plug-ins tiative (OSGi) . O uso dessa tecnologia pelo Eclipse para configurar
configu rar o ambiente de
 básicos são: melhorou a portabilidade da ferramenta execução do plug-in e seus componentes.
• Standard Widget Toolkit (SWT): entre diversos sistemas operacionais, e
um toolkit que oferece uma API gráfica fez com que os plug-ins passassem a ser 3As views
views   fazem parte do Workbench. Alguns exem-
portável e integrada com o sistema ope- implementados segundo um novo modelo plos bastante conhecidos de views são Console
Console,, Tasks e
racional (SO), o SWT utiliza JNI para (OSGi bundles). Properties..
Properties
acessar as bibliotecas gráficas
gráfica s nativas do
SO e renderizar os componentes gráfi-
cos utilizados na IDE (botões, imagens,
labels etc.);
• JFace: exten
 extensão
são de “alto nível” do SWT,
que oferece mecanismos para construção
de diálogos, wizards, actions etc. O JFace
J Face
implementa a arquitetura
arquitetu ra MVC;
•  Java Developer Toolkit ( JDT) :  fer-
ramentas para manipulação de código
 Java;
• GEF (Graphical Editing Framework):
APIs para construção de editores grá-
ficos;
• EMF (Eclipse Modeling Framework):
APIs para construção de modelos;
• Help:   ferramentas para criação de
arquivos de ajuda;
• Team: APIs para acesso a repositórios
repo sitórios
e versionamento de arquivos. Figura 1. Arquitetura do Eclipse.

Edição 37 •  Java Magazine


Magazine 41
Criando Plug-ins para o Eclipse

Antes da versão 3.0 do Eclipse, cada Como veremos adiante, o


plug-in era armazenado em um diretório Eclipse disponibiliza recur-
próprio (um subdiretório do diretório sos que facilitam muito a
 plugin) e todas as informações do plug-in geração e manuseio dos des-
estavam contidas no arquivo  plugin.xml, critores de plug-ins ( plugin.
também localizado nesse diretório.
di retório. Após a xml e MANIFEST.MF).
migração para o modelo OSGi, os plug-ins
passaram a ser empacotados em arqu ivos Plug-in Development
 JAR4. Além disso, as informações básicas Environment (PDE)
sobre suas características foram movidas Vimos que a plataforma
para o arquivo de manifest ( META-INF/ 
 META-INF/  Eclipse é responsável por
IFEST.MF ). Assim, plug-ins cons-
 MANIFEST.MF
 MAN gerenciar todo o ciclo de
truídos a partir
part ir da versão 3.0 contêm dois vida de um plugplug-in,
-in, escon-
descritores:  plugin.xml e MANIFEST.MF. dendo do desenvolvedor os
detalhes de infra-estrutura.
O arquivo plugin.xml  Assim, o desenvolvedor
O documento XML a seguir,
segui r, extraído da passa a se preocupar ape-
documentação do Eclipse, ilustra um des- nas com a implementação
critor de plug-in simples, que implementa da “lógica de negócios” do Figura 2. Informando os dados básicos do projeto.
uma nova view no Eclipse: plug-in, podendo aprovei-
<?xml version=”1.0” encoding=”UTF-8”?>
tar os recursos de uma ferramenta bastante A utilização do plug-in será feita da
<?eclipse version=”3.0”?> valiosa (que também é um plug-in!): o seguinte maneira: o usuário seleciona,
<plugin> Eclipse PDE. O Plug
Plug-in
-in Development En- no Package Explorer, o arquivo que deseja
<extension point=”org.eclipse
point=”org.eclipse.ui.views”>
.ui.views”>
<category name=”Hello Category” vironment é um ambiente completo para editar, clica com o botão direito e seleciona
  id=”com.example.helloworld”> desenvolvimento de plug-ins, que contem- no menu popup o item correspondente.
  </category>
<view name=”Hello View” pla recursos para sua construção, teste, Todos os caracteres especiais do arquivo
  icon=”icons/sample.gif” depuração e empacotamento. O Eclipse (que deve estar aberto no editor) serão
  category=”com.example.helloworld” SDK já inclui o PDE, que vem configurado substituídos automaticamente, e uma
  class=”com.example.helloworld.HelloWorldView”
  id=”com.example.helloworld.HelloWorldView”> e pronto para uso.  barra de progresso indicará o andamento
  </view> da operação.
  </extension>
</plugin> Um exemplo completo
As funcionalidades do PDE serão apre- Criando o projeto do plug-in
A implementação da nova view é conse- sentadas através do desenvolvimento A maneira mais fácil fáci l de criar um plug-in
guida através do uso do ponto de extensão completo de um plug-in que automatiza a é usando um wizard disponível no Eclip-
org.eclipse.ui.views , indicado no elemento codificação de caracteres especiais. se. Selecione File|New>Project e escolha a
<extension>. No elemento <category>  são Quando escrevemos documentação opção Plug-in Project dentro da categoria
descritos o nome (name) e o código iden-  JavaDoc
 JavaD oc ou arq
arquivo
uivo s de pro
propri
prieda
edades
des Plug-in Development. A primeira tela do
tificador (id) da categoria. A nova view (.properties), é um boa prática utilizar wizard será exibida ( Figura 2). Nesta tela
é descrita no elemento <view>, onde são codificação HTML para caracteres espe- devem ser informadas as características
indicados seu ícone ( icon), a referência ciais, permitindo que o texto seja exibido do projeto.
à sua categoria ( category ), a classe corretamente em diversos browsers. É possível perceber que a criação de
implementadora (class) e o código Desse modo, o caractere “ã” deve um projeto de plug-in é semelhante à de
identificador da nova view ( id). ser substituído por “&atilde;”, o um projeto Java comum. Vamos aceitar
Os atributos de “baixo nível”
ní vel” do caractere “ç” por “&ccedil;” e as- as opções default, e fornecer “br.com.
plug-in
plug -in (ex.: informações
infor mações sobre sim sucessivamente (veja referência  jm.plug
 jm.plugin”in” como o nome do proj projeto
eto (é
como o plug-in deve ser empa- ao final do artigo). uma boa prática utilizar nomenclatura
nomenclatu ra de
cotado) são descritos no arquivo O maior problema dessa abordagem é que pacotes para o nome do plug-in). Ao clicar
 MANIFEST.MF
 MANIFEST .MF que, por simplicidade, não o desenvolvedor deve
deve conhecer
conhece r os códigos no botão Next, o wizard é direcionado para
é mostrado neste artigo. dos caracteres e digitá-los corretamente. O a próxima página (Figura 3).
nosso plug-in fará isso automaticamente, Nessa tela devemos informar os dados
4  A estrutura utilizada em versões anteriores do Eclipse
substituindo caracteres especiais por seus  bási
 básicos
cos do plug-i
plug-in, n, como ident
identif
ificado
icadorr
(diretórios ao invés do JAR) continua válida. correspondentes em HTML. (Plug-in ID), nome (Plug-in Name) e classe

Magazine • Edição 37
42  Java Magazine
de gerenciamento ( Class usaremos o template (o valor da propriedade Action Class) é res-
Name ). Além disso, é Plug-in with a popup ponsável por gerenciar as ações desse item
necessário informar menu. de menu e será descrita mais adiante.
se o plug-in faz alguma A última tela do wi-
contribuição para a inter- zard (Figura 5) configura  Analisando o plugin.xml 
plugin.xml 
face gráfica do Eclip- o novo popup. Como espe- Na Listagem 1  é exibido o código do
se e se uma aplicação cificado anteriormente, um xml , gerado pelo wizard. Vamos
 plugin.xml
 plugin.
rich client 5  deve ser ge- menu popup será exibido agora analisar esse descritor e entender
rada. sempre que o usuário se- cada uma de suas partes.
Novamente vamos aceitar as opções lecionar um arquivo e clicar O primeiro elemento, <extension>, espe-
default, preenchendo os campos ID , com o botão direito. A filtragem cifica o único
ún ico ponto de extensão utilizado
Name, Provider e Class. Nosso plug-in será dos arquivos que serão válidos para essa pelo plug-in:
identificado como “br.com.jm.plugin” (é operação (aqueles para os quais o popup
uma convenção utilizar o mesmo nome estará disponível) é configurada através <extension point=”org.eclipse
point=”org.eclipse.ui.popupM
.ui.popupMenus”>
enus”>
do projeto). E como o plug-in adiciona um de duas propriedades: Target Object’s Class
menu popup à IDE, deixaremos marcada e Name Filter. O elemento <objectContribution>, que apa-
a opção This plug-in will make contributions Na propriedade Target Object’s Class, uti- rece logo em seguida:
to the UI . lizaremos org.eclipse.core.resources.IResource , <objectContribution
A terceira tela do wizard ( Figura 4) especificando que qualquer recurso   objectClass=”org.eclipse.core.resources.IResource”
permite escolher um dentre diversos disponibilizará o menu (adiante faremos nameFilter=”*”
adaptable=”true”
templates de plug-ins disponíveis no um refinamento dos arquivos que efeti- id=”br.com.jm.plugin.contribution
id=”br.com.jm.plugin.contribution1”>
1”>
PDE. O uso de um template facilita o de- vamente permitirão o popup). A proprie-
senvolvimento: baseado nele, o PDE gera dade Name Filter será preenchida com * Este elemento adiciona uma “contribui-
automaticamente o “esqueleto” de todas (indicando qualquer nome de recurso). O ção” (extensão) para menus popup, mas
as classes envolvidas e configura adequa- novo submenu popup será denominado este só será exibido se o objeto selecio-
damente os pontos de extensão necessá- “Java Magazine” (propriedade Submenu
rios. É claro que ainda serão necessárias Name ) e conterá um único item, deno-
alterações no código gerado para ajustar o minado “Substituir caracteres especiais” 5 Basicamente, uma aplicação rich client  é
 é um programa
cliente não-web com interface visual. O Eclipse oferece
comportamento do plug-in, como veremos (propriedade  Ac ti on L ab el ). A classe facilidades para criação de aplicações desse tipo através
a seguir.
segu ir. Para desenvolver o nosso plug-in br.com.jm.plugin.popup.actions.SubstituirAction da RCP (Rich
( Rich Client Platform).
Platform ).

Figura 3. Informando
Informando os dados básicos do plug-in. Figura 4. Escolhendo um template para o plug-in.

Edição 37 •  Java Magazine


Magazine 43
Criando Plug-ins para o Eclipse

nado for compatível com a especificação única no arquivo. O elemento <separator>


contida nos atributos objectClass (classe do cria uma referência ao menu corrente,
objeto) e nameFilter (um filtro para o nome permitindo que actions  sejam associadas
do objeto). O atributo id foi criado auto- ao menu (veja a descrição do próximo
maticamente pelo wizard, e define um elemento).
identificador para o elemento. O atributo Por fim, temos o elemento <action>:
adaptable   precisa ser adicionado manual-
<action
mente, para também permitir que arquivos
arqu ivos label=”Substituir caracteres especiais”
 Java sejam selecionados
selecionados (arquivos JavJavaa são
são   class=”br.com.jm.plugin.popup.actions.SubstituirAction”
  menubarPath=”br.com.jm.plugin.menu1/group1”
do tipo org.eclipse.jdt.core. ICompilationUnit e enablesFor=”1”
são tratados pelo JDT).   id=”br.com.jm.plugin.newAction”>
No elemento <menu>  são
descritas as características Nele encontra-se a descrição do único
do menu que será exibido item de menu (atributo label ); a classe que
quando o botão direito for executará a ação quando o item for cli-
clicado: cado (atributo class); o menu ao qual esse
<menu item pertence (atributo menubarPath ), e seu
label=”JavaMagazine” identificador (atributo id). O valor definido
path=”additions”
  id=”br.com.jm.plugin.menu1”> para o atributo enablesFor  especifica que
<separator name= ”group1”/
”group1”/>
> essa ação só estará disponível quando
</menu> um único objeto for selecionado (seleção
O atributo label  define o simples).
nome do submenu a ser
 O framework de actions, parte do JFace, é um
inserido no menu principal
recurso bastante interessante da arquitetura do
do Eclipse; o atributo path
Eclipse, permitindo a construção e configuração
determina sua localização de classes de forma declarativa (via XML). Essa
(em qual menu o submenu abordagem é fundamental na performance do
será adicionado); o atributo Eclipse, já que permite que os menus sejam
sej am acessa-
id  define sua identificação dos sem que necessariamente o plug-in precise ser
Figura 5. Configuração do menu popup para o plug-in.
carregado (a carga do plug-in exige criação de um
classloader, carregamento
carregamento de classes etc.).
Listagem 1. Arquivo  plugin.xml 

<?xml version=”1.0” encoding=”UTF-8”?> O código da action gerado pelo PDE foi


<?eclipse version=”3.0”?>
<plugin> incrementado com mais um elemento:
<extension point=”org.eclipse.ui .popupMenus”>
  <objectContribution <enablement>. Com vimos anteriormente,
anteriormente,
  objectClass=”org.eclipse.core.resources.IResource” é possível definir de forma declarativa
nameFilter=”*”
  adaptable=”true” diversas características de uma action.
id=”br.com.jm.plugin.contribution1”>
  <menu O elemento <enablement>, utilizado aqui,
label=”Java Magazine” path=”additions”
  id=”br.com.jm.plugin.menu1”> permite especificar quando o menu popup
<separator name=”group1”></separa tor> estará disponível, através da analise das
  </menu>
  <action características do objeto que está selecio-
label=”Substituir caracteres especiais”
  class=”br.com.jm.plugin.popup.actions.SubstituirAction” nado no IDE:
  menubarPath=”br.com.jm.plugin.menu1/group1”
enablesFor=”1”
  id=”br.com.jm.plugin.newAction”> <enablement>
  <enablement>   <and>
  <and> <objectState name=”readOnly” value=”false”/>
<objectState name=”readOnly” value=”false”/> <or>
<or> <objectState name=”extension” value=”java”/>
<objectState name=”extension” value=”java”/>
<objectState name=”extension” value=”properties”/> <objectState name=”extension” value=”properties”/>
</or> </or>
  </and>   </and
  </enablement> </enablement>
  </action>
  </objectContribution>
  </extension>
</plugin>
No nosso caso, utiliza
utilizamos
mos uma expressão
 baseada no estado do objeto (objectState)

Magazine • Edição 37
44  Java Magazine
Figura 7. O menu popup é exibido quando um arquivo é selecionado.

Figura 6. Direcionando para a perspectiva de plug-ins.

para especificar
especifica r que apenas arquivos .java e será exibida. O processo
.properties poderão ser editados, e que esses é ilustrado nas Figuras
arquivos não devem ser read-only. As pro- 7 e 8.
priedades utilizadas aqui estão descritas O novo plug-in
plug-in também
tamb ém Figura 8. Mensagem de teste (criada automaticame
automaticamente
nte pelo wizard).
na classe  org.eclipse.ui.IResourceActionFilter. estará disponível na lista
de plug-ins instalados.
Efetuando o primeiro teste Pode-se verificar isso,
Após criar o projeto, a perspectiva de selecionando Help
 Help|
|About
plug-ins (Plug-in Development) será acio- Eclipse SDK  e
  e depois cli-
nada (veja a Figura 6). Neste ponto, já é cando no botão “Plug-in
possível efetuar o primeiro teste, para Details” (veja a   Figu-
verificar se essa versão inicial plug-in se ra 9).
comporta como esperado.
Para testar a implementação, basta clicar Codificando as classes
com o botão direito sobre o projeto do Agora que o esqueleto
plug-in e escolher a opção Run as>Eclipse do plug-in está pronto,
 Application . Uma nova instância da IDE partiremos para sua im-
será aberta. Será necessário criar, nessa plementação.
plemen tação. O primeiro
nova instância, um projeto para o teste passo consiste em indicar Figura 9. Após iniciar a nova instância da IDE, o plug-in estará disponível.
do plug-in. Esse projeto deve conter, no as dependências (outros
mínimo, um arquivo .java e um arquivo plug-ins)
plug-ins) necessárias para o nosso plug
plug-in.
-in.  MF). As dependências devem ser apon-
.properties, que serão usados para testar O PDE disponibiliza uma view especial tadas na aba Dependencies, como indicado
o menu. para edição das configurações
conf igurações do plug-in, na Figura 10.
Como o PDE já configura
configu ra o plug-in para onde seus atributos podem ser manipu- Nosso plug-in é composto de quatro de clas-
a nova instância do Eclipse, quando o lados de forma amigável. Clicando duas ses: br.com.jm.plugin.JMPlugin (Listagem 2),
 botão direito
di reito for clicado
c licado sobre um
u m arqui-
arqu i- vezes no arquivo  plugin.xml, as configu- br.com.jm.plugin.popup
br.com .jm.plugin.popup.actions.Substituir
.actions.SubstituirAction
Action
vo válido, o submenu “Java Magazine” e rações são mostradas num editor especial (Listagem 3), br.com.jm.plugin.popup.actions.
o item “Substituir caracteres especiais” com diversas abas. Nessas abas é possível Substituidor (Listagem 4) e br.com.jm.plugin.
estarão disponíveis. Ao clicar em “Substi- visualizar e editar as características do popup.actions.Config (Listagem 5).
tuir caracteres
ca racteres especiais”,
especiais”, uma mensagem plug-in (inclusive o arquivo  MANIFEST. É importante ressaltar que a classe

Edição 37 •  Java Magazine


Magazine 45
Criando Plug-ins para o Eclipse

Listagem 2. Classe JMPlugin, gerada pelo wizard do PDE. Listagem 4. Classe Substituidor


 Substituidor,, responsável pela substituição dos caracteres especiais.

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


import org.eclipse.ui.plugin.*;
import org.eclipse.jface.resource.ImageDescriptor; import java.lang.reflect.InvocationTargetException;
import org.osgi.framework.BundleContext; import java.util.Iterator;
import java.util.Map;
public class JMPlugin extends AbstractUIPlugin {
private static JMPlugin plugin; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
public JMPlugin() { import org.eclipse.jface.operation.IRunnableWithProgress;
plugin = this; import org.eclipse.jface.text.*;
} import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.*;
public void start(BundleContext context) throws Exception {
  super.start(context); public class Substituidor {
} public int substituir(Document doc) {
int total = 0;
public void stop(BundleContext context) throws Exception { if (doc != null && doc.getLength() > 0) {
  super.stop(context); MonitorProgresso m = new MonitorProgresso(
plugin = null; doc, Config.getMapa());
} IWorkbench wb = PlatformUI.getWorkb ench();
IWorkbenchWindow win = wb.getActiveWorkbenc hWindow();
public static JMPlugin getDefault() { try {
return plugin; new ProgressMonitorDialog(
} win.getShell()).run(false, false, m);
total = m.substituidos();
public static ImageDescriptor getImageDescriptor(String path) }
{ catch (InvocationTargetExcep tion e) {
return AbstractUIPlugin.im ageDescriptorFromPlugin (   e.printStackTrace();
“br.com.jm.plugin”, path); }
} catch (InterruptedException e) {
}   e.printStackTrace();
}
Listagem 3. Classe SubstituirAction, o controller do plug-in. }
return total;
package br.com.jm.plugin.popup.actions; }

import br.com.jm.plugin.JMPlugin; private class MonitorProgresso


implements IRunnableWithProgress
import org.eclipse.jface.action.IAction; {
import org.eclipse.jface.dialogs.MessageDialog; private Document doc;
import org.eclipse.jface.text.Document; private Map mapa;
import org.eclipse.jface.viewers.ISelection; private int substituidos = 0;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.*; MonitorProgresso(Docume nt doc, Map mapa) {
import org.eclipse.ui.texteditor.ITextEditor; this.doc = doc;
this.mapa = mapa;
public class SubstituirAction implements IObjectActionDelegate { }

public void setActivePart( public int substituidos() {


IAction action, IWorkbenchPart targetPart) { } return substituidos;
}
public void run(IAction action) {
IEditorPart editor = JMPlugin.getDefault( ).getWorkbench(). public void run(IProgressMonitor monitor) {
getActiveWorkbenchWindow().getActivePage(). monitor.beginTask(“Co nvertendo caracteres...”,
getActiveEditor(); mapa.size());
try {
if (editor instanceof ITextEditor) { FindReplaceDocumentAda pter adapter =
Document doc = (Document) ((ITextEditor) editor). new FindReplaceDocumentAdapter(doc);
getDocumentProvider().getDocument( Iterator iterator = mapa.keySet().iterato r();
  editor.getEditorInput());
while (iterator.hasNext()) {
int total = new Substituidor().subs tituir(doc); String antes = (String) iterator.next();
String depois = (String) mapa.get(antes);
if (total > 0) {
MessageDialog.openInfo rmation(new Shell(), monitor.subTask(“Sub stituindo ‘” + antes + “’ por ‘”
“Substituição
“Subs
“Substit
titui
uição
ção de car
caract
caracteres”,
acter
eres”
es”,
, to
total
tal + depois + “’”);
+ “ caractere(s) substituído(s)”);
} IRegion region = null;
  e
el
else
l se { do {
MessageDialog.openWarn ing(new Shell(), region = adapter.find(0, antes, true, true, false,
“Substituição
“Subs
“Substit
titui
uição
ção de car
caract
caracteres”,
acter
eres”
es”,
,   false);
“Nenhum caractere substituído”); if (region != null) {
} adapter.replace(depo is, false);
}   substituidos++;
} }
}
public void selectionChanged( while (region != null);
IAction action, ISelection selection) { }
}   monitor.worked(1);
}

Magazine • Edição 37
46  Java Magazine
}
catch (Exception e) {
// tratar
}
finally {
  monitor.done();
}
}
}
}

Listagem 5. Classe Config: para configuração dos caracteres


que serão substituídos.
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(“ø”, “&oslash;”);
mapa.put(“Ø”, “&Oslash;”);
mapa.put(“ß”, “&szlig;”); Figura 10. Indicando as dependências do plug-in.
mapa.put(“®”, “&reg;”);
mapa.put(“©”, “&copy;”);
mapa.put(“€”, “&euro;”);
mapa.put(“æ”, “&aelig;”);  JMPlugin
 JMPlu gin é criada automaticamente pelo if (editor instanceof ITextEditor) {
mapa.put(“à”,
mapa.put
mapa.put(“à”
(“à”,
, “&ag
“&agrave
“&agrave;”);
rave;”);
;”); wizard do PDE. Essa classe é responsável Document doc = (Document) ((ITextEditor) editor).
mapa.put(“á”, “&acute;”);   getDocumentProvider().getDocument(
mapa.put(“À”, “&Agrave;”); por gerenciar o plug-in e, como imple- editor.getEditorInput());
mapa.put(“Á”, “&Aacute;”); int total = new Substituidor().substituir(doc);
mapa.put(“â”, “&acirc;”);
mentamos um plug-in visual, ela estende
 ...
mapa.put(“”, “&Acirc;”); a classe org.eclipse.ui.plugin.AbstractUIPlugin . }
mapa.put(“ä”, “&auml;”);
mapa.put(“Ä”, “&Auml;”); Dois métodos merecem destaque: start(),
mapa.put(“å”,
mapa.put
mapa.put(“å”
(“å”,
, “&aring;
“&ar
“&aring;”);
ing;”);
”);
mapa.put(“Å”, “&Aring;”); que é invocado quando algum código do A classe Substituidor  (Listagem 4) é quem
mapa.put(“ã”, “&atilde;”); plug-in é chamado pela primeira vez; e faz todo trabalho pesado. Quando o mé-
mapa.put(“Ô, “&Atilde;”);
stop(), invocado quando o plug-in é des- todo substituir() é disparado, o trabalho
mapa.put(“ç”, “&ccedil;”);
mapa.put(“Ç”, “&Ccedil;”); carregado. de substituição de caracteres é delega-
A classe SubstituirAction (Listagem 3) é o do para uma inner class, denominada
mapa.put(“é”, “&eacute;”);
mapa.put(“É”, “&Eacute;”); “controller” do plug-in. Como o plug-in MonitorProgresso . Uma nova instância dessa
mapa.put(“è”, “&egrave;”);
mapa.put(“È”, “&Egrave;”); adiciona um novo menu popup ao Wor Work-k- classe é criada, passando como parâmetro
parâmetross
mapa.put(“ê”, “&ecirc;”);  bench, é necessário implementar a inter- o documento e o mapa de substituição
mapa.put(“Ê”, “&Ecirc;”);
mapa.put(“ë”, “&euml;”); face org.eclipse.ui.IObjectActionDelegate para (este mapa está configurado na classe
mapa.put(“Ë”, “&Euml;”);
tratar suas ações. O principal método da Config, mostrada na Listagem 5):
mapa.put(“ï”, “&iuml;”); classe é run(), que é disparado sempre que
mapa.put(“Ï”, “&Iuml;”); MonitorProgresso m = new MonitorProgresso(
mapa.put(“í”, “&iacute;”); o item de menu é selecionado.
s elecionado. No código doc, Config.getMapa());
mapa.put(“Í”, “&Iacute;”);
a seguir é possível entender o funciona-
mapa.put(“ô”, “&ocirc;”); mento desse método. A inner class MonitorProgresso (parte da
mapa.put(“ó”, “&oacute;”);
mapa.put(“Ô”, “&Ocirc;”); Inicialmente o editor corrente é selecio- Listagem 4) foi criada para executar a
mapa.put(“Ó”, “&Oacute;”);
mapa.put(“ö”, “&ouml;”); nado6: operação de substituição de caracteres e
mapa.put(“Ö”, “&Ouml;”); monitorar seu progresso (assim deixamos
mapa.put(“õ”, “&otilde;”);
mapa.put(“Õ”, “&Otilde;”); IEditorPart editor = JMPlugin.g
JMPlugin.getDefault().
etDefault(). o usuário ciente do que está acontecen-
getWorkbench().getActiveWorkbenchWindow().
mapa.put(“ù”, “&ugrave;”);   getActivePage().getActiveEditor(); do). Para que seja possível acompanhar
mapa.put(“Ù”, “&Ugrave;”); o andamento da operação, a nova classe
mapa.put(“û”, “&ucirc;”);
mapa.put(“Û”, “&Ucirc;”); Se o editor implementar a interface implementa a interface org.eclipse.jface.
mapa.put(“ü”, “&uuml;”);
mapa.put(“Ü”, “&Uuml;”); ITextEditor, o documento atual é armazena- operation.IRunnableWithProgress  que define o
} do na variável doc e passado como parâ-
public static Map getMapa() { metro para o método substituir() da classe 6 N
No o Eclipse
Eclipse o editor
editor é o recurso
re cu
curso primordial
primordia l para
para
return mapa;
} Substituidor, que efetua a substituição de to- criação e modificação de arquivos. O Eclipse dispo-
} nibiliza alguns editores básicos, como por exemplo,
dos os caracteres especiais do documento e org.eclipse.ui.texteditor.ITextEditor (para edição de arquivos
retorna o total de caracteres alterados: texto em geral, incluindo código Java).

Edição 37 •  Java Magazine


Magazine 47
Criando Plug-ins para o Eclipse

método run(), onde a lógica de substituição se uma busca no arquiv


a rquivo.
o. Caso a busca seja Conclusões
é implementada.  bem sucedida, todas as ocorrências desse O Eclipse possui uma
u ma grande capacidade
capacidade
O método run() recebe como parâmetro caractere são substituídas pelo símbolo de extensão, e sua arquitetura foi pensada
um objeto do tipo org.eclipse.core.runtime. correspondente em HTML, e o progresso para permitir que diversas contribuições
IProgressMonitor , criado automaticamente é incrementado: possam trabalhar
trabalh ar em conjunto para ofere-
pelo Eclipse. Nesse objeto é indicado o cer novos recursos à ferramenta.
progresso da operação: region = adapter.find(0, antes, true, true, false, false); Uma das principais facilidades para o
if (region != null) {
adapter.replace(depois,
adapter.replace(depois, false); desenvolvimento de plug-ins é o PDE,
monitor.beginTask(“Convertendo caracteres...”, mapa.size()); … que contém um conjunto de recursos que
}
... auxiliam as tarefas do desenvolvedor e
Para substituição propriamente dita, uti- monitor.worked(1); aceleram a criação de extensões. Aqui
lizandos um objeto da classe org.eclipse.jface. foram apresentados conceitos e exemplos
text.FindReplaceDocumentAdapter , que oferece A instância da classe MonitorProgresso para iniciar a criação de plug-ins. Portanto
métodos para localização e substituição (armazenada na variável m) é usada na agora é só começar a codificar!
de textos: classe Substituidor  a partir de caixa de diá-
logo especial (uma instância de org.eclipse.
FindReplaceDocumentAdapter adapter =  jface.dialogs.ProgressMoni
 jface.dialogs. torDialog ), que exibe
ProgressMonitorDialog
new FindReplace
FindReplaceDocumentAdapt
DocumentAdapter(doc);
er(doc); Eclipse in Action: A Guide for Java
o progresso total da operação: Developers,
O processo de substituição é muito sim- David Gallardo et al. (Manning)
ples: o mapa de substituição é percorrido
percorr ido e, IWorkbench wb = PlatformUI.ge
PlatformUI.getWorkbench();
tWorkbench();
IWorkbenchWindow
IWorkbenchWindow win = wb.getActive
wb.getActiveWorkbench
WorkbenchWindow();
Window();
para cada caractere definido no mapa, faz- Eclipse: A Java Developer’s Guide,

new ProgressMon
ProgressMonitorDialog(win.getShell()).
itorDialog(win.getShell()).  Steve Holzner  (O’Reilly)
 (O’Reilly)
run(false, false, m);
total = m.substituidos(); Contributing to eclipse: Principles Patterns And
Plug-Ins,
Erich Gamma e Kent Beck  (Addison Wesley)

A Figura 11 mostra o plug-in em Eclipse: Building Commercial-Quality Plug-ins,


execução. Eric Clayberg e Dan Rubel  (Addison Wesley)

Empacotando o plug-in
Após implementação e onjava.com/pub/a/onjava/2005/02/09/ 
Figura 11. Progresso da substituição de caracteres.
teste do plug-in, é necessá
necessário
rio eclipse.html 
empacotá-lo para distribui- Introdução aos plug-ins do Eclipse
ção. Para isso o PDE disponi- eclipse.org/articles/
 biliza um wizard, que pode  Article-PDE-does-plugins/PDE-intro.html 
 Article-PDE-does-plugins/PDE-intro.html 
ser acessado através do link Introdução ao Eclipse PDE
Export Wizard, na aba Over-
 help.eclipse.org/help3
 help.eclipse.org/help31/index.jsp
1/index.jsp
view da perspectiva Plug-in Help online do Eclipse 3.1
Development (Figura 12).
O wizard é simples. Acei-  ramsch.org/martin/uni/fmi-hp/
 ramsch.org/martin/uni/fmi-hp/
tando as opções default, o  iso8859-1.html 
 iso8859-1.html 
Caracteres especiais em HTML
arquivo br.com.jm.plugin_
1.0.0.zip  será gerado no  javamagazine.com.br/downloads/jm37/
 javamagazine.com.br/downloads/jm37/
diretório indicado (neste  jm-eclipseplugins.zip
caso, em “c:\teste”).
“c:\teste”). Este
Est e ZIP
conterá um JAR de mesmo André Dantas Rocha
nome, que para instalação (ad-rocha@uol.com.br ) é
deve ser copiado para o bacharel em Ciências da Com-
diretório  plugins do Eclipse. putação pela UNIFACS, mestre
em Engenharia de Software pela USP
Depois disso, é só reiniciar
e consultor da Politec. (O autor agradece a Cleiton
o Eclipse e o plug-in estará Diniz, “headshot”,
“headshot”, pela ajuda na codificaçã
co dificação.)
o.)
Figura 12. Exportação do plug-in. disponível.

Magazine • Edição 37
48  Java Magazine


 
 

    
     
       
     
     
     
   
          
         


  


      
 

    
      
     
     
       
    
    
  
   

 

Edição 37 •  Java Magazine


Magazine 49
Sun
Tech
Days 2006
O quarto Sun
Su n Tech Days, realizado
nos dias 11 e 12 de abril, trouxe
mais de 1.500 desenvolv
desenvolvedores
edores ao
Transamerica Expo Center, em São Paulo-
SP,, e contou com a presença de importan-
SP
tes executivos da Sun Microsystems. Entre
eles, estavam o recém-nomeado CEO da
Sun, Jonathan Schwartz, que acumula
este cargo com o de presidente. Também
participou do evento um extenso grupo de
evangelistas e desenvol
desenvolvedores
vedores de vários
países, tanto da Sun como de empresas

 Java na Era da
 Jav
parceiras.
As sessões de abertura foram realizadas
na grande sala principal,
pri ncipal, com capacidade
para mais de mil pessoas e cinco telões.
Reggie Hutcherson, que gerencia o grupo

 Participação de evangelistas de tecnologia da Sun, foi


mais uma vez o “mestre de cerimônias”,
responsável pelas principais brincadeiras
e premiações, e por apresentar os pales-
trantes das sessões especiais.

Era da participação: Jonathan Schwartz destaca a impor-


 lo
 l  inc i ippa l
o t taaram a sa l laa pr in tância das comunidades e a apresenta a visão
e 1 .5  0
 0 0
 0 pe sso a s
 vo: Ma i iss d
 v i i vo  vaa.
 Teecno l loog i iaa ao v
 T  br
 b re te
 t ec no og i iaas e f feerramen t ta
 lo
 l
as Ja v da Sun para o open source.
 ic
 i cas s o
para pa l lees t trras t téécn
Magazine • Edição 37
50  Java Magazine
 Jonathan Schwartz falou sobre a “era“era da na tela de um Duke (o mascote do Java), Schwartz e o Brasil
participação”, reforçando que os desen- uma equipe fazia o lançamento com um

J
volvedores não compram produtos: eles grande estilingue usado por Gosling em onathan Schwartz, presidente mun-
 participam de projetos. Destacou ainda o edições passadas do evento JavaOne. dial da Sun e agora CEO da empresa,
comprometimento da Sun com o software Complementando o evento central, participou de várias atividades no
livre, anunciando que todos os produtos aconteceram no dia 10 de abril o NetBeans Brasil, inclusive de uma reunião com o
da empresa se tornarão open source no Day,, que trouxe
Day trou xe importantes evangelistas presidente Luís Inácio Lula da Silva. Ficou
futuro (sem no entanto indicar datas ou e desenvolvedores do NetBeans, além do impressionado com a força da comunidade
outros detalhes desse processo). O foco Solaris Day. Ocorreu ainda, no dia 12 de de desenvolvedores, e relatou a experiên-
da empresa no apoio à construção e à abril, a segunda
segu nda edição do Sun Tech Days cia em detalhes no seu blog (blogs.sun.
( blogs.sun.
expansão de comunidades foi outro tema for Universities, um evento gratuito volta- com/jonathan):): “acabei de retornar de São
com/jonathan
de sua sessão. do a estudantes universitários de cursos Paulo e Brasília, e posso confirmar que o
Brasil é um dos países mais progressivos
A sessão especial seguinte foi liderada tecnológicos.
do mundo, quando se trata de software
por Jeff Jackson, vice-presidente do grupo Uma novidade desta edição do Sun Tech
livre e open source. E tem uma das mais vi-
de plataformas para desenvolvedores e Days foi a realização de “sub-eventos”
brantes comunidades de desenvolvedores
 Java, e gerente dos programas voltad
voltados
os a em várias cidades do país – iniciativa [o SouJava]”.
desenvolvedores, incluindo o NetBeans, liderada pelo grupo de usuários SouJava. Schwartz também destacou iniciativas
o Java SE e o portal java.net (ele é chefe As sessões especiais foram transmitidas do Brasil relacionadas a software livre e à
de James Gosling). A apresentação tratou
t ratou pela internet ao vivo para todas as cida- inclusão digital (que foram temas de sua
da facilidade
facil idade de desenvolvimento,
desenvolvimento, a evo- des envolvidas e projetadas em telões. conversa com Lula), e citou o que chamou
lução da plataforma Java
Java,, e comunidades
comun idades Depois ocorreram eventos paralelos em de “Brazilian Effect”,
Effect ”, realçando que os brasi-
construídas em torno da tecnologia. Um cada cidade, com palestrantes convida- leiros têm especial orgulho pelo progresso
aspecto divertido foi o lançamento de ca- dos. Foram mais de 3 mil participantes e evolução nacionais. “Há uma energia
misetass durante a palestra: a cada aparição
miseta “remotos” adicionais, em 14 cidades, nas palpável”, escreveu Schwartz.
cinco regiões do Brasil.
Além das palestras e sessões especiais,
durante todo o evento ficou aberto um
pavilhão de exposições com estandes da
Sun, de empresas parceiras e de outros
patrocinadores e apoiadores. Finalmente,
Final mente, o
almoço, os coffee-breaks e um coquetel na
noite do segundo dia foram boas oportu-
nidades para aumentar a rede de contatos
e conhecer novos produtos e empresas.

Dukes: a cada Duke, um


 Jeff Jackson e os Dukes:
trio de brasileiros lançava uma camiseta para O novo CEO da Sun, Jonathan Schwartz:
a platéia usando um super-estilingue. “Eu compreendo o Brazilian Effect”

Edição 37 •  Java Magazine


Magazine 51
Relatórios
Relatórios na Web P
Criando um relatório mestre-detalhe usando

N este artigo, vamos destacar pon-


tos importantes e dicas na cria-
ção de relatórios, e desenvolver
passo a passo um relatório mestre-detalhe
usando o JasperReports
JasperRepor ts e o iReport. Vamos
escrita em Java. Com ela é possível enviar
o relatório gerado diretamente para a tela
ou impressora, armazenar esse conteúdo
em disco em forma serializada, e trans-
formá-lo em um documento nos formatos
O processo de desenvolvimento de um
relatório (veja a Figura 1) começa com a
codificação da definição do relatório em
XML, usando tags e atributos (que estão
definidos no arquivo  jasp  jasper
errep
reports .dtd ).
orts.dtd
criar também
tam bém uma aplicação web que gera PDF,, HTML,
PDF HTML , XLS, RTF, CSV,
CSV, TXT ou
o u XML.
XML . Depois é criado um arquivo com a exten-
o relatório. Relatórios criados com o JasperReports são  jrxml
 .jrxml (o “template de relatório”), onde
podem ser usados tanto em aplicações é descrita toda a estrutura do relatório: a
Funcionamento do JasperReports web quanto desktop. O JasperReports e posição de textos, imagens e formas geo-
O JasperReports é uma biblioteca para o iReport já foram apresentados na Java métricas; como recuperar os dados neces-
a geração de relatórios, open source e Magazine, nas Edições 13 e 21. sários, como fazer cálculos de totalização,
e quais parâmetros devem ser passados,
entre outras definições.
Em seguida é preciso compilar o arquivo
 .jrxml. O resultado da compilação é um
 jrxml
arquivo com extensão . jasper  jaspe r, que nada
mais é do que uma classec lasse Java compilada,
sendo representado por um objeto da
classe  JasperReport .
Após a compilação, precisamos de uma
 fonte de dados para produzir os dados a se-
rem exibidos no relatório.
relatór io. A fonte de dados
pode ser um datasource, ou uma conexão ao
 banco de dados e uma query SQL. Caso Ca so
seja um datasource, a fonte de dados deve
ser disponibilizada para o relatório na
forma de uma classe que implemente a in-
terface JRDataSource. Já existem algumas im-
plementações prontas como as de coleções
e arrays de JavaBeans ( JRBeanArrayDataSource
e  JRBeanCollecti onDataSource ), ou a utilizando
 JRBeanCollectionDataSource
ResultSet ( JRResultSetDataSou rce ).
Tendo o objeto JasperReport e a fonte de da-
dos, além de um objeto Map com alguns pa-
râmetros, podemos fazer o preenchimento
do relatório. O resultado é um objeto da
classe  JasperPrint , que pode ser serializado
como um arquivo com a extensão  jrprint  .jrprint.
O objeto  JasperPrint  é o relatório final em
um formato proprietário do JasperReports.
Ele pode ser visualizado diretamente
com um aplicativo chamado JasperViewer,

Magazine • Edição 37
52  Java Magazine
Aproveite as facilidades do
Aproveite

asso a Passo iReport para criar relatórios


baseados no JasperReports
com todo o poder que o
 Java oferece
oferece e de maneira
iReport e JasperReports fácil e rápida

ANA ABRANTES E YARA SENGER

que vem com o JasperReports, ou ser específ icas para geração de determinados
específicas determinados pedidos, itens de pedido, clientes e pro-
exportado para os formatos mencionados formatos de arquivos. Já se você também dutos. Nosso objetivo é gerar umu m relatório
anteriormente. obtiver o JasperReports em separado, terá de pedidos com seus itens, sendo que um
O quadro “Glossário do JasperReports”, adicionalmente uma documentação básica pedido tem um cliente e cada item tem
na próxima página, apresenta conceitos da API, os arquivos-fonte da biblioteca e um produto.
fundamentais do JasperReports usados uma grande quantidade de projetos de O projeto completo, com todas as classes
neste artigo. demonstração. necessárias,
necessár ias, os templates de relatório .jrxml
Para iniciar o iReport, vá até o diretório e o script para criação do banco de dados,
Sobre o iReport raiz da ferramenta e execute o arquivo está disponível no site da Java Magazine.
O iReport é uma ferramenta visual que iReport.sh, caso esteja utilizando Linux; Nas listagens apresentadas neste artigo,
usa o JasperReports internamente e facili- ou em Windows, execute iReport.bat ou alguns trechos dos arquivos são omitidos
ta muito o trabalho do desenvolvedor na iReport.exe. (Os instaladores nativos criam para poupar espaço.
criação de relatórios, dos mais simples aos um atalho para execução rápida). Para o exemplo,
exemplo, precisamos
precisa mos de um banco
mais complexos. No iReport é possível edi- No caso de usar um dos arquivos de script de dados que fornecerá os dados para o
tar visualmente
visual mente um arquivo de template de (.sh ou .bat), pode ser necessário editá-lo e relatório; usamos o MySQL. Chamamos a
relatório (. jrxml
 jrxml), e gerar o arquivo . jasper
 jasper, acrescentar a linha “set classpath=.” no co-  base de dados de “ecommerce” e registra-
entre outras operações. meço do arquivo. Isso evita conflitos de mos um usuário e uma senha. O modelo
 Quando utilizamos uma conexão a um classes que estão no classpath e erros na de dados é mostrado na Figura 2 (o script
 banco de dados em vez vez de
de um datasource, compilação do relatório. completo para a criação da base está inclu-
o iReport permite que o relatório seja exe- ído no arquivo de download).
cutado e exportado para diversos forma- Sobre o projeto de exemplo Como mencionamos, a aplicação de
tos. Já quando utilizamos um datasource, Como exemplo, vamos criar um projeto exemplo será baseada na web. Vamos
Vamos criar
cr iar
é necessário executar o relatório dentro  baseado em quatro entidades principais:
principais : um servlet que obtém a conexão com o
de uma classe Java. Mais detalhes sobre o
funcionamento
funciona mento do iReport e sua operação
são apresentados nas seções a seguir.

Instalação
Tanto o JasperReports como o iReport
estão disponíveis em arquivos ZIP con-
tendo 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á também
instaladores nativos do iReport, para
Windows e Mac OS X.
Para a criação de relatórios, pode-se bai-
xar somente o iReport, pois este já vem com
o JAR da biblioteca JasperReports e todas
as outras que são necessárias para a com-
pilação mais simples, além das bibliotecas Figura 1. Processo de desenvolvimento
desenvolvimento de um relatório com JasperReports

Edição 37 •  Java Magazine


Magazine 53
Relatórios na Web Passo a Passo

 banco de dados, carrega os arquivos de


Glossário do JasperReports relatório compilados . jasper
 jasper, passa parâ-
metros e a fonte de dados exigidos pelo
Template de relatório são passados em tempo de execução para relatório, executa o relatório exportando
Chamamos de template de relatório o arquivo o relatório, para utilização em expressões e
para o formato PDF e finalmente manda
.jrxml , que contém todas as informações a res- até mesmo em queries SQL. Normalmente,
o resultado para a tela do navegador web1.
peito da estrutura e formatação do documento parâmetros são usados para passar informa-
Utilizamos
Utiliza mos também um JSP muito simples,
simples,
que será gerado, quando forem fornecidos ções que não fazem parte da fonte de dados
index.jsp, que contém somente um linklin k que,
os dados para seu preenchimento. Ou seja, fornecida para o preenchimento do relatório.
Por exemplo, pode-se passar o nome do autor
ao ser clicado, executa o servlet.
ser vlet.
o template define o layout do relatório com
todos os seus elementos e configurações. do relatório, o endereço de um arquivo, etc.
Já existem vários parâmetros pré- definidos, Construindo o relatório
Bandas como REPORT_CONNECTION , que é usado para principal de pedidos
As bandas são as seções do relatório, onde fazer referência ao objeto Connection  passado Após iniciar o iReport, abra um novo
são colocados os elementos gráficos e textu- pela aplicação que executa o relatório (caso relatório selecionando  Ar  Arqu
quiv
iv o|Nov o
ais. Exemplos de bandas são title
title,, pageHead
 pageHeader 
er , este utilize uma conexão, é claro). documento, ou clicando no botão da
columnHeader , detail , pageFooter , columnFooter  Os parâmetros são passados para um relatório  barra de ferramentas. Na janela
ja nela que apa-
e summary . em tempo de execução, na forma de um objeto rece, defina o nome do relatório como
O comportamento varia para cada banda. A do tipo Map , que tem os nomes dos parâmetros “RelatorioPedidos”, altere a codificação
banda detail , por exemplo, é repetida uma vez como chave para acessar seus valores. XML para ISO-8859-1 (na aba i18n) e clique
para cada registro de uma query ou objeto do Para editar parâmetros, execute o comando em OK . A tela do iReport deverá ficar como
datasource, enquanto as bandas  pageHeade
 pageHeader r  Visualizar|Parâmetros do Relatório.
Relatório. Para usar um
na Figura 3. A Figura 4 apresenta as barras
e  pa
 pageF
geFoo
ooter 
ter   aparecem uma vez em cada parâmetro em uma expressão, deve-se colocar
de ferramentas do iReport.
página. o nome do parâmetro dentro das chaves em
Agora vamos definir a conexão com o
$P{}.. Por exemplo, para referenciar um parâme-
$P{}
Datasource tro com nome subReport  use use $P{subReport}
 banco de dados. Execute Data|Conexões/ 
Um datasource é um obje to de uma das clas-
Fonte de dados, clique em Ne Neww, e faça
ses que implementa a interface  JRData Source . A Variables Name=ecommerce, Server Address=local
Address=localhost
host
fonte de dados, de um relatório, pode ser um Variáveis são objetos especiais criados para e Database=ecommerce. Depois clique em
datasource ou a combinação de uma conexão uso em expressões. Podem simplificar o design Wizard para atualizar os valores dos cam-
com um banco de dados e uma query SQL. do relatório, declarando uma única vez uma pos. Digite o seu username e password
Neste último caso, o JasperReports converte expressão que é usada com muita freqüência, e clique em Test  para verificar o funcio-
o conjunto para um datasource da classe ou então para fazer cálculos. namento da conexão (veja a Figura 5). Se
 JRResul tSetD ataSo urce. Existem algumas variáveis pré-definidas. o teste for bem sucedido saia do diálogo
Um datasource se parece com uma tabela, Um exemplo é PAGE_NUMBER
PAGE_NUMBER,, que contém o clicando em OK .
onde as linhas são os registros e as colunas número da página corrente do relatório. Agora vamos definir a query para obten-
são os campos. Cada campo de um objeto do Para editar variáveis, execute o comando ção dos dados, e com ela obter os fields a
datasource deve ser mapeado para um field  Visualizar|Variáveis do Relatório.
Relatório. Para usar uma
serem usados no layout do relatório. Exe-
do relatório (veja adiante), para que p ossa ser variável em uma expressão, inclua o nome da
cute o comando Data |Consultas do Relatório,
Data|
usado em expressões do relatório. variável dentro das chaves do símbolo $V{} $V{}..
e na aba Report Query digite o comando
Por exemplo, para uma variável com nome
Expressões totalGeral  seria
 seria usado $V{totalGeral}
$V{totalGeral}..
SQL a seguir (veja a Figura 6):
As expressões de relatório são expressões
SELECT p.data, p.numero, c.nome as nomeCliente
Java que podem fazer referência a campos, Fields FROM pedidos p
variáveis e parâmetros do relatório. Pelo fato de Os fields são a única maneira de referenciar JOIN clientes c ON p.id_cliente = c.id
dados do datasource dentro do template de ORDER BY p.numero
usar a linguagem Java, uma expressão pode re-
ferenciar classes com o nome completo (nome relatório. Um field corresponde a um campo do
do pacote + nome da classe) ou classes que datasource ou da query SQL definida. Ao se clicar em OK , a query vai retornar
estão no classpath. Para configurar o classpath Para editar fields, execute o comando os campos data, número e nome do cliente
através do iReport, selecione o comando de Visualizar|Campos do Relatório.
Relatório. Para usar um de todos os registros da tabela de pedidos,
menu Options|Classpath
Options|Classpath.. field em uma expressão, coloque o nome do ordenados pelo número do pedido; note
field dentro das chaves do símbolo $F{} $F{}.. Para
Parâmetros um field com nome descricao
descricao,, por exemplo, 1 Em projetos
proj
projet
etos
os reais
reai
reaiss usaríamos
usar
usaría
íamo
moss uma
umaa arquitetura
um arqu
arquit
itet
etur
uraa mais
mais
ma is
Parâmetros são referências a objetos, e seria usado $F{descricao}
usado $F{descricao}.. complexa, com classes específicas para cada função. Aqui
colocamos tudo numa classe só para simplificar o exem-
plo, e focar melhor no iReport e na API do JasperReports.

Magazine • Edição 37
54  Java Magazine
que para conseguir o nome do cliente foi dades, tais como: top e left para a posição no to com o botão direito e escolher a opção
feito um join com a tabela de clientes. eixo vertical e horizontal em pixels, width “Propriedades”.. As propriedades comuns
“Propriedades”
e height para largura e altura (também em aparecem na aba Common; veja um exem-
 Ao digitar a query, os fields serão declarados pixels); mode para indicar se o elemento é plo na Figura 11.
automaticamente, ficando disponíveis para uso transparente ou opaco, entre outras. Ao criar os elementos nos passos seguin-
em todo o relatório. Cada campo retornado cor- Você pode alterar essas propriedades tes, será necessário fazer alguns ajustes
responde a um field do relatório. diretamente na área “Propriedades do em propriedades comuns como top, left,
elemento”, localizado à direita da tela width e height, para colocá-los nas posições
Vamos usar apenas
apena s as bandas pageH eader,
 pageHeader principal do iReport, ou clicar no elemen- indicadas nas figuras.
detail e pageFooter. Devemos então eliminar
 pageFooter
todas as outras, executado o comando
Visualizar|Bandas do Relatório, colocando
zero no campo Band height de cada uma
e clicando em  Appl y. Uma opção mais
 Apply.
direta de remover uma banda é arrastar
verticalmente a linha abaixo dela até que
a banda desapareça. Veja o resultado final
na Figura 7.
Antes de começar a inserir elementos no
relatório vamos definir alguns estilos de
formatação, que serão usados nos elemen-
tos de texto. Execute Formatar|Styles e defi-
na os seguintes estilos (clicando
(cl icando em New):
“Normal” com todos os valores default
mas tamanho
taman ho de fonte 10; “Destaque” com
Parent Style=Normal e fonte em Bold; “Ti-
tulo” com Parent Style=Normal,
Style=Norma l, fonte Bold
e tamanho
taman ho de fonte 18 (veja
(veja a Figura 8). Ao
definir os estilos, se o formato de saída
for PDF (que é o nosso caso), não esqueça
de definir a fonte correspondente no item Figura 2. Modelo de dados do projeto de exemplo
“PDF font name” da definição do estilo
(veja a Figura 9). Esta é a fonte que será
usada na geração do arquivo PDF.

Novos parâmetros
Precisamos definir dois parâmetros
para este relatório. Execute o comando
Visualizar|Parâmetros do Relatório  e clique
em New. Forneça o nome “pageRoot” e o tipo
 java.lang.String e clique em OK . Crie mais um
parâmetro com o nome “subReport”
“subReport” e tipo
net.sf.jasperreports.engine.JasperReport (veja a
Figura 10). Veja mais sobre parâmetros no
quadro “Glossário do JasperReports”.

Propriedades comuns de
elementos de relatórios
Todos os elementos visíveis que colocamos
coloc amos
em uma banda do relatório, como textos,
imagens, figuras geométricas, linhas e sub-
relatórios,
relatórios, compartilham algumas proprie- Figura 3. Tela
Tela principal do iReport
iRepor t ao criar um novo relatório

Edição 37 •  Java Magazine


Magazine 55
Relatórios na Web Passo a Passo

mude sua propriedade Static Text  para


“Relatório de Pedidos” e Style para “Ti-
tulo”. Na banda detail insira outros três
static texts, com os textos “Número”,
“Data do Pedido” e “Cliente”, respecti-
vamente. Veja a posição de cada um na
Figura 13.

Elemento text field 


 O elemento text field, ou campo de tex-
to, é o que pode ter, além de texto fixo,
fields, variáveis, parâmetros e outros
valores dinâmicos, definidos por ex-
pressões. Num text field, a expressão 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.

Figura 4. Ícones das barras de ferramentas do iReport No iReport, é usado o símbolo $F{} para fazer
referência a um field, $V{} para variável e $P{}
Elemento line  para parâmetro.
parâmetro. Para ver
ver todos os fields, variáveis
O elemento line, permite desenhar e parâmetros definidos no relatório, execute o
linhas no relatório. Adicione duas comando Visualizar|Campos do Relatório.
Relatório.Na Na tela
mostrada você encontrará uma aba para fields,
linhas à banda  pageHeader e uma
uma para variáveis e outra para parâmetros.
à banda  pageFooter (clique em
e depois arraste na banda para
definir o tamanho e a posição do Vamos colocar três text fields na ban-
elemento). Veja a posição de cada da detail , conforme a Figura 14 (cli-
linha na Figura 12. que em e depois arraste na ban-
da). Defina suas propriedades Textfield
Elemento static text  Expression   para $F{numero}, $F{data} e
Um elemento static text é usado $F{nomeCliente} , e Textfield Expression
para incluir textos fixos no rela- Class  para  java. lang
lang.Int eger ,  java. util
.Integer .Date e
util.Date
tório. Adicione um static text à ng, respectivamente.
 java.lang.String
 java.lang.Stri
Figura 5. Configuração da conexão ao banco de dados
 ba nd
ndaa  pa ge He ad e r
(clique em e Fique atento para que o retorno da expressão
depois arraste na colocada em Expression seja do tipo definido
 ba nd a pa ra de f i- em Expression class, pois é freqüente o caso de
nir o tamanho do ClassCastException  na compilação por causa
elemento). Depois disso.

Figura 6. Query SQL para obtenção dos pedidos (veja na par te de baixo os fields gerados) Figura 7. Template de relatório RelatorioPedidos com as bandas não-usadas removidas

Magazine • Edição 37
56  Java Magazine
nir a localização do arquivo contendo a Também adicione em Subreport Parameters
imagem. Esta expressão pode ser do tipo um novo parâmetro, numeroPedido, com o
ing,  java.io.File,  java.io.InputStr
 java.lang.String
 java.lang.Str eam,
 java.io.InputStream valor $F{numero}. Este parâmetro será
entre outros. passado para o sub-relatório pelo rela-
Adicione uma imagem (usando o íco- tório principal (veja a segunda parte da
ne ) na banda  pageFooter conforme a Figura 19).
Figura 16, e defina suas propriedades
como na Figura 17. Repare que o endere- Construindo o sub-relatório
ço da imagem é do tipo String e que está de itens de pedido
sendo usado o parâmetro  pageRoot. Este Crie um novo relatório ( Arquivo|N
 Arquivo|Novo
ovo
parâmetro
parâmet ro será passado pela aplicação que Documento) e mude seu nome para “Re-
executará o relatório. latorioItens”. Ajuste as dimensões para
500 pixels de largura e 40 pixels de altura;
Elemento subreport  mude todas as margens para zero na aba
Para incluir os itens do pedido, vamos
usar um elemento subreport (sub-relató-
rio), que faz a ligação com outroout ro relatório.
Ou seja, vamos ter um relatório dentro
de outro.
Um elemento sub-relatório é também
um relatório, portanto deve ser represen-
Figura 8. Definição do estilo
es tilo “Titulo”, e os três estilos
esti los criados
cri ados
tado por um arquivo .jasper. Além disso,
deve ter uma conexão ou datasource e
pode ter parâmetros.
Para colocar o sub-relatório dentro do
relatório principal de pedidos, clique em
e depois arraste na banda detail. Será
exibido um wizard solicitando a criação Figura 10. Configuração do parâmetro  subReport 
de um novo relatório. Com vamos fazer
as configurações diretas fora do wizard,
simplesmente clique em Cancel.
Ajuste a largura do sub-relatório para
Figura 9. Configuração da fonte de um estilo
500 e o posicione conforme mostrado na
Figura 18. Nas propriedades do elemen-
Coloque também dois text fields na to (clique com o botão direito e escolha
 banda  pageFooter (também mostrados na Properties); defina a conexão indo na aba
Figura 14) para a numeração da página. Es- Subreport e selecionando “Use connection
tes campos vão usar a variável pré-definida expression” no combobox. Isso faz com que
PAGE-NUMBER; veja a configuração necessária o sub-relatório utilize
utili ze a mesma conexão do
na Figura 15. Note que o primeiro text field relatório principal (veja a Figura 19).
usa Evaluation time = Now para mostrar o Na aba Subreport(Other), defina o arqui-
número da página corrente, e o segundo vo .jasper do sub-relatório selecionando o
usa Evaluation Time = Report para mostrar o tipo net.sf.jaspe
net.sf.jasperreports.engin
rreports.engine.JasperR eport  no
e.JasperReport Figura 11. Propriedades comuns dos elementos do relatório
último número de página ou a quantidade combobox, e em Subre-
total de páginas do relatório. Para mais de-  port Expression adicione
talhes sobre variáveis e fields veja o quadro $P{subReport} . Assim
“Glossário do JasperReports”
JasperReports”.. indicamos que será pas-
sado um objeto do tipo
Elemento image selecionado contendo
Um elemento image  no JasperReports/ o arquivo .jasper  como
iReport pode conter imagens de vários um parâmetro para o
tipos. Uma expressão é usada para defi- relatório principal. Figura 12. Template de relatório RelatorioPedidos  com as linhas horizontais incluídas

Edição 37 •  Java Magazine


Magazine 57
Relatórios na Web Passo a Passo

Page Margin, altere a codificação 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 rela-


tório depois de criado, escolha o comando
Editar|Propriedades do relatório.
relatório .

Precisamos definir o parâmetro que


será passado pelo relatório principal.
Execute Visualizar|Parâmetros do Relatório
e clique em Novo. Mude o nome para
“numeroPedido”,, o tipo
“numeroPedido” t ipo para java.lang.Integer,
 java.lang.Integer
e o valor default para “new Integer(0)”.
Integer(0)”.
Precisamos ainda definir o SQL para a
query usando o parâmetro numeroPedido
Figura 13. Template de relatório RelatorioPedidos com os elementos  static text 
(veja a Figura 20):

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{ numeroPe
numeroPedido}
dido}

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 número do
pedido igual ao parâmetro passado. Para
Figura 14. Template de relatório RelatorioPedidos com os text fields
isso foram feitos joins com as tabelas de
produtos e de pedidos.
Coloque quatro elementos static text na
 banda columnHeader com o texto
tex to “Produto”,
“Qtde.”, “Preço” e “Valor”. Coloque tam-
 bém quatro text fields na banda detail, todos
do tipo String, com exceção da quantidade
qua ntidade
que deve ser Integer. Forneça os seguintes
valores para “Textfield Expression”:
Expression”:
• $F{nomeProduto}
• $F{quantidade}
• NumberFor
NumberFormat.getCurr
mat.getCurrencyInstance().format($F{preco})
encyInstance().format($F{preco})
• NumberFor
NumberFormat.getCurr
mat.getCurrencyInstance().format(
encyInstance().format(
$F{quantidade}.intValue()*$F{preco}.doubleValue()).
Figura 15. Propriedades
Propriedades dos dois text fields para a numeração de páginas
Veja o resultado final na Figura 21.

Compilando o relatório
Existem três maneiras possíveis de se
compilar um relatório:
• Pelo próprio iReport, o que é muito fácil
fáci l
de se fazer: basta clicar em ;
• Executando uma task Ant colocada no
build.xml, o que possibil
possibilita
ita compilar vários
relatórios de uma só vez ;
Figura 16. Template de relatório RelatorioPedidos  com o elemento image na banda  pageFooter  • Diretamente na aplicação Java usando a

Magazine • Edição 37
58  Java Magazine
No servlet são realizados os seguintes uma aplicação web onde a localização dos
passos: arquivos é feita dessa forma, não é uma
1. Obtemos uma conexão com o banco de  boa prática deixar o caminho fixo, pois ele
dados MySql (o objeto da classe Connection), vai variar com o local em que a aplicação
passando a URL de acesso, o usuário for instalada.
e a senha. 3.   Depois, criamos um Map   onde são
2.  Carregamos os arquivos
arqu ivos .jasper em ob- colocados os dois parâmetros do rela-
 jetos JasperReport  usando o caminho real do tório. Estes parâmetros são: subReport
arquivo através do contexto da aplicação. com um objeto  Jasp erRe por t, contendo o
erRepor
Isso porque além de estarmos criando sub-relatório carregado; e  pageR oot  que
 pageRoot

Figura 17. Propriedades de um elemento image

API do JasperReports. Esta é a opção menos


prática e menos usada, porque normalmente
compilamos o relatório somente quando ele
é modificado em ambiente de desenvolvi-
mento; na aplicação que utiliza o relatório
 basta fornecer o arquivo compilado e os
dados para execução.

Portanto, a recomendação é compilar Figura 18. Resultado final do template de relatório RelatorioPedidos , já incluindo o sub-relatório
pelo iReport ou usando um script do Ant
(Listagem 1), visto que são as opções
mais indicadas para uso em ambiente de
desenvolvimento.
No nosso projeto de exemplo vamos usar
um script do Ant, que deve estar no dire-
tório raiz do projeto. O buildfile contém os
seguintes targets:
• compile – para compilar os relatórios;
• java – para compilar as classes
clas ses Java; aqui
temos só uma que é o servlet;
• war – para gerar um arquivo empaco-
Figura 19. Propriedades do sub-relatório
tando todos os arquivos: relatórios,
relatórios, classes
 Java,, imagens e JARs.
 Java

Então, para compilar os relatórios, abra


uma janela de prompt de comando no
Windows ou terminal no Linux, vá até o
diretório do projeto e digite ant compile.

Executando o relatório
Agora que já temos os relatórios prontos
e compilados, só precisamos
precisa mos desenvolver
desenvolver
o servlet para executar o relatório. Este
servlet vai precisar dos arquivos .jasper,
dos parâmetros – que deverão estar em um
Map – e da conexão com o banco de dados.
Veja na Listagem 2 o código completo do
servlet GeraRelatorioPedidos. O JSP que dispa-
ra a geração é mostrado na Listagem 3. Figura 20. Consulta
Consulta SQL para obtenção dos itens do pedido (e fields gerados)

Edição 37 •  Java Magazine


Magazine 59
Relatórios na Web Passo a Passo

Figura 21. Template do segundo relatório, RelatorioItens

Listagem 1. build.xml , para compilar o relatório, as classes do projeto e gerar um war public class GeraRelatorioPedidos extends HttpServlet {
public void doGet(HttpServletRe quest request,
<project name=”ecommerce” default=”war” basedir=”.”> HttpServletResponse response)
<description>Exemplo de relatório para web.</description> throws IOException, ServletException
<property name=”classes.dir” value=”web/WEB-INF/c lasses” /> {
<property name=”reports.dir” value=”web/WEB-INF/r eports” /> // obtém a conexão com o banco de dados
<property name=”lib.dir” value=”web/WEB-INF/l ib” /> Connection conn = null;
<property name=”jrxml.dir” value=”reports” /> try {
<property name=”src.dir” value=”src” />   Class.forName(“com.mysql.jdbc.Driver”);
conn = DriverManager.getCon nection(
<path id=”classpath”>   “jdbc:mysql://localhost:3306/ecommerce”,
<pathelement location=”${classes.d ir}” /> “user”, // mude para o nome do usuário do seu bd
<fileset dir=”${lib.dir}”> “password”); // mude para a senha deste usuário
<include name=”**/*.jar” /> } catch (Exception e) {...}
  </fileset>
  </path> // gera o relatório
ServletContext context = getServletContext() ;
<target name=”javac” byte[] bytes = null;
description=”Compila os arquivos fonte em Java.”> try {
<mkdir dir=”${classes.dir}” /> // carrega os arquivos jasper
<javac srcdir= JasperReport relatorioJasper = (
”${src.dir}” destdir=”${classes.dir}” debug=”true” JasperReport)JRLoader.loadObject(
optimize=”false” deprecation=”false”>   context.getRealPath(
<classpath refid=”classpath” /> “/WEB-INF/reports/RelatorioPedidos.jasper”));
  </javac> JasperReport subrelatorioJasper = (
  </target> JasperReport)JRLoader.loadObject(
  context.getRealPath(
<target name=”compile” “/WEB-INF/reports/RelatorioItens.jasper”));
description=”Compila o template e gera o arq. jasper.”> // parâmetros, se houver
<mkdir dir=”${reports.dir}” /> Map parametros = new HashMap();
<taskdef name=”jrc” classname= parametros.put(“page Root”, context.getRealPath(“/” ));
  ”net.sf.jasperreports.ant.JRAntCompileTask”> parametros.put(“subR eport”, subrelatorioJasper);
<classpath refid=”classpath” />
  </taskdef> // direciona a saída do relatório para um stream
<jrc destdir=”${reports.dir }” srcdir=”${jrxml.dir}”> bytes = JasperRunManager.ru nReportToPdf(
<classpath refid=”classpath” /> relatorioJasper,parametros,conn);
  </jrc> } catch (JRException e) {...}
  </target>
if (bytes != null && bytes.length > 0) {
<target name=”war” depends=”javac,compile ” description= // envia o relatório em formato PDF para o browser
”Gera o arquivo war da aplicação.”>   response.setContentType(“application/pdf”);
<war warfile=”ecommerce.war ” webxml=   response.setContentLength(bytes.length);
  ”web/WEB-INF/web.xml”> ServletOutputStream ouputStream =
<fileset dir=”web” includes=”**/*.jsp” /> response.getOutputStream();
<fileset dir=”web” includes=”**/*.png” /> ouputStream.write(by tes, 0, bytes.length);
<fileset dir=”web” includes=”**/*.jasper” />   ouputStream.flush();
<classes dir=”${classes.dir}”>   ouputStream.close();
<include name=”**/*.class” /> }
  </classes> }
<lib dir=”${lib.dir}”> }
<include name=”*.jar” />
<exclude name=”j2ee.jar”/>
  </lib>
  </war> Listagem 3. index.jsp
  </target>
</project> <%@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”>
Listagem 2. GeraRelatorioPedidos, servlet que executa o relatório <html>
  <head>
package br.com.globalcode.servlet; <meta http-equiv=”Content- Type” content=
”text/html; charset=UTF-8”>
import java.io.IOException; <title>Relat&oacute;ri o de Pedidos</title>
import java.sql.*;   </head>
import java.util.*;   <body>
  <h1>
import javax.servlet.*; <a href=”pdf” target=”_blank”>
import javax.servlet.http.*; Executar o relat&oacute;rio de pedidos em PDF
</a>
import net.sf.jasperreports.engine.*;   </h1>
import net.sf.jasperreports.engine.util.JRLoader;   </body>
</html>

Magazine • Edição 37
60  Java Magazine
é um objeto String contendo o endereço no OutputStream  do objeto response. Dessa ecommerce.war  para a pasta webapps do
da raiz do contexto da aplicação. Este maneira o relatório será visualizado di- Tomcat.
último parâmetro será usado para lo- retamente dentro do navegador web,
web, que Feito isso, inicie o Tomcat, abra o seu na-
calização da imagem usada no relatório fica responsável por executar o aplicativo vegador
vegad or web e digite a seguinte
segu inte URL: http:// 
principal. visualizador correspondente (ex.: o Acro- localhost:8080/ecommerce. Clique no link que
4. Depois disso, executamos o relatório  bat Reader).
Reader). aparece na tela, e o relatório será gerado
usando o método runReportToPdf() , da classe conforme se pode ver na Figura 22.
 JasperRunManager , gerando a saída em PDF. Para rodar o relatório, precisamos
Passamos o objeto  JasperRep ort , o Map de
 JasperReport primeiro gerar o arquivo ecommerce.war Conclusões
parâmetros e a Connection, e recebemos seu através da target war do Ant do build.xml. Neste artigo apresentamos um tutorial
retorno num array de bytes. Vá ao prompt de comando (ou terminal)
termi nal) e para a criação de um relatório mestre-de-
5. No final, jogamos este array de bytes digite ant war. Em seguida, copie o arquivo talhe processado e exibido em ambiente
web. Poderíamos fazer várias melhorias
neste exemplo,
exemplo, como colocar totalizações,
tota lizações,
adicionar quebras por cliente, usar um
datasource gerado pela aplicação Java ao
invés de conexão direta com o banco de
dados, e muitas outras. Voltaremos
Voltaremos a falar
f alar
sobre essas funcionalidades mais avança-
das em artigos futuros.

 jasperreports.sf.net 
 jasperreports.sf.net 
Site da biblioteca JasperReports, onde se
pode encontrar página para download do
software, documentação, fóruns, etc.
 ireport.sf.net 
 ireport.sf.net 
Site da ferramenta iReport, também com
download, novidades, etc.
 lowagie.com/iText 
 lowagie.com/iText 
Site da biblioteca de geração de PDF usada pelo
JasperReports.

 javamagazine.com.br/downloads/jm37/
 javamagazine.com.br/downloads/jm37/
 jm-relatorios.zip
Figura 22. Execução do relatório completo no navegador web

Ana Abrantes
Dicas de configuração (ana.abrantes@globalcode.com.br )
é desenvolvedora Java na

P ara facilitar o desenvolvimento com o


iReport, recomendamos que sejam feitas
algumas configurações, através do comando
(para usar o compilador  jd jdt-
t- co
comp
mpilil er que
vem junto com o iReport) ou Java Compile r
(para usar o compilador da sua JDK; é só
Globalcode, co-autora
co-autora do curso
de JasperReports/iReport e possui
algumas certificações em Java (SCJA, SCJP e SCWCD). É
Options|Option::
Options|Option copiar o arquivo tools.jar   para a pasta lilibb formada pela FATEC-SP e atua na área de informática
do iReport) há mais de 15 anos.
Na aba General : • selecione “use the reports directory for
 Yara M. H. Senger
• "Language" = português (Brasil) (Para visu- compiles” (para que os arquivos compilados
( yara@globalcode.com.br ) é formada
 yara@globalcode.com.br 
alizar os itens de menu em p ortuguês) .jasper sejam gravados no mesmo diretório que
em Ciências da Computação na USP
• "Default language for expressions" = Java os arquivo .jrxml )
em São Carlos, especialista em desen-
(Para indicar que a linguagem de programação
volvimento web; possui as certificações
utilizada no relatório é Java) Na aba External programs:
programs :
SCJA, SCJP e SCWCD. Atualmente é Instrutora e Diretora
• Forneça o caminho do editor de tex to e dos Educacional da Globalcode, criadora e coordenadora
Na aba Compiler : aplicativos de visualização de cada formato de de diversos cursos das carreiras Academia do Java e
• "compiler" = JasperReports default arquivo que desejar. Academia do Web Developer.

Edição 37 •  Java Magazine


Magazine 61
Introdução ao Bl
Aprenda Visualmente Programação
Programação

O BlueJ é um ambiente gratuito de


desenvolvimento de aplicações
orientadas a objetos, utilizando a
linguagem de programação
progra mação Java. Uma de
suas características principais
princ ipais é a facilida-
A Figura 1   apresenta a
interface principal
pri ncipal do BlueJ. A
grande área central é o Class
Browser, e a parte inferior
é chamada de ObjectBench.
de de aprendizagem de programação OO, O Class Browser possibilita
através de recu
recursos
rsos visuais
visua is interativos. Por
Por definir visualmente uma
exemplo,, classes e relacionamentos
exemplo relaciona mentos podem estrutura de classes (usando
ser definidos visualmente, e é possível um subconjunto simplificado
verificar o comportamento dos objetos em da linguagem
lingu agem de modelagem
memória durante a execução. UML), e ta mbém instan-
O BlueJ é resultado de um projeto de ciar objetos interativamen-
pesquisaa voltado
pesquis voltado ao ensino de orientação a te, que são mostrados no
objetos para iniciantes, desenvolvido pela ObjectBench. Os atributos
Deakin University (Austrália) e University dos objetos podem ser exa-
Figura 1. Interface principal do BlueJ
of Kent (Inglaterra), com contribuições de minados através do Object
diversos outros grupos. É também supor- Inspector (não mostrado na
tado pela Sun Microsystems. O projeto figura), e métodos podem
“NetBeans BlueJ Edition”,
Edition”, que recentemente
recenteme nte ser executados via cliques
liberou sua primeira versão beta, permite a do mouse.
migração suave dede iniciantes utilizando
utili zando do
BlueJ para um IDE profissional. Construindo um projeto no BlueJ
Para criar um projeto, deve-se
deve-se aces-
O ambiente BlueJ sar Project|New Project no menu
Project|New
O download do BlueJ pode ser feito em principal. Para exempli-
bluej.org. Há instaladores nativos para ficar o processo de
Windows e Mac OS X, e um JAR executável
exec utável
que pode ser usado em qualquer sistema
operacional com suporte a Java. Para
Para exe-
cução é necessário ter um JDK instalado
(1.4.2
(1.4.2 ou mais
ma is recente).

Magazine • Edição 37
62  Java Magazine
 ueJ
 ueJ
Conheça o ambiente que é
cada vez mais usado para
ensinar a orientação a
objetos e desenvolvimento
 Java em universidades
universidades
OO e Java
MARCELO DAIBERT E MARCO ANTÔNIO ARAÚJO

criação de um projeto utilizando o BlueJ, isso é possível criar as cinco classes do lo, o BlueJ cria um arquivo de código fonte
será apresentado um estudo de caso exemplo, como mostrado na Figura 3.  Java,
 Java, e mantém
mantém sincroniza
sincronizado
do o código
código com
com
que cria uma hierarquia de classes de o modelo de classes. Ou seja, modificando o
um sistema de RH hipotético. Existem  É possível também adicionar uma nova classe modelo, altera-se o código, e vice-versa.
as classes Funcionario, FuncionarioHorista, ao projeto através de uma classe já existente ar- Com as classes criadas e exibidas no
FuncionarioDiarista e FuncionarioMensalista . A mazenada em um arquivo no disco,
superclasse Funcionario  é abstrata, servindo através do comando Edit|Add Class
para a definição dos elementos comuns from File.
às suas subclasses. Todos os funcionários
estão lotados em um Departamento, que pode Para criar relacionamentos
ter vários funcionários. de dependência entre classes,
Para adicionar uma nova classe ou é necessário clicar no botão
interface ao projeto, clique no botão New com uma seta tracejada, depois
depois
Class. Será apresentado um diálogo permi- na classe de origem, e arrastar
tindo definir
defin ir o nome e o tipo do elemento a até a classe destino. Deve-se
ser criado (Figura 2). Podem criar duas dependências entre
ser criadas classes concretas Funcionario  e Departamento , como
e abstratas e in- mostrado na Figura 4. Um Figura 3. Criação de classes
terfaces, além de funcionário deve estar lotado
elementos mais em um departamento e um
complexos como departamento pode ter vários
applets, testes uni- funcionários.
tários do JUnit e Para a criação de relaciona-
enums (esta última mentos de herança, o processo é
opção está disponível semelhante. Deve-se pressionar
apenas no JSE 5.0 ou o segundo botão, selecionar a
superior). Confirmada classe filha e arrastar até a clas-
a criação, a classe é exi- se pai. A Figura 5 apresenta a
 bida de forma
forma gráfica no hierarquia a ser criada.
Class Browser. Com Para cada elemento do mode-
Figura 4. Criação de dependências entre classes

Figura 2. Criação de uma nova classe Figura 5. O modelo de classes completo, com relacionamentos de herança

Edição 37 •  Java Magazine


Magazine 63
Introdução ao BlueJ

atributos: numHorasDia  (número de horas Executando o projeto


trabalhadas por dia), numDiasMes  (número O primeiro passo para executar o pro-
de dias trabalhados por mês) e valorHora  jeto é a compi compilação
lação.. Isto pode ser feito
(valor de cada hora trabalhada). Note que através do botão Compile, que compila
o construtor da classe invoca o construtor todas as classes. Ou acionando a opção
da superclasse com super(). O método Compile  disponível no menu de contexto
calcularSalario() redefine o método abstrato (botão direito) de cada classe. (Toda vez
herdado de Funcionario . que uma classe sofre uma altera
a lteração,
ção, ou se
A implementação das classes ainda não tiver sido salva uma primeira
FuncionarioMensalista e FuncionarioHorista é vez, o BlueJ
BlueJ marca essa classe com li nhas
muito semelhante, modificando-se ape- diagonais).
nas a fórmula de cálculo do
salário.
Finalmente, a Listagem 3
mostra o código fonte da clas-
se Departamento, que contém
dois atributos: descricao e uma
lista (ArrayList) de objetos do
tipo Funcionario. Note que há
duas sobrecargas do constru-
tor (versões com assinaturas e
implementações diferentes).
Em ambos, é instanciada a lis-
ta de funcionários definida.
Por fim, o método listAll() per-
corre seqüencialmente a lista
de funcionários, imprimindo
Class Browser, é possível então editá-las seus nomes e salários. Figura 6. Editor do BlueJ
para adicionar atributos e métodos, den-
tre outros. Ao clicar com o botão direito
sobre uma classe e acionar Open Editor, é Listagem 1. Classe abstrata Funcionario

exibido um editor simples com o código public abstract class Funcionario{


protected String nome;
da classe selecionada (veja a Figura 6). protected Departamento departamento;
A Listagem 1 apresenta o código fonte
public Funcionario(String nome, Departamento departamento){
da classe abstrata Funcionario. Há dois atri- this.nome = nome;
 butos: nome e departamento. O construtor da this.departamento = departamento;
  departamento.addFuncionario(this);
classe deixa explícita a obrigatoriedade de o }
public void setNome(String nome){
funcionário estar lotado em algum departa- this.nome = nome;
mento, uma vez que departamento deve ser }
public String getNome(){
fornecido como parâmetro. Ainda no cons- return nome;
}
trutor, é invocado o método addFuncionario() public abstract float calcularSalario();
para associar o funcionário
f uncionário que está sendo public String toString(){
return nome + “ - “ + calcularSalario();
instanciado ao seu departamento. }
O método abstrato calcularSalario() é public void setDepartamento(Departa mento departamento){
this.departamento = departamento;
implementado nas classes filhas, permi- }
public String getDescricaoDepartamento(){
tindo ilustrar o uso
u so de polimorfismo. Há if (departamento != null) {
também o método toString(), que produz return departamento.getDesc ricao();
}
uma representação textual do objeto. Os else {
return “Funcionario não alocado a departamento”;
demais métodos são os  gets e sets. }
A Listagem 2 exibe a classe FuncionarioHorista, }
}
que especializa Funcionario. Ela tem três

Magazine • Edição 37
64  Java Magazine
Listagem 2.  Classe FuncionarioHorista Listagem 3.  Classe Departamento

public class FuncionarioHorista extends Funcionario{ import java.util.ArrayList;


private int numHorasDia; import java.util.Iterator;
private int numDiasMes;
public class Departamento{
private int valorHora; private String descricao;
private ArrayList funcionarios;
public FuncionarioHorista(String nome, int numHorasDia,
int numDiasMes, int valorHora, Departamento departamento) public Departamento(){
{ funcionarios = new ArrayList();
super(nome, departamento); }
this.numHorasDia = numHorasDia; public Departamento(String descricao){
this.numDiasMes = numDiasMes; this.descricao = descricao;
funcionarios = new ArrayList();
this.valorHora = valorHora;
}
} public String getDescricao(){
public void setNumHorasDia(int numHorasDia) { return descricao;
this.numHorasDia = numHorasDia; }
} public void setDescricao(String descricao){
public void setDiasMes(int numDiasMes){ this.descricao = descricao;
this.numDiasMes = numDiasMes; }
} public void addFuncionario(Funcionario funcionario){
public void setValorHora(int valorHora){   funcionarios.add(funcionario);
}
this.valorHora = valorHora; public void listAll (){
} for (Iterator i = funcionarios.iterator (); i.hasNext();) {
public float calcularSalario(){   System.out.println(i.next());
return numHorasDia * numDiasMes * valorHora; }
} }
} }

Edição 37 •  Java Magazine


Magazine 65
Introdução ao BlueJ

Feita a compilação, é possível instanciar apresenta o resultado exibido após a in-


objetos clicando numa classe com o botão vocação desse método, no Terminal do
direito e selecionando um dos construtores BlueJ. O método listaAll() invoca o serviço
disponíveis. É então exibido um diálogo com toString() da classe Funcionario  que, por
os campos necessários para a instanciação sua vez, executa o calcularSalario() . Este é
do objeto, de acordo com o construtor sele- invocado polimorficamente na classe
cionado. Por exemplo, criamos um objeto concreta que instanciou
instanc iou o objeto – no caso
Departamento, escolhendo o segundo cons- FuncionarioHorista .
trutor (veja a Figura 7). A Figura 8 exibe os
dados fornecidos a este construtor.
con strutor.  Se o método for executado outra vez, o resul-
Deve ser criado também um objeto tado anterior não é eliminado. Para limpar a ja- Figura 8. Fornecendo dados a
FucionarioHorista. Como visto na Figura 9, nela a cada nova execução, um construtor
criamos um funcionário com nome Paulo no Terminal escolha a op-
Silva, que trabalhou quatro horas por dia ção de menu Options|Clear
e doze dias por mês, e que recebe 23 reaisrea is Screen at Method Call.
por hora trabalhada, além de estar lotado
no departamento financeiro (criado an- Depuração e
teriormente). Um detalhe importante é a documentação
necessidade de se colocar entre aspas os O BlueJ fornece ainda
valores para campos String. o recurso de depura-
Objetos criados são mostrados no ção de código fonte,
ObjectBench, na parte inferior da tela. permitindo visualizar Figura 9. Instanciação de FuncionarioH
FuncionarioHorista
orista
Todos os métodos do objeto (inclusive passo a passo o código
os herdados) podem ser invocados cli- sendo executado. Esta
cando com o botão direito sobre eles, funcionalidade é aces-
como visto na Figura 10. A Figura 11 sada ao adicionar um
mostra o resultado da execução do breakpoint  no editor de
método calcularSalario()   na instância de código. Para isso deve-
FuncionarioHorista recém-criada. se clicar na coluna à
Como outro exemplo,
exemplo, pode-se acionar
aciona r o esquerda da linha em
método listAll() do objeto depFinanceiro  a fim que se deseja parar a
de visualizar todos os funcionários lota- execução, como exem-
dos naquele departamento. A Figura 12 plificado na Figura 13.

Figura 10. Executando um método de um objeto no ObjectBench

Figura 11. Resultado de execução de um Figura 12. Saída do método listAll(),


método no ObjectBench quando invocado no objeto depFinanceiro

Figura 7. Executando um construtor da classe Departamento Figura 13. Breakpoint no editor do BlueJ

Magazine • Edição 37
66  Java Magazine
disco em uma pasta chamada doc dentro
bluej.org
da pasta do projeto. Outra opção para Site oficial do BlueJ
Assim que che- gerar e visualizar a documentação é pelo
gar ao breakpoint, comando Tools|Project Documentation no edu.netbeans.org/bluej 
o BlueJ apresenta menu principal. NetBeans IDE BlueJ Edition
uma interface de
depuração. O Conclusões Marco Antônio Pereira Araújo
código pode ser Cada vez mais, o BlueJ vem sendo (maraujo@granbery.edu.br  ) é
executado linha utilizado como ferramenta didática no professor do Curso de Bachare-
lado em Sistemas de Informação
a linha, com ins- meio acadêmico com o intuito de en- da Faculdade Metodista Granbery,
peção de variáveis sinar o paradigma orientado a objetos Mestre em Engenharia de Sistemas e Computação pela
e de objetos a partir do e a linguagem de programação Java. A COPPE/UFRJ e Analista de Sistemas da Prefeitura de
 breakpoi
 brea kpoint.
nt. ferramenta conta com uma excelente Juiz de Fora.
O BlueJ fornece ainda a opção de documentação, além de um ativo grupo
gerar documentação JavaD
JavaDococ automatica- de usuários, prontos para tirar qua lquer Marcelo Santos Daibert
(mdaibert@npq.granbery.edu.br  ) é
mente. Deve-se
Deve-se entrar no editor de código dúvida de usuários iniciantes. Em seu
graduado em Sistemas de Informação
e, na combobox no canto direito de cima, site oficial, são disponibilizados links pela Faculdade Metodista Granbery
alterar a opção de “Implementation
“Implementation”” para para o cadastro em listas de discussão, e Pós-Graduando em Ciência da
“Interface”.. Será exibida a documentação
“Interface” doc umentação além de tutoriais de utilização da ferra- Computação pela Universidade Federal de Viçosa. É
gerada, e criados os arquivos HTML em menta e diversos artigos. Desenvolvedor de Sistemas há cinco anos.

Edição 37 •  Java Magazine


Magazine 67
Testes sob Controle co
Isolando testes e controlando dependências

P rocessos ágeis como o Extreme


Programming vêm popularizando
o conceito de automação de testes,
sobretudo através do uso de testes de
unidade. Mas estes testes, embora sejam
Exemplo de dificuldade para
testar classes isoladamente
Imagine que estivéssemos desenvol-
vendo um software para automatizar as
operações de um restaurante. Entre as
A impressão de uma conta, como pode
ser observado na Figura 2, é composta por
linhas, onde cada linha indica um item,
sua quantidade e o preço total (quantidade
de itens da linha multiplicada pelo preço
 bastante úteis para manter a boa saúde de muitas funcionalidades desse sistema, unitário do item). Um item, por sua vez,
um software, freqüentemente são difíceis uma essencial seria a geração da conta. possui um nome e um preço unitário. Na
de serem criados. Uma conta típica tem muitas caracterís- parte inferior da impressão da conta é
Testes de unidade procuram testar clas- ticas, mas iremos nos preocupar apenas apresentado o valor total a ser pago, que
ses isoladamente. Mas classes em um siste- com a mais importante:
importa nte: o total a ser pago. é, como esperado, o somatório do total de
ma normalmente alcançam seus objetivos Como exemplo, vamos implementar um cada linha.
com a ajuda de outras classes; não funcio-
funcio - teste para validar se o total da conta está Na Listagem 1, você encontrará o teste
nam isoladamente. Quando construímos sendo calculado corretamente. criado, bem como a respectiva classe Conta,
um teste de unidade, um dos principais Nossa classe Conta   foi modelada de cujo método total() desejamos testar.
test ar. Note
desafios é exatamente isolar a classe sen- acordo com o diagrama apresentado na que as outras duas classes modeladas
do testada, para que nenhuma outra seja Figura 1. precisaram ser usadas durante a criação
envolvida no teste. Para compreender o
problema, vejamos um
exemplo.

Magazine • Edição 37
68  Java Magazine
Conheça na prática uma
técnica que permite

m Mock Ob je
 jects
cts deixar seus testes
mais auto-contidos e
gerenciáveis, e use a
com objetos substitutos ferramenta open source
EasyMock 

VINÍCIUS MANHÃES TELES

uma classe especial chamada LinhaMock, que


Conta Linha Item  já recebe no construtor o valor total de uma
item : Item nome : String linha. A classe LinhaItem, por sua vez, passa a
quantidade : int preco : int implementar uma interface com um único
adicionar() : void método: total(). Esse método dessa interface
total() : int
total() : int é exatamente o que será utilizado na classe
Conta, como podemos ver a seguir:
Figura 1. Classes usadas para modelar uma conta.
public void adiciona(Linha linha) {
total += linha.total();
Item Preço Unitário Quantidade Total }
Item L as a n h a R $ 10.0 0 2 R $ 20.0 0
Refrigerante R $1.0 0 2 R $ 2.0 0 Usando uma interface Linha, podemos
Sor vete R $ 4.0 0 1 R $ 4.0 0 Linha evitar o uso da classe concreta LinhaItem
Ca f e z i n h o R $ 2.0 0 2 R $ 4.0 0
durante os testes e, em seu lugar, usar uma
outra classe que finge ser a classe
c lasse LinhaItem.
Tot al da Cont a R $ 30.0 0
Isso só é possível porque estamos usandousa ndo
Figura 2. Exemplo de impressão de conta. uma interface.
Um mock object, como o nosso exemplo
do teste: LinhaItem e Item. Isso tornou o cada unidade muito bem, de modo que LinhaMock, é um objeto que se comporta
método de teste maior e mais
ma is complexo. E eventuais erros nos testes possam resultar como um substituto maisma is conveniente que
essa forma de confeccionar o teste faz com de falhas em um único ponto (uma única o objeto real. Ele resolve uma dependência
que não seja verdadeiramente um teste de unidade) do software. Erros identificados importante para que um teste de unidade
unidade, pois a classe Conta não está sendo dessa forma são mais fáceis de serem possa ser executado mantendo o máximo
testada isoladamente: se o teste deixar corrigidos do que os que podem ter sido de isolamento. Além disso, frequente-
de funcionar devido a uma falha no causados em inúmeros pontos diferentes mente é mais fácil instanciar e configurar
código, isso pode ter sido causado por da aplicação. um mock de forma apropriada para ser
uma falha na classe Conta, utilizado em um teste. Em alguns casos,
ou mesmo em LinhaItem Entram os mock objects o uso desse objeto também permite evitar
ou Item. Uma solução eficaz é o uso de mock acessos a recursos mais difíceis de confi-
Isso é ruim, objects  (objetos “de mentira”, ou objetos gurar e controlar, como bancos de dados
porque quando substitutos), que permitem isolar as classes ou recursos na rede. Isso permite que os
fazemos testes de um sistema de forma bastante
basta nte simples. testes possam ser executados mais rapida-
de unidade, pro- No nosso exemplo a classe Conta depende mente e de forma maismai s previsível.
curamos isolar diretamente da classe LinhaItem. Neste caso,
utilizar um mock object (também chamado Usando o EasyMock
“mock”) significa que, quando
qua ndo estivermos O uso de LinhaMock  facilitou nossos testes,
testando, ao invés de usar a classe LinhaItem mas nem sempre é tão fácil escrever um
usaremos uma outra classe que “finge” ser mock object. Por exemplo, suponha que
essa classe, porém é mais simples e mais quiséssemos testar um servlet que im-
fácil de ser usada durante os testes. plementa um mecanismo simplificado de
A Listagem 2 mostra as modificações login, recebendo dois parâmetros: o login
realizadas. Durante o teste passamos a usar e a senha de um usuário.

Edição 37 •  Java Magazine


Magazine 69
Testes sob Controle com Mock Objects

Listagem 1. Teste
Teste da conta sem usar mock objects.
Classe ContaT
ContaTeste
este Classe Conta

import junit.framework.TestCase; public class Conta {


private int total;
public class ContaTeste extends TestCase {
public void testTotalNota() { public void adiciona(LinhaItem linhaItem) {
Conta conta = new Conta(); total += linhaItem.total();
}
Item lasanha = new Item(); public int total() {
lasanha.setNome(“Lasanh a a Bolognesa”); return total;
  lasanha.setPreco(10); }
}
Item refrigerante = new Item();
  refrigerante.setNome(“Guarana”); Classe LinhaItem
  refrigerante.setPreco(1);
public class LinhaItem {
Item sorvete = new Item(); private Item item;
sorvete.setNome(“Sorvet e de Chocolate”); private int quantidade;
  sorvete.setPreco(4);
public LinhaItem(Item item, int quantidade) {
Item cafezinho = new Item(); this.item = item;
cafezinho.setNome(“Cafe Expresso”); this.quantidade = quantidade;
  cafezinho.setPreco(2); }
public int total() {
LinhaItem linhaLasanha = new Linha(lasanha, 2); return item.getPreco() * quantidade;
LinhaItem linhaRefrigerante = new Linha(refrigerante, 2); }
LinhaItem linhaSorvete = new Linha(sorvete, 1); }
LinhaItem linhaCafezinho = new Linha(cafezinho, 2);

  conta.adiciona(linhaLasanha); Classe Item


  conta.adiciona(linhaRefrigerante);
  conta.adiciona(linhaSorvete); public class Item {
  conta.adiciona(linhaCafezinho); private String nome;
private int preco;
assertEquals(30, conta.total());
} //... Métodos get/set
} }

Sabemos que, para obter parâme- o EasyMock faça isso dinamicamente, o expect(requestMock.getParameter(“login”)).
tros em um servlet, usamos o método que evita que seja preciso criar um novo andReturn(“patricia”);
getParameter(“nome_parametro”) da interface arquivo para nosso mock. expect(requestMock.getParameter(“senha”)).
andReturn(“floresta”);
HttpServletRequest, como apresentado na O EasyMock pode ser obtido em
Listagem 3. Podemos escrever um teste para easymock.org. Em seguida, basta extrair
o método loginValido(HttpServletRequestrequest) do download a biblioteca easymock.jar e Esses passos fazem a preparação do mock
criando um mock object que substitui colocá-la no classpath de seu projeto. e indicam como ele deve se comportar
um objeto concreto que implementa a O primeiro passo ao usar o EasyMock quando algum
algu m teste estiver em uso. Termi-
Termi-
interface HttpServletRequest . Entretanto, é solicitar a criação de um mock para nada a preparação, precisamos informar
esta é uma interface que possui mais de uma interface em particula
particular.r. No exemplo,
exemplo, ao mock que ele já não está mais sendo
dez métodos, e estamos interessados em pedimos que fosse criado um mock para preparado, ou seja, que é hora da ação. Para
apenas um deles: getParameter(). Criar um a interface HttpServletRequest, conforme a isso usamos o método replay() :
mock object para isso significaria criar um seguir:
classe com a implementação desejada de replay(requestMock);
HttpServletRequest requestMock =
HttpServletRequest LoginServlet loginServlet = new LoginServlet();
getParameter() e uma implementação vazia
  createMock(HttpServletRequest.class); assertTrue(loginServlet.loginValido(requestMock));
ou mínima de todos os demais métodos.
Isso seria trabalhoso e poluiria a aplicação No passo seguinte, criamos compor- A partir desse ponto o mock pode ser
com mais código. tamentos específicos. O mock do objeto usado normalmente onde antes teria
Uma solução é usar APIs para gerar e request  irá esperar que alguma outra classe sido necessário utilizar um objeto real da
manipular mock objects.
object s. Uma ferramenta acesse o seu método getParameter() , pas- aplicação.
popular é o EasyMock, que permite
perm ite gerar sando a string “login” como parâmetro. Os métodos usados para programar o
mock objects muito mais facilmente. Veja Quando isso ocorrer, o mock deverá re- mock ficam disponíveis para a classe de
na Listagem 4 um exemplo de teste do lo- tornar a string “patricia”.
“patricia”. Além disso, pro- testes através de um import  estático dos
gin usando
usa ndo o EasyMock. Com ele, ao invés gramamos requestMock.getParameter(“senha”) métodos da classe EasyMock. Isso impli-
de criarmos uma classe que implementa para retornar a string “floresta”, como ca na necessidade de se usar o Java 5 ou
uma interface específica, deixamos que mostrado a seguir. superior:

Magazine • Edição 37
70  Java Magazine
Edição 37 •  Java Magazine
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 { import javax.servlet.ServletException;


public void testTotalNota() { import javax.servlet.ServletOutputStream;
Conta conta = new Conta(); import javax.servlet.http.HttpServlet;
conta.adiciona(new LinhaMock(20));
conta.adiciona(new LinhaMock(2)); import javax.servlet.http.HttpServletRequest;
conta.adiciona(new LinhaMock(4)); import javax.servlet.http.HttpServletResponse;
conta.adiciona(new LinhaMock(4));
assertEquals(30, conta.total()); public class LoginServlet extends HttpServlet {
} protected void doGet(HttpServletReq uest request,
} HttpServletResponse response)
throws ServletException, IOException
Nova interface Linha {
ServletOutputStream out = response.getOutputStre am();
public interface Linha { if (loginValido(request)) {
int total();   out.println(“Bem-vindo”);
} } else {
out.println(“Acesso Negado”);
Classe LinhaMock }
}
public class LinhaMock implements Linha {
private int total;
public boolean loginValido(HttpServ letRequest request) {
public LinhaMock(int total) { if (“patricia”.equals(requ est.getParameter(“logi n”)) &&
this.total = total; “floresta”.equals(request.getParameter(“senha”))) {
} return true;
public int total() { }
return total; return false;
} }
} }

Magazine • Edição 37
72  Java Magazine
Listagem 4. Testando
Testando se login e senha são válidos usando EasyMock. import static  org.easymock.EasyMock.*;

import javax.servlet.http.HttpServletRequest;
import junit.framework.TestCase; Se você estiver usando uma versão mais
import static org.easymock.EasyMock.*; antiga do Java, é possível usar um release
public class LoginTeste extends TestCase { do EasyMock anterior ao 2.0 (o 2.2 foi
public void testLoginComSucesso () {
HttpServletRequest requestMock = createMock(HttpServlet Request.class); utilizado neste artigo). Porém nesse caso
  expect(requestMock.getParameter(“login”)).andReturn(“patricia”); a forma de implementar os mocks seria
  expect(requestMock.getParameter(“senha”)).andReturn(“floresta”);
  replay(requestMock); ligeiramente diferente. Veja um exemplo:
LoginServlet loginServlet = new LoginServlet();
  assertTrue(loginServlet.loginValido(requestMock)); MockControl mockControl =
} MockControl.createControl(HttpServletRequest.class);
} HttpServletRequest
HttpServletReque st requestMock =
(HttpServletRequest)mockControl.getMock();
Listagem 5. Servlet modificado. mockControl.expectAndReturn(
requestMock.getParamete
requestMock.ge tParameter(“login”),
r(“login”), “patricia”);
import java.io.IOException; mockControl.expectAndReturn(
import javax.servlet.RequestDispatcher; requestMock.getParamete
requestMock.ge tParameter(“senha”),
r(“senha”), “floresta”);
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
mockControl.replay();
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; Verificando expectativas
public class LoginServlet extends HttpServlet { Suponha que o servlet tivesse sido pro-
protected void doGet(HttpServletReq uest request, HttpServletResponse response) gramado de forma diferente, tal como mos-
throws ServletException, IOException {
String proximaPagina; trado na Listagem 5. Nesse caso não seria
if (“patricia”.equals(requ est.getParameter(“logi n”)) &&
“floresta”.equals(request.getParameter(“senha”))) { possível fazer o teste utilizando um assert
proximaPagina = “bem-vindo”; do JUnit, pois na prática o teste teria que
} else {
proximaPagina = “acessoNegado”; verificar qual página foi escolhida
escolh ida para dar
}
RequestDispatcher requestDispatcher = continuidade à execução: bem-vindo.jsp ou
request.getRequestDispatcher(proximaPagina + “.jsp”); acessoNegado.jsp.
requestDispatcher.forw ard(request, response);
} Usando o EasyMock, é possível criar um
}
teste que resolve esse problema, conforme
Listagem 6. Teste
Teste usando verify() do EasyMock. mostrado na Listagem 6. Veja
Veja a parte mais
ma is
import javax.servlet.RequestDispatcher;
importante dessa listagem:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; private HttpServletRequest requestMock() {
import static org.easymock.EasyMock.*; HttpServletRequest
HttpServletReque st requestMock =
import junit.framework.TestCase;
createMock(HttpServletRequest.class);
public class LoginTeste extends TestCase { (...)
public void testLoginComSucesso () throws Exception { expect(requestMock.getRequestDispatcher(
LoginServlet loginServlet = new LoginServlet();   “bem-vindo.jsp”)).andReturn(requestDispatcher());
replay(requestMock);
HttpServletRequest requestMock = requestMock();
loginServlet.doGet(req uestMock, responseMock());
  verify(requestMock);
}
Caso o código da aplicação esteja cor-
reto, o mock espera que seja executado
private HttpServletRequest requestMock() {
HttpServletRequest requestMock = createMock(HttpServlet Request.class); getRequestDispatcher(“bem-vindo.jsp”) . Caso
  expect(requestMock.getParameter(“login”)).andReturn(“patricia”); isso não ocorra, será gerado um u m erro
  expect(requestMock.getParameter(“senha”)).andReturn(“floresta”);
  expect(requestMock.getRequestDispatcher(“bem-vindo.jsp”)).andReturn( pelo método verify(), tal como foi usado
requestDispatcher());
  replay(requestMock); a seguir:
return requestMock;
}

private RequestDispatcher requestDispatcher() {


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

private HttpServletResponse responseMock() throws Exception {


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

Edição 37 •  Java Magazine


Magazine 73
Testes sob Controle com Mock Objects

public void testLoginComSucesso()


testLoginComSucesso() throws Exception { objects que podem ser criados
c riados com o Easy- que foram configuradas. Cria-se um mock
LoginServlet loginServlet = new LoginServlet();
  (...)
Mock. Um mock object
obj ect “comum”
“comum” é criado
cr iado object deste tipo com createStrictMock().
loginServlet.doGet(requestMock,
loginServlet.doGet(requestM ock, responseMoc
responseMock());
k()); com o método createMock() , e só permite
  verify(requestMock); que o aplicativo chame métodos do mock Conclusões
}
object que foram programados no teste O uso de mock objects é fundamental
Se introduzirmos um defeito no códi- para serem chamados. Uma chamada a para se obter um nível de isolamento de-
go, fazendo com que o mesmo utilize qualquer outro método irá causar um sejável ao criar testes de unidade. Sem essa
“bemvindo” no lugar de “bem-vindo”, erro. Por exemplo,
exemplo, caso tivéssemos usado técnica, usar testes de unidade pode se
obtemos um erro como o seguinte: createMock() no código anterior, obteríamos tornar não apenas doloroso, mas também
a seguinte mensagem de erro: inviável. O EasyMock é uma ferramenta
 java.lang.A ssertio
ssertionError:
nError: que possibilita a criação de mock objects
Unexpected method call getRequestDispatcher(“bemvindo.
getRequestDispatcher(“bemvindo.  java.lang.A ssertio
ssertionError:
nError:
 jsp”)::
 jsp”) Unexpected method call forward(
dinamicamente, de maneira simples,
getRequestDispatcher(“bem-vindo.js
getRequestDispa tcher(“bem-vindo.jsp”):
p”): expected: 1,1, actual: 0 EasyMock for interface javax.servlet.http.H
javax.servlet.http.HttpServletRequest,
ttpServletRequest, permitindo que o desenvolvedor tenha
O erro indica que o mock esperava que seu EasyMock for interface javax.servlet.http. total controle sobre o comportamento dos
HttpServletResponse):
método getRequestDispatcher(“bem-vindo.jsp”) mocks criados.
fosse chamado
cha mado uma vez, porém na realida-
de nunca foi chamado. O verify() , portanto, Essa mensagem indica que o método Test-driven development
pode ser usado sempre que desejamos es- forward() não deveria ter sido chamado pela Kent Beck (Addison-Wesley, 2003)
tabelecer uma expectativa, ou seja, algum aplicação,, pois o mock não foi configurado
aplicação con figurado Mostra como criar e executar testes, de forma
tipo de chamada de método que espera- para chamadas ao método. detalhada, utilizando exemplos.
mos que seja realizada no mock. Esse tipo de erro não é gerado quando Pragmatic Unit Testing
usamos o segundo
segu ndo tipo de mock object su-  Andrew Hunt,
Hunt, David Thomas
Estabelecendo restrições portado pelo EasyMock. Trata-se do “nice (The Pragmatic Programmers, 2003)
Ensina como automatizar testes e apresenta boas
O EasyMock também nos permite con- mock”.. É um um mock object
mock” objec t “bonzinho”
“bonzin ho”
práticas e padrões de testes.
figurar um mock de modo a esperar que ou tolerante, que não acusa erros se você
apenas alguns de seus métodos sejam tentar executar métodos para os quais o
chamados. Assim, se algum outro méto- objeto não foi programado a responder. easymock.org
do for executado, é acusado um erro. Por Há um terceiro tipo de mock, que é o Site oficial do EasyMock.
exemplo, note que o mock criado para o mais rigoroso de todos, o strict mock. Ele
RequestDispatcher  no trecho de código a se- é parecido com o mock comum, criado  javamagazine.com.br/downloads/jm37/
 javamagazine.com.br/downloads/jm37/
guir não espera que seu método forward() com createMock() . Um mock comum exige  jm-easymock.zip
seja chamado, o que no entanto acontece que cada método que deva ser executado
durante a execução do servlet: tenha sido preparado para isso na etapa de Vinícius Manhães Teles
preparação.. Isso normalmente
preparação normal mente significa que (vinicius@improveit.com.br,
private RequestDispatcher requestDispatcher()
requestDispatcher() { é necessário usar algum tipo
t ipo de expect() para improveit.com.br/vinicius.jsp) é
RequestDispatcher
RequestDi spatcher dispatcherMo
dispatcherMock
ck =
createNiceMock (RequestDispatcher.class); esses métodos enquanto o mock está sendo Mestre em Informática pela UFRJ,
  replay(dispatcherMock); configurado. Já um strict mock não apenas Diretor da Improve It e autor do livro
... “Extreme Programming – Aprenda como encantar
exige que os métodos tenham sido configu-
seus usuários desenvolvendo software com
O teste só funciona porque criamos um rados, mas também obriga que a chamada a agilidade e alta qualidade”.
nice mock. Existem três tipos de mock esses métodos siga exatamente a ordem em

Magazine • Edição 37
74  Java Magazine
FORMATO
ERRADO
S e v o cê
c ê a nd
nd a p re
r e ci
c i sa
sa nd
n d o d e a j ud
u d a p ar
a r a m an
an te
te r a s ua
ua e mp
m p re
re sa
s a n a i nt
nt e rn
rn et
et ,
e st
s t á n a h or
o r a d e c on
o n he
h e ce
c e r a s so
s o lu
l u çõ
ç õ es
e s c o mp
mp le
l e ta
t a s d a L oc
o c aW
a W e b.
b.

A LocaWeb torna-se mais completa a cada dia que passa. Hoje ela oferece todos os tipos de serviços e
ferramentas
ferramenta s de internet, atendendo
atendendo às diversas necessidades de seus clientes. E para estar ainda mais
próxima deles, a LocaWeb não pára de investir para ter um atendimento cada vez mais ágil e eficiente. Mude
para a LocaWeb. A gente garante a sua tranqüilidade. www.locaweb.com.br

N a c ontr
ontrata
ata çã
çãoo d e um Plano de Hosp
Ho spe
e da
dagem*
gem* vo
v o c ê t em :   Blog Gratuito • E-mails LocaMail com antivírus e anti-spam • Completo painel de controle
• Suporte às linguagens ASP**,ASP**, .NET 2.0, JSP e Servlets***, PHP 5***, PERL, PERL, Python***, C,C++***, Ruby on Rails***, PERL/CGL, XML, WML/WAP
• Diversos componentes para ASP e .NET • Relatórios de visita em português • Certificado seguro com SSL • Banco de dados Access**, M ySQL
5.0*** e PostgreSQL 8.1*** • Podcast • Backup diário incluso • Garantia de disponibilidade de 99,5%
E ainda pode contratar serviços adicionais à hospedagem como: comércio eletrônico, banco de dados MS SQL Server, Oracle compartilhado, MySQL
para Windows, MySQL adicional para Linux, domínios e pacotes de e-mails adicionais e muito mais.
*Para mais detalhes e complementação de condições,
condições, consulte o modelo de contrato
contrato disponível no site www.locaweb.com.br
www.locaweb.com.br **em Windows ***em Linux

Você também pode gostar