Anda di halaman 1dari 74

Sumrio

Core, Vanguarda

Ol, eu sou o DevMan! Desta pgina em diante, eu estarei lhe ajudando a compreender com ainda mais facilidade o contedo desta edio. Ser um prazer contar com sua companhia! Confira abaixo o que teremos nesta revista:

08 Introduo JMS com Java EE 6

Aprenda a usar a JMS, ou atualize-se com as facilidades do Java EE 6 [ Osvaldo Pinali Doederlein ]

Minicurso, Web, Vanguarda

20 Java EE 6 na Prtica Parte 1

Conhea o que h de novo na plataforma Java Enterprise Edition [ Vtor Estvo Silva Souza ]

Java

Boa ideia, Web

36 Picasa Web Albums Data API Parte 2

Manipulando lbuns, fotos e vdeos do Picasa Web Albums com GWT e GAE [ Paulo Csar Coutinho ]

Eng. de Software

Eng. de Software

46 Coaching e Facilitao de Times geis

Implantando e liderando equipes geis no desenvolvimento de Software [ Manoel Pimentel Medeiros ]

Boas Prticas

Boas Prticas, Core

56 OSGi com Spring Dynamic Modules Parte 1


Facilitando a criao de softwares modulares com Java [ David Pereira ]
Voc percebeu os cones ao lado de cada matria? Eles indicam o que voc vai encontrar no artigo dessa forma, voc tambm pode ter uma idia geral do que vai encontrar nesta edio como um todo! Os editores trabalham sempre no sentido de fechar a revista seguindo esta definio, para oferecer a voc o melhor contedo didtico! Confira abaixo a lista com a definio dos tipos de artigo encontrados nesta edio:

Boas Prticas, Minicurso

68 Princpios, Padres e Prticas para um Design gil Parte 1


Boas prticas na implementao da Arquitetura de Software [ Wagner Roberto dos Santos ]

[Web] Artigos sobre ou que envolvam tcnicas de desenvolvimento


para WEB.

[Core] Tcnicas Server-side, ferramentas, IDEs, e outros assuntos


que fogem s demais categorias.

ticas de desenvolvimento, orientadas ao aumento da qualidade e produtividade.

[Vanguarda] Artigos sobre tecnologias de ponta, que ainda no

fazem parte do dia a dia do desenvolvedor mas que prometem ser a prxima febre.

[Boa Ideia] Esse quase um artigo Mo na Massa, mas se destaca pela criatividade do projeto de exemplo.

[Engenharia de Software] Artigo dentro do contexto de Engenharia de Software: anlise, design, testes, metodologias em geral. de aplicaes e/ou o ensinamento de tecnologias Java

[Tutorial] Artigo no estilo tutorial passo-a-passo.

[Boas Prticas] Um dos objetivos da revista levar para o leitor

[Minicurso] Srie de artigos apresentando o desenvolvimento

no somente as melhores tcnicas, mas tambm as melhores pr-

Carta ao Leitor
Ano VII Edio 80 2010 ISSN 1676-8361

Edio
Editor Eduardo Spnola (eduspinola@gmail.com)

plataforma Java Enterprise Edition sem dvida a grande fora do Java. Desde a sua primeira verso, o avano, o cuidado e a melhoria na plataforma so evidentes, o que mais uma vez pode ser constatado na nova Java EE 6. Claro, sem

deixar de lado a busca constante em facilitar o seu uso. Do lanamento da verso 6 at esta edio, muitas das especificaes relacionadas foram abordadas, como EJB 3.1, JSF 2.0 e JMS, e muitas outras sero apresentadas nas prximas edies. Porm, algo muito importante estava faltando: aplicar os novos conhecimentos na prtica. A melhor maneira de solidificar o nosso conhecimento pondo em prtica tudo o que aprendemos. Para essa tarefa, proporcionamos nesta publicao o primeiro artigo de uma srie que visa criar uma aplicao completa, denominado Java EE 6 na Prtica. Na primeira etapa apresentamos uma viso geral do Java EE 6, implementamos as classes de domnio utilizando algumas novidades do JPA 2.0, implementamos a validao com o padro Bean Validation e desenvolvemos uma funcionalidade de cadastro empregando o CDI, que permite a injeo de dependncias em contextos. Ainda envolvendo a nova plataforma, Introduo JMS com Java EE 6 demonstra como utilizar a JMS (que no sofreu alteraes) aproveitando as facilidades da ltima verso do Java EE. No artigo vamos explorar a programao da JMS, de forma prtica, atualizada e focada nos fundamentos, adotando o NetBeans 6.9 e o GlassFish 3.0.1. Na ltima edio ensinamos como realizar as operaes bsicas no servio de fotos do Google. Para completar esta matria, em Picasa Web Albums Data API Parte 2, criaremos, passo a passo, um sistema Java/Google para controle de lbuns, fotos e vdeos, em conjunto com o Google Web Toolkit (GWT) para implementao e o Google App Engine (GAE) para publicao do mesmo. O artigo Princpios, Padres e Prticas para um Design gil Parte 1 retrata sobre um fator de grande importncia para todo o planejamento do software, a arquitetura. Direcionado para este cenrio, o autor comenta sobre boas prticas e explica os princpios fundamentais para se elaborar um bom design, relatando os tipos de arquitetura, o conceito de separao de responsabilidades e dando nfase arquitetura em camadas. No espao direcionado a artigos relacionados Engenharia de Software, abordamos o processo de Coaching, originado em contextos esportivos, e que est sendo adotado para melhoria contnua de indivduos e equipes em projetos de desenvolvimento gil. Coaching e Facilitao de Times geis tem como objetivo orientar e estimular as pessoas a alcanar suas metas com mais facilidade, auto-organizao e disciplina. Para finalizar esta revista, separamos um espao para um tpico que vem ganhando destaque a cada lanamento da comunidade Java. Como todos sabemos, h bastante tempo o Eclipse construdo sobre uma plataforma modular, recentemente a SpringSource adotou esta plataforma na distribuio de seus frameworks, e agora, as empresas que constroem sistemas tambm comearam a dar mais importncia a esse estilo de desenvolvimento. Sim, estamos falando da OSGi. Em OSGi com Spring Dynamic Modules Parte 1, exibimos na prtica como fcil criar uma aplicao modular para Desktop e explicitamos as facilidades e os ganhos que ela oferece.

Arte
Capa e Diagramao Romulo Araujo (romulo@devmedia.com.br)

Produo
Gerncia de Marketing Kaline Dolabella (kalined@terra.com.br) Reviso e Superviso Thiago Vincenzo (thiago.v.ciancio@devmedia.com.br) Coordenao Geral Daniella Costa (daniella@devmedia.com.br)

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

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

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

Publicidade
publicidade@devmedia.com.br 21 3382-5038 Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia, voc divulga sua marca ou produto para mais de 100 mil desenvolvedores de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com detalhes sobre preos e formatos de anncios. Reprints Editoriais Se foi publicado na Java Magazine um artigo que possa alavancar as suas vendas, multiplique essa oportunidade! Solicite a reimpresso da matria junto com a capa da edio em que saiu, e distribua esse reprint personalizado entre seus clientes. Encarte de CDs Faa como nossos maiores anunciantes. Encarte um CD com uma amostra de seus produtos na Java Magazine e atinja um pblico segmentado e formador de opinio. Java, o logotipo da xcara de caf Java e todas as marcas e logotipos baseados em/ ou referentes a Java so marcas comerciais ou marcas registradas da Sun Microsystems, Inc. nos Estados Unidos e em outros pases.

Fale com o Editor! muito importante para a equipe saber o que voc est achando da revista: que tipo de artigo voc gostaria de ler, que artigo voc mais gostou e qual artigo voc menos gostou. Fique a vontade para entrar em contato com os editores e dar a sua sugesto! Se voc estiver interessado em publicar um

artigo na revista ou no site Java Magazine, entre em contato com o editor, informando o ttulo e mini-resumo do tema que voc gostaria de publicar: Eduardo Spnola - Editor da Revista eduspinola@gmail.com

Boa leitura e at a prxima! Eduardo Oliveira Spnola eduspinola@gmail.com

Informativo Java Magazine


Portal Java Magazine
www.devmedia.com.br/java
Na DevMedia, o leitor de banca tambm ganha!

Vdeos

Brinde na web desta edio


3 vdeo-aulas do Guia completo sobre o NetBeans
Para visualizar acesse o link: http://www.devmedia.com.br/articles/listcomp.asp?keyword=jm80&codigobanca=javaee6

Gostou das vdeo aulas? O portal www.devmedia.com.br possui mais de 2 mil vdeo aulas e dezenas de cursos online sobre desenvolvimento de software! Agora voc pode comprar as vdeo aulas que preferir e fazer sua prpria combinao de vdeos! Saiba mais em www.devmedia.com.br/creditos

Edies Anteriores da Java Magazine


Voc pode comprar todas as edies anteriores da Java Magazine atravs do site DevMedia! Para isso basta acessar https://seguro.devmedia.com.br/edicoes_anteriores.asp

D s

Feedback eu
sobre e s

D seu feedback sobre esta edio!


A Java Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o que voc, leitor, acha da revista! D seu voto sobre esta edio, artigo por artigo, atravs do link: www.devmedia.com.br/javamagazine/feedback Para votar, voc vai precisar do cdigo de banca desta edio, que : javaee6

edio ta

Seo Java: NeSta Seo voc eNcoNtra artigoS iNtermedirioS e avaNadoS Sobre Java

Introduo JMS com Ja


Aprenda a usar a JMS, ou atualize-se com as

m comparao com middlewares sncronos (como EJB), a JMS proporciona baixo acoplamento entre produtores e consumidores, pois estes no precisam estar diretamente conectados, nem precisam estar executando ao mesmo tempo mensagens podem ser armazenadas nas filas/topics por algum tempo (indefinido ou limitado) enquanto no so lidas por algum. A comunicao assncrona tem vantagens bem conhecidas; facilita criar aplicaes com caractersticas como: Alta concorrncia: a comunicao sncrona AB implica que a aplicao A no precisa ficar parada enquanto B recebe uma mensagem e executa algum processamento; portanto, h maior potencial de paralelismo, especialmente no lado do produtor; Tolerncia a falhas: se a aplicao B ficar temporariamente indisponvel ou talvez sobrecarregada, isso no impede A de funcionar, nem mesmo deixa A com alguns recursos importantes (como um thread, conexo com database etc.) bloqueados inutilmente enquanto aguarda B o que tende a reduzir a carga e o risco de falhas tambm no servidor de A; Escalabilidade e balanceamento: tran saes complexas que envolvem vrios sistemas so naturalmente divididas em fatias pequenas e independentes, permitindo infraestrutura (containers Java EE, JMS, monitor de transaes, software de clustering) conseguir melhor paralelismo e ocupao eficiente de recursos. Existem ainda outras caractersticas interessantes, como facilidade de monitorao ( fcil capturar e analisar as mensagens trocadas entre as aplicaes), e interoperabilidade com web services (mensagens XML podem ser encapsula-

Resumo DevMan
De que se trata o artigo:
Uma introduo moderna JMS (inclusive MDB), escrita principalmente para o leitor que ainda no se aventurou com a API de mensageria da plataforma Java EE. Mostramos como programar a JMS com a verso mais recente do Java EE, o que deve tornar o artigo interessante tambm como atualizao para quem j o fez em verses anteriores da plataforma.

Para que serve:


A JMS (Java Message Service) permite a comunicao assncrona entre aplicaes, utilizando dois modelos bsicos de conectividade: 1. Filas ponto-a-ponto (queues), onde mensagens submetidas por uma aplicao produtora so entregues a uma nica aplicao consumidora. Pode haver vrios consumidores conectados mesma fila, neste caso somente um deles receber cada mensagem; 2. Canais publish/subscribe (topics), onde cada mensagem pode ser recebida simultaneamente por diversas aplicaes consumidoras.

Em que situao o tema til:


Para o leitor que est dando seus primeiros passos com mensageria assncrona / JMS, ou interessado em novidades da plataforma Java EE 6 (por exemplo, Contexts and Dependency Injection). Para quem ainda no se interessou por mensageria JMS, procuramos apresentar uma motivao. Finalmente, abordamos tambm as ltimas atualizaes sobre o status das tecnologias da Sun aps a aquisio pela Oracle.

das em mensagens JMS). Na comparao com os web services, a mensageria JMS tem maior desempenho (permite trafegar dados binrios entre outras vantagens) e permite implementar transaes distribudas (operaes de envio e recepo de mensagens podem participar de uma transao XA, sendo passveis de rollback). Este artigo tem uma abordagem totalmente prtica; para mais detalhes sobre a API e mensageria, bem como uma abordagem alternativa de programao, veja o artigo online de Fbio Augusto Falavinha na Edio 76: JMS na prtica com Spring e ActiveMQ. Neste artigo, vamos explorar a programao da JMS, com uma abordagem prtica, atualizada, e focada nos fundamentos mas utilizando a verso mais

recente da plataforma Java EE. Recomendo ao leitor acompanhar o tutorial com o NetBeans 6.9 e Glassfish 3.0.1, mas todo o cdigo poder ser utilizado em qualquer IDE e container com suporte plataforma Java EE 6.

Nota do DevMan
Transao XA: Transao distribuda, recurso suportado pela JTA (Java Transaction API). Permite que mltiplos recursos transactionais como um SGBD e um servidor JMS ou mesmo vrias aplicaes em processos separados participem de uma mesma transao, com garantia das propriedades ACID. Por exemplo, se uma transao gravar um registro no banco de dados e enviar uma mensagem JMS, h garantia que ou ambas operaes sero realizadas (em caso de commit) ou nenhuma ser realizada (em caso de rollback), o que pode ser importante para a consistncia de sistemas complexos. O nome XA vem do padro do Open Group que define seu funcionamento.

8 Java Magazine Edio 80

va EE 6
facilidades do Java EE 6
Configurando as filas
O Glassfish contm um servidor JMS embutido, o que facilita nosso trabalho: uma vez instalado o NetBeans com suporte a Java EE e Glassfish, est tudo configurado. S precisamos criar os recursos de JMS que sero usados pela aplicao. Comece entrando no console de administrao do Glassfish, que por default fica em localhost:4848. V primeiro em Recursos > Recursos JMS > Fbricas de Conexes > Novo; entre com Nome do Grupo = jms/CF, Tipo de Recurso = javax.jms.QueueConnectionFactory; confirme com OK. Agora voc j tem uma QueueConnectionFactory, que o objeto primrio de interao com a JMS como indica o nome, permite fabricar conexes com filas. Em seguida, acione Recursos > Recursos JMS > Recursos de Destino > Novo; entre com Nome JNDI = jms/Quotes; Physical Destination Name = Quotes; Tipo de recurso = javax.jms.Queue. Voc tem agora uma Queue, a fila que ser usada para o trfego de mensagens. Veja o quadro Filas e Recursos JMS para mais detalhes.

A Java Message API no sofreu alteraes no Java EE 6, mas tambm se beneficia de melhorias da nova plataforma como CDI. Nunca foi to fcil criar sistemas com mensageria assncrona em Java

oSvaldo PiNali doederleiN

Figura 1. Configurando as opes Java EE, com ateno para o recurso CDI
Listagem 1. A pgina index.xhtml.
<?xml version=1.0 encoding=UTF-8 ?> <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd> <html xmlns=http://www.w3.org/1999/xhtml xmlns:h=http://java.sun.com/jsf/html> <h:head> <title>Teste de JMS</title> </h:head> <h:body> <form name=jmsForm action=#{JMSBean.send()}> <input type=submit value=Envia name=btnSend /> </form> </h:body> </html>

Al, JMS
Comearemos fazendo um programa mnimo, que simplesmente envia uma mensagem para uma fila porm, j mostrando um pouco do Java EE 6. Crie um projeto do tipo Java Web > Aplicao Web. Na tela Servidor e configuraes, escolha Servidor = Glassfish v3 e a Verso do JavaEE = Java EE 6 Web. Certifique que a opo Enable Contexts and Dependency Injection seja habilitada, como na Figura 1. Esta opo, que s aparece para a verso 6 do Java EE, habilita o recurso CDI (JSR 299, tambm conhecido como Web Beans). Em Frameworks, marque JavaServer Faces, aceitando as configuraes default. Finalize o projeto.

Agora, vamos parte dura do trabalho. Teremos que codificar dois componentes: uma pgina JSF contendo um boto que aciona um mtodo de um Managed Bean; e a classe deste Managed Bean, contendo um mtodo que cria uma mensagem e publica-a numa fila JMS.

Comecemos pelo mais fcil, a pgina. O NetBeans j criou um index.xhtml para ns uma pgina JSF / Facelets. Vamos usar esta pgina mesmo; a Listagem 1

Edio 80 Java Magazine

Introduo JMS com Java EE 6

mostra as alteraes necessrias em negrito alm do ttulo, s criei um formulrio contendo um boto. A action deste boto contm a expresso #{JMSBean.send()}, que invoca o mtodo send() do Managed Bean JMSBean. Para terminar, vamos ao Managed Bean. Crie um novo arquivo do tipo JavaServer Faces > Bean gerenciado JSF. Entre apenas com Nome = JMSBean, bem como os nomes de classe e package; aceite os defaults para o resto, como na Figura 2. O NetBeans criar o esqueleto do bean; resta implementar o mtodo send(). A Listagem 2 mostra a classe completa, com os acrscimos necessrios em negrito. Vamos acompanhar passo a passo: 1 . Usamos Injeo de Dependncia para obter referncias para os dois recursos JMS que vamos utilizar, a ConnectionFactory e a Queue; 2. A partir da ConnectionFactory, abrimos outros recursos: Connection gerencia a comunicao; Session permite gerenciar transaes; e MessageProducer permite enviar lotes de mensagens; 3. Nossa mensagem ter apenas uma string, portanto criamos uma TextMessage. Usamos uma verso do mtodo createTextMessage() que j aceita o contedo da mensagem; 4. Despachamos a mensagem para a fila com send(); 5. Fechamos a conexo (e todo seus objetos dependentes) com um close() na Connection.
Usamos somente as APIs modernas da JMS 1.1, como Destination (ao invs de Queue), ConnectionFactory (ao invs de QueueConnectionFactory) ou MessageProducer (ao invs de QueueSender). As APIs que utilizamos funcionam tanto para queues quanto para topics sem exigir alterao de cdigo; se voc quiser migrar sua distribuio de dados para o modelo publish/subscribe, basta recadastrar os recursos JMS no container. sempre bom dar este lembrete, pois embora a generalizao da API da JMS 1.1 j seja coisa antiga, ainda h quem use desnecessariamente as APIs mais antigas especficas para queues ou topics, j que estas nunca foram depreciadas.

Listagem 2. Managed Bean para envio JMS.


package teste; import javax.annotation.Resource; import javax.inject.Named; import javax.enterprise.context.Dependent; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; @Named(value=JMSBean) @Dependent public class JMSBean { @Resource(name=jms/CF) ConnectionFactory qcf; @Resource(name=jms/Quotes) Destination dest; static int counter; public void send () throws JMSException { Connection conn = null; try { Connection conn = qcf.createConnection(); Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE); MessageProducer prod = session.createProducer(dest); TextMessage msg = session.createTextMessage(^BVSP = $ + (counter++)); prod.send(msg); } finally { if (conn != null) conn.close(); } }

No nos preocupamos com tratamento de erros (qualquer JMSException ser sim-

Figura 2. Criando um Managed Bean

10 Java Magazine Edio 80

Filas e Recursos JMS


O primeiro contato com a JMS s vezes causa alguma confuso entre filas do servidor e filas fsicas. Na nossa configurao do Glassfish, ao criarmos uma fila, temos que preencher dois campos distintos: um o nome JNDI da fila (jms/ Quotes), o outro um Nome do Destino Fsico (Quotes). Este ltimo a verdadeira fila, e (a princpio) no reside no container Java EE e sim num servidor JMS. No caso do Glassfish, o servidor JMS embutido; mas em outros ambientes pode ser um processo separado. Devido integrao entre o Glassfish e seu servidor JMS (Open Message Queue mq.dev. java.net), podemos examinar a fila no console de administrao, como mostra a Figura Q1. Cada fila possui alguns parmetros que controlam seu desempenho e comportamento. Os valores default sero OK para a maioria das aplicaes. Aquele recurso de nome jms/Quotes que voc criou em Recursos de Destino > Novo no uma fila, apenas uma proxy para a fila. Alm de fornecer um nome JMS fila, este recurso pode ter capacidades prprias no caso, temos uma opo de desabilitar a fila; note que se esta opo for usada ela s afeta aplicaes que usem este recurso para chegar fila fsica Quotes. A fila em si no desativada. Podemos ver nos logs do Glassfish a evidncia do servidor JMS embutido: Alternativamente, o diretrio mq/bin do Glass fish possui comandos de administrao mais completos para o servio JMS (chamado broker), permitindo deletar mensagens que no foram consumidas, configurar segurana, executar brokers em processos independentes, usar um SGBD como repositrio das mensagens, automatizar operaes administrativas com scripts, etc. Neste artigo no vamos investir tempo nessas coisas, at por que um conhecimento bastante amarrado a cada produto JMS especfico mas quando voc for fazer a administrao e tuning de uma aplicao de grande porte que usa JMS, faz parte dos ossos do ofcio aprender a usar cada parmetro e opo obscura, da mesma forma que ao usar banco de dados preciso que algum conhea a fundo o SGBD utilizado.
INFO: JMS Service Connection URL is : mq://localhost:7676/ INFO: Instantiated an instance of org.hibernate.validator. engine.resolver.JPATraversableResolver. INFO: MQJMSRA_RA1101: SJSMQ JMS Resource Adapter starting: DIRECT INFO: MQJMSRA_RA1101: SJSMQ JMSRA Started: DIRECT

plesmente vazada para o chamador) s tomamos o cuidado de fazer o close() num bloco finally, o que sagrado mesmo em cdigo de artigo. O programa tambm no se preocupa em gerar nenhum feedback da operao realizada (mas se voc quiser, pode fazer um println() para indicar o sucesso do send()). O que temos j suficiente para um primeiro experimento. Est t udo pronto; execute a opo Implantar do projeto, que ir disparar a compilao, inicializao do Glassfish (caso este no esteja rodando), e deploy no Glassfish. Abra o browser na pg i na i n ic ia l do contexto da aplicao, para mim localhost:8080/QuotesJMS. Pouparei a Natureza de fornecer papel para imprimir uma captura de tela do browser uma pgina trivial, contendo apenas um boto. Mas este boto tem alguma utilidade; acione-o algumas vezes para testar. Voc... no ver nada, pois no programamos qualquer feedback da ao. (S no caso de acontecer algum erro, voc ver um log de erro no console do Glassfish.) O nico jeito, ento, ir bisbilhotar na fila JMS do Glassfish. De volta ao console de administrao, abra Configurao > Java Message Service > Destinos fsicos. Voc ver um item de nome Quotes, tipo queue; selecione o link View da coluna Statistics. Haver uma longa lista

Figura Q1. Por dentro das filas do Glassfish.

Edio 80 Java Magazine

11

Introduo JMS com Java EE 6

de indicadores, como na Figura 3. Faa scroll at encontrar o item Number of Messages; este nmero deve ser incrementado em 1 a cada vez que voc clicar no boto da aplicao. (No momento, nosso programa s gera mensagens mas ningum as consome, por isso os indicadores de nmero de mensagens, nmero de bytes ocupados etc. s iro crescer.)

Injeo de Dependncia no Java EE 6


O leitor que j conhece o Java EE 5 poder ter notado uma nica novidade na Listagem 2: a anotao @Dependent na classe JMSBean. Antes de explicar isso, vamos revisar um cdigo semelhante da minha coluna para a Edio 77.
@WebServlet(name=Numero, urlPatterns={/Numero}) public class Numero extends HttpServlet { @EJB NumeroBean numero; protected void processRequest () throws { ... out.println(<h1>O seu nmero : + numero.cria Numero() + </h1>); ... } }

Figura 3. Estatsticas de uma fila JMS

Naquele cdigo tnhamos uma Servlet que usava a anotao @EJB para invocar um session bean; injetamos o bean na servlet, poupando o trabalho de fazer seu lookup e conexo. Essa facilidade de injeo de dependncia j existia no Java EE 5 anotaes como @Resource (da JSR 250: Common Annotations for the Java Platform, tambm suportada no Java SE 6) e @EJB (do EJB 3.0). Mas no Java EE 5, ainda no era possvel invocar um session bean (entre outros tipos de recursos injetveis) diretamente a partir de uma pgina JSF. Era preciso criar um Managed Bean que servia como intermedirio bastava injetar o session bean no managed bean, e ento invocar mtodos do managed bean a partir da pgina. Mas isso ainda no era simples o suficiente, exigindo criar managed beans que muitas vezes s serviam como wrappers para algum session bean. Na Java EE 6, esta complicao foi eliminada. O package javax.enterprise.context define a nova facilidade chamada CDI Context Dependency Injection que unifica os modelos de componentes de

Figura 4. Criando um MDB para consumo da fila back-end (EJB 3.0) e front-end (JavaServer Faces) da plataforma Java EE. A CDI a evoluo padronizada de solues anteriores como o JBoss Seam e Google Guice. Para resumir a conversa: basta colocar uma anotao como o @Dependent no nosso session bean, e teremos um componente que pode ser invocado diretamente a partir de uma pgina JSF, sem necessidade de nenhum managed bean. (Precisamos tambm da anotao @Named, do package javax.inject.) De fato, o prprio session bean passa a ser usado como managed bean da pgina.

12 Java Magazine Edio 80

Dito assim parece ser muito simples por que no fizeram antes? mas a CDI uma facilidade poderosa com aspectos pouco bvios, pois tem que combinar de forma coerente o ciclo de vida da JSF com o de recursos de back-end como EJBs. preciso preocupar-se na mistura entre fatores como a sesso web no lado da JSF, e transaes e segurana gerenciados pelo container, nomeao JNDI e outros detalhes no lado do EJB. No vamos explorar mais a fundo a CDI neste artigo um tema que exigiria um artigo inteiro dedicado; deixamos, apenas, apresentado o novo modelo.

Listagem 3. MDB para consumo das mensagens.


package teste; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @MessageDriven(mappedName = jms/Quotes, activationConfig = { @ActivationConfigProperty(propertyName = acknowledgeMode, propertyValue = Auto-acknowledge), @ActivationConfigProperty(propertyName = destinationType, propertyValue = javax.jms.Queue) }) public class QuotesConsumerBean implements MessageListener { @Override public void onMessage (Message message) { try { TextMessage msg = (TextMessage)message; System.out.println(msg.getText()); } catch (final JMSException e) { System.out.println(Deu pau! - + e); } }

Recebendo Mensagens
Nosso al mundo foi muito simples de construir tivemos mais trabalho de configurao (criar recursos JMS no Glassfish, e um projeto no NetBeans) do que de programao. No entanto, at agora temos apenas metade de uma aplicao JMS mnima, j que existe um produtor de mensagens, mas nenhum consumidor. Isso tipicamente impossvel com um middleware sncrono como EJB uma invocao de mtodo falhar se o destinatrio no estiver disponvel; mas com middleware assncrono, perfeitamente normal. Enquanto o consumidor no estiver recebendo mensagens, estas simplesmente se acumulam na fila. Vamos ento ao consumidor; para maior realismo, este ser uma aplicao independente. Com estrutura similar do produtor uma aplicao Web com uma GUI JSF mnima o consumidor receber qualquer mensagem postada na fila jms/Quotes, exibindo-as na pgina. Comece ento criando um novo projeto Aplicao Web, configurado exatamente como o anterior. Crie, ento, um arquivo JavaEE > Message-Driven Bean. Na pgina Nome e local, entre com o nome de bean QuotesConsumerBean, e selecione a fila que este bean ir ler. Note que existem duas opes: Destinos do projeto e Destinos do servidor. Vamos usar esta segunda opo, o que muito fcil pois o NetBeans detecta a fila jms/Quotes do Glassfish e j exibe esta opo (ver Figura 4), bastando selecion-la. Confirme a criao do MDB.
}

Listagem 4. Pgina para acesso ao MDB.


<?xml version=1.0 encoding=UTF-8 ?> <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd> <html xmlns=http://www.w3.org/1999/xhtml xmlns:h=http://java.sun.com/jsf/html> <h:head> <title>Consumidor JMS</title> </h:head> <h:body> <form name=jmsForm> <input type=submit value=Recebe name=btnReceive /> <p>#{QuotesConsumerBean.next()}</p> </form> </h:body> </html>

Preencha o miolo do mtodo onMessage(), que ficar inicialmente como a Listagem 3. O NetBeans criou todo o esqueleto do MDB, j no estilo moderno, configurado atravs de anotaes s precisamos inserir o cdigo em negrito. Neste cdigo, nos limitamos a obter a string de texto contida na mensagem e exibi-la no console. Note que precisamos de um typecast de Message (imposto pela assinatura do mtodo onMessage() derivado de MessageListener) para TextMessage. Isso seguro pois faz parte do design da aplicao, onde determinamos que a fila jms/Quotes ir conter sempre uma mensagem do tipo TextMessage. Acione Implantar no projeto; voc ver alguns logs no console do Glassfish:

INFO: Inicializando Mojarra 2.0.2 (FCS b10) para o contexto /QuotesViewer INFO: ^BVSP = $0 INFO: ^BVSP = $1 INFO: Loading application QuotesViewer at / QuotesViewer INFO: QuotesViewer was successfully deployed in 18.423 milliseconds.

No meu teste, acima, duas mensagens apareceram imediatamente por que eu havia acionado duas vezes o boto Envia do programa produtor, e duas mensagens ficaram acumuladas na fila jms/Queue. Quando rodei o consumidor, estas mensagens foram imediatamente recebidas. Vamos completar o exemplo para exibir a mensagem recebida na GUI. Para isso, comece com a tela da Listagem 4 novamente, uma modificao trivial do index.xhtml.

Edio 80 Java Magazine

13

Introduo JMS com Java EE 6

O resto do trabalho parece simples: basta utilizar as anotaes de CDI no MDB para que este possa ser invocado pela pgina JSF, e criar um mtodo que retorna a ltima mensagem recebida por este MDB. A primeira encrenca meio bvia a recepo de mensagens pelo MDB assncrona em relao s invocaes que sero feitas pela pgina, portanto o MDB deve acumular estas mensagens internamente para consumo da GUI. Podemos resolver isso com um segundo nvel de enfileiramento, por exemplo com uma BlockingQueue. As mensagens recebidas pelo onMessage() so inseridas nesta fila interna, e so consumidas pelo mtodo next() invocado pela pgina.
Numa soluo mais sofisticada, que voc poderia preferir numa aplicao real, a interface web poderia usar uma tecnologia de polling (tambm chamada reverse Ajax), como Comet, para que o MDB possa submeter as mensagens recebidas tela, de forma imediata. Isso evitaria o prximo problema que vamos atacar mas o foco deste artigo no em Ajax ou tcnicas de programao web.

Listagem 5. MDB modificado para acesso da GUI


package teste; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.enterprise.context.Dependent; import javax.inject.Named; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @MessageDriven(mappedName = jms/Quotes, activationConfig = { @ActivationConfigProperty(propertyName = acknowledgeMode, propertyValue = Auto-acknowledge), @ActivationConfigProperty(propertyName = destinationType, propertyValue = javax.jms.Queue) }) public class QuotesConsumerBean implements MessageListener { private static BlockingQueue<String> msgsRecebidas = new LinkedBlockingQueue<String>( ); @Override public void onMessage (Message message) { try { TextMessage msg = (TextMessage)message; msgsRecebidas.offer(msg.getText()); } catch (JMSException e) { System.out.println(Deu pau! - + e); } } @Named(value=QuotesConsumerBean) @Dependent public static class Reader { public static String next ( ) throws InterruptedException { return msgsRecebidas.poll( ); } } }

Mas aps resolver este problema, a tela ainda no funcionar como esperado nada vai aparecer ao clicar Recebe. Acontece que a CDI no permite invocar um MDB da mesma forma que podemos fazer com outros tipos de enterprise beans, como session beans (como mostramos na Edio 77). Um MDB no pode ser criado da mesma forma como fazemos com um JavaBean qualquer (invocando seu construtor), ou mesmo da forma como fazemos com um session bean (com o lookup da sua interface-home e create()). Um MDB s instanciado pelo prprio container, no momento em que este bean associado sua fila. Alm disso, um MDB s ativo durante a recepo de mensagens da fila no se pode iniciar uma interao com um MDB por qualquer outro meio que no seja a invocao do seu mtodo onMessage(), invocao esta que s pode ser feita pelo container quando uma mensagem recebida.
Na prtica, voc pode burlar algumas dessas regras voc pode, no momento da primeira invocao ao onMessage(), armazenar this em algum atributo

Classe BytesMessage MapMessage ObjectMessage StreamMessage

Payload
Um array byte[] Tuplas NomeValor, como um Map<String, Object> Um objeto Serializable Um stream de bytes, como DataInputStream / DataOutputStream (Mais eficiente que qualquer outra opo para um grande volume de dados, pois no exige acumul-los na memria.) Uma String

TextMessage

Tabela 1. Tipos de mensagem da JMS


static que permita a qualquer cdigo externo invocar mtodos de instncia do MDB a qualquer momento posterior. Mas isso no ir ajud-lo em funcionalidades gerenciadas pelo container como CDI, e tambm pode causar outros problemas.

