tag:blogger.com,1999:blog-5446686446703114242024-03-05T04:51:29.810-03:00NetFeijão BrazilComo seria se a IDE RI da sun, o NetBeans fosse Brasileiro ?
Este espaço foi criado para você, que gosta de Tecnologia, Java, Metodologias Ágeis e trocar experiência.
Seja bem vindo..Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.comBlogger73125tag:blogger.com,1999:blog-544668644670311424.post-69355444770785637232012-06-08T11:49:00.000-03:002012-06-08T11:49:10.585-03:00The Developers Conference 2012<br />
<div class="p1">
<span class="s1">Este ano, vamos marcar presença novamente no evento <a href="http://www.thedevelopersconference.com.br/tdc/2012/index.html" target="_blank">The Developers Conference 2012</a>. </span></div>
<div class="p1">
<span class="s1"> </span>O evento TDC, é o maior evento de profissionais de TI do Brasil! Mais de 30 trilhas sobre diversas especialidades e tendências em gestão e tecnologia.</div>
<div class="p1">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.thedevelopersconference.com.br/img/cartaz/2012/cartaz-A3-TDC2012.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.thedevelopersconference.com.br/img/cartaz/2012/cartaz-A3-TDC2012.jpg" /></a></div>
<div class="p2">
<br /></div>
<div class="p2">
<br /></div>
<div class="p2">
A novidade, é que este ano sou um dos coordenadores das trilhas <a href="http://www.thedevelopersconference.com.br/tdc/2012/saopaulo/trilha-arquitetura#coordenadores" target="_blank">Arquitetura</a> e <a href="http://www.thedevelopersconference.com.br/tdc/2012/saopaulo/trilha-agile#coordenadores" target="_blank">Agile</a>. </div>
<div class="p2">
Para a trilha de Arquitetura, estamos buscando criar uma trilha com palestras de alto nível e mais agnóstica. De forma que profissionais de qualquer plataforma possam tirar o máximo de proveito.</div>
<div class="p2">
<br /></div>
<div class="p2">
Para a trilha Agile, o tema deste ano é "Agile no Mundo Real", seguindo esta linha, estamos trazendo palestras e profissionais para mostrar o que realmente tem acontecido no mercado de agilidade, quais as ferramentas para resolução de problemas utilizados em um projeto de Gestão de Mudança para Agilidade e temas atuais.</div>
<div class="p2">
<br /></div>
<div class="p2">
Se você quer ser um palestrante, submeta sua proposta no <a href="http://www.thedevelopersconference.com.br/tdc/2012/saopaulo/call4papers" target="_blank">Call4Papers</a>, mas corra, que é o prazo de submissões é até domingo. :)</div>
<div class="p2">
<br /></div>
<div class="p2">
Nos vemos lá! Diversão garantida!</div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com1tag:blogger.com,1999:blog-544668644670311424.post-4176209540501382832012-02-01T13:58:00.000-02:002012-02-01T13:58:36.866-02:00Estilos de Arquitetura e Separação de Responsabilidades para um Design ÁgilCom a grande demanda de profissionais por parte das empresas, muitos deles acabam sendo contratados sem ter o devido conhecimento sobre boas práticas de desenvolvimento de software, infraestrutura de desenvolvimento, protocolos de comunicação, sistemas gerenciadores de banco de dados e muitas vezes até conhecimento básico sobre sistemas operacionais.<br />
<br />
Além 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 implementação, qualidade duvidosa e muitas vezes sem atender ao negócio do cliente.<br />
<br />
Como consequência, após implantado, o sistema passa a apresentar sérios problemas como degradação da performance, perda de dados, cálculos incorretos, entre outros problemas, trazendo grandes prejuízos à empresa e fazendo com que os usuários percam a confiança no sistema e por fim os próprios desenvolvedores.<br />
<br />
Direcionado para este cenário, o presente artigo visa demonstrar boas práticas de desenvolvimento de software e explicar os princípios fundamentais para se criar um bom design. Veremos também a aplicação de alguns padrões de projeto pouco difundidos, mas que são de extrema importância no dia a dia do desenvolvedor.<br />
<br />
<span style="font-size: large;"><b>Estilos de Arquitetura</b></span><br />
<br />
Quando vamos planejar o desenvolvimento de um software, geralmente um dos primeiros itens que o arquiteto de software começa a analisar é qual o melhor estilo de arquitetura que se aplica ao<br />
contexto do projeto. Neste ponto ele leva em consideração diversos fatores, como os requisitos do software, custo, infraestrutura e conhecimento técnico da equipe.<br />
<br />
Entender o estilo arquitetural adotado para o desenvolvimento traz diversos benefícios 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.<br />
<br />
Por exemplo, quando o estilo de arquitetura é SOA, os desenvolvedores podem até conversar com pessoas de outras áreas, que não possuem conhecimento técnico (como detalhes da linguagem de programação, servidores de aplicação, etc.), sobre o método envolvido na automação dos processos de negócio, que as mesmas entenderão sobre o que é um serviço, governança e, dependendo do usuário, até termos mais específicos, como escalabilidade.<br />
<br />
A <b>Tabela 1</b> apresenta um resumo dos principais estilos de arquitetura.<br />
<table border="1">
<tbody>
<tr>
<td><div style="text-align: center;">
<b>Estilo de Arquitetura</b></div>
</td>
<td><div style="text-align: center;">
<b>Descrição</b></div>
</td>
</tr>
<tr>
<td><b><i>Client-Server</i></b></td>
<td>Também conhecida como arquitetura de duas camadas. Este tipo de arquitetura descreve a interação entre um ou mais clientes e um servidor, através de uma conexão de rede. A aplicação mais comum para esse tipo de arquitetura é um Banco de Dados no lado do servidor com a lógica da aplicação representada em Stored Procedures, e o lado do Cliente representado por aplicações conhecidas como <i>Fat-Clients</i> (Clientes Pesados), que muitas vezes contêm a lógica de negócio embutida no front-end. Como exemplo, podemos citar aplicações desenvolvidas com Delphi, Visual Basic, Oracle Forms, entre outros.</td>
</tr>
<tr>
<td><b><i>Arquitetura baseada em Componentes</i></b></td>
<td>Quando utilizamos uma arquitetura baseada em componentes, decompomos o design da aplicação em componentes lógicos com um fraco acoplamento, de forma que cada um deles seja individual e reutilizável, com uma localização transparente e interface de comunicação bem definida. Uma das grandes vantagens desse tipo de arquitetura é que ela promove a reusabilidade dos componentes e facilita a manutenção da aplicação.</td>
</tr>
<tr>
<td><i><b>Domain Driven Design</b></i></td>
<td>De acordo com o próprio criador, Eric Evans, DDD não é uma tecnologia e nem uma metodologia. DDD é um estilo de arquitetura orientado a objetos, focado em modelar o domínio do negócio e a lógica do domínio com o uso de técnicas, práticas e padrões de projeto.</td>
</tr>
<tr>
<td><i><b>Arquitetura em Camadas</b></i></td>
<td>Esse é o estilo de arquitetura mais conhecido e mais utilizado para o desenvolvimento de aplicações. Ele permite a separação dos módulos do sistema em camadas (<i>layers</i>) diferentes. As principais vantagens desse estilo são a facilidade de manutenção, o aumento da extensibilidade, reusabilidade e escalabilidade.</td>
</tr>
<tr>
<td><i><b>3-Tiers/N-Tiers</b></i></td>
<td>Esse estilo segrega as funcionalidades em segmentos separados de maneira similar ao estilo da arquitetura em camadas, mas com cada segmento alocado em camadas físicas (tiers) separadas, conforme veremos em detalhes no tópico “<i>Arquitetura Distribuída</i>”.<br />
Ele é ideal quando o projeto demanda escalabilidade. Para isso, as camadas lógicas (<i>layers</i>) da aplicação são alocadas em máquinas diferentes.<br />
Geralmente, ao mapear as camadas lógicas (<i>layers</i>) para as físicas (<i>tiers</i>), podemos criar um <u><b>cluster</b></u> ou um <u><b>farm</b></u> na mesma camada física para aumentar a performance e a confiabilidade da aplicação.</td>
</tr>
<tr>
<td><b><i>Arquitetura Orientada a Serviços(SOA)</i></b></td>
<td>SOA já deixou de ser apenas uma palavra no meio de TI para se tornar um modelo consagrado adotado em muitas empresas. Uma arquitetura orientada a serviços nada mais é do que uma aplicação que expõe e consome as funcionalidades do sistema como serviços por meio de contratos e mensagens.<br />
Algumas das características de uma Arquitetura Orientada a Serviços são: a independência da Plataforma, comunicação baseada em serviços entre os componentes de software, integração de múltiplas funcionalidades em um único componente de interface do usuário e a exposição dos serviços por meio de <u><b>repositórios ou catálogos</b></u>.</td>
</tr>
<tr>
<td><i><b>Arquitetura Orientada a Objetos</b></i></td>
<td>Ao aplicar esse estilo, o sistema é dividido em objetos individuais, reutilizáveis e autossuficientes. Cada objeto contém os dados e o comportamento pelos quais é responsável.
Uma arquitetura orientada a objetos geralmente busca espelhar objetos do mundo real de modo a tornar simples a modelagem da aplicação.</td></tr>
</tbody></table>
<span style="font-size: x-small;"><b>Tabela 1.</b> Estilos de Arquitetura.</span><br />
<br />
<span style="font-size: x-small;"><u><b>Cluster:</b></u> É um conjunto de computadores interligados que trabalham em conjunto como se fosse um único computador. Estes computadores são utilizados para suportar aplicações que têm necessidade de alta disponibilidade e alta capacidade de processamento.</span><br />
<span style="font-size: x-small;"><u><b>Farm:</b></u> Um Servidor Farm, também conhecido como Data Center, é um conjunto de servidores mantido (geralmente) por uma empresa para atender as necessidades computacionais da corporação, como o processamento de grandes volumes de informação, atender aos sistemas corporativos e prover servidores de contingência no caso de um problema no computador principal.</span><br />
<span style="font-size: x-small;"><u><b>Repositório:</b></u> Um Repositório é um local onde todos os clientes de um domínio específico publicam seus serviços, de maneira que todos os usuários passam a conhecer os serviços disponíveis e como acessá-los.</span><br />
<span style="font-size: x-small;">Para tanto, um repositório deve ter uma interface bem definida para publicação dos serviços, funções para localização, controle e maneira uniforme de acesso.</span><br />
<br />
Uma vez que o estilo de arquitetura é definido, o passo seguinte é definir como as funcionalidades do sistema serão divididas, de forma a manter em conjunto os componentes relacionados (alta<br />
coesão), e fazer com que estes possuam o mínimo de conhecimento sobre os outros componentes (baixo acoplamento). Para alcançar o baixo acoplamento e uma alta coesão é importante entender o conceito de Separação de Responsabilidades.<br />
<b><span style="font-size: large;"><br /></span></b><br />
<b><span style="font-size: large;">Separação de Responsabilidades (Separation of Concerns)</span></b><br />
<br />
O termo Separação de Responsabilidades foi criado pelo pai do algoritmo de caminho mínimo, o cientista Edsger W. Dijkstra em 1974, e tem como objetivo dividir a aplicação em funcionalidade distintas com a menor similaridade possível entre elas. Para aplicar com sucesso este princípio, o mais importante é minimizar os pontos de interação para obter alta coesão e baixo acoplamento entre os componentes do sistema. Para tanto, é recomendado, primeiro dividir suas responsabilidades e organizá-las em elementos bem definidos, sem repetição de código ou de funcionalidade.<br />
<br />
O tipo de separação de conceito mais difundido é o da separação horizontal, onde dividimos a aplicação em camadas lógicas de funcionalidades, como por exemplo, o protocolo TCP/IP (modelo OSI), que é separado pelas camadas de aplicação, transporte, rede, enlace e física. Neste modelo, cada camada tem sua própria responsabilidade e não precisa conhecer as camadas adjacentes. Voltando ao nosso mundo, em uma aplicação Java EE, as camadas mais conhecidas são a de Apresentação, Serviço, Domínio e Infraestrutura, como ilustra a <b>Figura 1</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn22NGgP353Y-pmr1Zmw9h37hgsxXv6qTs6GWVIcYWCJy9Hbcq6y-fHU7DKsBg04ZOXkcRFT3jFkq8FHHGvjDWtLDx2g7QQ5aYfRrvVI_7UnUu1pkRrUhuH44x1DOpeGEgdCl27gvAeT4V/s1600/Layers01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn22NGgP353Y-pmr1Zmw9h37hgsxXv6qTs6GWVIcYWCJy9Hbcq6y-fHU7DKsBg04ZOXkcRFT3jFkq8FHHGvjDWtLDx2g7QQ5aYfRrvVI_7UnUu1pkRrUhuH44x1DOpeGEgdCl27gvAeT4V/s320/Layers01.png" width="320" /></a></div>
<br />
<div style="text-align: center;">
<span style="font-size: x-small;"><b>Figura 1.</b> Separação Horizontal de Conceitos (Camadas lógicas de uma aplicação).</span></div>
<br />
Podemos também aplicar o tipo de separação vertical, onde dividimos a aplicação em módulos ou funcionalidades que são relacionadas a um subsistema ou grupo de operações dentro de um sistema.<br />
Veja um exemplo na <b>Figura 2</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPN5HBdQaVyaHzUwKbFN_Yf30MP_mNiM_VI0SSIDui881LpoAeO9V-YsG_ZV3mcKssolfP3zlX5MpM6BJHS6KKZQxY4igqgkUJopCEGjwxE8IwAL4RC_iD4AtF0tptvhyphenhyphenpc6Q7r0lotENI/s1600/soc01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPN5HBdQaVyaHzUwKbFN_Yf30MP_mNiM_VI0SSIDui881LpoAeO9V-YsG_ZV3mcKssolfP3zlX5MpM6BJHS6KKZQxY4igqgkUJopCEGjwxE8IwAL4RC_iD4AtF0tptvhyphenhyphenpc6Q7r0lotENI/s320/soc01.png" width="320" /></a></div>
<div style="text-align: center;">
<span style="font-size: x-small;"><b>Figura 2.</b> Separação Vertical de Conceitos.</span></div>
<br />
Separar as funcionalidades de uma aplicação em módulos deixa claro as responsabilidades e dependências de cada funcionalidade, o que ajuda na execução dos testes e na manutenção do<br />
software. Na <b>Figura 2</b> fazemos um agrupamento por módulos; neste caso a separação foi feita pelos módulos de RH, Contábil e Marketing.<br />
<br />
Além disso, podemos utilizar o conceito de separação vertical em conjunto com o conceito de separação horizontal. Veja um exemplo na <b>Figura 3</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7aMCprC4YJSiswZV2cJkJaMpm7_UgE9BLsjkrjxcmNE0lanQJaL7CK8fekPBZcmcZ6mLqR7E1zr7UA4nntqCtBALBJMXnQ_vy3Cg7VbY7lUw_roVMro9IR6eLzk0Hf_scQ7yQhXItU5mc/s1600/soc02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7aMCprC4YJSiswZV2cJkJaMpm7_UgE9BLsjkrjxcmNE0lanQJaL7CK8fekPBZcmcZ6mLqR7E1zr7UA4nntqCtBALBJMXnQ_vy3Cg7VbY7lUw_roVMro9IR6eLzk0Hf_scQ7yQhXItU5mc/s320/soc02.png" width="320" /></a></div>
<div style="text-align: center;">
<span style="font-size: x-small;"><b>Figura 3. </b>Aplicação da Separação de Conceitos Vertical e Horizontal.</span></div>
<br />
Um papel importante da separação de conceitos é o da separação de comportamento, que envolve a divisão dos processos do sistema em unidades lógicas de código reutilizáveis e gerenciáveis. Ao organizar o comportamento, alcançamos os seguintes benefícios:<br />
<ul>
<li>Eliminamos a duplicação de funcionalidades;</li>
<li>Minimizamos as dependências externas;</li>
<li>Maximizamos o potencial para reuso;</li>
<li>Restringimos o escopo do trabalho para os limites de cada módulo.</li>
</ul>
Como vimos, é importante entender a separação de conceitos pois ao modelarmos uma aplicação devemos ter conhecimento das responsabilidades de cada um de seus componentes. Além disso, devemos ter uma ideia de como será feita esta separação e como será feita a distribuição destes componentes na arquitetura disponível pelo cliente.<br />
<br />
Para tanto, é preciso levar em consideração outros fatores, como infraestrutura e recursos disponíveis, conforme veremos a seguir, no próximo artigo da série.<br />
<br />
<b><u>Referências</u></b><br />
<br />
<i>Excelente artigo sobre separação de responsabilidades</i><br />
<a href="http://www.aspiringcraftsman.com/2008/01/art-of-separation-of-concerns/">http://www.aspiringcraftsman.com/2008/01/art-of-separation-of-concerns/</a><br />
<br />
<i>Biografia de Edsger Dijkstra.</i><br />
<a href="http://pt.wikipedia.org/wiki/Edsger_Dijkstra">http://pt.wikipedia.org/wiki/Edsger_Dijkstra</a><br />
<br />
<i>Guia de Arquitetura de Aplicações da Microsoft.</i><br />
<a href="http://www.codeplex.com/AppArchGuide">http://www.codeplex.com/AppArchGuide</a><br />
<br />Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com1tag:blogger.com,1999:blog-544668644670311424.post-53219380858988070742012-01-19T10:25:00.002-02:002012-01-19T10:25:47.589-02:00Continuous Delivery, DevOps e Innovation Games na UFSCarAno passado, tive a oportunidade de palestrar em eventos importantes como o <a href="http://www.thedevelopersconference.com.br/tdc/2011/index.html#saopaulo" target="_blank">TDC 2011</a> em São Paulo, organizado pela <a href="http://www.globalcode.com.br/" target="_blank">Globalcode</a> e no aniversário de 10 anos do evento <a href="http://www2.dc.ufscar.br/diadejava/" target="_blank">É Dia de Java</a>, realizado na Faculdade Federal de São Carlos (UFSCar), organizado pelo <a href="http://soujava.org/" target="_blank">SOUJava</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGRfD2AxTaJ7nTyEZSvEeKC1WQq7wE-z_h2UhwPZg49W96fhlaNjUX4Aoa32gpnmUSx0BbedSlHb60SltsCjlD0IlM9DxmlXgs1NCQsDYISLq7SvOr9uKfweuSlei1IvAJ223DGot-rRTy/s1600/TDC2011-Agile-CD02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGRfD2AxTaJ7nTyEZSvEeKC1WQq7wE-z_h2UhwPZg49W96fhlaNjUX4Aoa32gpnmUSx0BbedSlHb60SltsCjlD0IlM9DxmlXgs1NCQsDYISLq7SvOr9uKfweuSlei1IvAJ223DGot-rRTy/s400/TDC2011-Agile-CD02.jpg" width="400" /></a></div>
Ainda no TDC, participei do painel "O que vem depois do Agile?" com nomes bem conhecidos pela comunidade Ágil. Publiquei um <a href="http://netfeijao.blogspot.com/2012/01/painel-tdc2011-o-que-vem-depois-do.html" target="_blank">post</a> recentemente sobre o Painel e uma palestra sobre DataGrid e NoSQL com JBoss Infinispan, que em breve publicarei aqui.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirWsnv9Xzra85YTPDePF2YniqxI2TLEXT-S2DpqJ3vXhMnEQIx92fn366tx_bZzqV-rV0BBkyz_0DRX0FzD_NCgZoN1IDnLdR81-wYWiLrf1iGGFaX9vQSPCRL2GT55vjTu4NqUChFZWPr/s1600/TDC2011-Agile-Debate02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirWsnv9Xzra85YTPDePF2YniqxI2TLEXT-S2DpqJ3vXhMnEQIx92fn366tx_bZzqV-rV0BBkyz_0DRX0FzD_NCgZoN1IDnLdR81-wYWiLrf1iGGFaX9vQSPCRL2GT55vjTu4NqUChFZWPr/s400/TDC2011-Agile-Debate02.jpg" width="400" /></a></div>
<br />
O evento É Dia de Java 2011 foi muito especial, primeiro porque foi a celebração de 10 anos do evento, e também porque pude reencontrar grandes amigos como <a href="https://twitter.com/#!/_afonseca" target="_blank">André Fonseca</a>, <a href="http://twitter.com/vsenger" target="_blank">Vinícius Senger</a> da Globalcode, <a href="https://twitter.com/#!/fabiovelloso" target="_blank">Fabio Velloso</a> e <a href="https://twitter.com/#!/brjavaman" target="_blank">Bruno Souza</a> do SOUJava e ter a satisfação de conhecer o grande <a href="http://twitter.com/dwildt" target="_blank">Daniel Wildt</a>.<br />
<br />
O evento foi bem bacana, na sexta feira o dia foi reservado para a realizacao de Workshops praticos, no meu caso, fiz um workshop de<a href="http://innovationgames.com/" target="_blank"> Innovation Games</a>, uma aborgagem lúdica inovadora criada por Luke Hohmann, para auxílio na criação de produtos, condução de retrospectivas e análise de problemas.<br />
<br />
Realizei com a turma, jogos como <a href="http://innovationgames.com/product-box/" target="_blank">Product Box</a>, <a href="http://innovationgames.com/remember-the-future/" target="_blank">Remember the Future</a>, <a href="http://innovationgames.com/speed-boat/" target="_blank">Speed Boat</a> e como plus (não é um Innovation Game), fizemos uma retrospectiva utilizando a técnica dos <a href="http://cantinhodoagile.blogspot.com/2011/01/aplicacao-os-seis-chapeus-na.html" target="_blank">06 Chapéus do Pensamento</a>.<br />
<br />
Abaixo uma das Product Box criada por um dos grupos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVUFIrD85xALWbghYPoWati0YQYQ1nPGp3W8uFppXJuhPbG7mAXY9ruAS4sBW0gXS357LYs3Ac5p86NbN5MAuGy5JFWr3mOmA_LD6I_O_186XlXK3MuqapKV3FfntQFXmT0IXOSyN1dx0v/s1600/IMAG0623.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVUFIrD85xALWbghYPoWati0YQYQ1nPGp3W8uFppXJuhPbG7mAXY9ruAS4sBW0gXS357LYs3Ac5p86NbN5MAuGy5JFWr3mOmA_LD6I_O_186XlXK3MuqapKV3FfntQFXmT0IXOSyN1dx0v/s400/IMAG0623.jpg" width="400" /></a></div>
<br />
No dia seguinte, foram várias palestras, sem falar que o evento estava lotado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgADqWUzjiw_Roa0okloanWSG05d8Wcf0gdjMaZSnBv4SVM5q13DuMQbRlCFal96zG0F4FPIk-j7Y3OM23PJairaCgwgrDuDOVFfFb7Obwq_hEa2NJJ2VMckQVHXR-E0kdK5pr_oAwc2Zu/s1600/IMAG0626.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgADqWUzjiw_Roa0okloanWSG05d8Wcf0gdjMaZSnBv4SVM5q13DuMQbRlCFal96zG0F4FPIk-j7Y3OM23PJairaCgwgrDuDOVFfFb7Obwq_hEa2NJJ2VMckQVHXR-E0kdK5pr_oAwc2Zu/s400/IMAG0626.jpg" width="400" /></a></div>
<br />
Minha palestra foi sobre Continuous Delivery e DevOps, o feedback foi muito bom, e várias pessoas solicitaram os slides. Sendo assim, aqui está.<br />
<div id="__ss_11083252" style="width: 425px;">
<br />
<br />
<strong style="display: block; margin: 12px 0 4px;"><a href="http://www.slideshare.net/wrsantos/continuous-delivery-e-devops" target="_blank" title="Continuous Delivery e DevOps">Continuous Delivery e DevOps</a></strong> <br />
<iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/11083252" width="425"></iframe><br />
<div style="padding: 5px 0 12px;">
View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/wrsantos" target="_blank">wrsantos</a></div>
</div>
Parabéns as pessoas que organizaram e participaram do evento na UFSCar e a Globalcode pelo excelente TDC. Esse ano se Deus quiser tem mais.<br />
<br />
<i>* Crédito ao pessoal da <a href="http://www.octo.com/" target="_blank">OCTO</a> por alguns dos slides sobre Integração Contínua.</i><br />
<br />
Diversão Garantida!!!<br />
<br />Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-11127007181798887522012-01-16T11:16:00.002-02:002012-01-16T11:16:55.279-02:00Continuous Delivery: Case de Sucesso com tecnologias .NET - Deploy em 7000 máquinas com apenas 3 cliques<br />
Em um recente <a href="http://blog.octo.com/en/continuous-delivery-how-do-we-deliver-in-3-clicks-to-7000-machines/" target="_blank">artigo</a>, Maxence Modelin discute de maneira bem detalhada, como a <a href="http://www.octo.com/br/" target="_blank">OCTO Technology</a>, criou um fluxo de implantação (<a href="http://www.informit.com/articles/article.aspx?p=1621865" target="_blank">Deployment Pipeline</a>), onde com apenas 3 cliques, o deploy de um serviço Windows é feito em 7000 máquinas, de um fornecedor de serviços de hosting, localizado na França.<br />
<br />
A solução descrita, cujo foco envolve o deploy de um serviço Windows, desenvolvido em C#, que se comunica via FTPS com um servidor Java.<br />
<br />
Uma caracteristica importante da solução, é o uso de uma plataforma de Integração Contínua baseado em ferramentas open-source, bem populares na comunidade Java, ao invés do uso do <a href="http://msdn.microsoft.com/en-us/library/ms364061.aspx" target="_blank">Team Foundation Server</a> fornecido pela Microsoft.<br />
<br />
Entre as tecnologias utilizadas para Integração Contínua, podemos destacar <a href="http://jenkins-ci.org/" target="_blank">Jenkins</a> como Servidor de Integração Contínua, <a href="http://maven.apache.org/" target="_blank">Maven</a> para gestão do projeto e <a href="http://nexus.sonatype.org/" target="_blank">Nexus</a> para a gestão do repositório.<br />
<br />
Para administração do farm de servidores, foi utilizado o software <a href="http://www.ocsinventory-ng.org/" target="_blank">OCS Inventory</a>. Um aplicativo web, responsável por centralizar todas as informações pelos Agentes OCS instalado em cada um servidores do farm. Que por sua vez, através das informações recebidas, efetua o deploy dos pacotes necessários nos servidores, sem a necessidade de uma ação do usuário.<br />
<br />
Para monitoração do ambiente, foi utilizado <a href="http://www.zabbix.com/" target="_blank">Zabbix</a>.<br />
<br />
A cadeia de entrega contínua, se resume a apenas 3 cliques, onde o primeiro deles, começa com a operação de commit no SVN, que inicia o processo de integração contínua orquestrado pelo Jenkins. Que após efetuar o checkout do projeto, executa o script do Maven, que efetua o build, executa os testes, e por fim, armazena os artefatos gerados no Nexus.<br />
<br />
O segundo clique, é para criação do pacote OCS, onde um profissional de operações (ops), executa um script shell, que extrai o artifato do Nexus e disponibiliza o pacote pronto para deploy no banco de dados do OCS. <br />
<br />
Para o terceiro clique, no contexto da empresa, este último passo é considerado um passo funcional, e não existe razão de ser automático. Quem decide quais máquinas irão receber os pacotes, são os profissionais de operações, através do OCS. Os desenvolvedores tem o mesmo acesso, porém, para fazer o deploy em ambiente de testes.<br />
<br />
Para assegurar que tudo ocorreu corretamente, operações utiliza duas ferramentas para feedback, que são o próprio OCS e Zabbix, e um usuário fake. Este usuário fake, é responsável por efetuar o download dos pacotes nas máquinas destino, e verificar se tudo ocorreu conforme o esperado.<br />
<br />
A figura a seguir, descreve os softwares e ações realizadas durante o fluxo de implantação.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisr7t7-4KjIj1fAQ2lgJj_VpyzJqRA7SZ4Ify_HedF8sry0k8taO1OMiy-VgCr2wwk_P47AzSKgG2CL0CN6XRH7zZoG2nzIq-BUEFovmhq5KMssLNeauddvb9QtAZaeafdKPU7ld0Fxdcb/s1600/Global-Architecture-Schema-bis.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisr7t7-4KjIj1fAQ2lgJj_VpyzJqRA7SZ4Ify_HedF8sry0k8taO1OMiy-VgCr2wwk_P47AzSKgG2CL0CN6XRH7zZoG2nzIq-BUEFovmhq5KMssLNeauddvb9QtAZaeafdKPU7ld0Fxdcb/s400/Global-Architecture-Schema-bis.png" width="356" /></a></div>
<br />
<br />
Um dos fatores imprescendíveis para o sucesso da Implantação Contínua, foi a abordagem DevOps dada ao projeto. Esta abordagem abriu a oportunidade para um compartilhamento das necessidades e visão entre os times de Desenvolvimento e Operações.<br />
<br />
Pois com a responsabilidade do deployment a cargo do time de desenvolvimento, ao invés do time de operações, talvez eles nunca teriam a real noção do trabalho realizado.<br />
<br />
E você, tem alguma estória de sucesso sobre implementações de Continuous Delivery e DevOps? Comente, discuta, colabore!<br />
<br />
<b>Nota:</b> O artigo que o texto destaca é um pouco antigo, mas como esse post era para ser uma notícia na InfoQ Brasil no ano passado, mas como não foi aprovado então resolvi publicar aqui. Espero que curtam! Pois o case foi bem interessante, por se tratar de um case de Continuous Delivery para um aplicativo .NET, utilizando ferramentas open source Java.<br />
<br />
<br />Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com1tag:blogger.com,1999:blog-544668644670311424.post-50907051279180939042012-01-13T17:41:00.002-02:002012-01-13T17:55:01.936-02:00Jez Humble on Continuous Delivery and DevOps<br />
In the last year, during the period i have been in France, attending <a href="http://www.usievents.com/" target="_blank">Université du SI</a>, one of the best conferences i've participate in whole life (sponsored by <a href="http://www.octo.com/br" target="_blank">OCTO Technology</a>), i had the privilege of being invited to participate in a very interesting course with <a href="https://twitter.com/#!/jezhumble" target="_blank">Jez Humble</a>, about <a href="http://www.thoughtworks.com/events/thoughtworks-continuous-delivery-devops" target="_blank">Continuous Delivery for DevOps.</a><br />
After the course, i could make an <a href="http://www.infoq.com/br/articles/jezhumble-continuous-delivery-devops" target="_blank">interview</a> for <a href="http://www.infoq.com/br" target="_blank">InfoQ Brazil</a>, but for obvious reasons we translated it to Brazilian Portuguese. And now, here goes the original version. Enjoy!<br />
<br />
<b>You wrote a best seller, called Continuous Delivery, What is it all about?</b><br />
<br />
It's about all the stuff that is normally considered somewhat peripheral to software development - configuration, build and deployment management, automated testing, continuous integration, infrastructure and database management. However the discovery that many of us made while working on large agile projects was that this stuff is essential if you want to be able to reliably, repeatably release high quality software.<br />
<br />
Actually many of the ideas in the book aren't new. It's really a call to arms to focus on the engineering practices that were always at the heart of agile methodologies, but that somehow got sidelined in many places over the last ten years. Of course several tools like Puppet, Chef, Git and DbDeploy have emerged that didn't exist ten years ago that make much of this stuff much more tractable.<br />
<br />
It turns out that the engineering practices - particularly automation of build, test, deployment, and database and infrastructure management - and collaboration between development, testing and operations - are really essential to be able to get high quality software delivered fast. And that, in turn, is central to the ability of organizations to innovate and get new features out of the door quickly and reliably.<br />
<br />
<b>What practices do you think are more important?</b><br />
<br />
For developers, you need to start with continuous integration. That doesn't mean installing a CI server and pointing it at your feature branches - it means making sure everyone <a href="http://continuousdelivery.com/2011/07/on-dvcs-continuous-integration-and-feature-branches/">merges regularly into mainline</a> (and yes, that applies to Git too). In order for CI to be useful, you need automated tests, in particular at the unit and acceptance level. Having a comprehensive, maintainable set of unit tests is almost impossible without doing TDD. Creating maintainable acceptance tests requires close collaboration between developers and testers. Finally, you need to validate every build to ensure it's production ready, which means having the ability to spin up production-like testing environments on demand and run realistic loads against your system. This requires automated provisioning of environments and infrastructure, and automated deployment of your system, including any database changes. All of this needs to be implemented within the context of the <a href="http://www.informit.com/articles/article.aspx?p=1621865">deployment pipeline</a>.<br />
<br />
These kinds of changes need to be made incrementally, by finding out where the constraints are in your delivery process and removing them one by one. That in turn requires close collaboration between developers, testers and the operations department. More on that later.<br />
<br />
<b>We have seen, that some people make some confusion about the term Continuous Delivery, can you explain to us, what's the difference between Continuous Delivery and Continuous Deployment?</b><br />
<br />
Continuous delivery means you can release on demand. I should be able to release the latest good build at the press of a button without having to worry that it's going to break. But when you release is a business decision. Continuous deployment means you actually go ahead and release every good build. Obviously that only really applies in the context of websites or software-as-a-service. But if you can't actually do continuous deployment and release every good build for some reason - say you're working on a user-installed product - you should at the very least be putting every good build into a production-like environment and running realistic acceptance and performance tests against it so that there are no surprises when you come to release it. You can do that on embedded systems, products, pretty much anything that involves software.<br />
<br />
Organizations that could in principle do continuous deployment really should aim to. One of the key benefits is organizational. Continuous deployment makes developers care much more about the quality and reliability of what they're doing because if they can push a button to make their changes go live, it connects them with what's going on in production. And it makes the business focus much less on stuffing features into a release when they know they can create some small feature, have it in production in a couple of days' time, and get real feedback on whether it's valuable and whether more effort should be put into it. It is a complete paradigm shift in the way organizations work and they become much more responsive to their customers. Eric Ries writes more about this in his forthcoming book, <a href="http://theleanstartup.com/" target="_blank">The Lean Startup</a><br />
<br />
<b>Can you explain to us, the term DevOps, and what that means?</b><br />
<br />
DevOps is kind of an anti-movement, by which I mean it has resisted attempts to pin it down. But fundamentally it's about putting a strong focus on collaboration between everybody involved in software delivery - in particular, developers, testers and operations - and sharing knowledge and techniques between them. Infrastructure-as-code is one example of knowledge sharing - the application of agile techniques such as refactoring and test-driven development to evolving your infrastructure. DevOps is essential to achieve continuous delivery.<br />
<br />
Part of the reason people in the movement have resisted (for example) creating a manifesto is to prevent vendors (in particular tool vendors) from appropriating it and trying to own it. Often people are guilty of reaching for tools (even within the movement - myself included) when actually it's the attitude and mindset that makes you successful. That's not to say the tools aren't important - they are. Tools that can't be managed in an automated fashion through an API are especially unpopular within the community.<br />
<br />
<b>How do you implement DevOps?</b><br />
<br />
One really good way to start is to get representatives from every part of the organization involved in delivery - development, testing, infrastructure, operations, product management - to get together regularly and have retrospectives to reflect on how to incrementally improve things. In many organizations, you never see people from every department in a meeting together. It just doesn't happen.<br />
<br />
Another way to get going is for everyone involved in delivering software celebrate successful releases together. Really implementing DevOps is about change that works up from the people on the ground - it's hard to mandate it. That's one of the reasons senior management has a hard time with it. But it's also the secret sauce - incremental, bottom-up change is usually the most effective and long-lasting.<br />
<br />
What skills related to Infrastructure a modern developer should have? And why it is important? Does it make sense, for companies that are not in the cloud?<br />
<br />
I think the key element is that infrastructure provisioning and management has to be automated. It should be possible to plug a new server (or workstation) in - power and network - and bring it into the correct state, configure it, and deploy to it in a fully automated fashion. You can do that whether or not you're in the cloud. In fact ThoughtWorks recently did some consulting to automate hardware provisioning and management for one of the cloud vendors. Under the hood, "the cloud" of course runs on real hardware and the same principles apply.<br />
<b><br /></b><br />
<b>For great companies, that has already an Operation Department, what a developer can do to decrease this gap between devs and ops?</b><br />
<br />
First of all, get to know your operations department. Make friends with them. Invite them along to your retrospectives and showcases. Learn the tools they use. Help them build new ones. Read books like Release It! that talk about how to create production-ready software. Check out the screens they have up that show off production metrics. Get the same screens put up in development rooms (LCD panels are cheap these days). Ask to help out when releases happen. Get involved.<br />
<b><br /></b><br />
<b>Can you talk about your job at ThoughtWorks?</b><br />
<br />
I'm working on a number of things. On the one hand I am doing a lot of travelling at the moment, going to conferences and talking to our customers. I'm also doing some research and writing, including working on a series of interviews to create some videos about continuous delivery. Finally I'm doing some consulting work to make sure I keep my feet on the ground and stay in touch with the latest developments in the space, and of course to pay my way.<br />
<br />
------------------------------------------------<br />
<br />
<a href="http://jezhumble.net/" target="_blank">Jez Humble</a> is a Principal at ThoughtWorks Studios, and author of <a href="http://www.amazon.com/gp/product/0321601912?tag=contindelive-20" target="_blank">Continuous Delivery</a>, published in Martin Fowler’s Signature Series (Addison Wesley, 2010). He has worked with a variety of platforms and technologies, consulting for non-profits, telecoms, financial services, and online retail companies. His focus is on helping organisations deliver valuable, high-quality software frequently and reliably through implementing effective engineering practices.<br />
<div>
<br /></div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-42929879632435545032012-01-09T16:14:00.000-02:002012-01-13T18:31:56.282-02:00[Painel TDC2011] O que vem depois do Agile?No ano passado, tive o privilégio de participar do <a href="http://www.thedevelopersconference.com.br/" target="_blank">TDC 2011</a>, um evento super massa concebido pela <a href="http://www.globalcode.com.br/" target="_blank">Globalcode</a>, que contou com o o apoio de grandes nomese empresas da Indústria de Software.<br />
Participei de um painel bem bacana, mediado pelos meus amigos <a href="https://twitter.com/#!/felipero" target="_blank">Felipe Rodrigues</a> da <a href="http://www.crafters.com.br/" target="_blank">Crafters</a>, e Victor Hugo Germano.<br />
O tema da discussão foi <i><b>O que vem depois do Agile?</b></i><br />
Segue a descrição oficial.<br />
<blockquote class="tr_bq">
A adoção da agilidade tem crescido muito no mercado brasileiro e cada vez mais grandes empresas tem aderido ao seu uso. Isso aumenta sua visibilidade, mas também vai exigindo adaptações nem sempre fáceis ou bem recebidas pela comunidade.<br />
A grande pergunta que surge é: Qual é o próximo passo? O que vem depois do Agile?</blockquote>
<div>
Abaixo segue o vídeo do painel</div>
<br />
<br />
<br />
<br />
<center><iframe allowfullscreen="" frameborder="0" height="230" mozallowfullscreen="" src="http://player.vimeo.com/video/33355978?title=0&byline=0&portrait=0" webkitallowfullscreen="" width="400"></iframe><br />
<a href="http://vimeo.com/33355978" target="_blank">TDC2011 SP - Painel (O que vem depois do Agile) - Domingo, 10 de Julho</a> from <a href="http://vimeo.com/globalcode" target="_blank">Globalcode</a> on <a href="http://vimeo.com/" target="_blank">Vimeo</a>.</center>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-14876569225383112522011-10-13T00:45:00.000-03:002011-10-13T00:45:40.435-03:00Distribuição de Dados com Infinispan na Java Magazine 95Este mês, foi publicado na revista <a href="http://www.devmedia.com.br/post-22320-Revista-Java-Magazine-95.html">Java Magazine 95</a>, um artigo meu sobre <a href="http://www.jboss.org/infinispan">JBoss Infinispan</a>.<br />
Uma das maneiras mais fáceis de melhorar a performance de uma aplicação é trazer os dados para mais perto dela e manter um formato que seja simples para ela consumir.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3BAIPHCeQeXSNAzLzvrcaQPFqOECOWPcCtCneSByaBsLPTytBqcmiHkalVJpcgH33214x3J3-pNQKlUQ5e5F0b9gYt9RlXlekUrsRXkOtQPyovyPwnGm6bzEEo0n39qZXOHB2YyI2cLR9/s1600/java95_online.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3BAIPHCeQeXSNAzLzvrcaQPFqOECOWPcCtCneSByaBsLPTytBqcmiHkalVJpcgH33214x3J3-pNQKlUQ5e5F0b9gYt9RlXlekUrsRXkOtQPyovyPwnGm6bzEEo0n39qZXOHB2YyI2cLR9/s1600/java95_online.jpg" /></a></div><br />
A maioria das aplicações escritas em Java, consomem dados que geralmente são armazenados em bancos de dados relacionais, como Oracle, MySQL, entre outros. Isto significa que para a aplicação consumir estes dados, precisa converter as informações que estão armazenadas em tabelas em objetos.<br />
Por conta da natureza tabular destes dados, o processo de conversão de dados para objeto em memória pode ser muito custoso, e nem sempre é fácil. Para remediar estes problemas, ferramentas ORM como Hibernate e EclipseLink utilizam mecanismos de cache para armazenar os objetos internamente. Entretanto, quando a aplicação cresce e é necessário escalá-la para múltiplos servidores, e neste momento, começam a surgir vários problemas de sincronização de dados.<br />
Para ajudar a resolver este problema, podemos utilizar uma plataforma de Data Grid. Dentro desta categoria, existem diversos frameworks e soluções, entre eles: Hazelcast, GigaSpaces, Oracle Coherence, Joafip, GridGain, ExtremeScale e JBoss Infinispan. .<br />
Utilizei o JBoss Infinispan recentemente, em um projeto de grande porte, de uma nova URA inteligente, para uma grande empresa de Telecom da Itália. O sistema, foi distribuído em dois sites diferentes, com clusters com diversas máquinas.<br />
A partir daí, surgiu a idéia de fazer este artigo. Neste artigo abordo além da computação em grid com ênfase na plataforma de datagrid Infinispan, abordo e a importância de seu uso em um ambiente corporativo, que tem necessidades mais específicas do que simplesmente criar um cache de dados.<br />
Apresento os diferentes modos para criar um cache e seus conceitos, como Replicação, Invalidação, Distribuição, L1 Caching e Cache Local, assim como os benefícios de cada uma destas abordagens. E ao final, como transformar o Infinispan em uma solução NoSQL, utilizando Cache Stores com o Módulo REST.<br />
Para concluir, apresento os módulos disponíveis para o desenvolvedor tirar ainda mais proveito desta poderosa plataforma, onde exploro como configurar um Módulo REST para acesso aos objetos no Grid via protocolo HTTP.<br />
<br />
<b>Sobre o Infinispan</b><br />
<br />
Infinispan é uma plataforma para grid de dados open source distribuída pela JBoss. Geralmente, data grids são utilizados para reduzir a latência do banco de dados, prover alta disponibilidade e storage elástico dos dados, como soluções NoSQL. Data Grids podem ser utilizados em conjunto com bancos de dados tradicionais ou como cache distribuído, para acesso rápido aos dados.<br />
Ao escolher o Infinispan no lugar de um simples cache, temos as seguintes vantagens:<br />
<br />
<ul><li><b>Cluster:</b> Podemos distribuir nosso cache em cluster com apenas algumas configurações;</li>
<li><b>Eviction:</b> Mecanismo automático de eviction para evitar erros de out-of-memory e controle do melhor uso da memória;</li>
<li><b>Cache Loader:</b> É possível configurar cache loaders (ver tópico “Cache Loader”) para persistir o estado dos objetos em um banco de dados ou em um arquivo no disco;</li>
<li><b>Suporte a JTA e compatibilidade com XA:</b> Gerenciamento de transação com qualquer aplicação compatível com JTA;</li>
<li><b>Gerenciamento:</b> É possível gerenciar e monitorar os objetos de uma instância do grid de dados através de componentes JMX ou utilizar um console gráfico com RHQ.</li>
</ul><br />
Caso se interesse por soluções desta natureza, entre em contato conosco!Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com1tag:blogger.com,1999:blog-544668644670311424.post-56853563095716203802011-10-12T19:16:00.004-03:002011-10-12T23:56:15.025-03:00Desenvolvimento Portlets: JSRs 168 e 286Duas JSRs, 168 e 286, atendem à criação de portlets. Em outubro de 2003 o JCP lançou a JSR-168, a primeira especificação que padroniza como os componentes devem ser desenvolvidos para os servidores de portal. Como as outras grandes JSRs, a JSR-168 possui o aval dos maiores fornecedores de portais. Esta especificação atende aos seguintes quesitos:<br />
<ul><li>O contrato de contêiner de portlet e o gerenciamento do ciclo de vida do portlet; </li>
<li>A definição dos estados das janelas e os modos do portlet; </li>
<li>Gerenciamento das preferências do Portlet; </li>
<li>Informações do Usuário como nome, endereço, e-mail, que podem ser informadas no arquivo de deployment descriptor e que podem ser recuperadas por um objeto <i>Map</i> através da constante <b>USER_INFO</b> definida na interface <i>PortletRequest</i>; </li>
<li>Empacotamento e Deployment; </li>
<li>Segurança; </li>
<li>Tags para JSF. </li>
</ul>Mas, quando grandes fornecedores como a Apache, BEA, Borland, Oracle, IBM, SAP entre outros que fazem parte do expert group da JSR-168 começaram a criar as suas soluções de Portal, começaram a surgir também alguns problemas relacionados à limitação da especificação que antes não haviam sido detectados.<div>Conforme a adoção por soluções de portal baseadas na JSR 168 começou a aumentar, naturalmente o público consumidor destas soluções e o próprio negócio passou a demandar cada vez mais funcionalidades, que não haviam sido contempladas, fazendo com que soluções proprietárias fossem criadas pelos fornecedores. Entre as limitações da primeira versão da especificação de Portlets (JSR-168), podemos citar:<br />
<ul><li>Falta de filtros para portlets (similar aos Filtros nos Servlets); </li>
<li>Ausência de funcionalidades para a intercomunicação entre os portlets; </li>
<li>Limitação do Escopo de Sessão do Portlet, onde a sessão do Portlet na JSR 168 se restringe apenas ao ID individual da aplicação e não da sessão do usuário do Portal. </li>
</ul>Essas limitações culminaram no lançamento da JSR 286, que define a segunda versão da API de Portlets. A JSR 286 incluiu novas funcionalidades como tratamento de eventos, envio e recebimento de parâmetros (permitindo a passagem de parâmetros entre os portlets), inclusão de filtros, suporte a Ajax e a disponibilidade de recursos do servidor, com o uso da interface <i>ResourceServingPortlet</i>.<br />
<br />
<div style="text-align: center;"><b>Contrato do Contêiner e Gerenciamento do ciclo de vida do Portlet</b></div><br />
A especificação da JSR-286 define um contrato para o contêiner de portlets. O contrato define quais métodos o contêiner deve chamar durante o ciclo de vida do portlet mediante o uso da interface <i>javax.portlet.Portlet</i>. O desenvolvedor pode implementar estes métodos para fornecer a funcionalidade desejada. Dessa forma, todo portlet tem que implementar esta interface, seja implementando-o diretamente ou estendendo uma classe existente que a implemente.<br />
Os métodos do ciclo de vida executados pelo contêiner definidos pela interface <i>javax.portlet.Portlet</i> são apresentados na <b>Tabela 1</b>.<div class="MsoNormal"><br />
</div><table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-bottom-style: none; border-collapse: collapse; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; width: 494px;"><tbody>
<tr> <td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR">Método<o:p></o:p></span></b></div></td> <td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR">Descrição<o:p></o:p></span></b></div></td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">init()</span></b><span lang="PT-BR"><o:p></o:p></span></div></td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"><div class="MsoNormal" style="text-indent: 0cm;"><span lang="PT-BR">Método executado quando o portlet for instanciado no contêiner.<o:p></o:p></span></div></td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">processAction()</span></b><span lang="PT-BR"><o:p></o:p></span></div></td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"><div class="MsoNormal" style="text-indent: 0cm;"><span lang="PT-BR">Chamado após o usuário submeter requisições ao portlet. É onde processamos os inputs disparados por uma ação do usuário do portlet.<o:p></o:p></span></div></td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">render()</span></b><span lang="PT-BR"><o:p></o:p></span></div></td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"><div class="MsoNormal" style="text-indent: 0cm;"><span lang="PT-BR">Chamado sempre que o portlet é reconstruído na tela.<o:p></o:p></span></div></td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">destroy()<o:p></o:p></span></b></div></td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"><div class="MsoNormal" style="text-indent: 0cm;"><span lang="PT-BR">Executado no momento em que o contêiner destrói o portlet. Útil para liberarmos recursos que não estejam sendo utilizados, por exemplo, conexões com banco de dados.<o:p></o:p></span></div></td> </tr>
</tbody></table><div style="text-align: center;"><span class="Apple-style-span" style="font-size: x-small;"><b>Tabela 1.</b> Métodos do ciclo de vida de um portlet</span></div><div><br />
</div>A especificação da JSR-286 ainda fornece interfaces opcionais para controle do ciclo de vida que o Portlet pode implementar como <i>EventPortlet</i>, que permite ao Portlet reagir às ações ou mudanças de estado oriundas da interação do usuário com o portlet ou ações originadas por outros portlets e a interface <i>ResourceServingPortlet</i>, utilizada para disponibilizar recursos do servidor no Portlet.<br />
<br />
<div style="text-align: center;"><b>Portlet Modes e Window States</b></div><br />
Para cada portlet existem dois itens de estado gerenciado, que são o modo do portlet (portlet mode) e o estado da janela (window state). Cada portlet possui um “portlet mode” corrente que indica a função que o portlet está realizando.<br />
Os <b>modes</b> (ou <b>modos</b>) definidos na especificação são <b>VIEW</b>, <b>EDIT</b> e <b>HELP</b>. Estes modos são utilizados pelo método de renderização <i>render()</i>, conforme vimos na <b>Tabela 1</b>, para decidir qual método de visualização deve ser chamado. Os métodos de renderização chamados são apresentados na <b>Tabela 2</b>.<br />
<br />
<table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 480;"><tbody>
<tr> <td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR">Método</span></b><span lang="PT-BR"><o:p></o:p></span></div></td> <td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 400.9pt;" valign="top" width="401"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR">Descrição</span></b><span lang="PT-BR"><o:p></o:p></span></div></td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">doView()</span></b><span lang="PT-BR"><o:p></o:p></span></div></td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 400.9pt;" valign="top" width="401"><div class="MsoNormal" style="text-indent: 0cm;"><span lang="PT-BR">Método chamado por </span><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">render()</span></b><span lang="PT-BR"> quando o portlet está em modo de visualização (</span><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">VIEW</span></b><span lang="PT-BR">). Deve conter a lógica que apresenta a página de Visualização para o portlet.<o:p></o:p></span></div></td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">doEdit()</span></b><span lang="PT-BR"><o:p></o:p></span></div></td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 400.9pt;" valign="top" width="401"><div class="MsoNormal" style="text-indent: 0cm;"><span lang="PT-BR">Chamado por </span><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">render()</span></b><span lang="PT-BR"> quando o portlet está em modo de edição (</span><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">EDIT</span></b><span lang="PT-BR">).<o:p></o:p></span></div></td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"><div class="MsoNormal" style="text-indent: 0cm;"><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">doHelp()</span></b><span lang="PT-BR"><o:p></o:p></span></div></td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 400.9pt;" valign="top" width="401"><div class="MsoNormal" style="text-indent: 0cm;"><span lang="PT-BR">Chamado por </span><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">render()</span></b><span lang="PT-BR"> quando o portlet está em modo de ajuda (</span><b><span lang="PT-BR" style="font-family: 'Arial Narrow';">HELP</span></b><span lang="PT-BR">) .<o:p></o:p></span></div></td> </tr>
</tbody></table><div style="text-align: center;"><span class="Apple-style-span" style="font-size: x-small;"><b>Tabela 2. </b>Métodos de renderização do Portlet Mode</span></div><br />
A classe <i>PortletMode</i> define constantes para estes portlet modes. A disponibilidade dos modos para o portlet pode ser restrito a roles (papéis) específicos de usuários do portal. Por exemplo, um usuário anônimo pode acessar o portlet apenas nos modos <b>VIEW</b> e <b>HELP</b>, enquanto que a role <b>EDIT</b> pode ser utilizada somente por usuários autenticados.<br />
Outro tipo de estado gerenciado, o <b>estado da janela</b> (<i>window state</i>), apresenta a quantidade de informações que será disponibilizada para o portlet. A especificação define três tipos de estados para cada portlet, que são: <b>normal</b>, <b>maximizado</b> e <b>minimizado</b>. A classe <i>WindowState</i> possui constantes para estes estados da janela.<br />
Para um maior entendimento, a <b>Figura 1</b> apresenta estes conceitos de<i> portlet mode</i> e <i>window state </i>aplicados a um portlet.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-d2Pa-x8LssgQCjq7jtEXRkFdY9LSe5KcaM2Z21S9c-1lCnQnw6BjZzkZoM8ytm0kPEL0ykt5BJrh5_VAadU94kyhlb_SVzmCWO5dCGTHop3EqbtZr9e9pAo-X1E1nO7jQN4ZZSgoWhH6/s1600/AnatomiaPortlet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-d2Pa-x8LssgQCjq7jtEXRkFdY9LSe5KcaM2Z21S9c-1lCnQnw6BjZzkZoM8ytm0kPEL0ykt5BJrh5_VAadU94kyhlb_SVzmCWO5dCGTHop3EqbtZr9e9pAo-X1E1nO7jQN4ZZSgoWhH6/s320/AnatomiaPortlet.png" width="320" /></a></div><div style="text-align: center;"><span class="Apple-style-span" style="font-size: x-small;"><b>Figura 1.</b> Anatomia de um portlet</span></div>Opcionalmente o desenvolvedor pode especificar tipos customizados de modo e estado de janela, alterando o arquivo portlet.xml com uso da tag <b>custom-window-state</b> para estados de janela e <b>custom-portlet-mode</b> para modos.<br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">JSF/Portlet Bridge</span></b><br />
<br />
Como parte do projeto OpenPortal da Sun, foi criado o projeto JSF/Portlet Bridge, que tem como objetivo fornecer uma biblioteca de integração que permita que aplicações desenvolvidas com JSF possam ser executadas em um ambiente de Portlet.<br />
Para atender à especificação de portlets, o JCP disponibilizou a JSR 301 para definir como um portlet 286 interage com os artefatos do JSF. A especificação foi para votação em Julho de 2006, mas somente em Janeiro de 2009 o draft da proposta final foi disponibilizada para o público.<br />
Portlet Bridge é uma tecnologia utilizada por um portlet para fazer uma ponte (por isso o nome bridge) para um ambiente de execução, onde diferentes abstrações são utilizadas para processar as interações com o usuário ou para renderizar a interface gráfica.<br />
O Portlet Bridge age como um engine tradutor entre o ambiente de portal e o sistema destino, neste caso, uma aplicação desenvolvida com o framework JSF. Ele ainda fornece uma abstração do ambiente de portal para o ambiente do bridge, deixando os desenvolvedores livres para executar aplicações Faces como portlets, sem a necessidade de conhecerem os detalhes das APIs de portlet e seu modelo de desenvolvimento.<br />
A <b>Figura 2</b> ilustra uma aplicação portlet utilizando o JSF/Portlet Bridge para executar páginas Faces como se fossem fragmentos de um portlet<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8plsrUeNPgp77TnwnDL_QZuAksYBPEniSlg7GGiY4QVqrQLjjv_gDltfPxpgddxXJuSl3gJGDHALw5ntAbUjm3YYS2L4elnwhmf5JzemMYcLLa7LgXvQP0Cfw_bLZ8x56zxnshSvpf22e/s1600/JSFPortletBridge.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8plsrUeNPgp77TnwnDL_QZuAksYBPEniSlg7GGiY4QVqrQLjjv_gDltfPxpgddxXJuSl3gJGDHALw5ntAbUjm3YYS2L4elnwhmf5JzemMYcLLa7LgXvQP0Cfw_bLZ8x56zxnshSvpf22e/s1600/JSFPortletBridge.png" /></a></div><div style="text-align: center;"><span class="Apple-style-span" style="font-size: x-small;"><b>Figura 2</b>. JSF/Portlet Bridge entre uma aplicação Portlet e uma aplicação JSF.</span></div><br />
<div style="text-align: center;"><b>Transformando sua aplicação JSF em um portlet</b></div><br />
Para tornar uma aplicação JSF compatível com a JSR 168/286 é preciso fazer algumas alterações na aplicação antes de executá-la como um portlet.<br />
Primeiro, para utilizar o JSF Portlet/Bridge é preciso efetuar o download da biblioteca <i>jsf-portlet.jar</i> no site java.net (ver ao final, em <b>Referências</b>) e copiá-la para o diretório <i>WEB-INF/lib</i> da aplicação JSF que você deseja executar como portlet.<br />
Uma vez adicionado o arquivo <i>.jar</i> ao classpath da aplicação, é preciso adicionar o arquivo deployment descriptor <i>portlet.xml</i> para o portlet. Neste arquivo vamos informar a classe <i>com.sun.faces.portlet.FacesPortlet</i> para a tag portlet-class. Esta classe é a implementação da interface <i>javax.portlet.Portlet </i>fornecida pela biblioteca do JSF/Portlet Bridge, e é ela que fará o trabalho de converter as páginas JSF para páginas de visualização no Portlet.<br />
É preciso também informar qual página queremos utilizar como página inicial do portlet, informando o parâmetro de portlet <b>com.sun.faces.portlet.INIT_VIEW</b> para a página desejada, conforme mostra a <b>Listagem 1</b> entre as linhas 08 e 15.<br />
<pre class="xml" name="code"><?xml version="1.0" encoding="UTF-8"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd
http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
<portlet>
<description>Portlet JSF</description>
<portlet-name>Teste</portlet-name>
<display-name>Portlet JSF/Portlet Bridge</display-name>
<!—Incluir esta classe para a implementação de Portlet -->
<portlet-class>com.sun.faces.portlet.FacesPortlet</portlet-class>
<!—Parâmetro obrigatório, que deve indicar a página inicial da aplicação JSF ->
<init-param>
<description>Página inicial do Portlet </description>
<name>com.sun.faces.portlet.INIT_VIEW</name>
<value>/index.jsp</value>
</init-param>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
<portlet-mode>EDIT</portlet-mode>
<portlet-mode>HELP</portlet-mode>
</supports>
<portlet-info>
<title>Portlet JSF</title>
<short-title>JSF</short-title>
</portlet-info>
</portlet>
</portlet-app>
</pre><div style="text-align: center;"><span class="Apple-style-span" style="font-size: x-small;"><b>Listagem 1.</b> Portlet.xml de uma aplicação JSF</span></div>Para incluir a página de edição do portlet, o procedimento é similar. Nos parâmetros iniciais do arquivo portlet.xml, devemos incluir o parâmetro de portlet <b>com.sun.faces.portlet.INIT_EDIT</b>, conforme o trecho da <b>Listagem 2</b>. Essa ação fará com que o contêiner de portlets interprete a página JSF editar.jsp citada na listagem, como modo de visualização <b>EDIT</b>.<br />
<br />
<pre class="xml" name="code"><init-param>
<description>Página de Edição do Portlet</description>
<name>com.sun.faces.portlet.INIT_EDIT</name>
<value>/editar.jsp</value>
</init-param>
</pre><div style="text-align: center;"><span class="Apple-style-span" style="font-size: x-small;"><b>Listagem 2.</b> Inclusão da página de edição JSF no portlet</span></div><br />
O mesmo se aplica para a página <b>HELP</b>, com a inclusão do parâmetro <b>com.sun.faces.portlet.INIT_HELP</b>.<br />
</div><div>Além disso, se em nossa aplicação houver mais de uma página, podemos atribuir regras de navegação para cada uma destas páginas, e por ser uma aplicação JSF o modelo de navegação é o do próprio JavaServer Faces.<br />
<br />
O modelo de navegação do JSF torna fácil o trabalho de definir a regra de navegação das páginas do projeto, com a utilização de apenas algumas linhas no arquivo <i>faces-config.xml</i> da aplicação JSF. Podemos indicar qualquer página do portlet como referência para navegação, conforme demonstra a <b>Listagem 3</b>.<br />
<br />
Na <b>Listagem 3</b>, utilizamos o modelo de navegação declarativo do próprio JSF para definir a navegação de um portlet. Como não é o escopo deste artigo, não iremos explicar o funcionamento das regras de navegação do JavaServer Faces, mas apenas para ilustrar, nesta listagem definimos uma regra que ao ser disparada uma ação na página <i>editar.jsp</i>, a aplicação irá navegar desta página para a página <i>index.jsp</i>, se o resultado referenciado pelo componente que disparou a ação de navegação da página <i>editar.jsp</i> for <b>success</b>.<br />
</div><pre class="xml" name="code"><navigation-rule>
<from-view-id>/editar.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/index.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</pre><div style="text-align: center;"><span class="Apple-style-span" style="font-size: x-small;"><b>Listagem 3.</b> Navegação entre páginas JSF em um portlet</span></div><div>Por fim, para executar a aplicação é preciso somente efetuar o deploy do arquivo WAR para o seu servidor de portal preferido.</div><div><b><span class="Apple-style-span" style="font-size: large;">WSRP </span></b><br />
WSRP significa <i>Web Services for Remote Portlets</i>, ou web services para portlets remotos. WSRP é uma tecnologia definida pela <u>OASIS</u>, e propõe um padrão para web services visuais que podem ser plugados em ambientes de portal que estejam aderentes à especificação, ou seja, se em um web service padrão nós reutilizamos o serviço com WSRP, reutilizamos toda a interface gráfica. <br />
<blockquote><b>OASIS</b>: Consórcio global formado por grandes empresas de tecnologia da informação como IBM, SAP, AG, Sun Microsystems, que conduz o desenvolvimento, convergência e adoção de padrões para e-business e web services, produzindo diversas especificações e padrões relacionados a áreas como SOA, web services, processamento de XML, segurança da informação e supply chain. </blockquote>Atualmente a API WSRP está na versão 2.0 e possui um fluxo bem simples. O <i>owner</i> do portal ou da aplicação primeiro inclui em seu ambiente de portal um web service de terceiro (WSRP) dentro de um portlet. A partir deste momento, o portlet irá interagir com o conteúdo e com os serviços descritos no documento wsdl do WSRP, conforme veremos em detalhes mais adiante.<br />
<br />
Um WSRP define: <br />
<ul><li>Uma interface <u>WSDL</u> para invocação dos serviços WSRP; </li>
<li>Como publicar, buscar, e efetuar bind dos serviços WSRP e metadados; </li>
<li>Regras de fragmentação por marcação, para marcações emitidas pelos serviços WSRP. </li>
</ul></div><div><blockquote><b>WSDL</b>: Significa Web Service Definition Language, é uma linguagem baseada em XML utilizada para descrever web services. Além de descrever o serviço, um documento WSDL especifica os métodos e operações disponíveis e como acessá-los. </blockquote><br />
WSRP é útil para o desenvolvimento web pois ele desacopla o deployment da entrega da aplicação, assim como fornece tanto os dados quanto a lógica de apresentação e requer pouca ou nenhuma programação para implementação do serviço. Além disso, WSRP fornece uma série de benefícios adicionais, como interoperabilidade e portabilidade. Normalmente um servidor de portal pode atuar como um produtor ou consumidor de WSRP.<br />
Graças a essa interoperabilidade com o WSRP, podemos então rodar portlets Java remotos em uma ferramenta de portal que não seja em Java, como no Microsoft SharePoint. <br />
Entre as desvantagens, estão a adoção ainda baixa por parte dos fornecedores, e a performance, que tende a ser baixa em grandes aplicações. <br />
<br />
<b>Como funciona? </b><br />
<br />
Basicamente, um WSRP envolve dois componentes, além do portlet em si, conforme demonstra a <b>Figura 3</b>. A aplicação remota, conhecida como WSRP <i>Producer</i>, implementa os padrões de web services utilizando a especificação SOAP (<i>Simple Object Access Protocol</i>) sobre HTTP. <br />
O WSRP Producer fornece um conjunto de operações para os consumidores do serviço, onde dependendo da implementação, o <i>Producer</i> pode tanto oferecer apenas um portlet quanto pode fornecer um ambiente para gerenciamento de diversos portlets. Resumindo, o WSRP <i>Producer</i> é um web service verdadeiro, com um WSDL e um conjunto de endpoints. Cada WSRP <i>Producer</i> é descrito utilizando um documento WSDL padrão. <br />
O segundo componente é o WSRP <i>Consumer</i>, que é o cliente do serviço e que age como uma aplicação de portal para consumir o serviço baseado no arquivo WSDL do <i>Producer</i>.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSEAcm5Ug4mGycs1wHlFXbXd36jYnokxaLqC8-HiZTRw2AaZhpLfujwRURQ0-Y1J_qFw3IDquJuZuYh52_A7AhgNcunhK36_hBDfjK0y956RpYGES81LGzaBtkAV3qhcAwsmB5eZyVcRpQ/s1600/WSRP.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSEAcm5Ug4mGycs1wHlFXbXd36jYnokxaLqC8-HiZTRw2AaZhpLfujwRURQ0-Y1J_qFw3IDquJuZuYh52_A7AhgNcunhK36_hBDfjK0y956RpYGES81LGzaBtkAV3qhcAwsmB5eZyVcRpQ/s1600/WSRP.png" /></a></div><div><div class="FiguraLegenda" style="text-align: center;"><b><span lang="PT-BR"><span class="Apple-style-span" style="font-size: x-small;">Figura 3.</span></span></b><span lang="PT-BR"><span class="Apple-style-span" style="font-size: x-small;"> Consumo de um WSRP</span><o:p></o:p></span></div><div class="Intertitulo2"><span lang="PT-BR"><br />
</span></div><div class="Intertitulo2" style="text-align: center;"><span lang="PT-BR"><b>Interfaces do WSRP</b><o:p></o:p></span></div><div class="MsoNormal"><span lang="PT-BR">Conforme explicado, WSRP define um conjunto de interfaces que todo WSRP <i>Producer</i> deve implementar e que todo WSRP <i>Consumer</i> utiliza para interagir com os portlets remotos. O grande benefício de se padronizar estas interfaces é a possibilidade de criar portlets genéricos. Isto garante que todo fornecedor de portal que queira suportar WSRP deve seguir a especificação.<o:p></o:p></span></div><div class="MsoNormal"><span lang="PT-BR">A especificação WSRP propõe as interfaces definidas na <b>Tabela 3</b>.<o:p></o:p></span></div><div class="MsoNormal"><br />
</div><table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; margin-left: 5.15pt; mso-padding-alt: 0cm 0cm 0cm 0cm; mso-table-layout-alt: fixed;"><tbody>
<tr style="height: 17.5pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0; page-break-inside: avoid;"> <td style="background: white; border-right: none; border: solid black 1.0pt; height: 17.5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"><span lang="PT-BR" style="font-family: "Times New Roman Bold"; font-size: 12.0pt; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-size: 10.0pt;">Interface<o:p></o:p></span></div></td> <td style="background: white; border-right: none; border: solid black 1.0pt; height: 17.5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"><span lang="PT-BR" style="font-family: "Times New Roman Bold"; font-size: 12.0pt; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-size: 10.0pt;">Descrição<o:p></o:p></span></div></td> <td style="background: white; border: solid black 1.0pt; height: 17.5pt; mso-border-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-indent: 0cm;"><span lang="PT-BR" style="font-family: "Times New Roman Bold"; font-size: 12.0pt; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-size: 10.0pt;">Obrigatório?<o:p></o:p></span></div></td> </tr>
<tr style="height: 89.0pt; mso-yfti-irow: 1; page-break-inside: avoid;"> <td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 89.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"><i><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Service Description Interface</span></i><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"> (Interface de Descrição de Serviço)<o:p></o:p></span></div></td> <td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 89.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Essa interface fornece uma descrição dos serviços fornecidos pelo <i>Producer</i>. Baseado nestas informações, o <i>Consumer</i> é capaz de determinar o que é preciso para executar o portlet, como por exemplo, inicializar um cookie antes que o <i>Consumer</i> interaja com qualquer um dos portlets.<o:p></o:p></span></div></td> <td style="background: white; border-top: none; border: solid black 1.0pt; height: 89.0pt; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"> <div align="center" class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-align: center; text-indent: 0cm;"><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Sim<o:p></o:p></span></div></td> </tr>
<tr style="height: 125.45pt; mso-yfti-irow: 2; page-break-inside: avoid;"> <td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 125.45pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"><i><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Mark-up Interface</span></i><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"> (Interface de Marcação)<o:p></o:p></span></div></td> <td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 125.45pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">A Interface de Marcação permite que o <i>Consumer</i> interaja com o portlet remoto. Por exemplo, o <i>Consumer</i> poderia utilizar esta interface para realizar interações quando um usuário final submete um formulário a partir de uma página de portal. Além disso, o portal pode precisar obter a última marcação baseada no estado atual do portlet (por exemplo, quando um usuário atualiza o navegador ou inicia uma interação com outro portlet na mesma página).<o:p></o:p></span></div></td> <td style="background: white; border-top: none; border: solid black 1.0pt; height: 125.45pt; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"> <div align="center" class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-align: center; text-indent: 0cm;"><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Sim<o:p></o:p></span></div></td> </tr>
<tr style="height: 59.0pt; mso-yfti-irow: 3; page-break-inside: avoid;"> <td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 59.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"><i><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Registration Interface</span></i><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"> (Interface de Registro)<o:p></o:p></span></div></td> <td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 59.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Esta Interface permite que o <i>Producer</i> obrigue que os <i>Consumers</i> façam um registro antes de interagir com o serviço através do uso das interfaces de Service Description e Mark-up.<o:p></o:p></span></div></td> <td style="background: white; border-top: none; border: solid black 1.0pt; height: 59.0pt; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"> <div align="center" class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-align: center; text-indent: 0cm;"><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Não<o:p></o:p></span></div></td> </tr>
<tr style="height: 74.0pt; mso-yfti-irow: 4; mso-yfti-lastrow: yes; page-break-inside: avoid;"> <td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 74.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"><i><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Portlet Management Interface</span></i><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"> (Interface de Gerenciamento do Portlet)<o:p></o:p></span></div></td> <td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 74.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"> <div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Esta interface fornece acesso ao ciclo de vida do portlet remoto. Um <i>Consumer</i> poderia customizar o comportamento do portlet ou até mesmo efetuar uma chamada ao método </span><span class="NegritoTecnico"><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">destroy()</span></span><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"> mediante o uso desta interface.<o:p></o:p></span></div></td> <td style="background: white; border-top: none; border: solid black 1.0pt; height: 74.0pt; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"> <div align="center" class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-align: center; text-indent: 0cm;"><span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;">Não</span></div></td></tr>
</tbody></table></div><div style="text-align: center;"><span class="Apple-style-span" style="font-size: x-small;"><b>Tabela 3</b>. Interfaces definidas na especificação WSRP</span><!--EndFragment--></div><div style="text-align: center;"><br />
</div><div>No mais é isso, </div><div>Diversão Garantida!!!</div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com1tag:blogger.com,1999:blog-544668644670311424.post-56616381383609974262011-10-12T17:51:00.001-03:002011-10-12T23:57:02.908-03:00Princípios, Padrões e Práticas para um Design Ágil na Java Magazine - Parte 3<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7hPjJ1r0Tw6wW0wq_DzuCuQQrX5zyH1K9e8Au43dFL7DrKSX66t2dOOOVimrMYkj5R0S2hcda3ZC8Ml7czyaeWUsF_m8mBMXeS-0dmDBPAQCcpNLhO05ES9015GeuLcyNMg3L7Whbk9-1/s1600/capaOnline_JAVA86.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7hPjJ1r0Tw6wW0wq_DzuCuQQrX5zyH1K9e8Au43dFL7DrKSX66t2dOOOVimrMYkj5R0S2hcda3ZC8Ml7czyaeWUsF_m8mBMXeS-0dmDBPAQCcpNLhO05ES9015GeuLcyNMg3L7Whbk9-1/s320/capaOnline_JAVA86.jpg" width="273" /></a><span class="Apple-style-span" style="background-color: white; color: #333333; font-family: 'trebuchet ms', verdana, arial, sans-serif; font-size: 13px; line-height: 18px;">Em Janeiro, saiu a terceira e última parte do <a href="http://www.devmedia.com.br/post-18782-Principios-Padroes-e-Praticas-para-um-Design-Agil-Parte-3.html" style="color: #3366cc; font-weight: bold;">meu artigo Princípios, Padrões e Práticas para um Design Ágil</a> na revista <a href="http://www.devmedia.com.br/post-18790-Revista-Java-Magazine-86.html" style="color: #3366cc; font-weight: bold;">Java Magazine edição 86</a>.</span><br />
Na primeira e segunda parte desta série de artigos, publicados nas Edições 80 e 81, abordamos sobre fundamentos de arquitetura de software, padrões de projetos em uma arquitetura distribuída, analisamos como identificar sintomas de um software mal planejado, e como refatorar a sua aplicação para utilizar boas práticas de desenvolvimento OO.<br />
<div class="p1"></div><div class="p1">Na última parte desta série, vamos analisar a fundo como funciona um Projeto XP, passando por todas as suas fases, e veremos também como adotar as práticas de engenharia da Extreme Programming para construir um software aplicando as melhores práticas de desenvolvimento OO</div><div class="p1">utilizando TDD e testes de aceitação.</div><div class="p1">Abordaremos os valores destas metodologias através do Manifesto Ágil, apresentando de maneira</div><div class="p1">clara como estes valores estão presentes na Extreme Programming. Analisaremos também, como a Arquitetura do Software é tratada em um projeto ágil e como algumas práticas do XP auxiliam na criação e evolução da Arquitetura. </div><div class="p1">Por fim, é apresentado um estudo de caso onde implementaremos uma funcionalidade em um sistema fictício, mostrando desde a escrita da estória pelo cliente até sua implementação utilizando testes de aceite com o framework FitNesse e TDD.</div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-79241932817158384522011-10-11T18:25:00.000-03:002011-10-11T18:25:10.316-03:00Yahoo OpenHack 2010 - YQL Console for NetbeansDepois de muito tempo sem blogar, resolvi atualizar um pouco as coisas aqui.<br />
O ano passado, teve o <a href="http://developer.yahoo.com/hackday/">Yahoo Open Hack</a>, onde mais uma vez, tive a oportunidade de participar. Para o evento, meu hack foi o <a href="http://developer.yahoo.com/hacku/hackuhandler.php?appid=hacku&op=showhack&hackid=979">YQL! Console for NetBeans and Meme Robot</a>.<br />
Apesar de não ter levado o prêmio, gostei muito do trabalho realizado, pois foi um verdadeiro hack, pois todas queries executadas pelo YQL Console no Netbeans, foram utilizando uma página do Yahoo, que descobri utilizando Wireshark.<br />
O plugin chamou a atenção de Geertjan wielenga, que me convidou a escrever um artigo para a <a href="http://netbeans.dzone.com/">DZone</a>.<br />
<br />
Segue abaixo o texto, para acessar o artigo original, clique <a href="http://netbeans.dzone.com/nb-yql">aqui</a>, que foi copiado do <a href="http://netbeans.dzone.com/">DZONE</a>,<br />
<br />
<br />
Recently, Yahoo provided a nice API called <a href="http://developer.yahoo.com/yql/">YQL</a>, which stands for "Yahoo! Query Language". It's an API that exposes an SQL-like syntax (from SHOW and DESC to INSERT and DELETE commands) that is very familiar to developers. It lets you make great things: with this language, developers can use a single language to query, filter, and join data across web services. You can even create your own open data table (see <a href="http://datatables.org/">http://datatables.org</a>) that can make your data YQL-accessible.<br />
<br />
To test your queries and data tables, Yahoo created the <a href="http://developer.yahoo.com/yql/console/">YQL Console</a> to help developers test their own queries and funcionalities, it's quite useful for YQL Developers.<br />
<br />
This year (in March), Yahoo sponsored a contest called '<a href="http://www.hackday.org/">Yahoo Hack Day</a>', an open contest for developers to create hacks using these <a href="http://developer.yahoo.com/everything.html#apis">Yahoo APIs</a>. My contribution to this contest was the plugin "YQL Console for NetBeans", which is the YQL Console embedded into NetBeans IDE:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj-0B-Irtz1eN5KkWqXsQsxZ5lpHmQpKL8YpVof85whQ9NuOBHJnhS2PIy8WSnufcrOs0eVjFksXMYzr4SBZfjtBRthyCO4ly-53g010vli9ruQqkMaQgF2AnXVdqUDKD_xx0W-qcEkyDx/s1600/1271129657437_yql-console.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj-0B-Irtz1eN5KkWqXsQsxZ5lpHmQpKL8YpVof85whQ9NuOBHJnhS2PIy8WSnufcrOs0eVjFksXMYzr4SBZfjtBRthyCO4ly-53g010vli9ruQqkMaQgF2AnXVdqUDKD_xx0W-qcEkyDx/s400/1271129657437_yql-console.jpg" width="400" /></a></div><br />
To make it work, I used <a href="http://www.wireshark.org/">wireshark</a> to sniff the network to see what was happening. In that way, I was able to hack some Yahoo PHP pages that let me "clone" the console inside NetBeans IDE. I'm using some APIs like Bean Bindings and Swing Application Framework for the UI, Jakarta Commons HttpClient for accessing resources via HTTP, as well as RESTClient to format XML and JSon code, and a couple of NetBeans APIs, such as the Window System, Utilities, UI Utilities and Settings.<br />
<br />
Bem, e isso ai, para download do plugin, conforme citado acima, acesse o link<br />
<br />
<a href="http://plugins.netbeans.org/plugin/27552/yql-console-for-netbeans">http://plugins.netbeans.org/plugin/27552/yql-console-for-netbeans</a><br />
<br />
Diversão Garantida!!!Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-33785671338917719602010-10-16T13:29:00.007-03:002010-10-16T13:46:51.798-03:00Introdução a JAX–RS – Java API for RESTful Web Services<a href="http://jcp.org/en/jsr/detail?id=311">JAX-RS</a> é a solução do JCP para o estilo de programação REST. A proposta final da especificação foi liberada para o público no inicio de Agosto de 2008,. A especificação define um conjunto de APIs Java para<br />
auxiliar no desenvolvimento de web services baseados em REST.<br />
O objetivo da API é fornecer um conjunto de anotações, classes e interfaces para expor uma classe POJO<br />
como um web service RESTful, de modo que possamos fazer uma programação fácil e de alto nível.<br />
<b><span class="Apple-style-span" style="font-size: x-large;"><br />
</span></b><br />
<b><span class="Apple-style-span" style="font-size: x-large;">Trabalhando com os recursos</span></b><br />
<br />
Para uma classe ser determinada como um recurso, ela tem que ser uma classe POJO com pelo menos um método anotado com a anotação @Path.<br />
A anotação @Path pode ser colocada na declaração de classe ou de um método e possui o elemento value<br />
obrigatório. Por este elemento definimos o prefixo da URI que a classe ou o método irá atender. Na <b>Listagem 01</b>, a classe Repositorio é identificada pela URI relativa “/repositorio/{id}”, onde {id} é o valor do parâmetro id, fornecido junto a URI.<br />
Mais adiante, demonstraremos como extrair valores como esse de uma URI utilizando anotações especificas.<br />
<pre class="java" name="code">@Path("/repositorio/{id}")
public class Repositorio { ... }
</pre><span class="Apple-style-span" style="font-size: small;"><b>Listagem 01</b> - Mapeando uma URI para uma classe com @Path.</span><br />
<br />
A especificação define que no ciclo de vida de um recurso, por padrão, sempre que for feito uma requisição a um recurso, será criada uma nova instância de uma classe REST. Primeiro o construtor é chamado pelo contêiner, por conta disto, o construtor da classe deve ser público. Após este primeiro passo, o contêiner efetua as injeções de dependência nos devidos métodos e o método designado para aquele recurso é invocado. E finalmente após a chamada ao método o objeto fica disponível para o garbage collector.<br />
Geralmente a anotação @Path é incluída na declaração de um método quando queremos atribuir um caminho mais específico para um recurso, de forma a especializar nosso método, como na <b>Listagem 02</b>. Note no exemplo como a URI é mapeada com a classe e o método.<br />
<pre class="java" name="code">@Path("/vendas/")
public class Repositorio {
@GET
@Produces("application/xml")
@Path("/pedidos/{numPedido}/")
public PedidoAsXML getPedido(@PathParam("numPedido") Integer id){
// retorna Pedido em formato XML.
}
}
</pre><span class="Apple-style-span" style="font-size: small;"><b>Listagem 02</b> - Mapeando uma URI para uma classe com @Path.</span><br />
<br />
<b><span class="Apple-style-span" style="font-size: x-large;">Acessando os Recursos</span></b><br />
<br />
Para acesso aos recursos, a especificação JAX-RS define um conjunto de anotações correspondentes aos métodos HTTP, como @GET, @POST, @PUT, @DELETE, @HEAD.. Elas devem ser atribuídas a métodos públicos. O método anotado com @GET, por exemplo, irá processar requisições HTTP GET na URI atribuída. O comportamento do recurso é determinado pelo método HTTP ao qual o recurso está respondendo.<br />
É bom entender o papel e o uso de cada um destes métodos HTTP no momento de projetar nossos serviços.<br />
Além dos métodos definidos pelo JAX-RS, podemos criar uma anotação customizada como @MKCOL, com uso da anotação HttpMethod, conforme ilustra a <b>Listagem 03</b>.<br />
Com esta anotação podemos criar métodos customizados e extender a gama dos métodos pré-existentes e utilizar os métodos definidos pelo WebDAV, como fazemos na <b>Listagem 3</b>, ou podemos alternar um método padrão para a anotação customizada, onde para isso poderíamos simplesmente informar como valor para anotação HttpMethod o valor do método que queremos sobrepor, por exemplo, para sobrepor o método PUT a declaração da anotação ficaria <br />
<pre class="java" name="code">@HttpMethod("PUT").
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("MKCOL")
public @interface MKCOL {
}</pre><span class="Apple-style-span" style="font-size: small;"><b>Listagem 03</b>: Utilizando a anotação HttpMethod para criar uma anotação customizada.</span><br />
<br />
<b><span class="Apple-style-span" style="font-size: x-large;">Representações: Quais são os sabores?</span></b><br />
<br />
As classes de uma aplicação RESTful podem ser declaradas para suportar diversos tipos de formatos durante um ciclo requisição-resposta. Para isso a especificação define as anotações @Consumes e @Produces para o tratamento da request e response respectivamente.<br />
Com estas anotações o servidor declara o tipo de conteúdo que será trafegado, através do cabeçalho (header) do protocolo HTTP, estas anotações podem ser aplicadas na declaração de uma classe, ou podemos utilizar estas anotações na declaração do método para sobrescrever a declaração da classe, na ausência destas anotações, será assumido como default qualquer tipo de retorno ("*/*").<br />
No caso da anotação @Produces, ela é utilizada para mapear uma requisição de um cliente com o cabeçalho do cliente (parâmetro Accept). Desta maneira, podemos definir mais de um tipo de retorno da URI solicitada, como JSON e XML, como no exemplo da <b>Listagem 04</b>:<br />
<pre class="java" name="code">@GET
@Produces({"application/xml", "application/json"})
public PessoaConverter getPessoa(@QueryParam("CPF") String numCPF) {
// Retorna representação em XML ou JSON
}
</pre><span class="Apple-style-span" style="font-size: small;"><b>Listagem 04</b> - Declarando o tipo de retorno com a anotação @Produces.</span><br />
<br />
Pegando o exemplo da<b> Listagem 04</b>, podemos testar o retorno da chamada utilizando uma das ferramentas<br />
citadas no tópico "Como consumir serviços REST", como a ferramenta RESTClient, por exemplo, e incluir na aba "Headers" o parâmetro "Accept" e no campo Value especificar o tipo de retorno primeiro com XML e depois com JSON, conforme <b>Figura 01</b>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqSJJIXJ8ldHXF45UyX-OldoTeyn-by2SjRL9KZWdoN2V3sjhzeZKhG20-Rh43KikZUlkBMdVezSsflwkq08c64SMCuFsFE4ju1SFtG62Uh-H_BaDba1kwduI2SJKYPpG_Tli0Eai4sFIC/s1600/Figura1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqSJJIXJ8ldHXF45UyX-OldoTeyn-by2SjRL9KZWdoN2V3sjhzeZKhG20-Rh43KikZUlkBMdVezSsflwkq08c64SMCuFsFE4ju1SFtG62Uh-H_BaDba1kwduI2SJKYPpG_Tli0Eai4sFIC/s640/Figura1.jpg" width="640" /></a></div><div style="text-align: center;"><span class="Apple-style-span" style="font-size: small;"><b>Figura 01</b> - Testando tipos de retorno para a mesma URI com RESTClient.</span></div><br />
Com a anotação @Consumes por outro lado, podemos definir os tipos de mídia que um recurso em particular consome. Como o exemplo da<b> Listagem 05</b>, onde estamos declarando que o método consome apenas formatos do tipo XML e JSON:<br />
<pre class="java" name="code">@PUT
@Consumes("application/xml","application/json")
@Path("/autores/")
public Response putPessoa(PessoaBinding pessoa) {}
</pre><b>Listagem 05: Uso da anotação @Consumes.</b><br />
<br />
<b><span class="Apple-style-span" style="font-size: x-large;">Extraindo parâmetros e valores da URI na requisição.</span></b><br />
<br />
JAX-RS fornece algumas anotações para extrair informações de uma requisição. Existem seis tipos de parâmetros (ver <b>Tabela 01</b>) que podemos extrair para utilizar em nossa classe recurso. Para os parâmetros de query utilizamos a anotação @QueryParam. Para os parâmetros de URI(path) existe a anotação @PathParam.<br />
Para os parâmetros de formulário existe @FormParam. Já para parâmetros de cookie existe @CookieParam.<br />
Para os parâmetros de header existe @HeaderParam e, finalmente, para os parâmetros de matriz existe a anotação @MatrixParam.<br />
Estas anotações podem ser aplicadas diretamente a parâmetros de um método. Desta forma vinculamos o valor do parâmetro de uma URI a algum parâmetro de entrada de um método. Para contextualizar, veja um exemplo na <b>Listagem 06</b>:<br />
<pre class="java" name="code">@Path("/editora/")
public class EditoraResource {
@GET
@Produces("application/xml")
@Path("/autores/{nomeAutor}/")
public PessoaBinding getPessoa(@PathParam("nomeAutor") String name,
@QueryParam("idade") int idade,
@HeaderParam("CPF") String numCPF,
@MatrixParam("statusCivil") String statusCivil) {
return new PessoaBinding(name, idade, numCPF, statusCivil);
}
}
</pre><b>Listagem 06</b> – Mapeando os parâmetros de uma URI para os parâmetros de um método.<br />
<br />
Na <b>Listagem 06</b>, vemos a aplicação de várias anotações de parâmetro de URI em um único método. Para entender melhor como será feito o DE-PARA da URI para os parâmetros de entrada, vamos fazer uma chamada a este recurso com a biblioteca curl, apresentado na <b>Figura 02</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRUMXhLdttFZYrvrsQ0gUgkZoAUPPjWJkThKmf1vyN_VWJiZqieJwi_NDL7tS52NOwmVsioshX3e7syZ7mrtIIHjxdeG6ECl-4UE8_YDCHwHMG8zr24hpUF42yphaQh5Uiict7t7pXpyMF/s1600/Figura2.jpg" imageanchor="1"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRUMXhLdttFZYrvrsQ0gUgkZoAUPPjWJkThKmf1vyN_VWJiZqieJwi_NDL7tS52NOwmVsioshX3e7syZ7mrtIIHjxdeG6ECl-4UE8_YDCHwHMG8zr24hpUF42yphaQh5Uiict7t7pXpyMF/s640/Figura2.jpg" width="400" /></a></div><b><span class="Apple-style-span" style="font-size: small;">Figura 02</span></b><span class="Apple-style-span" style="font-size: small;"> - Fragmentando a URI para demonstrar anotações de mapeamento.</span><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXb71rxJkMK-9L5m7Iah4T8p8-Du5C9cEFKIwwWpAg4On5SK0zi0Kz_UCi7yX4cQOMAqVoa_UDyonOAMS41u0VAtD3y0bXgZO5gEn3biSoBt6BpAh8tTcBzv2nLyVveodFnNh-SK_kb_fG/s1600/tabela01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXb71rxJkMK-9L5m7Iah4T8p8-Du5C9cEFKIwwWpAg4On5SK0zi0Kz_UCi7yX4cQOMAqVoa_UDyonOAMS41u0VAtD3y0bXgZO5gEn3biSoBt6BpAh8tTcBzv2nLyVveodFnNh-SK_kb_fG/s400/tabela01.jpg" width="400" /></a></div><br />
<b><span class="Apple-style-span" style="font-size: small;">Tabela 01 </span></b><span class="Apple-style-span" style="font-size: small;">- Anotações JAX-RS para extração de informações da URI.</span><br />
<br />
No exemplo da <b>Listagem 06</b> não demonstramos o uso das anotações CookieParam e FormParam, mas o seu uso é bem similar. No caso de FormParam, esta anotação pode capturar todos os valores submetidos de um formulário HTML e injetá-los nos parâmetros desejados. Veja um exemplo simples na <b>listagem 07</b>. Trata-se de um formulário HTML e de um método que irá receber estas informações.<br />
<br />
<pre class="html" name="code"><form action="/editora/autores" method="POST">Nome: <input name="nomeAutor" type="text" />
Idade: <input name="idade" type="number" />
</form></pre><pre class="java" name="code">@Path("/editora/")
public class EditoraResource {
@GET
@Path("/autores/")
public PessoaBinding getPessoa(@FormParam("nomeAutor") String name,
@FormParam("idade") int idade) {
return new PessoaBinding(name, idade);
}
}
</pre><span class="Apple-style-span" style="font-size: small;"><b>Listagem 07 </b>- Uso da anotação FormParam.</span><br />
<br />
No caso da anotação CookieParam, conseguimos injetar o valor de cookie ou a classe Cookie do javax.ws.rs.core, que representa o valor de um cookie HTTP na invocação de um método.<br />
<br />
<b><span class="Apple-style-span" style="font-size: x-large;">Dados de Contexto</span></b><br />
<br />
A especificação JAX-RS dispõe de um recurso para a obtenção de informações do contexto da aplicação e de requisições individuais. Estas informações são disponíveis tanto para as classes recursos quanto para os providers. Para a recuperação destas informações existe a anotação @Context, que ao ser aplicada sobre um campo, método ou parâmetro, identifica um alvo a ser injetado pelo contêiner.<br />
O contêiner fornece instâncias dos recursos listados na <b>tabela 02</b>, mediante a aplicação da anotação @Context.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1WSD35ptfJuLVS5UL3EcUg43bEWQKCiYeuyX0J40CqLMY4taT46sdaMbc2a2UoVSzNkmlNvwV4bS6CwsBwovSTSvxHKEYYwSj46SLNr5qduOCsEwgFLOuF5mp80fueM9TLRWYBw5rJmKJ/s1600/tabela02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1WSD35ptfJuLVS5UL3EcUg43bEWQKCiYeuyX0J40CqLMY4taT46sdaMbc2a2UoVSzNkmlNvwV4bS6CwsBwovSTSvxHKEYYwSj46SLNr5qduOCsEwgFLOuF5mp80fueM9TLRWYBw5rJmKJ/s400/tabela02.jpg" width="400" /></a></div><br />
<span class="Apple-style-span" style="font-size: small;"><b>Tabela 02: </b>Lista de recursos injetados pelo contêiner pela anotação @Context.</span><br />
<br />
<b><span class="Apple-style-span" style="font-size: x-large;">Tratando o retorno dos métodos ao Cliente.</span></b><br />
<br />
Os tipos de retorno de uma chamada a um método recurso podem ser do tipo void, Resource, GenericType ou outro tipo Java. Esses tipos de retorno são mapeados ao entity body da Response cada um de uma maneira, de acordo o provider padrão, conforme veremos a seguir.<br />
Para os retornos do tipo void, o retorno será um corpo vazio com status 204 do HTTP. Para tratar o retorno ao cliente foi disponibilizada a classe abstrata Response. Com essa classe definimos um contrato entre a instância de retorno e o ambiente de execução, quando uma classe precisa fornecer metadados para ambiente de execução.<br />
Podemos estender esta classe diretamente ou, ainda melhor, podemos criar uma instância utilizando sua classe interna ResponserBuilder. Por essa classe podemos construir objetos do tipo Response, adicionar metadados, adicionar cookies, adicionar dados no Header, informar a linguagem, entre outras informações.<br />
Na <b>Listagem 08</b>, no método putPessoa, fazemos uso do método Response. Note que não a instanciamos diretamente, pois ela é uma classe abstrata que implementa o padrão de projeto Builder.<br />
Dentro do método, primeiramente efetuamos uma chamada ao método estático created, passando como parâmetro a URI que obtemos através da classe injetada UriInfo. Esta classe retorna o objeto ResponseBuilder, que é uma subclasse de Response, esta subclasse é utilizada exclusivamente para criar instâncias de Response.<br />
Por ResponseBuilder ser uma classe de construção (Builder), podemos efetuar chamadas recursivas aos métodos de parametrização. Após a chamada ao método created, chamamos o método status, no qual atribuímos o código de status HTTP 202 (Accepted) e logo após atribuímos uma entidade à requisição, no nosso exemplo um código HTML simples, pelo método entity. Na chamada ao método type seguinte, especificamos o tipo de mídia trafegado, neste caso TEXT_HTML. No final fazemos uma chamada ao método build, que constrói o objeto Response.<br />
E por fim o objeto GenericEntity representa uma entidade de um tipo genérico, muito útil quando precisamos retornar uma Response personalizada e reter informações genéricas. Pois informações de tipos genéricos são apagadas ao utilizar uma instância.<br />
<br />
<pre class="java" name="code" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">@Context protected UriInfo uriInfo;
@PUT
@Consumes("application/xml")
@Path("/MundoJava/update/")
public Response putPessoa(PessoaBinding pessoa) {
String retorno = "Bem vindo "+pessoa.getNome();
Response response = Response.created(uriInfo.getAbsolutePath()).
status(Response.Status.ACCEPTED).
entity(retorno).
type(MediaType.TEXT_HTML).
build();
return response;
}
</pre><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b>Listagem 08</b> – Tratando a Response do cliente.</div><div><br />
</div><div><div><b><span class="Apple-style-span" style="font-size: x-large;">Entity Providers</span></b></div><div><b><span class="Apple-style-span" style="font-size: x-large;"><br />
</span></b></div><div>Entity providers fornecem serviços de mapeamento entre representações e seus tipos associados Java. Existem dois tipos de entity providers, <i>MessageBodyReader</i> e <i>MessageBodyWriter</i>.</div><div>A especificação JAX-RS define que para alguns tipos, o contêiner pode automaticamente serializar (marshal) e deserealizar (unmarshal) o corpo de diferentes tipos de mensagens, listados na <b>tabela 03</b>.</div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCor4Kn6fY_PK81o7-Raba1-IbOeZd-wxRWcxhaLu2ZMnQ3ZCfrHB2s5jBgw74ye26ggxFlzSlPDTndROGiJwYJWufZJg_tyHusPuxhQopvumDWIjQLgme-hkl5gd_Zt9F4MA6CPnw_b5V/s1600/tabela03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCor4Kn6fY_PK81o7-Raba1-IbOeZd-wxRWcxhaLu2ZMnQ3ZCfrHB2s5jBgw74ye26ggxFlzSlPDTndROGiJwYJWufZJg_tyHusPuxhQopvumDWIjQLgme-hkl5gd_Zt9F4MA6CPnw_b5V/s400/tabela03.jpg" width="400" /></a></div><div style="text-align: center;"><b><span class="Apple-style-span" style="font-size: small;">Tabela 03: </span></b><span class="Apple-style-span" style="font-size: small;">Tipos de Mídia e seus tipos Java correspondentes.</span></div><div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Para requisições HTTP, podemos mapear o corpo da entidade para um parâmetro de método com uso da interface <i>MessageBodyReader<t></t></i>, para o tratamento das responses, o valor de retorno é mapeado para o corpo da entidade de um método HTTP com uso da interface <i>MessageBodyWriter<t></t></i>.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Pode ser que no desenvolvimento de nossas aplicações, estes tipos padrões não atendam a necessidade de negócio e tenhamos que lidar com tipos que não sejam suportados pelos tipos default, para contornar esta limitação, a API JAX-RS permite que a criação de Providers para Message Body customizáveis, com métodos para conversão de InputStream/OutputStream para objetos Java do tipo T.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Para criar nosso próprio provider customizado, a especificação disponibiliza a anotação @Provider, que ao ser aplicado sobre uma classe, estamos automaticamente registrando este classe junto ao contêiner. </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Porém, é importante ressaltar, que esta funcionalidade apesar de muito útil, pode ser tornar um problema em grandes projetos, que podem utilizar providers com o mesmo nome em diferentes bibliotecas, podendo ocasionar conflitos.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Caso a aplicação necessite de informações adicionais, como HTTP Headers ou um código de status diferente, o método pode retornar o objeto Response que encapsule a entidade. </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Veja um exemplo extraído de um sample da implementação de referência da Sun, o Jersey, na<b> listagem 09</b>, esta classe implementa um <i>MessageBodyWriter</i> para uma classe Properties.</div><div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"></div><pre class="java" name="code" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">@Produces("text/plain")
@Provider
public class PropertiesProvider implements MessageBodyWriter<properties> {
public void writeTo(Properties p,
Class type, Type genericType, Annotation annotations[],
MediaType mediaType, MultivaluedMap<string, object=""> headers,
OutputStream out) throws IOException {
p.store(out, null);
}
public boolean isWriteable(Class type, Type genericType, Annotation annotations[], MediaType mediaType) {
return Properties.class.isAssignableFrom(type);
}
public long getSize(Properties p, Class type, Type genericType, Annotation annotations[], MediaType mediaType) {
return -1;
}
}</pre><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b><span class="Apple-style-span" style="font-size: small;">Listagem 09: </span></b><span class="Apple-style-span" style="font-size: small;">Uso da tag @Provider.</span></div></div><div><div><b><span class="Apple-style-span" style="font-size: x-large;">Tratando Exceções</span></b></div><div><br />
<div><div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Para tratamento de exceções, a especificação JAX-RS define a exceção WebApplicationException que estende RuntimeExcetion, que pode ser lançada por um método de recurso, por um provider ou por uma implementação de StreamingOutput. Esta exceção permite que abortemos a execução de um serviço JAX-RS. </div></div><div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Como parâmetro de construtor, podemos utilizar um código de status HTTP ou até um objeto Response. Veja um exemplo na <b>listagem 10</b>:<br />
<br />
<pre class="java" name="code" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">@GET
@Produces("application/xml")
@Path("/autores/{personName}/{idade: [0-9]+}/")
public PessoaBinding getPessoa(@PathParam("personName") String name, @PathParam("idade")
int idade, @HeaderParam("CPF") String numCPF) {
if (idade <= 0 || idade > 120){
throw new WebApplicationException(Response.
status(412).
entity("Idade inválida!").
build());
}
return new PessoaBinding(name, idade, numCPF);
}
</pre><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b><span class="Apple-style-span" style="font-size: small;">Listagem 10: </span></b><span class="Apple-style-span" style="font-size: small;">Uso de exceção com WebApplicationException.</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div></div></div></div><div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Por padrão, quando uma classe JAX-RS ou um método provider lança uma exceção em tempo de execução, essa exceção é mapeada a um código de status HTTP adequado. Nós podemos customizar a nossa exceção conforme a necessidade, para isto, a especificação define a interface ExceptionMapper, com ela podemos criar nossos próprios providers e customizar este mapeamento, para tanto, a implementação desta interface deve estar anotada com @Provider. Veja um exemplo na <b>listagem 11</b>:</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
<pre class="java" name="code">@Provider
public class IdadeInvalidaExceptionMapper implements ExceptionMapper<idadeinvalidaexception>{
public Response toResponse(IdadeInvalidaException ex) {
return Response.status(412).entity(ex.getMessage()).build();
}
}</pre><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b><span class="Apple-style-span" style="font-size: small;">Listagem 11: </span></b><span class="Apple-style-span" style="font-size: small;">Mapeando uma exceção Java para uma Response.</span></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div></div></div></div><div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Na <b>listagem 11</b> perceba que registramos a classe ExceptionMapper da mesma maneira que registramos <i>MessageBodyReaders</i> e <i>MessageBodyWriters</i>. Ao utilizarmos a exceção IdadeInvalidaException em um método RESTful como no método da <b>listagem 12</b>, o contêiner irá em tempo de execução identificar o provider e irá mapear esta exceção com <i>IdadeInvalidaExceptionMapper</i>.</div></div><div><div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
<br />
<pre class="java" name="code">@GET
@Produces("application/xml")
@Path("/autores/{personName}/{idade: [0-9]+}/")
public PessoaBinding getPessoa(@PathParam("personName") String name, @PathParam("idade")
int idade, @HeaderParam("CPF") String numCPF) throws IdadeInvalidaException {
if (idade <= 0 || idade > 120)
throw new IdadeInvalidaException("Idade Inválida!");
return new PessoaBinding(name, idade, numCPF);
}</pre><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b><span class="Apple-style-span" style="font-size: small;">Listagem 12: </span></b><span class="Apple-style-span" style="font-size: small;">Uso de exceção de negócio, que é mapeada para Response.</span></div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"></div></div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="font-family: monospace;"><span class="Apple-style-span" style="white-space: pre;"> </span></span></div></div></div></div><div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Assim como toda nova tecnologia, JAX-RS não é uma bala de prata, mas sabendo o momento de usá-la se torna uma ferramenta poderosa de integração, em termos de facilidade no desenvolvimento e requerer uma</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">infraestrutura mais leve, dispensando o uso de um middleware WS-*.</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Use e abuse! Diversão garantida!</div></div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com2tag:blogger.com,1999:blog-544668644670311424.post-78490208876792517502010-08-19T12:53:00.000-03:002010-08-19T12:53:10.556-03:00Princípios, Padrões e Práticas para um Design Ágil na Java Magazine - Parte 2<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQiaxGFOkmVuB_FNJHEX42rwo0dWMbc_0alHy_Q1FtzT6XvBcmAGy0oNu4NgoRecpe8UU3nqrpnUTkWSpKgoQT_AAitrutflPV7GvUqKe8fjcpP4nKHpvMJ3tNoma-d06W3C2YK3nAXrFN/s1600/capaOnline_java81.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQiaxGFOkmVuB_FNJHEX42rwo0dWMbc_0alHy_Q1FtzT6XvBcmAGy0oNu4NgoRecpe8UU3nqrpnUTkWSpKgoQT_AAitrutflPV7GvUqKe8fjcpP4nKHpvMJ3tNoma-d06W3C2YK3nAXrFN/s320/capaOnline_java81.jpg" /></a></div>Em Julho, saiu a segunda parte do <a href="http://www.devmedia.com.br/post-17441-Principios-Padroes-e-Praticas-para-um-Design-Agil-Parte-2.html">meu artigo Princípios, Padrões e Práticas para um Design Ágil</a> na revista <a href="http://www.devmedia.com.br/post-17443-Revista-Java-Magazine-81.html">Java Magazine edição 81</a>, e dando continuidade no artigo publicado na <a href="http://www.devmedia.com.br/post-17125-Revista-Java-Magazine-80.html">edição 80</a>.<br />
<br />
Para esta segunda parte, vamos abordar as diferenças entre a criação de uma arquitetura seguindo métodos tradicionais, como o Waterfall, e a criação de um Design Ágil a partir de ciclos iterativos de duas a três semanas. Além disso, veremos meios de identificar um software mal planejado através de alguns sintomas conhecidos como Design Smells.<br />
Para tratar estes sintomas, abordaremos alguns princípios de Design OO, que são a base de muitos padrões de projeto e que são o produto de várias décadas de experiência com engenharia de software de não apenas um, mas de vários profissionais consagrados no ramo de tecnologia.<br />
Veremos na prática alguns destes princípios, abordando todo o conceito teórico, expondo através de exemplos, sua utilidade e como eles se relacionam com alguns padrões de projeto, e por fim, veremos a aplicabilidade destes princípios nos cenários apropriados para cada um deles.<br />
Para identificar se nosso sistema está com um bom design, Robert C. Martin, popularmente conhecido como Uncle Bob, apresentou alguns sintomas de design ruim, chamado de Design Smells (algo como Odores do Design). Estes sintomas permeiam a estrutura geral do software, e em seu livro Agile Software Development, Uncle Bob chegou a seguinte classificação:<br />
<br />
<br />
<br />
<ul><li>Rigidez</li>
<li>Fragilidade</li>
<li>Imobilidade</li>
<li>Viscosidade (Pode ser 2 tipos: Viscosidade do Software e Viscosidade do ambiente)</li>
<li>Complexidade Desnecessária</li>
<li>Repetição Desnecessária</li>
<li>Opacidade</li>
</ul><br />
Uma boa técnica para desenvolver um código expressivo é utilizar uma das principais ideias do Domain Driven Design, a Linguagem Ubíqua (ou Onipresente), proposta por Eric Evans. Esta técnica consiste em aplicar uma linguagem comum entre os desenvolvedores e analistas de negócio, utilizando os conceitos do modelo de domínio como forma primária de comunicação, fazendo com que ela seja aplicada tanto nos discursos entre os técnicos e os stakeholders quanto na documentação do sistema. Como consequência, fazemos com que os mesmos termos utilizados no domínio do negócio sejam expressos também no código, o que torna a comunicação mais transparente entre os times durante as discussões sobre o modelo do domínio.<br />
<div><br />
</div><br />
Os sintomas citados acima, podem ser identificados em qualquer parte do sistema e são causados geralmente pela violação de alguns princípios da Programação Orientada a Objetos. Estes princípios, ainda que antigos, são pouco difundidos, mas essenciais para criar um bom Design em qualquer projeto orientado a objetos.<br />
Os princípios que abordaremos no artigo são:<br />
<br />
<ul><li> Princípio Aberto-Fechado (OCP – Open-Closed Principle);</li>
<li> Princípio DRY (Don’t Repeat Yourself);</li>
<li> Princípio da Responsabilidade Única (SRP – The Single Responsibility Principle);</li>
<li> Princípio da Substituição de Liskov (LSP – Liskov Substitution Principle);</li>
<li> Princípio do Conhecimento Mínimo (PLK – The Principle of Least Knowledge)</li>
</ul><br />
<div>Diversão Garantida!</div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com4tag:blogger.com,1999:blog-544668644670311424.post-89046603690820275812010-08-13T22:31:00.000-03:002010-08-13T22:31:56.220-03:00Introdução a Portais CorporativosSe buscarmos a definição de Portal no dicionário, na maioria delas veremos que ele é definido como “uma porta, portão ou entrada”. Quando falamos em Portais web, estamos nos referindo a sites especiais da web ou intranet, que são designados a agir como um gateway de acesso a outros sites.<br />
Um portal agrega informações de múltiplas fontes e torna estas informações disponíveis para diversos usuários. Além de disponibilizar diversas fontes de informações, eles fornecem um guia de serviços que auxiliam os usuários a se direcionarem no meio de tantas informações na internet.<br />
Mais especificamente, um portal não deve ser visto somente como gateway para outros sites, mas para todos os recursos acessíveis na rede, que envolve intranets, extranets ou a própria Internet. Em outras palavras, um portal oferece acesso centralizado para aplicações e todo conteúdo relevante para a empresa/usuários finais. Na <b>Figura 1</b> apresentamos a arquitetura de um portal, formado por um servidor web, um contêiner de Servlets/Portlets e as aplicações (portlets) para o portal, conforme veremos em detalhes no decorrer do artigo.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK9Fnu_PdsSmGKYPydZww4GPJkgOvx6Q2WrZHgVVUOPmIbHwOae_Hpq-UV3FbJaYr_sBlP08e1-QMB0sEaMIPpeB99lnnlz6Ki2PchiSUIohBkMKpVUXASY7aBzt9lCsQoGe5J3HgvCEtl/s1600/ArquiteturaPortal.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK9Fnu_PdsSmGKYPydZww4GPJkgOvx6Q2WrZHgVVUOPmIbHwOae_Hpq-UV3FbJaYr_sBlP08e1-QMB0sEaMIPpeB99lnnlz6Ki2PchiSUIohBkMKpVUXASY7aBzt9lCsQoGe5J3HgvCEtl/s320/ArquiteturaPortal.jpg" /></a></div><div style="text-align: center;"><b><span class="Apple-style-span" style="font-size: small;">Figura 1.</span></b><span class="Apple-style-span" style="font-size: small;"> Arquitetura de um portal</span></div><div><div><br />
</div><div>Durante muito tempo as ferramentas de portal foram ignoradas e até mesmo discriminadas por muitos programadores que achavam que elas eram de uso exclusivo para web designers. Mas com o surgimento da arquitetura orientada a serviços e a busca frenética das empresas em disponibilizar soluções mais baratas e produtivas, com o intuito de reduzir o Time-to-Marketing, esse tipo de ferramenta voltou com toda a força para fazer o que sempre fez: facilitar a vida de todos. A partir desta análise, mostraremos nesse artigo as vantagens do uso de uma ferramenta de portal, e qual o papel do programador neste contexto.</div><div><b><span class="Apple-style-span" style="font-size: x-large;">Segurança</span></b></div><div>A etapa mais cansativa e torturante para um desenvolvedor é ter que gastar seu tempo desenvolvendo módulos de segurança de uma aplicação, sendo que esses módulos geralmente são constituídos por telas de autenticação, tratamentos de usuários e grupos de usuário, utilização de repositórios LDAP, e em algumas vezes a integração com um autenticador para desfrutar do tão desejável Single Sign On .</div><div>Além de ter todas essas características, muitas vezes é necessário desenvolver soluções “self-service”, para que o administrador do ambiente de Portal tenha autonomia para gerenciar o repositório de usuários e dar permissões de uso para as funcionalidades da ferramenta.</div><div>Praticamente todas as soluções de portal possuem todo esse mecanismo pronto, possibilitando ao programador se dedicar somente no desenvolvimento das aplicações de automatização do negócio.</div><div><b><span class="Apple-style-span" style="font-size: x-large;">Conteúdo</span></b></div><div>No desenvolvimento completo de uma solução como uma “Intranet”, é comum ver que todo o tempo de desenvolvimento é gasto na criação de aplicações para gerenciamento de conteúdo, como funcionalidades de notícias, biblioteca de documentos, áreas institucionais e qualquer outra seção que necessita de um gerenciamento de informações por parte do usuário do sistema. Em um projeto deste tipo, também é comum que todas essas funcionalidades passem por uma governança editorial, e que inevitavelmente necessitem de um mecanismo de workflow. Essas são funcionalidades típicas nas ferramentas de portal, o que fez com que todos achassem que esse tipo de ferramenta só proporcionava esse benefício.</div><div>Há empresas que buscam outras soluções que vão além de um simples gerenciamento de conteúdo, indicando que elas devem ser mais robustas e possuir módulos de digitalização, transformação e busca de conteúdo. Esses sistemas, chamados ECM (Enterprise Content Management), muitas vezes dependem de uma ferramenta de portal para disponibilizar o conteúdo trabalhado. Este é só um exemplo de ferramenta que necessita de um portal como camada de visão. E a forma com a qual esse e outros tipos de ferramentas mostram suas funcionalidades é através dos chamados portlets.</div><div><b><span class="Apple-style-span" style="font-size: x-large;">Portlet</span></b></div><div>A internet fornece um conjunto de informações quase que ilimitado para diversos tipos de dispositivos. Com o advento da web foi criado um universo de padrões e protocolos de comunicação, recursos, e uma linguagem de marcação utilizada para apresentação (HTML). Mas a web e seus protocolos foram projetados para atender ao conceito de uma página como um pedaço estático único de informação, apresentado em um navegador, como uma entidade completa e inalterável. Para visualizar outra página, o usuário tem que chamar outra página.</div><div>Até o momento, diversos esforços têm sido feitos para superar esta limitação com o uso extensivo de código, como JavaScript/Ajax, ou alguma solução DHTML para trazer ao usuário uma experiência similar e até mesmo superior ao uso de uma aplicação desktop.</div><div>Portlet é uma maneira de superar a natureza “tudo ou nada” de uma página HTML. Para defini-los podemos dizer que os portlets são o núcleo dos serviços de um portal, onde uma ferramenta de portal utiliza os portlets como uma interface de apresentação plugável, ou seja, aplicações que podem ser adicionadas em qualquer página em um ambiente de portal, com o objetivo de fornecer qualquer tipo de informação na camada de apresentação.</div><div>O conteúdo gerado por um portlet é chamado de fragmento, que na verdade é um pedaço de marcação (ex: HTML, XHTML, etc.) aderente a certas regras, de forma que possamos agregar pedaços de vários fragmentos para gerar um documento.</div><div>A página de um portal é composta por um ou mais portlets, que são normalmente agregados com o conteúdo de outros portlets para formar uma página. O ciclo de vida de um portlet é gerenciado pelo contêiner de portlet, conforme veremos logo a seguir. Na <b>Figura 2</b> apresentamos uma página de exemplo do portal open source <a href="http://www.liferay.com/">Liferay</a>, com a disposição de vários portlets.</div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxhAc69ZbVtu3PVKxOx8hpmmhv9BD8iDwn1s6o_VAbMVRlkD7QPse8chAXQW7ebH0FpITw70igZDmlgIqi_XBgV3ny_UqyklCTw0AP4NI0zgy2AyjD0xJhUN3sYNPgTAc0Q8Bpz1Yh1fj5/s1600/liferay.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxhAc69ZbVtu3PVKxOx8hpmmhv9BD8iDwn1s6o_VAbMVRlkD7QPse8chAXQW7ebH0FpITw70igZDmlgIqi_XBgV3ny_UqyklCTw0AP4NI0zgy2AyjD0xJhUN3sYNPgTAc0Q8Bpz1Yh1fj5/s400/liferay.jpg" width="400" /></a></div><div><br />
</div><div><div style="text-align: center;"><b><span class="Apple-style-span" style="font-size: small;">Figura 2</span></b><span class="Apple-style-span" style="font-size: small;">. Exemplo de uma página de portal</span></div><div>Se olharmos atentamente o conteúdo do navegador na <b>Figura 2</b>, veremos que a página é formada por diferentes janelas. Temos uma janela para um dicionário, outra para um RSS, uma terceira para um calendário, e por último uma para o Google Maps. Cada uma destas janelas representa um portlet. Ao analisarmos o detalhe de cada janela, vamos perceber que cada uma delas contém uma barra de título e alguns botões, incluindo os botões de maximizar e minimizar.</div><div>Na verdade, estas janelas são aplicações diferentes, desenvolvidas independentemente uma das outras. O programador desenvolve o portlet como uma aplicação web e empacota em um arquivo .war, e o administrador do portal efetua o deploy deste arquivo .war no servidor de portal e adiciona o portlet recém instalado em uma ou mais páginas do portal.</div><div>Pelo fato de você poder colocar o portlet em qualquer página, faz com que você possa reutilizá-lo a todo o momento no portal, até mesmo em uma mesma página. No caso da <b>Figura 3</b>, apresentamos uma página com várias instâncias de um mesmo portlet (Locadora).</div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinFWi98_EQCuNmKdjJ03fmXbvXcZ_QC0cxJ6MTNtnv-7NjO718biw6GSAeQKsOF-ZfRptBsq6n-W05v9oRsmNn-0iP8ifMEjTJvA0lI7rQfMjdZuBE3VKJB__iP1NqHy3i9jMfyXiwuGTX/s1600/locadora.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinFWi98_EQCuNmKdjJ03fmXbvXcZ_QC0cxJ6MTNtnv-7NjO718biw6GSAeQKsOF-ZfRptBsq6n-W05v9oRsmNn-0iP8ifMEjTJvA0lI7rQfMjdZuBE3VKJB__iP1NqHy3i9jMfyXiwuGTX/s320/locadora.jpg" /></a></div><div style="text-align: center;"><span class="Apple-style-span" style="font-size: small;"><b>Figura 3</b>. Várias instâncias do mesmo portlet em uma página</span></div><div style="text-align: center;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></div><div><div>Repare nesta figura que temos um mesmo portlet na página, mas com instâncias diferentes. A ferramenta de portal tem a responsabilidade de garantir sessões independentes da aplicação, mesmo estando todos na mesma página.</div><div><b><span class="Apple-style-span" style="font-size: x-large;">Contêiner</span></b></div><div>Portlets são executados em um contêiner de portlets. O contêiner fornece aos portlets o ambiente necessário para sua execução e gerenciam o seu ciclo de vida.</div><div>O contêiner de portlets recebe as requisições oriundas do portal para executar ações nos portlets em seu ambiente. É importante entender que contêiner de portlets não é responsável por agregar o conteúdo produzido pelo portlet que ele está hospedando, quem faz esta agregação é o próprio portal.</div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjMKs7ul5BhsQfbvEs2kiLW7JnArXAG5wpivYZqsxeSm-AhhxhAPZk7VbMw74WwK25HI0_lSMhcAMc4Br46jHRD0tc8wBNIFl-uvSlodffvBXokkyPnLsAtna0-2-jBCtX2n5OQ63BTNl_/s1600/FluxoPortal.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjMKs7ul5BhsQfbvEs2kiLW7JnArXAG5wpivYZqsxeSm-AhhxhAPZk7VbMw74WwK25HI0_lSMhcAMc4Br46jHRD0tc8wBNIFl-uvSlodffvBXokkyPnLsAtna0-2-jBCtX2n5OQ63BTNl_/s320/FluxoPortal.jpg" /></a></div><div style="text-align: center;"><b><span class="Apple-style-span" style="font-size: small;">Figura 4. </span></b><span class="Apple-style-span" style="font-size: small;">Fluxo de criação de uma página de portal</span></div><div>A<b> Figura 4</b> acima, apresenta como funciona a construção da página de um portal. Podemos notar que os portlets rodam dentro do contêiner, que recebe o conteúdo gerado pelos portlets. Na seqüência, vemos que o contêiner retorna o conteúdo do portlet para o portal. Por último, o servidor de portal cria a página com o conteúdo gerado pelos portlets e envia para o dispositivo cliente, onde é renderizada (por exemplo, um navegador).</div><div><div><b><span class="Apple-style-span" style="color: #351c75;"><i>Contêiners de Portlet e Contêiners de Servlets</i></span></b></div><div>Os portlets possuem várias similaridades com os servlets, como ambos serem componentes gerenciados por um contêiner especializado, ambos gerarem conteúdo dinâmico, por ambos interagirem com um cliente web através de request/response HTTP. Entretanto, os portlets não podem ser tratados como servlets por conta dos seguintes fatores:</div><div><ul><li>Geram somente fragmentos de página no método de renderização, e não documentos completos;</li>
<li>Podem somente ser invocados através de URLs construídas através da API de portlet;</li>
<li>Clientes web interagem com os portlets através do sistema de portal;</li>
<li>Possuem modos pré-definidos de portlet e estados de janela que indicam a função que o portlet está executando;</li>
<li>Possuem um tratamento de requisição refinado para action, eventos, requisições de renderização e requisições a recursos;</li>
<li>Não possuem acesso a certas funcionalidades fornecidas pelos servlets, como a URL de requisição do cliente ao Portal, ou atribuir o encoding de caracteres para a resposta ao cliente.</li>
</ul></div><div>Por conta destas diferenças, o JCP decidiu criar para portlets um novo tipo de componente. Porém, ao formular a especificação de Portlets, o JCP procurou sempre que possível, potencializar o uso das funcionalidades fornecidas pela especificação de Servlets. Isto inclui deployment, classloading, aplicações web, gerenciamento de sessão e request dispatching. Por isso, diversos conceitos e partes da API de Portlets foram modelados a partir da API de Servlet.</div><div>Os objetos criados em uma aplicação de portal, como portlets, servlets e JSPs são empacotados como uma aplicação web comum (.war), e irão compartilhar o mesmo classloader, contexto de aplicação e sessão no ambiente de execução.</div></div><div> </div><div>No próximo artigo sobre o assunto, vou falar sobre as JSRs 168 / 286 sobre a criação de Portlets. </div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com5tag:blogger.com,1999:blog-544668644670311424.post-51552425714316807702010-08-13T21:36:00.004-03:002010-08-13T21:48:05.309-03:00Princípios, Padrões e Práticas para um Design Ágil na Java Magazine - Parte 1<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr4fnr9DkKlI-JoTaczSEFeNhe0PuD4bQXjqEfDWtTGo2h_0nr7sBU3Gh5Yfo0qlB6YxgQdKWLJVwOn6l7vwWz6p-tkDs4ALBlCzyYDB9FV2JRhghvZzKPdZhu19b5UhICYrFCW14Enyg4/s1600/capaOnline_java80_2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr4fnr9DkKlI-JoTaczSEFeNhe0PuD4bQXjqEfDWtTGo2h_0nr7sBU3Gh5Yfo0qlB6YxgQdKWLJVwOn6l7vwWz6p-tkDs4ALBlCzyYDB9FV2JRhghvZzKPdZhu19b5UhICYrFCW14Enyg4/s320/capaOnline_java80_2.jpg" width="274" /></a></div>Na revista <a href="http://www.devmedia.com.br/post-17125-Revista-Java-Magazine-80.html">Java Magazine Edição 80</a>, saiu a primeira parte de uma série de três artigos, onde abordarei diversos assuntos relacionados ao desenvolvimento de software em ambientes ágeis.<br />
Como o nome indica, ele é baseado no obra de Uncle Bob, Robert C. Martin, autor de diversos livros importantes como <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&s=books&qid=1281745868&sr=8-1">Clean Code</a>, <a href="http://www.amazon.com/UML-Java-Programmers-Robert-Martin/dp/0131428489/ref=sr_1_6?s=books&ie=UTF8&qid=1281745906&sr=1-6">UML for Java Programmers</a>, <a href="http://www.amazon.com/Extreme-Programming-Practice-James-Newkirk/dp/0201709376/ref=sr_1_8?s=books&ie=UTF8&qid=1281745906&sr=1-8">Extreme Programming in Practice</a> e o clássico <a href="http://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445/ref=sr_1_1?s=books&ie=UTF8&qid=1281745906&sr=1-1">Agile Software Development, Principles, Patterns, and Practices </a>, que é o livro que me baseei para escrever este artigo, obviamente, este livro não foi a única fonte de inspiração, pois falei sobre diversos assuntos, como arquitetura de software e Design, princípios não abordados no livro (Pragmatic Programming), DDD, Effective Java, entre outros. <br />
A primeira parte desta série o objetivo é apresentar conceitos relacionados a arquitetura de software, como Estilos de Arquitetura conhecidos (SOA, DDD, Arquitetura em Camadas, 3/N Tiers). Separação de Responsabilidades (Separation of Concerns) Horizontal e Vertical. Arquitetura Distribuída, Tiers e Layers. <br />
E visa também demonstrar boas práticas de desenvolvimento de software e explicar os princípios fundamentais para se criar um bom design. E analisar também a aplicação de alguns padrões de projeto pouco difundidos, mas que são de extrema importância no dia a dia do desenvolvedor.<br />
Como os Padrões de Projeto Front Controller, Domain Model e Transaction Script.<br />
Em breve vou publicar neste blog alguns artigos para complementar o assunto,<br />
<div>Diversão Garantida!</div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-36382848941799457492010-03-17T20:58:00.006-03:002012-01-13T18:31:40.844-02:00Academia Agile - Do Coaching ao Kanban<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihAyDIDwiQklEvLe8lc8A9izc1-4pJy-RCow34S4qYm03XJdxifWVZ_j8SZpuyPQwTQbO4HOWl94P8byFUmTCoNcyyZXtlPg8GelxawwzY7eEe_5K_0MW_3TUoon7Xx2u4P2wuFNdBEbRT/s320/academiaagile.jpg" /></div>
<br />
Muitos já sabem que a <a href="http://globalcode.com.br/" target="_blank">Globalcode </a>em conjunto com a <a href="http://www.fratech.net/home" target="_blank">Fratech </a> está lançando a <a href="http://globalcode.com.br/treinamentos/carreiras/academia-do-agile" target="_blank">Academia do Agile</a>, uma carreira com a carga horária de 108 horas, e composta por 8 cursos que abordam todos os aspectos necessários para formar um profissional ágil.<br />
<br />
<span class="Apple-style-span" style="color: #666666; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px;"></span><br />
<table border="0" cellpadding="0" cellspacing="1" class="modulos_agil" style="background-color: #d9d9d9; width: 802px;"><thead>
<tr><td style="background-color: #a7bade; color: white; font-size: 11px; font-weight: bold; height: 35px; line-height: 15px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;" width="71">Código</td><td style="background-color: #a7bade; color: white; font-size: 11px; font-weight: bold; height: 35px; line-height: 15px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;" width="530">Nome do curso</td><td style="background-color: #a7bade; color: white; font-size: 11px; font-weight: bold; height: 35px; line-height: 15px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;" width="100">Carga<br />
Horária</td><td style="background-color: #a7bade; color: white; font-size: 11px; font-weight: bold; height: 35px; line-height: 15px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;" width="100">Apostila<br />
Demo</td></tr>
</thead><tbody>
<tr><td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"><b>AG1</b></td><td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"><b>Implantando e liderando equipes Ágeis</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"><b>12 hs</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"></td></tr>
<tr><td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"><b>AG2</b></td><td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"><b>Criação de produtos com Requisitos Ágeis</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"><b>12 hs</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"></td></tr>
<tr><td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"><b>AG3</b></td><td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"><b>Otimizando a Comunicação através de DDD</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"><b>12 hs</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"></td></tr>
<tr><td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"><b>AG4</b></td><td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"><b>Modelagem Ágil de Software</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"><b>12 hs</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"></td></tr>
<tr><td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"><b>AG5</b></td><td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"><b>Práticas Ágeis de Engenharia de Software com XP</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"><b>24 hs</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"></td></tr>
<tr><td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"><b>AG6</b></td><td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"><b>Gestão de projetos com Scrum</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"><b>12 hs</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"></td></tr>
<tr><td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"><b>AG7</b></td><td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"><b>Gestão de processos com Kanban e Lean</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"><b>12 hs</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"></td></tr>
<tr><td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"><b>AG8</b></td><td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"><b>Estratégia Ágil para Governança em TI</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"><b>12 hs</b></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"></td></tr>
<tr><td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"></td><td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"><strong>Resumo da carreira Academia do Agile</strong></td><td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; font-weight: normal; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"><strong>108 hs</strong></td></tr>
</tbody></table>
<br />
<br />
Serei um dos revisores do material e para as próximas turmas um dos instrutores desta Academia, mas o que posso garantir é que o material foi feito pelos maiores especialistas na área, meus amigos <a href="http://felipero.com/" target="_blank">Felipe Rodrigues</a> da <a href="http://www.fratech.net/home" target="_blank">Fratech </a>e <a href="http://twitter.com/manoelp" target="_blank">Manoel Pimentel</a> editor chefe da revista <a href="http://visaoagil.wordpress.com/" target="_blank">Visão Ágil</a>.<br />
<br />
A primeira turma está com 25% de desconto, pelo preço é uma ótima pedida para quem quer conhecer a fundo as disciplinas do Agile.<br />
<br />
Segue alguns dos temas que irá rolar em cada módulo.<br />
<br />
<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; font-family: Verdana, Arial, Helvetica, sans-serif;"><b>AG1</b></span>- <span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"><b>Implantando e liderando equipes Ágeis</b></span><br />
<ul><b>
<li>Facilitação</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">O que é facilitação</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Abordagem cognitiva para facilitar mudanças</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Um breve passeio pela mente humana</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Estimulando a Neuroplasticidade</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Compreensão do Sistema Límbico</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Técnicas de Facilitação durante as atividades Agile</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Os Seis Chapéus do Pensamento</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Feedback efetivo através da janela de JOHARI</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">O Que? Para que? E como causar a mudança com a TOC(Theory of Constraints)</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">O desenvolvimento da confiança entre indivíduo</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Planejamento de eventos de facilitação</span></li>
</ul>
<li>Coaching</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Objetivo do Coaching</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Desfazendo mitos acerca do Coaching</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Papéis no processo de Coaching</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Condição Humana</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Missão e Ideal</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Valores e Crenças</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Consciência e Responsabilidade</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Perguntas Eficazes para gerar mudanças</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Motivação (verdades e mentiras)</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Vencendo o Inner Game</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">FFA (Force Field Analysis)</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Ganhos e Perdas</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Modelo FARM</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Modelo GROW</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">House of Change</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Estrutura das sessões de Coaching</span></li>
</ul>
<li>Liderança</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Gestão do tempo para gerar ROE</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Empatia</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Técnica Pomodoro</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">GTD - Getting Things Done</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Covey Planning</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Liderança baseada em Coaching</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Coaching para Equipes</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">O Coaching num ambiente Ágil</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">O que fazer com impedimentos?</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Projeto de aplicação prática de Coaching</span></li>
</ul>
</b></ul>
<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"><b><span class="Apple-style-span" style="color: black; font-weight: normal;"><b>AG2 - </b></span>Criação de produtos com Requisitos Ágeis</b></span><br />
<b></b><br />
<ul>
<li><b><b>Definição de escopo</b></b></li>
<b>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">O produto do ponto de vista de negócio</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">As dimensões do escopo (Tamanho, simplicidade e aderência.)</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Processo de aprendizado de escopo</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Estado Lean para o desenho de software</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Requisitos ágeis e os casos de usos?</span></li>
</ul>
<li><b>User Stories</b></li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Modelando Papéis</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Representando desejos com User Story</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Formato para User Story</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">O modelo INVEST</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Usando Temas e Épicos</span></li>
</ul>
<li><b>Features segundo o FDD</b></li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Representando desejos com Features</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">O modelo ARO (Ação Resultado Objeto)</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Aplicando a FBS (Feature Breakdown Structure) da FDD (Feature Driven Development)</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Usando Áreas e Atividades</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Priorização por Áreas, Atividades ou Temas</span></li>
</ul>
<li><b>Definindo o modelo de Entrega</b></li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Estratégia de entrega em alto nível</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Critérios de Aceitação em diferentes níveis</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">DoD (Definition of Done) em diferentes níveis</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Monitoramento de resultados</span></li>
</ul>
<li><b>Aplicando a TOC na engenharia de requisitos</b></li>
<li><b>Documentação pós-projeto</b></li>
</b></ul>
<br />
<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="color: black; font-weight: normal;"><b>AG3 - </b></span>Otimizando a Comunicação através de DDD</b></span></b></span><br />
<b><b></b></b><br />
<ul>
<li><b><b>Introdução ao Domain Driven Design</b></b></li>
<b><b>
<li>Sinergia entre Domain Driven Design e os princípios Ágeis</li>
<li>Uma Linguagem Unificada e abrangente</li>
<li>Visão Arquitetural do Domain Driven Design</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Arquitetura em Camadas</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Objetos de negócio com Domain Objects</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Ciclo de vida dos Domain Objects</span></li>
</ul>
<li>Mantendo um domínio flexível com Supple Design</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Práticas de suporte</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Refactoring em busca de aprofundamento</span></li>
</ul>
<li>Integrando vários domínios com Strategic Desing</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Delimitando os contextos</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Integração entre contextos diferentes</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Estratégias de integração</span></li>
</ul>
</b></b></ul>
<br />
<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="color: black; font-weight: normal;"><b>AG4 - </b></span>Modelagem Ágil de Software</b></span></b></span></b></span><br />
<b><b><b></b></b></b><br />
<ul>
<li><b><b><b>Introdução à Modelagem de software</b></b></b></li>
<b><b><b>
<li>Modelagem no contexto da agilidade</li>
<li>Ciclos de modelagem ágil</li>
<li>Modelagem em equipe</li>
<li>Visualização do modelo</li>
<li>Diagramas simples e práticos com Agile Draw</li>
<li>Modelagem Ágil e UML</li>
<li>Resultados da modelagem ágil</li>
<li>Entregáveis</li>
<div>
</div>
</b></b></b></ul>
<br />
<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="color: black; font-weight: normal;"><b>AG5 - </b></span>Práticas Ágeis de Engenharia de Software com XP</b></span></b></span></b></span></b></span><br />
<b></b><br />
<ul>
<li><b>Introdução ao Extreme Programming</b></li>
<b>
<li>Modelo cíclico de entrega</li>
<li>Ciclo PDCA</li>
<li>Test Driven Development</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">O modelo Test First</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Modelando através dos testes</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Relação custo-benefício dos testes</span></li>
</ul>
<li>Behavior Driven Development</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Especificação executável com BDD</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Casos de negócio</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Ferramentas de BDD</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Relatórios de BDD</span></li>
</ul>
<li>Integração Contínua</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Processo de desenvolvimento com integração contínua</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Repositórios de código fonte</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Integração contínua e os testes</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Servidores de integração contínua</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Principios importantes</span></li>
</ul>
<li>Inspeção</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Pair-Programming</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Inspeção segundo o FDD</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">A Inspeção e a Definição de Pronto</span></li>
</ul>
</b></ul>
<br />
<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="color: black; font-weight: normal;"><b>AG6 - </b></span>Gestão de projetos com Scrum</b></span></b></span></b></span></b></span></b></span><br />
<b></b><br />
<ul>
<li><b>Abordagens Ágeis</b></li>
<b>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Imergindo no Scrum</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Conhecendo as fases e ciclo de vida do Scrum</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">A FDD (Feature Driven Development) e como combiná-la com o Scrum</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Entendendo a influência Lean</span></li>
</ul>
<li>Engenharia de Requisitos para compor um bom Product Backlog</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">FBS (Feature Breakdown Structure) da FDD</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Compondo o Product BackLog com funcionalidades</span></li>
</ul>
<li>Planejamento</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Os papeis do Scrum</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">O conceito de Sprint</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Entregas freqüentes de valor para o cliente</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Gerenciando Business Value</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Sprint Planning Meeting</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Desdobramento em tarefas</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Características do Sprint BackLog</span></li>
</ul>
<li>Estimativas</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Apostando no Planning Poker</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Descobrindo a complexidade</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Conhecendo o tamanho das coisas</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Trabalhando com estimativas em horas</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Qual a granularidade necessária para as estimativas</span></li>
</ul>
<li>Desenvolvimento</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Scrum Daily Meeting</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Gestão de Impedimentos</span></li>
</ul>
<li>Métricas e Acompanhamentos</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Foco no Escopo ? Entrega de software funcionado</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">KanBan para facilitar a comunicação durante o processo</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Conhecendo o BurnDown Chart</span></li>
</ul>
<li>Entregas</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Sprint Review</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Testes de Aceitação</span></li>
</ul>
<li>Melhoria contínua</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Sprint Retrospective</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Uma breve introdução em TOC (Theory Of Constraints) para o Processo de Mudança </span></li>
</ul>
<li>Imersão</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Durante todo o workshop será realizado um laboratório prático através da dinâmica de construção.</span></li>
</ul>
</b></ul>
<br />
<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="color: black; font-weight: normal;"><b>AG7 - </b></span>Gestão de processos com Kanban e Lean</b></span></b></span></b></span></b></span></b></span></b></span><br />
<ul>
<li><b>Cultura e Filosofia Lean</b></li>
<ul>
<li>O que é Lean</li>
<li>Pensamento Enxuto</li>
<li>Impactos econômicos do pensamento enxuto</li>
<li>Tipos de cenários para o pensamento Lean</li>
<li>Perspectiva de Consumo</li>
<li>Geração de Valor</li>
<li>Eliminação das Perdas</li>
<li>Respeito e Desenvolvimento de Pessoas</li>
</ul>
<li><b>Ferramentas Lean</b></li>
<ul>
<li>Hansei e Kaizen para melhoria contínua</li>
<li>Poka-Yoke e Jidoka para ajudar a qualidade</li>
<li>Andon e Kanban como meio de comunicação</li>
</ul>
<li><b>Gestão Lean</b></li>
<ul>
<li>Planejamento e Gestão com pensamento A3</li>
<li>WIP (Work-In-Process)</li>
<li>Pull System</li>
<li>Visualizando o VSM - Value Stream Map</li>
<li>O que é Lead Time?</li>
<li>Identificando Restrições</li>
<li>Resolução de Problemas com The Five Whys</li>
<li>Aplicando o clico PDCA</li>
<li>Definindo demanda</li>
<li>Definindo tamanho</li>
<li>Definindo capacidade</li>
<li>Usando o sistema Kanban</li>
</ul>
<li><b>Adoção</b></li>
<ul>
<li>Aplicação em equipes de projetos</li>
<li>Aplicações de equipes de sustentação</li>
<li>Lean/Kanban com Scrum</li>
</ul>
</ul>
<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"><b><span class="Apple-style-span" style="color: black; font-weight: normal;"><b>AG8 - </b></span>Estratégia Ágil para Governança em TI</b></span><br />
<b></b><br />
<ul>
<li><b>Visão Geral do Ecossistema</b></li>
<b>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Pessoas</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Processos</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Práticas</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Ferramentas</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Parceiros</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Filosofia e Cultura</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Missão, Valores e Propósito</span></li>
</ul>
<li>Introdução ao Enterprise Agile</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Agile Project Management</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Enterprise Scrum</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Engenharia de Software com FDD</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Lean/KanBan para gestão de processos</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Definindo escopo de atuação para Agile</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Planejamento de adoção/implementação de Agile</span></li>
</ul>
<li>Framework de TI</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Gestão de Demandas</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Gestão de Portfólio</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Gestão de Configuração</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Gestão de Mudanças</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Gestão de Serviço de TI</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Planejamento Estratégico</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Gestão Financeira</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Geração de Conhecimento</span></li>
</ul>
<li>Integrações</li>
<ul>
<li><span class="Apple-style-span" style="font-weight: normal;">Dialogando com ITIL e COBIT</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Gestão Ágil em ambientes PMBoK</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Agile com modelos de certificação</span></li>
<li><span class="Apple-style-span" style="font-weight: normal;">Convivendo com processos auditáveis por órgãos reguladores</span></li>
</ul>
</b></ul>
<div>
<div>
<b><span class="Apple-style-span" style="font-weight: normal;"><b></b></span></b><br />
<div style="display: inline !important;">
<div style="display: inline !important;">
<b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;">Pelo conteúdo apresentado acima, é fácil entender o porque este curso é a formação mais completa que existe sobre agilidade não só no Brasil, mas talvez no mundo, abordando temas como DDD, FDD, BDD, TDD, Lean, Kanban, XP, Scrum, passando por Coaching, e Governança em TI.</span></b></span></b></div>
</div>
</div>
<div>
<b><span class="Apple-style-span" style="font-weight: normal;"><b></b></span></b><br />
<div style="display: inline !important;">
<div style="display: inline !important;">
<b><span class="Apple-style-span" style="font-weight: normal;"><b><b></b></b></span></b><br />
<div style="display: inline !important;">
<div style="display: inline !important;">
<b><span class="Apple-style-span" style="font-weight: normal;"><b><b><span class="Apple-style-span" style="font-weight: normal;"><b></b></span></b></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><b><span class="Apple-style-span" style="font-weight: normal;"><b></b></span></b></b></span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b><b><span class="Apple-style-span" style="font-weight: normal;"><b></b></span></b></b></span></b><br />
<div style="display: inline !important;">
<div style="display: inline !important;">
<div style="display: inline !important;">
<b><span class="Apple-style-span" style="font-weight: normal;"><b><b><span class="Apple-style-span" style="font-weight: normal;"><b><span class="Apple-style-span" style="font-weight: normal;">A primeira turma começa agora dia 26/03, as aulas serão intercaladas de 15 em 15 dias com aulas ás sextas e sábados. Nos vemos por lá!</span></b></span></b></b></span></b></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
</div>
<div>
<b><span class="Apple-style-span" style="font-weight: normal;"><br />
</span></b></div>
<div>
<b><span class="Apple-style-span" style="font-weight: normal;">Diversão Garantida!!! </span></b></div>
</div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-69350630225472669862009-12-29T13:44:00.011-02:002010-01-06T11:46:11.165-02:00Consumindo e Testando Clientes REST<div class="separator" style="margin-left: 1em; margin-right: 1em; text-align: center;"><br />
</div><span id="goog_1262090748801"></span><span id="goog_1262090748802"></span><br />
A especificação <a href="http://jcp.org/en/jsr/detail?id=311" target="_blank">JAX-RS </a>é uma ótima opção para criar web services <a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm" target="_blank">REST</a> e fornece meios de desenvolver componentes server-side, mas não descreve como os desenvolvedores devem desenvolver seus componentes client-side em Java, e essa já é uma das promessas para a próxima release do JAX-RS.<br />
<br />
Pelo fato de nossos serviços RESTful serem URIs e a forma de acesso a estes serviços serem os próprios métodos HTTP, podemos trabalhar diretamente com requisições HTTP ou utilizar bibliotecas para facilitar este trabalho. Felizmente é relativamente fácil trabalhar diretamente com requests e responses HTTP, e as linguagens mais populares de programação possuem métodos/bibliotecas HTTP, como por exemplo, urllib2 e httplib em Python, libcurl em PHP, HTTPWebRequest em C#, open-uri em Ruby, e o pacote java.net.* e o projeto HttpClient da Apache para Java, entre outros. Mas para qualquer linguagem que seja feito a requisição ao serviço RESTful, temos que passar por alguns passos, conforme segue:<br />
<ol><li>Montar os dados que irão trafegar pelo requisição HTTP, como a URI, HTTP header (se houver), e o método HTTP desejado.</li>
<li>Formatar estes dados como uma requisição HTTP, e enviá-lo para um servidor HTTP apropriado.</li>
<li>Efetuar o parsing dos dados retornados (XML, JSON, etc..) para as estruturas de dados que o seu programa precisa.</li>
</ol><br />
Para facilitar a pesquisa, montamos um pequeno guia, para os desenvolvedores e estudiosos que querem aprender um pouco mais sobre REST, onde iremos apresentar algumas bibliotecas para teste e consumo de serviços RESTful.<br />
<br />
<span style="font-size: large;"><b>cURL</b></span><br />
<br />
Se o intuito for apenas testar os serviços REST desenvolvidos e validar o retorno, o mais simples é utilizar ferramentas existentes na web como é o caso da biblioteca cURL, que é uma ferramenta de transferência de arquivos entre cliente-servidor desenvolvida em C, e suporta protocolos como HTTP, HTTPS, FTP, FTPS, etc.<br />
A <b>listagem 1</b> apresenta alguns exemplos de como fazer uma requisição GET e POST com uso da biblioteca cURL, como podemos ver, ela não possui uma interface gráfica, sendo uma ferramenta de linha de comando.<br />
Fazendo uma requisição (GET), passando como parâmetro de headerv tipo de conteúdo <b>json</b>, (<i>-H "Accept:application/json"</i>) <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8mBZmPbHAWYIIYRw9ooxgBsTkYav0md3pWjCn8BSKAtvNjiZVZ83Rdq-J3KFcVuHsSP4y4BnReUQvDKAMtQwFOzZ2fijyxTPSqp4h9j3F2jfUfEcx-0eTpouwIDolT4-do3r_mx8L_Zss/s1600/rest01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8mBZmPbHAWYIIYRw9ooxgBsTkYav0md3pWjCn8BSKAtvNjiZVZ83Rdq-J3KFcVuHsSP4y4BnReUQvDKAMtQwFOzZ2fijyxTPSqp4h9j3F2jfUfEcx-0eTpouwIDolT4-do3r_mx8L_Zss/s400/rest01.jpg" /></a><br />
</div><br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">// Fazendo uma requisição POST, passando como query parameter name = JumboComLtda</span><br style="font-family: "Trebuchet MS",sans-serif;" /><b><span style="font-family: "Trebuchet MS",sans-serif;"><span style="font-family: Verdana,sans-serif;">$ curl -d name=JumboComLtda http://localhost:8080/Contatos/resources/customers/2/cliente/</span></span></b><br style="font-family: "Trebuchet MS",sans-serif;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">// Excluindo um registro com DELETE, pelo parâmetro –X</span><br style="font-family: "Trebuchet MS",sans-serif;" /><b style="font-family: "Trebuchet MS",sans-serif;"><span style="font-family: Verdana,sans-serif;">$ curl -v –X DELETE http://localhost:8080/Contatos/resources/customers/99/</span></b></span><br />
<span style="font-size: x-small;"><br style="font-family: "Courier New",Courier,monospace;" /><b><span style="font-family: "Courier New",Courier,monospace;">Registro excluído com sucesso !</span></b></span><br />
<br />
<span style="font-size: x-small;"><b>Listagem 1: Uso da biblioteca cURL.</b></span><br />
<span style="font-size: x-small;"><b> <br />
</b></span><br />
<b>Referências:</b><br />
<ul><li><b>cURL</b> - Site Oficial <a href="http://curl.haxx.se/" target="_blank">http://curl.haxx.se/</a> </li>
<li>Artigo <a href="http://download.indiwiz.com.s3.amazonaws.com/article/RESTClient.pdf" rel="nofollow" target="_blank">Testing RESTful WebServices Made Easy</a> (em inglês), publicado na revista Linux 4You em Maio de 2009.</li>
<li><a href="http://code.google.com/p/rest-client/wiki/Cookbook" target="_blank">RESTClient Cookbook</a>, vários receitas e demonstrações de como extender o RESTClient.</li>
</ul><br />
<span style="font-size: large;"><b>RESTClient</b></span><br />
<br />
<a href="http://code.google.com/p/rest-client/" target="_blank">RESTClient</a> é uma aplicação Java própria para auxiliar nos testes de serviços RESTful, complementar a isto, ela pode ser utilizada para testar Web Services POX (Plain Old XML) sobre HTTP. Para utilizar, basta efetuar o <a href="http://code.google.com/p/rest-client/downloads/list" target="_blank">download</a> do arquivo jar (com dependências) da ultima versão, no momento que escrevo este artigo, a versão mais recente é a versão 2.3, e vem com duas opções.<br />
<ul><li><b>RESTClient 2.3 GUI:</b> <a href="http://rest-client.googlecode.com/files/restclient-ui-2.3-jar-with-dependencies.jar" target="_blank">restclient-ui-2.3-jar-with-dependencies.jar</a></li>
<li><b>RESTClient 2.3 Command-line:</b> <a href="http://rest-client.googlecode.com/files/restclient-cli-2.3-jar-with-dependencies.jar" target="_blank">restclient-cli-2.3-jar-with-dependencies.jar</a><br />
</li>
</ul><br />
A versão GUI, é uma aplicação Swing com diversas opções, e bem conhecida de quem trabalha com o RESTClient desde suas primeiras versões, e a outra versão "cli" é para execução batch de arquivos .rcq. Para começar utilizar a versão em Swing, basta digitar o seguinte comando (A aplicação requer Java 6 para rodar):<br />
<div style="font-family: "Trebuchet MS",sans-serif;"><b>$java -jar restclient-ui-2.3-jar-with-dependencies.jar</b><br />
</div> <br />
Após executar a aplicação, deverá ser apresentado a tela conforme ilustra a <b>Figura 1</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgdIoWRCR6To29xKi40vEvxBsEEOXTCYFAadGd9b-YxhegEN3MgQUYnNHzCRMB8NPgxonTe7A_5yaTPPU-YQoWf5WYLyBSvv7_6fHoitA29RImYB36cOAO0KX5bFA_E2RKkwwiKbbVAHTE/s1600-h/Restclientjpg.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgdIoWRCR6To29xKi40vEvxBsEEOXTCYFAadGd9b-YxhegEN3MgQUYnNHzCRMB8NPgxonTe7A_5yaTPPU-YQoWf5WYLyBSvv7_6fHoitA29RImYB36cOAO0KX5bFA_E2RKkwwiKbbVAHTE/s320/Restclientjpg.jpg" /></a><br />
</div><div style="text-align: center;"><span style="font-size: x-small;"><b>Figura 01 - Interface Swing do RESTClient.</b></span><br />
</div><br />
Pela aparência da interface gráfica, podemos deduzir facilmente o modo de utiliza-lá, basta digitar no campo URL o caminho desejado, selecionar algum método HTTP na aba Method, e executar a consulta clicando no botão [>>]. O resultado será apresentando no bloco HTTP Response.<br />
<br />
<br />
<span style="font-size: small;"><b>Funcionalidades </b></span><br />
<br />
Com RESTClient, podemos fazer qualquer tipo de requisição HTTP (GET, PUT, POST, DELETE, HEAD, OPTIONS, TRACE), ainda existe o suporte a SSL e a possibilidade de adicionar parâmetros de Header adicionais.<br />
É possível salvar as requests, responses, e o Response Body (atráves do menu <i>File</i> > <i>Save Request</i>, ou <i>Save Response</i>, <i>Save Response Body</i>), o que é útil para testes de regressão, que podemos utiliza-los posteriormente na versão de linha de comando.<br />
RESTClient ainda vem com o Conteiner Jetty embutido, que possui um Servlet que imprime os detalhes das requisições submetidas a ele. Para iniciar o servidor basta acessar o menu <i>Tools</i> > Opção <i>Start Trace Server</i> (subirá na porta 10101).<br />
<br />
E por fim, uma das funcionalidades mais interessantes é o seu suporte integrado para testes, que podem inclusive ser escritos em Groovy, o suporte a testes é baseado no JUnit 3.x e os tests são atachados a cada requisição. Para iniciar os testes, na aba "<i>Test Script</i>", clique o no botão <i>Insert Template</i>, RESTClient irá criar o código para você, conforme mostra a <b>Listagem 02</b>:<br />
<pre class="java" name="code">// The test class name should end with `Test'--this is a convention:
public class TemplateClassTest
extends org.wiztools.restclient.RESTTestCase{
// Test method names should start with `test':
public void testStatus(){
if(response.getStatusCode() != 200){
fail("This will fail the test!");
}
}
}</pre><span style="font-size: x-small;"><b>Listagem 2: Template de Test gerado pelo RESTClient.</b></span><br />
<br />
A partir da versão 2.3, RESTClient possui uma versão em linha de comando, está versão é utilizada para executar requisições de forma batch e armazenar o resultado dos testes. Para executar está versão, basta na linha de comando executar:<br />
<br />
<div style="font-family: "Trebuchet MS",sans-serif;"><b>$java -jar restclient-cli-2.3-jar-with-dependencies.jar -o /temp/diretorioResponse *.rcq</b><br />
</div><br />
Esse comando, irá executar todos as requisições contidas nos arquivos de extensão (.rcq) no diretório de execução atual, e irá salvar as responses (na extensão .rcs) no diretório /temp/diretorioResponse. E por fim, o RESTClient, imprime um resumo da execução dos testes. <br />
<br />
<br />
<b>Referências:</b><br />
<ul><li>Artigo RESTFul Web Services e a API JAX-RS na revista Mundo Java edição 35</li>
<li>Artigo <a href="http://download.indiwiz.com.s3.amazonaws.com/article/RESTClient.pdf" rel="nofollow" target="_blank">Testing RESTful WebServices Made Easy</a> (em inglês), publicado na revista Linux 4You em Maio de 2009.</li>
<li><a href="http://code.google.com/p/rest-client/wiki/Cookbook" target="_blank">RESTClient Cookbook</a>, vários receitas e demonstrações de como extender o RESTClient.</li>
</ul><br />
<span style="font-size: large;"><b>Testando Web Services RESTful no NetBeans.</b></span><br />
<br />
Para quem é usuário do NetBeans, uma outra opção para testar Web Services RESTful é utilizar o suporte do próprio IDE, com um projeto Web criado e os serviços RESTful devidamente configurados, é possível testá-los clicando com o botão direito do mouse em cima do projeto e selecionar a opção “Test RESTful Web Services” (<b>Figura 02</b>), lembrando que está opção só estará disponível, se o projeto WEB possuir serviços WEB.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGlsPC00Tz0IV8_zUmsL-3h1Am2tTxY8lVV8DlrbMAXkgAXFree0YtMRF7L9FenOYJA4iSIRM1_H23_emm8baTOt4-PQDRGWyavazwdohNwskqzBUzPq7BkQM1l5YEnDuoplXiJb94IeqN/s1600-h/netbeans-rest.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGlsPC00Tz0IV8_zUmsL-3h1Am2tTxY8lVV8DlrbMAXkgAXFree0YtMRF7L9FenOYJA4iSIRM1_H23_emm8baTOt4-PQDRGWyavazwdohNwskqzBUzPq7BkQM1l5YEnDuoplXiJb94IeqN/s320/netbeans-rest.jpg" /></a><br />
</div><div style="text-align: center;"><span style="font-size: x-small;"><b>Figura 02 -Suporte a REST no NetBeans.</b></span><br />
</div><br />
Ao selecionar esta opção, será feito o build e o deploy da aplicação web, e ao final do processo será disponibilizado uma página de testes web, como mostra a <b>Figura 03</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQLNiZjT_PIUTcg-p-eUswDv2NGliKctbgb6QL3-bK_quRBcF_TwkNKtBC4-H9irfl0sG8g8I1ssE3I4OCcN8qPq8w9Opai6JI-m32Zj90DeBMaqYzFk3bLUwpqUdAD-HcGFrnNEdRUMTn/s1600-h/netbeans-rest2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQLNiZjT_PIUTcg-p-eUswDv2NGliKctbgb6QL3-bK_quRBcF_TwkNKtBC4-H9irfl0sG8g8I1ssE3I4OCcN8qPq8w9Opai6JI-m32Zj90DeBMaqYzFk3bLUwpqUdAD-HcGFrnNEdRUMTn/s320/netbeans-rest2.jpg" /></a><br />
</div><div style="text-align: center;"><b><span style="font-size: x-small;">Figura 03 - Tela de testes de Web Services RESTful</span></b><br />
</div><br />
Na página apresentada é possível testar todos os serviços disponíveis, criar novos parâmetros para a requisição (botão “Add Parameter”), e também é possível selecionar o tipo de método HTTP para teste e o tipo MIME de retorno.<br />
<br />
Para iniciar o teste, basta clicar no botão “Test”, após a execução, dentro da seção Response, podemos analisar os dados de retorno, os dados do cabeçalho e o status da chamada.<br />
<br />
Além disso, de acordo com os serviços criados, o NetBeans ainda gera o arquivo WADL, visível no canto superior esquerdo da <b>Figura 03</b>.<br />
<br />
<b>Referências:</b><br />
<ul><li>NetBeans - Site Oficial: <a href="http://netbeans.org/" target="_blank">http://netbeans.org/</a><br />
</li>
<li><a href="http://docs.sun.com/app/docs/doc/820-7627/giqaa?a=view" target="_blank">Creating a RESTFul Web Service Using NetBeans</a> - Tutorial do site da Sun.</li>
</ul><br />
<span style="font-size: large;"><b>JAXB</b></span><br />
<br />
JAXB (Java Architecture for XML Binding) fornece a API, as ferramentas e um framework que automatiza o mapeamento entre documentos XML e objetos Java. Ou seja, fornece compiladores que compilam Schemas XML para objetos Java. Em tempo de execução podemos deserializar (unmarshal) o conteúdo de um arquivo XML para representações Java. <br />
<br />
Além disso, podemos acessar, alterar e validar a representação Java contra regras de um Schema e por fim, podemos serializar (marshal) o conteúdo de um objeto Java em conteúdo XML. Veja sua arquitetura na <b>Figura 04</b>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzHT8Sc0qK1W7Jt2aRLQMk2V4s69-UuMNlghrC-5d2z8eURY7liDjnk04ckO8BrocTNtRAaPKkgGZjDAvwZMVDLMK3nEOmzeWewa_nL00Do7bqdrtQCQHP8OeV8RJ_I349z6y2iaeFWh7P/s1600-h/jaxb-overview.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzHT8Sc0qK1W7Jt2aRLQMk2V4s69-UuMNlghrC-5d2z8eURY7liDjnk04ckO8BrocTNtRAaPKkgGZjDAvwZMVDLMK3nEOmzeWewa_nL00Do7bqdrtQCQHP8OeV8RJ_I349z6y2iaeFWh7P/s320/jaxb-overview.gif" /></a><br />
</div><imagem 4=""></imagem><br />
<br />
<div style="text-align: center;"><span style="font-size: x-small;"><b>Figura 04 - Overview do JAXB.</b></span><br />
</div><br />
Esta fora deste artigo um estudo mais aprofundado sobre o JAXB, mas apenas para conhecimento, a API JAXB acabou se tornando a forma padrão de mapeamento entre Java e XML, com JAXB temos anotações que nos permitem criar uma representação em Java de um Schema XML, estas anotações estão presentes no pacote javax.xml.bind.annotations, e possuem anotações associadas a pacotes Java (@XmlSchema, @XmlSchemaType, etc..), a classes Java (@XmlType, @XmlRootElement), a propriedades e campos (@XmlElement, @XmlAttribute), entre outras anotaçõe.<br />
<br />
Para exemplificar, considere o exemplo da <b>listagem 3</b>, esta é uma classe POJO representando uma pessoa, com anotações JAXB. Ao fazer um marshalling de uma instância da classe PessoaBinding para XML, teremos o resultado apresentado na <b>listagem 04</b>.<br />
<br />
<pre class="java" name="code">@XmlRootElement(name="pessoa")
@XmlType(name="", propOrder={"nome","idade","statusCivil"})
public class PessoaBinding {
/* Construtores e Setters omitidos */
private String nome;
private int idade;
private String statusCivil;
private String cpf;
@XmlElement
public String getNome() {
return nome;
}
@XmlElement
public int getIdade() {
return idade;
}
@XmlAttribute(name="num_cpf")
public String getCpf() {
return cpf;
}
@XmlElement
public String getStatusCivil() {
return statusCivil;
}
}
</pre><span style="font-size: x-small;"><b>Listagem 03 - Classe PessoaBinding com anotações JAXB.</b></span><br />
<br />
<pre class="xml" name="code"> <pessoa num_cpf="123456789">
<nome>Wagner</nome>
<idade>29</idade>
<statuscivil>Casado</statuscivil>
</pessoa>
</pre><span style="font-size: x-small;"><b>Listagem 04 - XML Gerado após marshalling de classe JAXB PessoaBinding.</b></span><br />
<br />
A especificação do JAX-RS fornece alguns Entity Providers padrões, entre eles, provedores para JAXB, para quando o tipo de conteúdo trafegado for do tipo xml (application/xml, text/xml e application/*+xml), de modo que o programador não precisa criar código para converter um objeto Java em código XML e vice versa, facilitando muito nossa vida.<br />
<br />
<br />
Ainda na classe PessoaBinding da <b>listagem 03</b>, poderíamos então, no nosso exemplo, criar um serviço RESTful cujo retorno seja a classe JAXB PessoaBinding , neste caso a declaração do serviço seria similar ao método da <b>listagem 05</b>.<br />
<br />
<pre class="java" name="code"> @GET
@Produces("application/xml")
@Path("/NetFeijao/autor/{idPessoa}/")
public PessoaBinding getPessoa(@PathParam("idPessoa") Integer id) {
return dao.getPessoaAsBinding(id); // Retorna uma entidade Pessoa como PessoaBinding
} </pre><span style="font-size: x-small;"><b>Listagem 05 - Serviço RESTful cujo retorno é uma classe JAXB.</b></span><br />
<br />
Ao fazermos o consumo deste serviço RESTful, vamos perceber que a conversão é feita automaticamente pelo entity provider padrão para XML (veja o teste na <b>Figura 05</b>, utilizando a ferramenta <i>RESTClient</i>). De maneira inversa poderíamos criar um serviço RESTful para receber requisições PUT e receber como parâmetro de entrada do método a classe PessoaBinding via HTTP Body. Conforme apresenta a <b>listagem 06</b>:<br />
<br />
<br />
<br />
<imagem 5=""></imagem><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS58pquNpp_Y7ZEFIGH4GYKD0M6-ECHQBkfcH4Q3CVAKMTkrpea59k7z76cPToR-PPyt0orbpDSf4AUoeRM36QoQ3kF5tIZzCR6ONdC6Ocs5z62qOKsmx3ZZ1vNRp4-e4jMsqVhBAExvfG/s1600-h/Restclient1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS58pquNpp_Y7ZEFIGH4GYKD0M6-ECHQBkfcH4Q3CVAKMTkrpea59k7z76cPToR-PPyt0orbpDSf4AUoeRM36QoQ3kF5tIZzCR6ONdC6Ocs5z62qOKsmx3ZZ1vNRp4-e4jMsqVhBAExvfG/s320/Restclient1.jpg" /></a><br />
</div><div style="text-align: center;"><imagem 5=""> <span style="font-size: x-small;"><b>Figura 05 - Retorno do serviço RESTful cujo retorno é uma classe JAXB.</b></span></imagem><br />
</div><br />
<pre class="java" name="code"> @PUT
@Consumes("application/xml")
@Path("/NetFeijao/")
public void putPessoa(PessoaBinding pessoa) {
// Operação de update
} </pre><span style="font-size: x-small;"><b>Listagem 06 - Convertendo código XML para objeto JAXB em chamada PUT com REST.</b></span><br />
<br />
<br />
<br />
<b>Referências:</b><br />
<ul><li><a href="http://java.sun.com/developer/technicalArticles/WebServices/jaxb/" target="_blank"></a></li>
<li>Site Oficial no java.net. - <a href="https://jaxb.dev.java.net/" target="_blank">https://jaxb.dev.java.net/</a><br />
</li>
<li><a href="http://java.sun.com/developer/technicalArticles/WebServices/jaxb/" target="_blank">Java Architectura for XML Binding</a> - Tutorial do site da Sun.<br />
</li>
</ul><br />
<div style="text-align: center;"><span style="font-size: large;"><b>JAKARTA COMMONS - HTTP CLIENT</b></span><br />
</div><br />
HttpClient é um subprojeto open source da Jakarta Commons que se tornou independente em 2007, e que foi concebido para facilitar o desenvolvimento de aplicações que utilizam o protocolo HTTP. <br />
Ele é um projeto escrito totalmente em Java, e implementa todos os métodos HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS e TRACE).<br />
<br />
Possui suporte ao protocolo HTTPS, suporte ao gerenciamento de conexões para uso em aplicações multi-thread, suporte a cookie, possui mecanismos de autenticação Basic, Digest e criptografia NTLM.<br />
<br />
Na <b>listagem 07</b>, demonstramos o uso da biblioteca HttpClient, onde consumimos dois serviços RESTful, um com uma chamada GET e outra com uma chamada PUT.<br />
<br />
<pre class="java" name="code"> public void testHTTPClient() {
try {
HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager());
client.getHttpConnectionManager().getParams().setConnectionTimeout(30000);
final String CONTENT_TYPE = "application/xml";
final String CHARSET = "UTF8";
/* Executando chamada com método HTTP GET */
String getURI = "http://localhost:8080/ProjetoREST/NetFeijao/autores/Wagner/?idade=29";
GetMethod get = new GetMethod(getURI);
Header meuHeader = new Header("CPF","123456789");
get.setRequestHeader(meuHeader);
int statusCodeGET = client.executeMethod(get);
String responseBody = get.getResponseBodyAsString();
System.out.println("Chamada GET");
System.out.println(" Status Code: "+statusCodeGET+" \nResponse Body:\n"+responseBody);
/* Executando chamada com método HTTP PUT */
String putURI = "http://localhost:8080/ProjetoREST/NetFeijao/autores/update/";
PutMethod put = new PutMethod(putURI);
StringRequestEntity requestEntity = new StringRequestEntity(responseBody, CONTENT_TYPE, CHARSET);
put.setRequestEntity(requestEntity);
int statusCodePUT = client.executeMethod(put);
responseBody = put.getResponseBodyAsString();
System.out.println("Chamada PUT");
System.out.println(" Status Code: "+statusCodePUT+" \nResponse Body:\n"+responseBody);
} catch (Exception ex) {/* OMITIDO */}
}</pre>Retorno da chamada ao método.<br />
Chamada GET<br />
Status Code: 200 <br />
Response Body:<br />
<br />
<pessoa num_cpf="123456789"><br />
<nome>Wagner</nome><br />
<idade>29</idade><br />
<statuscivil>Casado</statuscivil><br />
</pessoa><br />
<br />
Chamada PUT<br />
Status Code: 202 <br />
Response Body:<br />
<h1 style="font-weight: normal;"><span style="font-size: small;">Bem vindo Wagner</span></h1><br />
<span style="font-size: x-small;"><b>Listagem 07: Consumindo serviços REST via GET e PUT com HTTPClient.</b></span><br />
<br />
Primeiro, na linha 3 instanciamos a classe HttpClient que é o nosso agente HTTP que irá conter os atributos de persistência com cookies, e credenciais de autenticação através da classe HttpState. E também onde será armazenado uma ou mais conexões HTTP, cujo qual faremos chamadas aos métodos HTTP.<br />
<br />
Na linha 4 atribuímos um timeout para a conexão de 30 segundos. Depois nas linhas 5, 6 e 9 declaramos as variáveis quer irão determinar o tipo de conteúdo, o character set e a URI de acesso ao serviço REST.<br />
<br />
Na linha 10, instanciamos a classe GetMethod, que como o próprio nome indica representa o método GET, passando como parâmetro a URL do nosso serviço RESTful (getURI). Na linha 11 criamos um objeto Header, passando como parâmetro no construtor a chave e o valor que representam o parâmetro e o valor do cabeçalho, no nosso exemplo, passamos um número fictício de CPF. Na linha 12 atribuímos o objeto header para o objeto GetMethod.<br />
<br />
Na linha 13, fazemos a chamada ao serviço RESTful via HTTP GET, e armazenamos o código de status do retorno na variável statusCodeGET, na linha 14 extraímos os dados da Response como String para a variável responseBody. Pelo fato do retorno ser em XML, poderíamos facilmente utilizar JAXB para trabalhar o retorno como um objeto Java. Finalmente nas linhas 15 e 16 imprimimos no console o retorno da chamada a estes métodos.<br />
<br />
A partir da linha 18, iniciamos o mesmo processo, mas agora para efetuar uma chamada via método PUT, as únicas diferenças, são o uso do método PutMethod, que implementa o método HTTP PUT e o uso da classe StringRequestEntity na linha 21, com esta classe atribuímos uma entidade como String ao método PUT que será enviado junto a requisição.<br />
<br />
Nas linhas 25 e 26 imprimimos o retorno da requisição PUT.<br />
<br />
<div style="text-align: center;"><div style="text-align: center;"><span style="font-size: large;"><b>JavaScript:</b></span><br />
</div><span style="font-size: large;"> </span><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br />
</div><div style="text-align: justify;"><br />
</div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDw1SmWUcKGgL-6oSn77nle7jbvoB6olKmJEHd7nVnEyv1fQHjoYOg7bbrnvYx6AbwXd8STVEDL5op0oOYRZ4Q0H7aXZipJEKSdtpfwxYDZ8C8e51irzs-1mQoNPtTVp1AP31Os_uE5WQQ/s1600/ajax.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDw1SmWUcKGgL-6oSn77nle7jbvoB6olKmJEHd7nVnEyv1fQHjoYOg7bbrnvYx6AbwXd8STVEDL5op0oOYRZ4Q0H7aXZipJEKSdtpfwxYDZ8C8e51irzs-1mQoNPtTVp1AP31Os_uE5WQQ/s200/ajax.jpg" /></a> Graças ao objeto XMLHttpRequest conseguimos nos comunicar com servidores de forma assíncrona, desde então temos todas as vantagens do AJAX ao nosso dispor. Para quem desenvolve interfaces WEB, este recurso resolveu grandes problemas no lado do cliente, mas vale lembrar que JavaScript não é Java, não possui threads, nem tipos, e possui uma grande gama de frameworks Ajax, como por exemplo Prototype, JQuery, Dojo, Script.aculo.us, Ext-JS, entre outros.<br />
<br />
Na <b>listagem 08</b>, temos um exemplo de uma função em JavaScript que consume um serviço RESTful cujo retorno é um XML.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br />
</div><pre class="js" name="code">var xmlHttp;
function showCustomer(str){
xmlHttp=GetXmlHttpObject(); // omitido código do método0
if (xmlHttp==null) {
alert ("Your browser does not support AJAX!");
return;
}
var url='http://localhost:8080/Contatos/resources/customers/58/';
xmlHttp.onreadystatechange=stateChanged;
xmlHttp.open('GET',url,true);
xmlHttp.send(null);
}
function stateChanged() {
if (xmlHttp.readyState==4){
var xmlDoc=xmlHttp.responseXML.documentElement;
document.getElementById("nome").innerHTML=
xmlDoc.getElementsByTagName("name")[0].childNodes[0].nodeValue;
}
}
</pre><span style="font-size: x-small;"><b>Listagem 08 - Consumindo um serviço RESTful (retorno XML) com Ajax.</b></span><br />
<br />
Na <b>listagem 08</b>, vimos um exemplo de um serviço que retorna XML, mas uma das grandes vantagens dos serviços REST, é que podemos trabalhar com diversos formatos para troca de informação de um mesmo recurso. Entre eles JSON.<br />
<br />
<div style="text-align: center;"><span style="font-size: large;"><b>jQuery</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkvCMbDpgO85zzsfi2Iz2i9CKe13U90LIV_TwRcmUGwZYsOQH-UvZo7t4YNgyYj5ftuWKtJKNbmT-Yb6VQxlmESkwCH-mudNDpYELF1Xt2OSxARjZGuG6ur9GdJUMuSbbQ7_vDh-d9dEZK/s1600-h/jquery-logo.thumbnail.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkvCMbDpgO85zzsfi2Iz2i9CKe13U90LIV_TwRcmUGwZYsOQH-UvZo7t4YNgyYj5ftuWKtJKNbmT-Yb6VQxlmESkwCH-mudNDpYELF1Xt2OSxARjZGuG6ur9GdJUMuSbbQ7_vDh-d9dEZK/s320/jquery-logo.thumbnail.gif" /></a><br />
</div><div style="text-align: left;"><span style="font-size: large;"><b> </b></span><br />
</div></div>JQuery é uma biblioteca JavaScript que vem chamando atenção por conta de sua facilidade de desenvolvimento, ela simplifica muito a manipulação dos elementos de um documento HTML, o tratamento de eventos e as interações Ajax para prover um desenvolvimento rápido de aplicações web, livrando o desenvolvedor de preocupações relacionadas a compatibilidade de navegadores e aderência a CSS.<br />
<br />
A biblioteca jQuery fornece algumas funções para tratamento de requisições Ajax, ideais para o consumo de serviços REST, que reduzem muito a complexidade e a quantidade de linhas necessárias para consumir um serviço REST. Com a função $.ajax() do jQuery, conseguimos um alto nível de controle nas requisições ajax. <br />
<br />
A sintaxe do comando é $.ajax(options), onde o parâmetro options são as propriedades que passamos para controlar como a requisição é feita e retorno da chamada.<br />
Na <b>listagem 09</b>, demonstramos o uso das funções $.ajax().<br />
<pre class="js" name="code">$.ajax({
type: ‘DELETE’,
url: "http://localhost:8080/ProjetREST/NetFeijao/autores/"+idAutor+"/",
success: function(msg){
$("#alert").html(msg);
}
});
</pre><b><span style="font-size: x-small;">Listagem 09 - Consumindo um serviço REST com a função $.ajax(). </span></b><br />
<br />
Na <b>listagem 09</b>, usamos dois parâmetros na função $.ajax(), o parâmetro type para indicar o método HTTP que queremos executar e a url de chamada. <br />
<br />
Para tratar tipos de retorno JSON, o jQuery oferece a função $.getJSON(), utilizada para carregar dados JSON mediante uma requisição HTTP GET.<br />
<br />
Na <b>listagem 10</b> mostramos um exemplo de uso da função $.getJSON() em um serviço REST do Flickr, nós fazemos uma chamada ao serviço REST e passamos o retorno da chamada ao método de callback. Dentro da função de callback criamos a tag passando como valor o endereço da foto retornada pelo serviço REST e a incluímos na div #foto. Note que a variável data, é um map chave-valor dos dados retornados pela função REST.<br />
<pre class="js" name="code">$.getJSON("http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos& photoset_id=72157614488723406&format=json&jsoncallback=?",
function(data){
$.each(data.photoset.photo, function(i,item){
if (item.title == foto){
$("").attr("src", "http://farm"+item.farm+".static.flickr.com/"+item.server+"/"+item.id+"_"+item.secret+"_m.jpg").appendTo("#foto");
}
});
});
</pre><span style="font-size: x-small;"><b>Listagem 10 - Uso da função $.getJSON para consumo de dados no formato JSON.</b></span><br />
<br />
É isso aí, consumir serviços REST é diversão garantida !!! E a todos um Feliz Ano Novo repleto de código \o/ !!!Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com1tag:blogger.com,1999:blog-544668644670311424.post-44883359786978703862009-12-21T13:10:00.004-02:002009-12-21T13:14:44.064-02:00Java Magazine 73 - Portais Corporativos<div class="separator" style="clear: both; text-align: center;"><a href="#" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrPXJYVubbiMT-Cy1UWKo7K9zLSV5Bo_6ZqxwCs2Ah2AnYMgCHNlo-f0BjU38Mp3GM0dIlXAjHnXGD6s2y5QoAw58QpubaUKutFSMFj5pshVyp_tYdHphtj_gdzjNO2YXzqRMbVqIIxXdh/s320/capaOnline_73.jpg" /></a><br />
</div><div style="text-align: justify;">No mês de Novembro, publiquei um artigo na revista <a href="http://www.devmedia.com.br/assgold/listmag.asp?site=6">Java Magazine</a>, fazia um tempo que não escrevia por conta de um projeto que estou tocando.<br />
</div><br />
<div style="text-align: justify;">O tema do artigo é "<b>Portais Corporativos</b>", Neste artigo é apresentado na teoria e na prática os fundamentos do desenvolvimento de portlets em portais corporativos e a importância de Portais no contexto de SOA (com a colaboração de meu amigo Marcelo Zanatto, que falou sobre SOA e Integração com Portais). Como é de costume, o artigo é bem longo e entra a fundo nas tecnologias envolvidas na construção de um grande portal, como as JSRs 168/286, que contemplam a criação e o ciclo de vida de um portlet. É explicado também como definir WSRPs, que são os web services para portlets remotos, e como converter uma aplicação JSF para um portlet com o uso do Portlet Bridge.<br />
</div><br />
<div style="text-align: justify;">Como demo, utilizei o NetBeans para montar e configurar um ambiente para o desenvolvimento de portlets utilizando o Contêiner de Portlets, o pacote WSRP, e a biblioteca JSF/Portlet Bridge do projeto livre OpenPortal junto ao servidor de aplicações Glassfish V2.<br />
</div><br />
<br />
<div style="text-align: justify;">Nesta edição, ainda são apresentados os seguintes artigos.<br />
</div><ul style="text-align: justify;"><li>JavaOne 2009: Java + Community = Powerful</li>
<li>Desenvolvendo com JavaServer Faces</li>
<li><b>Portais Corporativos</b></li>
<li>Desenvolvendo com Hibernate</li>
<li>Spring-WS de ponta a ponta</li>
<li>O diferencial Scrum</li>
</ul><div style="text-align: justify;">Diversão Garantida!!<br />
</div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-46279841115235892022009-10-14T17:53:00.002-03:002012-01-13T18:31:24.742-02:00Perguntas Frequentes sobre AgilidadeEm Julho deste ano, <a href="http://www.globalcode.com.br/site/noticias/painel.seam?chave=MinicursoScrum" target="_blank">após o mini-curso que dei</a> na <a href="http://www.globalcode.com.br/" target="_blank">Globalcode </a>sobre Scrum + XP, uma das pessoas presentes, meu amigo <a href="http://orlandojunior.com.br/" target="_blank">Orlando</a>, anotou diversas perguntas sobre Agilidade no formato de entrevista e pediu que eu respondesse por email. <br />
Segue abaixo algumas perguntas que achei interessante, e resolvi publicá-las aqui no blog.<br />
<br />
<h3>
O que é ser ágil nos dias de hoje?<br />
</h3>
Acho que ser ágil nos dias de hoje é saber aproveitar as oportunidades de inovação no seu ambiente de trabalho, percebo que a maioria das pessoas acabam ficando acostumadas com a rotina de seus afazeres e perdem chances de inovar.<br />
Quando digo inovar, digo que existem várias maneiras de você introduzir no seu dia a dia práticas ágeis. Outro ponto importante em ambiente ágeis é a comunicação, para ser ágil a pessoa saber lidar com pessoas, com o cliente, e ter um relacionamento de parceria, não pode ter medo de se expor e ser comprometido.<br />
Comprometido não é trabalhar 250 horas por mês no projeto, é saber assumir responsabilidades e saber responder por elas, não ter vergonha de pedir ajuda na hora de uma dificuldade. É velha a história do porco e da galinha =).<br />
<br />
<br />
<h3>
Quais os pontos fracos das metodologias ágeis?<br />
</h3>
O que vejo como um ponto fraco em metodologias ágeis, pela sua própria natureza lean, ou seja, enxuta. É que fica um pouco difícil a sua adoção em ambientes que haja modelos de governança de TI como o Cobit, por exemplo. É difícil em um ambiente de Governança "certificado", você justificar para o gerenciamento de projeto o uso apenas de quadros e post-its, entende? Isso eu digo principalmente com Scrum e XP.<br />
Neste tipo de cenário, a empresa tende a escolher modelos híbridos baseados no PMBook e RUP. O que no final acabam se tornando processos altamente burocráticos em cascata.<br />
Por isso, que acho que esse é um campo que tem muito a ser explorado, trabalhei cerca de 2 a 3 com RUP, e uma escolha mal feita nos artefatos de projeto acaba comprometendo e muito o rendimento da equipe<br />
Outro ponto fraco é o próprio agilista, que tende a pensar que é o dono da razão, pois a verdade é que <a href="http://en.wikipedia.org/wiki/Barry_Boehm">Barry Boehm</a> já falava da importância dos <a href="http://en.wikipedia.org/wiki/Iterative_development">métodos iterativos</a> ( <a href="http://en.wikipedia.org/wiki/Spiral_model">que vieram bem antes do movimento ágil</a> ).<br />
<br />
<h3>
Quando não usar?</h3>
Bem, independente do lugar que você esteja é muito importante praticar, aplicar os valores do Manifesto Ágil.<br />
Eu não consigo enxergar o uso de métodos ágeis em projetos de implantação de ERP (pacote comprado), principalmente quando a implantação é feita em grandes empresas com diversas filiais. Geralmente, as empresas fornecedoras deste tipo de software já possuem métodos próprios.<br />
Outra ponto, é se a sua empresa desenvolve software e seu cliente esta feliz, o desenvolvedor esta feliz, os projetos estão sendo entregues no prazo, o ROI esta dentro das expectativas, o Time-to-market do seu produto é baixo e a equipe é produtiva, se neste cenário você já não estiver usando ágil, fique onde está.<br />
Se o seu processo de desenvolvimento esta atendendo plenamente você e seus clientes, então não mude. Você já esta no caminho certo.<br />
<br />
<h3>
O que mais dificulta a implantação de uma metodologia ágil numa empresa atualmente?</h3>
Com certeza o que dificulta a implantação de métodos ágeis nas empresas é a própria filosofia de desenvolvimento da empresa. Por requerer uma mudança radical na forma de lidar com o desenvolvimento de software, é difícil alcançar uma plenitude na implementação de métodos ágeis e isto pode afetar sua adoção, é difícil as pessoas envolvidas na definição de processos da empresa admitirem que estavam fazendo algo que é não muito produtivo, e que a maneira que elas desenvolvendo software não é a melhor.<br />
Outros pontos que dificultam a implantação de métodos ágeis, ainda alinhado ao primeiro item é a falta de um sponsor, como um diretor, ou outro cargo executivo, se agile não está "vendido" para a alta cúpula da empresa, então pode haver muita resistência por conta da própria TI.<br />
E por fim, a falta de comprometimento da equipe e a falta de conhecimento em métodos ágeis podem dificultar também a implantação.<br />
<br />
<h3>
Só serve para projetos? E a manutenção do sistema?</h3>
Agile proporciona um leque bem variado de métodos, entre eles FDD, Scrum, XP, Lean, Crystal, entre outros. Eu diria que os dois caminham juntos, a questão gira em torno de como você irá administrar e classificar os itens em seu backlog.<br />
A partir do momento que um release do seu produto entra em produção, é natural que novas demandas e até bugs apareçam. Tem empresas que separam equipes para atuar somente em projetos de manutenção e outras equipes para trabalhar somente em projetos de evolução, depende tudo de como o trabalho é priorizado.<br />
Para áreas de serviço, como Infraestrutura, onde a atuação das equipes geralmente é feita sob demanda, é recomendado o uso de quadros Kanban, inclusive atualmente estou fazendo um trabalho neste sentido (Quadros Kanban para áreas de Infraestrutura).<br />
<br />
<h3>
E a arquitetura do sistema, como fica?</h3>
Essa é uma questão polêmica e que gera muitas dúvidas para quem está iniciando no mundo ágil, principalmente para as pessoas que estão em transição de um método como o Waterfall para o Ágil.<br />
Quando o time de desenvolvimento vem do Waterfall ou até mesmo do RUP, que é um método que descreve os artefatos necessários para se documentar a arquitetura do projeto e propõe um modelo "big design up front", ou seja, força o time tentar imaginar e fechar todos os modelos no inicio da execução do projeto.<br />
Em processos ágeis isso acontece de forma natural e evolutiva, uma das práticas do XP, o "Simple Design" ou "Design Simples" nos diz para mantermos o nosso design o mais limpo e simples possível, e não tentar imaginar funcionalidades que o sistema possa vir a ter, e preparar o sistema para estes prováveis cenários. Isso foge completamente do modelo ágil de gerir projetos.<br />
Independente do modelo que você segue, o seu sistema obviamente será construída baseada em uma arquitetura, e em toda metodologia é muito importante você fazer o planejamento da sua arquitetura, a diferença é que em métodos ágeis devemos sempre respeitar a maturidade atual do projeto de modo que quando houver mudanças ou adição de novos requisitos do negócio, fique fácil refatorar o sistema, levando sempre em consideração os requisitos de qualidade de serviço (QoS) conhecidos por todo arquiteto,<br />
<br />
<h3>
Como fica o contrato? Não há prejuízos para a produtora, uma vez que o cliente altere constantemente o que foi inicialmente solicitado?</h3>
Acredito que não, um dos valores do manifesto ágil diz que a colaboração com o cliente é mais importante do que a negociação de contratos, por que isso? Se olharmos para a maneira como as empresas negociam os contratos de software com as consultorias, veremos que esta é uma eterna luta. Porque as empresas adotam o modelo de "Preço Fixo" e para uma consultoria entrar em uma empresa, ao formular uma RFP ela acaba colocando valores que muitas vezes ela mesma sabe que pode tomar um prejuízo, mas o faz para ganhar o cliente.<br />
Este tipo de contrato é ruim, pois passa a maior parte do risco para o desenvolvedor, se o projeto atrasa, o consultor arca com os custos, o que dificulta (e muito) mudanças de escopo.<br />
Um modelo de contrato que achei muito interessante é o modelo "Money for Nothing, Changes for free" proposto por Peter Stevens em <a href="http://agilesoftwaredevelopment.com/blog/peterstev/10-agile-contracts#MFN-cff">http://agilesoftwaredevelopment.com/blog/peterstev/10-agile-contracts#MFN-cff</a>.<br />
<br />
<h3>
Qual o maior benefício (a longo ou curto prazo) que um funcionário (desenvolvedor, tester, analista, etc.) obtém quando se compromete a seguir uma proposta ágil?</h3>
Desenvolvedores geralmente gostam de agile, porque os métodos são voltados para times auto-gerenciáveis. Modelos ágeis dão uma liberdade maior aos membros do time, então acho que o maior benefício é o próprio bem-estar do time. Sem falar dos ganhos da empresa como a melhoria contínua da qualidade, redução do risco de entrega e do time to market, aumento da visibilidade do projeto, entre outros.<br />
<br />
<h3>
Como ser um Scrum Master?</h3>
Na minha visão, para ser um Scrum Master é preciso antes de tudo saber lidar com pessoas, isso é fundamental, além disso, precisa ser uma pessoa comprometida e responsável, que entenda os requisitos do negócio e as necessidades do time.<br />
Tem que ser uma pessoa humilde, e que saiba influenciar a equipe de maneira positiva, com uma cultura de colaboração.<br />
<br />
<h3>
Como as empresas do Brasil estão aceitando a XP?</h3>
Hoje em dia é moda falar de Agilidade no Brasil, principalmente no meio dos desenvolvedores. O que vejo é que é um assunto muito falado, mas pouco aplicado.<br />
XP tem sido assunto em roda de conversa de desenvolvedores durante muitos anos, e o que acaba sendo feito neste sentido são movimentos individuais de desenvolvedores que aplicam algumas práticas do XP de maneira isolada, principalmente TDD.<br />
Com o advento e a popularidade do SCRUM, pessoas de outras esferas nas empresas estão começando a olhar agile de maneira diferente, e tem havido uma grande aceitação neste sentido, então acho que isso tem sido bom para XP também.<br />
<br />
<h3>
Dê algumas dicas de boas práticas àqueles que estão iniciando (estagiários e estudantes).</h3>
A melhor dica que posso dar é a mesma que dou em minhas apresentações quando sou indagado. Que é estudar, e tentar se manter bem informado sobre o que está acontecendo no mercado. É impressionante o que você consegue fazer com os feeds dos websites, busque os melhores sites e agregue-os em ferramentas como o Google Reader ou outro leitor de feed qualquer, isso potencializa muito o conhecimento.<br />
Participe de lista de discussões, veja cases de implantação tanto de sucesso quando de insucesso e buscar ler o máximo que puder sobre o assunto.<br />
<br />
<h3>
Finalize com uma mensagem para aqueles que estão interessados, mas ainda são céticos.</h3>
Faça uma prova de conceito, e se possível procure implementar ao menos uma prática ágil. Uma dica que dou é sempre que possível, traga o cliente para o lado do desenvolvimento, se você puder fazer com que seu cliente avalie o produto que você está desenvolvendo semanalmente ou até de 15 em 15 dias, você irá começar a ver os ganhos do desenvolvimento ágil.<br />
Ou ainda, vou ir totalmente contra o que acabei de falar, sempre que olhar para o seu processo atual de desenvolvimento, antes de tentar adicionar qualquer prática ou passo novo (menos a que citei sobre o cliente), exclua uma etapa do seu processo. Monte um gráfico de cadeia de valor dos seus processos, e analise o que você pode excluir de passos do seu processo. Se você fizer isso, você já está no caminho de se tornar um grande agilista!<br />Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-90702558303315051862009-10-13T14:14:00.005-03:002009-10-14T10:23:19.489-03:00The Developers Conference 2009 - Here we Go !!!<div class="separator" style="clear: both; text-align: center;"><a href="http://www.thedevelopersconference.com.br/tdc/2009/index.seam" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjxe0-JSorqHcrS5TarracaM-R2yNICtw4Joal9HXE7KaOTtlTLnExj3IVLTxXz6YAPx7hL7Gug6FdY0jGGg8ed-CkitTmU-XnFdN84iwBmnn6R9vyUfVoxm_2qt1Jluc0w_hECW-93rol/s400/tdc2009-01.jpg" /></a><br />
</div><br />
Está chegando mais uma edição do <a href="http://www.thedevelopersconference.com.br/tdc/2009/index.seam">The Developers Conference 2009</a>, que promete ser um dos eventos mais importantes de Java do Brasil. O evento é organizado pela <a href="http://www.globalcode.com.br/">Globalcode</a>.<br />
Afinal, não é todo os dias que temos a oportunidade de conhecer caras importantes como Rod Johnson, certo !!<br />
<br />
A programação do evento já foi liberada, com uma novidade bem agradável, que são as <a href="http://en.wikipedia.org/wiki/Lightning_Talk">Lightning Talks</a>.<br />
<br />
<div style="text-align: left;">Nos encontramos lá !!!<br />
</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.thedevelopersconference.com.br/tdc/2009/sp/palestrantes.seam" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_f4DSiegtKYU99qvEXRUMkG2z1AZ-9V4YWhCuWB7wwYMHO0XkrzJw1_dN3vaMsxbLIW2RU8mIBOepML4xxWtXHR_2Ne6ZQWpZvnhhyphenhyphenD9J7u-op1vAmwydnPVwdhoHQdwuhaqHCGsOoaNN/s400/tdc2009-02.jpg" /></a><br />
</div><br />
<br />
<i>A 3ª edição do The Developer’s Conference 2009, maior evento Java do país, contará com a participação de Chris Schalk, Developer Advocate do Google, trabalha atualmente no time de Google App Engine, plataforma de Computação em Nuvem do Google, além dos principais nomes da comunidade Java mundial: Ed Burns, Rod Johnson e Mike Keith. O evento acontecerá nas cidades de São Paulo (SP), nos dias 6 e 7 de novembro, em Florianópolis (SC) no dia 09 de novembro e no Rio de Janeiro (RJ) em 11 de novembro.</i><br />
<ul><li><i>Haverá tradução simultânea em todas as etapas do evento;</i></li>
<li><i>Serão emitidos certificados de participação;</i></li>
<li><i>Inscrições antecipadas com desconto especial;</i></li>
<li><i>Inscrições corporativas e caravanas.</i></li>
</ul><br />
Diversão Garantida!!!<i><br />
</i>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com3tag:blogger.com,1999:blog-544668644670311424.post-85162158827754063802009-10-05T18:41:00.003-03:002009-10-05T18:44:22.418-03:00[Just Java 2009] De Web Services RESTful a aplicações MashupNos dias 15 a 17 de Outubro, aconteceu no Centro de Convenções do Senac de Santo Amaro, mais uma edição do <a href="http://www.sucesusp.org.br/eventos2009/justjava/">Just Java</a>. E como sempre, esta foi uma ótima oportunidade para aprender novas tecnologias e fazer aquele Network.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuL3PKot9Ovox9GZz15FjAVVycfrFVNwN9aSE_W6PPrSqDGJRraMtatGm_1L5vmVS8E4t7pAI2cmKfPEphy7z-Xhlp8Tq9gpktwiJ_29kqaMqwKiQK5r4PBMIWxxpZDe5IYobiIaEPN01X/s1600-h/palestra.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuL3PKot9Ovox9GZz15FjAVVycfrFVNwN9aSE_W6PPrSqDGJRraMtatGm_1L5vmVS8E4t7pAI2cmKfPEphy7z-Xhlp8Tq9gpktwiJ_29kqaMqwKiQK5r4PBMIWxxpZDe5IYobiIaEPN01X/s320/palestra.jpg" /></a><br />
</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Apresentei no auditório principal, a palestra <i>"<b>De Web Services RESTFul a aplicações Mashups</b>"</i>, onde pude abordar os conceitos de REST proposto pelo Dr. Roy Fielding, passando pela especificação JAX-RS, que define API para criação de Web Services, demonstrando várias maneiras de consumir e testar serviços REST, até chegar ao mundo dos Mashups, apresentando várias ferramentas com exemplos de uso .<br />
</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Por fim foi apresentado uma demo, que infelizmente por falta de acesso a internet, não pude apresentar em sua plenitude =(.<br />
</div><div class="separator" style="clear: both; text-align: left;">Para ver o restante da programação e baixar as apresentações que rolaram no evento, acesse este link.<br />
</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><a href="http://www.sucesusp.org.br/mailing2009/congresso/justjava/apresentacoes/apresentacoes_justjava2009.html">Congresso JustJava 2009 - 15 a 17 de Setembro - Apresentações</a> <br />
</div><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvcGdRrVId8ePaRbr-vtdVxfnWNBfGDXIImRFfTMw_sc5apAK5e1L9Yt7Vbmho6T9pKrIoHdi-7KXJT042cTLSbpbkFvkBRubV-Qf5GNM4WqxXsipzmFlqtlD6Sdy7RcwBxhFqXeqlFH-_/s1600-h/palestra2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvcGdRrVId8ePaRbr-vtdVxfnWNBfGDXIImRFfTMw_sc5apAK5e1L9Yt7Vbmho6T9pKrIoHdi-7KXJT042cTLSbpbkFvkBRubV-Qf5GNM4WqxXsipzmFlqtlD6Sdy7RcwBxhFqXeqlFH-_/s320/palestra2.jpg" /></a><br />
</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><br />
<br />
<b>Fotos:</b> Crédito de Eduardo Quagliato -<b>Link:</b> <a href="http://www.flickr.com/photos/duhhquagliato/3934446367/in/set-72157622411956582/">JustJava 2009 no Flickr – Compartilhamento de fotos!</a> <br />
<div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Segue abaixo a apresentação. <br />
</div><div style="width:425px;text-align:left" id="__ss_2099807"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/wrsantos/de-web-services-restful-a-aplicaes-mashup" title="De Web Services RESTful a Aplicações Mashup">De Web Services RESTful a Aplicações Mashup</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dewebservicesrestful-090930165447-phpapp01&stripped_title=de-web-services-restful-a-aplicaes-mashup" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dewebservicesrestful-090930165447-phpapp01&stripped_title=de-web-services-restful-a-aplicaes-mashup" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/wrsantos">wrsantos</a>.</div></div><div class="separator" style="clear: both; text-align: left;"> Diversão Garantida !!!<br />
</div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-44509445384199838422009-09-10T11:38:00.004-03:002009-09-10T11:40:50.096-03:00Widget SOUJava<div class="separator" style="clear: both; text-align: center;"><a href="http://www.soujava.org.br/display/v/Widget+SOUJava" target="_blank"><br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4fJxnluJRwJRmlugiTAJTO1wwoSjmCHn5FoGabFStAcMQSy_d20tWBINguNAQjwEeFPuBEOoNpDqg3c-NPDKlIX11ykgAqpiMbjK8fve9o3QeIUbFc-LqjngZiDEzhagK8JPMZaYkZTlV/s320/SOUJava-NeedsYou.jpg" /></a></div><br />
Já faz um tempo, que venho colaborando com o SOUJava, um dos maiores grupos de usuários Java no mundo, sem fins lucrativos. Após pequenas contribuições apresentando algumas palestras (localização, NetBeans Platform), nos últimos tempos tenho tido o privilégio de participar mais efetivamente com o grupo, que conta com a presença de pessoas como Bruno Souza, Mauricio Leal, Yara Senger, Mr. M, Fabio Velloso entre outros.<br />
<br />
E uma das contribuições, junto com o grupo foi justamente na criação de um widget web para divulgação de eventos, notícias, reuniões para o SOUJava.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://zembly.com/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" height="73" src="http://upload.wikimedia.org/wikipedia/commons/c/c6/Zembly-small.png" width="200" /></a></div><br />
Esse widget foi desenvolvido utilizando o <a href="https://zembly.com/">Zembly</a>, para quem não conhece, o Zembly é um ambiente de desenvolvimento no Browser criado pela <a href="http://en.wikipedia.org/wiki/Sun_Microsystems">Sun Microsystems</a>, que permite um conceito novo chamado de programação social, muito similar a um Wiki. Com Zembly podemos criar aplicações para redes sociais como <a href="http://en.wikipedia.org/wiki/Facebook" title="Facebook">Facebook</a>, <a href="http://en.wikipedia.org/wiki/Meebo" title="Meebo">Meebo</a>, <a href="http://en.wikipedia.org/wiki/OpenSocial" title="OpenSocial">OpenSocial</a>, aplicações web para o iPhone e outras plataformas sociais. E claro, permite criar <a class="mw-redirect" href="http://en.wikipedia.org/wiki/Web_widgets" title="Web widgets">web widgets</a>. <br />
<br />
O widget que criamos (vide abaixo) é separado em cinco tabs, onde dispomos informações referentes aos eventos, reuniões, uma das abas (Notícias) é uma integração com o nosso feed. Periodicamente vamos atualizar o conteúdo do widget, sempre que surgir novidades.<br />
<br />
O melhor disso tudo, é que VOCÊ desenvolvedor brasileiro, que possui algum site ou blog de tecnologia agora pode nos ajudar a divulgar os eventos promovidos pelo SOUJava e notícias do mundo Java, embutindo o widget em seu site, blog ou fórum. <br />
<br />
Para divulgar nossos eventos é muito fácil, apenas copie o código javascript abaixo e inclua em seu blog ou site.<br />
<script type="text/javascript">
function SelectAll(id)
{
document.getElementById(id).focus();
document.getElementById(id).select();
}
</script><br />
<textarea cols="80" id="txtfld" onclick="SelectAll('txtfld');" rows="2" type="text"> <!-- Inicio Widget --><br /> <script type="text/javascript" src="http://widgets.clearspring.com/o/4a9c57d510343a2e/4a9c57dbabfa3bd9/4a9c57d510343a2e/dee11f21/widget.js" ></script><br /> <!-- Fim Widget --><br /> </textarea><br />
Segue abaixo, o widget em ação.<br />
<center><script src="http://widgets.clearspring.com/o/4a9c57d510343a2e/4a9c57dbabfa3bd9/4a9c57d510343a2e/dee11f21/widget.js" type="text/javascript">
</script></center><br />
Diversão Garantida!!!Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com2tag:blogger.com,1999:blog-544668644670311424.post-58577124768325286162009-09-10T11:38:00.003-03:002009-09-10T11:40:38.537-03:00Entrevista para a GlobalcodeNo mês de Junho, foi publicado uma entrevista minha para meus caros amigos da <a href="http://www.globalcode.com.br/">Globalcode</a>, sobre carreira e oportunidades, para quem não viu vale a pena conferir. Segue abaixo as perguntas que estão disponíveis no próprio site da Globalcode. Para quiser ver o link da entrevista, <a href="http://www.globalcode.com.br/site/noticias/painel.seam?chave=EntrevistaWagner">clique aqui</a>.<br />
<h3>1. Poderia nos contar como começou a desenvolver plugins para o Netbeans ?<br />
</h3><p>Comecei a desenvolver plugins através do "Desafio NetBeans", um campeonato de desenvolvimento de plugins para o NetBeans patrocinado pela Globalcode, Sun e o SOUJava, me lembro que antes de iniciar o campeonato participei de alguns minicursos gratuitos promovido pela Globalcode, contando inclusive com a participação de dois desenvolvedores do NetBeans (Tim Boudreau e Charlie Hunt).<br />
Neste campeonato desenvolvi meu primeiro plugin para o Netbeans, mais especificamente um plugin para o Hibernate, onde a partir de tabelas selecionadas de um Banco de Dados, o plugin gera as entidades de persistência, o arquivo de configuração, com suporte a xDoclet (na época não havia annotations). Neste primeiro contato com a plataforma NetBeans tive a oportunidade de aprender várias coisas legais que me motivaram a continuar o aprendizado.<br />
</p><h3>2. Desde então, quais plugins você já desenvolveu?<br />
</h3><p>O segundo plugin que desenvolvi foi o módulo CodeGen, um plugin para sobrescrever os métodos equals() e hashcode() que na época (NetBeans 5.0) não existia no NetBeans, e existia no Eclipse. Existe até uma história engraçada por trás disso, me lembro de estar em um minicurso em que o Vinicius comentou que abria o Eclipse apenas para utilizar a função do equals e hashcode, o que me motivou a criar este projeto =D.<br />
Depois desenvolvi alguns plugins corporativos, e depois de um tempo, a pedido do meu amigo Renato Bellia, criei o plugin Diamond Powder for NetBeans. No evento Yahoo Open Hack Day desenvolvi junto com o time Globalcode o plugin Blueprints Yahoo!, e mais recentemente estou colaborando na criação de um plugin para o framework SuperCRUD para o meu amigo Vinicius Senger.<br />
</p><h3>3.Poderia comentar um pouco sobre o plugin que você desenvolveu no Yahoo Open Hack Day onde participou da equipe que ganhou o prêmio Bridging the Gap ?<br />
</h3><p>Para mim foi uma grande alegria e honra participar do time Globalcode, onde ao todo foram desenvolvidos 4 hacks. Sobre o plugin desenvolvido para o Yahoo Open Hack Day, é um módulo que permite a criação de projetos (através de templates) com suporte ao Yahoo! Blueprint, uma tecnologia desenvolvida pela Yahoo que permite a criação de web sites para celulares com uso apenas de XML. O plugin oferece a criação de um esqueleto para um projeto Yahoo, criando os arquivos necessários para seu funcionamento (gallery.xml e config.xml). Além disso, o plugin vem com alguns samples (desenvolvidos pela Globalcode) dentro do NetBeans para os desenvolvedores que querem entender como funciona um projeto Blueprint. E possui suporte a Update Center, Help, e a inclusão do guia do Desenvolvedor em pdf no NetBeans.<br />
</p><h3>4. Quais os conhecimentos necessários para um programador começar a criar módulos para o NetBeans ?<br />
</h3><p>Além de ter conhecimentos sólidos de Java Standard Edition, para o programador iniciar a criação de módulos para o NetBeans, é importante entender como funciona o NetBeans e a sua arquitetura. Procurar enxergar além do IDE, rs.. o IDE NetBeans é construído sobre a Plataforma NetBeans, assim como vários outros produtos, como por exemplo a ferramenta VisualVM, quem utiliza nota a grande semelhança com o NetBeans.<br />
Ao iniciar o desenvolvimento na plataforma NetBeans, já temos disponíveis várias funcionalidades / componentes prontos para o uso e toda esta infraestrutura pode ser manipulada via código através das APIs da Plataforma NetBeans. A plataforma dispõe de APIs para trabalhar com diversos tipos de categorias entre os quais podemos destacar como as Ações do Sistema (Actions), Ant, Paleta de objetos, Debug, Dialogs (para notificação), Sistema de Janelas, Sistema de Arquivos, Editores, Navegação, Loaders, entre outros.<br />
O programador precisa somente entender como manipular estas APIs que ele pode praticamente fazer o que quiser com o NetBeans.<br />
</p><h3>5. Sabemos que você andou fazendo testes com Zembly, poderia comentar um pouco sobre o que é Zembly e para que serve ?<br />
</h3><p>A ideia do Zembly, é criar uma espécie de Wiki para aplicações sociais como o Facebook, ele fornece o ambiente no próprio site do Zembly para criação e edição de aplicações sociais, essa aplicação fica hospedada em uma nuvem do Zembly de maneira que podemos compartilhar nossa aplicação entre diversos sites, como se fossem widgets.<br />
É algo extremamente interessante, pois no Zembly, temos um editor para o código HTML/XHTML para UI, um editor CSS para aplicar os estilos da aplicação e um editor JavaScript para a lógica do negócio, que pode ser utilizado bibliotecas JavaScript como jQuery, Prototype e podemos fazer inclusive integração com diversas APIs como FlickR, Yahoo API, Google Maps, entre outros.<br />
Atualmente estou trabalhando no SOUJava para criar uma aplicação que seja compartilhada pelos sites de tecnologia, fóruns, blogs, de maneira que o SOUJava possa divulgar suas atividades de uma maneira muito mais ampla, pois estes sites deverão apenas incluir um pequeno trecho de código JavaScript em seus sites.<br />
</p><h3>6. Poderia comentar um pouco sobre o Plugin que desenvolveu como colaboração para o SuperCRUD ?<br />
</h3><p>Na verdade, este foi um trabalho relâmpago que montamos para o SuperCRUD e está em evolução, atualmente o plugin permite a criação de qualquer tipo de projeto (web, desktop, maven) com fontes existentes a partir de um servidor remoto, onde o desenvolvedor precisa informar a URL para o projeto (zipado).<br />
Pelo que sei, o desenvolvedor cria um projeto no SuperCRUD, e ao final o próprio SuperCRUD gera uma bookmarkable URL que o programador cola e copia no NetBeans (no plugin), que por sua vez abre o projeto remotamente. Mas claro, sobre esta parte do SuperCRUD o Vinicius poderia dar maiores detalhes =D.<br />
</p><h3>7. Poderia comentar um pouco sobre o Plugin que fez para o projeto Diamond Powder junto com o Renato Bellia?<br />
</h3><p>O Diamond Powder é um framework open source para Java ME desenvolvido pelo Bellia, que acelera a criação de coletores de dados em aplicações MIDP. O framework permite a criação dos formulários, fields (datafield, stringitem, textfield, choicegroup, filter, etc..), definição do fluxo de navegação das páginas e as páginas de help de maneira declarativa, baseada em definições de pares de chave-valor com uso de um Hashtable, que descreve toda a sua organização por um objeto chamado Schema.<br />
O "Schema" é o coração do framework, mas conforme a sua aplicação cresce, fica cada vez mais difícil dar manutenção no seu Schema, como adicionar novas páginas e campos, e é onde o plugin entra, ele facilita muito a criação e a manutenção do código do Schema (com refactoring ou criação de uma nova classe) através de um wizard e evita a digitação errada dos nomes das váriaveis, campos. <br />
Tem a possibilidade de gravar os dados criados (páginas, campos, etc...) em um arquivo properties e reutilizá-los em outros projetos.<br />
</p><h3>8. Você realmente achou um nicho de mercado muito interessante, onde pode colaborar com praticamente qualquer projeto Open Source, quais as dicas que você poderia dar para as pessoas que estão iniciando?<br />
</h3><p>A melhor dica que posso dar é estudar, estudar e estudar. Porém, se você ficar cansado de estudar, estude mais um pouco, faça cursos de java, visite sites de tecnologia como InfoQ, TheServerSide, execute os samples disponíveis no NetBeans e analise o código fonte, participe das listas de discussão. Participe dos eventos, dos minicursos, inscreva-se em todos os feeds possíveis sobre tecnologia, blogs, participe de grupos de discussão, tire certificações e o mais importante, participe de projetos open source, além de aprender com profissionais renomados e compartilhar conhecimento, você estará fazendo networking, sem falar da possibilidade do seu trabalho ficar conhecido no mundo todo.<br />
</p><h3>9. Poderia citar algumas referências para quem quer começar a desenvolver plugins para NetBeans ?<br />
</h3><p>Para as pessoas que estão iniciando, recomendo o próprio site do <a target="_blank" href="http://platform.netbeans.org/"> NetBeans Platform</a> que possui diversos tutoriais, screencasts, wikis, samples que demonstram como criar módulos para o NetBeans, recomendo também o blog do <a target="_blank" href="http://blogs.sun.com/geertjan"> Geertjan</a>, um dos desenvolvedores e evangelista do NetBeans, e existe um livro excelente chamado Plugging into the NetBeans Platform, que apesar de ser de 2007 demonstra em detalhes a criação de módulos para o NetBeans e o uso correto das APIs. E também recomendo meu artigo que foi publicado na edição 29 da revista Mundo Java sobre a Plataforma NetBeans ;).<br />
</p><h3>10. Poderia citar algumas referências para quem quer começar a estudar Zembly?<br />
</h3><p>Para começar a estudar Zembly, o mais importante é conhecer bem JavaScript, (X)HTML e CSS, o resto é entender como funciona o ambiente do Zembly.<br />
Uma ótima referência é o <a target="_blank" href="http://wiki.zembly.com/"> wiki</a> do site, que possui diversos tutoriais de como criar aplicações a partir de templates, criação de aplicações para o Facebook, iPhone, Meebo, entre outros.<br />
</p>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-42813994425239837232009-09-10T09:53:00.001-03:002009-09-10T09:56:21.308-03:00Oracle - Sun no fantástico mundo de HardwarePara quem pensava que a Oracle não iria investir em Hardware, saiu hoje <a href="http://www.oracle.com/features/suncustomers.html">no site da Oracle</a> um comunicado aos cliente da Sun sobre alguns de seus planos, mais especificamente na parte de hardware, observe que final ainda tem um aviso para IBM,<br />
<blockquote>Nós estamos nesta para ganhar. <br />
IBM prepare-se, nós estamos nos preparando para competir com vocês no negócio de Hardware. <br />
<br />
<i>Larry Elisson</i></blockquote>É esperar para ver !!! =)<br />
Diversão garantida !<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGVj5Y1wNT8lsmtCQDteNCgrNOXHuN69Jb4r1hoPW-QiIesNyaLcFDPG3hJC_ALmn7D6-oMv3egb4NSOW6iVnFTQ42KPPfbcuOI5a_nmFo1lrumxV78wNnjEwg35pdbzRkBACj7BbkHRw9/s1600-h/OracleSun.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGVj5Y1wNT8lsmtCQDteNCgrNOXHuN69Jb4r1hoPW-QiIesNyaLcFDPG3hJC_ALmn7D6-oMv3egb4NSOW6iVnFTQ42KPPfbcuOI5a_nmFo1lrumxV78wNnjEwg35pdbzRkBACj7BbkHRw9/s400/OracleSun.jpg" /></a></div>Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-89957098700820058772009-09-09T16:25:00.002-03:002009-09-09T16:30:08.773-03:00Just Java 2009 - O principal evento da comunidade Java Brasileira<div class="separator" style="clear: both; text-align: center;"><a target="_blank" href="http://www.sucesusp.org.br/eventos2009/justjava/"><br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh55MqK2GF8Zles3Rvf8kM2TRFJ6gMzNmMRn5OqYyLJnvGCkZaEQhK1oyHynI7oeOem8bFQeOrPT-vEsBHTsYXn5fJAVBvcz7iMuG9eo35f6xC9XnlLUafc2Oc6X_UUvYSbCIbfy7N9CAwm/s320/justjava.jpg" /></a></div><br />
<br />
Nos dias 15, 16 e 17 de Setembro acontece em São Paulo o Just Java 2009. Será a 8a. edição do principal evento da Comunidade Java Brasileira.<br />
A grade do evento já está disponível no site <a target="_blank" href="http://grade.justjava.com.br/">http://grade.justjava.com.br/</a><br />
Esse ano vou apresentar a palestra "<b>De Web Services RESTFul a aplicações Mashups: Como chegar lá</b>". <br />
Onde vou apresentar o conceitos de REST, falar sobre especificação da <a target="_blank" href="http://jcp.org/en/jsr/summary?id=311">JSR-311</a> que define o JAX-RS , falar sobre frameworks de teste, como consumir serviços REST e finalmente falar sobre Mashups, e a importância de REST neste contexto.<br />
Para se inscrever, acesse o site do evento <a target="_blank" href="http://www.sucesusp.org.br/eventos2009/justjava/">aqui</a>.<br />
<br />
Diversão Garantida!!!Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com0tag:blogger.com,1999:blog-544668644670311424.post-87991420144790254472009-08-12T11:07:00.010-03:002012-01-13T18:31:07.336-02:00Scrum + XP = Agilidade eXtrema<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSEJEA19R9lttSWTVlxAgRicLhR4woGOyo_5QDvS1KQhGV3bcsKXFhW23qfO0KS4BFuPZRoBs9674Q7NrMTqGFMO1cUMiJf7of_xKXAQidIALTs90uEtQHluXT587sF-ksx3YTAQSWFXGh/s1600-h/MC_AgileXP_1.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5371748267380942290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSEJEA19R9lttSWTVlxAgRicLhR4woGOyo_5QDvS1KQhGV3bcsKXFhW23qfO0KS4BFuPZRoBs9674Q7NrMTqGFMO1cUMiJf7of_xKXAQidIALTs90uEtQHluXT587sF-ksx3YTAQSWFXGh/s400/MC_AgileXP_1.jpg" style="cursor: pointer; display: block; height: 293px; margin: 0px auto 10px; text-align: center; width: 390px;" /></a> Nos dias 07 e 28 de Julho foi realizado no auditório da <a href="http://www.globalcode.com.br/">Globalcode </a>o minicurso Scrum + XP = Agilidade eXtrema, gostaria de agradecer a Globalcode pelo espaço concedido e pela força e também a todos que compareceram, pelo ótimo feedback que recebi.<br />
<br />
Para maiores detalhes de como foi o mini-curso acesse o seguinte <a href="http://www.globalcode.com.br/site/noticias/painel.seam?chave=MinicursoScrum">link</a> no site da Globalcode.<br />
<br />
Na apresentação, o intuito foi dar um enfoque teórico e prático de como funciona o Gerenciamento de Projetos Ágeis utilizando XP e Scrum, e no final uma explicação de como combinar as duas.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4_VV76ZfmdD21VLuhzZCMZebzanahxERHBuYhKs5PyWLK6c4v4V7fjmyWw0Sh0fwughhLLZ3Y-d7jeLwpJhuJfB6nZw1BslvQj19ItllzcaeAydeWFo6shoBOudpR0D6Hgl2LPtIp6lSe/s1600-h/MC_AgileXP_2.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5371753073660770066" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4_VV76ZfmdD21VLuhzZCMZebzanahxERHBuYhKs5PyWLK6c4v4V7fjmyWw0Sh0fwughhLLZ3Y-d7jeLwpJhuJfB6nZw1BslvQj19ItllzcaeAydeWFo6shoBOudpR0D6Hgl2LPtIp6lSe/s320/MC_AgileXP_2.jpg" style="cursor: pointer; float: right; height: 240px; margin: 0pt 0pt 10px 10px; width: 320px;" /></a>O que acabou agregando bastante a apresentação foi o próprio público, que iteragiu bastante, com perguntas sobre planejamento e estimativas em projetos ágeis. Foi apresentado alguns técnicas para "vender" Agile em um ambiente corporativo. Conversamos bastante sobre o papel de uma equipe de testes, como escrever os testes de aceite e unitário dentro do TDD, Refactoring, Integração Contínua, priorização dos itens de backlog, User Stories, Débito Técnico, enfim.. três horas pareceu pouco =)<br />
<br />
<br />
Conforme solicitado pelos colegas, segue a apresentação.<br />
<br />
<a href="http://www.scribd.com/doc/18821590/Scrum-XP-na-pratica" style="display: block; font-family: Helvetica,Arial,Sans-serif; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 12px auto 6px; text-decoration: underline;" title="View Scrum + XP na prática on Scribd">Scrum + XP na prática</a> <object align="middle" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="500" id="doc_320618798223982" name="doc_320618798223982" width="100%"> <param name="movie" value="http://d.scribd.com/ScribdViewer.swf?document_id=18821590&access_key=key-14cnjarfc90qqlnjtcgi&page=1&version=1&viewMode=">
<param name="quality" value="high">
<param name="play" value="true">
<param name="loop" value="true">
<param name="scale" value="showall">
<param name="wmode" value="opaque">
<param name="devicefont" value="false">
<param name="bgcolor" value="#ffffff">
<param name="menu" value="true">
<param name="allowFullScreen" value="true">
<param name="allowScriptAccess" value="always">
<param name="salign" value="">
<embed src="http://d.scribd.com/ScribdViewer.swf?document_id=18821590&access_key=key-14cnjarfc90qqlnjtcgi&page=1&version=1&viewMode=" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_320618798223982_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" align="middle" width="100%" height="500"></embed> </object><br />
<br />
Ainda durante a apresentação, demonstrei um vídeo bem engraçado intitulado "O Alpinista", onde fiz uma analogia de um alpinista com gerentes de projeto.. momento bacana para quebrar um pouco o gelo. Segue abaixo o vídeo.<br />
<br />
<object height="313" width="384"><param name="movie" value="http://www.youtube.com/v/E5ngNIrNnwo&hl=pt-br&fs=1">
<param name="allowFullScreen" value="true">
<param name="allowscriptaccess" value="always">
<embed src="http://www.youtube.com/v/E5ngNIrNnwo&hl=pt-br&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="384" height="313"></embed></object><br />
<br />
Bom, é isso aí pessoal, obrigado mais uma vez !!!<br />
<br />
Scrum + XP = Diversão Garantida !!!Wagner Santoshttp://www.blogger.com/profile/01837369605547921799noreply@blogger.com1