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:
Aprenda a usar a JMS, ou atualize-se com as facilidades do Java EE 6 [ Osvaldo Pinali Doederlein ]
Conhea o que h de novo na plataforma Java Enterprise Edition [ Vtor Estvo Silva Souza ]
Java
Manipulando lbuns, fotos e vdeos do Picasa Web Albums com GWT e GAE [ Paulo Csar Coutinho ]
Eng. de Software
Eng. de Software
Boas Prticas
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
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
Vdeos
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
D s
Feedback eu
sobre e s
edio ta
Seo Java: NeSta Seo voc eNcoNtra artigoS iNtermedirioS e avaNadoS Sobre Java
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.
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.
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
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
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.
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
11
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.)
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.
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.
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.
}
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.
13
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.
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
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
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
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.
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
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.
15
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
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
17
www.devmedia.com.br/javamagazine/feedback
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
19
Seo Java: NeSta Seo voc eNcoNtra artigoS iNtermedirioS e avaNadoS Sobre Java
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.
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.
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
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.
21
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
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).
23
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.
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.
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....
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
25
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.
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.
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.
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.
27
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.
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-
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.
29
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
3 Note que uma mesma pessoa acessando a aplicao com dois navegadores (browsers) diferentes considerada como 2 usurios e, portanto, ter duas sesses.
31
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; } }
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 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>
33
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.
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
www.devmedia.com.br/javamagazine/feedback
edio ta
35
Seo Java: NeSta Seo voc eNcoNtra artigoS iNtermedirioS e avaNadoS Sobre Java
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.
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.
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
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.
37
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.
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.
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.
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
39
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); }
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.
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.
@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(); }
41
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.
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.
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... } }
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.
43
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
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
www.devmedia.com.br/javamagazine/feedback
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.
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.
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).
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
47
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.
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,
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.
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.
49
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.
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
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 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-
51
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.
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
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.
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.
53
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.
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
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-
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.
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
www.devmedia.com.br/javamagazine/feedback
edio ta
55
Seo boaS PrticaS: NeSta Seo voc eNcoNtra artigoS Sobre tcNicaS que Podero aumeNtar a
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.
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.
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.
57 57
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.
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.
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.
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
59
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.
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-
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
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
61
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>
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.
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>
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-
63
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
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 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,
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.
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
www.devmedia.com.br/javamagazine/feedback
edio ta
65
Seo boaS PrticaS: NeSta Seo voc eNcoNtra artigoS Sobre tcNicaS que Podero aumeNtar a
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.
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.
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
3-Tiers/N-Tiers
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
69
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.
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
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.
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.
71
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.
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.
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.
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.
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
73
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.
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).
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
edio ta
75