No existe soluo: voc tem que criar uma classe separada para funcionar como

Managed Bean da pgina. Num caso especial como esse, acho conveniente usar uma classe aninhada do MDB, como a classe Reader da Listagem 5. Esta um Java Bean comum, portanto pode ser instanciada vontade pelo sistema de Injeo de Dependncia. Note que o truque s funciona por que estamos usando atributos static

14 Java Magazine Edio 80

do MDB para acessar a fila interna de mensagens. Como o nome do Managed Bean (definido pela anotao @Name) no precisa ter nenhuma relao com o nome da classe, essa estrutura transparente para a pgina JSF.

Listagem 6. POJO para a cotao.


package teste; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; public class Quote implements Serializable { public final String symbol; public final Date updateTime; public final float value; public final float valOpen; public final float valMin; public final float valMax; public final int volume; public Quote (final String symbol, final Date updateTime, final float value, final float valOpen, final float valMin, final float valMax, final int volume) { this.symbol = symbol; this.updateTime = updateTime; this.value = value; this.valOpen = valOpen; this.valMin = valMin; this.valMax = valMax; this.volume = volume; } @Override public String toString () { return symbol + @ + new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(updateTime) + = $ + value + , volume = + volume; } }

Estruturando dados
J aprendemos a enviar e receber uma simples string de texto pela JMS, mas como procedemos para informaes mais estruturadas? O meu objetivo final, como ter adivinhado o leitor que acompanhou esta coluna na Edio anterior (ou simplesmente pelo nome da fila Quotes), distribuir dados sobre cotaes de aes um POJO como a Listagem 6. A JMS oferece cinco tipos de mensagem, como mostra a Tabela 1. Mas essa tabela mostra apenas o payload (carga til) da mensagem; alm disso, qualquer tipo de mensagem JMS tambm pode carregar um conjunto de propriedades, acessveis pelos mtodos da interface-raiz Message. Para transferir nosso POJO, o mtodo mais fcil usar a opo ObjectMessage, como podemos ver na Listagem 7, na qual destacamos o cdigo novo ou alterado. A JMS facilita as coisas pois se encarrega de serializar o objeto, que s precisamos setar na mensagem atravs do mtodo de fbrica Session.createObjectMessag e(Serializable) ou, depois, via ObjectMessage. setObject(Serializable). Mas aproveitamos este mesmo exemplo para mostrar tambm o uso das propriedades da JMS. Selecionamos duas informaes crticas de Quote o smbolo da cotao e o volume negociado e usamos os mtodos set<Tipo>Property() para criar propriedades nomeadas na mensagem. Qual a utilidade disso? Para comear, as propriedades so independentes do tipo de mensagem, e so independentes do payload e at da plataforma Java. Se a mensagem trafegar por middleware de mensagens no-Java incapaz de desserializar um objeto Java, este middleware ainda ser capaz de acessar estas propriedades. So, portanto, mais interoperveis. Mas se fosse apenas esta a necessidade, poderamos atend-la de outras formas por exemplo, usando uma MapMessage

Listagem 7. Cdigo de envio modificado para o POJO de cotao.


public void send () throws JMSException { Connection conn = null; try { Connection conn = qcf.createConnection(); Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE); MessageProducer prod = session.createProducer(dest); Quote quote = new Quote(^BVSP, new Date(), counter++, 0, 0, 0, (int)(Math.random() * 100)); ObjectMessage msg = session.createObjectMessage(quote); msg.setStringProperty(symbol, quote.symbol); msg.setFloatProperty(volume, quote.volume); prod.send(msg); System.out.println(Produzido: + quote); } finally { if (conn != null) conn.close(); } }

e mapeando todos os atributos do POJO para o payload NomeValor; ou talvez, transformando o objeto num documento XML (ex.: via JAXB) e colocando este XML numa TextMessage. A maior utilidade das propriedades que elas podem se utilizadas como critrio de filtro. Suponha que determinada aplicao no est interessada em todas as cotaes que so fornecidas atravs da fila Quotes; por exemplo, s queremos as

cotaes do ndice Bovespa, e mesmo destas, queremos ignorar aquelas que tiverem volume muito baixo. H vrias maneiras de resolver este problema: 1. Configurando o programa Produtor para s enfileirar dados de cotaes que correspondem a determinado critrio de filtro. a soluo mais eficiente, mas tambm a mais fortemente acoplada, pois estamos transferindo uma necessidade do consumidor para o produtor.

Edio 80 Java Magazine

15

Introduo JMS com Java EE 6

O mundo ps-Oracle: At aqui, melhor que o esperado


Glassfish ps-Oracle Num quadro da Edio 77, ponderei sobre NetBeans, Glassfish e JavaFX: O futuro na Oracle, especulando especificamente sobre o Glassfish: Ser mantido como RI (Implementao de Referncia) da especificao Java EE, e como opo de servidor open source e gratuito ou de baixo custo. Mas no claro se a Oracle continuar investindo em funcionalidades high-end (alta disponibilidade, SOA etc.); a Oracle j possui o WebLogic, bem-sucedido nesta posio. (...). Em resumo, eu temia que as capacidades high-end no tivessem futuro; o que seria uma pena, pois no momento da aquisio da Sun o Glassfish j estava atingindo um grau de maturidade bastante interessante nestas capacidades, por exemplo suporte a clustering. Felizmente, me preocupei sem necessidade. Em Maro, a Oracle divulgou um GlassFish Roadmap que surpreendeu at os mais otimistas, assegurando o futuro do projeto tanto do ponto de vista tcnico quanto da comunidade open source. Para no perder tempo com o passado (V2), eis o roadmap do GlassFish V3: v3.0.1 (2010): Branding (= search&replace SunOracle); Internacionalizao; Interoperabilidade bsica com outros produtos Oracle; Recursos de valor agregado. O NetBeans 6.9 j inclui um build preliminar do Glassfish 3.0.1 os releases finais de ambos so esperados para Junho; v3.1 (2010): Administrao centralizada de Clusters; Alta Disponibilidade / Replicao de Estado; Novos recursos de valor agregado (citando o suporte ao Oracle Coherence soluo de cache distribudo da Oracle, fruto da aquisio da Tangosol em 2007); v3.2 (2011): Melhorias de Administrao de Cluster / Alta Disponibilidade; Melhorias de integrao com o Oracle Identity Management; Suporte a Virtualizao; Alguns updates de especificaes Java EE (inclusive suporte preliminar Java EE 7); v4 (2012): Common Server Platform: Compartilhamento dos melhores componentes com Solaris ps-Oracle O sistema operacional aparentemente continua firme e forte, porm a Oracle interrompeu a distribuio gratuita de atualizaes automticas (via Update Manager) para quem no tiver um contrato de suporte. Tambm no mais legal utilizar o Solaris gratuitamente, a licena foi alterada de forma a permitir apenas um trial de 90 dias. Verses anteriores, at o Solaris 10 10/09, no so afetadas. Note que estamos falando da verso comercial do Solaris o OpenSolaris Como esperado, o Glassfish ser integrado a vrios produtos da Oracle, especialmente os middleware da famlia Oracle Fusion. Ser uma facilidade bem-vinda para empresas que j usam estes produtos da Oracle, mas no aderiram ao WebLogic. Acredito que estas integraes sero addons de cdigo fechado, mas isso no far muita diferena (no vejo vantagem em ter addons open source, para conectar a produtos proprietrios). A grande surpresa a manuteno no roadmap dos investimentos, que j vinham sendo feitos pela Sun, nos aperfeioamentos Clustering e Alta Disponibilidade. A Oracle tambm promete suporte para virtualizao, a ltima forte tendncia para application servers (em poucas palavras: a JVM e o Application Server executam sem nenhum sistema operacional guest, reduzindo o consumo de recursos de cada mquina virtual gerenciada pelo hipervisor). Pensando bem isso faz sentido, pois um dos papis do GlassFish OSE competir com o JBoss AS, e sem tais componentes o GlassFish teria uma posio estratgica comprometida. Parte das melhorias para alta escalabilidade envolve integrao com o Coherence, um produto proprietrio e comercial (sem possibilidade de uso gratuito em produo), mas o Glassfish tambm suporta solues open source como seu prprio Shoal (shoal.dev.java.net) e o EHCache (agora parte do portfolio Terracotta). OpenOffice.org ps-Oracle Tudo bem at aqui com o OpenOffice.org; mas causou barulho a deciso da Oracle de passar a cobrar por um produto relacionado um plug-in de suporte a documentos ODF para o Microsoft Office, disponvel em www.sun.com/software/ star/odf_plugin. Este plug-in no open source e nem faz parte do projeto OOo, mas anteriormente era distribudo gratuitamente pela Sun. O preo de US$ 90 parece muito alto considerando o preo de uma licena OEM bsica do prprio Microsoft Office. Pouca gente sabe, mas o Microsoft Office no suporta nenhum formato de documentos com padro ISO pois ainda no suporta seu prprio padro OOXML. O que a Microsoft suporta a forma transicional deste padro, contendo muitos problemas que no passaram pelo crivo do ISO (ex.: a codificao de grficos vetoriais na linguagem VML, considerada obsoleta pelo ISO e pelo resto do mundo com exceo do Microsoft Office e Internet Explorer). O padro OOXML pra valer, chamado estrito, no ser suportado nem mesmo pelo Office 2010 (recm finalizado); ficou para a prxima verso. Portanto, o produto da Microsoft no atenderia exigncia de usurios (especialmente governos) que exijam documentos aderentes a um padro ISO. Assim, me parece que a manobra da Oracle um golpe na Microsoft. A prpria Microsoft oferece um plugin prprio e gratuito de suporte a ODF mas s para o Office 2007, e talvez no seja to bom quanto o plugin da Oracle. o WebLogic Server; Implementao completa e certificada (e RI) do Java EE 7. continua gratuito (alm de open source). Ah, a Oracle tambm cessou a distribuio gratuita do OpenSolaris em CD/DVD mas c entre ns, quem quer esperar pelo correio quando pode fazer um download e queimar um ISO? De qualquer forma, se as ms notcias so poucas e dentro do razovel, as boas ainda esto demorando a aparecer e ainda existe incerteza sobre a continuidade do investimento da Oracle no projeto OpenSolaris e derivados como o NexentaOS (que procura reunir o melhor dos mundos Solaris e GNU).

16 Java Magazine Edio 80

Pode ser preciso criar uma interface remota que permita ao consumidor configurar o produtor; ou ento, programar ou configurar o produtor de forma especfica a estas necessidades. Outro problema que esta soluo invivel se, ao invs de uma fila, tivermos um topic, sendo lido por vrios consumidores cada um deles com exigncias diferenciadas de filtro de leitura; 2. Criar um conjunto mais complexo de filas; por exemplo, uma fila para cada cotao uma para o ndice Bovespa, oura para a Petrobras, e assim por diante. Essa soluo pode ser interessante em alguns casos, mas tem limitaes bvias de complexidade de administrao e de escalabilidade: s serve para um nmero muito pequeno e fixo de critrios de filtro, e totalmente inadequada para critrios no-booleanos como volume maior que X; 3. Utilizar filtros de propriedades. Para resumir a conversa, a Listagem 8 mostra como implementar a soluo 3 acima. Complementamos a configurao do MDB com uma nova propriedade de ativao messageSelector, cujo valor uma expresso envolvendo propriedades das mensagens no caso, symbol = ^BVSP AND volume >= 50. A tela JSF no precisa de nenhuma alterao dessa vez; o output ser automaticamente ajustado graas ao mtodo toString() da classe Quote. Mas adicionamos alguns printn() aos cdigos de envio e recepo de mensagens, para poder visualizar melhor toda a atividade especialmente para ver quais mensagens so filtradas (recebidas pelo consumidor) e quais no so. Clicando vrias vezes consecutivas no boto Envia do produtor, voc ver algo parecido com isso no output do Glassfish:
INFO: Produzido: ^BVSP@2010-04-25 14:56:25 = $11.0, volume = 89 INFO: Recebido : ^BVSP@2010-04-25 14:56:25 = $11.0, volume = 89 INFO: Produzido: ^BVSP@2010-04-25 14:56:26 = $12.0, volume = 94 INFO: Recebido : ^BVSP@2010-04-25 14:56:26 = $12.0, volume = 94 INFO: Produzido: ^BVSP@2010-04-25 14:56:26 = $13.0, volume = 44 INFO: Produzido: ^BVSP@2010-04-25 14:56:27 = $14.0, volume = 98 INFO: Recebido : ^BVSP@2010-04-25 14:56:27 = $14.0, volume = 98 INFO: Produzido: ^BVSP@2010-04-25 14:56:29 = $15.0, volume = 28 INFO: Produzido: ^BVSP@2010-04-25 14:56:30 = $16.0, volume = 29 INFO: Produzido: ^BVSP@2010-04-25 14:56:30 = $17.0, volume = 67 INFO: Recebido : ^BVSP@2010-04-25 14:56:30 = $17.0, volume = 67 INFO: Produzido: ^BVSP@2010-04-25 14:56:31 = $18.0, volume = 58 INFO: Recebido : ^BVSP@2010-04-25 14:56:31 = $18.0, volume = 58

Listagem 8. Filtrando mensagens no ponto de consumo.


package teste; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.enterprise.context.Dependent; import javax.inject.Named; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.ObjectMessage; @MessageDriven(mappedName = jms/Quotes, activationConfig = { @ActivationConfigProperty(propertyName = acknowledgeMode, propertyValue = Auto-acknowledge), @ActivationConfigProperty(propertyName = destinationType, propertyValue = javax.jms.Queue), @ActivationConfigProperty(propertyName = messageSelector, propertyValue = symbol = ^BVSP AND volume >= 50) }) public class QuotesConsumerBean implements MessageListener { private static BlockingQueue<Quote> msgsRecebidas = new LinkedBlockingQueue<Quote>(); @Override public void onMessage (Message message) { try { ObjectMessage msg = (ObjectMessage)message; Quote quote = (Quote)msg.getObject(); msgsRecebidas.offer(quote); System.out.println(Recebido : + quote); } catch (final JMSException e) { System.out.println(Deu pau! - + e); } } @Named(value=QuotesConsumerBean) @Dependent public static class Reader { public static Quote next () throws InterruptedException { return msgsRecebidas.poll(); } }

Podemos ver facilmente que as nicas mensagens que chegam ao consumidor so as que atendem ao filtro; no caso, todas possuem o mesmo symbol, mas apenas 50% em mdia possuem um valor aceitvel para volume. Uma ltima dica importante para quem for trabalhar com seletores JMS: no esquea que as mensagens que no forem selecionadas pelo(s) consumidor(es) permanecem na fila, portanto, aconselhvel configurar um tempo de expirao para a mensagem; por exemplo assim:
prod.send(msg, DeliveryMode.NON_PERSISTENT, 0, 5000L);

consumidores, no caso de topics). Aps esse perodo, a mensagem ser automaticamente descartada. Alm disso, a opo DeliveryMode.NON_PERSISTENT determina que a mensagem no precisa ser preservada em disco que o comportamento default, e importante para recuperao caso o servidor JMS sofra um crash ou restart

determinamos que a mensagem tem apenas 5000 milissegundos (5 segundos) para ser lida pelo consumidor (ou

Edio 80 Java Magazine

17

Introduo JMS com Java EE 6

D seu voto sobre este artigo, atravs do link:

www.devmedia.com.br/javamagazine/feedback

Existem coisas que no conseguimos ficar sem!


...s pra lembrar, sua assinatura pode estar acabando!

Renove J!

AMIGO
18 Java Magazine Edio 80

www.devmedia.com.br/renovacao
Para mais informaes: www.devmedia.com.br/central

edio ta

enquanto possui mensagens pendentes. pouco provvel que uma mensagem com tempo de expirao to curto se beneficie da persistncia, pois caso o servidor seja reinicializado, o perodo de indisponibilidade ser superior expirao. H outros motivos para desejar o uso destas opes. Mensagens no-persistentes tm maior desempenho, e devem ser preferidas sempre que a perda eventual de mensagens no for um problema grave. Pode-se tambm configurar tempos de expirao de acordo com a utilidade da informao; por exemplo se cada ao da bolsa tem uma cotao atualizada a cada 5 minutos, e as aplicaes s se interessam em saber o valor mais recente, no h sentido em permitir que uma mensagem permanea disponvel por mais que 5 minutos. (Uma aplicao poderia ficar todo esse tempo sem ler mensagens, por exemplo, por ter sido atualizada e reinicializada.)

Concluses
A JMS teve sempre a reputao de ser uma API simples e bem projetada, tanto que precisou de manutenes mnimas desde sua introduo. Nas verses atuais da plataforma Java EE, a JMS continuou igual, pois havia muito pouco o que melhorar basicamente a configurao de MDBs (que antes feita com XMLs, passou a contar com anotaes), e o suporte Injeo de Dependncia (ainda que, no caso de MDBs que possamos querer injetar em outros beans, vimos que isso tem limitaes que so inevitveis considerando a natureza dos MDBs). Para quem est acostumado com a comunicao remota estilo RPC, como a dos session beans, a JMS parece mais complicada por que exige codificar mensagens, ao invs de simplesmente passar parmetros. Nesse aspecto, vale comparar com web services, onde tambm precisamos com-

por os documentos que sero trafegados, mas sabemos que isso acaba sendo vantajoso pois resulta numa arquitetura de baixo acoplamento em comparao com RPC. Osvaldo Pinali Doederlein opinali@gmail.com, twitter.com/opinali, br.linkedin.com/in/opinali, weblogs.java.net/blog/opinali Mestre em Engenharia de Software Orientado a Objetos, membro individual do Java Community Process e trabalha na Visionnaire Informtica como arquiteto e desenvolvedor. D seu feedback sobre esta edio! A Java Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o que voc, leitor, acha da revista!
D s

Feedback eu
sobre e s

Edio 80 Java Magazine

19

Seo Java: NeSta Seo voc eNcoNtra artigoS iNtermedirioS e avaNadoS Sobre Java

Java EE 6 na Prtica Part


O que h de novo na plataforma Java Ente

ava Platform, Enterprise Edition, conhe, cida antigamente como J2EE e a partir da verso 5 como Java EE, a plataforma padro para o desenvolvimento de aplicaes corporativas (enterprise) em Java. Uma aplicao corporativa um software que tem por objetivo resolver um problema de uma empresa ou organizao como um todo e, por este motivo, possui requisitos particulares, como escalabilidade, segurana, acessibilidade, dentre outros. A plataforma Java EE mais conhecida pelos seus dois principais componentes: o Servlet e o EJB (Enterprise Java Bean). Ambos definem classes de objetos que possuem ciclo de vida determinado e que funcionam dentro de containers: o primeiro em um servidor Web (Tomcat, Jetty, Resin, etc.) e o segundo em um servidor de aplicao (GlassFish, JBoss AS, IBM Websphere, etc.). Um Servlet prov uma funcionalidade que pode ser acessada por meio de um navegador Web, enquanto as funes providas por um EJB so disponibilizadas de maneira local (mesmo servidor) ou remota (outro servidor) para outros componentes. Os containers proveem diversos servios de infraestrutura a estes e outros componentes que so implantados em suas aplicaes, de forma a proporcionar a estas ltimas os requisitos caractersticos de aplicaes corporativas. Desta maneira, os desenvolvedores no tm necessidade de implementar tais funcionalidades em cada sistema que constroem, mas as reutilizam do servidor de aplicao (ou servidor Web). Por exemplo, ao criar um Servlet no tenho que me preocupar com o modo pelo qual o servidor ir transformar um acesso via protocolo HTTP a uma execuo do meu cdigo. O servidor prov este servio e ainda disponibiliza eventuais

Resumo DevMan
De que se trata o artigo:
Da verso 6 da plataforma Java, Enterprise Edition (Java EE 6), que foi publicada como padro do JCP em dezembro de 2009, trazendo vrias novidades em relao ao Java EE 5. A plataforma Java EE engloba diversas tecnologias teis no desenvolvimento de aplicaes corporativas, ou seja, sistemas que envolvem toda uma organizao e seus diversos usurios, exigindo caractersticas como escalabilidade, segurana, etc.

Para que serve:


A plataforma Java EE serve para o desenvolvimento de aplicaes corporativas, seja um sistema Web simples ou uma aplicao com N camadas provendo Web Services e interfaces grficas em janelas. A nova verso, Java EE 6, serve para simplificar ainda mais o desenvolvimento de aplicaes corporativas (o que foi tambm foco da verso 5), trazendo flexibilidade e extensibilidade plataforma.

Em que situao o tema til:


O tema til para arquitetos e programadores envolvidos no desenvolvimento de aplicaes corporativas que desejam atualizar-se no que h de mais recente em termos de padres Java nesta rea. Desenvolvedores que no possuem experincia com verses anteriores de Java EE tambm podem se beneficiar com os exemplos que, apesar de focar nas novidades de Java EE 6, mostram tambm como desenvolver uma aplicao corporativa do zero.

Java EE 6 na Prtica - Parte 1:


Java EE o padro da plataforma Java para desenvolvimento de aplicaes corporativas, tambm conhecidas como aplicaes enterprise. Desde suas primeiras verses, a plataforma oferece servios que permitem que o desenvolvedor concentre-se em desenvolver sua aplicao, deixando a infraestrutura por conta do servidor de aplicaes. A nova verso de Java EE tem como foco a simplicidade do desenvolvimento, a flexibilidade e a extensibilidade da plataforma. Neste artigo, apresentamos uma viso geral do Java EE 6 e comeamos o desenvolvimento de uma aplicao real na plataforma. Implementamos as classes de domnio (Listagens 1 e 2) mostrando algumas novidades do JPA 2.0. Em seguida, implementamos a validao, ainda nas classes de domnio, utilizando o novo padro Bean Validation (Listagens 3 a 6). Por fim, desenvolvemos uma funcionalidade simples de cadastro para mostrar mais um novo padro Java EE 6: o CDI, que possibilita a injeo de dependncias em contextos. O CDI permite a integrao das diferentes camadas do sistema: DAOs na camada de persistncia (Listagens 7 e 8), implementao dos casos de uso em classes de aplicao (Listagens 9 e 10), integrao entre interface com o usurio e sistema via classe de controle (Listagem 11) e pginas JSF e JSP na camada de viso (Listagens 12 a 14).

dados enviados pelo cliente por meio de sua API (Application Programming Interface, ou Interface de Programao da Aplicao). Estes servios de infraestrutura so a grande vantagem da plataforma Java EE. Muitos deles so bastante conhecidos e

at mesmo possvel que um desenvolvedor os tenha utilizado sem saber que fazem parte da plataforma enterprise de Java, por exemplo: JSP (JavaServer Pages), JDBC (Java Database Connectivity), JavaMail, JPA (Java Persistence API), JSF (JavaServer Faces), etc.

20 Java Magazine Edio 80

e1
rprise Edition

Em uma srie de artigos usaremos como exemplo um sistema de pequeno porte para mostrar as novidades da plataforma de desenvolvimento corporativo Java

vtor eStvo Silva Souza


O Java Community Process
O JCP Java Community Process ou Processo da Comunidade Java o meio pelo qual a comunidade Java (empresas, organizaes sem fins lucrativos e desenvolvedores) prope, desenvolve e publica padres para tecnologias relacionadas a Java. O processo gira em torno das JSRs Java Specification Requests ou Pedidos de Especificao Java. Um membro do JCP faz a solicitao de uma JSR com seu detalhamento e, se for aprovada pelo comit executivo, um grupo para avaliao de toda a comunidade. Para provar que a especificao pode ser implementada, o EG precisa desenvolver tambm uma implementao de referncia (Reference Implementation). Se aprovada, a JSR publicada em sua verso final e diferentes organizaes podem desenvolver suas implementaes baseadas nela (na prtica, em muitos casos tal desenvolvimento comea mesmo antes da verso final). Isso permite aos usurios de Java escolher a implementao que preferirem e at trocar de implementao, j que todas elas funcionam dentro do que foi especificado pelo JCP. Para mais detalhes sobre o JCP, consulte o seu website (veja Links).

Desde o lanamento de sua primeira verso em 1999, a plataforma Java EE evoluiu consideravelmente. Em dezembro de 2009 o Java Community Process (JCP veja o quadro O Java Community Process) publicou a verso final da JSR 316: JavaTM Platform, Enterprise Edition 6 (Java EE 6) Specification. Esta verso tem por objetivo melhorar ainda mais a usabilidade e o desempenho da plataforma, como j feito na verso anterior, Java EE 5. Em uma srie de artigos comeando nesta edio, apresentaremos as novidades desta nova verso da plataforma Java EE usando uma abordagem prtica. Comearemos com uma descrio geral do que h de novo na verso 6 em relao verso anterior e desenvolveremos uma aplicao corporativa simples utilizando as tecnologias que fazem parte da plataforma Java EE 6.

de especialistas (Expert Group ou EG) se forma para aquela JSR. Guiados pelo(s) Lder(es) da Especificao (Specification Lead(s)), o grupo deve desenvolver uma proposta para o padro e public-la

Viso Geral
De acordo com um artigo tcnico publicado na Sun Developer Network (veja Links), os trs principais objetivos da nova verso da plataforma Java EE so: flexibilidade, extensibilidade e facilidade de desenvolvimento.

Flexibilidade
Como mencionamos anteriormente, a plataforma Java EE contm um conjunto

de tecnologias que proveem caractersticas enterprise s aplicaes implantadas em servidores de aplicao que seguem sua especificao. medida que a plataforma foi evoluindo, o nmero de tecnologias agregadas cresceu para prover diferentes servios e atender a diferentes tipos de aplicao corporativa. Esta evoluo, no entanto, causou um problema: para muitas aplicaes o conjunto de tecnologias oferecida grande demais, tornando-se um excesso que consome recursos desnecessariamente. Para remediar esta situao, a especificao Java EE 6 introduz o conceito de Perfil (Profile). Um perfil especifica um conjunto de tecnologias a ser utilizado para um tipo especfico de aplicao. A especificao define tambm o Perfil Web (Web Profile) que consiste em um subconjunto das tecnologias Java EE, contendo aquelas mais utilizadas em aplicaes web de pequeno e mdio portes (no corporativas). A definio de um perfil permite que provedores

de servidores de aplicao disponibilizem, alm da verso completa de seu servidor, uma verso para cada perfil existente. As verses para os perfis so mais enxutas, o que traz uma maior simplicidade e maior desempenho na execuo das aplicaes que se encaixam naquele perfil. Por exemplo, o download do servidor de aplicao GlassFish v3 completo possui em torno de 63 MB, enquanto o Web Profile possui aproximadamente 45 MB. Outro problema advindo do crescimento da plataforma Java EE foi o surgimento de novas tecnologias que substituem e tornam obsoletas tecnologias mais antigas. o caso, por exemplo, da introduo da Java Transaction API (JTA) com suas anotaes de persistncia, que permitiram a substituio dos pesados e burocrticos Entity Beans por POJOs1 que so gerenciados pelos mecanis1 Plain Old Java Objects ou Simples e Velhos Objetos Java um nome que se d a classes Java desenvolvidas sem nenhuma dependncia direta a um framework ou container especfico. Ao contrrio de um Entity Bean, por exemplo, um POJO no obrigado a estender uma determinada classe e implementar determinados mtodos.

Edio 80 Java Magazine

21

Java EE 6 na Prtica Parte 1

mos de persistncia do servidor de aplicao (utilizando anotaes para especificar o mapeamento objeto/relacional). At a verso 6 as tecnologias antigas continuavam existindo como componentes obrigatrios da plataforma, fazendo com que os servidores de aplicao fossem obrigados a oferecerem servios que, na prtica, no eram mais utilizados. A especificao Java EE 6 traz como soluo desta questo o conceito de Poda (Pruning). A ideia podar (cortar, remover) tecnologias que no so mais utilizadas. A poda funciona da seguinte maneira: ao especificar uma determinada verso da plataforma (ex.: Java EE 6), o grupo de especialistas (Expert Group ou EG, veja o quadro O Java Community Process) marca algumas das tecnologias que compem a plataforma como candidatas poda. Durante a especificao da prxima verso da plataforma (ex.: Java EE 7), o EG da nova especificao decide, para cada tecnologia proposta, se ela ser mantida, podada ou se continua como candidata poda para que a prxima especificao (ex.: Java EE 8) decida. Uma tecnologia podada no removida dos documentos de especificao, mas simplesmente marcada como opcional. Marcar uma tecnologia como opcional significa que os implementadores dos servidores de aplicao no so mais obrigados a suportar aquela tecnologia e podem escolher deix-la de fora, fazendo com que seu servidor seja mais leve e tenha um melhor desempenho. Como o conceito de poda foi definido na verso atual da especificao Java EE, todas as tecnologias so consideradas obrigatrias e devem ser implementadas pelos servidores de aplicao. Para saber quais tecnologias foram marcadas como candidatas poda, veja mais adiante a subseo Tecnologias Java EE.

maior so os frameworks desenvolvidos e que podem ser utilizados por aplicaes Java. A integrao destes frameworks com aplicaes desenvolvidas para a plataforma Java EE , em alguns casos, bastante complicada. Para lidar com esta questo a especificao Java EE 6 incluiu inmeros pontos de extensibilidade e agora permite que frameworks se autorregistrem junto ao servidor, facilitando seu uso em aplicaes corporativas. Em outras palavras, a integrao de ferramentas plataforma foi padronizada, permitindo que cada organizao personalize o conjunto de tecnologias ao dispor de suas aplicaes.

Facilidade de Desenvolvimento
Na verso anterior da plataforma, Java EE 5, o foco foi a simplicidade: Entity Beans foram substitudos por POJOs, anotaes diminuram a quantidade de XML a ser escrito, a construo de EJBs foi simplificada, etc. Java EE 6 continua este esforo de simplificao, adicionando melhorias teis, como, por exemplo: Componentes Web como Servlets e filtros podem ser definidos com anotaes; Anotaes para injeo de dependncias e definio de contextos foram padronizadas; Requisitos de empacotamento de aplicaes corporativa foram simplificados; Novas APIs facilitam o desenvolvimento em determinadas situaes (ex.: JAX-RS para Web Services RESTful, Bean Validation para validao de atributos de objetos, etc.); Suporte AJAX embutido no JSF 2.0; EJBs simplificados ainda mais; Dentre outras... Veremos muitas destas novidades ao longo desta srie de artigos.

gias que compem a especificao Java EE 6 e suas respectivas verses na especificao atual e na anterior (Java EE 5). As tecnologias marcadas com na coluna referente a Java EE 5 so novidades includas na especificao atual da plataforma. Todas as tecnologias so obrigatrias e as verses marcadas com a sigla CP so as candidatas poda, ou seja, o grupo de especialistas da futura especificao de Java EE 7 ir decidir quais destas sero marcadas como opcionais. No caso dos EJBs, apenas os Entity Beans foram marcados como candidatos poda. Como podemos ver, so muitas tecnologias que formam a plataforma Java EE. Muitas delas so bastante complexas e exigiriam artigos inteiros para apresent-las por completo (muitas j existem h algum tempo e, portanto, j foram escritos artigos sobre as mesmas em edies anteriores da Java Magazine). Nosso objetivo nesta srie de artigos focar nas novidades da verso 6 da plataforma utilizando uma abordagem prtica. Assim fazendo, certamente tocaremos tambm em alguns aspectos bsicos de muitas das tecnologias Java EE. Na prxima seo, comearemos nossa abordagem prtica discutindo as ferramentas que podemos usar para desenvolver uma aplicao corporativa.

Ferramentas
Para qualquer abordagem prtica preciso utilizar ferramentas apropriadas. Queremos desenvolver aplicaes para a plataforma Java EE e, para isso, precisaremos de um servidor de aplicao que implemente a verso 6 da especificao da plataforma. Para uma maior produtividade, interessante que este servidor esteja integrado ao ambiente de desenvolvimento, ou seja, IDE (Integrated Development Environment). Como servidor utilizaremos o GlassFish em sua verso 3, que a primeira implementao de um servidor de aplicao compatvel com o padro Java EE 6. O GlassFish livre (open source) e possui tambm uma verso com suporte comercial da Oracle. Como IDE utilizaremos o NetBeans 6.8, pois j vem preparado

Tecnologias Java EE Extensibilidade


Ainda relacionado evoluo da plataforma Java EE, existe o problema da extensibilidade: muitas tecnologias so includas na especificao da plataforma e, portanto, so integradas aos servidores de aplicao. No entanto, em nmero muito Como j dissemos anteriormente, a plataforma Java EE um conjunto de tecnologias. Cada nova verso da especificao formada por um conjunto diferente de tecnologias: algumas evoluem para novas verses, outras so novidades. A Tabela 1 mostra, em ordem alfabtica, as tecnolo-

22 Java Magazine Edio 80

para o desenvolvimento de aplicaes Java EE 6. Nesta seo apresentaremos como instalar e implantar uma aplicao Hello, World! no servidor de aplicao GlassFish utilizando o NetBeans. Assumiremos a partir deste momento que o leitor possui o Kit de Desenvolvimento Java (Java Development Kit, ou JDK), verso 6, instalado em seu sistema. A instalao do JDK est fora do escopo deste artigo, porm mais informaes podem ser encontradas na pgina de downloads do Java SE (veja Links). Note que as instrues a seguir foram testadas no momento da escrita deste artigo e possvel que algum detalhe tenha sido alterado desde ento, exigindo que o leitor adapte as instrues situao atual.

Tecnologia
Bean Validation Common Annotations for the Java Platform Contexts and Dependency Injection for the Java EE Platform EJB (Enterprise Java Beans) EL (Expression Language) Interceptors JACC (Java Authorization Service Provider Contract for Containers) JASPIC (Java Authentication Service Provider Interface for Containers) Java EE Deployment API Java EE Management API JavaMail JAX-RPC (Java API for XML-based RPC) JAX-RS (Java API for RESTful Web Services) JAX-WS (Java API for XML Web Services) JAXB (Java Architecture for XML Binding) JAXR (Java API for XML Registries) JCA (Java EE Connector Architecture) JMS (Java Messaging Service) JPA (Java Persistence API) JSF (JavaServer Faces) JSP (JavaServer Pages) JSTL (Standard Tag Library for JavaServer Pages) JTA (Java Transaction API) Managed Beans Servlet Web Services Metadata for the Java Platform

Java EE 5
1.0 3.0 2.1 1.1 1.2 1.1 1.4 1.1 2.0 2.0 1.0 1.5 1.1 1.0 1.2 2.1 1.2 1.1 2.5 2.0

Java EE 6
1.0 1.1 1.0 3.1 CP* 2.2 1.1 1.4 1.0 1.2 CP 1.1 1.4 1.1 CP 1.1 2.2 2.2 1.0 CP 1.6 1.1 2.0 2.0 2.2 1.2 1.1 1.0 3.0 2.1

NetBeans
A IDE NetBeans 6.8 possui uma verso com o servidor GlassFish v3 embutido e pronto para uso. No site do NetBeans (veja Links), clique no boto Download Free NetBeans IDE 6.8 e, em seguida, clique no boto Download referente coluna Java para copiar o instalador. Aps o download, execute o assistente para instalao e siga os passos indicados. Aps a instalao, abra o NetBeans e clique no menu File>New Project... para criar um novo projeto e siga as instrues abaixo em cada um dos passos do assistente (clique em Next para ir ao passo seguinte): Para que seja uma aplicao corporativa, escolha a opo Enterprise Application, na pasta Java EE; Escreva HelloWorld como nome do projeto e confira o diretrio no qual a IDE salvar seu projeto; Certifique-se que o servidor escolhido o GlassFish v3 Domain, a verso da plataforma Java EE a 6 e que os mdulos EJB e Web Application esto selecionados. Aps alguns instantes, o NetBeans ter criado trs projetos para sua aplicao: HelloWorld (projeto principal que gera a aplicao para implantao), HelloWorldejb (onde ficam as classes Java) e HelloWorld-war (onde ficam os componentes Web como pginas, imagens, folhas de estilo, etc.).

Tabela 1. Atualizaes e novidades da Java EE 6 Nosso projeto Web j possui uma pgina principal (HelloWorld-war/Web Pages/index. jsp) com a frase Hello World! escrita, portanto basta agora implantar a aplicao no servidor. Para tal, clique no menu Run>Run Main Project ou no boto na barra de ferramentas, ou ainda pressione F6. Aguarde a implantao do projeto e a abertura do navegador padro do sistema (que voc pode mudar em Tools>Options). direita. Uma nova tabela ser apresentada com links para arquivos de instalao em diferentes plataformas. Selecione e faa o download do instalador compatvel com seu sistema operacional, execute-o e siga as instrues do assistente para instalao. Quando utilizamos uma IDE, ela fica responsvel por compilar todo o cdigo, montar o arquivo que ser implantado (WAR no caso de aplicaes Web, EAR para aplicaes enterprise) e copi-lo para a pasta adequada no servidor de aplicao. Caso voc queira executar o GlassFish e implantar manualmente uma aplicao, utilize o script glassfishv3/glassfish/startserv (startserv.bat no Windows) para iniciar o servidor, copie o arquivo EAR/WAR para a pasta glassfishv3/glassfish/domains/domain1/ autodeploy e aguarde que o servidor inicie sua aplicao (confira o andamento no log).

Instalando o GlassFish separadamente


Se por algum motivo voc no deseja utilizar o servidor GlassFish que vem embutido no NetBeans 6.8, voc pode instal-lo separadamente. Para isso, acesse o site do GlassFish (veja Links) e clique no boto Download. Localize a linha da tabela que diz GlassFish Server Open Source Edition 3.0 e clique no link Download na coluna da

Edio 80 Java Magazine

23

Java EE 6 na Prtica Parte 1

Aps seu incio, abra em seu navegador o endereo http://localhost:8080/NomeDaSuaApplicao. No mostraremos como montar um arquivo WAR ou EAR por existirem ferramentas (as IDEs) que executam esta tarefa automaticamente.

Uma aplicao Java EE 6 na prtica


Mostramos na seo anterior como instalar ferramentas teis para o desenvolvimento de uma aplicao na plataforma Java EE 6. A partir de agora, comearemos o desenvolvimento de uma aplicao corporativa, demonstrando algumas das funcionalidades que citamos na viso geral da plataforma. O cdigo-fonte desta aplicao ser disponibilizado a cada artigo no site da Java Magazine. Ao longo do artigo daremos tambm instrues de utilizao do NetBeans 6.8 para implementao do sistema. Para demonstrarmos as novidades da plataforma Java EE 6, usaremos como exemplo uma aplicao real, porm no muito grande: um Sistema de Controle de Ambulncias. Um determinado governo (municipal ou estadual) oferece servio de atendimento mdico de urgncia aos seus cidados. O cidado que encontra-se em uma emergncia faz uma ligao ao servio utilizando um nmero gratuito, explica sua situao e solicita uma ambulncia. O governo possui um nmero limitado de ambulncias e deseja ter um controle informatizado para despachar as ambulncias de forma otimizada. O sistema deve funcionar da seguinte maneira: 1. Operadores recebem chamadas dos cidados. Ao receber uma chamada, o operador deve inserir as informaes passadas pelo cidado no sistema e filtrar as chamadas, identificando chamadas duplicadas ou que no se tratam de emergncias; 2. As chamadas reais chegam pelo sistema aos despachantes, que tem como objetivo selecionar, dentre as ambulncias ativas, a melhor ambulncia a ser despachada ao endereo da chamada. O sistema deve permitir que os despachantes pesquisem quais ambulncias esto ativas (ocupadas ou no) e onde elas esto;

Figura 1. Arquitetura utilizada no desenvolvimento do sistema de controle de ambulncias 3. Ao selecionar uma ambulncia, o despachante envia pelo sistema a chamada para o motorista da ambulncia, que recebe todas as informaes necessrias para dirigir-se ao local. Um sistema de posicionamento (GPS) deve atualizar a localizao da ambulncia no sistema, porm o motorista deve, alm disso, indicar ao sistema o momento da chegada no destino e, depois, ao hospital, para fins de estatstica de atendimento. Alm de prover as funcionalidades acima, o sistema deve ainda conter funcionalidades de infraestrutura, como cadastros de funcionrios e ambulncias. possvel ainda imaginar outras funcionalidades, como gerao de relatrios, entretanto j temos o suficiente para desenvolvermos uma aplicao real. Um processo de desenvolvimento (seja gil ou no) muito importante para o desenvolvimento de um sistema, em especial no caso de grandes aplicaes corporativas. A anlise dos requisitos e o projeto do sistema acima esto fora do escopo deste artigo, porm consideramos interessante apresentar a arquitetura em 3 camadas baseada no padro de projeto Service Layer (Martin Fowler, Patterns of Enterprise Application Architecture, Addison-Wesley) que utilizaremos em nossa aplicao de exemplo. A Figura 1 mostra os diferentes pacotes que compem a arquitetura. O pacote viso contm as pginas Web e outros artefatos relacionados interface grfica com o usurio. Ele interage diretamente com o pacote controle, onde encontram-se classes de ao que so responsveis por fazer a mediao entre a interface grfica e a camada de negcio. As classes de aplicao implementam os casos de uso de nossa aplicao e manipulam objetos do domnio do problema (outras camadas tambm tm acesso a estes objetos, mas no os criam nem alteram seus dados). O pacote de persistncia responsvel por armazenar os dados dos objetos do domnio no banco de dados. Esta separao permite uma maior flexibilidade com relao tanto camada de viso (construo de diversas interfaces grficas para a mesma funcionalidade) quanto camada de acesso a dados (diferentes implementaes de persistncia). Alm disso, em aplicaes corporativas componentes podem ser colocados em diferentes servidores e acessados remotamente, se preciso. Finalmente, comearemos o desenvolvimento de nossa aplicao com Java EE 6. Usando as instrues apresentadas na seo anterior, crie o projeto SisContrAm e desenvolva tambm o sistema como exerccio. Caso prefira, o cdigo-fonte est disponvel no site da Java Magazine. Comearemos pelo pacote de domnio e, para isso, precisaremos de um banco de dados.

Criao do banco de dados


Precisamos armazenar os dados dos objetos criados em nosso sistema de maneira

24 Java Magazine Edio 80

persistente e usaremos, para tal, um banco de dados relacional. No NetBeans, para criar o banco de dados preciso abrir a aba Services (clique em Window>Services). Na rvore de componentes exibida, expanda o item Databases e ver quais servidores de banco de dados esto disponveis, como mostra a Figura 2. O Java DB (Apache Derby) instalado junApache ) tamente com a IDE, enquanto o servidor MySQL mostrado na figura est presente porque est instalado na mquina que est executando o NetBeans (outros bancos de dados suportados podem ser vistos ao expandir o item Drivers). Escolha seu banco de dados preferido, clique com o boto direito do mouse em seu nome, clique em Start se o banco j no tiver sido iniciado e, em seguida, clique em Create Database....

