<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>SubMundo Java</title>
	<atom:link href="http://submundojava.com.br/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://submundojava.com.br/wordpress</link>
	<description>Um pouco de tudo, mas tecnologia acima de tudo!</description>
	<pubDate>Tue, 23 Feb 2010 21:43:18 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Parte 2: Explorando padrões e princípios para as novas gerações de soluções SOA.</title>
		<link>http://submundojava.com.br/wordpress/2010/02/23/parte-2-explorando-padroes-e-principios-para-as-novas-geracoes-de-solucoes-soa/</link>
		<comments>http://submundojava.com.br/wordpress/2010/02/23/parte-2-explorando-padroes-e-principios-para-as-novas-geracoes-de-solucoes-soa/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 21:43:18 +0000</pubDate>
		<dc:creator>paulo.sales</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/?p=93</guid>
		<description><![CDATA[
    Este post é a parte final do resumo do artigo &#8220;Exploring Patterns and Principles of a New Generation of SOA Solutions&#8221; da 22a. edição da revista &#8220;The Architecture Journal&#8221;. O artigo original discute sobre alguns desafios das tradicionais arquiteturas orientadas a serviço e explora alguns padrões e princípios para as novas [...]]]></description>
			<content:encoded><![CDATA[<p>
    Este post é a parte final do resumo do artigo &#8220;Exploring Patterns and Principles of a New Generation of SOA Solutions&#8221; da 22a. edição da revista <a href="http://www.architecturejournal.net">&#8220;The Architecture Journal&#8221;</a>. O artigo original discute sobre alguns desafios das tradicionais arquiteturas orientadas a serviço e explora alguns padrões e princípios para as novas gerações de arquiteturas orientadas a serviço, <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture">SOA</a>.
</p>
<h2>Abraçando a WEB: Serviços <a href="">RESTful</a></h2>
<p>
    Apesar dos Web Services serem desenvolvidos para muitos protocolos o que vemos na grande maioria das implementações é o uso do protocolo HTTP como meio para o transporte de outro protocolo o SOAP. Esse excesso de abstração da camada de transporte impossibilita o uso dos recursos do protocolo HTTP. Por quê não utilizar HTTP somente?
</p>
<p>
    Um dos meios para utilizar o protocolo HTTP para distribuir serviços, Web Services, de maneira amigável seria o uso do <a href="">REST</a>. Seguindo os princípios do REST podemos ter uma arquitetura SOA altamente escalável. Sem dúvida REST se tornou uma alternativa muito atraente para substituir os Web Services SOAP/WS-*, resolvendo os problemas citados na <a href="">Parte 1</a>, como interoperabilidade e escalabilidade. Segue algumas características dos serviços RESTful:</p>
<ul>
<li>Endereçamento de recursos/serviços através de uma URI</li>
<li>Interações baseadas somente em HTTP</li>
<li>Uso de métodos padrões HTTP (GET, POST, PUT, etc)</li>
<li>Interações sem estado</li>
<li>Possibilita diferentes formatos de distribuição</li>
<li>Armazenamento em <a href="">Cache</a></li>
<li>Iteroperabilidade</li>
<li>Escalabilidade</li>
</ul>
<p>
    A simplicidade e o alto nível de interoperabilidade dos serviços em RESTful são alguns dos fatores que podem melhorar a agilidade da próxima geração de soluções SOA.
</p>
<h2>Interoperabilidade com WS-*</h2>
<p>
    Apesar do notável trabalho acadêmico realizado na família de protocolos WS-* percebemos que ainda não supre as expectativas iniciais. Interoperabilidade e complexidade ainda são desafios importantes que encaramos na adoção dos protocolos WS-*. A melhor prática para melhorar a interoperabilidade dos protocolos WS-* é identificar as características dos consumidores dos serviços e criar <a href="">endpoints</a> distintos para cada particularidade desses consumidores. Por exemplo, vamos considerar um senário que devemos assegurar um Web Service que irá ser consumido por aplicações .NET, Sun Metro, Oracle Weblogic e Ruby on Rails. Neste senário podemos permitir que três endpoints com diferentes configurações de segurança atendam às diferentes características das aplicações que consomem o Web Service, como mostrado na Figura 6:
</p>
<div id="attachment_94" class="wp-caption aligncenter" style="width: 310px"><a href="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_6a.jpg"><img src="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_6a-300x164.jpg" alt="Padrão de múltiplos endpoints de serviços" title="Padrão de múltiplos endpoints de serviços" width="300" height="164" class="size-medium wp-image-94" /></a><p class="wp-caption-text">Padrão de múltiplos endpoints de serviços</p></div>
<h2>Federação de ESB: Um caminho menos árduo</h2>
<p>
    Vimos na sessão anterior que uma arquitetura com um ESB centralizado é uma das causas fundamentais de falhas na implementação de um sistema SOA. Após inúmeras tentativas de implementação de um ESB centralizado em grandes organizações a indústria está adotando um padrão mais ágil de implementação do ESB. Essencialmente, esse novo padrão visa particionar as funcionalidades em leves ESBs físicos que são agrupados como <a href="http://en.wikipedia.org/wiki/Federated_identity">entidades federativas</a>. Este padrão é comumente conhecido como Federação de ESB e representa uma das emergentes arquiteturas para implementar soluções ESB de alta escalabilidade. Com essa arquitetura podemos ter uma infraestrutura ESB específica para interfaces <a href="http://en.wikipedia.org/wiki/Business-to-business">Business to Business</a>, outra para troca de transações financeiras, como mostrada na Figura 6.<br />
<div id="attachment_95" class="wp-caption aligncenter" style="width: 310px"><a href="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_6.jpg"><img src="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_6-300x147.jpg" alt="Padrão de Federação de ESB" title="Padrão de Federação de ESB" width="300" height="147" class="size-medium wp-image-95" /></a><p class="wp-caption-text">Padrão de Federação de ESB</p></div>
</p>
<h2>Governça em SOA: Capitalizando SOA</h2>
<p>
    A limitada adoção do <a href="http://en.wikipedia.org/wiki/Universal_Description_Discovery_and_Integration">UDDI</a> em sistemas SOA de grande porte tem sido um catalisador do surgimento de um modelo mais leve e mais interoperável de governaça em SOA, levando em conta tecnologias como REST e <u><a href="http://en.wikipedia.org/wiki/Web_2.0">Web 2.0</a></u>. Essencialmente, esses modelos foram criados para remover algumas complexidades que são apresentadas pelo modelo UDDI centralizado, substituindo algumas tecnologias por outras amplamente adotadas como HTTP, <a href="http://en.wikipedia.org/wiki/Atom_%28standard%29">Atom</a> e <a href="http://en.wikipedia.org/wiki/JSON">JSON</a>.<br />
    Uma das formas mais populares de implementar esse novo modelo de governaça SOA é utilizar um repositório de serviços RESTful. Neste modelo a implementação tradicional SOA como serviços, endpoints, operações e mensagens são representadas como recursos que podem ser acessados através de um conjunto de interfaces RESTful.<br />
    O maior benefício que traz esse novo modelo é a interoperabilidade ganha utilizando interfaces RESTful, como mostrada na Figura 7, além de ser uma abordagem muito mais leve e flexível.
</p>
<div id="attachment_96" class="wp-caption aligncenter" style="width: 310px"><a href="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_7.jpg"><img src="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_7-300x224.jpg" alt="Repositório RESTful" title="Repositório RESTful" width="300" height="224" class="size-medium wp-image-96" /></a><p class="wp-caption-text">Repositório RESTful</p></div>
<h2>Bem-vindo a <a href="http://en.wikipedia.org/wiki/Cloud_computing">Computação em Núvem</a></h2>
<p>
    A computação em núvem pode auxiliar em uma arquitetura SOA híbrida, onde alguns componentes de um sistema SOA possam estar em uma outra infraestrutura. Alguns exemplos do uso da computação em núvem em um sistema SOA:</p>
<ul>
<li>ESB na Núvem: Podemos hospedar um ESB na núvem? Claro que podemos! Este tipo de arquitetura possibilita disponibilizar todos os recursos de um ESB através de uma infraestrutura na Núvem.</li>
<li>Serviços de Segurança na Núvem: Nos últimos anos temos percebido o aumento da adoção de serviços de segurança, assim como o <a href="http://en.wikipedia.org/wiki/Windows_Live_ID">Windows Live ID</a> ou o <a href="http://en.wikipedia.org/wiki/Facebook_Platform">Facebook Connect</a>, e usar a Núvem para prover serviços de segurança pode facilitar a implementação de mecanismos altamente interoperáveis, disponibilizando serviços de autenticação, identificação e autorização a diversos clientes distintos.</li>
<li>Serviços de Armazenamento na Núvem: Indiscutivelmente, serviços de armazenamento como Amazon S3 ou o Azure DB são os serviços mais atraentes encontrados na Núvem. Considerar esse mecanismo pode alavancar a flexibilidade e a interoperabilidade da troca de dados de seu sistema SOA, além de eliminar algumas complexidades existentes em se ter uma infraestrutura própria para armazenamento de dados.</li>
</ul>
<div id="attachment_97" class="wp-caption aligncenter" style="width: 310px"><a href="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_8.jpg"><img src="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_8-300x208.jpg" alt="Serviços na Núvem" title="Serviços na Núvem" width="300" height="208" class="size-medium wp-image-97" /></a><p class="wp-caption-text">Serviços na Núvem</p></div>
<h2>Conclusão</h2>
<p>
    A tradicional arquitetura SOA implica em sérios desafios que tornam impraticável implementações em larga escala. Este <u>artigo</u> post sugeriu uma série de padrões que podem ajudar o desenvolvedor a ter uma implementação mais leve, interoperável e escalável de SOA, possibilitando realmente serviços de negócio com agilidade em senários de larga escala empresarial.
</p>
<p><b>Abstração de Protocolos:</b></br></p>
<ul>
<li><b>Considerar</b> primeiro o protocolo padrão, HTTP. Ele é muito leve e pode conversar com outros frameworks.</li>
<li><b>Fazer</b> uso do SOAP e WS-* quando houver necessidade de controle de transações ou a necessidade de muita performance no protocolo <a href="http://en.wikipedia.org/wiki/Internet_Protocol_Suite">TCP/IP</a>.</li>
</ul>
<p><b>SOAP e WSDL:</b></br></p>
<ul>
<li><b>Não fazer</b> uso de SOAP e WSDL até ter certeza que vai precisar de algum recurso que eles oferecem.</li>
<li><b>Considerar</b> o uso de REST, JSON e Atom Pub como alternativas mais leves.</li>
<li><b>Não cair</b> na armadilha de gerar o WSDL a partir do código, o contrato vem sempre em primeiro.</li>
</ul>
<p><b>Governaça</b></br></p>
<ul>
<li><b>Fazer</b> uso de um repositório de serviços para ajudar a gerenciar os serviços de sua empresa.</li>
<li><b>Considerar</b> o uso de um repositório de serviços RESTful.</li>
</ul>
<p><b>Enterprise Service Bus</b></br></p>
<ul>
<li><b>Não confundir</b> um ESB com um sistema que processa eventos.</li>
<li><b>Considerar</b> o uso de federação de ESBs.</li>
</ul>
<p><b>Serviços baseados na Núvem</b></br></p>
<ul>
<li><b>Considerar</b> serviços de segurança local, privado ou públic baseados na Núvem, é um dos os serviços mais maduros que existe na Núvem</li>
<li><b>Considerar</b> a possibilidade futura de serviços de armazenamento e serviços de ESB na Núvem.
    </ul>
</p>
<p>
    A coisa mais importante que você deve ter em mente quando está contruindo sua aplicação SOA é o mantra &#8220;Convenção ao invés de Configuração&#8221;. Diminuindo o número de opções ao mínimo e fazendo somente o que são requisitos do negócio, você deve acreditar que é possível contruir uma arquitetura orientada a serviços que seja leve, fácil de manter e evoluir, mesmo em ambientes de larga escala empresarial.
</p>
<h2>Minha Conclusão</h2>
<p>
    Acho que essa segunda parte extendeu um pouco, portanto, vou deixar minha conclusão para uma terceira parte. <img src='http://submundojava.com.br/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />
</p>
<p>
    Mesmo assim nessa segunda parte podemos ver as sugestões de Jesus Rodriguez e Don Demsak para solucionar alguns dos problemas encontrados nas implementações tradicionais SOA. Espero que tenham gostado, mas se não gostaram podem deixar suas queixas nos comentários irei acatá-las com certeza. Até a próxima parte&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2010/02/23/parte-2-explorando-padroes-e-principios-para-as-novas-geracoes-de-solucoes-soa/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Parte 1: Explorando padrões e princípios para as novas gerações de soluções SOA.</title>
		<link>http://submundojava.com.br/wordpress/2010/02/04/parte-1-explorando-padroes-e-principios-para-as-novas-geracoes-de-solucoes-soa/</link>
		<comments>http://submundojava.com.br/wordpress/2010/02/04/parte-1-explorando-padroes-e-principios-para-as-novas-geracoes-de-solucoes-soa/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 18:25:34 +0000</pubDate>
		<dc:creator>paulo.sales</dc:creator>
		
		<category><![CDATA[arquitetura]]></category>

		<category><![CDATA[soa]]></category>

		<category><![CDATA[bpm]]></category>

		<category><![CDATA[esb]]></category>

		<category><![CDATA[soap]]></category>

		<category><![CDATA[ws-*]]></category>

		<category><![CDATA[wsdl]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/?p=76</guid>
		<description><![CDATA[Este post é um resumo do artigo &#8220;Exploring Patterns and Principles of a New Generation of SOA Solutions&#8221; da 22a. edição da revista &#8220;The Architecture Journal&#8221;. O artigo original discute sobre desafios das tradicionais arquiteturas orientadas à serviço e explora alguns padrões e princípios para as novas gerações de arquiteturas orientadas à serviço, SOA.
SOA: Arquitetura [...]]]></description>
			<content:encoded><![CDATA[<p>Este post é um resumo do artigo &#8220;Exploring Patterns and Principles of a New Generation of SOA Solutions&#8221; da 22a. edição da revista <a href="http://www.architecturejournal.net">&#8220;The Architecture Journal&#8221;</a>. O artigo original discute sobre desafios das tradicionais arquiteturas orientadas à serviço e explora alguns padrões e princípios para as novas gerações de arquiteturas orientadas à serviço, <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture">SOA</a>.</p>
<h2>SOA: Arquitetura sem Restrições</h2>
<p>SOA tem sido o cerne dos sistemas distribuídos nos últimos anos, prometendo agilidade na implementação de serviços de negócio através de interfaces de negócio. É muito comum encontrar um conjunto de características semelhantes entre os tradicionais sistemas em SOA, sendo elas:</p>
<ul>
<li>A adotação do <a href="http://en.wikipedia.org/wiki/SOAP">SOAP</a> e <a href="http://www.w3.org/TR/wsdl">WSDL</a> como padrão para especificar o contrato, ou interface, dos serviços.</li>
<li>O uso dos <a href="http://en.wikipedia.org/wiki/List_of_Web_service_specifications">protocolos WS-*</a> para pertimir algumas características de missão crítica aos serviços.</li>
<li>O uso de um <a href="http://en.wikipedia.org/wiki/Enterprise_service_bus">ESB</a> central abstraindo diferentes orquestrações de serviço.</li>
<li>O uso de um servidor de integração para gerenciar complexos processos de negócio, <a href="http://en.wikipedia.org/wiki/Business_process_management">BPM</a>.</li>
<li>O uso de ferramentas de <a href="http://pt.wikipedia.org/wiki/Governan%C3%A7a_corporativa">governança em SOA</a> para gerenciar toda arquitetura de serviços.</li>
</ul>
<div id="attachment_86" class="wp-caption aligncenter" style="width: 310px"><a href="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_12.jpg"><img class="size-medium wp-image-86" title="Figura 1: O modelo ideal SOA" src="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_12-300x185.jpg" alt="Figura 1: O modelo ideal SOA" width="300" height="185" /></a><p class="wp-caption-text">Figura 1: O modelo ideal SOA</p></div>
<p>A arquitetura apresentada na Figura 1 pode ser considerada ideal pra sistemas SOA, mas esta arquitetura não leva em consideração as retrições que os sistemas SOA impõem à arquitetura, como <a href="http://pt.wikipedia.org/wiki/Interoperabilidade">interoperabilidade</a>, performance e <a href="http://pt.wikipedia.org/wiki/Escalabilidade">escalabilidade</a>. A arquitetura apresentada na Figura 1 leva em consideração abstrair a complexidade de implementação dos sistemas SOA utilizando mais padrões e ferramentas.</p>
<p>Ultimamente se ouve muito o mantra <a href="http://pt.wikipedia.org/wiki/Conven%C3%A7%C3%A3o_sobre_configura%C3%A7%C3%A3o">Conveção ou invés de Configuração</a>, que remove opções de configuração, ou parâmetros, que aumentam a complexidade do sistema por convenções previamente adotadas. Utilize as opções de configuração somente quando for realmente necessário.</p>
<h2>SOAP: A ilusão de uma abstração da camada de transporte</h2>
<p>Inicialmente o SOAP foi desenvolvido para abstrair os serviços das diferentes camadas de transporte, ou protocolos. Embora na teoria se mostre uma boa idéia, na prática constatamos que abstrair os serviços da camada de transporte exige um custo significativo de complexidade. Um exemplo da complexidade desta abstração é trafegar SOAP sobre <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a>, que hoje em dia é frequente. Por quê não usar o HTTP somente?</p>
<h2>WSDL: Em abundância</h2>
<p>O WSDL tem como propósito descrever os características dos serviços e as mensagens trocadas. Conceitualmente, o WSDL representa uma evolução para do antigo <a href="http://en.wikipedia.org/wiki/Interface_description_language">IDL</a>. Ao utilizar o WSDL como padrão para especificar os serviços, esse se torna um artefato vital para as aplicações clientes. Essa relação entre o provedor de serviços e o cliente tende a ter um acoplamento alto, sendo que se houver uma alteração no contrato dos serviços o(s) cliente(s) serão afetados. Pensando em uma ambiente pequeno que envolve poucos clientes consumindo alguns serviços não é preocupante, mas em um ambiente empresarial e complexo o alto acoplamento entre o cliente e o provedor de serviços é um problema a se considerar.</p>
<div id="attachment_88" class="wp-caption aligncenter" style="width: 310px"><a href="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_21.jpg"><img class="size-medium wp-image-88" title="Figura 2: Auto acoplamento com WSDL, o grande desafio de sistemas SOA de grande porte" src="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_21-300x154.jpg" alt="Figura 2: Auto acoplamento com WSDL, o grande desafio de sistemas SOA de grande porte" width="300" height="154" /></a><p class="wp-caption-text">Figura 2: Auto acoplamento com WSDL, o grande desafio de sistemas SOA de grande porte</p></div>
<h2>ESB: Ter ESB ou não ter ESB</h2>
<p>A integração heterogênea de sistemas, <a href="http://en.wikipedia.org/wiki/Line_of_business">LOB</a>, tem sido uma grande promessa dos sistemas empresarias SOA. Para pôr em prática essa integração entre diferentes sistemas heterogêneos foi determinado um conjunto de padrões que constituem o ESB. Ainda que não exista um padrão industrial que defina o que é um ESB, podemos adotar algumas características comuns entre os ESBs existentes no mercado. Atualmente o ESB é usado como um barramento central de serviços, como mostrado na Figura 3:</p>
<div id="attachment_89" class="wp-caption aligncenter" style="width: 310px"><a href="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_31.jpg"><img class="size-medium wp-image-89" title="Figura 3: ESB centralizado" src="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_31-300x180.jpg" alt="Figura 3: ESB centralizado" width="300" height="180" /></a><p class="wp-caption-text">Figura 3: ESB centralizado</p></div>
<p>Pode parecer uma boa estratégia arquitetural utilizar o ESB de forma centralizada, mas na prática esse tipo de arquitetura apresenta sérias limitações nos aspectos de gerenciamento, performance e escalabilidade. Ao inves do ESB se tornar um facilitador ele pode se tornar um gargalo em sistemas SOA.</p>
<h2>Protocolos WS-*: O lado negro</h2>
<p>Os protocolos WS-* criados para complementar características de segurança, confiabilidade e transacionabilidade ao SOAP/WSDL não receberam muita adoção em ambientes heterogêneos. Um dos motivos da não adoção dos protocolos WS-* está nas centenas de diferentes versões de protocolos WS-* existentes, isso cria desconfiança e descredibilidade na tecnologia. A interoperabilidade é o maior desafio das soluções baseadas em protocolos WS-*, como diferentes ferramentas de <a href="http://en.wikipedia.org/wiki/Web_service">Web Services</a> as vezes implementam diferentes protocolos WS-* teremos então diferentes versões dos mesmos protolos e mesmo diferentes aspectos da mesma especificação.</p>
<div id="attachment_90" class="wp-caption aligncenter" style="width: 310px"><a href="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_41.jpg"><img class="size-medium wp-image-90" title="Figura 4: O desafio da interoperabilidade" src="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_41-300x166.jpg" alt="Figura 4: O desafio da interoperabilidade" width="300" height="166" /></a><p class="wp-caption-text">Figura 4: O desafio da interoperabilidade</p></div>
<h2>Governaça em SOA: Ditatura em SOA</h2>
<p>Em sistemas SOA de médio e grande porte existe a necessidade de versionar, monitorar e gerenciar os serviços de negócio e esse papel é realizado pelas ferramentas de governaça em SOA. O maior desafio dessas ferramentas de governança é permitir de maneira confiável o gerenciamento de complexos serviços de negócio, por este motivo as tecnologias de governança em SOA tem crescido muito nos últimos tempos. As tecnologias de governaça estão adotando uma arquitetura que virtualiza os serviços de negócio em um ambiente centralizado de governaça. Embora, essa arquitetura possa ser aplicada em sistemas SOA de pequeno porte, ela apresenta sérias limitações em termos de iteroperabilidade, performance e escalabilidade em ambientes de sistemas SOA de grande porte, como mostrado na Figura 5:</p>
<div id="attachment_91" class="wp-caption aligncenter" style="width: 310px"><a href="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_51.jpg"><img class="size-medium wp-image-91" title="Figura 5: Modelo centralizado de governança SOA" src="http://submundojava.com.br/wordpress/wp-content/uploads/2010/02/soa_post_fig_51-300x253.jpg" alt="Figura 5: Modelo centralizado de governança SOA" width="300" height="253" /></a><p class="wp-caption-text">Figura 5: Modelo centralizado de governança SOA</p></div>
<h2>Conclusão</h2>
<p>Nesta primeira parte do artigo foi explorado as arquiteturas SOA adotadas comumente nos dias de hoje. Na abstração da camada de transporte dos serviços de negócio foi mostrada a adoção do protocolo SOAP utilizando a especificação WSDL para manter um contrato, ou interface, dos serviços de negócio disponíveis que acarreta em uma sobrecarga de protocolos e um aumento muito significativo do acoplamento entre o provedor de serviços de negócio e os clientes cosumidores destes serviços.</p>
<p>Também foi mostrada a arquitetura centralizada do ESB que apresenta limitações em termos de gerenciamento, performance e escalabilidade. As diversas implementações dos protocolos WS-* que são utilizadas de forma não padronizada criando desconfiança e descredibilidade da tecnologia. Como a arquitetura centralizada do ESB foi mostrada a arquitetura que virtualiza os serviços de negócio em um ambiente centralizado de governança SOA que apresenta limitações de interoperabilidade, performance e escalabilidade.</p>
<p>Na segunda parte deste artigo será discutido arquiteturas e tecnologias que visão melhorar alguns aspectos negativos mostrados nessa primeira parte do artigo. Até lá ;).</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2010/02/04/parte-1-explorando-padroes-e-principios-para-as-novas-geracoes-de-solucoes-soa/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Fluent Regex Composer</title>
		<link>http://submundojava.com.br/wordpress/2009/07/26/fluent-regex-composer/</link>
		<comments>http://submundojava.com.br/wordpress/2009/07/26/fluent-regex-composer/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 20:32:47 +0000</pubDate>
		<dc:creator>Henrique Lima</dc:creator>
		
		<category><![CDATA[domain driven design]]></category>

		<category><![CDATA[fluent interface]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/?p=30</guid>
		<description><![CDATA[Na semana passada, Martin Fowler escreveu um artigo demonstrando as práticas que ele costuma utilizar ao trabalhar com expressões regulares. Neste artigo, o senhor Fowler propõe uma maneira de separar uma expressão regular em partes menores, recompondo tal expressão posteriormente para, entre outra coisas, dar maior legibilidade ao código. Ao acabar de ler o artigo [...]]]></description>
			<content:encoded><![CDATA[<p>Na semana passada, <a title="Martin Fowler" href="http://www.martinfowler.com/" target="_blank">Martin Fowler</a> escreveu um <a title="artigo" href="http://martinfowler.com/bliki/ComposedRegex.html" target="_blank">artigo</a> demonstrando as práticas que ele costuma utilizar ao trabalhar com expressões regulares. Neste artigo, o senhor Fowler propõe uma maneira de separar uma expressão regular em partes menores, recompondo tal expressão posteriormente para, entre outra coisas, dar maior legibilidade ao código. Ao acabar de ler o <a title="artigo" href="http://martinfowler.com/bliki/ComposedRegex.html" target="_blank">artigo</a> a primeira coisa que veio em minha cabeça foi <a title="Fluent Interface" href="http://en.wikipedia.org/wiki/Fluent_interface" target="_blank">Fluent Interfaces</a>. Na atualização de seu <a title="artigo" href="http://martinfowler.com/bliki/ComposedRegex.html" target="_blank">artigo</a>, Martin Fowler cita este assunto (inclusive expôe sua preferência por não utilizar <a title="Fluent Interfaces" href="http://en.wikipedia.org/wiki/Fluent_interface" target="_blank">Fluent Interfaces</a>) e sugere uma <a title="alternativa fluente" href="http://flimflan.com/blog/ReadableRegularExpressions.aspx" target="_blank">alternativa fluente</a> criada por <a title="Joshua Flanagan" href="http://flimflan.com/blog/default.aspx" target="_blank">Joshua Flanagan</a> para C#.</p>
<p>Este post não tem como  objetivo discutir se utilizar <a title="Fluent Interfaces" href="http://en.wikipedia.org/wiki/Fluent_interface" target="_blank">Fluent Interfaces</a>, ou não, é a melhor maneira de resolver problemas relacionados a expressões regulares, mas sim, propor um exercício a fim de criar uma <strong>possível</strong> API fluente e, ao final do artigo, demonstrar uma pequena porção de código Java que pode solucionar alguns problemas relacionados a expressões regulares utilizando esta abordagem.</p>
<p><strong>O problema</strong></p>
<p>O grande problema de quando trabalhamos com expressões regulares é conhecer todos os recursos disponíveis (metacaracteres, quantificadores gananciosos, possessivos, relutantes, etc) para validarmos determinada String e posteriormente recuperarmos os grupos que nos interessa para aplicarmos a lógica que necessitamos. Além disso, quanto maior for a expressão mais difícil será de interpretá-la, por isso, utilizar a abordagem &#8220;<a title="Divisão e Conquista" href="http://pt.wikipedia.org/wiki/Divis%C3%A3o_e_conquista" target="_blank">Divisão e Conquista</a>&#8221; é uma boa prática a ser seguida.</p>
<p><strong>A solução</strong></p>
<p>Criar uma API para abstrair os recursos (metacaracteres, quantificadores, etc) e disponibilizar ao usuário, métodos mais legíveis e simples de escrever. Para chegar a este fim, me propus a analisar as expressões regulares que mais utilizo no dia-a-dia, &#8220;mapeá-las&#8221; para o português estruturado e, então, escrever uma porção de código que reflita a interpretação do português estruturado o mais fluente possível.</p>
<p><strong>Interpretando Expressões Regulares</strong></p>
<p>Analisando uma expressão regular que tem como objetivo validar se Strings representam uma data em um formato dd/mm/aaaa (em java dd/MM/yyyy), temos:</p>
<p><strong>Expressão Regular:</strong> \\d{2}/\\d{2}/\\d{4}</p>
<p><strong>Português estruturado:</strong> A String em questão: Inicia com dois dígitos (numéricos), seguido de uma barra, seguido de dois dígitos (numéricos), seguido de uma barra e finaliza com quatro dígitos (númericos).</p>
<p><strong>Código Java:</strong></p>
<pre class="prettyprint">RegexComposer composer = RegexComposer.getInstance();
composer
    .startsWith(exactly(2, digit()))
    .followedBy(exactly(1, literal("/")))
    .followedBy(exactly(2, digit()))
    .followedBy(exactly(1, literal("/")))
    .finishedWith(exactly(4, digit()));</pre>
<p>Parece bacana, mas não está ao contrário? Porque o quantificador vem antes do dígito no código Java e na expressão regular não? Pois ao interpretarmos a expressão regular em português estruturado, também passamos o quantificador a frente do dígito e é essa a diferença, pois, ao interpretarmos uma expressão como: \\d{2} nós não escrevemos &#8220;Esta expressão representa digítos (numéricos) <strong>dois</strong>&#8220;, e sim &#8220;Esta expressão representa <strong>dois</strong> dígitos (numéricos)&#8221;.</p>
<p>Este foi o meu principal questionamento quando analisei a <a title="API" href="http://flimflan.com/blog/ReadableRegularExpressions.aspx" target="_blank">API</a> do senhor <a title="Joshua Flanagan" href="http://flimflan.com/blog/default.aspx" target="_blank">Joshua Flanagan</a>, pois acredito que ao utilizarmos a abordagem fluente, devemos valorizar a maneira  como escreveríamos em uma língua (português/inglês) e não como é a sintaxe de uma determinada linguagem (de programação).</p>
<p><strong>Delimitadores</strong></p>
<p>Uma ocorrência constante (inclusive citado no <a title="artigo" href="http://martinfowler.com/bliki/ComposedRegex.html" target="_blank">artigo</a> do <a title="Martin Fowler" href="http://www.martinfowler.com/" target="_blank">Martin Fowler</a>) é a utilização de delimitadores para separarmos os dados em Strings (tokens). São exemplos disto, os arquivos CSV (valores separados por vírgula) e também a data do exemplo anterior (separados por barra &#8220;/&#8221;). Desta forma, seria conveniente se pudessemos configurar a API para interpretar delimitadores. A seguir, demostro um exemplo de como isto poderia ser feito:</p>
<p><strong>Expressão Regular:</strong> \\d{2}/\\d{2}/\\d{4}</p>
<p><strong>Português estruturado:</strong> A String em questão: Inicia com dois dígitos (numéricos), seguido de dois dígitos (numéricos), finaliza com quatro dígitos (númericos) e é delimitada por uma barra.</p>
<p><strong>Código Java:</strong></p>
<pre class="prettyprint">RegexComposer composer = RegexComposer.getInstance();
composer
    .startsWith(exactly(2, digit()))
    .followedBy(exactly(2, digit()))
    .finishedWith(exactly(4, digit()))
    .delimitedBy(exactly(1, literal("/")));</pre>
<p>Tá começando a melhorar, mas existe um recurso muito importante que deve ser considerado, os agrupamentos.</p>
<p><strong>Agrupamentos</strong></p>
<p>Os agrupamentos em Java são efetuados através inserção da expressão em parênteses, isto possibilita recuperar a String de determinado grupo uma vez que foi validado que a String se encontra no padrão requerido. A seguir demonstro uma maneira que, inicialmente, acreditei ser adequada para este fim.</p>
<p>Imagine que, após validar uma determinada data, você queira recuperar o dia, mês e ano separadamente para efetuar alguma lógica, então, teríamos algo como:</p>
<p><strong>Expressão Regular: </strong>(\\d{2})/(\\d{2})/(\\d{4})</p>
<p><strong>Português estruturado:</strong> A String em questão: Inicia com dois dígitos (numéricos) <strong>agrupados</strong>, seguido de dois dígitos (numéricos) <strong>agrupados</strong>, finaliza com quatro dígitos (númericos) <strong>agrupados</strong> e é delimitada por uma barra.</p>
<p><strong>Código Java:</strong></p>
<pre class="prettyprint">RegexComposer composer = RegexComposer.getInstance();

Pattern p = composer
                 .startsWith(exactly(2, digit()).<strong>grouped()</strong>)
                 .followedBy(exactly(2, digit())<strong>.grouped()</strong>)
                 .finishedWith(exactly(4, digit())<strong>.grouped()</strong>)
                 .delimitedBy(exactly(1, literal("/")))
                 .compile();

Matcher matcher = p.matcher("05/01/1979");

if(matcher.matches()) {

    System.out.println("Dia: " + matcher.group(1));
    System.out.println("Mes: " + matcher.group(2));
    System.out.println("Ano: " + matcher.group(3));

} else {

     System.out.println("Formato invalido");

}</pre>
<p>Legal, ao menos à primeira vista, entretanto eu ainda precisaria saber em qual grupo está o dia (matcher.group(1)), o mês (matcher.group(2)) e o ano (matcher.group(3)) e isto não é muito bacana. Creio que o ideal seria criarmos um alias para cada grupo e depois recuperarmos o número do grupo através do alias. Seria algo como <strong>.startsWith(exactly(2, digit()).grouped(usingAlias(&#8221;dia&#8221;)))</strong> e depois recuperarmos o grupo usando <strong>matcher.group(composer.getAliasGroup(&#8221;dia&#8221;))</strong>. Uma outra questão é que há outra interpretação para expressões agrupadas, por exemplo, &#8220;A String em questão: Inicia com<strong> um grupo</strong> de dois dígitos &#8230;&#8221;. Isto quer dizer que escreveriamos algo como: <strong>.startsWith(groupOf(exactly(2, digit())).usingAlias(&#8221;dia&#8221;))</strong>.</p>
<p>Embora eu considere estas opções adequadas, não escrevi nada disso ainda. No exemplo, a seguir, irei demonstrar um pouco mais de detalhes do que já implementei.</p>
<p><strong>Exemplo prático</strong></p>
<p>Utilizando o exemplo que o <a title="Martin Fowler" href="http://www.martinfowler.com/" target="_blank">Martin Fowler</a> deu em seu <a title="artigo" href="http://martinfowler.com/bliki/ComposedRegex.html" target="_blank">artigo</a>, irei validar se a String <strong>&#8220;score 400 for 2 nights at Minas Tirith Airport&#8221;</strong> se encontra no padrão correto e ,após isto, recuperar os números 400 e 2.</p>
<p><strong>Código Java:</strong></p>
<pre class="prettyprint">import br.com.submundojava.regexcomposer.RegexComposer;
import static br.com.submundojava.regexcomposer.quantifier.Quantifiers.*;
import static br.com.submundojava.regexcomposer.value.MetaCharacters.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 *
 * @author Henrique Lima
 */
public class Test {

    public static void main(String argz[]) {

        RegexComposer composer = RegexComposer.getInstance();

        Pattern pattern = composer
                        .startsWith(exactly(1, literal("score")))
                        .followedBy(oneOrMore(digit()).grouped())
                        .followedBy(exactly(1, literal("for")))
                        .followedBy(oneOrMore(digit()).grouped())
                        .followedBy(exactly(1, literal("night")))
                        .followedBy(zeroOrOne(literal("s")))
                        .followedBy(exactly(1, literal("at")))
                        .delimitedBy(zeroOrMore(whiteSpace()))
                        .finishedWith(oneOrMore(any()))
                        .compile();

        Matcher matcher = pattern.matcher("score 400 for 2 nights at Minas Tirith Airport");

        if (matcher.matches()) {

            System.out.println(matcher.group(1));
            System.out.println(matcher.group(2));

        } else {
            System.out.println("Formato inválido");
        }

    }

}</pre>
<p>Muito simples! Veja que não utilizamos nenhum metacaracter, nenhum quantificador, agrupamos os dados necessários e ainda utilizamos um delimitador. Uma pessoa nem precisaria conhecer de expressões regulares para validar a String (embora seja desejável).</p>
<p>Perceba que novas coisas aconteceram e utilizamos <strong>import static</strong> do Java 5 para disponibilizarmos os métodos necessários à nossa classe. Além disso, utilizamos novos métodos quantificadores (não regex) que são: <strong>zeroOrMore</strong>(), para zero ou mais ocorrências (análogo a *), <strong>oneOrMore</strong>(), para uma ou mais ocorrências (análogo a +), <strong>zeroOrOne</strong>() para zero ou uma ocorrência (análogo a ?) e por final utilizamos o método <strong>compile()</strong> para obtermos um objeto do tipo <strong>java.util.regex.Pattern</strong> para podermos validar a String.</p>
<p><strong>Código fonte</strong></p>
<p>Abaixo segue o projeto que criei para efetuar este post.</p>
<p>Para netbeans: <a title="download" href="http://www.submundojava.com.br/henrique/regular-expression-composer-netbeans.zip" target="_blank">download</a><br />
Para eclipse: <a title="download" href="http://www.submundojava.com.br/henrique/regular-expression-composer-eclipse.zip" target="_blank">download</a></p>
<p><strong>Considerações Finais</strong></p>
<p>Procurei demonstrar uma maneira fluente de trabalhar com expressões regulares, abstraindo seus recursos e disponibilizando métodos de alto nível. O exemplo que escrevi ainda está muito &#8220;verde&#8221;, com nomes esquisitos para algumas classes, métodos e pacotes. Na verdade, em alguns casos, nem sei se o inglês está correto.</p>
<p>Além disso, existem muitas limitações, por exemplo, se eu quiser usar um delimitador e ao mesmo tempo validar um dos tokens com um outro RegexComposer, não é possível. Seria desejável poder aninhar RegexComposer&#8217;s para este fim. Outro detalhe é que os métodos da classe RegexComposer recebem sempre uma instância de Quantifier e deveriam receber uma instância de uma classe com um nome mais adequado, como Expression ou ExpressionGroup. Detalhes a serem resolvidos.</p>
<p>Aguardo seus comentários e quem quiser entrar em contato, meu twitter é <a title="hgflima" href="http://twitter.com/hgflima" target="_blank">hgflima</a></p>
<p>Um abraço.</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2009/07/26/fluent-regex-composer/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Arquiteto de Software não é brinquedo!</title>
		<link>http://submundojava.com.br/wordpress/2009/02/09/arquiteto-de-software-nao-e-brinquedo/</link>
		<comments>http://submundojava.com.br/wordpress/2009/02/09/arquiteto-de-software-nao-e-brinquedo/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 20:34:08 +0000</pubDate>
		<dc:creator>paulo.sales</dc:creator>
		
		<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/?p=25</guid>
		<description><![CDATA[É incrível como algumas empresas tratam o arquiteto de software
como se fosse o brinquedo da vez. Lembra quando éramos pequenos e
existia aquele brinquedo especial que todos queríamos ter e quem o tinha
era visto como um ídolo diante a criançada. Pois bem, as empresas fazem
o mesmo com o arquiteto de software!
Pense na definição da profissão &#8220;Arquiteto [...]]]></description>
			<content:encoded><![CDATA[<p>É incrível como algumas empresas tratam o arquiteto de software<br />
como se fosse o brinquedo da vez. Lembra quando éramos pequenos e<br />
existia aquele brinquedo especial que todos queríamos ter e quem o tinha<br />
era visto como um ídolo diante a criançada. Pois bem, as empresas fazem<br />
o mesmo com o arquiteto de software!</p>
<p>Pense na definição da profissão &#8220;Arquiteto de Software&#8221;,<br />
uma das muitas definições existentes segue abaixo:</p>
<p>“A arquitetura de um software é a estrutura ou estruturas do<br />
sistema, o que compreende componentes de software, propriedades<br />
desses componentes que são visíveis externamente e o relacionamento<br />
entre eles”, Paul Clements, SEI.</p>
<p>Muitas vezes os profissionais que trabalham nessa profissão<br />
não realizam exatamente o que devem, mas<br />
a empresa se enaltece por ter um arquiteto de software envolvido em um de seus projeto.</p>
<p>O papel de um arquiteto de software é equiparado ao papel de um gerente de projetos,<br />
onde um gerência a tecnologia aplicada e o outro gerência pessoas. Portanto, temos que o<br />
fracasso de um projeto por causa de uma má gestão pessoal é culpa do gerente de projetos e<br />
o fracasso de um projeto por causa de um problema técnico é culpa do arquiteto de software.</p>
<p>Ao desenvolvermos um software para um cliente temos que seguir uma lista de requisitos<br />
que são eles funcionais e não-funcionais. Os requisitos funcionais estão quase sempre relacionados<br />
ao negócio da empresa, como exemplo &#8220;Realizar pedido&#8221;. Já os requisitos não-funcionais estão<br />
relacionados com performance, disponibilidade, interroperabilidade, escalabilidade,<br />
segurança, performance, usabilidade, etc. São inúmeros os requisitos não-funcionais e<br />
às vezes são desprezados por muitos, principalmente o gerente de projeto. O gerente de projetos<br />
quer ver o pedido sendo realizado e o dinheiro entrando na conta da empresa e na dele,<br />
mas temos um enorme problema nisso! Ao ignorarmos os requisitos não-funcionais, que nunca são poucos,<br />
estamos escondendo o sol com a peneira e esperando para ficar cegos.</p>
<p>O papel do arquiteto de software deve ser de não permitir que os requisitos não-funcionais<br />
sejam ignorados e nem tão pouco deixados para última hora. Muitos requisitos não-funcionais podem<br />
interferir diretamente em um requisito funcional. O Arquiteto deve entender e compreender os<br />
requisitos não-funcionais e propor soluções para resolvê-los. Mas isso não é o que acontece nas<br />
empresas por ai.</p>
<p>Primeiro, para a maioria das empresas é inaceitável o arquiteto de software ter o mesmo<br />
nível que um gerente de projeto. Segundo, nunca um arquiteto de software tem voz ativa<br />
diante uma equipe de desenvolvedores que estão acostumados a fazer telas em linha de produção.</p>
<p>Por isso um arquiteto de software não é um super brinquedo que somente serve para<br />
se exibir e que com o tempo perde a utilidade. Um arquiteto de software é o ícone muito influente<br />
no ciclo de vida de um projeto e é dever dele garantir que o software funcione desde o<br />
início de sua vida em um ambiente de produção.</p>
<p>O link de referência citado abaixo tem uma ótima descrição do papel de um arquiteto, todas<br />
as empresas deveriam ler e seguir este documento, assim teríamos software funcionando!</p>
<p>http://www.wthreex.com/rup/process/workers/wk_archt.htm</p>
<p><strong>Links relacionados:</strong></p>
<p>http://pt.wikipedia.org/wiki/Arquitetura_de_software</p>
<p>http://www.marcomendes.com/ArquivosBlogIntroducaoArquiteturaSoftware.pdf</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2009/02/09/arquiteto-de-software-nao-e-brinquedo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quando o ócio não é culpa do time!</title>
		<link>http://submundojava.com.br/wordpress/2009/02/09/quando-o-ocio-nao-e-culpa-do-time/</link>
		<comments>http://submundojava.com.br/wordpress/2009/02/09/quando-o-ocio-nao-e-culpa-do-time/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 20:29:23 +0000</pubDate>
		<dc:creator>paulo.sales</dc:creator>
		
		<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/?p=19</guid>
		<description><![CDATA[Esta é uma das muitas situações que acontece dentro de um ambiente de trabalho, quando o ócio do time não é pura preguiça e sim ocasionado por outro problema. Um dos problemas que podem ocasionar eu vou explicar abaixo já que vivi uma situação destas.
Na informática, mais precisamente na área de desenvolvimento, trabalhamos focados em [...]]]></description>
			<content:encoded><![CDATA[<p>Esta é uma das muitas situações que acontece dentro de um ambiente de trabalho, quando o ócio do time não é pura preguiça e sim ocasionado por outro problema. Um dos problemas que podem ocasionar eu vou explicar abaixo já que vivi uma situação destas.</p>
<p>Na informática, mais precisamente na área de desenvolvimento, trabalhamos focados em objetivos e entregáveis bem definidos. Claro que sem uma meta bem estabelecida e tarefas bem planejadas não terá trabalho a ser entregue. Para mostrar o que estou tentando dizer vou usar como exemplo em cenário ágil.</p>
<p>Como a maioria deve saber o Product Owner com ajuda do time na metodologia Scrum deve lançar atividades que representam os requisitos de um projeto e priorizar cada um desses requisitos. Após o  Product Backlog ter sido analisado parte-se para os planejamentos das atividades e assim por diante.</p>
<p>Se o Product Backlog não foi bem analisado e bem priorizado o time acaba tendo muita dificuldade em realizar o planejamento das estórias e atividades. Portanto, durante o andamento da Sprint podemos perceber um aumento de atividades que não foram previstas com antecedência gerando uma certa insegurança para o time se realmente aquela estória ou mesmo requisito é necessário ou se deve realmente ser realizada da forma que foi planejado.</p>
<p>Isso faz com que o tempo gasto do time até descobrir que a Sprint deve ser cancelada por ter a meta alterada é uma perda para o andamento do projeto. E até o momento de decidir cancelar a Sprint o time detém seu tempo com várias discusões e elocubrações à respeito do real motivo de tudo estar indo para as cucuias. Isso ao olhar do Product Owner e/ou dos Stackholders aparente puro ócio do time. Como o conceito de &lt;em&gt;pronto&lt;/em&gt; não foi bem definido eles não visualizam os entregáveis no tempo em que imaginavam e culpam o time por divagar demais em idéias alheias.</p>
<p>Mas na verdade o time não tem culpa e não está ocioso, o time está correndo atrás para saber se realmente ocorreu um problema durante a Sprint para cancelar e começar novamente de maneira correta. Já que a metodologia ágil prega o princípio de &#8220;Quanto antes encontrarmos o problema mais rápido temos que discuti-lo&#8221;.</p>
<p>Isso pode ser ocasionado por falta de comunicação e entendimento do Scrum Master, time e Product Owner. Um gráfico que pode ser usado para perceber com rapidez que a sprint esta caminhando em direção a outra meta é o Burn-Up.</p>
<p>Por isso valorizem muito a comunicação e o bom entendimento dos requisitos que serão entregue. Acredite, quem não comunica, se estrumbica.</p>
<p><b>Referências:</b></p>
<ul>
<li>Tem um artigo bem direto quanto a utilização e alguns benefícios de utilizar o burn-up chart: <a href="http://niksilver.com/2008/01/19/burn-up-and-burn-down-charts/">Burn-up e Burn-Down.</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2009/02/09/quando-o-ocio-nao-e-culpa-do-time/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Arquivo eclipse.ini para evitar o tão odiado &#8220;java.lang.OutOfMemoryError: PermGen Space&#8221; Exception.</title>
		<link>http://submundojava.com.br/wordpress/2008/01/15/arquivo-eclipseini-para-evitar-o-tao-odiado-javalangoutofmemoryerror-permgen-space-exception/</link>
		<comments>http://submundojava.com.br/wordpress/2008/01/15/arquivo-eclipseini-para-evitar-o-tao-odiado-javalangoutofmemoryerror-permgen-space-exception/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 23:01:07 +0000</pubDate>
		<dc:creator>Henrique Lima</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/2008/01/15/arquivo-eclipseini-para-evitar-o-tao-odiado-javalangoutofmemoryerror-permgen-space-exception/</guid>
		<description><![CDATA[Na verdade, quero ser breve neste POST. A questão é que ontem comecei a escrever um novo POST e precisei instalar o eclipse numa máquina antiga e depois de alguns minutos trabalhando lentamente o tão temido &#8220;permgen&#8221; (para os íntimos) apareceu. Toda vez que isso aconteceu eu preciso entrar no google e lembrar dos valores [...]]]></description>
			<content:encoded><![CDATA[<p>Na verdade, quero ser breve neste POST. A questão é que ontem comecei a escrever um novo POST e precisei instalar o eclipse numa máquina antiga e depois de alguns minutos trabalhando lentamente o tão temido &#8220;permgen&#8221; (para os íntimos) apareceu. Toda vez que isso aconteceu eu preciso entrar no google e lembrar dos valores que eu utilizava para a minha máquina. Segue abaixo o meu eclipse.ini.</p>
<pre class="prettyprint">
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms128m
-Xmx512m
-XX:MaxPermSize=128m
</pre>
<p>E se por um acaso alguém quiser saber mais detalhes sobre este problema, recomendo a leitura do POST <a href="http://xlml.com/aehso/2007/04/05/the-dreaded-javalangoutofmemoryerror-permgen-space-exception/" title="dreaded “java.lang.OutOfMemoryError: PermGen space” error" target="_blank" id="o7z5">dreaded “java.lang.OutOfMemoryError: PermGen space” error</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2008/01/15/arquivo-eclipseini-para-evitar-o-tao-odiado-javalangoutofmemoryerror-permgen-space-exception/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JBoss RichFaces 3.1.3 está nas ruas!</title>
		<link>http://submundojava.com.br/wordpress/2007/12/18/jboss-richfaces-313-esta-nas-ruas/</link>
		<comments>http://submundojava.com.br/wordpress/2007/12/18/jboss-richfaces-313-esta-nas-ruas/#comments</comments>
		<pubDate>Tue, 18 Dec 2007 17:45:04 +0000</pubDate>
		<dc:creator>Henrique Lima</dc:creator>
		
		<category><![CDATA[Java Server Faces]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/2007/12/18/jboss-richfaces-313-esta-nas-ruas/</guid>
		<description><![CDATA[Foi liberado ontem (17/12/2007) mais uma nova versão do conjunto de componentes para JSF conhecido como JBoss RichFaces. Nesta nova versão foram corrigidos dezenas de bugs, aperfeiçoados alguns componentes, atualizados os frameworks Prototype e script.aculo.us(para 1.6.0 e 1.8.0 respectivamente), além da adição de 4 novos componentes: Ordering List, List Shuttle, Component Control e Context Menu. [...]]]></description>
			<content:encoded><![CDATA[<p>Foi liberado ontem (17/12/2007) mais uma nova versão do conjunto de componentes para JSF conhecido como JBoss RichFaces. Nesta nova versão foram corrigidos dezenas de bugs, aperfeiçoados alguns componentes, atualizados os frameworks Prototype e script.aculo.us(para 1.6.0 e 1.8.0 respectivamente), além da adição de 4 novos componentes: Ordering List, List Shuttle, Component Control e Context Menu. Para mais informações sobre as novidades desta versão leia o <a href="http://labs.jboss.com/wiki/RichFacesWhatIsNewIn3_1_3" title="JBoss RichFaces 3.1.3 WhatsNew" target="_blank" id="q_km">WhatsNew</a>. Faça download dos fontes, binários e documentação na <a href="http://labs.jboss.com/jbossrichfaces/" title="JBoss RichFaces - Página Oficial" target="_blank" id="aula">página oficinal</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2007/12/18/jboss-richfaces-313-esta-nas-ruas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Criando aplicações Ajax, sem Javascript, utilizando Java Server Faces 1.2 e RichFaces</title>
		<link>http://submundojava.com.br/wordpress/2007/12/17/criando-aplicacoes-ajax-sem-javascript-utilizando-java-server-faces-12-e-richfaces/</link>
		<comments>http://submundojava.com.br/wordpress/2007/12/17/criando-aplicacoes-ajax-sem-javascript-utilizando-java-server-faces-12-e-richfaces/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 13:51:14 +0000</pubDate>
		<dc:creator>Henrique Lima</dc:creator>
		
		<category><![CDATA[Java Server Faces]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/2007/12/17/criando-aplicacoes-ajax-sem-javascript-utilizando-java-server-faces-12-e-richfaces/</guid>
		<description><![CDATA[
Introdução
Dando continuidade ao meu último POST, estarei apresentando uma maneira simples de trabalhar com Ajax utilizando componentes JSF.
As aplicações que usufruem de recursos Ajax têm evoluído de diversas maneiras nos últimos tempos e um dos aspectos importantes é a produtividade. Quando iniciei os meus estudos sobre Ajax, era necessário escrever uma quantidade significativa de código [...]]]></description>
			<content:encoded><![CDATA[<p><strong><br />
Introdução</strong></p>
<p>Dando continuidade ao meu último POST, estarei apresentando uma maneira simples de trabalhar com Ajax utilizando componentes JSF.<br />
As aplicações que usufruem de recursos Ajax têm evoluído de diversas maneiras nos últimos tempos e um dos aspectos importantes é a produtividade. Quando iniciei os meus estudos sobre Ajax, era necessário escrever uma quantidade significativa de código javascript, manipulando o objeto XmlHttpRequest diretamente, além de uma porção adicional de código em alguma linguagem server side (para gerar XML dinamicamente). Depois de um certo tempo vieram os frameworks javascript que diminuiram a quantidade de código a ser escrito e atualmente é possível desenvolver aplicações inteiras sem utilizar nenhum código javascript, através dos componentes do RichFaces (entre outros).<br />
<br style="font-weight: bold" /><strong>Requisitos</strong></p>
<p>Antes de seguir os passos aqui descritos, é recomendável  que você leia o POST <a href="http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/" title="Java Server Faces 1.2 Hello World" target="_blank" id="c:o:">Java Server Faces 1.2 Hello World</a> ou tenha conhecimentos compatíveis.</p>
<p><strong>Configurando o ambiente</strong></p>
<p>Para rodar aplicações Java Server Faces 1.2 é necessário um container que implemente a especificação da JSP 2.1. Para este tutorial iremos utilizar o container Tomcat 6.0.<strong><br />
Download:</strong> <a href="http://tomcat.apache.org/download-60.cgi">http://tomcat.apache.org/download-60.cgi</a></p>
<p>Além dos jars para rodar o Java Server Faces 1.2 serão necessários mais 3 jars do RichFaces. Quando este POST foi escrito a versão mais recente do RichFaces era a 3.1.2. Desta forma, os nomes dos jars são: richfaces-api-3.1.2.GA.jar,  richfaces-impl-3.1.2.GA.jar e richfaces-ui-3.1.2.GA.jar e se encontram dentro da pasta lib do arquivo disponível para download.<br />
<strong>Download:</strong> <a href="http://labs.jboss.com/jbossrichfaces/downloads/" title="http://labs.jboss.com/jbossrichfaces/downloads/" target="_blank" id="rdrb">http://labs.jboss.com/jbossrichfaces/downloads/</a></p>
<p>Para configurar o RichFaces serão necessárias algumas pequenas modificações no <strong>web.xml</strong> demonstrado no POST <a href="http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/" title="Java Server Faces 1.2 Hello World" target="_blank" id="c:o:">Java Server Faces 1.2 Hello World</a>. A listagem 1 apresenta o código completo do novo<strong> web.xml</strong>.</p>
<p><strong>Listagem 1</strong></p>
<pre class="prettyprint">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/webapp_2_5.xsd"&gt;
&lt;display-name&gt;JSFAjax&lt;/display-name&gt;

	&lt;context-param&gt;
		&lt;param-name&gt;com.sun.faces.verifyObjects&lt;/param-name&gt;
		&lt;param-value&gt;true&lt;/param-value&gt;
	&lt;/context-param&gt;

	&lt;context-param&gt;
		&lt;param-name&gt;com.sun.faces.validateXml&lt;/param-name&gt;
		&lt;param-value&gt;true&lt;/param-value&gt;
	&lt;/context-param&gt;

	&lt;context-param&gt;
		&lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;
		&lt;param-value&gt;clien+t&lt;/param-value&gt;
	&lt;/context-param&gt;

	&lt;context-param&gt;
		&lt;param-name&gt;org.richfaces.SKIN&lt;/param-name&gt;
		&lt;param-value&gt;blueSky&lt;/param-value&gt;
	&lt;/context-param&gt;

	&lt;filter&gt;
		&lt;display-name&gt;RichFaces Filter&lt;/display-name&gt;
		&lt;filter-name&gt;richfaces&lt;/filter-name&gt;
		&lt;filter-class&gt;org.ajax4jsf.Filter&lt;/filter-class&gt;
	&lt;/filter&gt;

	&lt;filter-mapping&gt;
		&lt;filter-name&gt;richfaces&lt;/filter-name&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
		&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
		&lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
	&lt;/filter-mapping&gt;

	&lt;servlet&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
		&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
	&lt;/servlet&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

	&lt;welcome-file-list&gt;
		&lt;welcome-file&gt;faces/index.jsp&lt;/welcome-file&gt;
	&lt;/welcome-file-list&gt;

&lt;/web-app&gt;</pre>
<p>Um novo parâmetro de contexto foi adicionado para configurar qual skin o RichFaces irá utilizar. Por padrão, podem ser utilizados 8 valores: DEFAULT, plain, emeraldTown, blueSky, wine, japanCherry, ruby, classic e deepMarine. É possível criar novas skins e modificar os estilos dos componentes através de CSS, entretanto,  este assunto será abordado em uma outra oportunidade.<br />
Para utilizar o restante dos recursos do RichFaces o filtro <strong>org.ajax4jsf.Filter </strong>deverá ser configurado. Existem algumas opções de configuração e até diferentes tipos de configurações para um grupo de páginas. Para maiores detalhes sobre  configurações dos filtros do RichFaces utilize a <a href="http://labs.jboss.com/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/ArchitectureOverview.html#FilterConfiguration" title="seção 5.5 - Filter Configuration" target="_blank" id="yp8d">seção 5.5 - Filter Configuration</a> da documentação.</p>
<p><strong>Criando o javabean</strong></p>
<p>Utilizaremos um simples javabean para efetuarmos um CRUD. Na listagem 2 será apresentado a classe Contato.java que deverá ser criada no pacote <strong>br.com.jsfajax.entity.</strong></p>
<p><strong>Listagem 2</strong></p>
<pre class="prettyprint" id="java">
package br.com.jsfajax.entity;

import java.util.Date;

public class Contato {

	private String nome;
	private Date dataNascimento;
	private String email;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}</pre>
<p><strong><br />
Criando o Bean Gerenciado (Managed Bean ou Backing Bean)</strong></p>
<p>Crie no pacote <strong>br.com.jsfajax.web.mbean</strong> o arquivo <strong>ContatoManager.java</strong> conforme demostra a listagem 3.</p>
<p><strong>Listagem 3</strong></p>
<pre class="prettyprint" id="java">
package br.com.jsfajax.web.mbean;

import br.com.jsfajax.entity.Contato;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

public class ContatoManager {

	private Contato contato;
	private List&lt;Contato&gt; contatos;
	private DataModel contatosData;

	public ContatoManager() {

		contato = new Contato();
		contatos = new ArrayList&lt;Contato&gt;();
		contatosData = new ListDataModel(contatos);

	}

	public Contato getContato() {
		return contato;
	}

	public void setContato(Contato contato) {
		this.contato = contato;
	}

	public List&lt;Contato&gt; getContatos() {
		return contatos;
	}

	public void setContatos(List&lt;Contato&gt; contatos) {
		this.contatos = contatos;
	}

	public DataModel getContatosData() {
		return contatosData;
	}

	public void setContatosData(DataModel contatosData) {
		this.contatosData = contatosData;
	}

	public void salvar(ActionEvent e) {

		// Se o contato já existia antes na lista de contatos, atualiza os dados. Do contrário adiciona.
		if(contatos.contains(contato))
			contatos.set(contatos.lastIndexOf(contato), contato);
		else
			contatos.add(contato);

		// Zera o contato para que os campos do formulário sejam limpos.
		contato = new Contato();

		// Cria uma nova mensagem de informação para o JSF
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Contato adicionado com sucesso!",
							"Contato adicionado com sucesso!");

		// Adiciona a mensagem ao formulário de cadastro
		FacesContext.getCurrentInstance().addMessage("formularioCadastro", message);

	}

	public void deletar(ActionEvent e) {
		contatos.remove((Contato)contatosData.getRowData());
	}

	public void editar(ActionEvent e) {
		contato = (Contato)contatosData.getRowData();
	}

	public boolean isRendered() {
		return !contatos.isEmpty();
	}

}</pre>
<p><strong><br />
Configurando o Bean Gerenciado no faces-config.xml<br />
</strong><br />
Adicione ao <strong>faces-config.xml</strong> o código conforme demonstra a listagem 4:</p>
<p><strong>Listagem 4</strong></p>
<pre class="prettyprint">
&lt;managed-bean&gt;
	&lt;managed-bean-name&gt;contatoManager&lt;/managed-bean-name&gt;
	&lt;managed-bean-class&gt;br.com.jsfajax.web.mbean.ContatoManager&lt;/managed-bean-class&gt;
	&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;
&lt;/managed-bean&gt;</pre>
<p><strong><br />
Criando a página JSP </strong></p>
<p>Crie um arquivo chamado <strong>index.jsp</strong>,  no diretório <strong>WEB-INF/</strong> de sua aplicação WEB, com o conteúdo demonstrado na listagem 5.</p>
<p><strong>Listagem 5</strong></p>
<pre class="prettyprint">
&lt;%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%&gt;
&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%&gt;
&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%&gt;
&lt;%@ taglib uri="http://richfaces.org/rich" prefix="rich"%&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;
		&lt;title&gt;Contato CRUD&lt;/title&gt;
	&lt;/head&gt;
	&lt;body&gt;
	&lt;f:view&gt;
          &lt;h:form id="formularioCadastro"&gt;
         	&lt;rich:panel id="cadastro" header="Cadastro de Contatos"&gt;
         		Nome:
         		&lt;h:inputText value="#{contatoManager.contato.nome}" id="nome" required="true"
				requiredMessage="Digite o nome corretamente!"/&gt; &lt;br /&gt;
         		Data Nascimento (dd/mm/aaaaa):
         		&lt;h:inputText value="#{contatoManager.contato.dataNascimento}" id="dataNascimento"
				required="true" requiredMessage="Digite a data de nascimento!"
				converterMessage="Digite a data de nascimento no formato correto!"&gt;
         			&lt;f:convertDateTime pattern="dd/MM/yyyy"  /&gt;
         		&lt;/h:inputText&gt; &lt;br /&gt;
         		E-mail:
			&lt;h:inputText value="#{contatoManager.contato.email}" id="email" required="true"
				requiredMessage="Digite o e-mail corretamente!"/&gt; &lt;br /&gt;
         		&lt;a4j:commandButton value="Salvar"  actionListener="#{contatoManager.salvar}"
				reRender="cadastro,formularioLista" /&gt;&lt;br /&gt;&lt;br /&gt;
         		&lt;h:messages errorStyle="color:red" infoStyle="color:#5ac67e"  /&gt;
         	&lt;/rich:panel&gt;
           &lt;/h:form&gt;
           &lt;h:form id="formularioLista"&gt;
           	&lt;rich:dataTable value="#{contatoManager.contatosData}" var="contato"
			id="listaContatos" rendered="#{contatoManager.rendered}"&gt;
           		&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Nome" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText value="#{contato.nome}"/&gt;
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Data Nascimento" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText value="#{contato.dataNascimento}"&gt;
					&lt;f:convertDateTime pattern="dd/MM/yyyy"/&gt;
				&lt;/h:outputText&gt;
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="E-mail" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText value="#{contato.email}"/&gt;
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Editar" /&gt;
				&lt;/f:facet&gt;
				&lt;a4j:commandLink value="Editar"
					actionListener="#{contatoManager.editar}" reRender="cadastro"/&gt;
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Deletar" /&gt;
				&lt;/f:facet&gt;
				&lt;a4j:commandLink value="Deletar"
					actionListener="#{contatoManager.deletar}" reRender="listaContatos"/&gt;
			&lt;/h:column&gt;
           	&lt;/rich:dataTable&gt;
           &lt;/h:form&gt;
        &lt;/f:view&gt;
     	&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Conforme demonstrado na listagem 5, serão utilizadas mais duas taglibs responsáveis pelas funcionalidades Ajax,  <strong>http://richfaces.org/a4j</strong> representada pelo apelido <strong>a4j</strong> e <strong>http://richfaces.org/rich </strong>representada pelo apelido <strong>rich</strong>.<br />
Foram utilizados 2 formulários pois todo formulário com campos cujo atributo <strong>required</strong> possua o valor <strong>true </strong>só pode ser submetido se tais campos estiverem preenchidos. Desta forma, se os botões de editar e deletar (quando em um mesmo form) forem acionados e os campos (com required=true) estiverem vazios uma mensagem de erro será apresentada.<br />
O atributo <span style="font-weight: bold">requiredMessage</span> do componente <span style="font-weight: bold">h:inputText </span>é utilizado para configurar a mensagem de erro a ser apresentada quando este campo não for preenchido e seu atributo <span style="font-weight: bold">required</span> possuir o valor <span style="font-weight: bold">true</span>.<br />
O converter <span style="font-weight: bold">f:converterDateTime </span>é utilizado para transformar a String digitada (no campo em que este converter for aplicado) em um objeto do tipo java.util.Date e vice-versa.<br />
O atributo <span style="font-weight: bold">converterMessage </span>do componente <span style="font-weight: bold">h:inputText </span>é utilizado para configurar a mensagem de erro a ser apresentada quando não for possível efetuar a conversão da String para o objeto java.util.Date ou vice-versa.<br />
Os componentes <span style="font-weight: bold">commandButton</span> e <span style="font-weight: bold">commandLink</span> do <span style="font-weight: bold">a4j </span>serão responsáveis por efetuar as chamadas assíncronas. No atributo <span style="font-weight: bold">actionListener</span> destes componentes é configurado qual método do managed bean será executado. No atributo <span style="font-weight: bold">reRender </span>será configurado quais componentes serão atualizados depois de ser executado o método do managed bean. Desta forma, quando o botão salvar for pressionado o método salvar do managed bean será  executado e o componente cujo ID é listaContatos será atualizado com um novo registro.<br />
O componente h:messages é reponsável por apresentar as mensagens adicionadas ao FacesContext através da classe FacesMessage.<br />
É possível customizar os estilos  CSS das mensagens em função do tipo de mensagem. Um FacesMessage pode ser classificada em 4 tipos:</p>
<ul>
<li><span style="font-weight: bold">FacesMessage.SEVERITY_ERROR</span> - Indica que um erro ocorreu.</li>
<li><span style="font-weight: bold">FacesMessage.SEVERITY_FATAL </span>-<span style="font-weight: bold"> </span>Indica que um erro grave ocorreu.</li>
<li><span style="font-weight: bold">FacesMessage.SEVERITY_INFO </span>- Mensagem com caráter informativo.</li>
<li><span style="font-weight: bold">FacesMessage.SEVERITY_WARN </span>-<span style="font-weight: bold"> </span>Indica que um erro pode ter acontecido.</li>
</ul>
<p>Para utilizar estilos de CSS diferente para cada tipo de mensagem existem atributos correspondentes no componente h:messages, são eles: errorClass, fatalClass, infoClass, warnClass, errorStyle, fatalStyle, infoStyle e warnStyle. Estes atributos são correspondentes aos atributos style e class dos componentes html.</p>
<p><span style="font-weight: bold">Considerações Finais</span></p>
<p>Através da utilização de componentes JSF é possível ganhar produtividade, diminuindo a quantidade de código e, na maioria das vezes, ganhar performance. Entretanto, em muitas situações isto não ocorre, devido a grande quantidade de chamadas assíncronas, consultas à base de dados desnecessárias, utilização indevida de session entre outros fatores. Em uma próxima oportunidade darei continuidade a este POST adicionando recursos da Java Persistence API e mostrando como otimizar o desempenho desta pequena aplicação.</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2007/12/17/criando-aplicacoes-ajax-sem-javascript-utilizando-java-server-faces-12-e-richfaces/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java Server Faces 1.2 Hello World</title>
		<link>http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/</link>
		<comments>http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/#comments</comments>
		<pubDate>Mon, 27 Aug 2007 17:51:10 +0000</pubDate>
		<dc:creator>Henrique Lima</dc:creator>
		
		<category><![CDATA[Java Server Faces]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/</guid>
		<description><![CDATA[ Requisitos
Será necessário o conhecimento dos seguintes itens para a criarmos nosso primeiro exemplo:

Nível básico de conhecimento de orientação a objetos utilizando Java.
Nível básico de conhecimento na criação de aplicações WEB utilizando Tomcat, de preferência versão 6.0.
Manipulação de bibliotecas jar. (Utilizando IDE ou não).
Nível básico de conhecimento de HTML e XML.

Configurando o ambiente
Para rodar aplicações [...]]]></description>
			<content:encoded><![CDATA[<p><strong> Requisitos</strong></p>
<p>Será necessário o conhecimento dos seguintes itens para a criarmos nosso primeiro exemplo:</p>
<ol>
<li>Nível básico de conhecimento de orientação a objetos utilizando Java.</li>
<li>Nível básico de conhecimento na criação de aplicações WEB utilizando Tomcat, de preferência versão 6.0.</li>
<li>Manipulação de bibliotecas jar. (Utilizando IDE ou não).</li>
<li>Nível básico de conhecimento de HTML e XML.</li>
</ol>
<p><strong>Configurando o ambiente</strong></p>
<p>Para rodar aplicações Java Server Faces 1.2 é necessário um container que implemente a especificação da JSP 2.1.</p>
<p>Para este tutorial iremos utilizar o container Tomcat 6.0.<strong><br />
Download:</strong> <a href="http://tomcat.apache.org/download-60.cgi">http://tomcat.apache.org/download-60.cgi</a></p>
<p>Serão necessários 8 arquivos jars que devem estar no classpath ou no diretorio WEB-INF/lib de sua aplicação WEB, são eles:</p>
<ul>
<li> 	  <strong>jsf-api.jar e jsf-impl.jar</strong><br />
<strong>Download:</strong> <a href="https://javaserverfaces.dev.java.net/download.html">https://javaserverfaces.dev.java.net/download.html</a></li>
<li> <strong>commons-beanutils.jar</strong><br />
<strong>Download:</strong> <a href="http://commons.apache.org/downloads/download_beanutils.cgi">http://commons.apache.org/downloads/download_beanutils.cgi</a></li>
<li> 		<strong>commons-colletions.jar<br />
Download:</strong> <a href="http://commons.apache.org/downloads/download_collections.cgi">http://commons.apache.org/downloads/download_collections.cgi  </a></li>
<li> 		<strong>commons-logging.jar<br />
Download:</strong> <a href="http://commons.apache.org/downloads/download_logging.cgi">http://commons.apache.org/downloads/download_logging.cgi  </a></li>
<li> 		<strong>commons-diggester.jar</strong><br />
<strong>Download:</strong> <a href="http://commons.apache.org/downloads/download_digester.cgi">http://commons.apache.org/downloads/download_digester.cgi  </a></li>
<li> 		<strong>jstl.jar e standard.jar (Standard Taglib)</strong><br />
<strong>Download:</strong> <a href="http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi">http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi  </a></li>
</ul>
<p>Para que o Java Server Faces funcione adequadamente se faz necessário a configuração do Faces Servlet para que este<br />
atenda às requisições das páginas JSF. A Listagem 1 mostra um exemplo de configuração do web.xml.</p>
<p><strong>Listagem 1</strong></p>
<pre class="prettyprint">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;web-app version="2.5"</pre>
<pre class="prettyprint">xmlns="http://java.sun.com/xml/ns/javaee"</pre>
<pre class="prettyprint">xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee</pre>
<pre class="prettyprint">http://java.sun.com/xml/ns/javaee/webapp_2_5.xsd"&gt;</pre>
<pre class="prettyprint">&lt;context-param&gt;</pre>
<pre class="prettyprint"> 	&lt;param-name&gt;com.sun.faces.verifyObjects&lt;/param-name&gt;

 	&lt;param-value&gt;true&lt;/param-value&gt;

&lt;/context-param&gt;

&lt;context-param&gt;

 	&lt;param-name&gt;com.sun.faces.validateXml&lt;/param-name&gt;

 	&lt;param-value&gt;true&lt;/param-value&gt;

&lt;/context-param&gt;

&lt;context-param&gt;

 	&lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;

 	&lt;param-value&gt;client&lt;/param-value&gt;

&lt;/context-param&gt;

&lt;servlet&gt;

&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;

&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;

&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;

&lt;/servlet&gt;

&lt;servlet-mapping&gt;

&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;

&lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;

&lt;/servlet-mapping&gt;

&lt;welcome-file-list&gt;

&lt;welcome-file&gt;faces/index.jsp&lt;/welcome-file&gt;

&lt;/welcome-file-list&gt;

&lt;/web-app&gt;</pre>
<p>Como pode-se observar foram configurados 3 parâmetros de contexto. A utilidade destes será descrita a seguir:</p>
<ul>
<li><strong>com.sun.faces.verifyObjects</strong><br />
Esta flag é configurada como true quando se quer que implementação do Java Server Faces verifique se os objetos da aplicação<br />
(conversores, etc) foram criados adequadamente. Seu valor padrão é false, por afetar a performance no início da execução<br />
da aplicação.</li>
<li><strong>com.sun.faces.validateXml</strong><br />
Esta flag é configurada como true quando se quer que a implementação do Java Server Faces verifique a integridade do arquivo<br />
faces-config.xml em função do seu DTD correspondente. Seu valor padrão é false.</li>
<li><strong>javax.faces.STATE_SAVING_METHOD</strong><br />
Esta flag é usada para configurar em que lado da aplicação o estado da “view” deve ser salvo.<br />
Existem 2 valores possíveis: server e client. Quando configurado como client o estado de toda camada de visão será renderizado<br />
em um campo hidden na página jsp. Seu valor padrão é server.</li>
</ul>
<p><strong>Criando o Bean Gerenciado (Managed Bean ou Backing Bean)</strong></p>
<p>O Bean Gerenciado é a camada de negócios das aplicações JSF. Sua principal função é compartilhar seus atributos e métodos<br />
com as páginas JSP. Cada campo de um formulário da página JSP é integrado com uma atributo e cada ação e/ou evento<br />
com um método do Bean Gerenciado, resultando numa ótima separação da camada de negócio da camada de visão. Crie no<br />
pacote <strong>br.com.jsftutorial</strong> o arquivo <strong>HelloWorldBean.java</strong> conforme demostra a listagem 2.</p>
<p><strong> Listagem 2</strong></p>
<pre class="prettyprint">
package br.com.jsftutorial;public class HelloWorldBean {private String nome;

public HelloWorldBean() {

}

public String getNome() {

return nome;

}

public void setNome(String nome) {

this.nome = nome;

}

public String acao() {

return "sucesso";

}

}</pre>
<p>Todo Bean Gerenciado deve possuir o construtor default (sem nenhum argumento), do contrário será lançado uma java.lang.InstantiationException.<br />
Todo atributo integrado à página JSP deverá possuir seus métodos setters e getters mesmo que seu modificador de visibilidade<br />
seja public, como por exemplo o atributo nome do HelloWorldBean.</p>
<p><strong>Configurando o Bean Gerenciado no faces-config.xml</strong></p>
<p>O arquivo faces-config.xml é o arquivo de configuração do Java Server Faces.<br />
Este arquivo deve estar na pasta WEB-INF/ de sua aplicação e contém entre outras configurações as declarações dos Beans Gerenciados que deverão ser instanciados pela<br />
implementação do JSF. Na listagem 3 é apresentado um modelo típico de configuração de um Bean Gerenciado.</p>
<p><strong>Listagem 3</strong></p>
<pre class="prettyprint">
&lt;?xml version='1.0' encoding='UTF-8'?&gt;</pre>
<pre class="prettyprint">&lt;faces-config version="1.2"</pre>
<pre class="prettyprint"> 	xmlns="http://java.sun.com/xml/ns/javaee"</pre>
<pre class="prettyprint"> 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee</pre>
<pre class="prettyprint"> 	http://java.sun.com/xml/ns/javaee/webfacesconfig_1_2.xsd"&gt;

&lt;managed-bean&gt;

&lt;managed-bean-name&gt;hwBean&lt;/managed-bean-name&gt;

&lt;managed-bean-class&gt;br.com.jsftutorial.HelloWorldBean&lt;/managed-bean-class&gt;

&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;

&lt;/managed-bean&gt;

&lt;/faces-config&gt;</pre>
<p>Entre as tags &lt;faces-config&gt; e &lt;/faces-config&gt; se localizam toda a configuração da aplicação JSF.<br />
A configuração necessária para um Bean Gerenciado é bem intuitiva, abaixo segue a descrição das tags utilizadas:</p>
<ul>
<li> 		<strong>managed-bean</strong><br />
Toda a configuração de um, e apenas um, Bean Gerenciado deve estar contido nesta tag.</li>
<li> 		<strong>managed-bean-name</strong><br />
Nome utilizado para referenciar o Bean Gerenciado nas páginas JSP.</li>
<li> 		<strong>managed-bean-class</strong><br />
O caminho completo para a classe que representa este Bean Gerenciado.</li>
<li> 		<strong>Managed-bean-scope</strong><br />
Indica de qual escopo (scope) este Bean Gerenciado será resgatado. Existem 4 tipos possíveis.</p>
<ul>
<li> 				<strong>none</strong><br />
Só poderá ser utilizado como propriedade de um outro managed bean.</li>
<li> 				<strong>request</strong><br />
Estará disponível através do request, ou seja, seu tempo de vida acaba após a submissão do formulário.</li>
<li> 			<strong>session</strong><br />
Estará disponível através da session, ou seja, seu tempo de vida é o mesmo que o tempo de vida da session configurada no web.xml.</li>
<li> 				<strong>application</strong><br />
Estará disponível através do objeto application, ou seja, seu tempo de vida é o mesmo da aplicação.</li>
</ul>
</li>
</ul>
<p>Existem outras tags que adicionam funcionalidades ao Bean Gerenciado, aconselho a utilizar o<br />
Java (TM) EE 5 tutorial capítulo 5 item Backing Beans que pode ser acessado<br />
através da url <a href="http://java.sun.com/javaee/5/docs/tutorial/doc/">http://java.sun.com/javaee/5/docs/tutorial/doc/</a>.</p>
<p><strong>Criando o index.jsp</strong></p>
<p>Crie a página index.jsp na pasta de arquivos WEB (mesma altura que WEB-INF/ e META-INF/) de sua aplicação com o conteúdo da Listagem 4.</p>
<p><strong>Listagem 4</strong></p>
<pre class="prettyprint">
&lt;%@page contentType="text/html"%&gt;&lt;%@page pageEncoding="UTF-8"%&gt;

&lt;%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%&gt;

&lt;%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%&gt;

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;

&lt;title&gt;Java Server Faces Tutorial&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;
<pre class="prettyprint">	&lt;f:view&gt;</pre>
<p>&lt;h:form id=&#8221;formulario&#8221;&gt;<br />
&lt;b&gt;Nome:&lt;/b&gt;<br />
&lt;h:inputText id=&#8221;nome&#8221; value=&#8221;#{hwBean.nome}&#8221; required=&#8221;true&#8221; requiredMessage=&#8221;O campo nome deve ser preenchido!&#8221;/&gt;<br />
&lt;h:commandButton value=&#8221;GO&#8221; action=&#8221;#{hwBean.acao}&#8221; /&gt;&lt;br&gt;<br />
&lt;h:message for=&#8221;nome&#8221; errorStyle=&#8221;color:red&#8221;/&gt;<br />
&lt;/h:form&gt;<br />
&lt;/f:view&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</pre>
<p>Nas linhas 3 e 4 temos as declarações das taglibs core e html do Java Server Faces que serão utilizadas para criarmos os<br />
componentes na página JSP.</p>
<p>A tag &lt;f:view&gt; deve conter os componentes JSF.</p>
<p>A tag &lt;h:form&gt; é análogo a tag &lt;form&gt; do html.</p>
<p>Através da tag &lt;h:inputText&gt; será criado um componente input do html e do tipo text (&lt;input type=”text”&gt;).<br />
O atributo value permite integrar o valor deste componente a uma propriedade do Managed Bean, ou seja, quando o formulário for<br />
submetido o valor deste componente será copiado para a propriedade “nome” do Managed Bean configurado no faces-config.xml<br />
cujo o nome foi configurado como hwBean (&lt;managedbean-name&gt;hwBean&lt;/managed-bean-name&gt;). O atributo<br />
required determina que o formulário não poderá ser submetido caso este campo não seja preenchido.<br />
O atributo requiredMessage determina a mensagem de erro que será apresentada caso, ao submeter o formulário, este componente não seja preenchido.</p>
<p>Através da tag &lt;h:commandButton&gt; será criado um componente button do html (&lt;input type=”button”&gt;).<br />
O atributo action determina o método do Managed Bean que será executado quando este botão for pressionado.</p>
<p>A tag &lt;h:message&gt; é um componente utilizado para apresentar as mensagens ao usuário. O atributo “for” deve ser<br />
preenchido com o id do componente que desejamos que esta mensagem seja integrada, ou seja, serão apresentadas as<br />
mensagens referentes apenas ao campo cujo o id é “nome” do formulário. O atributo errorStyle permite aplicarmos um estilo<br />
CSS ao componente quando a mensagem for de erro.</p>
<p><strong>Criando o resultado.jsp</strong></p>
<p>Crie a página resultado.jsp na pasta de arquivos WEB (mesma altura que WEB-INF/ e META-INF/) de sua aplicação com o conteúdo da Listagem 5.</p>
<p><strong>Listagem 5</strong></p>
<pre class="prettyprint">
&lt;%@page contentType="text/html"%&gt;&lt;%@page pageEncoding="UTF-8"%&gt;

&lt;%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%&gt;

&lt;%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%&gt;</pre>
<pre class="prettyprint">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd"&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;

&lt;title&gt;Java Server Faces Tutorial&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;f:view&gt;

Ola, &lt;h:outputText value="#{hwBean.nome}" /&gt;!

&lt;/f:view&gt;

&lt;/body&gt;

&lt;/html&gt;</pre>
<p><strong>Criando o fluxo do aplicativo</strong></p>
<p>Para determinarmos o fluxo do aplicativo adicionamos uma “navigation rule” ao faces-config.xml.<br />
Ao executarmos o método acao() do Managed Bean, a String “sucesso” será retornada e pela “navigation rule” determinamos que a página resultado.jsp<br />
deverá ser apresentada. A listagem 6 demonstra o conteúdo do faces-config.xml.</p>
<p><strong>Listagem 6</strong></p>
<pre class="prettyprint">
&lt;?xml version='1.0' encoding='UTF-8'?&gt;</pre>
<pre class="prettyprint">&lt;faces-config version="1.2"</pre>
<pre class="prettyprint">xmlns="http://java.sun.com/xml/ns/javaee"</pre>
<pre class="prettyprint">xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee</pre>
<pre class="prettyprint">http://java.sun.com/xml/ns/javaee/webfacesconfig_1_2.xsd"&gt;</pre>
<pre class="prettyprint"></pre>
<pre class="prettyprint">&lt;managed-bean&gt;

&lt;managed-bean-name&gt;hwBean&lt;/managed-bean-name&gt;

&lt;managed-bean-class&gt;br.com.jsftutorial.HelloWorldBean&lt;/managed-bean-class&gt;

&lt;managed-bean-scope&gt;none&lt;/managed-bean-scope&gt;

&lt;/managed-bean&gt;

&lt;navigation-rule&gt;

&lt;navigation-case&gt;

&lt;from-outcome&gt;sucesso&lt;/from-outcome&gt;

&lt;to-view-id&gt;/resultado.jsp&lt;/to-view-id&gt;

&lt;/navigation-case&gt;

&lt;/navigation-rule&gt;

&lt;/faces-config&gt;</pre>
<p>Após a submissão do formulário, a propriedade “nome” do Managed Bean terá o valor digitado no componente &lt;h:inputText&gt; do index.jsp,<br />
então a página resultado.jsp será apresentada (conforme configurado no faces-config.xml).<br />
Para testar a aplicação inicie o tomcat e acesse a url: http://localhost:8080/HelloJSF/faces/index.jsp</p>
<p><strong>Próximos Passos</strong></p>
<p>Existem ainda diversos recursos e componentes do JSF, aconselho a leitura da referência da API,<br />
acessando a url <a href="http://java.sun.com/javaee/javaserverfaces/reference/api/index.html">http://java.sun.com/javaee/javaserverfaces/reference/api/index.html</a>.<br />
Além disso, existem outras ótimas implementações que disponibilizam novos componentes e<br />
recursos como a utilização de Ajax e DOM na renderização das páginas. Recomendo o estudo do <a href="http://www.icefaces.org">IceFaces</a> e do <a href="http://www.icefaces.org">Ajax4Jsf</a>, ambos open source.</p>
<p><strong>Conclusão</strong></p>
<p>Apesar de muita discussão sobre a qualidade dos diversos frameworks open source do mercado, Java Server Faces se apresenta<br />
como uma ótima opção no desenvolvimento de interfaces para aplicações JEE. Com a inclusão deste framework na JEE 5,<br />
existe uma grande tendência ao crescimento de sua utilização o que torna indispensável o conhecimento de seus recursos e<br />
de suas diversas implementações. Neste tutorial foi abordado o conceito básico do funcionamento deste framework e em<br />
uma nova oportunidade voltarei a escrever sobre esta tecnologia. Até lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2007/08/27/java-server-faces-12-hello-world/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bem vindos!</title>
		<link>http://submundojava.com.br/wordpress/2007/07/17/bem-vindos/</link>
		<comments>http://submundojava.com.br/wordpress/2007/07/17/bem-vindos/#comments</comments>
		<pubDate>Wed, 18 Jul 2007 01:49:56 +0000</pubDate>
		<dc:creator>paulo.sales</dc:creator>
		
		<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://submundojava.com.br/wordpress/?p=3</guid>
		<description><![CDATA[Ol&#225;,  Bem vindos ao SubMundo Java.  Nossa miss&#227;o &#233; divulgar o conhecimento Java para todos da comunidade e para aqueles que est&#227;o come&#231;ando nesse contagioso mundo!  Sou Paulo Sales e essas s&#227;o as minhas boas vindas!  Sintaxe &#224; vontade.
]]></description>
			<content:encoded><![CDATA[<p>Ol&aacute;,  Bem vindos ao SubMundo Java.  Nossa miss&atilde;o &eacute; divulgar o conhecimento Java para todos da comunidade e para aqueles que est&atilde;o come&ccedil;ando nesse contagioso mundo!  Sou Paulo Sales e essas s&atilde;o as minhas boas vindas!  Sintaxe &agrave; vontade.</p>
]]></content:encoded>
			<wfw:commentRss>http://submundojava.com.br/wordpress/2007/07/17/bem-vindos/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
