Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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 .
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
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
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.
Anúncios e a Parti
Foco em produtividade e no desenvolvim
Magazine • Edição 37
8 Java Magazine
cipação Brasileira
ento corporativo
FABIO VELLOSO
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
Uma Perspectiva
Tecnologias, APIs, especificações e núme
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.
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
Open Source em F
Lançamento de projetos como open sour
Magazine • Edição 37
16 Java Magazine
oco
ce movimentam o Jav
JavaOne
aOne
BRUNO SOUZA
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.
+
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.
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
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
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.
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’
- Original element: ‘Banco.findConta(...) ’ Tags “$NON-NLS$” desnecessárias:
- Renamed element: ‘Banco.localizaConta(. ..)’ Estas tags, inseridas em comentários
- Update references to refactored element
- 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<{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.
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.
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).
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
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
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.
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
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
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”);
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.
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 ...
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.
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,
(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.
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.
Magazine • Edição 37
44 Java Magazine
Figura 7. O menu popup é exibido quando um arquivo é selecionado.
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
Magazine • Edição 37
46 Java Magazine
}
catch (Exception e) {
// tratar
}
finally {
monitor.done();
}
}
}
}
import java.util.LinkedHashMap;
import java.util.Map;
static {
mapa.put(“ø”, “ø”);
mapa.put(“Ø”, “Ø”);
mapa.put(“ß”, “ß”); Figura 10. Indicando as dependências do plug-in.
mapa.put(“®”, “®”);
mapa.put(“©”, “©”);
mapa.put(“€”, “€”);
mapa.put(“æ”, “æ”); JMPlugin
JMPlu gin é criada automaticamente pelo if (editor instanceof ITextEditor) {
mapa.put(“à”,
mapa.put
mapa.put(“à”
(“à”,
, “&ag
“à
“à”);
rave;”);
;”); wizard do PDE. Essa classe é responsável Document doc = (Document) ((ITextEditor) editor).
mapa.put(“á”, “´”); getDocumentProvider().getDocument(
mapa.put(“À”, “À”); por gerenciar o plug-in e, como imple- editor.getEditorInput());
mapa.put(“Á”, “Á”); int total = new Substituidor().substituir(doc);
mapa.put(“â”, “â”);
mentamos um plug-in visual, ela estende
...
mapa.put(“”, “”); a classe org.eclipse.ui.plugin.AbstractUIPlugin . }
mapa.put(“ä”, “ä”);
mapa.put(“Ä”, “Ä”); Dois métodos merecem destaque: start(),
mapa.put(“å”,
mapa.put
mapa.put(“å”
(“å”,
, “å
“&ar
“å”);
ing;”);
”);
mapa.put(“Å”, “Å”); que é invocado quando algum código do A classe Substituidor (Listagem 4) é quem
mapa.put(“ã”, “ã”); plug-in é chamado pela primeira vez; e faz todo trabalho pesado. Quando o mé-
mapa.put(“Ô, “Ô);
stop(), invocado quando o plug-in é des- todo substituir() é disparado, o trabalho
mapa.put(“ç”, “ç”);
mapa.put(“Ç”, “Ç”); carregado. de substituição de caracteres é delega-
A classe SubstituirAction (Listagem 3) é o do para uma inner class, denominada
mapa.put(“é”, “é”);
mapa.put(“É”, “É”); “controller” do plug-in. Como o plug-in MonitorProgresso . Uma nova instância dessa
mapa.put(“è”, “è”);
mapa.put(“È”, “È”); adiciona um novo menu popup ao Wor Work-k- classe é criada, passando como parâmetro
parâmetross
mapa.put(“ê”, “ê”); bench, é necessário implementar a inter- o documento e o mapa de substituição
mapa.put(“Ê”, “Ê”);
mapa.put(“ë”, “ë”); face org.eclipse.ui.IObjectActionDelegate para (este mapa está configurado na classe
mapa.put(“Ë”, “Ë”);
tratar suas ações. O principal método da Config, mostrada na Listagem 5):
mapa.put(“ï”, “ï”); classe é run(), que é disparado sempre que
mapa.put(“Ï”, “Ï”); MonitorProgresso m = new MonitorProgresso(
mapa.put(“í”, “í”); o item de menu é selecionado.
s elecionado. No código doc, Config.getMapa());
mapa.put(“Í”, “Í”);
a seguir é possível entender o funciona-
mapa.put(“ô”, “ô”); mento desse método. A inner class MonitorProgresso (parte da
mapa.put(“ó”, “ó”);
mapa.put(“Ô”, “Ô”); Inicialmente o editor corrente é selecio- Listagem 4) foi criada para executar a
mapa.put(“Ó”, “Ó”);
mapa.put(“ö”, “ö”); nado6: operação de substituição de caracteres e
mapa.put(“Ö”, “Ö”); monitorar seu progresso (assim deixamos
mapa.put(“õ”, “õ”);
mapa.put(“Õ”, “Õ”); IEditorPart editor = JMPlugin.g
JMPlugin.getDefault().
etDefault(). o usuário ciente do que está acontecen-
getWorkbench().getActiveWorkbenchWindow().
mapa.put(“ù”, “ù”); getActivePage().getActiveEditor(); do). Para que seja possível acompanhar
mapa.put(“Ù”, “Ù”); o andamento da operação, a nova classe
mapa.put(“û”, “û”);
mapa.put(“Û”, “Û”); Se o editor implementar a interface implementa a interface org.eclipse.jface.
mapa.put(“ü”, “ü”);
mapa.put(“Ü”, “Ü”); 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).
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
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
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.
Magazine • Edição 37
52 Java Magazine
Aproveite as facilidades do
Aproveite
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
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
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
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
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
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)
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ó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ó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
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
Magazine • Edição 37
64 Java Magazine
Listagem 2. Classe FuncionarioHorista Listagem 3. Classe Departamento
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.
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
Listagem 1. Teste
Teste da conta sem usar mock objects.
Classe ContaT
ContaTeste
este Classe Conta
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.
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;
}
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