Figura 3. Diagrama de classes de domnio do SisContrAm

Figura 2. Servidores registrados no NetBeans

Classes de domnio
As classes de domnio representam conceitos do mundo real relacionados ao problema que nosso sistema deve resolver. So as informaes que precisamos manipular e armazenar para o bom funcionamento da aplicao. Em nosso exemplo, tais classes esto presentes no diagrama da Figura 3. O SisContrAm armazenar informaes sobre funcionrios para permitir o controle de acesso s diferentes funcionalidades do sistema e registrar sua participao no atendimento s chamadas de emergncia. A propriedade funcoes um conjunto de valores Funcao, um tipo enumerado no exibido no diagrama e que compreende os valores OPERADOR, DESPACHANTE, MOTORISTA e ADMIN. De uma chamada de emergncia so armazenados o horrio, descrio do problema, localizao, nome do cidado que ligou, nvel de prioridade (outra enumerao, com valores BAIXO, MEDIO e ALTO) e

Edio 80 Java Magazine

25

Java EE 6 na Prtica Parte 1

uma propriedade booleana que indica se a chamada j pode ser encaminhada para os despachantes. Ao despachar uma ambulncia para atendimento de uma chamada de emergncia, a mesma associada chamada por meio da classe Despacho. Registra-se o horrio do despacho, da chegada ao local e da chegada ao hospital (se houver necessidade). Das ambulncias sero cadastrados nmero identificador e placa, alm de registrar qual motorista dirige qual ambulncia (o que pode mudar de um dia para o outro). Funcionalidades como a localizao das ambulncias via GPS e o registro de quais ambulncias esto ou no ativas (por exemplo, uma delas pode estar em manuteno) no esto includas neste exemplo para evitar que o mesmo fique complexo demais. Repare tambm que associaes com navegabilidade definida indicam quando uma classe possui uma referncia outra e o contrrio no ocorre.

Listagem 1. Implementao da classe ChamadaEmergencia usando JPA.


package br.com.javamagazine.siscontram.dominio; import br.com.javamagazine.util.javaee6.persistencia.ObjetoPersistenteImpl; import java.util.*; import javax.persistence.*; @Entity public class ChamadaEmergencia extends ObjetoPersistenteImpl { @Temporal(TemporalType.TIMESTAMP) private Date horario; private String descricao; private String endereco; private String nomeCidadao; private NivelPrioridade nivelPrioridade; private boolean encaminhada; @ManyToOne private Funcionario operador; @ManyToOne private Funcionario despachante; @OneToMany(mappedBy = chamadaEmergencia, orphanRemoval = true) private Set<Despacho> despachos; } /* Getters e setters para todas as propriedades. */

Implementando o domnio com POJOs e JPA


Antes da verso 5, classes de domnio em sistemas corporativos eram implementadas em Java usando Entity Beans, para que pudessem ser associadas a cdigos JDBC que executariam tarefas de persistncia como consulta e armazenamento no banco de dados. Logo surgiram diversos frameworks de Mapeamento Objeto/Relacional (Object/Relational Mapping ou ORM) como o Hibernate, propondo uma soluo diferente a esta questo: a utilizao de POJOs e mapeamento da persistncia por meio de metadados. Rapidamente o ORM se tornou o padro de facto para persistncia de objetos nas mais variadas aplicaes e o padro Java EE incorporou tambm a ideia ao incluir no Java EE 5 a JPA, ou Java Persistence API (API de Persistncia Java). Utilizando esta tecnologia possvel implementar as classes de domnio que mostramos na Figura 3 e, ao mesmo tempo, indicar ao servidor de aplicao como deve efetuar o mapeamento entre os objetos na memria e o banco de dados relacional. A classe ChamadaEmergencia, por exemplo, seria implementada como mostra a Listagem 1.

A anotao @Entity define esta classe como uma entidade persistente. A anotao @Temporal foi utilizada para estabelecer que queremos armazenar tanto data quanto hora da propriedade horario. Associaes so anotadas com @ManyToOne e @OneToMany. As demais propriedades no possuem anotaes e o JPA assume os valores default para persistncia. Nada disso novidade no Java EE 6, portanto no entraremos em detalhes. A nica novidade deste cdigo o parmetro orphanRemoval da anotao @OneToMany. Quando definida como true (o default false), o servidor de aplicao ir remover

do banco de dados o objeto que for removido do conjunto, no nosso caso, instncia de Despacho. Alm disso, uma operao de excluso no objeto ChamadaEmergencia ser automaticamente propagada a todos os objetos do conjunto. Desta maneira definimos uma relao de composio entre as classes: os despachos pertencem a uma chamada de emergncia e devem sempre estar relacionados a ela. Por fim, importante ressaltar que implementamos ChamadaEmergencia como subclasse de ObjetoPersistenteImpl. Veja o quadro A superclasse ObjetoPersistenteImpl para entender o porqu do uso desta superclasse.

26 Java Magazine Edio 80

Para implementar esta entidade do domnio usando o NetBeans, clique com o boto direito do mouse no projeto SisContrAm-ejb e selecione New>Entity Class. Preencha os campos Class Name (ChamadaEmergencia) e Package (ex.: br.com.javamagazine.siscontram. dominio para as prximas listagens, observe a declarao package para saber em qual pacote sugerimos incluir a classe em questo) e, como ainda no configuramos a persistncia em nossa aplicao, clique no boto Create Persistence Unit... (isso precisar ser feito somente desta vez). Na janela que se abrir, clique na lista Data Source e escolha New Data Source... para abrir uma terceira caixa de dilogo, como mostra a Figura 4. Preencha o JNDI Name (ex.: SisContrAm-ds) e escolha na lista Database Connection a conexo de banco de dados que criamos anteriormente. Clique OK em todas as janelas para que o NetBeans crie os arquivos de configurao adequados e crie a classe ChamadaEmergencia, pronta para ser implementada como demonstrado na Listagem 1. Note que deixamos a opo Create marcada no item Table Generation Strategy, assim o container Java EE criar automaticamente as tabelas das classes de domnio que implementarmos e mapearmos.

Figura 4. Caixas de dilogo do NetBeans para configurao da persistncia da aplicao


Listagem 2. A classe Funcionario e o mapeamento de colees com @ElementCollection.
package br.com.javamagazine.siscontram.dominio; import br.com.javamagazine.util.javaee6.persistencia.ObjetoPersistenteImpl; import java.util.Set; import javax.persistence.*; @Entity public class Funcionario extends ObjetoPersistenteImpl { private String nome; private String login; private String senha; @ElementCollection(fetch = FetchType.EAGER) private Set<Funcao> funcoes; } /* Getters e setters. */

Novidades da JPA 2.0


Em sua verso 1.0, que foi includa no Java EE 5, a JPA apresentava algumas limitaes. Por exemplo, no era possvel efetuar o mapeamento de uma coleo de tipos primitivos ou enumerados ou de entidades embutidas (classes persistentes que possuem a anotao @Embeddable e existem sempre atreladas a outras entidades). Caso quisesse mapear um atributo do tipo Set ou List, os elementos dentro destas colees deveriam ser entidades (i.e. classes com anotao @Entity). Isso nos impediria de implementar a classe Funcionario como modelada na Figura 3, pois a mesma possui um conjunto de elementos do tipo enumerado NivelPrioridade. Felizmente, porm, esta uma das novidades da JPA 2.0, que foi includa no Java EE 6. Veja na Listagem 2 o mapeamento do atributo funcoes. A anotao @ElementCollection nos permite mapear nossa coleo de objetos do tipo

A superclasse ObjetoPersistenteImpl
Entidades persistentes devem declarar um atributo como ID da classe para que tal atributo seja utilizado como chave primria no mapeamento do objeto para o banco de dados relacional. Ao invs de repetir uma mesma definio de um atributo id do tipo Long com a anotao @Id e seus respectivos getters e setters em todas as classes, fazemos isso em uma nica classe abstrata que servir de superclasse a todas as nossas entidades de domnio: ObjetoPersistenteImpl. Alm de nos auxiliar nesta questo, definimos tambm nesta superclasse um atributo para permitir travamento otimista (optimistic locking) version e um atributo para implementao eficiente dos mtodos equals() e hashCode() uuid. Este ltimo implementado numa classe mais acima na hierarquia: ObjetoDominioImpl. Uma discusso sobre os motivos para o uso de UUID na implementao destes dois mtodos encontra-se numa publicao antiga do blog de Jason Carreira (veja Links).

enumerado Funcao para o banco de dados relacional. A propriedade fetch determina se a recuperao dos valores, que sero armazenados em uma tabela diferente da tabela que armazenar os objetos Funcionario, devem ser recuperadas de forma ansiosa (eager, so

recuperados juntos com o objeto funcionrio) ou preguiosa (lazy, so recuperadas somente quanto utilizadas pela primeira vez). Como usaremos sempre este conjunto para determinar controle de acesso, determinamos a recuperao de forma ansiosa.

Edio 80 Java Magazine

27

Java EE 6 na Prtica Parte 1

Alm de @ElementCollection, podemos utilizar duas outras anotaes para configurao do mapeamento: @CollectionTable especifica em qual tabela os valores do conjunto devem ser armazenados e @Column indica o nome da coluna na tabela de Funcionario que far a ligao entre as duas tabelas. Se no forem utilizadas, o JPA utilizar valores default com base nos nomes das propriedades e classes. Caso a coleo mapeada no use tipos genricos como no exemplo, seria preciso utilizar tambm a propriedade targetClass na anotao @ElementCollection para indic-la para o mapeamento.

Listagem 3. Classe de domnio Ambulancia com anotaes de validao.


package br.com.javamagazine.siscontram.dominio; import br.com.javamagazine.util.javaee6.persistencia.ObjetoPersistenteImpl; import java.util.SortedSet; import javax.persistence.*; import javax.validation.constraints.*; @Entity public class Ambulancia extends ObjetoPersistenteImpl { @NotNull private int numero; @NotNull @Size(min = 8, max = 8) private String placa; @OneToMany(mappedBy = ambulancia) private SortedSet<AtribuicaoMotorista> motoristas; } /* Getters e setters. */

Validao com Bean Validation


Validao, ou seja, verificar se os dados fornecidos so vlidos, no s uma tarefa muito comum em sistemas de informao como tambm possui uma caracterstica interessante: ela transversal s vrias camadas do sistema. Na camada de apresentao (nas pginas Web, por exemplo) queremos validar os dados que o usurio insere em formulrios (campos obrigatrios, formato de datas e nmeros, etc.); na camada de negcio, queremos garantir que os mtodos que implementam nossos casos de uso recebam dados que esto de acordo com a especificao; na camada de persistncia queremos garantir que sero enviados ao banco de dados somente dados vlidos para evitarmos inconsistncias (e o lanamento de excees caso as regras de validao tenham sido usadas na definio das tabelas do banco).

Isso nos deixa com duas opes: repetir a validao em todas as camadas ou centraliz-la num lugar nico. Tal local centralizado teria que ser um componente que est presente em todas as camadas, ou seja, os prprios objetos de domnio. Porm, classes de domnio devem concentrar-se em representar bem a abstrao que fazemos dos elementos do mundo real associados ao nosso problema, e no preocupar-se com questes que dizem respeito, na verdade, aos demais pacotes do sistema. Existe, contudo, uma soluo elegante: metadados (anotaes). O que j havia sido proposto por frameworks como o Hibernate Validator agora faz parte do padro Java EE com a incluso na verso 6.0 de Bean Validation. A ideia descrever as regras de validao

utilizando anotaes Java nas classes de domnio e deixar a sua implementao para o framework, estendendo-o com validaes personalizadas quando necessrio. A Listagem 3 mostra mais uma classe de domnio do SisContrAm, j com anotaes de validao: Ambulancia. As anotaes de validao das demais classes voc pode conferir no cdigofonte disponvel no site da Java Magazine (inclusive das classes ChamadaEmergencia e Funcionario, que foram apresentadas anteriormente sem tais anotaes). Para determinar a regra de validao de um atributo de nossa classe de domnio utilizamos anotaes na definio do mesmo. No exemplo, a anotao @NotNull antes dos atributos numero e placa indicam que ambos devem ser especificados para o cadastro de uma ambulncia, enquanto a anotao @Size determina que a placa da ambulncia deve ter exatamente 8 caracteres, seguindo o padro brasileiro para placas de automveis (e.g. AAA 0000). Muitas outras anotaes de validao j esto prontas para o uso no pacote javax. validation.constraints como, por exemplo: @AssertFalse, @AssertTrue: o va lor do atributo deve ser falso ou verdadeiro, respectivamente; @DecimalMax, @DecimalMin, @Max, @Min: o atributo deve ser um nmero com valor mximo ou mnimo especificado (pode anotar tambm atributos String). @DecimalMax e @DecimalMin aceitam nme-

28 Java Magazine Edio 80

ros decimais (somente BigDecimal, pois double e float podem ter erros de arredondamento), enquanto @Max e @Min aceitam somente valores inteiros; @Digits: o atributo deve ser composto de dgitos (aceita String). possvel especificar o mximo de dgitos na parte inteira e na parte fracionria; @Future, @Past: o atributo deve ser uma data no futuro ou no passado, respectivamente; @Pattern: o atributo String deve encaixar-se no padro especificado por uma expresso regular. O leitor atento deve ter percebido que @Size(min = 8, max = 8) no a melhor anotao para garantir que a placa estar nos padres brasileiros, visto que o valor abcdefgh se encaixa perfeitamente nas regras estabelecidas na Listagem 3. Ao invs disso, melhor seria utilizar a anotao @Pattern(regexp = ^[A-Z]{3} [0-9] {4}$). No entanto, imagine que, por algum motivo 2 , placas de ambulncia devem ter os dgitos sempre em ordem crescente (ex.: 1234 ou 0479 servem, enquanto 9876, 0055 ou 3571 no servem). No seria possvel construir uma expresso regular para esta regra e, portanto, teramos que implement-la manualmente. Felizmente o Bean Validation extensvel e nos permite criar nossas prprias anotaes. Para isso precisamos criar o validador da Listagem 4 e a anotao da Listagem 5. Na Listagem 5 definimos a anotao @PlacaAmbulancia que colocaremos no atributo placa da classe Ambulancia. As regras de validao desta anotao so definidas pelas anotaes do Bean Validation que colocamos acima da declarao da interface: @NotNull e @Pattern iro garantir o bsico, ou seja, que o atributo no nulo e que a placa encontra-se no padro brasileiro, como j havamos elaborado anteriormente. A novidade est na anotao @Constraint, que define a classe Placa
2 Sabemos que um exemplo irreal, porm queramos manter o exemplo na classe Ambulancia por simplicidade. Um exemplo real em que validadores podem ser aplicados so nmeros de CPFs/CNPJs, RGs, contas/agncias bancrias ou qualquer outro nmero que utilize dgito verificador.

AmbulanciaValidator, da Listagem 4, como uma validao personalizada. Tal classe, que deve implementar a interface ConstraintValidator (especificando como parmetros genricos a respectiva anotao e a classe do atributo que pode ser anotado), define atravs do mtodo isValid() se um valor especificado uma placa de ambulncia vlida ou no. Assim, temos a lgica de validao separada da classe de domnio, que recebe apenas uma anotao indicando a regra de validao de cada atributo. Outra anotao do Bean Validation que vale a pena mencionar a @Valid. Esta anotao, que deve ser utilizada em atributos que representem uma associao de uma classe com outra, permite validar

grafos de objetos inteiros. Por exemplo, se em nosso sistema quisssemos armazenar os endereos dos funcionrios e crissemos uma classe Endereco com seus atributos rua, nmero, cidade, CEP, etc., cada um com sua regra de anotao , poderamos, na classe Funcionario, indicar que o objeto Endereco associado ao funcionrio deve ser no-nulo e vlido com o cdigo da Listagem 6. Se o atributo cidade fosse uma instncia da classe Cidade, que por sua vez possusse um atributo estado como instncia da classe Estado e assim por diante, anotando os atributos simples com as anotaes de validao existentes e as associaes com @Valid faria com que o framework percorresse todo o grafo de objetos, validando tudo.

Listagem 4. Classe validadora para placas de ambulncias.


package br.com.javamagazine.siscontram.dominio.validacao; import javax.validation.*; public class PlacaAmbulanciaValidator implements ConstraintValidator<PlacaAmbulancia, String> { public void initialize(PlacaAmbulancia constraintAnnotation) { } public boolean isValid(String value, ConstraintValidatorContext context) { if (value.length() != 8) return false; boolean crescente = true; int anterior = Character.digit(value.charAt(4), 10); for (int i = 5; crescente && i < 8; i++) { int atual = Character.digit(value.charAt(i), 10); crescente = atual > anterior; anterior = atual; } return crescente; } }

Listagem 5. Anotao de validao para placas de ambulncia.


package br.com.javamagazine.siscontram.dominio.validacao; import static java.lang.annotation.ElementType.*; import java.lang.annotation.*; import javax.validation.*; import javax.validation.constraints.*; @NotNull @Pattern(regexp = ^[A-Z]{3} [0-9]{4}$) @Constraint(validatedBy = PlacaAmbulanciaValidator.class) @Documented @Target({ANNOTATION_TYPE, METHOD, FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface PlacaAmbulancia { String message( ) default Placa de ambulncia invlida; String[ ] groups( ) default { }; Class<? extends Payload>[ ] payload( ) default { }; }

Edio 80 Java Magazine

29

Java EE 6 na Prtica Parte 1

Injeo de dependncias em contextos: implementando um cadastro


Focamos at o momento na camada de domnio, mas no poderamos terminar o artigo de abordagem prtica sem alguma funcionalidade implementada. Desenvolveremos, ento, um cadastro de ambulncias para experimentar as novidades da JPA e do Bean Validation que mostramos anteriormente e, ao mesmo tempo, mostrar a injeo de dependncias em contextos (Contexts and Dependency Injection for the Java EE Platform ou CDI), tambm novida), de do Java EE 6. Comearemos no pacote Persistncia, pois para desenvolver um cadastro de qualquer objeto preciso se comunicar com o banco de dados. Para isso utilizaremos o padro de projeto Data Access Object (Objeto de Acesso a Dados), ou DAO (Alur, Malks & Crupi, Core J2EE Patterns: Best Practices and Design Strategies, 2a edio, Prentice Hall, p. 462). As Listagens 7 e 8 mostram, respectivamente, a interface e a implementao do DAO para a classe Ambulancia (a diviso dos componentes em interface e implementao uma boa prtica que no discutiremos neste artigo por encontrar-se fora de escopo). O DAO de Ambulancia implementado como um EJB Stateless (sem armazenamento de estado) com interface local. Assim como no caso dos objetos de domnio, dado que a maioria das operaes de armazenamento do DAO (recuperar por id, salvar, excluir, etc.) pode ser generalizada em uma superclasse, o fizemos na classe DAOBaseJPA2 (e respectiva interface DAOBase), cujos cdigos esto disponveis. Apesar de seus cdigos trazerem uma novidade do Java EE 6 (a Criteria API ou API de Critrios), no vamos focar nela neste momento, falaremos sobre ela nos prximos artigos desta srie. preciso dizer, no entanto, que seu cdigo foi fortemente baseado no cdigo gerado pelo NetBeans ao abrir o menu File>New File... e escolher a opo Session Beans for Entity Classes da categoria Java EE (em outras palavras, o mesmo cdigo, porm com adio do tipo genrico e dos mtodos abstratos para funcionar como superclasse de todos os DAOs).

Listagem 6. Exemplo de uso da anotao @Valid na classe Funcionario.


/* Pacote e imports como na Listagem 2. */ import javax.validation.Valid; import javax.validation.constraints.NotNull; @Entity public class Funcionario extends ObjetoPersistenteImpl { @Valid @NotNull private Endereco endereco; /* Restante da classe como na Listagem 2. */ }

Listagem 7. Interface para o DAO para a classe Ambulancia.


package br.com.javamagazine.siscontram.persistencia; import br.com.javamagazine.siscontram.dominio.Ambulancia; import br.com.javamagazine.util.javaee6.persistencia.DAOBase; import javax.ejb.Local; @Local public interface AmbulanciaDAO extends DAOBase<Ambulancia> { }

Listagem 8. Implementao do DAO para a classe Ambulancia.


package br.com.javamagazine.siscontram.persistencia; import br.com.javamagazine.siscontram.dominio.Ambulancia; import br.com.javamagazine.util.javaee6.persistencia.DAOBaseJPA2; import javax.ejb.Stateless; import javax.persistence.*; @Stateless public class AmbulanciaDAOJPA2 extends DAOBaseJPA2<Ambulancia> implements AmbulanciaDAO { @PersistenceContext private EntityManager em; @Override protected EntityManager getEntityManager( ) { return em; } @Override protected Class<Ambulancia> getClasseDominio( ) { return Ambulancia.class; }

30 Java Magazine Edio 80

Foquemos, entretanto, na injeo de dependncias. Em primeiro lugar, sendo um EJB, a classe AmbulanciaDAOJPA2 tem acesso aos servios providos pelo container. Um destes servios a injeo do gerenciador de entidades (ou contexto de persistncia), que feita por meio da anotao @Persistence Context. No necessrio fazer mais nada, apenas confiar que, quando for instanciado um objeto desta classe, uma instncia de EntityManager ser automaticamente injetada no atributo em. Outra caracterstica de ser um EJB a possibilidade de ser injetado onde for necessrio por meio da anotao @EJB, que veremos mais adiante. Da Persistncia passaremos Aplicao para implementar nosso caso de uso de cadastro, que ser independente da interface grfica com o usurio. Imaginemos, ento, que em nossos requisitos temos o caso de uso Cadastrar Ambulncia como um tpico caso de uso CRUD (Create, Retrieve, Update and Delete, ou Criar, Recuperar, Atualizar e Excluir). Para simplificar, vamos i mplement a r somente os cen r ios criar e recuperar, alm da listagem de ambulncias. Criaremos, ento, a interface e a implementao mostradas nas Listagens 9 e 10. Na definio da classe vemos duas novas a notaes relat ivas ao CDI: @Stateful def i ne a c la s s e como u m EJB com armazenamento de estado, enqua nto a a notao @SessionScoped determina o escopo de sesso para este componente. Isso significa que para cada sesso de uso de nossa aplicao ou seja, para cada usurio diferente 3 haver uma instncia da c la s s e AplCadastrarAmbulanciaImpl, que ser criada ao seu primeiro uso e reutilizada sempre que for preciso. Como um EJB stateful, isso significa que cada usurio ter seu conjunto de valores (o estado do EJB) mantido automaticamente pelo container.

Alm do escopo de sesso, existem ainda 4 outros escopos: aplicao (@ ApplicationScoped), conversao (@ConversationScoped), requisio (@RequestScoped) e dependente (@Dependent). Este ltimo estabelece que o componente injetvel pertencer ao componente no qual ele ser injetado, ou seja, no compartilhado com outros componentes. medida que progredimos com o desenvolvimento do nosso exemplo nesta e nas prximas partes desta srie de artigos, discutiremos cada um dos tipos de escopo. De volta ao cdigo da Listagem 10, a anotao @EJB na definio do atributo

ambulanciaDAO indica ao container que ao ser criada uma instncia dessa classe de aplicao uma instncia do EJB AmbulanciaDAOJPA2 deve ser injetada automaticamente para satisfazer uma dependncia que a aplicao tem com a persistncia. Como o DAO um EJB Stateless, no necessrio armazenar dados de usurios diferentes e, portanto, todas as instncias de AplCadastrarAmbulanciaImpl podem referenciar a mesma instncia do DAO. Novamente, tudo isso gerenciado automaticamente pelo container Java EE. Para concluir nossa funcionalidade, nos faltam apenas a classe de controle

Listagem 9. Interface para o caso de uso Cadastrar Ambulncia.


package br.com.javamagazine.siscontram.aplicacao; import br.com.javamagazine.siscontram.dominio.Ambulancia; import java.util.List; import javax.ejb.Local; @Local public interface CadastrarAmbulancia { List<Ambulancia> getListagem(); void atualizarListagem(); void criar(Ambulancia ambulancia); Ambulancia recuperar(Long id); }

Listagem 10. Implementao do caso de uso Cadastrar Ambulncia.


package br.com.javamagazine.siscontram.aplicacao; import br.com.javamagazine.siscontram.dominio.Ambulancia; import br.com.javamagazine.siscontram.persistencia.AmbulanciaDAO; import java.io.Serializable; import java.util.List; import javax.ejb.*; import javax.enterprise.context.SessionScoped; @Stateful @SessionScoped public class AplCadastrarAmbulanciaImpl implements AplCadastrarAmbulancia, Serializable { private List<Ambulancia> listagem; @EJB private AmbulanciaDAO ambulanciaDAO; public List<Ambulancia> getListagem() { if (listagem == null) atualizarListagem(); return listagem; } public void atualizarListagem() { listagem = ambulanciaDAO.recuperarTodos(); } public void criar(Ambulancia ambulancia) { ambulanciaDAO.salvar(ambulancia); } public Ambulancia recuperar(Long id) { return ambulanciaDAO.recuperarPorId(id); }

3 Note que uma mesma pessoa acessando a aplicao com dois navegadores (browsers) diferentes considerada como 2 usurios e, portanto, ter duas sesses.

Edio 80 Java Magazine

31

Java EE 6 na Prtica Parte 1

e a pgina Web. No NetBeans, clique com o boto direito no projeto SisContrAm-war e selecione New>JSF Managed Bean.... Implemente o cdigo descrito na Listagem 11. Em seguida, clique com o boto direito novamente no projeto Web e selecione New>JSF Page.... Preencha no campo File Name o nome lista e no campo Folder indique o diretrio cadastrarAmbulancia. Repita a operao e crie tambm a pgina form. O cdigo da pgina lista encontram-se na Listagem 12, enquanto form descrito na Listagem 13. A classe de controle, CtrCadastrarAmbulancia, definida com a anotao @Model, que um dos esteretipos definidos pelo Java EE 6. Um esteretipo uma anotao que combina outras anotaes relacionadas ao CDI em uma s. Neste caso, @Model a combinao de @Named (atribui um nome a este componente para que possamos referenci-lo nas pginas JSF) e @RequestScoped (escopo da requisio: um novo objeto criado cada requisio e destrudo ao final da mesma). Este esteretipo til em arquiteturas baseadas no padro MVC (Model-View-Controller. Veja: Gamma, Helm, Johnson & Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley) e, nesta ar) quitetura, representa um elemento da camada de modelo. Analisando o cdigo da aplicao (Listagem 10) e do controle (Listagem 11), vemos que a implementao de CRUDs bastante simples e parece at burocrtico demais separar controle da aplicao: as classes so extremamente parecidas e a classe de controle parece um intermedirio dispensvel. H quem argumente, ainda, que basta um nico EJB que manipula diretamente o gerenciador de entidades e que este EJB pode ser acessado diretamente pela pgina JSF, solucionando o problema de forma bem mais simples. De fato, para algumas aplicaes (inclusive a que estamos desenvolvendo neste artigo) esta pode ser a melhor soluo. Porm, optamos pela separao para mostrarmos os diferentes componentes: stateless EJBs na persistncia, stateful EJBs na aplicao e POJOs no controle.

Listagem 11. Classe de controle (managed bean) para o caso de uso Cadastrar Ambulncia.
package br.com.javamagazine.siscontram.controle; import br.com.javamagazine.siscontram.aplicacao.AplCadastrarAmbulancia; import br.com.javamagazine.siscontram.dominio.Ambulancia; import java.util.List; import javax.ejb.EJB; import javax.enterprise.inject.Model; @Model public class CtrCadastrarAmbulancia { @EJB private AplCadastrarAmbulancia aplCadastrarAmbulancia; private Ambulancia ambulancia = new Ambulancia(); public Ambulancia getAmbulancia() { return ambulancia; } public List<Ambulancia> getListagem() { return aplCadastrarAmbulancia.getListagem(); } public void atualizarListagem() { aplCadastrarAmbulancia.atualizarListagem(); } public String salvar() { aplCadastrarAmbulancia.criar(ambulancia); return /cadastrarAmbulancia/lista.xhtml; } }

Listagem 12. Pgina de listagem de ambulncias.


<?xml version=1.0 encoding=UTF-8 ?> <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd> <html xmlns=http://www.w3.org/1999/xhtml xmlns:h=http://java.sun.com/jsf/html xmlns:f=http://java.sun.com/jsf/core> <h:head> <title>Cadastro de Ambulncias</title> </h:head> <h:body> <h1>Cadastro de Ambulncias</h1> <f:view> <h:form> <h:dataTable value=#{ctrCadastrarAmbulancia.listagem} var=item> <h:column> <f:facet name=header>Nmero</f:facet> <h:outputText value=#{item.numero} /> </h:column> <h:column> <f:facet name=header>Placa</f:facet> <h:outputText value=#{item.placa} /> </h:column> </h:dataTable> <h:commandButton action=#{ctrCadastrarAmbulancia.atualizarListagem} value=Atualizar /> <h:commandButton action=/cadastrarAmbulancia/form.xhtml value=Nova Ambulncia /> </h:form> </f:view> </h:body> </html>

32 Java Magazine Edio 80

Outra caracterstica da implementao de CRUDs que, assim como nossos objetos persistentes e DAOs, sua lgica bastante generalizvel. Poderamos ter criado um pequeno framework interno ao nosso sistema com superclasses CRUD para os pacotes de aplicao e controle. No entanto, preferimos desenvolver o cadastro de ambulncias separadamente para no complicar seu entendimento por parte do leitor. Voltando ao exemplo, com os mtodos disponveis na classe de controle possvel montar pginas de listagem e formulrio. A Listagem 12 mostra que para montar uma tabela com as ambulncias existentes no banco de dados basta utilizar a tag <h:dataTable /> referenciando #{ctrCadastrarAmbulancia.listagem}. Os mtodos da classe de controle podem ser chamados via <h:commandButton /> referenciando #{ctrCadastrarAmbulancia.atualizarListagem} e #{ctrCadastrarAmbulancia.salvar}, respectivamente (este ltimo na Listagem 13). Tudo isso sem precisar registrar a classe de controle como um managed bean no facesconfig.xml, como se fazia anteriormente. Alis, o leitor atento deve ter reparado que neste artigo no h sequer uma listagem sobre um arquivo XML de configurao: o pouco de configurao existente foi gerado automaticamente pela IDE e o restante foi feito mediante anotaes. Para concluir, adicione um link para o cadastro de ambulncias na pgina inicial, index.jsp, como mostra a Listagem 14. Finalmente, estamos prontos para cadastrar ambulncias em nosso sistema. A Figura 5 mostra as duas telas do sistema que desenvolvemos. Experimente inserir dados invlidos no formulrio de cadastro e veja que os validadores que configuramos (e aquele que criamos) anteriormente entraro em ao, como mostra a Figura 6 (9182 no est em ordem crescente). Indo ainda alm, experimente inserir diretamente no banco de dados uma ambulncia com placa em formato invlido: os validadores so to transversais que se voc experimentar abrir a pgina de listagem ver uma exceo lanada pelo container relacionada a um valor invlido para uma entidade do sistema.

Listagem 13. Pgina com o formulrio de cadastro de ambulncia.


<?xml version=1.0 encoding=UTF-8 ?> <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd> <html xmlns=http://www.w3.org/1999/xhtml xmlns:h=http://java.sun.com/jsf/html> <h:head> <title>Cadastro de Ambulncias</title> </h:head> <h:body> <h1>Cadastro de Ambulncias</h1> <h:form> <p>Nmero: <h:inputText value=#{ctrCadastrarAmbulancia.ambulancia.numero} /></p> <p>Placa: <h:inputText value=#{ctrCadastrarAmbulancia.ambulancia.placa} /></p> <p><h:commandButton action=#{ctrCadastrarAmbulancia.salvar} value=OK /> <h:commandButton action=/cadastrarAmbulancia/lista.xhtml value=Cancelar /></p> </h:form> </h:body> </html>

Listagem 14. Pgina inicial index.jsp com link para o cadastro de ambulncias.
<%@page contentType=text/html pageEncoding=UTF-8%> <%@taglib prefix=f uri=http://java.sun.com/jsf/core%> <%@taglib prefix=h uri=http://java.sun.com/jsf/html%> <!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd> <f:view> <html> <head> <meta http-equiv=Content-Type content=text/html; charset=UTF-8/> <title>SisContrAm</title> </head> <body> <h1>SisContrAm</h1> <p><a href=faces/cadastrarAmbulancia/lista.xhtml>Cadastro de Ambulncias</a></p> </body> </html> </f:view>

Edio 80 Java Magazine

33

Java EE 6 na Prtica Parte 1

que os fornecedores lanarem novas verses de seus servidores de aplicao, Java EE 6 passar de promissora para uma excelente opo para o desenvolvimento de sistemas de mdio e grande porte nas organizaes.

Figura 5. Listagem de ambulncias e cadastro de nova ambulncia.

Concluso
Na primeira parte de uma srie de artigos que traz uma abordagem prtica de Java EE 6, mostramos as tecnologias relacionadas ao novo padro, como instalar ferramentas para comear a desenvolver aplicaes corporativas em Java EE 6 e iniciamos o desenvolvimento de uma aplicao corporativa real, mostrando algumas das novidades desta nova verso da plataforma enterprise de Java, como JPA 2.0, validao (Bean Validation) e injeo de dependncias em contexto (CDI). Nos prximos artigos continuaremos a desenvolver a aplicao de exemplo e mostraremos mais novidades de Java EE 6 na prtica. Experimente implementar os cdigos que apresentamos e desenvolver outras funcionalidades do sistema utilizando os conceitos aprendidos neste artigo. Esperamos com esta srie de artigos mostrar que a plataforma Java EE 6 bastante promissora para o desenvolvimento de aplicaes de porte corporativo, facilitando o desenvolvimento em uma plataforma que j apresenta diversas caractersticas necessrias para este tipo de aplicao, como robustez e escalabilidade. Existem ainda poucos servidores de aplicao homologados no novo padro, mas assim

Vtor E. Silva Souza vitorsouza@gmail.com, disi.unitn.it/~vitorsouza mestre em Informtica com nfase em Engenharia de Software pela UFES, com experincia em docncia na rea de Linguagens de Programao. Desenvolvedor Java desde 1999, especializou-se no desenvolvimento de aplicaes Web, com as quais trabalha h 9 anos. um dos fundadores do Grupo de Usurios Java do Estado do Esprito Santo (ESJUG). Atualmente cursa doutorado na Universidade de Trento, Itlia na rea de Engenharia de Requisitos e Sistemas Auto-adaptativos.

jcp.org Java Community Process. java.sun.com/developer/technicalArticles/ JavaEE/JavaEE6Overview.html Introduo plataforma Java EE 6 (publicado na Sun Developer Network, em ingls). java.sun.com/javase/downloads Downloads do Kit de Desenvolvimento Java (JDK). glassfish.dev.java.net GlassFish, a implementao de referncia para Java EE 6. netbeans.org NetBeans IDE. mysql.com/downloads/connector/j/5.1.html Download do driver do MySQL para Java. jroller.com/jcarreira/date/20040504 #hibernate_null_unsaved_value_and Blog de Jason Carreira, sobre o uso de UUIDs para implementao de equals( ) e hashCode( ).
D seu feedback sobre esta edio! A Java Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o que voc, leitor, acha da revista!
D s

Figura 6. Mensagem de erro produzida pelo Bean Validation e exibida pelo JSF

Feedback eu
sobre e s

D seu voto sobre este artigo, atravs do link:

www.devmedia.com.br/javamagazine/feedback

34 Java Magazine Edio 80

edio ta

Edio 80 Java Magazine

35

Seo Java: NeSta Seo voc eNcoNtra artigoS iNtermedirioS e avaNadoS Sobre Java

Picasa Web Albums Data


Brincando com o servio de fotos do Google

o cenrio atual do desenvolvimento de software, a integrao com outros sistemas e servios se torna cada vez mais comum. Nessa direo, o Google prov aos desenvolvedores uma srie de APIs, dentre as quais esto as APIs de Dados, que permitem a aplicaes de terceiros se integrar aos vrios servios Google disponveis. Na primeira parte, publicada na Edio anterior, conhecemos o servio PWA e a sua respectiva API de dados, a Picasa Web Albums Data API. Vimos como utilizar a Java Client Library para efetuar operaes bsicas como listar, criar, editar e excluir os lbuns, fotos, tags e comentrios do usurio. Neste artigo aplicaremos os conceitos explorados na construo de uma aplicao real. O projeto que desenvolveremos ao longo do artigo ser uma aplicao web, que atuar como um cliente do PWA, utilizando duas outras tecnologias Google: o Google Web Toolkit e o Google App Engine.

Resumo DevMan
De que se trata o artigo:
Neste artigo veremos, passo a passo, como criar uma aplicao Java integrada com o servio de fotos do Google, o Picasa Web Albums (PWA). Nossa aplicao ser capaz de listar os lbuns e fotos do usurio, e tambm permitir a postagem de comentrios nas fotos. Tudo isso de forma prtica, utilizando a biblioteca cliente Java, o Google Web Toolkit e o Google App Engine.

Para que serve:


Assim como as demais APIs de dados Google, a Picasa Web Albums Data API permite que nossas aplicaes possam se integrar com algum servio Google: neste caso, o PWA. Com ela, podemos construir, por exemplo, um cliente desktop para ver os lbuns e fotos do usurio, uma aplicao que grave e faa upload de vdeos direto do celular, dentre outras possibilidades.

Em que situao o tema til:


O tema til no contexto da criao e utilizao de servios, que visa promover o reuso e evitar o retrabalho. A ideia bsica poder construir software aproveitando ao mximo os diversos servios existentes. Com isso, cada vez mais possvel concentrar esforos nas regras de negcio do software, reduzir o tempo de desenvolvimento e ter a garantia de um servio testado e confivel.

Picasa Web Albums Data API Parte 2:


A Picasa Web Albums Data API permite que nossas aplicaes possam interagir com o Picasa Web Albums, possibilitando a execuo de operaes bsicas como listar, criar, editar e excluir os lbuns, fotos, vdeos, tags e comentrios do usurio. Para utilizar essa API, a biblioteca do Google disponibiliza uma srie de classes que representam os servios, como a classe PicasawebService e tipos de dados utilizados pelo PWA, tornando o desenvolvimento bastante simples. O artigo tambm mostra como criar e publicar uma aplicao web com GWT e GAE, utilizando o Google Plugin para Eclipse, que facilita o processo de desenvolvimento e o deploy nos servidores Google.

Projeto: Picasa Web Albums GWT Client


Agora que j sabemos como efetuar as operaes bsicas oferecidas pela API para trabalhar com lbuns, fotos, vdeos, tags e comentrios, vamos construir o nosso projeto final. Como falamos no incio do artigo, o projeto trata-se de um cliente web para o Picasa Web Albums. A aplicao permitir ao usurio: Listar seus lbuns ou os de outros usurios (neste segundo caso apenas os lbuns pblicos sero listados); Ver as fotos de cada lbum. Para isso sero oferecidas duas formas de apresentao: galeria ou slide-show; Ler e adicionar comentrios nas fotos. Nossa aplicao ser construda utilizando outras duas tecnologias oferecidas

pelo Google, o Google Web Toolkit (GWT) e Google App Engine (GAE). Como no o foco deste artigo, no entraremos nos detalhes destas tecnologias, entretanto veremos o necessrio para o entendimento do exemplo. A Figura 1 mostra um screenshot da aplicao, que tambm pode ser vista em produo no endereo http:// jm-picasa.appspot.com. O quadro Google Web Toolkit traz um pequeno resumo sobre o GWT. Alm disso, as Edies 38 e 39 da Java Magazine trazem os artigos AJAX com Google Web Toolkit e AJAX avanado com GWT.

Para saber mais detalhes sobre o GAE, veja a Edio 71 da Java Magazine, que traz o artigo Java no Google App Engine.

Configurando o Eclipse
Para facilitar o uso do GWT e do GAE, utilizaremos o plugin do Google para Eclipse (veja a seo Links), pois dessa forma no teremos que nos preocupar com a criao da estrutura do projeto nem com arquivos de configurao. Baixe os SDKs do GWT e GAE1, e o Google Plugin. Com
1 Durante a escrita deste artigo foram utilizadas a seguintes verses: GWT 2.0.0 e GAE 1.3.0.

36 Java Magazine Edio 80

API Parte 2
o eclipse devidamente configurado, crie um novo projeto do tipo Web Application Project, conforme mostra a Figura 2, com as opes Use Google Web Toolkit e Use Google App Engine marcadas, de acordo com a Figura 3. Lembre tambm de definir um pacote raiz para a aplicao, como br.com. jm.picasa por exemplo. Note que o plugin j cria a estrutura bsica de um projeto, contendo inclusive arquivos de um exemplo GWT funcional, como podemos observar na Figura 4. A Tabela 1 traz uma breve explicao da estrutura do projeto. Para ver o projeto em ao, basta clicar com o boto direito no mesmo e escolher a opo Run as>Web Application. Com isso o servidor do GAE ser carregado e a URL da aplicao exibida na aba Development Mode, de acordo com a Figura 5. Para testar a aplicao basta copiar essa URL e colar no browser2. Com o esqueleto do nosso projeto criado e testado, vamos agora modific-lo para atender aos requisitos da nossa aplicao exemplo. Primeiro, exclua os arquivos GreetingService.java, GreetingServiceAsync.java e GreetingServerImpl.java, pois estes no sero necessrios e modifique o arquivo JavaMagazinePicasa.java para ficar igual Listagem 1. Como iremos utilizar a Java Client Library, ser necessrio adicionar os jars da API do Picasa Web Albums (vistos na seo Preparando o ambiente) tanto no build path do projeto, quanto na pasta war/WEB-INF/lib. Alm disso, ser necessrio alterar o arquivo appengine-web.xml, localizado na pasta war/

Aprenda a construir uma aplicao web capaz de manipular os lbuns e fotos do Picasa Web Albums, utilizando o GWT como framework de desenvolvimento e a infraestrutura do Google App Engine para publicao

Paulo cSar coutiNho

Figura 1. Screenshot da aplicao exemplo


Listagem 1. Esqueleto inicial da classe JavaMagazinePicasa.
package br.com.jm.picasa.client; import com.google.gwt.core.client.EntryPoint; public class JavaMagazinePicasa implements EntryPoint { public void onModuleLoad() { } }

Listagem 2. Arquivo appengine-web.xml com os ajustes necessrios para trabalhar com as APIs de dados google.
<?xml version=1.0 encoding=utf-8?> <appengine-web-app xmlns=http://appengine.google.com/ns/1.0> <application></application> <version>1</version> <system-properties> <property name=java.util.logging.config.file value=WEB-INF/logging.properties /> <property name=com.google.gdata.DisableCookieHandler value=true /> </system-properties> <sessions-enabled>true</sessions-enabled> </appengine-web-app>

2 necessrio que o browser tenha suporte ao plugin do GWT. Caso este ainda no esteja instalado, automaticamente ser solicitada a confirmao de instalao. No momento da escrita deste artigo os browsers compatveis com o plugin do GWT so Internet Explorer, Chrome e Firefox, para Windows. J para Mac OS X, o plugin suportado pelo Safari e Firefox.

WEB-INF. Primeiro precisamos habilitar o uso de sesses HTTP, adicionando a tag <sessions-enabled> com o valor true. Em seguida preciso acrescentar a propriedade de sistema com.google.gdata.DisableCookieHandler com o valor true, para evitar erros de permisso durante a execuo. A Listagem 2 mostra o arquivo resultante. Feito isso, nosso ambiente est pronto para comearmos o desenvolvimento da aplicao exemplo.

Edio 80 Java Magazine

37

Picasa Web Albums Data API Parte 2

As classes do subpacote client precisam respeitar certas restries, visto que esse cdigo ser traduzido para Javascript e que o GWT oferece apenas um pequeno subconjunto das bibliotecas oferecidas pela runtime do Java. Caso alguma classe que no suportada seja utilizada, o compilador do GWT ir apresentar um erro. A lista das classes e mtodos da JRE que so suportados pelo GWT pode ser vista em http://code.google.com/ webtoolkit/doc/latest/RefJreEmulation.html. As classes do subpacote server no so traduzidas para Javascript e por isso no sofrem nenhuma restrio por parte do GWT.

Google Web Toolkit


O Google Web Toolkit (GWT), como o prprio nome sugere, consiste num kit de ferramentas para o desenvolvimento de aplicaes web. Kit esse que contm um SDK prprio, com compilador capaz de converter cdigo Java em Javascript e um servidor de aplicaes, alm de ferramentas para anlise de desempenho e um plugin para Eclipse. A ideia central do GWT prover uma forma de criar aplicaes web ricas, com AJAX, utilizando apenas Java. Dessa forma o desenvolvedor no precisa se preocupar com compatibilidade entre browsers, alm de tornar o desenvolvimento mais produtivo, visto que escrever e depurar cdigo Java com todas as facilidades do Eclipse (ou mesmo outras IDEs) bem mais prtico do que quando se trata de Javascript. Para tornar essa tarefa possvel, o GWT traz consigo um conjunto de bibliotecas e widgets (Ex.: botes, caixas de texto, etc.) que permitem ao desenvolvedor escrever toda lgica da sua aplicao, incluindo os componentes visuais HTML em cdigo Java puro. O compilador o Na aplicao exemplo deste artigo temos um exemplo prtico de uso do GWT RPC. responsvel por traduzir o cdigo Java em Javascript otimizado e compatvel com a maioria dos browsers do mercado. Alm disso, perfeitamente possvel criar aplicaes GWT que possuam um back-end que rode no servidor e no no cliente. Para isso so oferecidas as seguintes estratgias: GWT RPC Opo indicada para comunicao com back-end em Java. Consiste na criao de interfaces dos servios que sero oferecidos pelo servidor para que essas possam ser utilizadas de forma assncrona pelo cdigo front-end; SON / XML Consiste na troca de dados com J o servidor nos formatos JSON ou XML. Para isso o GWT oferece classes para manipulao dos dados nestes formatos; ross-Site Utilizado por aplicaes que C necessitam obter dados de servidores remotos de diferentes domnios.

As entidades
As Listagens 3, 4 e 5, mostram o cdigo das entidades que utilizaremos no nosso projeto. A classe Album, como o prprio nome sugere, representa um lbum do usurio. As classes Photo e PhotoComment, por sua vez, representam uma foto e um comentrio, respectivamente. Note que todas as classes devem estar sob o subpacote client e devem ser Serializable. Isso um requisito do GWT, visto que esses objetos sero traduzidos em objetos Javascript no processo de compilao.

Definindo a interface do servio


O GWT oferece diversas formas de implementar a integrao entre o front-end e o back-end de uma aplicao (Para mais informaes, consulte o quadro Google Web Toolkit). Para o nosso exemplo, utilizaremos a abordagem GWT RPC. Dessa forma, o cdigo cliente ir simplesmente fazer chamadas assncronas a mtodos no servidor, acessveis atravs da interface de servio que definiremos a seguir. Para isso, vamos criar uma interface Java, no subpacote client, com os mtodos do servidor que desejamos deixar visveis para o cdigo cliente. A Listagem 6 mostra a definio do nosso servio PicasaService. O mtodo login() ser responsvel por autenticar o usurio, para que as demais operaes possam ser executadas. O mtodo listAlbums() responsvel por recuperar a lista de lbuns do usurio, cujo login deve ser passado como parmetro. Esse mtodo retorna um array de objetos do tipo Album, contendo as informaes Figura 2. Criao de um projeto do tipo Web Application Project

Figura 3. Configuraes do projeto exemplo

38 Java Magazine Edio 80

Figura 5. Aba Development Mode com a URL de testes da aplicao Pasta / Pacote / Arquivo
JavaMagazinePicasa.gwt.xml

Explicao
Arquivo de definio de mdulos do GWT. Especifica a lista de classes e recursos utilizados pelo mdulo, que representa simplesmente um conjunto de funcionalidades ou a prpria aplicao. Pacote que deve conter o cdigo cliente da aplicao, ou seja, as classes que sero traduzidas, pelo GWT, para o cdigo Javascript. Pacote que deve conter o cdigo servidor da nossa aplicao. As classes desse pacote no passam pelo processo de traduo para Javascript. Classe principal da nossa aplicao GWT. Contm o ponto de entrada da aplicao, semelhante ao mtodo main(). Pasta que contm os arquivos estticos que sero acessveis publicamente, como imagens, arquivos css, etc. Pasta com os arquivos de configurao de uma aplicao web Java.

br.com.jm.picasa.client br.com.jm.picasa.server
JavaMagazinePicasa.java war war/WEB-INF

Figura 4. Estrutura inicial do projeto exemplo bsicas de cada lbum. Entretanto, nem a lista de fotos nem a URL do modo slide-show so preenchidas na chamada desse mtodo, pois como estas requerem chamadas extras ao servio para serem recuperadas, deixaremos para recuperlas apenas quando solicitado. J o mtodo getAlbumContents() o responsvel por recuperar o contedo associado a um dado lbum. Esse mtodo recebe um objeto Album de parmetro e retorna um novo objeto Album, este com as mesmas informaes do objeto recebido, acrescido da lista de fotos do lbum e da URL do slide-show. O mtodo getComments() recupera a lista de comentrios de uma determinada foto. Para isso este mtodo recebe um objeto Photo como parmetro e retorna um objeto PhotoComment. Por fim, o mtodo addComment() adiciona um novo comentrio a uma foto. Como parmetro, ele recebe um objeto PhotoComment, que deve estar com os atributos text e photo devidamente preenchidos.

Tabela 1. Pastas e arquivos criados pelo Google Plugin

Listagem 3. Classe Album Representa um lbum do usurio.


// Declarao de pacote e imports omitidos. public class Album implements Serializable { private String id; // ID do lbum private String title; // Ttulo do lbum private String description; // Descrio do lbum private String thumbnailUrl; // URL da capa do lbum private int photoCount; // Quantidade de fotos no lbum private String owner; // Login do usurio proprietrio do lbum private Photo[] photos; // Lista de fotos do lbum private String slideShowUrl; // URL do slide-show // Gets e Sets ... }

Listagem 4. Classe Photo Representa uma foto do usurio.


// Declarao de pacote e imports omitidos. public class Photo implements Serializable { private String id; // ID da foto private String caption; // Caption (texto) da foto private String thumbnailUrl; // URL da miniatura private String contentUrl; // URL da imagem no tamanho real private int width; // Largura da foto private int height; // Altura da foto private int commentsCount; // Quantidade de comentrios private Album album; // lbum ao qual a foto pertence // Gets e Sets ... }

Listagem 5. Classe PhotoComment Representa um comentrio numa foto.


// Declarao de pacote e imports omitidos. public class PhotoComment implements Serializable { private String author; // Autor do comentrio private Date date; // Data do comentrio private String text; // Texto do comentrio private Photo photo; // Foto a qual o comentrio pertence // Gets e Sets ... }

Criando a interface assncrona


Para utilizar o esquema de RPC do GWT, necessrio definir uma verso assncrona da nossa interface de servio. Para isso devemos criar uma segunda interface com os mesmos mtodos da original, porm, com pequenas alteraes para atender o

modelo de chamadas assncronas do GWT. As alteraes que devem ser feitas em cada mtodo so:

Modificar o tipo de retorno para void; Acrescentar um ltimo parmetro do tipo AsyncCallback<T>, onde T deve ser o tipo

Edio 80 Java Magazine

39

Picasa Web Albums Data API Parte 2

de retorno do mtodo original (para void, o tipo Void deve ser utilizado). Dessa forma, se na interface original temos:
PhotoComment[ ] getComments(Photo photo);

Listagem 6. Interface PicasaService Representa a interface remota do servio que estamos disponibilizando ao cdigo cliente.
// Declarao de pacote e imports omitidos. @RemoteServiceRelativePath(picasa) public interface PicasaService extends RemoteService { void login(String username, String password); Album[ ] listAlbums(String user); Album getAlbumContents(Album album); PhotoComment[ ] getComments(Photo photo); void addComment(PhotoComment comment); }

Na verso assncrona teremos:


void getComments(Photo photo, AsyncCallback<PhotoComment[ ]> callback);

Fcil no? E para ficar ainda mais fcil, podemos deixar que o plugin crie a verso assncrona da nossa interface de forma automtica. Note que nossa interface de servio estende de RemoteService. Com isso, o plugin ir apresentar um erro, caso a verso assncrona no exista ou esteja incompatvel (o que geralmente acontece quando alteramos a interface original). Ento, basta clicar no cone de erro que mostrado no editor e escolher a opo Create asynchronous RemoteService interface PicasaServiceAsync in pakage br.com. jm.picasa.client, como pode ser visto na Figura 6. Com isso a verso assncrona da interface criada de forma automtica. A Listagem 7 mostra o resultado.

Listagem 7. Interface PicasaServiceAsync Verso assncrona da interface do servio PicasaService.


// Declarao de pacote e imports omitidos. public interface PicasaServiceAsync { void login(String username, String password, AsyncCallback<Void> callback); void listAlbums(String user, AsyncCallback<Album[]> callback); void getAlbumContents(Album album, AsyncCallback<Album> callback); void getComments(Photo photo, AsyncCallback<PhotoComment[]> callback); void addComment(PhotoComment comment, AsyncCallback<Void> callback); }

Implementando o servio
Agora que j definimos as interfaces sncrona e assncrona do nosso servio, vamos prover a este uma implementao concreta. Essa implementao deve fazer parte do cdigo servidor da nossa aplicao e por isso deve fica sob o subpacote server. nessa classe que implementaremos toda a comunicao com o servio do Picasa Web Albums. A Listagem 8 mostra a classe PicasaServiceImpl, que a implementao do servio que definimos. Sendo assim, esta implementa os mtodo definidos em PicasaService. Note tambm que nossa implementao deve estender de RemoteServiceServlet, que uma especializao do HttpServlet fornecida pelo GWT que serve de base para a criao de servios remotos. As constantes BASE_URL e APPLICATION_NAME correspondem URL base que utilizaremos para construir as URLs especficas nas chamadas ao servio do Picasa Web Albums e o nome da nossa aplicao, seguindo o

Figura 6. Assistente para criao da interface assncrona para o servio padro NomeDaEmpresa-NomeDaAplicacaoversao, sugerido pelo Google. No mtodo login(), iniciamos criando um objeto PicasawebService, que faz parte da biblioteca cliente das APIs de dados, informando o nome da aplicao. Invocamos ento o mtodo service.setUserCredentials() para autenticar o usurio no servio. Para evitar que a cada nova requisio seja necessrio autenticar o usurio novamente, guardaremos o token de autenticao na sesso do usurio. Dessa forma, nas requisies subsequentes basta utilizar o valor desse token nas chamadas ao servio. Para fazer isso, recuperamos o valor do token atravs do mtodo UserToken. getValue() e salvamos esse valor na sesso do usurio que efetuou o login. O mtodo getSessionService() simplesmente cria um novo servio e o configura com o valor do token salvo na sesso. Assim, podemos utilizar esse objeto para fazer requisies ao servio do Picasa Web Albums sem nenhum problema. Os mtodos entryToAlbum(), entryToPhoto(), entryToComment() e commentToEntry(), so apenas mtodos de converso. Simplesmente fazem o mapeamento dos tipos definidos pela biblioteca cliente Java para os beans que definimos e vice-versa. No mtodo listAlbums(), montamos a URL do feed de lbuns do usurio e chamamos o mtodo PicasawebService.getFeed(), como vimos na seo Listando os lbuns do usurio.

40 Java Magazine Edio 80

Listagem 8. Classe PicasaServiceImpl Implementao da interface PicasaService.


// Declarao de pacote e imports omitidos. public class PicasaServiceImpl extends RemoteServiceServlet implements PicasaService { private static final String BASE_URL = http://picasaweb.google.com/data/feed/api/user/; private static final String APPLICATION_NAME = JavaMagazine-PicasaClient-1; public void login(String username, String password) { try { PicasawebService service = new PicasawebService(APPLICATION_NAME); service.setUserCredentials(username, password); String token = ((UserToken) service.getAuthTokenFactory().getAuthToken()).getValue(); getThreadLocalRequest().getSession().setAttribute(token, token); } catch (AuthenticationException e) { e.printStackTrace(); } } private PicasawebService getSessionService() { PicasawebService service = new PicasawebService(APPLICATION_NAME); service.setUserToken((String) getThreadLocalRequest().getSession(). getAttribute(token)); return service; } private Album entryToAlbum(AlbumEntry entry) { Album album = new Album(); album.setId(entry.getGphotoId()); album.setTitle(entry.getTitle().getPlainText()); album.setDescription(entry.getDescription().getPlainText()); album.setPhotoCount(entry.getPhotosUsed()); album.setThumbnailUrl(entry.getMediaThumbnails().get(0).getUrl()); } return album; for (int i = 0; i < entries.size(); i++) { Album album = entryToAlbum(entries.get(i)); album.setOwner(user); result[i] = album; }

} } catch (Exception e) { e.printStackTrace(); } } return result;

@Override public Album getAlbumContents(Album album) { try { URL albumFeedUrl = new URL(BASE_URL + album.getOwner() + /albumid/ + album.getId()); AlbumFeed albumFeed = getSessionService().getFeed(albumFeedUrl, AlbumFeed.class); album.setSlideShowUrl(albumFeed.getLink(Namespaces.SLIDESHOW_REL, null). getHref()); List<PhotoEntry> photoEntries = albumFeed.getPhotoEntries(); Photo[] photos = new Photo[photoEntries.size()]; for (int i = 0; i < photoEntries.size(); i++) { Photo photo = entryToPhoto(photoEntries.get(i)); photo.setAlbum(album); photos[i] = photo; } album.setPhotos(photos); } catch (Exception e) { e.printStackTrace(); } } return album;

private Photo entryToPhoto(PhotoEntry entry) { Photo photo = new Photo(); photo.setId(entry.getGphotoId()); photo.setCaption(entry.getSummary().getPlainText()); photo.setThumbnailUrl(entry.getMediaThumbnails().get(0).getUrl()); MediaContent content = entry.getMediaContents().get(0); photo.setContentUrl(content.getUrl()); photo.setWidth(content.getWidth()); photo.setHeight(content.getHeight()); photo.setCommentsCount(entry.getCommentCountExt().getValue()); } return photo;

@Override public void addComment(PhotoComment comment) { try { URL commentsFeedUrl = new URL(BASE_URL + comment.getPhoto().getAlbum(). getOwner() + /albumid/ + comment.getPhoto().getAlbum().getId() + /photoid/ + comment.getPhoto(). getId()); CommentEntry entry = commentToEntry(comment); getSessionService().insert(commentsFeedUrl, entry); } catch (Exception e) { e.printStackTrace(); }

private PhotoComment entryToComment(CommentEntry entry) { PhotoComment comment = new PhotoComment(); comment.setAuthor(entry.getAuthors().get(0).getName()); comment.setDate(new Date(entry.getPublished().getValue())); comment.setText(entry.getPlainTextContent()); } return comment;

@Override public PhotoComment[] getComments(Photo photo) { PhotoComment[] comments = null; try { URL commentsFeedUrl = new URL(BASE_URL + photo.getAlbum().getOwner() + / albumid/ + photo.getAlbum().getId() + /photoid/ + photo.getId() + ?kind=comment); PhotoFeed photoFeed = getSessionService().getFeed(commentsFeedUrl, PhotoFeed.class); List<CommentEntry> commentEntries = photoFeed.getCommentEntries(); comments = new PhotoComment[commentEntries.size()]; for (int i = 0; i < commentEntries.size(); i++) { PhotoComment comment = entryToComment(commentEntries.get(i)); comment.setPhoto(photo); comments[i] = comment; } } catch (Exception e) { e.printStackTrace(); } } return comments;

private CommentEntry commentToEntry(PhotoComment comment) { CommentEntry entry = new CommentEntry(); entry.setContent(new PlainTextConstruct(comment.getText())); return entry; } public Album[] listAlbums(String user) { Album[] result = null; try { URL userFeedUrl = new URL(BASE_URL + user + ?kind=album); UserFeed feed = getSessionService().getFeed(userFeedUrl, UserFeed.class); if (feed.getTotalResults() > 0) { result = new Album[feed.getTotalResults()]; List<AlbumEntry> entries = feed.getAlbumEntries(); }

Edio 80 Java Magazine

41

Picasa Web Albums Data API Parte 2

Em seguida criamos um array de objetos Album e para cada AlbumEntry no feed recuperado, criamos um novo objeto Album, configuramos seu owner e o adicionamos ao array. Por fim, retornamos o array com os lbuns recuperados. No mtodo getAlbumContents(), primeiramente recuperamos o feed de fotos do usurio utilizando o mtodo PicasawebService.getFeed(). Para recuperar a URL do slide-show com as fotos, utilizamos o mtodo AlbumFeed.getLink() passando o rel (relationship) Namespaces.SLIDESHOW. Em seguida, para cada PhotoEntry presente no feed, criamos um objeto Photo e adicionamos ao nosso array de fotos. Por fim, chamamos o mtodo setPhotos() no objeto Album que recebemos como parmetro e retornamos esse mesmo objeto3. No mtodo addComment(), simplesmente montamos a URL de destino seguindo o formato que vimos na seo Adicionando comentrios. Em seguida construmos um CommentEntry a partir do nosso parmetro e invocamos o mtodo PicasawebService.insert() para criar o novo comentrio. Por fim, no mtodo getComments(), recuperamos o feed de comentrios da foto recebida como parmetro. Em seguida criamos um array de objetos PhotoComment e o populamos com os comentrios extrados do feed. Para isso, iteramos sobre a coleo de objetos CommentEntry e convertemos cada entrada em um objeto PhotoComment. Finalmente, retornamos o array com os comentrios. Para concluir a implementao do nosso servio, necessrio configurar nosso servlet no arquivo web.xml, assim como fazemos numa aplicao web Java tradicional. A Listagem 9 mostra o resultado do nosso arquivo web.xml.

Listagem 9. Arquivo web.xml com as configuraes do nosso servio.


<?xml version=1.0 encoding=UTF-8?> <!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd> <web-app> <servlet> <servlet-name>picasaServlet</servlet-name> <servlet-class>br.com.jm.picasa.server.PicasaServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>picasaServlet</servlet-name> <url-pattern>/javamagazinepicasa/picasa</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>JavaMagazinePicasa.html</welcome-file> </welcome-file-list> </web-app>

JavaMagazinePicasa, que pode ser visto, em parte, na Listagem 10 (o cdigo completo est disponvel para download no site da Java Magazine). Tambm no entraremos em detalhes a respeito do contedo dos arquivos JavaMagazinePicasa.html e JavaMagazinePicasa.css. Vejamos agora, apenas os pontos principais da classe JavaMagazinePicasa. Primeiro, temos o atributo picasaService do tipo PicasaServiceAsync, que criado atravs do mtodo GWT.create(), que recebe o tipo da interface de servio, PicasaService.class. Note que o cdigo cliente no deve acessar a interface de servio (e muito menos a implementao deste) diretamente. Todo acesso ao servio deve ser feito atravs da interface assncrona. O segundo ponto que merece ateno especial o mtodo onModuleLoad(). Este o ponto de entrada de uma aplicao GWT, assim como o main() de uma aplicao tradicional. Nesse mtodo, podemos construir as partes dinmicas da nossa interface grfica, inicializar variveis, bem

como configurar tratadores de eventos para os componentes da aplicao, sejam esses visuais, como um Button, ou no, como um Timer. No nosso exemplo, criamos alguns elementos grficos e painis, que servem para organizar o layout. Observe o trecho RootPanel.get(loginPanel).add(pnlMain). Essa a forma com a qual o GWT permite que elementos declarados no HTML sejam acessados a partir do cdigo Java. Nesse caso estamos acessando o container com ID loginPanel. No mtodo listUserAlbums() podemos ver dois exemplos de chamadas assncronas ao nosso servio, PicasaService. Nele verificamos se o usurio est logado no servio: caso esteja, invocamos o mtodo listAlbums(); caso contrrio, primeiro chamamos o mtodo login() e na sua callback invocamos listAlbums(). O arquivo JavaMagazinePicasa.html (Listagem 11) um arquivo HTML simples que define a parte esttica da interface gr-

A camada de apresentao
Com nosso servio devidamente criado e configurado, resta implementar o cdigo da camada de apresentao da nossa aplicao. Como no o foco deste artigo mostrar em detalhes o GWT, no explicaremos linha por linha o cdigo da classe
3 necessrio que retornemos o objeto Album porque as alteraes feitas no objeto original no so refletidas no cliente (cdigo Javascript) de forma automtica.

42 Java Magazine Edio 80

Listagem 10. Verso final da classe JavaMagazinePicasa


// Declarao de pacote e imports omitidos... public class JavaMagazinePicasa implements EntryPoint { // declarao dos componentes grficos e constantes omitidos. private final PicasaServiceAsync picasaService = GWT.create(PicasaService.class); public void onModuleLoad() { final Button sendButton = new Button(Get Albums); sendButton.addStyleName(sendButton); txtPicasaUser.setFocus(true); txtPicasaUser.selectAll(); VerticalPanel pnlMain = new VerticalPanel(); pnlMain.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); HorizontalPanel pnlLogin = new HorizontalPanel(); pnlLogin.setSpacing(5); Label lblUsername = new Label(Username: ); pnlLogin.add(lblUsername); pnlLogin.add(txtUsername); Label lblPassword = new Label(Password: ); pnlLogin.add(lblPassword); pnlLogin.add(txtPassword); HorizontalPanel pnlUser = new HorizontalPanel(); pnlUser.setSpacing(5); Label lblPicasaUser = new Label(Picasa User:); pnlUser.add(lblPicasaUser); pnlUser.add(txtPicasaUser); pnlUser.add(sendButton); pnlMain.add(pnlLogin); pnlMain.add(pnlUser); RootPanel.get(loginPanel).add(pnlMain); class MyHandler implements ClickHandler, KeyUpHandler { public void onClick(ClickEvent event) { listUserAlbums(); } public void onKeyUp(KeyUpEvent event) { if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { listUserAlbums(); } } } MyHandler handler = new MyHandler(); sendButton.addClickHandler(handler); txtPicasaUser.addKeyUpHandler(handler); } } private void listUserAlbums() { final String user = !txtPicasaUser.getText().trim().equals() ? txtPicasaUser.getText() : txtUsername.getText(); final AsyncCallback<Album[]> callback = new AsyncCallback<Album[]>() { @Override public void onFailure(Throwable caught) { Window.alert(Erro List!!!!); } @Override public void onSuccess(Album[] result) { buildAlbumList(result); } }; if (!loggedIn) { picasaService.login(txtUsername.getText(), txtPassword.getText(), new AsyncCallback<Void>() { @Override public void onFailure(Throwable caught) { Window.alert(Erro Login!!!!); } @Override public void onSuccess(Void result) { loggedIn = true; picasaService.listAlbums(user, callback); } }); } else { picasaService.listAlbums(user, callback); }

private void getAlbumContent(final Album album) { picasaService.getAlbumContents(album, new AsyncCallback<Album>() { @Override public void onFailure(Throwable caught) { Window.alert(Error retrieving album content: + caught.getMessage()); } @Override public void onSuccess(Album result) { showAlbumContents(result); } }); } private void showAlbumContents(final Album album) { // Exibe o contedo do lbum na tela... } private void showPhotoComments(final PhotoComment[] comments, Panel container) { // Exibe a lista de comentrios da foto atual... } }

private void buildAlbumList(Album[] albums) { // Monta a lista de lbuns na tela...

fica. Observe a tag <script>, nela que inclumos o cdigo Javascript gerado pelo GWT. O elemento <iframe> opcional e serve para permitir que o GWT possa manipular o histrico. Em seguida temos uma tabela e uma div. Na tabela temos uma clula com o ID loginPanel, que exatamente o ID que

referenciamos no mtodo onModuleLoad() da classe JavaMagazinePicasa. Do mesmo modo, estamos expondo a div com o ID contentArea para o cdigo Java. O a rqu ivo Java M agazinePicas a .css (Listagem 12) define os estilos utilizados pela aplicao.

importante lembrar que apesar do nosso exemplo ter sido uma aplicao web, podemos utilizar as APIs de dados em qualquer tipo de aplicao, seja web, desktop ou mobile. Lembramos tambm que o cdigo fonte dos exemplos que vimos neste artigo est disponvel para download no site da Java Magazine.

Edio 80 Java Magazine

43

Picasa Web Albums Data API Parte 2

Listagem 11. Arquivo JavaMagazinePicasa.html


<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN> <html> <head> <meta http-equiv=content-type content=text/html; charset=UTF-8> <link type=text/css rel=stylesheet href=JavaMagazinePicasa.css> <title>Java Magazines Picasa Web Albums Client</title> <script type=text/javascript language=javascript src=javamagazinepicasa/javamagazinepicasa.nocache.js> </script> </head> <body> <iframe src=javascript: id=__gwt_historyFrame tabIndex=-1 style=position:absolute;width:0;height:0;border:0></iframe> <noscript> <div style=width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif> Your web browser must have JavaScript enabled in order for this application to display correctly. </div> </noscript> <h1>Java Magazines Picasa Web Albums Client</h1> <table align=center> <tr> <td id=loginPanel></td> </tr> </table> <div id=contentArea align=center></div> </body> </html>

Listagem 12. Arquivo JavaMagazinePicasa.css


h1 { font-size: 2em; font-weight: bold; color: #777777; text-align: center; margin-bottom: 0; } h3 { font-size: 9px; font-weight: normal; margin-top: 0; } text-align: center;

.sendButton { display: block; font-size: 16pt; } .clickableImage { cursor: pointer; }

Publicando a aplicao no GAE


Para finalizar, veremos agora como publicar nossa aplicao no GAE, deixando-a pblica para ser acessada de qualquer lugar. Para isso, basta seguir os passos: 1. Acesse http://appengine.google.com e faa o login com seu usurio Google; 2. Escolha a opo Create an Application, preencha o ID e ttulo da sua aplicao, e clique em Save (Figura 7); 3. De volta ao projeto, edite o arquivo appengine-web.xml (que foi visto na Listagem 2) adicionando o ID da aplicao que acabou de criar na tag <application> (Ex.: <application>jm-picasa-test</application>); 4. Clique com o boto direito no projeto e escolha a opo Google>Deploy to App Engine, preencha os campos e-mail e password com os mesmos e-mail e senha utilizados no passo 1, e clique em Deploy (Figura 8). Com isso o plugin ir compilar sua aplicao utilizando o compilador do GWT e fazer o deploy da mesma no GAE. Encerrado o processo, sua aplicao estar dispo-

Figura 7.Tela de criao de nova aplicao no GAE nvel no endereo http://<appId>.appspot. com (Ex.: http://jm-picasa-test.appspot.com). Picasa Web Albums e pequenos exemplos do seu funcionamento. Nesta segunda parte, construmos um projeto completo utilizando a Biblioteca Cliente Java, o GWT como framework web e o GAE para publicar nossa aplicao nos servidores do Google.

Concluses
Chegamos ento ao final do nosso artigo. Na primeira parte (Edio anterior), vimos os conceitos bsicos da API de Dados do

44 Java Magazine Edio 80

http://picasaweb.google.com Site do Picasa Web Albums. https://www.google.com/accounts/ PurchaseStorage?hl=en_US Lista dos planos de armazenamento oferecidos pelo Picasa Web Albums. http://code.google.com/apis/gdata/ Site oficial das Google Data APIs. http://googledataapis.blogspot.com/ Blog oficial das Google Data APIs. http://code.google.com/apis/picasaweb/ Site oficial da Google Picasa Web Albums Data API. http://code.google.com/apis/picasaweb/ docs/2.0/developers_guide_java.html Guia da desenvolvimento da API do Picasa Web Albums para desenvolvedores Java. http://code.google.com/apis/picasaweb/ docs/2.0/reference.html Guia da referncia da API do Picasa Web Albums.
Figura 8. Tela de deploy do Google Plugin para o GAE Assim, foi mostrado como possvel manipular lbuns, fotos, vdeos, tags e comentrios de forma fcil e prtica, por meio da API estudada. Alm disso, tambm aprendemos a utilizar o Google Plugin para Eclipse, que torna o desenvolvimento em GWT e o deploy no GAE, tarefas extremamente simples.

Paulo Csar M. N. A. Coutinho pcmnac@gmail.com www.pcmnac.com mestrando em Engenharia de Software pelo Centro de Estudos e Sistemas Avanados do Recife (C.E.S.A.R), onde presta servios de consultoria em projeto e desenvolvimento de sistemas. Atualmente, atua como desenvolvedor snior na MV Sistemas. Tem experincia no desenvolvimento e projeto de aplicaes/componentes Java, C/C++ e Flex. Possui as certificaes SCJP 5 e SCWCD 1.4.

http://code.google.com/apis/picasaweb/ docs/2.0/developers_guide_protocol.html Guia do protocolo da API do Picasa Web Albums. http://code.google.com/p/gdata-java-client/ downloads/list Site para download da Java Client Library. http://code.google.com/eclipse/ Site oficial do Google Plugin para Eclipse. http://code.google.com/webtoolkit/ Site oficial do Google Web Toolkit (GWT). http://code.google.com/appengine/ Site oficial do Google App Engine.
D seu feedback sobre esta edio! A Java Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o que voc, leitor, acha da revista!
D s

Feedback eu
sobre e s

D seu voto sobre este artigo, atravs do link:

www.devmedia.com.br/javamagazine/feedback

Edio 80 Java Magazine

edio ta

45

Seo eNgeNharia de Software: NeSta Seo voc eNcoNtra artigoS relacioNadoS a aNliSe, modelagem,

Coaching e Facilitao de
Implantando e liderando equipes geis

oaching um assunto relativamente vasto e seriam necessrios vrios livros para abord-lo de maneira completa, contudo o objetivo desse artigo fornecer uma viso introdutria, porm suficientemente abrangente sobre a aplicao do processo de Coaching em equipes e lderes da rea de desenvolvimento de software. O processo de Coaching, que originalmente fora desenvolvido em contextos esportivos, passou a ser adotado h muitos anos no mundo organizacional de diferentes formas, mantendo sempre uma ideia constante: ajudar indivduos a melhorar sua performance para alcanar ou superar suas metas pessoais ou profissionais. Nesse texto, abordaremos os alicerces e a natureza do Coaching, bem como seus principais conceitos e tcnicas. Abordaremos tambm como o processo de Coaching pode ajudar na adoo e liderana de uma equipe gil de desenvolvimento de software.

Resumo DevMan
De que se trata o artigo:
Neste artigo conheceremos os processos de Coaching e Facilitao, que podem ser aplicados a indivduos e a equipes de desenvolvimento, com o objetivo de aprimorar o desempenho destas pessoas durante todo o projeto de software.

Para que serve:


Melhor do que dizer o que deve ser feito orientar uma pessoa ou equipe a tomar as decises corretas e a trilhar o melhor caminho em busca de um objetivo, uma meta. Coaching e Facilitao foca exatamente nesta questo, podendo ser aplicados em todos os participantes do projeto, independentemente da funo em que atua.

Em que situao o tema til:


O tema til para todos aqueles que primam sempre pela evoluo dos seus trabalhos. Para isso, conhecer tcnicas que orientam, estimulam e facilitam a caminhada rumo a esta meta, de grande importncia. O resultado deste processo a evoluo da forma de trabalho e consequentemente a qualidade do mesmo.

Coaching e Facilitao de Times geis:


Abordaremos nesta matria as tcnicas de Coaching e Facilitao de equipes geis. Visando esse aprendizado, apresentaremos os papis no processo de Coaching, o que no Coaching, tcnicas de Facilitao, a importncia da auto-organizao e disciplina, entre outros tpicos relacionados ao tema.

Entendendo o Coaching
Cada indivduo que integra alguma equipe j viveu ou est vivendo uma situao de caminhada rumo ao alcance de resultados. Esses resultados so normalmente chamados de metas. O processo para chegar a um resultado no to simples assim, pois comumente ocorrem diferentes tipos de obstculo no meio do caminho que dificultam que o mesmo seja percorrido por um indivduo ou por uma equipe inteira. Nessa complexa relao caminho/meta entra o processo de Coaching, que tem como principal objetivo ajudar um indivduo (ou um time) a percorrer o seu caminho rumo a uma meta e, principalmente, a remover possveis obstculos durante a caminhada.

Para Timothy Gallwey, autor do Livro The Inner Game of the Tennis, Coaching uma relao de parceria que revela/liberta o potencial das pessoas de forma a maximizar o desempenho delas. ajud-las a aprender ao invs de ensinar algo a elas.... Essa facilitao da autodescoberta para um indivduo o cerne das atividades de uma figura muito comum, chamada Coach. O Coach muitas vezes lembrado como um tcnico ou treinador de alguma equipe. Apesar disso, normalmente as pessoas desconhecem o real significado de ser um Coach para um time ou para um indivduo. Portanto, nesse ponto do texto crucial entendermos que a etimologia da palavra Coach : Veculo (meio) para o transporte de pessoas, ou seja, por natureza, um Coach o meio que facilita as pessoas a alcanarem suas metas.

Papis no processo de Coaching


At aqui, mostramos que Coaching um processo que envolve descobertas, aprendizados e desenvolvimento, para se atingir determinado resultado. interessante entendermos que esse processo de aprendizado e desenvolvimento acontece tipicamente entre dois papis: o Coachee e o Coach. O Coachee o indivduo responsvel por uma determinada meta e, para trilhar seu caminho, recebe a ajuda do Coach para chegar ao resultado almejado. importante ressaltar que possvel tambm que uma equipe inteira atue como Coachee num processo de Coaching. O outro papel o Coach, que o profissional que fornece o processo de Coaching. comum que esse papel seja desempenhado por um profissional externo a equipe, o que ajuda a criar uma viso externa dos comportamentos e resultados.

46 Java Magazine Edio 80

ProJeto, teSteS, eNtre outroS temaS relacioNadoS a eS

Times geis
maNoel PimeNtel medeiroS
No contexto da gesto de projetos, o papel de Coachee (cliente) pode ser desempenhado por um lder, ScrumMaster ou gerente de uma equipe. Esse Coaching para lderes ou gerentes de equipes muito comum e bastante assertivo, pois permite ao Coach no ser invasivo na cultura do time, alm de ajudar o lder ou gerente a ver por outro ngulo o seu desempenho, o que mudar, para que mudar e como causar a mudana. No contexto das metodologias geis, o processo de Coaching tambm atua fortemente como u ma competnc ia chave para o papel do ScrumMaster em um projeto gerenciado pela metodologia Scrum. Assim como foi explicado no artigo O diferencial Scrum da Edio 73, O ScrumMaster um facilitador para o time. um determinado assunto. Dessa forma, o limite de aprendizado do Coachee est naquilo que o seu mentor conhece. Nesse aspecto, importante reforar que o processo de Coaching pode ajudar um Coachee a ter sucesso num assunto que est alm dos conhecimentos e habilidades do prprio Coach. Um exemplo tpico desse conceito : um Coach no precisa ser um especialista em tnis para ajudar um tenista a ser campeo; No tratamento psiquitrico ou an lise psicolgica crucial tornar claro que o exerccio da atividade de Coaching, apesar de buscar o entendimento da mente e comportamento do ser humano, no pode ser considerado um tratamento feito por um psiquiatra ou psiclogo. O Coaching no visa corrigir indivduos ou resolver alguma disfuncionalidade da mente. Uma diferena bsica sobre isso que o Coaching tem o foco no futuro e no no passado, ou seja, no papel do Coach buscar entender os motivos e os problemas do passado de um Coachee, mas sim ajud-lo a caminhar de um ponto atual (no presente) para um ponto desejado (no futuro).

Um caminho para a melhoria contnua de equipes em projetos de desenvolvimento gil

Facilitao
Facilitao uma abordagem que visa oferecer meios para minimizar quaisquer dificuldades (por exemplo: timidez, individualismo, falta de criatividade) que possam surgir durante a realizao de um determinado evento para gerao de ideias. Seu principal objetivo conduzir um grupo num processo de aprendizagem ou num processo de mudana durante esses eventos. Para a facilitao, um evento qualquer atividade realizada por uma ou mais pessoas (por exemplo: reunies) num intervalo pequeno de tempo e que tem um objetivo bem definido a ser atingido. A Facilitao incentiva todos os membros a colaborarem com o processo criativo durante um evento, pois atravs dessa colaborao todos tm a chance de ter conscincia e responsabilidade sobre determinado tema. Essa conscincia e responsabilidade permitem que os membros suplantem as dificuldades e estejam totalmente focados no que acontece durante o evento. De maneira geral, a facilitao busca simplificar as atividades inerentes a

O que no Coaching
No mercado mundial, frequentemente h muitos enganos sobre o que o processo de Coaching e principalmente como o Coach atua nesse processo. Para alinharmos melhor o entendimento sobre o assunto, vamos listar rapidamente alguns conceitos sobre o que NO Coaching: No consultoria O Coach no d as respostas, ele ajuda o Coachee a descobrir suas prprias respostas; o aconselhamento Igualmente ao N item anterior, o Coach no d conselhos nem solues prontas; No treinamento O Coach no ensina o Coachee sobre as tcnicas e ferramentas para percorrer um caminho. Esse um ponto bem interessante porque um Coach no precisa ser algum mais capacitado do que o Coachee; o mentoring Tipicamente um N mentor ensina tudo o que sabe sobre

Edio 80 Java Magazine

47

Coaching e Facilitao de Times geis

uma equipe. Com isso, muito comum que existam prticas que trabalhem fortemente numa abordagem cognitiva e ldica. Como j foi mencionado no artigo FDD O Ponto de Equilbrio gil (publicado na Java Magazine 76), ser cognitiva significa, em linhas gerais, que atravs da associao de ideias proporcionamos um fcil e rpido entendimento de outra ideia. Um exemplo disso quando pensamos numa palavra como banana. Note que a partir dessa palavra rapidamente nos lembramos de uma fruta e a associamos ao seu formato, cor, sabor, etc. E para estimular essa cognio, durante os eventos frequentemente utilizamos post-its, cartolinas, flip-charts e cores com diferentes significados. Ser ldica significa que essas prticas proporcionam um sentimento prazeroso em seus envolvidos. A ideia de uma prtica ldica nos remete ao pensamento de que no h nenhum obstculo (fsico ou psicolgico). Por isso, um evento facilitado repleto de dinmicas simples, a fim de proporcionar o estado ldico e cognitivo mencionado acima.

Nenhuma contribuio compartilhada ser perdida durante o evento; s discusses se tornam mais objetivas; A Os temas so estruturados e analisados mais facilmente; Estimula a participao coletiva sobre um tema; A visualizao incentiva o grupo a prio rizar informaes mais relevantes.

Os seis chapus para facilitar o pensamento


Uma das maiores dificuldades para a boa facilitao de algum evento (reunio) so as prprias caractersticas da personalidade de cada membro do grupo, pois na maioria das vezes as pessoas so acostumadas a realizar reunies pautadas no pensamento argumentativo. No pensamento argumentativo cada um expe e defende sua opinio, e como existe uma carga emocional muito grande nessas opinies (mesmo que no evidente), comum haver verdadeiras brigas de ego para competir sobre qual a opinio a melhor ou mais forte. Para minimizar esse problema, uma das ferramentas que abordaremos neste artigo a tcnica chamada de Os seis chapus do pensamento, que fora publicado num livro com o mesmo nome (Six Thinking Hats no original em ingls) na dcada de 80 pelo Dr. Edward De Bono. Um dos principais objetivos dessa tcnica ajudar a dar uma direo e organizao mais coletiva aos pensamentos de cada membro do grupo. A tcnica dos seis chapus baseada na ideia do pensamento paralelo. Esse tipo de pensamento estimula que o grupo trabalhe apenas em um tipo de pensamento por vez de forma coletiva, ou seja, todos olham para a mesma direo ao mesmo momento e essas direes vo mudando no decorrer da reunio. Com isso, no devido momento, todos podem expressar seus pensamentos e possveis sentimentos. A analogia com um chapu adiciona uma caracterstica ldica ao evento e tambm estimula uma abordagem cognitiva durante o processo de debate acerca de tema. Nessa analogia, cada chapu identificado por uma cor. Assim, os

Comunicao Visual
Num evento facilitado, comum haver uma forte comunicao visual entre o grupo para fazer com que as informaes construdas pelo mesmo sejam visualizadas e compreendidas por todos. A neurocincia explica que nosso crebro possui dois hemisfrios, onde o lado direito considerado emocional e o lado esquerdo considerado racional. Com base nessa premissa, o uso de ferramentas para gerar uma comunicao visual proporciona uma espcie de harmonia entre esses hemisfrios, sendo fornecidos subsdios para ajudar o raciocnio lgico a materializar e organizar as emoes e sentimentos peculiares construo de novas ideias. Alm do aspecto explicado pela neurocincia, tambm podemos citar outras vantagens do uso da comunicao visual, so elas: A obteno de um centro de ateno comum;

membros sabem que tipo de pensamento vai acontecer quando determinada cor for evocada (o que ocorre devido associao de ideias). As cores dos chapus representam os seguintes pensamentos: or Branca (Fatos e Informaes) C Esse chapu pode ser usado no incio de uma reunio, com o objetivo de coletar informaes inicias acerca de um tema. Com ele, so verificadas quais as questes a serem respondidas, como: quais os fatos? Ou quais as informaes disponveis sobre determinado assunto? Ento esse chapu servir apenas para fornecer possveis insumos para o objetivo da reunio; or Vermelha (Sentimentos e EmoC es) Nesse momento os membros podem expressar seus instintos, sentimentos de raiva, intuio ou qualquer tipo de pensamento sem explicao lgica; Cor Preta (Julgamento Crtico) Os membros podem identificar possveis falhas, riscos, barreiras, inconsistncias, medos e fraquezas acerca de uma ideia. Uma das caractersticas principais que os pensamentos gerados sob esse chapu devem possuir alguma fundamentao lgica; Cor Amarela (Viso Positiva) Atra vs desse chapu, os membros tero um momento para expressar de maneira lgica os benefcios, qualidades, virtudes e foras positivas que existem acerca de um tema; Cor Verde (Novas Ideias) Com o cha pu verde o grupo poder usar de todo o seu potencial criativo com o objetivo de gerar provocaes (estmulos) para buscar aes para resolver ou minimizar o julgamento crtico do Chapu Preto, ou a raiva, intuio e instinto do Chapu Vermelho. Neste chapu, tambm podem ser feitas provocaes para atitudes que implementem a viso positiva do Chapu Amarelo; Cor Azul (Consolidao) Esse o mais ativo dos chapus, e funciona como o pensamento sobre o pensamento. Ele atua como chapu para organizar e conduzir os demais pensamentos. Alm disso,

48 Java Magazine Edio 80

pode ser aplicado durante todo o evento facilitado com a tcnica dos seis chapus, e tambm pode ser adotado como chapu final para promover uma consolidao (resumo) dos pensamentos j realizados naquele evento. Para finalizar o tpico sobre os seis chapus, necessrio ressaltar que em um projeto gil de desenvolvimento de software esse tipo de tcnica pode ser utilizado com bastante eficcia nas reunies de planejamento da iterao e nas reunies de retrospectivas. Contudo, importante reforar que a facilitao em si um elemento constante durante o processo de Coaching, inclusive quando o mesmo est sendo destinado a equipes que trabalham com metodologias geis, pois elas estimulam o uso de prticas ldicas e cognitivas, envolvendo desde as atividades de elucidao dos requisitos at as reunies dirias.

O impacto das crenas e valores sobre o processo de Coaching


De maneira geral, nosso comportamento orientado por aquilo em que acreditamos e pelas coisas que esto em nossa escala pessoal de valores. Essas crenas e valores so os grandes responsveis por nossos resultados. Com isso, o processo de Coaching atua fortemente em ajudar um Coachee a refletir sobre como as crenas e valores podem ajud-lo ou impedi-lo de seguir rumo a uma meta. De acordo com a Wikipdia, um valor exprime uma relao entre as necessidades do indivduo de forma que orientamos as nossas aes a estarem em acordo com esse valor. Existem diversos valores que um indivduo pode cultivar, mas para gerar um melhor entendimento, podemos didaticamente lanar mo de alguns valores na rea de desenvolvimento de software, como por exemplo: qualidade, tica, retorno financeiro, respeito a pessoas, etc. importante tambm ajudar o Coachee a visualizar qual a sua hierarquia de valores, ou seja, quais valores so mais importantes do que outros. Uma forma de fazer isso gerar situaes hipotti-

cas onde um valor seria sacrificado em detrimento de outro. Porm, o fato de um valor ser sacrificado nesse exerccio no significa que o mesmo esteja anulado ou que no exista, mas sim que este valor est apenas numa faixa de hierarquia de menor importncia para o indivduo. J as crenas so ideias nas quais acreditamos, mas no temos certeza de sua existncia ou se seria algo factvel de acontecer sempre. Mesmo assim, muitas crenas atuam como pensamento limitante e acabam congelando nossas aes. Por isso, importante que num processo de Coaching o Coachee tenha a oportunidade de refletir sobre o quanto uma crena saudvel a ele. Para exemplificar esse pensamento vamos tomar a seguinte analogia: uma crena funciona como uma mesa, onde apoiamos nossos comportamentos. Vamos lembrar que uma mesa normalmente composta por um tampo apoiado por quatro pernas. Nesse contexto, o tampo representa a crena em si e as pernas representam o que sustenta uma crena, que so as evidncias. Ento, caso se deseje derrubar essa mesa, podemos quebrar ou remover uma ou algumas de suas pernas. Assim como o nosso exemplo, tipicamente uma crena anulada ou alterada quando tem alguma de suas bases (as evidncias) questionadas e/ou derrubadas. No que esse questionamento seja feito de maneira isolada ou desrespeitosa. Na verdade cabe ao Coach no questionar diretamente uma crena de um Coachee, mas despertar no mesmo uma reflexo do quanto aquela crena verdadeira ou lgica, e se ela est impedindo que o caminho seja trilhado rumo a uma meta. Um bom exemplo de como uma crena pode ser limitante : um gerente de uma empresa de desenvolvimento de software que acredita que seu produto no bom porque sua equipe de desenvolvimento no grande. Ento caso os bons resultados da equipe sejam limitados por esse tipo de pensamento, ser da competncia do Coach ajudar o gerente a encontrar as respostas para questionamentos como: ser que todos

os excelentes softwares existentes s so criados por equipes grandes? Ou: ser que os grandes e revolucionrios projetos somente so possveis atravs de equipes grandes? interessante observar que no acreditar em algo nos deixaria imobilizados, pois precisamos de alguma crena para orientar nossas aes. Por isso, importante que atravs do processo de Coaching seja construdo no lugar da antiga uma nova crena, mais forte e mais positiva.

Conscincia e Responsabilidade
Est claro que para o processo de Coaching funcionar bem necessrio que o Coachee sinta-se dono de suas prprias metas e dos caminhos para alcan-las. por esse motivo que o processo no deve funcionar como treinamento, mentoring, aconselhamento ou algo similar (conforme abordamos no tpico O que no Coaching). Essa caracterstica do processo de Coaching apoiada na premissa de que dificilmente um indivduo desenvolve esse senso de responsabilidade quando uma meta, ou o caminho para ela, lhe imposta por outra pessoa. Essa imposio um dos principais motivos das falhas na obteno de resultados. Para auxiliar o desenvolvimento da responsabilidade num Coachee, cabe ento a um bom Coach respeitar os valores e crenas do mesmo, bem como no julgar as suas decises. Um Coach deve sempre permitir que o Coachee questione se determinado pensamento ou comportamento ir ajudar ou prejudicar o caminho. Dessa forma o Coachee ser estimulado a desenvolver a responsabilidade com a mudana de atitude necessria ao alcance de uma meta. Para que essa responsabilidade seja criada, necessrio que o indivduo tenha um estado pleno de conscincia durante a caminhada rumo a sua meta. Conscincia no contexto de Coaching deriva da palavra inglesa aware, ou seja, ciente. Esse conceito expressa que h uma ampla percepo daquilo que se v, ouve e sente.

Edio 80 Java Magazine

49

Coaching e Facilitao de Times geis

Na verdade estamos falando aqui de uma autoconscincia capaz de permitir que um indivduo reconhea como e quando as suas prprias emoes distorcem a sua percepo daquilo que se deseja e daquilo que se faz para consegui-lo.

ntender quais os ganhos e perdas de E determinada opo; quanto uma determinada opo o O aproxima ou o distancia de sua meta e; e aquela opo possui congruncia S com os seus valores e crenas. Dentro de um processo de Coaching, importante tambm entendermos que o principal objetivo de uma pergunta no saciar uma dvida do Coach, mas sim proporcionar ao Coachee a elucidao necessria sobre determinado assunto, ou seja, fazer com que o Coachee pense sobre a referida questo e encontre suas prprias respostas.

Quais os resultados esperados com sua adoo e; Como que adotar essa ferramenta (ou tcnica) vai ajud-lo a alcanar a sua meta. Auto-organizao tem tudo a ver com processo de Coaching, pois para que a mesma funcione preciso que a equipe tenha a disciplina necessria para se manter no caminho rumo a uma meta. Disciplina, no contexto de Coaching, nada mais do que a habilidade de um indivduo (no caso o Coachee) em ter o foco necessrio e, principalmente, conseguir identificar, potencializar e manter os comportamentos que agregam mais valor sua meta.

Pensamento Sistmico para Perguntas Eficazes


Uma das ideais que servem como base para o processo de Coaching que: O todo maior que a soma de suas partes, isto , existe certa relao sistmica (mesmo que oculta) que integra cada um de nossos comportamentos e as suas respectivas consequncias. Esse um ponto que carece de bastante ateno, pois conforme aprendemos no tpico sobre Conscincia e Responsabilidade, para o sucesso do processo de Coaching, crucial que Coachee tenha a responsabilidade plena por sua meta e pelo seu caminho. Nesse aspecto, existe um desafio muito grande para o Coach quando o Coaching em questo sobre um assunto no qual o prprio Coach seja especialista ou tenha algum domnio. Esse desafio est no fato de que, para gerar o senso de responsabilidade no Coachee, o Coach no deve dizer ao mesmo o que fazer, como fazer e quais as ferramentas ou tcnicas usar para alcanar a meta. Nesse raciocnio, durante o processo de Coaching, ao invs do Coach dizer ao Coachee que use a tcnica XYZ para realizar determinada ao, o Coach deve question-lo de maneira sistmica sobre quais as opes lhe so conhecidas para realizar aquela atividade. Contudo, somente isso pode no ser suficiente para gerar uma deciso responsvel no Coachee, sendo assim, cabe ao Coach ajud-lo a:

Auto-organizao e Disciplina
As metodologias geis, de maneira geral, possuem como alicerce a existncia de equipes de alta performance atravs da Auto-Organizao das atividades necessrias ao desenvolvimento do incremento de software almejado. Entende-se que isso acontece quando um indivduo ou equipe possui o espao necessrio para criar e desenvolver (dentro de sua capacidade e ritmo) seus prprios meios para atingir uma meta. Desenvolver este senso de auto-organizao nos indivduos no fcil. Sendo assim, um dos melhores caminhos para levar uma equipe a desenvolver atitudes auto-organizadas atravs da gerao de responsabilidade plena no time sobre um determinado assunto (assim como explicado no tpico sobre Conscincia e Responsabilidade). Isso tambm um exemplo claro de que no processo de Coaching, o Coach deve estimular o Coachee a desenvolver a conscincia suficiente sobre: Quais os motivos esto por trs do uso de determinada ferramenta (ou tcnica);

Metas
Existem algumas boas dicas para a definio de melhores metas para times ou indivduos, uma delas o conceito SMART (Specific, Measurable, Achievable, Realistic e Timeboxed). Esse conceito nos ajuda a criar metas mais especficas, mensurveis, alcanveis, realistas e com tempo definido para acontecer. Diversas so as origens de uma meta, mas basicamente uma meta a forma de propor a realizao de um desejo. importante entendermos que podemos ter nveis diferentes de metas, e esses diferentes nveis advogam a nosso favor, pois nos permitem adotar diferentes estratgias de aes para alcan-las. Assim como mostrado na Figura 1, basicamente podemos desenvolver dois nveis de metas que se complementam: eta Final Essas so as grandes metas, M que representam grandes realizaes para um indivduo ou para uma equipe. Um bom exemplo um importante projeto, que precisa ser concludo a tempo de gerar uma enorme vantagem competitiva para a organizao; eta de Performance So as metas M que servem como marcos (milestones) necessrios para atingir uma meta final. Como exemplo de Meta de Performance, podemos visualizar as entregas de incrementos de produtos ao final de um Sprint ou Release (conforme explicado no artigo

50 Java Magazine Edio 80

sobre Scrum publicado na Edio 73) para aquele importante projeto (mencionado acima como meta final). importante mencionar que para ligar uma meta de performance a uma meta final, necessrio que o indivduo ou equipe desenvolva um processo capaz de identificar as mesmas e criar os passos necessrios para atingi-las. Nesse caso, o processo de Coaching fornece uma espinha dorsal para esse caminho. Nessa mesma linha, as metodologias geis de maneira geral oferecem tambm opes factveis de ferramentas apropriadas aos tipos comuns de problemas que uma equipe de desenvolvimento de software enfrenta. Isso permitir que a equipe tenha meios de facilitar a sua caminhada rumo a uma meta (trataremos sobre isso nos prximos tpicos).

Figura 1. Exemplo da relao de um indivduo com as Metas de Performance e a Meta Final

O campo de foras das metas


Trilhar o caminho para uma meta nem sempre fcil, na verdade so diversos obstculos que tipicamente atuam como foras contrrias ao alcance de um objetivo. Alguns desses obstculos so reais, j outros, so frutos apenas de nossas crenas limitantes. Muitas das crenas que cultivamos funcionam como pensamentos que limitam as nossas aes, e isso gera uma inrcia ainda maior no desafio de caminhar em direo ao nosso alvo. Por outro lado, tambm existem as foras favorveis que nos ajudam durante o caminho. Essas foras favorveis so oriundas de algum estmulo, algum motivo de prazer, algum motivo de dor ou simplesmente habilidades que nos permitem trilhar com mais afinco em direo ao objetivo. Vivemos numa complexa relao de foras favorveis e foras contrrias para o alcance de uma meta. Para melhor entender isso, vamos recorrer a uma breve analogia extrada da fsica: imagine que para fazer um balo subir, necessrio equilibrar duas foras diferentes, o volume de ar quente, contra o volume de ar frio do ambiente ao redor do balo. O volume de ar quente necessrio para que o ar de dentro do balo seja mais leve que o ar externo ao balo. Nessa analogia o ar

Figura 2. Exemplo de uma FFA remetendo a lembrana do desafio de fazer um balo subir quente funciona como fora favorvel e o ar frio atua como fora contrria. Claro que existem tambm outras variveis mais especficas, como o peso do balo, gravidade, etc. Porm, todas elas de uma forma ou de outra atuam como foras favorveis ou contrrias para a meta, que subir o balo at determinada altura. Quando um processo de Coaching est sendo desenvolvido, existem algumas ferramentas que podem facilitar a identificao e reduo das foras contrrias e tambm para entender e maximizar as foras favorveis. Uma dessas ferramentas a FFA (Force Field Analysis Anlise do Campo de Foras), que prover um meio de analisar o campo de foras (contrrias e favorveis) rumo a uma meta. Essa uma ferramenta relativamente simples de usar, onde podemos utilizar basicamente uma marcao em folha de papel, ou num flipchart ou num quadro branco. Nessa rea sero identificadas as foras contrrias, as foras favorveis, as aes que serviro para minimizar as contrrias e para maximizar as favorveis. Uma maneira bem simples de usar essa ferramenta representar graficamente assim como na Figura 2 a FFA com a analogia do balo que mencionamos nos pargrafos anteriores. Nessa representa-

Edio 80 Java Magazine

51

Coaching e Facilitao de Times geis

o, na parte interior do balo esto as foras favorveis, na parte externa ficam as foras contrrias e, na parte inferior do balo, residem as aes possveis para maximizar as foras favorveis ou minimizar as foras contrrias. Claro que somente a representao grfica resultante da FFA no suficiente para alcanar uma meta. Na verdade a FFA apenas serve como um mapa, e somente quando um indivduo assumir a conscincia e a responsabilidade por suas metas e pelos seus caminhos, que poder encontrar a efetividade necessria para caminhar rumo s mesmas. Para finalizar esse tpico, entenda que num processo de Coaching, o papel de um Coach no criar as foras favorveis e nem diminuir as foras contrrias. O papel de um bom Coach ajudar o seu Coachee (cliente) a descobrir as ferramentas necessrias para o que mesmo produza a quantidade ideal de fogo para fazer o seu prprio balo subir.

da melhor maneira possvel a alcanar a sua meta; Empacotar a forma e a vontade de rea lizao Como desafio final, o Coachee precisa se responsabilizar consigo mesmo sobre como ele ir desenvolver o caminho, quais os resultados esperados durante essa caminhada e, quando ela for iniciada, quais sero os marcos de progresso e quando ela ser finalizada. Infelizmente somos acostumados a criar metas com base apenas em nossa realidade atual. Isso normalmente faz com que as mesmas sejam limitadas e agreguem pouco a um indivduo ou equipe. Para evitar isso, o modelo GROW estimula primeiro a termos uma meta realmente desafiadora, livre das restries ou crenas da realidade atual. Um exemplo tpico dessa situao : se perguntarmos a uma equipe de programadores em quanto tempo um determinado produto seria desenvolvido, eles certamente fariam uma estimativa de prazo baseados em sua capacidade normal e no seu jeito tradicional de trabalhar. Isso ocorre porque antes de fornecer a resposta final, eles tomariam como base esses elementos como restrio de ao. J um processo de Coaching est muito orientado a ajudar um Coachee (nesse caso a equipe) a realizar coisas realmente desafiadoras. Sendo assim, se esta equipe estivesse num processo de Coaching baseado no GROW, eles seriam estimulados a pensar em coisas como: Qual seria a durao ideal para fazer desse projeto algo espetacular e nico da histria? E para completar o raciocnio, eles refletiriam o seguinte: Se pudssemos mudar a forma de trabalho, qual seria a mais apropriada para alcanar esse resultado espetacular? Claro que trabalhar com esse tipo de pensamento no to imediato para um Coachee, entretanto, atravs da reflexo exemplificada acima, o processo de Coaching ir ajud-lo a exatamente desenvolver as competncias e habilidades necessrias para propor e realizar metas verdadeiramente desafiadoras.

Coaching em um Projeto gil


De acordo com a Sociedade Brasileira de Coaching, um bom processo de Coaching baseado num Foco, que desperta Aes, que geram determinados Resultados e, esses resultados so passveis de serem Melhorados continuamente. Observe que esse fluxo bsico do processo de Coaching funciona como um espelho ao Coachee, para exatamente visualizar quais resultados ele est obtendo e principalmente aprender de forma emprica como melhorar seu comportamento para alcanar resultados ainda melhores. Para atuar como base a esse ciclo de melhoria contnua de um Coachee, uma boa sesso de Coaching normalmente contm a seguinte estrutura: Quais os aprendizados desde a ltima sesso; uais os avanos que o Coachee teve Q desde ltima sesso; O que podemos desenvolver (ou melho rar) a partir dessa sesso atual; uais os aprendizados dessa sesso Q atual; quais tarefas o Coachee identificou e E se responsabilizou em desenvolver at a prxima sesso. Essa caracterstica faz com o que o processo de Coaching tenha uma sinergia muito grande com a Filosofia gil. Essa sinergia acontece porque todas as metodologias geis so baseadas na ideia de melhorar continuamente uma forma de ao, para melhor atingir um determinado objetivo. Nesses ambientes que esto adotando a Filosofia gil, comum haver um Coach como um profissional externo a equipe para auxiliar o lder ou a prpria equipe a melhorar seu comportamento visando atingir as suas metas. Contudo, assim como j foi mencionado no tpico sobre Papis no processo de Coaching, importante salientar que o processo de Coaching tambm pode ser usado como uma competncia de um lder num projeto para ajud-lo a melhorar o seu comportamento no desafio de liderar uma equipe gil de desenvolvimento.

GROW
Para apoiar o processo de Coaching, existem alguns modelos que fornecem uma espcie de espinha dorsal para todo o trabalho. Um dos modelos mais praticados no universo de Coaching o GROW. Esse modelo um acrnimo de: Goal (META), Realit y (REALIDADE), Options (OPES) e What, When, Whom e Will (O QUE ser feito, QUANDO, por QUEM e a VONTADE de fazer). Observemos que o modelo GROW proporciona ao Coachee que o mesmo consiga: Estabelecer a Meta O modelo inicia pela definio de uma meta, onde o Coachee poder refletir sobre O que realmente desejado?; Entender a realidade atual O prxi mo desafio entender qual a realidade atual. Principalmente buscar conhecer o que lhe favorece e o lhe impede de alcanar a meta; Explorar as Opes O processo de Coaching deve ajudar o Coachee a aprender sobre quais as opes de caminhos e ferramentas que podem ajud-lo

52 Java Magazine Edio 80

Para evidenciar ainda mais essa sinergia entre o processo de Coaching e a Filosofia gil, interessante entendermos que de maneira geral, as Metodologias geis trabalham de forma cclica (iterativa e incremental). Esses ciclos acontecem com um Planejamento (que resulta num Foco), com um Desenvolvimento (a Ao), com uma Entrega ao final desse desenvolvimento (Resultado) e com uma Retrospectiva (Melhoria) para identificar pontos que podem ser melhorados para o prximo ciclo.

Coaching para ajudar a equipe a resolver os seus impedimentos


Tratar impedimentos tornou-se algo relativamente popular atravs da adoo da Filosofia gil nas organizaes. Esse tpico almeja gerar uma reflexo na forma como os times esto tratando os impedimentos que aparecem em seu cotidiano. Portanto, analisaremos nos prximos pargrafos por qual motivo recomendvel que ten ha mos u m verdadeiro sentimento de nojo dos impedimentos.

as origens e tipos dos impedimentos que acontecem em seu dia a dia. Comumente, os tipos de impedimentos num ambiente de TI (Tecnologia da Informao) so: Organizacionais Quando ocorre uma situao onde necessria a ajuda ou interveno de outra pessoa, outra equipe ou outra rea dentro da empresa. Nesse aspecto, tambm so observadas as questes de cunho poltico que a organizao cultiva (que facilitam ou dificultam o processo); Administrativos Nesse caso, so situ aes provenientes de fatos administrativos como: absentesmo (frias, atrasos, licenas, folgas, doenas), demisses, restries de horrios de trabalho; Nvel de Servio Aqui so identifica dos impedimentos que ocorrem oriundos da sustetano de algum servio em operao. Os principais exemplos disso so: erro em ambientes de produo, problemas com servidor de aplicaes, servidor de integrao e ferramentas diversas de apoio. Nesse momento necessrio que tenhamos um dos principais alertas sobre impedimentos em mente: Nem todo o impedimento real. E isso algo muito negativo, pois entenda que normalmente quanto menor a motivao acerca de uma meta, qualquer coisa serve como desculpa infundada para a no realizao de algo.

Tomando como base esses pensamentos negativos sobre os impedimentos, a melhor maneira de agir com relao aos impedimentos cativando um sentimento de nojo (exatamente o mesmo sentimento de repulsa sobre as coisas sujas, incomestveis ou infecciosas). A principal vantagem desse sentimento de nojo que assim o time se sente estimulado a evitar a prpria ocorrncia do impedimento. Dessa forma, para apoiar esse nojo aos impedimentos, um time pode usar alguns importantes recursos para evitar a ocorrncia dos mesmos: O senso de comprometimento com a meta. Aceitar um impedimento afetar negativamente o caminho em direo meta; Usar a dinmica do ciclo e do timebox oriundos das iteraes das metodologias geis (A pergunta decisiva : Isso pode esperar a prxima iterao?); A auto-organizao do time para ativar o seu lder para que o mesmo ajude-os a rejeitar o impedimento e proteger a atividade que est sendo executada.

O que impedimento?
Para sermos bem diretos, um impedimento algo que est servindo como obstculo (ou barreira) para que algum trabalho acontea, sendo que a principal caracterstica dos impedimentos que os mesmos atrapalham ou atrasam o alcance de uma meta. Tipicamente um impedimento s acontece em algo que j foi iniciado pelo time. Dessa forma, torna-se vital que a sua remoo seja gil e efetiva sobre o ponto de vista de soluo para as causas razes. Outra ideia muito interessante que pelo ponto de vista de um lder verdadeiramente servidor, um impedimento tambm sinaliza que necessria alguma ao de sua parte, pois algum est pedindo ajuda para a remoo do impedimento.

Resumindo o Coaching em alguns passos


Nesse artigo, j aprendemos diferentes aspectos sobre o processo de Coaching. Mas para reforar e consolidar como se integram muitas dessas ideias at aqui apresentadas, vamos realizar agora uma espcie de passo a passo sobre o processo de Coaching aplicvel a qualquer contexto (inclusive em equipes geis).

Nojo A melhor reao aos impedimentos


O fato de identificarmos os tipos de impedimentos no significa que os mesmos devam ser aceitos como algo bom ou natural ao processo. Na verdade os impedimentos evidenciam problemas srios na estrutura da equipe, problemas na qualidade dos processos e na qualidade dos produtos gerados. Impedimentos tambm sinalizam que h desperdcios, pois alm de gerar pausas e esperas pode gerar multitarefa das atividades em execuo, e isso deveras nocivo porque estimula um consumo inapropriado de energia da equipe durante o esforo para remoo dos impedimentos.

Da natureza dos impedimentos


Para estimular aes assertivas de preveno ou remoo dos impedimentos, importante que cada time conhea quais

Edio 80 Java Magazine

53

Coaching e Facilitao de Times geis

Observamos na Figura 3 que o processo de Coaching inicia quando um indivduo (que se tornar um Coachee) possui um sonho (que se tornar uma meta). Em seguida, assim como exibido na Figura 4, acontece o entendimento da realidade atual e de quo difcil ou fcil ela possa parecer para o Coachee. As Figuras 5 e 6 mostram como que atravs do processo de Coaching, o Coach ajuda o Coachee a buscar novos ngulos de viso e novos pensamentos (inclusive crenas) sobre a sua realidade. Uma vez munido de novos pensamentos, assim como exibe a Figura 7, o Coachee comea a visualizar como e quando trilhar o caminho rumo a uma meta. Uma vez o caminho esboado, a Figura 8 mostra que o Coach ajudar o Coachee a fazer a caminhada em direo ao seu objetivo. importante destacar tambm que essa atuao do Coach estimular uma aprendizagem contnua no Coachee, atravs dos seus erros e acertos durante o caminho, de maneira que esse fluxo contnuo seja efetivo at o alcance da meta final.

Figura 3. Um Coachee com senso de responsabilidade sobre uma meta

Figura 4. Como a percepo da realidade por um Coachee

Concluses
Vamos concluir essa matria no somente fazendo um resumo dos fundamentos apresentadas at aqui, mas relatando uma ideia complementar, que pode sumarizar muito bem o foco central do artigo. Essa ideia, inicialmente proposta por Anthony Grant e Jane Greene, no livro Coach Yourself: Make Real Changes In Your Life, chamada de House of Change (ou Casa da Mudana). Ela parte da analogia de que h vrias formas de entrar numa casa (por exemplo: pelas portas, janelas, chamins, etc.). com essa analogia que o processo de Coaching pode ser usado para gerar mudanas num indivduo ou equipe, pois para ajudar um Coachee a alcanar uma meta, um Coaching contribui com mudanas em campos como: Pensamentos, Sentimentos, Situaes e Comportamentos, que devidamente interelacionados e alicerados nos Valores e Propsitos, podem auxiliar um indivduo a chegar com sucesso ao objetivo almejado.

Figura 5. O Coach estimulando o Coachee a olhar por um novo ngulo para o problema

Figura 6. O Coachee com uma compreenso diferente a partir do seu novo ngulo de viso

54 Java Magazine Edio 80

Livros
SENGE, Peter M. A Quinta disciplina, Editora Best Seller. WHITMORE, John Coaching for Performance, 4 Edio. GALLWEY, W. Timothy The Inner Game of Tennis: The Classic Guide to the Mental Side of Peak Performance, Random House Trade Paperbacks. GRANT, Anthony; GREENE, Jane Coach Yourself: Make Real Changes In Your Life, Momentum Wcze; 2 Edio. GRANT, Anthony; GREENE, Jane Solution-

Figura 7. Viso do caminho traado pelo Coachee

focused Coaching: Managing People in a Complex World, Chartered Institute of Personnel and Development. MARTIN, ngeles Manual Prtico de Psicoterapia Gestalt, Vozes Editora. COLMAN, Andrew M. Oxford Dictionary of Psychology, Oxford University Press.

http://visaoagil.wordpress.com/ MEDEIROS, Manoel Pimentel Blog Viso gil: Artigo Empatia A sua chance para uma boa liderana. http://visaoagil.wordpress.com/ MEDEIROS, Manoel Pimentel Blog Viso gil: Os 6 Chapus do Pensamento para facilitao de equipes.
Figura 8. Continuao do processo de Coaching atravs dos ciclos de aprendizagem rumo a uma meta Ento disso que Coaching trata: ajudar um indivduo ou equipe num processo de mudana para chegar a uma meta. Esse processo de mudana gera uma necessidade de ter uma performance melhor e, para ter uma performance melhor, necessrio desenvolver um aprendizado sobre uma nova forma de pensar, de sentir e principalmente de agir. Manoel Pimentel Medeiros manoel@visaoagil.com Engenheiro de Software, com 15 anos na rea de TI. Trabalha como Coach (PPC) em Agile para empresas do segmento de servio, financeiro e bancrio. Diretor Editorial da Revista Viso gil. J escreveu sobre Agile e Coaching para portais e revistas do Brasil e exterior e tambm palestrou em eventos nacionais e internacionais sobre agilidade. Possui as certificaes PPC da SBC, CSM e CSP da Scrum Alliance.

www.sbccoaching.com.br Sociedade Brasileira de Coaching.

D seu feedback sobre esta edio! A Java Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o que voc, leitor, acha da revista!
D s

Feedback eu
sobre e s

D seu voto sobre este artigo, atravs do link:

www.devmedia.com.br/javamagazine/feedback

Edio 80 Java Magazine

edio ta

55

Seo boaS PrticaS: NeSta Seo voc eNcoNtra artigoS Sobre tcNicaS que Podero aumeNtar a

OSGi com Spring Dynamic


O
OSGi uma tecnologia para criao de softwares modulares em Java que possibilita a criao de mdulos coesos e que disponibiliza uma forma desses mdulos se comunicarem. Os mdulos, em OSGi, so chamados de bundles e so, basicamente, arquivos JAR com algumas informaes adicionais em seu MANIFEST.MF, como um nome, sua verso, os pacotes que ele importa de outros bundles ou que ele exporta para outros bundles, dentre outras. Todos esses bundles ficam em um continer OSGi, no qual permanecem durante todo o seu ciclo de vida. Existem diversas implementaes de contineres no mercado, sendo as mais famosas o Equinox, da fundao Eclipse, e o Felix, da Apache. Com o OSGi, possvel instalar, atualizar e desinstalar os mdulos de uma aplicao sem precisar par-la. Isso torna possvel, por exemplo, atualizar parte de um sistema web rodando em um servidor, seja para incluir novos recursos ou corrigir bugs, sem afetar nenhuma das outras partes e sem precisar parar o servidor. Alm disso, sistemas desktop podem baixar suas atualizaes e instal-las sem precisar interromper o usurio. Adicionalmente, o OSGi possui um modelo de programao no qual um bundle pode publicar servios que podem ser consumidos por outros bundles. Toda a comunicao entre eles se d atravs desses servios, de modo que o acoplamento entre os mdulos o mais baixo possvel. Quando estamos programando com OSGi, o nosso trabalho , basicamente, criar os mdulos, definir os seus servios, publicar esses servios e consumir os servios de outros mdulos. Tudo isso feito com o auxlio da API do OSGi e de algumas classes especiais que controlam o ciclo de vida dos bundles.

Facilitando a criao de softwares modul


Resumo DevMan
De que se trata o artigo:
O artigo trata do desenvolvimento de aplicaes modulares desktop com OSGi utilizando o framework Spring Dynamic Modules e a plataforma OSGi Equinox.

Para que serve:


O Spring DM simplifica o desenvolvimento de aplicaes modulares, facilitando a publicao e o consumo de servios atravs da utilizao de poucas linhas de XML.

Em que situao o tema til:


O Spring DM bastante til para o desenvolvimento de aplicaes modulares com OSGi, tanto por facilitar o desenvolvimento quanto por possibilitar utilizar todos os recursos do Spring Framework nos bundles OSGi.

OSGi com Spring Dynamic Modules Parte 1:


Neste artigo discutido o desenvolvimento de aplicaes modulares com OSGi utilizando o framework Spring Dynamic Modules. Esse framework facilita o desenvolvimento dos mdulos na medida em que simplifica a publicao e o consumo de servios pelos bundles. Com o Spring DM, essas atividades so feitas de forma declarativa atravs do arquivo de configurao XML do Spring Framework, de forma que a aplicao no fica dependente da API do OSGi.

Para simplificar o desenvolvimento de softwares com OSGi, a SpringSource criou o framework Spring Dynamic Modules, tambm conhecido como Spring DM, que funciona dentro do continer OSGi facilitando o registro e consumo de servios, alm de prover aos bundles um mecanismo de injeo de dependncias e todos os demais recursos que o Spring Framework possui. Este artigo o primeiro de um conjunto de dois artigos que tem como objetivo apresentar o Spring Dynamic Modules e mostrar como ele facilita o desenvolvimento de software com OSGi, tanto em aplicaes desktop quanto em aplicaes web. Para isto, assumimos que o leitor j possui um conhecimento mnimo da tecnologia OSGi. Se no for o caso, recomendamos a leitura do livro OSGi in Practice, que est licenciado sob a Creative Commons e cujo

endereo para download pode ser encontrado na seo Links ao final do artigo. Um certo conhecimento do mecanismo de injeo de dependncias do Spring tambm desejvel.

Spring Dynamic Modules


O Spring Dynamic Modules um projeto da SpringSource que tem como objetivo simplificar o desenvolvimento de softwares modulares com OSGi. Ele permite que servios OSGi sejam publicados e consumidos utilizando algumas simples linhas de XML, o que torna um bundle OSGi totalmente independente da API do OSGi. Isso significa que no haver mais a necessidade de se criar classes que implementam a interface BundleActivator, no ser mais necessrio utilizar o BundleContext, os ServiceTrackers e as ServiceReferences para trabalhar com servios, e que os ServiceTrackerCustomizers

56 Java Magazine Edio 80

qualidade No deSeNvolvimeNto de Software

lares com Java


tambm no sero mais necessrios para observar eventos relacionados a publicao de servios. Alm disso, com o Spring Dynamic Modules, possvel utilizar todos os recursos do Spring Framework em um bundle OSGi. Para utilizar o Spring Dynamic Modules interessante que se tenha algum conhecimento do mecanismo de injeo de dependncias do Spring. Assim, o leitor deve estar familiarizado com os arquivos applicationContext.xml que servem para definir os beans gerenciados pelo Spring e suas dependncias. No Spring Dynamic Modules, o arquivo XML de configurao do Spring est localizado dentro do diretrio META-INF/spring, podendo ter qualquer nome. Para publicar um servio, utilizaremos a tag <osgi:service/>, especificando qual o bean do Spring implementa esse servio e qual a interface do servio. Feito isso, o Spring DM criar uma instncia do bean do Spring e o publicar no registro de servios OSGi sob a interface informada na tag. Para consumir um servio, utilizamos a tag <osgi:reference/>, na qual setamos um id para a referncia ao servio e a interface do mesmo que se deseja utilizar. Aps isso, podemos injetar o servio em qualquer bean do Spring como se ele fosse um outro bean qualquer. Para realizar essa injeo, pode-se utilizar tanto a configurao com XML, atravs das tags <property/> ou <constructor-arg/> do Spring, quanto com anotaes, utilizando @Resource, por exemplo. Quando utilizamos essas tags, o Spring DM automaticamente cria proxies para os servios OSGi de forma que esses servios possam ser publicados ou buscados em tempo de execuo. Se um servio desaparece, o proxy para o servio ir esperar

Modules Parte 1
david Pereira
que ele reaparea para poder utiliz-lo. Quando um bundle iniciado, o Spring DM cria o application context especificado pelos arquivos XML de configurao, cria proxies para os servios e publica esses servios no registro de servios OSGi. Quando um bundle parado, o Spring DM cancela quaisquer servios publicados por esse bundle e fecha o seu application context. Dessa forma, possvel trabalhar com OSGi praticamente de forma transparente, sem conhecer os detalhes de como ele funciona internamente. A seguir, mostraremos como criar aplicaes OSGi utilizando o Spring Dynamic Modules. Neste primeiro artigo sero criadas apenas aplicaes desktop, enquanto que no segundo artigo apresentaremos a implementao de aplicaes web, de forma que ser possvel ver o potencial do Spring Dynamic Modules em diversas situaes de criao de aplicaes modulares.

Utilize a modularizao de forma facilitada e sem acoplar sua aplicao ao framework OSGi com o uso do Spring Dynamic Modules

automaticamente a implantao dos bundles e execut-los dentro da prpria IDE, alm da possibilidade de realizar depurao de cdigo. Apesar de usarmos o Eclipse, possvel desenvolver aplicaes OSGi em qualquer ambiente de desenvolvimento.
Uma sugesto utilizar a SpringSource Tool Suite (STS), uma IDE baseada no Eclipse e mantida pela SpringSource, empresa criadora do Spring Framework. Ela contm todas as ferramentas necessrias para trabalhar com o Spring, o Spring Dynamic Modules e os demais projetos da SpringSource. Esta ferramenta pode ser baixada atravs do endereo disponvel na seo Links. Caso no deseje utilizar a STS, o plugin Spring IDE para Eclipse tambm uma boa opo, por facilitar o trabalho com o framework Spring, porm, apesar de possuir funcionalidades interessantes, o Spring IDE no possui todos os recursos da STS.

Desenvolvendo aplicaes modulares OSGi e Spring DM


Veremos agora como criar aplicaes modulares com OSGI e Spring Dynamic Modules. Inicialmente, apresentaremos como configurar o ambiente de desenvolvimento para trabalhar com OSGi e, em seguida, vamos implementar dois exemplos: primeiro, um Hello, World!, para mostrar como configurar o Spring DM e, em seguida, um exemplo mais completo, que utiliza diversos recursos do OSGi e do Spring DM.

Com o Eclipse aberto, vamos inicialmente importar os bundles do Spring e do Spring Dynamic Modules para utiliz-los em nossos projetos. Isso pode ser feito atravs da opo File > Import > Plug-in development > Plug-ins and Fragments. Em seguida, deve-se selecionar a opo Directory, na seo Import From, e escolher os bundles mostrados na Listagem 1. Esses bundles sero encontrados nos subdiretrios dist e lib do diretrio em que o arquivo baixado do site do Spring Dynamic Modules for descompactado.

Configurando o ambiente de desenvolvimento


Para o desenvolvimento dos exemplos deste artigo, utilizaremos a IDE Eclipse. Como o Eclipse construdo em cima de um continer OSGi, o Equinox, ele ir prover algumas facilidades que sero interessantes para agilizar o desenvolvimento, como fazer

Edio 80 Java Magazine Edio 80 Java Magazine

57 57

OSGi com Spring Dynamic Modules Parte 1

A importao desses bundles feita para que o Eclipse os implante no continer OSGi, tornando possvel que os demais bundles da aplicao utilizem os recursos importados. Em aplicaes OSGi, em vez de precisarmos adicionar arquivos JAR ao classpath, precisamos ter bundles ativos no continer. Por esse motivo, nem todo arquivo JAR pode ser utilizado em uma aplicao OSGi: ele teria que ser um bundle, contendo os cabealhos OSGi no MANIFEST.MF. A SpringSource mantm um grande repositrio contendo os JARs de diversos frameworks com esses cabealhos, portanto, se for necessrio utilizar em uma aplicao OSGi um outro framework como JavaServer Faces, Hibernate, ou mesmo um driver JDBC para um banco de dados, deve-se obter os jars fornecidos pela SpringSource. Aps a importao dos bundles, podemos criar os projetos, que devem ser do tipo Plug-in Project, atravs da opo File > New > Project > Plug-in Project. A escolha desse tipo de projeto devida ao fato de que os plugins do Eclipse tambm so mdulos OSGi, e criar um projeto do tipo Plug-in Project nos permitir executar o framework OSGi e o projeto sem a necessidade de sair da IDE. Para criar o projeto, necessrio escolher um nome e uma plataforma de execuo (Target Platform). A plataforma de execuo a ser escolhida a an OSGi Framework, normalmente o Equinox, que j vem com o Eclipse.

Listagem 1. Bundles utilizados no desenvolvimento com Spring Dynamic Modules.


com.springsource.org.aopalliance com.springsource.slf4j.api com.springsource.slf4j.log4j com.springsource.slf4j.org.apache.commons.logging org.springframework.aop org.springframework.beans org.springframework.context org.springframework.core org.springframework.osgi.core org.springframework.osgi.extender org.springframework.osgi.io org.springframework.osgi.log4j.osgi

Listagem 2. Hello, World! com Spring Dynamic Modules.


01. package br.com.javamagazine.osgi; 02. 03. public class HelloWorldDM { 04. 05. public void start() { 06. System.out.println(Hello, World!); 07. } 08. 09. public void stop() { 10. System.out.println(Good bye, World!); 11. } 12. 13. }

Listagem 3. Arquivo META-INF/spring/spring-config.xml.


01. <?xml version=1.0 encoding=UTF-8?> 02. <beans xmlns=http://www.springframework.org/schema/beans 03. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 04. xsi:schemaLocation=http://www.springframework.org/schema/beans 05. http://www.springframework.org/schema/beans/spring-beans.xsd> 06. 07. <bean id=helloWorld class=br.com.javamagazine.osgi.HelloWorldDM 08. init-method=start destroy-method=stop/> 09. 10. </beans>

O primeiro exemplo: um Hello, World!


Para iniciar o nosso primeiro exemplo, um Hello, World! OSGi com o Spring Dynamic Modules, criaremos um projeto chamado HelloSpringDM. Aps digitar o nome do projeto e escolher a plataforma de execuo, necessrio informar algumas propriedades do projeto, como o id do bundle, a sua verso e o seu nome. O id ser br.com.javamagazine.osgi.hellospringdm, a verso ser a 1.0.0 e o nome pode ser HelloSpringDM. Deve-se ainda desmarcar a opo Generate an Activator, pois os Activators (classes que recebem notificaes com relao a mudanas no estado de um bundle) no sero necessrios em projetos com o Spring Dynamic Modules.

Com o projeto criado, criaremos um pacote chamado br.com.javamagazine.osgi e, dentro dele, uma classe chamada HelloWorldDM. O contedo dessa classe pode ser visto na Listagem 2. Para que o exemplo funcione, necessrio configurar o Spring na aplicao. Essa configurao bastante simples: basta criar um diretrio chamado spring dentro do METAINF e, dentro dele, um arquivo XML de configurao do Spring. Nesse projeto, iremos criar o arquivo spring-config.xml, cujo contedo pode ser visto na Listagem 3. Neste arquivo, podemos ver a declarao de um bean do Spring entre as linhas 7 e 8. Esse bean tem como id helloWorld e do tipo br.com.javamagazine.osgi.HelloWorldDM. Alm disso, podemos ver outros dois atributos na declarao do bean: init-method e destroy-method. O init-method o nome do mtodo que ser chamado aps a criao do

bean, enquanto que destroy-method indica o nome do mtodo que ser chamado antes da destruio do bean. Colocamos nesses atributos os nomes dos mtodos start() e stop() da classe HelloWorldDM, de forma que o mtodo start() seja chamado quando o bean for criado e o mtodo stop() quando o bean for destrudo, isto , quando for removido do continer e coletado pelo coletor de lixo da JVM. Isso o suficiente para a criao do nosso Hello, World!. Para test-lo, devemos clicar com o boto direito do mouse no projeto e selecionar a opo Run As > OSGi Framework. Aps a inicializao do framework OSGi, os bundles sero iniciados. Quando o bundle que acabamos de criar for iniciado, dever aparecer o texto Hello, World! no console e, em seguida, o prompt de comando OSGi, conforme podemos ver na Listagem 4.

58 Java Magazine Edio 81

Podemos agora testar o caso em que o destroy-method chamado, parando o nosso bundle. Para isso, devemos verificar qual o id do bundle que criamos atravs do comando ss do Equinox. Aps descobrir o id, devemos utilizar o comando stop id para parar o bundle. Ao par-lo, o mtodo stop() do bean helloWorld ser executado, de forma que o texto Good bye, World! ser exibido no console. Esse processo pode ser visto na Listagem 5. Neste exemplo foi possvel entender como criar projetos OSGi com o Spring Dynamic Modules e como configurar o Spring nesses projetos. A seguir, veremos como possvel realizar a comunicao entre bundles, ou seja, a criao e utilizao de servios OSGi, atravs do Spring Dynamic Modules.

Listagem 4. Execuo do exemplo.


Hello, World! osgi>

Listagem 5. Parando o bundle.


osgi> ss Framework is launched. id 0 ... 726 ... State ACTIVE ... ACTIVE ... Bundle system.bundle_3.2.2.R32x_v20070118 ... br.com.javamagazine.osgi.helloworld_1.0.0 ...

osgi> stop 726 Good bye, World! osgi>

Listagem 6. Cdigo da interface CanalEnvioMensagens.


01. public interface CanalEnvioMensagens { 02. 03. public String enviar(String mensagem); 04. 05. }

Um exemplo mais completo


O prximo exemplo ser um pouco mais complexo e ir utilizar mais recursos do OSGi e do Spring Dynamic Modules. O exemplo ser um servio de envio de mensagens. Nele, teremos uma interface grfica com um campo de texto para digitar uma mensagem, que poder ser enviada atravs de um canal como, por exemplo, e-mail, SMS, twitter, etc. Os canais para o envio de mensagens, bem como a interface grfica, sero bundles que precisaro se comunicar para funcionar corretamente, de forma que poderemos agora estudar a utilizao de servios OSGi no Spring Dynamic Modules. Cada bundle ser representado por um projeto do tipo Plug-in Project do Eclipse, portanto teremos, neste exemplo, seis projetos: o MensagensCore, que contm as informaes bsicas que sero utilizadas por todos os outros bundles; o MensagensGui, que contm a interface grfica; e os projetos CanalEmail, CanalSms e CanalTwitter, que sero os trs canais para envio de mensagens. A lista dos projetos criados pode ser vista na Figura 1. Para comear, vamos criar o projeto MensagensCore, cujo id do bundle ser br.com. javamagazine.osgi.mensagenscore. Esse projeto conter os recursos fundamentais para utilizao do servio de mensagens e, como j informamos, ser utilizado pelos demais bundles. Comecemos pela

criao da interface CanalEnvioMensagens, no pacote br.com.javamagazine.mensagens. core, que ser implementada pelos canais para envio das mensagens. Essa interface possui um mtodo chamado enviar() que recebe uma String como parmetro e retorna uma String representando o resultado do envio. O cdigo dessa interface pode ser visto na Listagem 6. Aps a implementao da interface no projeto MensagensCore, vamos criar outro projeto, chamado CanalEmail, cujo id do bundle ser br.com.javamagazine.osgi. canalemail, e que conter o canal para envio das mensagens atravs de e-mail. Nesse projeto, criaremos a classe CanalEmail, que implementar a interface CanalEnvioMensagens, dentro do pacote br.com.javamagazine. mensagens.email. Quando criamos essa classe, a primeira coisa que percebemos que no possvel implementar a interface CanalEnvioMensagem porque ela no encontrada pelo compilador. Isso acontece porque, para que um bundle OSGi enxergue classes de outro bundle, necessrio declarar os pacotes dessas classes utilizando a propriedade Import-Package no MANIFEST.MF. Alm disso, necessrio que, no bundle que ter suas classes enxergadas por outros, exista uma propriedade chamada Export-Package

Figura 1. Lista com os projetos criados para este exemplo no MANIFEST.MF. Assim, adicionamos o pacote br.com.javamagazine.mensagens.core no Export-Package do projeto MensagensCore e no Import-Package do projeto CanalEmail. No Eclipse, possvel fazer a exportao dos pacotes clicando duas vezes no MANIFEST. MF e acessando a aba Runtime. Na seo Export Packages, deve-se adicionar o pacote desejado. Da mesma forma, para importar pacotes, deve-se clicar no MANIFEST.MF, acessar a aba Dependencies e adicionar o pacote desejado na seo Import Packages. Os MANIFEST.MF dos projetos MensagensCore e CanalEmail devem ficar conforme as Listagens 7 e 8, respectivamente. Com as dependncias entre os bundles devidamente configuradas, devemos concluir a implementao da classe CanalEmail. Aps implementar a interface CanalEnvioMensagens, criamos o mtodo enviar() e, em sua implementao, retornamos uma String para informar que a mensagem est sendo

Edio 81 Java Magazine

59

OSGi com Spring Dynamic Modules Parte 1

enviada por e-mail. O contedo da classe CanalEmail pode ser visto na Listagem 9. Com a classe CanalEmail pronta, o que devemos fazer exp-la como um servio OSGi. No OSGi sem o Spring DM, o que deveramos fazer chamar o mtodo registerService() da classe BundleContext no Activator do bundle, mas o Spring Dynamic Modules facilita as coisas para a gente. Assim como fizemos no exemplo anterior, devemos configurar o Spring para esse bundle. Deste modo, criamos um diretrio chamado spring dentro do META-INF e, dentro dele, criamos um arquivo de configurao do Spring chamado bundle-context. xml, que pode ser visto na Listagem 10. Nesse arquivo fazemos duas coisas: declaramos um bean do Spring do tipo CanalEmail, na linha 10, e declaramos um servio OSGi atravs da tag <osgi:service/>, nas linhas 12 e 13. A tag <osgi:service/> possui dois atributos que foram utilizados no exemplo, o atributo ref, que se refere ao id do bean do Spring que contm a implementao do servio, e interface, que o nome completo da interface do servio que ser exposto. Para concluir a primeira etapa do exemplo, vamos criar o projeto MensagensGui, que ter como id do bundle br.com.javamagazine. osgi.mensagensgui e conter a interface grfica utilizada para o envio das mensagens. Dentro do projeto, criaremos a classe JanelaEnvioMensagens, no pacote br.com. javamagazine.mensagens.gui. Essa classe, que se encontra exibida na Listagem 11, estende a classe javax.swing.JFrame e possui trs atributos: canal, do tipo CanalEnvioMensagens (linha 3); mensagem, do tipo JTextField (linha 4), utilizado pelo usurio para digitar a mensagem que ser enviada; e enviar, do tipo JButton (linha 5), no qual o usurio clicar para enviar a mensagem. No construtor da classe os componentes do Swing so configurados e, entre as linhas 16 e 20, adicionamos um tratamento de eventos no boto enviar para que, quando um usurio o clique, o mtodo enviar() do canal seja chamado recebendo como parmetro o texto digitado no campo mensagem. Temos ainda, entre as linhas 26 e 28, o mtodo setCanal(), que ser utilizado para que o Spring injete na JanelaEnvioMensagens o canal que ser utilizado para envio de mensagens.

Listagem 7. MANIFEST.MF do projeto MensagensCore.


Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: MensagensCore Bundle-SymbolicName: br.com.javamagazine.osgi.mensagenscore Bundle-Version: 1.0.0 Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Export-Package: br.com.javamagazine.mensagens.core

Listagem 8. MANIFEST.MF do projeto CanalEmail.


Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: CanalEmail Bundle-SymbolicName: br.com.javamagazine.osgi.canalemail Bundle-Version: 1.0.0 Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Import-Package: br.com.javamagazine.mensagens.core

Listagem 9. Cdigo da classe CanalEmail.


01. public class CanalEmail implements CanalEnvioMensagens { 02. 03. public String enviar(String mensagem) { 04. return Enviando por e-mail: + mensagem; 05. } 06. 07. }

Listagem 10. Configurao do Spring para o projeto CanalEmail.


01. <?xml version=1.0 encoding=UTF-8?> 02. <beans xmlns=http://www.springframework.org/schema/beans 03. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 04. xmlns:osgi=http://www.springframework.org/schema/osgi 05. xsi:schemaLocation=http://www.springframework.org/schema/beans 06. http://www.springframework.org/schema/beans/spring-beans.xsd 07. http://www.springframework.org/schema/osgi 08. http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd> 09. 10. <bean id=canalEmail class=br.com.javamagazine.mensagens.email.CanalEmail/> 11. 12. <osgi:service ref=canalEmail 13. interface=br.com.javamagazine.mensagens.core.CanalEnvioMensagens/> 14. 15. </beans>

Agora devemos configurar o Spring nesse projeto (MensagensGui) para que o servio que foi exportado no projeto CanalEmail seja utilizado nesse bundle e que esse servio seja injetado na janela para envio de mensagens. Para isso, novamente criamos um arquivo de configurao do Spring, conforme mostrado na Listagem 12. Nele, utilizamos a tag <osgi:reference/> para utilizar um servio OSGi que implemente a interface cujo nome foi passado para o atributo interface. Adicionalmente, criamos um bean do tipo JanelaEnvioMensagens e injetamos em seu atributo canal a referncia ao servio de envio de mensagens. Com tudo isso pronto, podemos rodar o nosso exemplo clicando com o boto direito em algum dos projetos e selecio-

nando a opo Run as > OSGi Framework. Ao fazer isso, a janela exibida na Figura 2 aparecer para o usurio. Quando digitarmos a mensagem Ol, Java Magazine!, a mensagem Enviando por e-mail: Ol, Java Magazine! ser exibida para o usurio em uma janela de alerta.

Figura 2. Interface grfica para envio de mensagens Vamos agora criar um novo canal para envio de mensagens e ver o que acontecer ao tentarmos enviar outra mensagem. Para isso, definiremos mais um projeto, cha-

60 Java Magazine Edio 81

mado CanalSms, com id do bundle igual a br.com.javamagazine.osgi.canalsms. Nesse projeto criamos a classe CanalSms, que implementa a interface CanalEnvioMensagens e criamos a configurao do Spring, exportando o CanalSms como um servio OSGi, exatamente como fizemos para o projeto CanalEmail. Os cdigos da classe CanalSms e do arquivo de configurao do Spring podem ser vistos nas Listagens 13 e 14, respectivamente. Novamente executamos o exemplo para que o bundle que acabamos de criar seja implantado no continer OSGi. Quando digitarmos Ol, Java Magazine! na interface grfica e clicarmos no boto Enviar, aparecer novamente a mensagem Enviando por e-mail: Ol, Java Magazine! para o usurio. Percebemos ento que o servio de SMS no foi utilizado, pois temos dois servios que implementam a mesma interface, e a tag <osgi:reference/>, utilizada para consumir o servio, ir selecionar o servio que tiver o maior ranking. Caso os dois servios tenham o mesmo ranking, o servio com menor id no continer OSGi ser utilizado. Como no definimos o ranking ao declarar os servios OSGi, ambos ficaram com o valor padro, ou seja, zero, e como CanalEmail foi implantado no continer anteriormente, ele possui menor id, portanto ser o servio utilizado pela interface grfica para envio de mensagens. possvel alterar o valor do ranking dos servios atravs do atributo ranking da t ag <osgi:ser vice/>, c o m o m o s t r a d o n a L i s t a g e m 1 5, na qual possvel ver a alterao desse atributo para 1 no servio de SMS. Dessa vez, quando executarmos o exemplo e digitarmos Ol, Java Magazine!, a mensagem Enviando por SMS: Ol, Java Magazine! ser exibida para o usurio. Para verificarmos a situao do continer OSGi, podemos utilizar o comando ss, como j fizemos anteriormente. Com isso, veremos os ids dos bundles instalados, de acordo com a Listagem 16. Se pararmos o bundle br.com.javamagazine.osgi.canalsms atravs do comando stop 1611, por exemplo, e digitarmos uma mensagem na interface grfica, veremos que a mensagem ser enviada por e-mail. Dessa maneira, podemos

Listagem 11. Interface grfica para envio de mensagens.


01. public class JanelaEnvioMensagens extends JFrame { 02. 03. private CanalEnvioMensagens canal; 04. private JTextField mensagem; 05. private JButton enviar; 06. 07. public JanelaEnvioMensagens() { 08. setTitle(Spring Dynamic Modules); 09. setSize(350, 100); 10. setLayout(new GridLayout(2, 1)); 11. 12. mensagem = new JTextField(); 13. add(mensagem); 14. 15. enviar = new JButton(Enviar); 16. enviar.addActionListener(new ActionListener() { 17. public void actionPerformed(ActionEvent e) { 18. JOptionPane.showMessageDialog(null, canal.enviar(mensagem.getText())); 19. } 20. }); 21. add(enviar); 22. 23. setVisible(true); 24. } 25. 26. public void setCanal(CanalEnvioMensagens canal) { 27. this.canal = canal; 28. } 29. 30. }

Listagem 12. Configurao do Spring no projeto MensagensGui.


01. <?xml version=1.0 encoding=UTF-8?> 02. <beans xmlns=http://www.springframework.org/schema/beans 03. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 04. xmlns:osgi=http://www.springframework.org/schema/osgi 05. xsi:schemaLocation=http://www.springframework.org/schema/beans 06. http://www.springframework.org/schema/beans/spring-beans.xsd 07. http://www.springframework.org/schema/osgi 08. http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd> 09. 10. <bean id=janela class=br.com.javamagazine.mensagens.gui.JanelaEnvioMensagens> 11. <property name=canal ref=canal/> 12. </bean> 13. 14. <osgi:reference id=canal 15. interface=br.com.javamagazine.mensagens.core.CanalEnvioMensagens/> 16. 17. </beans>

Listagem 13. Cdigo da classe CanalSms.


01. public class CanalSms implements CanalEnvioMensagens { 02. 03. public String enviar(String mensagem) { 04. return Enviando por SMS: + mensagem; 05. } 06. 07. }

perceber que foi possvel trocar a forma de enviar as mensagens sem precisar parar a aplicao. E se quisermos enviar a mensagem por mltiplos canais? O que precisaramos fazer? Vimos que a tag <osgi:reference/> traz uma referncia a um nico servio, de forma que no seria possvel realizar essa

tarefa com essa tag. Para isso, utilizaremos uma nova tag, a <osgi:list/>. A tag <osgi:list/> funciona de forma idntica tag <osgi:reference/>, ou seja, passando um id para o servio (ou conjunto de servios) e a interface que os servios devem implementar. Diferentemente da <osgi:reference/>, <osgi:list/> no ir nos

Edio 81 Java Magazine

61

OSGi com Spring Dynamic Modules Parte 1

fornecer um objeto com o servio que buscvamos, mas sim uma List contendo objetos referentes a todos os servios que implementam a interface solicitada. Se desejarmos um Set, em vez de uma List, podemos utilizar ainda a tag <osgi:set/>. Ento vamos modificar o nosso exemplo para que ele suporte o envio por vrios canais de mensagem. Assim sendo, devemos modificar a classe JanelaEnvioMensagens para que ela no tenha apenas um canal, mas sim uma lista de canais, e para que a ao de clicar no boto Enviar percorra a lista de canais e chame o mtodo enviar() de cada um deles. Ser necessrio ainda modificar a configurao do Spring para substituir o <osgi:reference/> por <osgi:list/>. O resultado dessa modificao pode ser visto nas Listagens 17 e 18. Ao executarmos o exemplo agora, veremos que se digitarmos uma mensagem aparecero duas mensagens para o usurio, uma referente ao envio por e-mail e outra referente ao envio por SMS. Se digitarmos, por exemplo, a mensagem Testando envio..., ser exibida a caixa de dilogo da Figura 3.

Para finalizar o exemplo, vamos imaginar a seguinte situao: e se quisermos selecionar na interface grfica por quais
Listagem 14. Configurao do Spring para o projeto CanalSms.

canais queremos enviar as mensagens? Teremos ento que fazer algumas modificaes nos projetos: o canal de envio de

01. <?xml version=1.0 encoding=UTF-8?> 02. <beans xmlns=http://www.springframework.org/schema/beans 03. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 04. xmlns:osgi=http://www.springframework.org/schema/osgi 05. xsi:schemaLocation=http://www.springframework.org/schema/beans 06. http://www.springframework.org/schema/beans/spring-beans.xsd 07. http://www.springframework.org/schema/osgi 08. http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd> 09. 10. <bean id=canalSms class=br.com.javamagazine.mensagens.sms.CanalSms/> 11. 12. <osgi:service ref=canalSms 13. interface=br.com.javamagazine.mensagens.core.CanalEnvioMensagens/> 14. 15. </beans>

Listagem 15. Mudando o ranking do servio de SMS.


<osgi:service ref=canalSms ranking=1 interface=br.com.javamagazine.mensagens.core.CanalEnvioMensagens/>

Listagem 16. Listagem dos bundles aps a criao do CanalSms.


Framework is launched. id State Bundle 0 ACTIVE org.eclipse.osgi_3.5.1.R35x_v20090827 2 ACTIVE br.com.javamagazine.osgi.canalemail_1.0.0 3 ACTIVE br.com.javamagazine.osgi.mensagenscore_1.0.0 4 ACTIVE br.com.javamagazine.osgi.mensagensgui_1.0.0 ... ... ... 1611 ACTIVE br.com.javamagazine.osgi.canalsms_1.0.0

Listagem 17. Classe JanelaEnvioMensagens com modificaes para mltiplos canais.


01. public class JanelaEnvioMensagens extends JFrame { 02. 03. private List<CanalEnvioMensagens> canais; 04. private JTextField mensagem; 05. private JButton enviar; 06. 07. public JanelaEnvioMensagens() { 08. setTitle(Spring Dynamic Modules); 09. setSize(350, 100); 10. setLayout(new GridLayout(2, 1)); 11. 12. mensagem = new JTextField(); 13. add(mensagem); 14. 15. enviar = new JButton(Enviar); 16. enviar.addActionListener(new ActionListener() { 17. public void actionPerformed(ActionEvent e) { 18. StringBuilder resultado = new StringBuilder(); 19. for (CanalEnvioMensagens canal : canais) { 20. resultado.append(canal.enviar(mensagem.getText()) + \n); 21. } 22. JOptionPane.showMessageDialog(null, resultado); 23. } 24. }); 25. add(enviar); 26. 27. setVisible(true); 28. } 29. 30. public void setCanais(List<CanalEnvioMensagens> canais) { 31. this.canais = canais; 32. } 33. 34. }

Figura 3. Caixa de dilogo informando envio por e-mail e SMS Se criarmos um novo projeto para outro canal de envio de mensagens, digamos, CanalTwitter, para envio de mensagens para o Twitter, veremos que a mensagem seria enviada aos trs canais, conforme pode ser verificado na Figura 4. Se quisermos ativar ou inativar quaisquer dos canais para envio de mensagens, basta que iniciemos ou paremos um bundle atravs do console OSGi.

Figura 4. Caixa de dialogo informando envio por e-mail, SMS e Twitter

62 Java Magazine Edio 81

mensagens dever ter um atributo que informe se ele est apto ou no a enviar mensagens e a interface grfica dever possuir um conjunto de checkboxes para que o usurio possa selecionar quais dos canais sero utilizados. Uma restrio importante que quando iniciarmos um novo servio do tipo CanalEnvioMensagens ou pararmos um dos servios existentes, a interface grfica dever ser atualizada e os checkboxes devero aparecer ou desaparecer de acordo com os canais que esto ativos no momento, tudo isso sem precisar parar a aplicao. Comearemos esse refactoring alterando a interface CanalEnvioMensagens, no projeto MensagensCore. A interface ganhar dois novos mtodos: getNome(), que retornar o nome do canal para que ele seja exibido na interface grfica; e setAtivo(), para setar se o canal poder enviar mensagens no momento ou no. O novo cdigo da interface pode ser vista na Listagem 19. Aps a realizao do refactoring em CanalEnvioMensagens, necessrio adequar as implementaes a essas alteraes. Assim, deveremos modificar as classes CanalEmail, CanalSms e CanalTwitter em seus respectivos projetos. Para isso, adicionamos em cada classe um atributo do tipo boolean chamado ativo, de forma que o mtodo setAtivo() ir setar o valor desse atributo. No mtodo getNome() retornamos uma String com o nome do canal e no mtodo enviar() adicionamos um teste, para que a mensagem s seja enviada caso o atributo ativo esteja setado como true. As implementaes das classes CanalEmail, CanalSms e CanalTwitter podem ser vistas nas Listagens 20, 21 e 22, respectivamente. Concluindo o refactoring, devemos modificar a interface grfica para suportar os novos requisitos. A primeira modificao ser com relao aos componentes da interface grfica. Adicionamos alguns labels, reposicionamos alguns componentes e adicionamos um JPanel para guardar o conjunto de checkboxes que ir representar os canais para envio de mensagens que esto disponveis no momento. Ser necessrio ainda mudar a forma de obter os canais para envio de mensagens. Como agora teremos que atualizar a lista de checkboxes cada vez que iniciarmos

Listagem 18. Configurao do Spring para o projeto MensagensGui com mltiplos canais.
01. <?xml version=1.0 encoding=UTF-8?> 02. <beans xmlns=http://www.springframework.org/schema/beans 03. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 04. xmlns:osgi=http://www.springframework.org/schema/osgi 05. xsi:schemaLocation=http://www.springframework.org/schema/beans 06. http://www.springframework.org/schema/beans/spring-beans.xsd 07. http://www.springframework.org/schema/osgi 08. http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd> 09. 10. <bean id=janelaEnvioMensagens class=br.com.javamagazine.mensagens.gui.JanelaEnvioMensagens> 11. <property name=canais ref=canais/> 12. </bean> 13. 14. <osgi:list id=canais interface=br.com.javamagazine.mensagens.core.CanalEnvioMensagens/> 15. 16. </beans>

Listagem 19. Interface CanalEnvioMensagens aps o refactoring.


01. public interface CanalEnvioMensagens { 02. 03. public String enviar(String mensagem); 04. 05. public String getNome(); 06. 07. public void setAtivo(boolean ativo); 08. 09. }

Listagem 20. Classe CanalEmail aps refactoring.


01. public class CanalEmail implements CanalEnvioMensagens { 02. 03. private boolean ativo; 04. 05. public String enviar(String message) { 06. if (ativo) 07. return Enviando por Email: + message; 08. return ; 09. } 10. 11. public void setAtivo(boolean ativo) { 12. this.ativo = ativo; 13. } 14. 15. public String getNome() { 16. return E-Mail; 17. } 18. 19. }

ou pararmos um canal, no poderemos mais simplesmente injetar a lista de canais na interface grfica. Dessa forma, iremos instanciar o atributo canais com um novo ArrayList e remover o mtodo setCanais(). Esse mtodo ser substitudo por dois novos mtodos, adicionarCanal() e removerCanal(), que devem receber como parmetro um objeto do tipo CanalEnvioMensagens e um mapa de propriedades. No utilizaremos esse mapa, mas ele ser necessrio, como veremos um pouco mais frente. Dentro dos mtodos adicionarCanal() e removerCanal() vamos adicionar ou remover o canal recebido como parmetro na lista de canais.

Ao adicionarmos ou removermos um canal devemos atualizar os checkboxes com os canais disponveis e, para isso, criaremos um mtodo chamado atualizaCanais() e cham-lo nos mtodos adicionarCanal() e removerCanal(). No atualizaCanais(), primeiro limpamos todos os checkboxes que estejam no panelCanaisDisponiveis e, em seguida, percorremos a lista de canais. Para cada canal, criamos um novo checkbox e adicionamos um tratamento de eventos, de forma que quando o checkbox seja marcado ou desmarcado, o mtodo setAtivo() do canal correspondente seja chamado, ativando ou inativando o envio das mensagens por esse canal. Aps criar o checkbox, o adicio-

Edio 81 Java Magazine

63

OSGi com Spring Dynamic Modules Parte 1

namos ao panelCanaisDisponiveis. Por fim, chamamos os mtodos revalidate() e repaint() do panelCanaisDisponiveis para que o painel seja redesenhado. O cdigo da classe JanelaEnvioMensagens aps essas modificaes pode ser visto na Listagem 23. Com essas modificaes, precisamos encontrar uma forma de escutar os eventos de iniciar ou parar um bundle no continer OSGi. Quando um bundle do tipo CanalEnvioMensagens for iniciado, devemos chamar o mtodo adicionarCanal(), e quando um bundle for parado, devemos chamar o mtodo removerCanal(). Para tratar esses eventos, editaremos o arquivo de configurao do Spring do projeto MensagensGui para colocar, dentro da tag <osgi:list/>, uma tag <osgi:listener/>, que escuta os eventos de iniciar ou parar um bundle. Dentro da tag <osgi:listener/> precisamos informar que bean est escutando esses eventos atravs do atributo ref e informar que mtodo deve ser chamado quando um bundle for iniciado ou parado, atravs dos atributos bind-method e unbind-method, respectivamente. No nosso exemplo, o bean que ir escutar os eventos ser janela e os mtodos chamados sero adicionarCanal() e removerCanal(). Como no iremos mais injetar a lista de canais na janela, podemos remover essa informao do arquivo de configurao do Spring. A nova configurao pode ser vista na Listagem 24. Com o refactoring concludo, podemos executar novamente o exemplo e ver os resultados das mudanas efetuadas. De cara, podemos notar as mudanas na interface grfica, que alm do campo de texto para digitao da mensagem e do boto para envio, possui um novo conjunto de componentes, dentre os quais destacamos os checkboxes com os nomes dos canais que esto ativos no continer OSGi. A nova interface grfica pode ser vista na Figura 5. Se digitarmos uma mensagem e clicarmos no boto enviar sem marcar nenhum dos checkboxes, verificamos que nenhuma confirmao de envio exibida. No entanto, se selecionarmos alguns canais de envio, as confirmaes de envio por esses canais sero exibidas ao usurio. Na Figura 6 podemos ver as mensagens

Listagem 21. Classe CanalSms aps refactoring


01. public class CanalSms implements CanalEnvioMensagens { 02. 03. private boolean ativo; 04. 05. public String enviar(String mensagem) { 06. if (ativo) 07. return Enviando por SMS: + mensagem; 08. return ; 09. } 10. 11. public void setAtivo(boolean ativo) { 12. this.ativo = ativo; 13. } 14. 15. public String getNome() { 16. return SMS; 17. } 18. 19. }

Listagem 22. Classe CanalTwitter aps refactoring.


01. public class CanalTwitter implements CanalEnvioMensagens { 02. 03. private boolean ativo; 04. 05. public String enviar(String mensagem) { 06. if (ativo) 07. return Enviando por Twitter: + mensagem; 08. return ; 09. } 10. 11. public String getNome() { 12. return Twitter; 13. } 14. 15. public void setAtivo(boolean ativo) { 16. this.ativo = ativo; 17. } 18. 19. }

exibidas ao usurio quando os canais de e-mail e Twitter so utilizados para enviar a mensagem O Spring DM deixa o OSGi muito mais fcil.

como a publicao e consumo de servios, alm da utilizao de listeners para observar eventos relacionados a esses servios.

Concluso
Neste artigo estudamos o desenvolvimento de aplicaes modulares com o Spring Dynamic Modules. O Spring DM facilita bastante a declarao e o consumo de servios com OSGi, alm de prover aos bundles todas as demais funcionalidades do Spring Framework e tornar a aplicao independente da API do OSGi. O Spring Dynamic Modules foi to bem aceito pela comunidade OSGi que na especificao 4.2 do OSGi ele foi incorporado plataforma atravs da RFC 124: A Component Model for OSGi, sendo nela chamado de Blueprint Service. Ao estudar o Blueprint, vemos que ele , essencialmente, o Spring DM, com apenas algumas mudanas de nomes.

Figura 5. Interface grfica aps realizao de refactoring

Figura 6. Mensagens exibidas ao utilizar os canais de envio por e-mail e Twitter Com isso conclumos o nosso exemplo. Atravs dele foi possvel estudar diversos recursos do Spring Dynamic Modules,

64 Java Magazine Edio 81

O OSGi vem sendo cada vez mais usado e a SpringSource tem investido bastante em ferramentas para facilitar o seu desenvolvimento. Vale a pena acompanhar
Listagem 23. Classe JanelaEnvioMensagens aps modificaes.

ainda a evoluo dos projetos SpringSource Bundlor, uma ferramenta para deteco automtica de dependncias e atualizao do MANIFEST.MF, e do

01. public class JanelaEnvioMensagens extends JFrame { 02. 03. private List<CanalEnvioMensagens> canais = new ArrayList<CanalEnvioMensagens>(); 04. 05. private JTextField mensagem; 06. private JButton enviar; 07. private JPanel panelCanaisDisponiveis; 08. 09. // Outros atributos 10. 11. public JanelaEnvioMensagens() { 12. // Configurao e posicionamento dos componentes 13. } 14. 15. public void adicionarCanal(CanalEnvioMensagens canal, Map<?, ?> properties) { 16. canais.add(canal); 17. atualizaCanais(); 18. } 19. 20. public void removerCanal(CanalEnvioMensagens canal, Map<?, ?> properties) { 21. canais.remove(canal); 22. atualizaCanais(); 23. } 24. 25. 26. private void atualizaCanais() { 27. panelCanaisDisponiveis.removeAll(); 28. 29. for (final CanalEnvioMensagens canal : canais) { 30. final JCheckBox checkBoxCanal = new JCheckBox(canal.getNome()); 31. checkBoxCanal.addChangeListener(new ChangeListener() { 32. public void stateChanged(ChangeEvent evt) { 33. canal.setAtivo(checkBoxCanal.isSelected()); 34. } 35. }); 36. panelCanaisDisponiveis.add(checkBoxCanal); 37. } 38. 39. panelCanaisDisponiveis.revalidate(); 40. panelCanaisDisponiveis.repaint(); 41. } 42. 43. }

SpringSource Tool Suite, uma IDE que, alm de diversos outros recursos, facilita a criao de projetos OSGi. No prximo artigo, falaremos sobre a criao de projetos web com OSGi e da utilizao do SpringSource dm Server, um servidor de aplicaes para aplicaes modulares. David Pereira david@j2eebrasil.com.br, www. j2eebrasil.com.br engenheiro de computao e mestre em engenharia eltrica pela UFRN. Trabalha como arquiteto de software na Superintendncia de Informtica da UFRN, professor da Faculdade Natalense para o Desenvolvimento do RN (FARN) e consultor independente em arquitetura de software e no Spring Framework.

osgi.org Site do OSGi Alliance, rgo que controla a especificao OSGi. springsource.org/osgi Site oficial do projeto Spring Dynamic Modules. njbartlett.name/downloads/osgibook_ preview_20090110.pdf Livro OSGi in Practice, licenciado sob a Creative Commons. springsource.com/products/sts Site da IDE SpringSource Tool Sute. springide.org/blog Site do plugin Spring IDE. springsource.org/bundlor Site do Projeto SpringSource Bundlor. celodemelo.wordpress.com/2009/11/12/ osgi-modularizando-sua-aplicacao Post em blog que inspirou o exemplo utilizado neste artigo.

Listagem 24. Adicionando o listener configurao do projeto MensagensGui.


01. <?xml version=1.0 encoding=UTF-8?> 02. <beans xmlns=http://www.springframework.org/schema/beans 03. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 04. xmlns:osgi=http://www.springframework.org/schema/osgi 05. xsi:schemaLocation=http://www.springframework.org/schema/beans 06. http://www.springframework.org/schema/beans/spring-beans.xsd 07. http://www.springframework.org/schema/osgi 08. http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd > 09. 10. <bean id=janela class=br.com.javamagazine.mensagens.gui.JanelaEnvioMensagens/> 11. 12. <osgi:list id=canais interface=br.com.javamagazine.mensagens.core.CanalEnvioMensagens> 13. <osgi:listener ref=janela bind-method=adicionarCanal unbind-method=removerCanal/> 14. </osgi:list> 15. 16. </beans>

D seu feedback sobre esta edio! A Java Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o que voc, leitor, acha da revista!
D s

Feedback eu
sobre e s

D seu voto sobre este artigo, atravs do link:

www.devmedia.com.br/javamagazine/feedback

Edio 81 Java Magazine

edio ta

65

Seo boaS PrticaS: NeSta Seo voc eNcoNtra artigoS Sobre tcNicaS que Podero aumeNtar a

Princpios, Padres e Prticas para


Aplicando princpios e padres de projeto alm do

om a grande demanda de profissionais por parte das empresas, muitos deles acabam sendo contratados sem ter o devido conhecimento sobre boas prticas de desenvolvimento de software, infraestrutura de desenvolvimento, protocolos de comunicao, sistemas gerenciadores de banco de dados e muitas vezes at conhecimento bsico sobre sistemas operacionais. Alm disso, dentro das empresas existe uma demanda cada vez maior por projetos de software de alta complexidade, com prazos de entrega na maioria das vezes fora da realidade. O que faz com que muitos projetos sejam entregues sem testes, com falhas de implementao, qualidade duvidosa e muitas vezes sem atender ao negcio do cliente. Como consequncia, aps implantado, o sistema passa a apresentar srios problemas como degradao da performance, perda de dados, clculos incorretos, entre outros problemas, trazendo grandes prejuzos empresa e fazendo com que os usurios percam a confiana no sistema e por fim os prprios desenvolvedores. Direcionado para este cenrio, o presente artigo visa demonstrar boas prticas de desenvolvimento de software e explicar os princpios fundamentais para se criar um bom design. Veremos tambm a aplicao de alguns padres de projeto pouco difundidos, mas que so de extrema importncia no dia a dia do desenvolvedor.

Resumo DevMan
De que se trata o artigo:
O artigo apresenta conceitos importantes relacionados arquitetura de software, destacando desde a sua concepo at a entrega do software, e abordando os tipos de arquitetura existentes, com nfase na arquitetura distribuda e na arquitetura em camadas.

Para que serve:


Serve para arquitetos, analistas e desenvolvedores que desejam conhecer mais sobre arquitetura de software e sobre como fazer uma separao de responsabilidades efetiva na criao das camadas fsicas e lgicas do sistema.

Em que situao o tema til:


O tema til para todo o desenvolvedor que deseja aprimorar suas tcnicas de programao (independente do framework escolhido) e para todo arquiteto que deseja conhecer mais sobre tipos de arquitetura e como aplicar uma arquitetura modular, visando boas prticas de design OO.

Princpios, Padres e Prticas para um Design gil Parte 1:


Princpios, padres e prticas para um design gil so importantes para construir um software de qualidade. Ao iniciar o desenvolvimento de um novo sistema, muitas vezes ficamos em dvida sobre qual o estilo de arquitetura utilizar. Para auxiliar nesta deciso, o artigo comenta sobre vrias opes de arquitetura, dando nfase arquitetura distribuda e suas camadas lgicas.

Estilos de Arquitetura
Quando vamos planejar o desenvolvimento de um software, geralmente um dos primeiros itens que o arquiteto de software comea a analisar qual o melhor estilo de arquitetura que se aplica ao contexto do projeto. Neste ponto ele leva em considerao diversos fatores, como os

requisitos do software, custo, infraestrutura e conhecimento tcnico da equipe. Entender o estilo arquitetural adotado para o desenvolvimento traz diversos benefcios para os desenvolvedores e para a empresa como um todo, entre eles: fornecer uma linguagem comum entre os desenvolvedores e os demais envolvidos no projeto. Por exemplo, quando o estilo de arquitetura SOA, os desenvolvedores podem at conversar com pessoas de outras reas, que no possuem conhecimento tcnico (como detalhes da linguagem de programao, servidores de aplicao, etc.), sobre o mtodo envolvido na automao dos processos de negcio, que as mesmas entendero sobre o que um servio, governana e, dependendo do usurio, at termos mais especficos, como escalabilidade.

A Tabela 1 apresenta um resumo dos principais estilos de arquitetura. Uma vez que o estilo de arquitetura definido, o passo seguinte definir como as funcionalidades do sistema sero divididas, de forma a manter em conjunto os componentes relacionados (alta coeso), e fazer com que estes possuam o mnimo de conhecimento sobre os outros componentes (baixo acoplamento). Para alcanar o baixo acoplamento e uma alta coeso importante entender o conceito de Separao de Responsabilidades.

Separao de Responsabilidades (Separation of Concerns)


O termo Separao de Responsabilidades foi criado pelo pai do algoritmo de caminho mnimo, o cientista Edsger W. Dijkstra em 1974, e tem como objetivo dividir a apli-

68 Java Magazine Edio 80

qualidade No deSeNvolvimeNto de Software

um Design gil Parte 1


GoF
Estilo de Arquitetura
Client-Server

Neste artigo veremos Aprenda como algumas prticas, gerenciar mudanas padres e princpios em arquiteturas de Design OO que formadas por auxiliam e muito a tecnologias Java vida do arquiteto/ desenvolvedor

wagNer roberto doS SaNtoS


Descrio
Tambm conhecida como arquitetura de duas camadas. Este tipo de arquitetura descreve a interao entre um ou mais clientes e um servidor, atravs de uma conexo de rede. A aplicao mais comum para esse tipo de arquitetura um Banco de Dados no lado do servidor com a lgica da aplicao representada em Stored Procedures, e o lado do Cliente representado por aplicaes conhecidas como Fat-Clients (Clientes Pesados), que muitas vezes contm a lgica de negcio embutida no front-end. Como exemplo, podemos citar aplicaes desenvolvidas com Delphi, Visual Basic, Oracle Forms, entre outros. Quando utilizamos uma arquitetura baseada em componentes, decompomos o design da aplicao em componentes lgicos com um fraco acoplamento, de forma que cada um deles seja individual e reutilizvel, com uma localizao transparente e interface de comunicao bem definida. Uma das grandes vantagens desse tipo de arquitetura que ela promove a reusabilidade dos componentes e facilita a manuteno da aplicao. De acordo com o prprio criador, Eric Evans, DDD no uma tecnologia e nem uma metodologia. DDD um estilo de arquitetura orientado a objetos, focado em modelar o domnio do negcio e a lgica do domnio com o uso de tcnicas, prticas e padres de projeto. Esse o estilo de arquitetura mais conhecido e mais utilizado para o desenvolvimento de aplicaes. Ele permite a separao dos mdulos do sistema em camadas (layers) diferentes. As principais vantagens desse estilo so a facilidade de manuteno, o aumento da extensibilidade, reusabilidade e escalabilidade. Esse estilo segrega as funcionalidades em segmentos separados de maneira similar ao estilo da arquitetura em camadas, mas com cada segmento alocado em camadas fsicas (tiers) separadas, conforme veremos em detalhes no tpico Arquitetura Distribuda. Ele ideal quando o projeto demanda escalabilidade. Para isso, as camadas lgicas (layers) da aplicao so alocadas em mquinas diferentes. Geralmente, ao mapear as camadas lgicas (layers) para as fsicas (tiers), podemos criar um cluster ou um farm na mesma camada fsica para aumentar a performance e a confiabilidade da aplicao. SOA j deixou de ser apenas uma palavra no meio de TI para se tornar um modelo consagrado adotado em muitas empresas. Uma arquitetura orientada a servios nada mais do que uma aplicao que expe e consome as funcionalidades do sistema como servios por meio de contratos e mensagens. Algumas das caractersticas de uma Arquitetura Orientada a Servios so: a independncia da Plataforma, comunicao baseada em servios entre os componentes de software, integrao de mltiplas funcionalidades em um nico componente de interface do usurio e a exposio dos servios por meio de repositrios ou catlogos. Ao aplicar esse estilo, o sistema dividido em objetos individuais, reutilizveis e autossuficientes. Cada objeto contm os dados e o comportamento pelos quais responsvel. Uma arquitetura orientada a objetos geralmente busca espelhar objetos do mundo real de modo a tornar simples a modelagem da aplicao.

Arquitetura baseada em Componentes

Domain Driven Design Arquitetura em Camadas

3-Tiers/N-Tiers

Arquitetura Orientada a Servios (SOA)

Arquitetura Orientada a Objetos

Tabela 1. Estilos de Arquitetura cao em funcionalidades distintas com a menor similaridade possvel entre elas. Para aplicar com sucesso este princpio, o mais importante minimizar os pontos de interao para obter alta coeso e baixo acoplamento entre os componentes do sistema. Para tanto, recomendado primeiro dividir suas responsabilidades e organizlas em elementos bem definidos, sem repetio de cdigo ou de funcionalidade. O tipo de separao de conceito mais difundido o da separao horizontal, onde dividimos a aplicao em camadas lgicas de funcionalidades, como por exemplo, o protocolo TCP/IP (modelo OSI), que separado pelas camadas de aplicao, transporte, rede, enlace e fsica. Neste modelo, cada camada tem sua prpria responsabilidade e no precisa conhecer as camadas adjacentes. Voltando ao nosso mundo, em uma aplicao Java EE, as camadas mais conhecidas so a de Apresentao, Servio, Domnio e Infraestrutura, como ilustra a Figura 1. Podemos tambm aplicar o tipo de separao vertical, onde dividimos a aplicao em mdulos ou funcionalidades que so relacionadas a um subsistema ou grupo de

Edio 80 Java Magazine

69

Princpios, Padres e Prticas para um Design gil Parte 1

Figura 1. Separao Horizontal de Conceitos (Camadas lgicas de uma aplicao) operaes dentro de um sistema. Veja um exemplo na Figura 2. Separar as funcionalidades de uma aplicao em mdulos deixa claro as responsabilidades e dependncias de cada funcionalidade, o que ajuda na execuo dos testes e na manuteno do software. Na Figura 2 fazemos um agrupamento por mdulos; neste caso a separao foi feita pelos mdulos de RH, Contbil e Marketing. Alm disso, podemos utilizar o conceito de separao vertical em conjunto com o conceito de separao horizontal. Veja um exemplo na Figura 3. Um papel importante da separao de conceitos o da separao de comportamento, que envolve a diviso dos processos do sistema em unidades lgicas de cdigo reutilizveis e gerenciveis. Ao organizar o comportamento, alcanamos os seguintes benefcios: Eliminamos a duplicao de funciona lidades; Minimizamos as dependncias externas; Maximizamos o potencial para reuso; Restringimos o escopo do trabalho para os limites de cada mdulo. Como vimos, importante entender a separao de conceitos pois ao modelarmos uma aplicao devemos ter conhecimento das responsabilidades de cada um de seus componentes. Alm disso, devemos ter uma ideia de como ser feita esta separao e como ser feita a distribuio destes componentes na arquitetura disponvel pelo cliente. Para tanto, preciso levar em considerao outros fatores, como infraestrutura e recursos disponveis, conforme veremos a seguir.

Figura 2. Separao Vertical de Conceitos

Arquitetura Distribuda
Em uma arquitetura distribuda, uma aplicao dividida em partes menores que executam simultaneamente em computadores diferentes. Estas partes so chamadas de Tiers, e se comunicam umas com as outras geralmente atravs de uma rede corporativa (LAN), utilizando protocolos baseados em TCP/IP ou UDP. Na Figura 4 destacamos uma arquitetura distribuda em 3 camadas de uma tpica aplicao Java EE, arquitetura essa que se tornou padro em muitas empresas, sendo formada pelas camadas fsicas: Thin Client (Client Tier); Application Server (Application Tier), neste exemplo representado por um servidor de aplicaes como o JBoss, e o Database Server (Infra Tier), representado pelos servidores de banco de dados. Para muitos desenvolvedores, existe uma confuso com os termos tier e layer, pois a traduo de ambas as palavras a mesma: camada. A diferena que quando falamos em tier, estamos nos referindo camada fsica da aplicao, como servidores, dispositivos mveis, desktops, JVMs, CPUs, etc. Enquanto que ao falarmos em layers, estamos referenciando as camadas lgicas da aplicao, camadas que residem em uma ou mais camadas fsicas, no existindo uma regra definida, podendo uma camada lgica estar distribuda em diversas camadas fsicas. Por exemplo, uma aplicao web em cluster, cuja aplicao distribuda em mais de um servidor (tier) para prover alta disponibilidade do sistema. Cada um dos tiers fornece um conjunto independente de servios que podem ser consumidos pela camada cliente ou por uma camada de conexo. Alm disso, podemos

Figura 3. Aplicao da Separao de Conceitos Vertical e Horizontal

Nota do DevMan
Cluster: um conjunto de computadores interligados que trabalham em conjunto como se fosse um nico computador. Estes computadores so utilizados para suportar aplicaes que tm necessidade de alta disponibilidade e alta capacidade de processamento. Farm: Um Servidor Farm, tambm conhecido como Data Center, um conjunto de servidores mantido (geralmente) por uma empresa para atender as necessidades computacionais da corporao, como o processamento de grandes volumes de informao, atender aos sistemas corporativos e prover servidores de contingncia no caso de um problema no computador principal. Repositrio: Um Repositrio um local onde todos os clientes de um domnio especfico publicam seus servios, de maneira que todos os usurios passam a conhecer os servios disponveis e como acess-los. Para tanto, um repositrio deve ter uma interface bem definida para publicao dos servios, funes para localizao, controle e maneira uniforme de acesso.

dividir uma camada fsica (tier) em vrias camadas lgicas (layers) para fornecer funes de nvel mais granular. Na Figura 4, por exemplo, separamos a camada do Application Server em quatro camadas lgicas: Apresentao, Servio, Domnio e Infraestrutura. Este modelo pode variar de empresa para empresa, com layers e tiers adicionais. Por exemplo: poderamos separar a camada de apresentao da nossa aplicao colocando-a em um servidor web parte (como o Tomcat); neste caso, adicionaramos mais uma camada fsica (tier) e nosso cenrio passaria a ser o de uma arquitetura N-Tier, conforme ilustra a Figura 5. As camadas (layers) so responsveis pelo processamento do sistema em si, e cada uma delas agrupa todos os componentes (classes, pacotes) que possuem funcionalidades em comum ou relao entre si.

70 Java Magazine Edio 80

Esta separao nos d vrios benefcios, entre eles, promove a coeso entre os componentes relacionados e evita o acoplamento com componentes de outras camadas, pois o acesso s outras camadas realizado de maneira controlada. Alm disso, promove a reusabilidade dos componentes (teoricamente poderamos trocar uma camada por outra), reduz a dependncia com componentes de outras camadas e a complexidade do sistema e, por fim, facilita a identificao de problemas. Conforme vimos na Figura 4, a camada do Application Server o local onde fica hospedado nossa aplicao. Para o exemplo ilustrado, separamos nossa aplicao em quatro camadas lgicas, so elas: camada de apresentao, camada de servios, camada de domnio e camada de infraestrutura.

tipo de aplicao escolhido, pesquise os padres de projeto e as melhores prticas relacionadas, e procure aplicar de acordo com a necessidade. Por exemplo, o consagrado padro MVC (Model-ViewController), Front Controller [Core] (veja o quadro Padro de Projeto: Front Controller) e Application Controller [Core] para aplicaes web, entre outros;

Aplicar os Conceitos de Usabilidade: Aplicar na interface grfica do usurio conceitos que tragam ao mesmo uma experincia mais agradvel e assim aumentar o valor do produto para o cliente. Porm, antes disso, conhea seu usurio, faa pesquisas e entrevistas para entender o melhor design que se aplica ao cliente.

Camada de Apresentao (Presentation Layer)


A Camada de Apresentao representa a interface de acesso do sistema e responsvel por apresentar as informaes ao usurio, sejam elas em uma pgina HTML ou em um dispositivo mvel. Esta camada responsvel tambm por interpretar as requisies, como cliques de mouse, aes do teclado, requisies HTTP, originadas por um usurio ou por interaes de outros sistemas, atravs de servios ou APIs. Ao criar o design da camada de apresentao existem boas prticas que devemos considerar para assegurar que o modelo que estamos definindo atenda aos requisitos do cliente, como: Escolher o tipo apropriado de aplicao: O tipo de aplicao ter um impacto considervel em suas opes para a camada de apresentao. Voc pode escolher entre implementar uma aplicao rich client, web, aplicao mvel ou um cliente RIA (Rich Internet Application). Tome esta deciso baseado nos requisitos da sua aplicao, de infraestrutura e organizacional. De acordo com esta deciso escolha um framework que melhor atenda suas necessidades; Utilizar padres de projeto relevantes ao tipo de aplicao: De acordo com o

Figura 4. Arquitetura de uma aplicao 3-Tier

Figura 5. Arquitetura de uma aplicao N-Tier Edio 80 Java Magazine

71

Princpios, Padres e Prticas para um Design gil Parte 1

Nota do DevMan
Core: Esta sigla uma referncia ao livro Core J2EE Patterns: Best Practices and Design Strategies, famoso catlogo de referncias da Sun para arquiteturas com tecnologias Java EE.

Padro de Projeto: Front Controller


Documentado no livro Core J2EE Patterns (ver Livros), este padro foi proposto para a camada de apresentao, e devemos utiliz-lo quando queremos criar um ponto de acesso centralizado para tratar as requisies origide controle; auxiliar a separao da lgica de processamento do sistema da camada de apresentao; e ajudar a controlar os pontos de acesso do sistema. Alm disso, o Front Controller ajuda a reduzir a quantidade de cdigo com lgica embutida diretamente na camada de apresentao, diminuindo, por exemplo, o volume de cdigo scriptlet em uma pgina JSP.

Camada de Servios (Service Layer)


No livro Patterns of Enterprise Application Architecture (referenciado como [PEAA]), Martin Fowler define a camada de servios como sendo a fronteira do sistema que fornece um conjunto de operaes disponveis para a camada de apresentao. Esta camada encapsula a lgica de negcio da aplicao (Business Layer), controla as transaes e coordena o retorno das operaes de acordo com sua implementao. nessa camada que definido todo o trabalho que o software deve realizar e onde so direcionadas as chamadas para o modelo de domnio. Muitos desenvolvedores acabam colocando toda a regra de negcio nesta camada por meio de Scripts de Transao (Transaction Scripts [PEAA]; para mais detalhes, veja o quadro Padro de Projeto: Transaction Script) e acabam perdendo as vantagens que um Modelo de Domnio (Domain Model [PEAA]) pode oferecer, criando o chamado Modelo Anmico. Para evitar o modelo anmico, a camada de servio deve ser uma camada fina e no possuir regras de negcio, somente coordenar tarefas e delegar o trabalho para os objetos de domnio da camada abaixo. Geralmente esta camada inclui os seguintes tipos de servios: Interfaces de Servio (Service Interface): Esse o tipo de servio mais utilizado. Os servios so expostos para os clientes atravs de interfaces, por onde todas as mensagens externas sero enviadas. Podemos pensar nas interfaces de servio como um Facade (GoF) que expe a lgica de negcio implementada na aplicao (geralmente na Camada de Domnio) para os clientes em potencial; Tipos de Mensagem (Message Types): Utilizado quando trafegamos os dados

nadas desta camada, conforme demonstra a Figura Q1. O padro Front Controller trs diversos benefcios, entre eles: evitar a duplicao da lgica

Figura Q1. Diagrama de Classes do Front Controller atravs da camada de servio, onde as estruturas de dados so encapsuladas em formato de mensagem para suportar tipos diferentes de operao. Estes formatos geralmente seguem um contrato, descrito por um arquivo WSDL, WADL ou outro formato especfico, e so trafegados em protocolos como HTTP, REST ou SOAP. A lgica de negcio que implementada utilizando o padro Domain Model estruturada de maneira muito diferente de um design tradicional com EJBs. Ao invs da lgica de negcio ser concentrada em poucas, mas grandes classes, um modelo de domnio consiste em vrias classes pequenas que possui tanto estado (atravs de atributos) quanto comportamento (atravs dos mtodos). Para mais informaes, veja o quadro Padro de Projeto: Domain Model. Nesta camada podemos ainda gerenciar o estado dos objetos de negcio (sesso), caso existam mltiplas requisies do usurio para realizar uma tarefa. Conforme mencionamos anteriormente, aqui residem as regras de negcio da aplicao, portanto, elas devem ser isoladas das outras camadas da aplicao; se possvel, ser independente de frameworks utilizados em outras camadas, como EJB, JSP/ JSF, Spring, Hibernate, dentre outros.

Camada de Domnio (Domain Layer)


Tambm conhecida como Camada de Negcio, essa camada uma das mais importantes do sistema, pois onde se concentra as informaes sobre o domnio do negcio. Nela os objetos de domnio encapsulam o estado e o comportamento das entidades de negcio, como por exemplo, lgica para atualizao de estoque em um sistema logstico. Para representar os objetos do domnio, podemos aplicar o padro Domain Model [PEAA] utilizando tcnicas de design e anlise orientada a objetos (OOAD). O modelo de domnio formado por classes que correspondem ao ambiente do negcio que o software prope auxiliar, tornando-o fcil de compreender.

Camada de Infraestrutura (Infrastructure Layer)


Esta camada fornece meios tcnicos para a aplicao suportar as camadas superiores, como o envio de mensagens,

72 Java Magazine Edio 80

Nota do DevMan
Modelo Anmico: Este um anti-pattern documentado por Martin Fowler, e descreve a prtica de se implementar a lgica do negcio fora dos objetos de domnio (domain model). Geralmente reconhecemos um modelo anmico quando as classes do domnio possuem apenas os mtodos getters e setters.

Padro de Projeto: Transaction Script


Documentado por Martin Fowler, este padro tem o objetivo de organizar a lgica de negcio da aplicao em procedimentos (procedures). Um Transaction Script deve conter todas as regras necessrias para satisfazer uma transao, de forma que no haja dependncia de um Transaction Script com outros objetos. um padro til para pequenas aplicaes por seguir as regras de programao procedural. Um Transaction Script organiza a lgica do sistema em procedures, podendo, por exemplo, fazer chamadas diretas ao banco de dados. Seguindo este padro, se ns desenvolvermos um sistema de pagamento e precisarmos implementar uma funcionalidade para pagamento via carto de crdito, ento, toda a lgica de verificao de crdito, como o saldo disponvel, validade do carto e clculo das taxas seria implementada em um nico procedimento. Uma maneira de aplicar Transaction Scripts utilizando o padro de projeto Command [GoF], onde inclumos toda sua lgica em classes separadas, como ilustra a Figura Q2, que para cada tipo de operao existe um Command relacionado. A vantagem desse padro a sua simplicidade, pois toda a lgica referente a uma transao est em um nico lugar. Quanto s desvantagens, podemos citar a baixa reusabilidade do cdigo, o alto ndice de cdigo repetido (violando o princpio DRY, que veremos no prximo artigo) e obviamente o fato de ser voltado programao procedural.

componentes para persistncia de objetos da camada de domnio, desenho de componentes grficos para a camada de apresentao e assim por diante. Aqui centralizamos os componentes de acesso aos dados e outros no relacionados lgica do negcio para tornar mais fcil a manuteno e a configurao da aplicao. Entre estes componentes, podemos utilizar componentes JMS para mensageria, frameworks Objeto/Relacional (ORM) para persistncia dos objetos do domnio, sesses de JavaMail, Barramentos ESB, entre outros. Ou ainda, poderamos criar componentes que podem servir de utilidade para as demais camadas do sistema, como segurana, comunicao e gerenciamento. Geralmente componentes como estes podem vir a ser aplicados em mais de uma camada da aplicao, e quando isso acontece dizemos que o mesmo possui Responsabilidades Transversais.

Responsabilidades Transversais (Crosscutting Concerns)


Responsabilidades Transversais ou Ortogonais representam reas que no esto relacionadas diretamente com uma ou mais camadas da aplicao. Na Figura 4 elas so representadas pelos itens de segurana, comunicao e gerenciamento, e contemplam as camadas de apresentao, servio, domnio e infraestrutura. O cdigo referente a estas responsabilidades deve estar o mais abstrado possvel da lgica de negcio da aplicao, ou seja, desacoplado do cdigo relacionado s regras de negcio, pois misturar o cdigo que implementa este tipo de funo com o cdigo do domnio da aplicao geralmente leva a um design que difcil de manter e reutilizar. Para auxiliar na gesto de um cenrio como este, considere utilizar frameworks Figura Q2. Aplicando Transaction Script utilizando o padro Command

e tcnicas como a programao orientada a aspectos (AOP), onde ao invs de efetuar chamadas diretamente a funes, so utilizados metadados para efetuar a incluso de cdigo (relacionado a estas responsabilidades) durante o tempo de execuo. Para qualquer estilo de arquitetura que o software siga, preciso um mnimo de planejamento para a construo da aplicao, e isto envolve a criao do design da aplicao. Por mais simples que o software seja, ou que tenha sido construdo sem planejamento, ou documentao, ou testes, ele tem um design por trs.

Concluso
Na primeira parte deste artigo, abordamos conceitos importantes sobre arquitetura de software, apresentando de maneira sucinta os estilos de arquitetura existentes e seus benefcios. Aps a descrio, detalhamos o conceito de arquitetura distribuda, que atualmente o tipo de arquitetura mais adotado em ambientes de desenvolvimento com Java. Seguindo esta linha, explicamos como feita a distribuio da arquitetura atravs de camadas fsicas (tiers) e lgicas (layers), e detalhamos como feito

Edio 80 Java Magazine

73

Princpios, Padres e Prticas para um Design gil Parte 1

o processo de separao das camadas lgicas (Apresentao, Servio, Domnio e Infraestrutura) atravs do tpico Separao de Responsabilidades. Alm disso, analisamos tambm as melhores prticas envolvidas na criao de cada uma das camadas lgicas do sistema, as responsabilidades transversais que atuam em mais de uma destas camadas, e por fim, como evitar a criao de um modelo anmico, atravs da aplicao do padro Domain Model. Na segunda etapa vamos falar sobre a importncia dos mtodos geis na construo de software, cobrir diversos princpios de desenvolvimento OO (que so essenciais na construo de uma aplicao de qualidade), e aprender como identificar falhas no design de um sistema.

Padro de Projeto: Domain Model


Este padro de projeto foi documentado por Martin Fowler [PEAA], mas discutido desde o surgimento da programao orientada a objetos. De acordo com a definio de Fowler, um Domain Model um modelo de objetos do domnio que incorpora tanto comportamento quanto dados. Ou seja, a parte principal do sistema, onde estaro as regras de negcio e as entidades do sistema. Um Domain Model uma representao visual dos objetos do mundo real atravs das classes do modelo, de acordo com tipo de negcio que elas representam. Para uma melhor representao do negcio, as classes do modelo de domnio no devem possuir acoplamento com classes ou lgica de infraestrutura, como por exemplo, lgica de segurana de acesso e logging. Na Figura Q3 apresentado um exemplo de um modelo de domnio simples de um sistema de Ordens de Servio para uma mecnica automotiva.

Livros
Agile Software Development: principles, patterns, and practices Robert C. Martin (Prentice Hall, 2003). Refactoring to Patterns Joshua Kerievsky (Addison-Wesley, 2004). Effective Java Second Edition Joshua Bloch (Addison-Wesley, 2008). [Core] Core J2EE Patterns: Best Practices and Design Strategies (2nd Edition) Deepak Alur, Dan Malks, John Crupi (Prentice Hall, 2003). [RTP] Refactoring to Patterns Joshua Kerievsky (Addison-Wesley, 2004). [DDD] Domain Driven Design: Tackling Complexity in the Heart of Software Eric Evans (Addison-Wesley, 2003). [PEAA] Patterns of Enterprise Application Architecture Martin Fowler (Addison-Wesley, 2003). [GoF] Design Patterns: Elements of Reusable Object-Oriented Software Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides (Addison-Wesley, 1994b). Extreme Programming Explained Second Edition Kent Beck (Addison-Wesley, 2005). The Pragmatic Programmer: From Journeyman to Master Andrew Hunt, David Thomas (AddisonWesley, 1999).

Figura Q3. Domain Model inicial de um sistema de garantias

http://www.aspiringcraftsman. com/2008/01/art-of-separation-ofconcerns/ Excelente artigo sobre separao de responsabilidades. http://pt.wikipedia.org/wiki/Edsger_Dijkstra Biografia de Edsger Dijkstra. http://www.codeplex.com/AppArchGuide Guia de Arquitetura de Aplicaes da Microsoft. http://en.wikipedia.org/wiki/Big_Design_ Up_Front Artigo sobre Big Design Up Front. http://martinfowler.com/bliki/ AnemicDomainModel.html Excelente artigo de Martin Fowler sobre Modelo de Domnio Anmico.

Wagner Roberto dos Santos wrsconsulting@gmail.com Arquiteto de Software e Agilista, entusiasta do NetBeans IDE, tendo diversas participaes na criao de plugins, tradues e testes do IDE. Palestrante em diversos eventos nacionais e vencedor de diversos prmios de desenvolvimento, possui as certificaes SCJA, SCJP, SCSNI, SCJWSD, SCBCD, SCEA(I) e CSM. Recentemente desenvolveu uma plataforma de Mobile Payment (Pagamentos via Celular) para a empresa Mopis e atualmente arquiteto de solues na TIM. Nas horas vagas mantm o blog http://netfeijao.blogspot.com. D seu feedback sobre esta edio! A Java Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o que voc, leitor, acha da revista!
D s

Feedback eu
sobre e s

D seu voto sobre este artigo, atravs do link: www.devmedia.com.br/javamagazine/feedback

74 Java Magazine Edio 80

edio ta

Edio 80 Java Magazine

75

Princpios, Padres e Prticas para um Design gil Parte 1

76 Java Magazine Edio 80

Anda mungkin juga menyukai