<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Victor V. Serta's Tech Blog</title>
	<atom:link href="http://victorvserta.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://victorvserta.wordpress.com</link>
	<description>java, web 2.0 e outras tecnologias</description>
	<lastBuildDate>Tue, 11 Aug 2009 03:38:48 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='victorvserta.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/ca726e1217bed49a7b18a8e20ad63280?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Victor V. Serta's Tech Blog</title>
		<link>http://victorvserta.wordpress.com</link>
	</image>
			<item>
		<title>Rodando o Google Android em x86</title>
		<link>http://victorvserta.wordpress.com/2009/08/01/rodando-o-google-android-em-x86/</link>
		<comments>http://victorvserta.wordpress.com/2009/08/01/rodando-o-google-android-em-x86/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 21:08:31 +0000</pubDate>
		<dc:creator>Victor Villela Serta</dc:creator>
				<category><![CDATA[Google Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[live-android]]></category>
		<category><![CDATA[livecd]]></category>
		<category><![CDATA[netbook]]></category>

		<guid isPermaLink="false">http://victorvserta.wordpress.com/?p=220</guid>
		<description><![CDATA[Originalmente o sistema operacional Google Android tinha como objetivo (pelo menos oficialmente) de ser utilizado em telefones celulares. Com o mercado crescente dos netbooks, muito tem se falado da possibilidade de rodar esse sistema em computadores pessoais.  Lendo essa notícia fiquei sabendo do projeto LiveAndroid, que tem como objetivo disponibilizar uma versão do Android que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=220&subd=victorvserta&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Originalmente o sistema operacional <a href="http://code.google.com/android/" target="_blank">Google Android</a> tinha como objetivo (pelo menos oficialmente) de ser utilizado em telefones celulares. Com o mercado crescente dos netbooks, muito tem se falado da possibilidade de rodar esse sistema em computadores pessoais.  Lendo <a href="http://www.geek.com.br/blogs/832697632/posts/10453-experimente-o-android-em-seu-pc-gratis-e-sem-instalar-nada" target="_blank">essa notícia</a> fiquei sabendo do projeto <a href="http://code.google.com/p/live-android/" target="_blank">LiveAndroid</a>, que tem como objetivo disponibilizar uma versão do Android que rode em computadores x86 sem precisar instalar nada. Apesar de eu já conhecer o sistema através do emulador disponibilizado na SDK, resolvi baixar a imagem de CD e testar em meu computador.</p>
<p style="text-align:center;"><a href="http://live-android.googlecode.com"><img class="aligncenter" title="LiveAndroid" src="http://live-android.googlecode.com/files/area.png" alt="" width="500" height="150" /></a></p>
<p><span id="more-220"></span>Abaixo o vídeo que gravei do Android rodando virtualizado sobre o Ubuntu usando o VirtualBox:</p>
<p><span style="text-align:center; display: block;"><a href="http://victorvserta.wordpress.com/2009/08/01/rodando-o-google-android-em-x86/"><img src="http://img.youtube.com/vi/2T8d4DciDA0/2.jpg" alt="" /></a></span></p>
<p>Esse sistema operacional não é (e nem sei se será) apropriado para a utilização em desktops ou laptops, mas tem grande potencial no mercado de netbooks. Inclusive no dia que estou escrevendo este post, saiu no BR-Linux.org a notícia &#8220;<a href="http://br-linux.org/2009/video-empresa-chinesa-adapta-android-para-netbooks/" target="_blank">Empresa chinesa adapta Android para netbooks</a>&#8220;. Abaixo o vídeo demonstrando essa versão adaptada:</p>
<p><span style="text-align:center; display: block;"><a href="http://victorvserta.wordpress.com/2009/08/01/rodando-o-google-android-em-x86/"><img src="http://img.youtube.com/vi/o5M42OLuTsI/2.jpg" alt="" /></a></span></p>
<p>Apesar da Google ter anúnciado o Chrome OS, acredito que o Android ainda vai conquistar muito espaço. Isso é muito interessante para o Linux, que tem mais uma grande empresa o apoiando, e para os programadores Java. Mesmo que esse sistema não possua uma máquina virtual Java padrão, essa é a linguagem utilizada no desenvolvimento de seus softwares.</p>
<p>Se você quiser testar o Android aí também, abaixo estão os passos a serem seguidos (baseado no arquivo <a href="http://live-android.googlecode.com/files/readmefirst.txt">readmefirst.txt</a> do projeto):</p>
<ol>
<li>Acesse o site do projeto LiveAndroid: <a href="http://code.google.com/p/live-android" target="_blank">http://code.google.com/p/live-android</a></li>
<li>Vá em downloads e baixe os arquivos <a href="http://live-android.googlecode.com/files/liveandroidv0.2.iso.001">liveandroidv0.2.iso.001</a> e <a style="white-space:nowrap;" href="http://live-android.googlecode.com/files/liveandroidv0.2.iso.002">liveandroidv0.2.iso.002 </a></li>
<li>É necessários juntar os 2 arquivos em um único:
<ol>
<li>No Linux: digite na linha de comando &#8220;<em>cat liveandroidv0.2.iso.001 liveandroidv0.2.iso.002 &gt; liveandroidv0.2.iso&#8221;</em></li>
<li>No Windows:<em> </em>baixe o <a href="http://www.freebyte.com/hjsplit/" target="_blank">HJ-Split</a> e utilize a função &#8220;join&#8221; para juntar os arquivos</li>
</ol>
</li>
<li>Grave a imagem em um disco ou utilize uma máquina virtual para rodá-la</li>
</ol>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:0;width:1px;height:1px;">em computadores x86</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/victorvserta.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/victorvserta.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/victorvserta.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/victorvserta.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/victorvserta.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/victorvserta.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/victorvserta.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/victorvserta.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/victorvserta.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/victorvserta.wordpress.com/220/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=220&subd=victorvserta&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://victorvserta.wordpress.com/2009/08/01/rodando-o-google-android-em-x86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e1a1f0dfbafecd8514f033905b134d4d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">victorvserta</media:title>
		</media:content>

		<media:content url="http://live-android.googlecode.com/files/area.png" medium="image">
			<media:title type="html">LiveAndroid</media:title>
		</media:content>

		<media:content url="http://img.youtube.com/vi/2T8d4DciDA0/2.jpg" medium="image" />

		<media:content url="http://img.youtube.com/vi/o5M42OLuTsI/2.jpg" medium="image" />
	</item>
		<item>
		<title>Instalando o JBoss Tools 3 no Eclipse 3.4/3.5</title>
		<link>http://victorvserta.wordpress.com/2009/03/19/instalando-o-jboss-tools-3-no-eclipse-34/</link>
		<comments>http://victorvserta.wordpress.com/2009/03/19/instalando-o-jboss-tools-3-no-eclipse-34/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 04:13:49 +0000</pubDate>
		<dc:creator>Victor Villela Serta</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[galileo]]></category>
		<category><![CDATA[ganymede]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[jboss tools]]></category>
		<category><![CDATA[jbosstools]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://victorvserta.wordpress.com/?p=176</guid>
		<description><![CDATA[O Jboss Tools é um conjunto de plugins que facilita a vida de quem trabalha com Seam, JSF, (X)HTML, Hibernate, JBoss AS, Drools, jBPM, entre outros. A versão estável do JBoss Tools 3 foi lançada essa semana e é necessária para quem quer utilizar estes plugins no Eclipse 3.4 (ou 3.5)¹, já que as versões [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=176&subd=victorvserta&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>O Jboss Tools é um conjunto de plugins que facilita a vida de quem trabalha com Seam, JSF, (X)HTML, Hibernate, JBoss AS, Drools, jBPM, entre outros. A versão estável do JBoss Tools 3 foi lançada essa semana e é necessária para quem quer utilizar estes plugins no Eclipse 3.4 (ou 3.5)¹, já que as versões 2.x rodam somente no 3.3 ou inferior.</p>
<p>É importante notar que antes você precisa ter instalado os plugins padrões para Java EE no Eclipse, caso não tenha baixe a versão &#8220;Eclipse 3.5 IDE for Java EE Developers&#8221;¹ <a href="http://www.eclipse.org/downloads/" target="_blank">aqui</a>.</p>
<p>A instalação do JBoss Tools é muito simples e pode ser realizada pelo próprio update do Eclipse. Bem, vamos lá:</p>
<h4><strong>Eclipse Galileo 3.5</strong>¹</h4>
<ol>
<li>Vá em “Help” e “Install New Software…”</li>
<li>Clique em &#8220;Add&#8230;&#8221; para adicionar um novo site</li>
<li>Na tela coloque em &#8220;JBoss Tools&#8221; (ou outro nome que preferir) e &#8220;<a href="http://download.jboss.org/jbosstools/updates/development" target="_blank">http://download.jboss.org/jbosstools/updates/development</a>&#8221; na url e clique em &#8220;OK&#8221;</li>
<li>Expanda esse novo site, vá em &#8220;JBoss Tools 3.1.0 &#8230;&#8221; e selecione os plugins que deseja instalar</li>
<li>Clique em &#8220;Next&#8221; e siga os procedimentos</li>
</ol>
<div id="attachment_265" class="wp-caption aligncenter" style="width: 310px"><a href="http://victorvserta.files.wordpress.com/2009/03/instalacao-jboss-tools-35.png"><img class="size-medium wp-image-265" title="instalacao-jboss-tools-35" src="http://victorvserta.files.wordpress.com/2009/03/instalacao-jboss-tools-35.png?w=300&#038;h=277" alt="Instalação do Jboss Tools 3 no Eclipse 3.5" width="300" height="277" /></a><p class="wp-caption-text">Instalação do Jboss Tools 3 no Eclipse 3.5</p></div>
<h4><strong>Eclipse Ganymede 3.4</strong></h4>
<ol>
<li>Vá em “Help” e “Software Updates…”</li>
<li>Na aba “Available Software” clique em “Add Site…”</li>
<li>Coloque a url “<a href="http://download.jboss.org/jbosstools/updates/development" target="_blank">http://download.jboss.org/jbosstools/updates/development</a>” e clique em “OK”</li>
<li>Expanda esse novo site, vá em &#8220;JBoss Tools 3.0.0 &#8230;&#8221; e selecione os plugins que deseja instalar</li>
<li>Clique em &#8220;Install&#8230;&#8221; e siga os procedimentos</li>
</ol>
<p style="text-align:center;"><a href="http://victorvserta.files.wordpress.com/2009/03/instalacao-jboss-tools-33.png"><img class="size-medium wp-image-188 aligncenter" title="Instalação do JBoss Tools 3" src="http://victorvserta.files.wordpress.com/2009/03/instalacao-jboss-tools-33.png?w=300&#038;h=217" alt="Instalação do JBoss Tools 3" width="300" height="217" /></a></p>
<p>As imagens abaixo mostram os plugins Seam Tools (com editor visual de JSF/XHTML aberto) e Hibernate Tools funcionando:</p>
<p style="text-align:center;"><a href="http://victorvserta.files.wordpress.com/2009/03/jboss-tools-3-ambiente-11.png"><img class="size-medium wp-image-189 aligncenter" title="Seam Tools" src="http://victorvserta.files.wordpress.com/2009/03/jboss-tools-3-ambiente-11.png?w=300&#038;h=172" alt="Seam Tools" width="300" height="172" /></a></p>
<p style="text-align:center;"><a href="http://victorvserta.files.wordpress.com/2009/03/jboss-tools-3-ambiente-21.png"><img class="alignnone size-medium wp-image-190" title="Hibernate Tools" src="http://victorvserta.files.wordpress.com/2009/03/jboss-tools-3-ambiente-21.png?w=300&#038;h=172" alt="Hibernate Tools" width="300" height="172" /></a></p>
<p><strong><br />
</strong></p>
<p>Mais informações em: <a href="http://www.jboss.org/tools" target="_blank">http://www.jboss.org/tools</a></p>
<p>¹<strong>Atualização em 10/08/2009: Adicionei os procedimentos para a instalação no Eclipse 3.5 / Galileo</strong></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/victorvserta.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/victorvserta.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/victorvserta.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/victorvserta.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/victorvserta.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/victorvserta.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/victorvserta.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/victorvserta.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/victorvserta.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/victorvserta.wordpress.com/176/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=176&subd=victorvserta&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://victorvserta.wordpress.com/2009/03/19/instalando-o-jboss-tools-3-no-eclipse-34/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e1a1f0dfbafecd8514f033905b134d4d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">victorvserta</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2009/03/instalacao-jboss-tools-35.png?w=300" medium="image">
			<media:title type="html">instalacao-jboss-tools-35</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2009/03/instalacao-jboss-tools-33.png?w=300" medium="image">
			<media:title type="html">Instalação do JBoss Tools 3</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2009/03/jboss-tools-3-ambiente-11.png?w=300" medium="image">
			<media:title type="html">Seam Tools</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2009/03/jboss-tools-3-ambiente-21.png?w=300" medium="image">
			<media:title type="html">Hibernate Tools</media:title>
		</media:content>
	</item>
		<item>
		<title>&#8220;Resumão&#8221; JBoss Seam</title>
		<link>http://victorvserta.wordpress.com/2008/12/15/resumao-jboss-seam/</link>
		<comments>http://victorvserta.wordpress.com/2008/12/15/resumao-jboss-seam/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 00:05:24 +0000</pubDate>
		<dc:creator>Victor Villela Serta</dc:creator>
				<category><![CDATA[JBoss Seam]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://victorvserta.wordpress.com/?p=164</guid>
		<description><![CDATA[Encontrei este link onde é possível baixar um guia rápido de referência do JBoss Seam. Está disponível no site DZone Refcardz (que aliás, tem outros ótimos guias de referência) e foi escrito por Jacob Orshalick. Achei muito interessante, pois tem um resumo de grande parte das funcionalidades deste framework, como bijection, contextual components, seam-gen, conversation [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=164&subd=victorvserta&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:left;">Encontrei <a href="http://refcardz.dzone.com/refcardz/core-seam" target="_blank">este link</a> onde é possível baixar um guia rápido de referência do JBoss Seam. Está disponível no site <a href="http://refcardz.dzone.com/" target="_blank">DZone Refcardz</a> (que aliás, tem outros ótimos guias de referência) e foi escrito por <a href="http://solutionsfit.com/blog/" target="_blank">Jacob Orshalick</a>. Achei muito interessante, pois tem um resumo de grande parte das funcionalidades deste framework, como bijection, contextual components, seam-gen, conversation management e segurança.</p>
<p style="text-align:left;">
<p style="text-align:left;"><a href="http://refcardz.dzone.com/refcardz/core-seam" target="_blank"><img class="size-full wp-image-165 aligncenter" title="Core Seam Refcardz" src="http://victorvserta.files.wordpress.com/2008/12/6084.png?w=206&#038;h=266" alt="Core Seam Refcardz" width="206" height="266" /></a></p>
<p style="text-align:center;">
<p style="text-align:left;">Fica aí a dica pra quem usa ou está estudando o Seam! <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align:left;">Ah, e se você ainda não leu eu escrevi um pequeno artigo de como criar um cadastro básico no JBoss Seam <a href="http://victorvserta.wordpress.com/2008/11/02/exemplo-de-cadastro-com-o-jboss-seam/" target="_self">aqui</a>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/victorvserta.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/victorvserta.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/victorvserta.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/victorvserta.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/victorvserta.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/victorvserta.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/victorvserta.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/victorvserta.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/victorvserta.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/victorvserta.wordpress.com/164/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=164&subd=victorvserta&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://victorvserta.wordpress.com/2008/12/15/resumao-jboss-seam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e1a1f0dfbafecd8514f033905b134d4d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">victorvserta</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2008/12/6084.png" medium="image">
			<media:title type="html">Core Seam Refcardz</media:title>
		</media:content>
	</item>
		<item>
		<title>Programação concorrente com java.util.concurrent (parte 1)</title>
		<link>http://victorvserta.wordpress.com/2008/12/11/programacao-concorrente-com-javautilconcurrent-parte-1/</link>
		<comments>http://victorvserta.wordpress.com/2008/12/11/programacao-concorrente-com-javautilconcurrent-parte-1/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 01:42:38 +0000</pubDate>
		<dc:creator>Victor Villela Serta</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://victorvserta.wordpress.com/?p=124</guid>
		<description><![CDATA[Atualmente para tirar um melhor proveito dos processadores com múltiplos núcleos, é necessário que os desenvolvedores se preocupem com a execução de tarefas em paralelo. Para facilitar nisso, foi adicionado o pacote chamado java.util.concurrent no Java 5. Neste post vou apresentar através de alguns exemplos algumas facilidades que as classes deste pacote provêem.


Exemplo 1: Execução [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=124&subd=victorvserta&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Atualmente para tirar um melhor proveito dos processadores com múltiplos núcleos, é necessário que os desenvolvedores se preocupem com a execução de tarefas em paralelo. Para facilitar nisso, foi adicionado o pacote chamado <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html" target="_blank">java.util.concurrent</a> no Java 5. Neste post vou apresentar através de alguns exemplos algumas facilidades que as classes deste pacote provêem.</p>
<p><img class="size-medium wp-image-149 alignleft" title="intel-dual-core" src="http://victorvserta.files.wordpress.com/2008/12/intel-dual-core.jpg?w=248&#038;h=186" alt="intel-dual-core" width="248" height="186" /><img class="size-medium wp-image-150 aligncenter" title="amd-quad-core" src="http://victorvserta.files.wordpress.com/2008/12/amd-quad-core.jpg?w=186&#038;h=192" alt="amd-quad-core" width="186" height="192" /></p>
<p><span id="more-124"></span></p>
<h4>Exemplo 1: Execução assíncrona</h4>
<p><a href="http://dl.getdropbox.com/u/193282/blog/concurrent/CalculoPI.zip">Download do Exemplo</a></p>
<p>Este primeiro exemplo, baseado <a href="http://www.ppgia.pucpr.br/~maziero/doku.php/so:calculo_de_pi_com_threads" target="_blank">neste exercício</a>, consiste no cálculo do valor do PI otimizado para rodar em vários núcleos separando-o em várias tarefas. Este valor pode ser calculado aproximadamente pela <a href="http://mathworld.wolfram.com/GregorySeries.html" target="_blank">série de Gregory </a>utilizando a seguinte fórmula:</p>
<p><a href="http://victorvserta.files.wordpress.com/2008/11/calculo_pi.png"><img class="size-full wp-image-125 aligncenter" title="Fórmula para cálculo PI" src="http://victorvserta.files.wordpress.com/2008/11/calculo_pi.png?w=111&#038;h=61" alt="Fórmula para cálculo PI" width="111" height="61" /></a></p>
<p>Ou seja, teremos o seguinte nas primeiras iterações: PI/4 = 1 &#8211; 1/3 + 1/5 &#8211; 1/7 + &#8230;</p>
<p>Quanto mais iterações, mais preciso o valor fica. Veja esse link: <a href="http://www.eveandersson.com/pi/gregory-leibniz" target="_blank">http://www.eveandersson.com/pi/gregory-leibniz</a></p>
<p>O código abaixo realiza o cálculo do somatório recebendo o valor inicial (k) e o final (n). Veja que nossa classe implementa a interface <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Callable.html" target="_blank">Callable</a> através do método call(), o qual retorna o tipo Double como resultado do somatório.</p>
<pre class="brush: java;">

import java.util.concurrent.Callable;

public class CalculoPI implements Callable&lt;Double&gt; {

    private int inicio;
    private int fim;

    public CalculoPI(int inicio, int fim) {
        this.inicio = inicio;
        this.fim = fim;
    }

    public Double call() throws Exception {
        double valor = 0.0;

        for (int i=inicio; i &lt;= fim; i++) {
            valor += Math.pow(-1.0, i + 1) / (2.0 * (double)i - 1.0);
        }

        return valor;
    }
}
</pre>
<p>Para separarmos este cálculo em várias tarefas concorrentes podemos definir os valores iniciais e finais de cada uma delas. Veja o código a seguir:</p>
<pre class="brush: java;">

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //cria um pool de threads para realizar o cálculo
        ExecutorService es = Executors.newCachedThreadPool();

        //separa o cálculo em 4 partes definindo o valor de n inicial e final para cada uma
        Future&lt;Double&gt; parte1 =  es.submit(new CalculoPI(1,100000000));
        Future&lt;Double&gt; parte2 = es.submit(new CalculoPI(100000001,200000000));
        Future&lt;Double&gt; parte3 = es.submit(new CalculoPI(200000001,300000000));
        Future&lt;Double&gt; parte4 = es.submit(new CalculoPI(400000001,500000000));

        //junta os valores cálculados das 4 partes e multiplica por 4
        double pi = 4.0 * (parte1.get() + parte2.get() + parte3.get() + parte4.get());

        es.shutdown();

        System.out.println(&quot;Valor calculado de PI é &quot; + pi);
    }
}
</pre>
<p>Aqui foram utilizadas 500.000.000 iterações, as quais são dividas em 4 partes. Inicialmente, foi criado um pool de threads através de <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool()" target="_blank">Executors.newCachedThreadPool()</a> que retorna um objeto <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html" target="_blank">ThreadPoolExcutor</a> configurado para criar novas threads assim que necessário e reaproveitar as já existentes que estejam disponíveis. Você pode também utilizar métodos como <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int)" target="_blank">Executors.newFixedThreadPool(int)</a> para criar um pool com número fixo de threads ou criar um objeto do tipo <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html" target="_blank">ThreadPoolExcutor</a> explicitamente definindo seus parâmetros no construtor. Em seguida, as partes dos cálculos foram submetidas para execução de forma assíncrona, ou seja, ao chamar submit() não vamos aguardar o cálculo finalizar porque ele será executado em paralelo.</p>
<p>Quando um serviço é submetido, é retornado um objeto <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Future.html" target="_blank">Future</a>. É através dele que pegamos o resultado do cálculo na linha 19 chamando seu método get(). Este método é bloqueante, ou seja, ao chamá-lo é necessário aguardar o final da execução da tarefa.</p>
<h4>Exemplo 2: Produtor/Consumidor com BlockingQueue</h4>
<p><a href="http://dl.getdropbox.com/u/193282/blog/concurrent/BlockingQueue.zip">Download do Exemplo</a></p>
<p>Implementar esse algoritmo usando apenas blocos de código com synchronized e os métodos wait() e notify()/notifyAll() muitas vezes é trabalhoso. Para facilitar isso, podemos utilizar a collection <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html" target="_blank">BlockingQueue</a>. Veja abaixo como fica simples o código:</p>
<pre class="brush: java;">
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Main {

    public static void main(String[] args) {
         //cria fila bloqueante com 10 lugares disponíveis
         BlockingQueue&lt;Integer&gt; queue = new LinkedBlockingQueue&lt;Integer&gt;(10);

         //cria e inicia thread para o produtor
         new Thread(new Produtor(queue)).start();

         //cria e inicia thread para o consumidor
         new Thread(new Consumidor(queue)).start();
     }
}
</pre>
<pre class="brush: java;">
import java.util.concurrent.BlockingQueue;

public class Produtor implements Runnable {

     private BlockingQueue&lt;Integer&gt; queue;

     public Produtor(BlockingQueue&lt;Integer&gt; queue) {
         this.queue = queue;
     }

     public void run() {
         int i=0;

         try {
             while(true) {
                 /*adiciona valor na fila imediatamente se houver espaço,
                   caso contrario aguarda até que o espaço fique disponível*/
                 queue.put(i++);

                 Thread.sleep(500);
             }
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
     }
}
</pre>
<pre class="brush: java;">
import java.util.concurrent.BlockingQueue;

public class Consumidor implements Runnable {

     private BlockingQueue&lt;Integer&gt; queue;

     public Consumidor(BlockingQueue&lt;Integer&gt; queue) {
         this.queue = queue;
     }

     public void run() {
         try {
             while(true) {
                 /*se houver valor retira ele da fila, senão fica bloqueado
                  até que um valor seja adicionado */
                 int valor = queue.take();

                 System.out.println(valor);
             }
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
     }
}
</pre>
<p>Conforme pode ser visto nos comentários no código, o método put() adiciona valor na fila imediatamente se houver espaço, caso contrario aguarda até que o espaço fique disponível. No consumidor, o método take() é chamado e, se houver algum valor disponível ele é retirado, senão fica bloqueado   até que um valor seja adicionado.</p>
<p>Na próxima parte deste artigo irei apresentar algumas outras ferramentas deste pacote, como o uso de locks e semáforos.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/victorvserta.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/victorvserta.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/victorvserta.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/victorvserta.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/victorvserta.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/victorvserta.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/victorvserta.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/victorvserta.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/victorvserta.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/victorvserta.wordpress.com/124/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=124&subd=victorvserta&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://victorvserta.wordpress.com/2008/12/11/programacao-concorrente-com-javautilconcurrent-parte-1/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e1a1f0dfbafecd8514f033905b134d4d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">victorvserta</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2008/12/intel-dual-core.jpg?w=300" medium="image">
			<media:title type="html">intel-dual-core</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2008/12/amd-quad-core.jpg?w=289" medium="image">
			<media:title type="html">amd-quad-core</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2008/11/calculo_pi.png" medium="image">
			<media:title type="html">Fórmula para cálculo PI</media:title>
		</media:content>
	</item>
		<item>
		<title>@Enumerated da JPA</title>
		<link>http://victorvserta.wordpress.com/2008/11/13/enumerated-da-jpa/</link>
		<comments>http://victorvserta.wordpress.com/2008/11/13/enumerated-da-jpa/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 03:56:08 +0000</pubDate>
		<dc:creator>Victor Villela Serta</dc:creator>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://victorvserta.wordpress.com/?p=107</guid>
		<description><![CDATA[Para realizarmos o mapeamento de um atributo &#8220;Enumerated type&#8221; de uma entidade podemos utilizar a annotation @Enumerated da JPA / Hibernate. O código abaixo é um exemplo de um enum:


public enum Sexo {
     M(&#34;Masculino&#34;),
     F(&#34;Feminino&#34;);

     private String descricao;

     private Sexo(String descricao) {
          this.descricao = descricao;
     }

     public String getDescricao() {
           return descricao;
     }
 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=107&subd=victorvserta&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Para realizarmos o mapeamento de um atributo &#8220;Enumerated type&#8221; de uma entidade podemos utilizar a annotation @Enumerated da JPA / Hibernate. O código abaixo é um exemplo de um enum:</p>
<pre class="brush: java;">

public enum Sexo {
     M(&quot;Masculino&quot;),
     F(&quot;Feminino&quot;);

     private String descricao;

     private Sexo(String descricao) {
          this.descricao = descricao;
     }

     public String getDescricao() {
           return descricao;
     }
 }
</pre>
<p>Abaixo o código da entidade:</p>
<pre class="brush: java;">
@Entity
public class Pessoa {

     //...

     @Enumerated(EnumType.STRING)
     @Column(name = &quot;sexo&quot;, nullable = false, length = 1, columnDefinition=&quot;char(1)&quot;)
     private Sexo sexo;

     //...
}
</pre>
<p>Para sua utilização na classe Pessoa adicionamos a annotation @Enumerated com o parâmetro EnumType.STRING. Isso foi feito neste exemplo com o objetivo de gravar o valor em uma coluna do tipo &#8220;char(1)&#8221; no banco de dados. Por padrão, esse valor é EnumType.ORDINAL fazendo com que o atributo enum seja salvo em um &#8220;int&#8221;.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/victorvserta.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/victorvserta.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/victorvserta.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/victorvserta.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/victorvserta.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/victorvserta.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/victorvserta.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/victorvserta.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/victorvserta.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/victorvserta.wordpress.com/107/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=107&subd=victorvserta&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://victorvserta.wordpress.com/2008/11/13/enumerated-da-jpa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e1a1f0dfbafecd8514f033905b134d4d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">victorvserta</media:title>
		</media:content>
	</item>
		<item>
		<title>Exemplo de cadastro com o JBoss Seam</title>
		<link>http://victorvserta.wordpress.com/2008/11/02/exemplo-de-cadastro-com-o-jboss-seam/</link>
		<comments>http://victorvserta.wordpress.com/2008/11/02/exemplo-de-cadastro-com-o-jboss-seam/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 20:30:55 +0000</pubDate>
		<dc:creator>Victor Villela Serta</dc:creator>
				<category><![CDATA[JBoss Seam]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Facelets]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://victorvserta.wordpress.com/?p=20</guid>
		<description><![CDATA[Este artigo apresenta como fazer um cadastro simples com o JBoss Seam integrando JSF, JPA e componentes POJO. O objetivo é mostrar a principal aplicação deste framework através da explicação de seus conceitos básicos. Para isso, criei um exemplo prático de cadastro de contatos que é utilizado nas explicações.
Abaixo as tecnologias utilizadas no exemplo:

JBoss Seam
JSF
Facelets
Ajax4JSF
Richfaces
JPA


Introdução
Para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=20&subd=victorvserta&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Este artigo apresenta como fazer um cadastro simples com o JBoss Seam integrando JSF, JPA e componentes POJO. O objetivo é mostrar a principal aplicação deste framework através da explicação de seus conceitos básicos. Para isso, criei um exemplo prático de cadastro de contatos que é utilizado nas explicações.</p>
<p>Abaixo as tecnologias utilizadas no exemplo:</p>
<ul>
<li><a href="http://www.jboss.com/products/seam" target="_blank">JBoss Seam</a></li>
<li><a href="http://java.sun.com/javaee/javaserverfaces/" target="_blank">JSF</a></li>
<li><a href="https://facelets.dev.java.net/" target="_blank">Facelets</a></li>
<li><a href="http://www.jboss.org/jbossajax4jsf/" target="_blank">Ajax4JSF</a></li>
<li><a href="http://www.jboss.org/jbossrichfaces/" target="_blank">Richfaces</a></li>
<li><a href="http://java.sun.com/javaee/technologies/persistence.jsp" target="_blank">JPA</a></li>
</ul>
<p><span id="more-20"></span></p>
<h3><strong>Introdução</strong></h3>
<p>Para quem já trabalhou com JSF e EJB 3.0 juntos sabe que é preciso programar uma camada muitas vezes repetitiva ao criar, por exemplo, um cadastro. Isso ocorre porque é necessário que uma página JSF esteja interligada com um Managed Bean e este por sua vez realize as chamadas propriamente ditas a um Session Bean, já que estes possuem a limitação de não se comunicarem com a camada web e nem compartilharem o mesmo contexto de requisição, sessão ou aplicação.</p>
<p>Com o objetivo de facilitar essa integração foi desenvolvido o JBoss Seam que faz o trabalho &#8220;sujo&#8221; na integração entre JSF e EJB. Além disso, possui uma série de vantagens no desenvolvimento de aplicações Web 2.0. Como seu modelo foi bem aceito, foi criada a <a href="http://jcp.org/en/jsr/detail?id=299" target="_blank">JSR Web Beans</a> para torná-lo um padrão que em breve estará disponível na plataforma Java EE.</p>
<h3><strong>Configurações para utilizar o Seam</strong></h3>
<p>Não pretendo abordar neste artigo as configurações necessárias para utilizar o Seam, já que isso pode ser facilmente encontrado na internet. Além disso, existe uma ferramenta chamada <a href="http://docs.jboss.org/seam/1.1BETA2/reference/en/html/gettingstarted.html" target="_blank">seam-gen</a> que acompanaha o Seam que, entre outras coisas, automatiza as configurações de um novo projeto. O plugin Seam do <a href="http://www.jboss.org/tools/" target="_blank">JBoss Tools</a> para o Eclipse (<a href="http://victorvserta.wordpress.com/2009/03/19/instalando-o-jboss-tools-3-no-eclipse-34/">veja aqui como instalá-lo</a>) também ajuda na hora do desenvolvimento. No tópico &#8220;Referências&#8221; no final deste artigo você encontra alguns links que explicam como utilizá-los.</p>
<h3><strong>Exemplo prático</strong></h3>
<p><a href="http://dl.getdropbox.com/u/193282/blog/seam/contatos.zip">Download do Projeto</a></p>
<p>Existem alguns conceitos que precisam ser compreendidos para desenvolver um projeto com o Seam, mas acho mais fácil mostrá-los através de um exemplo prático. Para isso descreverei como implementar um cadastro básico de contatos utilizando o Seam. Abaixo as imagens de como nosso cadastro ficará ao final desses passos:</p>
<p style="text-align:center;"><a href="http://victorvserta.files.wordpress.com/2008/10/exemplo-contatos-list.png"><img class="alignnone size-medium wp-image-59" title="Exemplo - Lista de Contatos" src="http://victorvserta.files.wordpress.com/2008/10/exemplo-contatos-list.png?w=300&#038;h=223" alt="" width="300" height="223" /></a></p>
<p style="text-align:center;"><a href="http://victorvserta.files.wordpress.com/2008/10/exemplo-contatos-edit.png"><img class="alignnone size-medium wp-image-58" title="Exemplo - Cadastro de Contato" src="http://victorvserta.files.wordpress.com/2008/10/exemplo-contatos-edit.png?w=300&#038;h=223" alt="" width="300" height="223" /></a></p>
<p><strong>Passo 1: Criando nossa entidade</strong></p>
<p>Para o nosso exemplo utilizaremos JPA realizando o mapeamento objeto-relacional. Como se trata de um exemplo simples, coloquei apenas o nome e o e-mail do contato na entidade. Também ocultei algumas coisas como getters e setters que podem ser vistas no código completo.</p>
<p><span style="color:#888888;"><em>Contato.java:</em></span></p>
<pre class="brush: java;">
@Entity //1
@Name(&quot;contato&quot;) //2
public class Contato implements Serializable {

    @Id @GeneratedValue //3
    private Long id;

    @Column(length=50, nullable=false) //4
    private String nome;

    @Column(length=50, nullable=false)
    private String email;

    //getters, setters, hashcode, equals, etc...

}
</pre>
<p>Explicações do código (cada número se refere ao número comentado no código):</p>
<ol>
<li>Declara que a classe representa uma entidade do banco de dados.</li>
<li>Define que a entidade também é um componente do Seam, ou seja, poderá ser manipulado automaticamente por ele.</li>
<li>Define o campo identificador da entidade e que este deve possuir um valor gerado automático (auto-incremento, por exemplo).</li>
<li>Mesmo sem colocar a anotação @Column um atributo é definido como uma coluna da tabela por padrão, porém neste caso desejamos definir seu tamanho máximo e que não pode ser um valor nulo.</li>
</ol>
<p><strong>Passo 2: Criando o componente de negócio</strong></p>
<p>Neste componente é onde estão presentes as regras de negócio. O próprio Seam se responsabiliza em integrar nosso componente com a camada de visão (JSF). O interessante é que este componente pode ser puramente Seam ou também um Session Bean EJB 3.0. No primeiro caso sua aplicação precisa apenas de um Web Container (.war) como o Tomcat ou Jetty para ser implantada. Já no caso de se usar um Session Bean obviamente é necessário um container Java EE completo (.ear).</p>
<p>A vantagem de utilizar Session Beans é que o container  provê todas as funcionalidades do Java EE para você, como controle transacional (<a href="http://java.sun.com/javaee/technologies/jta/" target="_blank">JTA</a>) dos recursos e gerenciamento da segurança e escalabilidade dos componentes de negócio.</p>
<p>Entretanto, em um projeto mais simples pode-se utilizar componentes Seam puros, já que este framework traz algumas funcionalidades que encontramos em um container Java EE. Além disso, é simples converter uma aplicação para utilizar EJB 3.0 posteriormente.</p>
<p>Como o objetivo aqui é apresentar uma visão do funcionamento do Seam optei por não utilizar EJB (em um futuro post pretendo explicar como ficaria o exemplo com essa opção).</p>
<p>Abaixo o código na nossa Action:</p>
<p><span style="color:#888888;"><em>ContatoAction.java:</em></span></p>
<pre class="brush: java;">
@Name(&quot;contatoAction&quot;) //1
@Scope(ScopeType.CONVERSATION) //2
public class ContatoAction {

   @In //3
   private EntityManager entityManager; //4

   @DataModel //5
   private List&lt;Contato&gt; contatos;

   @DataModelSelection //6
   @Out(required=false) //7
   private Contato contato;

   @Factory(&quot;contatos&quot;) //8
   @SuppressWarnings(&quot;unchecked&quot;) //9
   public void listarContatos() {
      //seleciona todos os contatos
      contatos = entityManager.createQuery(&quot;select c from Contato c&quot;).getResultList();
   }

   @Begin //10
   public String novoContato() {
      contato = new Contato();

      return &quot;novoContato&quot;; //12
   }

   @Begin //10
   public String editarContato() {
      //atualiza os dadis do contato para fazer a edição
      entityManager.refresh(contato);

      return &quot;editarContato&quot;; //12
   }

   public String removerContato() {
      //remove o contato
      entityManager.remove(contato);

      return &quot;contatoRemovido&quot;; //12
   }

   @End //11
   public String salvarContato() {
      //se não tem id é porque deve ser inserido, caso contrário alterado
      if (contato.getId() == null) {
         entityManager.persist(contato);
      } else {
         entityManager.merge(contato);
      }

     return &quot;contatoSalvo&quot;;
   }
}
</pre>
<p>Explicações do código (cada número se refere ao número comentado no código):</p>
<ol>
<li>Define que é um componente Seam com o nome &#8220;contatoAction&#8221;.</li>
<li>O Seam se responsabiliza de armazenar no contexto web seus componentes. Para isso eles precisam ter um escopo definido entre os seguintes:
<ul>
<li>STATELESS: O componente não mantém nenhum tipo de estado, ou seja, sua instância não será armazenada no contexto web.</li>
</ul>
<ul>
<li>EVENT (request): A instância do componentes é mantido no contexto durante a requisição JSF.</li>
<li>PAGE: Associa a instância do componente com uma página renderizada armazenando ela na árvore de componentes JSF.</li>
<li>CONVERSATION: Mantém a instância durante uma conversação (unidade de trabalho do ponto de vista so usuário). Veja os comentários 10 e 11 abaixo.</li>
<li>SESSION: A instância permanece no contexto da sessão do usuário.</li>
<li>BUSINESS_PROCESS: Utilizado para processos longos de negócio através do jBPM.</li>
<li>APPLICATION: A instância se mantém desde o início até o final da execução da aplicação dentro do container.</li>
</ul>
</li>
<li>Através da annotation @In o Seam injeta uma instância do componente que está no contexto. Por exemplo, se temos um objeto na sessão do usuário basta colocar @In que teremos disponível a referência a ele.</li>
<li>O framework se responsabiliza por injetar o EntityManager para manipularmos as nossas entidades. Isso é próximo a utilizar a annotation @PersistenceContext em Session Bean, porém a vantagem de utilizar @In é que o Seam estende o contexto de persistência durante o escopo do componente. Dessa forma não precisamos nos preocupar com o controle dos objetos que são desanexados do contexto de persistência entre uma requisição e outra do usuário.</li>
<li>Para carregar em uma tabela os contatos precisamos definimos um Data Model através dessa annotation, ou seja, é o conteúdo da lista contatos que será exibido para o usuário.</li>
<li>De forma simples podemos pegar qual o contato que o usuário selecionou na tabela. Quando ele clicar em &#8220;Editar&#8221; em um contato o Seam irá injetar na variável qual contato ele deseja editar.</li>
<li>Ao contrário da annotation @In, através de @Out colocamos uma instância no contexto.</li>
<li>Como visto em (5) temos uma lista dos contatos como Data Model. Para carregar esses contatos o Seam chamará o método que tem annotation @Factory(&#8220;contatos&#8221;).</li>
<li>Na verdade essa annotation não tem relação com o Seam. Apenas é para indicar ao compilador para ignorar um aviso, já que estamos utilizando Generics (List&lt;Contato&gt;) e na query é retornada uma List comum (apenas List).</li>
<li>Quando o usuário deseja criar/editar um contato, para ele é como se uma unidade de trabalho (transação) iniciasse. Essa unidade de trabalho termina em três casos: ao salvar o contato, cancelar a operação ou após um tempo limite. Em um sistema online fica impraticável manter uma transação no banco de dados por tanto tempo, já que isso causaria a trava (lock) de tabelas ou de alguns de seus registros. Para resolver essa situação utilizamos o conceito de conversação simulando uma longa unidade de trabalho para o usuário. Essa unidade de trabalho pode ser mantida, por exemplo, durante a navegação entre várias páginas em um cadastro do tipo wizard que representa um maior caso de uso. Para indicar o inicio dessa conversação utilizamos a annotation @Begin. No momento em que os métodos &#8220;novoContato()&#8221; e &#8220;editarContato()&#8221; são chamados a conversação se inicia e uma instância de nosso componente &#8220;contatoAction&#8221; é mantido no contexto web.</li>
<li>A annotation @End define que a conversação deve ser finalizada na chamada deste método. Além disso, neste momento o Seam pode descartar a instância alocada no contexto do componente &#8220;contatoAction&#8221;, já que seu escopo é CONVERSATION.</li>
<li>No JSF quando temos métodos chamados pela página (actions) temos que retornar uma string. Essa string é utilizada para definir as regras de navegação entre as páginas.</li>
</ol>
<p><strong>Passo 3: A parte visual (JSF e Facelets)</strong></p>
<p>Na camada de visão utilizamos JSF com <a href="https://facelets.dev.java.net/" target="_blank">Facelets</a> (veja mais sobre em Referências). A vantagem da utilização do Facelets é que podemos definir templates para as páginas facilitando assim a definição e manutenção do layout. Como este projeto foi gerado pela ferramenta seam-gen alguns templates já foram definidos automaticamente.</p>
<p>O arquivo abaixo é a lista de contatos:</p>
<p><span style="color:#888888;"><em>contato_list.xhtml:</em></span></p>
<pre class="brush: xml;">
&lt;!DOCTYPE composition PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
                             &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;

&lt;ui:composition xmlns=&quot;http://www.w3.org/1999/xhtml&quot;
	xmlns:s=&quot;http://jboss.com/products/seam/taglib&quot;
	xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot;
	xmlns:f=&quot;http://java.sun.com/jsf/core&quot;
	xmlns:h=&quot;http://java.sun.com/jsf/html&quot;
	xmlns:rich=&quot;http://richfaces.org/rich&quot; template=&quot;layout/template.xhtml&quot;&gt; 

	&lt;ui:define name=&quot;body&quot;&gt; &lt;!-- 1 --&gt;

		&lt;h:messages globalOnly=&quot;true&quot; styleClass=&quot;message&quot; id=&quot;globalMessages&quot; /&gt; &lt;!-- 2 --&gt;

		&lt;rich:panel&gt;
			&lt;f:facet name=&quot;header&quot;&gt;Contatos&lt;/f:facet&gt;
&lt;div class=&quot;results&quot; id=&quot;contatoList&quot;&gt;
				&lt;rich:dataTable	id=&quot;contatoList&quot; var=&quot;_contato&quot; value=&quot;#{contatos}&quot;&gt; &lt;!-- 3 --&gt;
					&lt;h:column&gt;
						&lt;f:facet name=&quot;header&quot;&gt;Id&lt;/f:facet&gt;
			            		#{_contato.id} &lt;!-- 4 --&gt;
			        	&lt;/h:column&gt;
					&lt;h:column&gt;
						&lt;f:facet name=&quot;header&quot;&gt;Nome&lt;/f:facet&gt;
			            		#{_contato.nome}
			        	&lt;/h:column&gt;
					&lt;h:column&gt;
						&lt;f:facet name=&quot;header&quot;&gt;Email&lt;/f:facet&gt;
			            		#{_contato.email}
			        	&lt;/h:column&gt;
					&lt;h:column&gt;
						&lt;f:facet name=&quot;header&quot;&gt;Ação&lt;/f:facet&gt;
						&lt;s:link id=&quot;editar&quot; action=&quot;#{contatoAction.editarContato}&quot; value=&quot;Editar&quot; /&gt; &lt;!-- 5 --&gt;
						&lt;s:link id=&quot;remover&quot; action=&quot;#{contatoAction.removerContato}&quot; value=&quot;Remover&quot; /&gt; &lt;!-- 5 --&gt;
					&lt;/h:column&gt;
				&lt;/rich:dataTable&gt;&lt;/div&gt;
&lt;/rich:panel&gt;

		&lt;s:div styleClass=&quot;actionButtons&quot;&gt;
			&lt;s:button view=&quot;/contato_edit.xhtml&quot; id=&quot;novo&quot; value=&quot;Novo contato&quot;/&gt;
		&lt;/s:div&gt;

	&lt;/ui:define&gt;
&lt;/ui:composition&gt;
</pre>
<p>Explicações do código (cada número se refere ao número comentado no código):</p>
<ol>
<li>Esta é uma tag do Facelets que indica que estamos definindo o conteúdo de body do template.  Neste exemplo utilizei os templates padrões do Seam para as telas.</li>
<li>Local onde mensagens de informações e erros serão exibidas.</li>
<li>O valor da dataTable é &#8220;contatos&#8221; que declaramos como @DataModel na componente seam contatoAction. O que foi colocado em var (&#8220;_contato&#8221;) é o nome da variável que representa o contato de cada iteração (linha) para o preenchimento da tabela, ou seja, como funciona em um &#8220;for each&#8221; em Java. Em geral, é uma boa prática utilizar &#8220;_&#8221; antes do nome neste caso para não ficar ambíguo com &#8220;contato&#8221; que é um componente seam que ficará no contexto.</li>
<li>Através da variável &#8220;_contato&#8221; definimos o conteúdo de cada coluna da tabela referenciando uma de suas propriedades.</li>
<li>Nos links para a execução de uma ação utilizamos o &#8220;s:link&#8221;. O Seam se encarregará de injetar no atribudo &#8220;contato&#8221; de &#8220;contatoAction&#8221; qual foi o contato que o usuário está se referenciando.</li>
</ol>
<p>Mas como ao clicar em &#8220;Editar&#8221; a página de edição é carregada? Quando utilizamos somente JSF definimos uma regra de navegação no arquivo faces_config.xml. No caso de utilização do Seam fazemos isso através do arquivo pages.xml. Porém, assim todas as regras ficam em um mesmo arquivo. Outra maneira de fazermos isso é especificar um arquivo por página chamando-o, neste caso, de contato_list.page.xml:</p>
<p><span style="color:#888888;"><em>contato_list.page.xml:</em></span></p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;page xmlns=&quot;http://jboss.com/products/seam/pages&quot;
      xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
      xsi:schemaLocation=&quot;http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.0.xsd&quot;
      login-required=&quot;true&quot;&gt;

	&lt;navigation&gt;
		&lt;rule if-outcome=&quot;novoContato&quot;&gt;
			&lt;redirect view-id=&quot;/contato_edit.xhtml&quot;/&gt;
		&lt;/rule&gt;
		&lt;rule if-outcome=&quot;editarContato&quot;&gt;
			&lt;redirect view-id=&quot;/contato_edit.xhtml&quot;/&gt;
		&lt;/rule&gt;
		&lt;rule if-outcome=&quot;contatoRemovido&quot;&gt;
			&lt;redirect view-id=&quot;/contato_list.xhtml&quot;/&gt;
		&lt;/rule&gt;
	&lt;/navigation&gt;

&lt;/page&gt;
</pre>
<p>Basicamente o que é definido neste XML é que quando os métodos retornarem &#8220;novoContato&#8221; (linha 8 ) ou &#8220;editarContato&#8221; (linha 11) o usuário deve ser redirecionado para a página de edição do contato. Já quando um contato for removido continuará na página de listagem. Uma coisa importante também de ser comentada é o atributo &#8220;login-required&#8221; (linha 5) na tag &#8220;page&#8221;. Definindo como &#8220;true&#8221; dizemos ao Seam que somente se o usuário estiver logado poderá acessar a página. Em futuros posts pretendo mostrar como a parte de tratamento da segurança com o JBoss Seam é interessante e simples de ser utilizada.</p>
<p>Abaixo o código da página de criação/edição do contato:</p>
<p><span style="color:#888888;"><em>contato_edit.xhtml:</em></span></p>
<pre class="brush: xml;">
&lt;!DOCTYPE composition PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
                             &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;&lt;/pre&gt;
&lt;ui:composition xmlns=&quot;http://www.w3.org/1999/xhtml&quot;
		   xmlns:s=&quot;http://jboss.com/products/seam/taglib&quot;
		   xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot;
		   xmlns:f=&quot;http://java.sun.com/jsf/core&quot;
		   xmlns:h=&quot;http://java.sun.com/jsf/html&quot;
		   xmlns:a=&quot;http://richfaces.org/a4j&quot;
		   xmlns:rich=&quot;http://richfaces.org/rich&quot;
		   template=&quot;layout/template.xhtml&quot;&gt;

&lt;ui:define name=&quot;body&quot;&gt;

 	&lt;h:messages globalOnly=&quot;true&quot; styleClass=&quot;message&quot; id=&quot;globalMessages&quot;/&gt;

 	&lt;h:form id=&quot;contato&quot; styleClass=&quot;edit&quot;&gt;

 		&lt;rich:panel&gt;
 			&lt;f:facet name=&quot;header&quot;&gt;Contato&lt;/f:facet&gt;

 			&lt;s:decorate id=&quot;nomeDecoration&quot; template=&quot;layout/edit.xhtml&quot;&gt; &lt;!-- 1 --&gt;
 				&lt;ui:define name=&quot;label&quot;&gt;Nome&lt;/ui:define&gt;
 				&lt;h:inputText id=&quot;nome&quot;
 						required=&quot;true&quot;
 						size=&quot;50&quot;
						maxlength=&quot;50&quot;
 						value=&quot;#{contato.nome}&quot;&gt; &lt;!-- 2 --&gt;
 					&lt;a:support event=&quot;onblur&quot; reRender=&quot;nomeDecoration&quot;
 						bypassUpdates=&quot;true&quot; ajaxSingle=&quot;true&quot; /&gt; &lt;!-- 3 --&gt;
 				&lt;/h:inputText&gt;
 			&lt;/s:decorate&gt;

			&lt;s:decorate id=&quot;emailDecoration&quot; template=&quot;layout/edit.xhtml&quot;&gt;
 				&lt;ui:define name=&quot;label&quot;&gt;Email&lt;/ui:define&gt;
 				&lt;h:inputText id=&quot;email&quot;
 						required=&quot;true&quot;
 						size=&quot;50&quot;
 						maxlength=&quot;50&quot;
 						value=&quot;#{contato.email}&quot;&gt; &lt;!-- 2 --&gt;
 					&lt;a:support event=&quot;onblur&quot; reRender=&quot;emailDecoration&quot;
 						bypassUpdates=&quot;true&quot; ajaxSingle=&quot;true&quot; /&gt; &lt;!-- 3 --&gt;
 				&lt;/h:inputText&gt;
 			&lt;/s:decorate&gt;
&lt;div style=&quot;clear:both&quot;&gt;
 			&lt;span class=&quot;required&quot;&gt;*&lt;/span&gt; required fields&lt;/div&gt;
&lt;/rich:panel&gt;
&lt;div class=&quot;actionButtons&quot;&gt;
 		&lt;h:commandButton id=&quot;salvar&quot;
 				    value=&quot;Salvar&quot;
 				    action=&quot;#{contatoAction.salvarContato}&quot;/&gt; &lt;!-- 4 --&gt;

 		&lt;s:button id=&quot;cancelar&quot; value=&quot;Cancelar&quot; propagation=&quot;end&quot;
 			     view=&quot;/contato_list.xhtml&quot; /&gt; &lt;!-- 5 --&gt;&lt;/div&gt;
&lt;/h:form&gt;

&lt;/ui:define&gt;

&lt;/ui:composition&gt;
&lt;pre&gt;
</pre>
<p>Explicações do código (cada número se refere ao número comentado no código):</p>
<ol>
<li>A tag &#8220;s:decorate&#8221; do Seam envolve um campo de entrada do JSF e exibe uma mensagem de erro caso sua validação falhar.</li>
<li>Como definimos em nossa action, &#8220;contato&#8221; se refere ao contato que está sendo criado ou que foi previamente selecionado pelo usuário. O Seam se encarrega de colocar sua instância no contexto. Por isso, para associarmos a propriedade &#8220;nome&#8221; com o componente JSF inputText basta colocarmos <em>value=&#8221;#{contato.nome}&#8221;</em>.</li>
<li>Para suportarmos Ajax podemos utilizar o <a href="http://www.jboss.org/projects/jbossAjax4jsf/" target="_blank">Ajax4JSF</a>. Neste caso, quando o usuário deixar o campo seu preenchimento será validado. Caso esteja em branco uma mensagem de erro é exibido, já que os 2 inputText estão com a propriedade &#8220;required&#8221; como &#8220;true&#8221;.</li>
<li>Ao clicar no botão &#8220;Salvar&#8221; o método &#8220;salvarContato&#8221; de nossa action é chamado.</li>
<li>Esse componente do Seam é um botão que possui o atributo &#8220;propagation&#8221;, que como está igual a &#8220;end&#8221; permite que ao clicar em &#8220;Cancelar&#8221; a conversação seja finalizada. Além disso, o usuário é redirecionado para a lista de contatos.</li>
</ol>
<p>Agora a última coisa, o arquivo que define as propriedades da página de edição:</p>
<p><span style="color:#888888;"><em>contato_edit.page.xml:</em></span></p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;page xmlns=&quot;http://jboss.com/products/seam/pages&quot;
      xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
      xsi:schemaLocation=&quot;http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.0.xsd&quot;
      no-conversation-view-id=&quot;/contato_list.xhtml&quot;
      login-required=&quot;true&quot;&gt;

   	&lt;navigation&gt;
		&lt;rule if-outcome=&quot;contatoSalvo&quot;&gt;
			&lt;redirect view-id=&quot;/contato_list.xhtml&quot;/&gt;
		&lt;/rule&gt;
	&lt;/navigation&gt;
&lt;/page&gt;
</pre>
<p>Como pode ser visto, ele define que após salvar um contato o usuário é redirecionado para a lista de contatos.</p>
<p><strong>Conclusão</strong></p>
<p>Espero que este artigo tenha sido útil para demonstrar alguns dos principais conceitos do JBoss Seam. Este framework possui muitas outras funcionalidades como controle de segurança, suporte a URLs do estilo REST, geração de relatórios PDF/Excel, etc. Se tiver alguma dúvida ou sugestão é só deixar um comentário ou me enviar um e-mail. O código-fonte completo do exemplo pode ser baixado <a href="http://dl.getdropbox.com/u/193282/blog/seam/contatos.zip">neste link</a>.<strong><br />
</strong></p>
<p><strong>Referências:</strong></p>
<p>Sobre o Seam:</p>
<ul>
<li><a href="http://www.seamframework.org/" target="_blank">http://www.seamframework.org/</a></li>
<li><a href="http://www.jboss.com/products/seam" target="_blank">http://www.jboss.com/products/seam</a></li>
<li><a href="http://docs.jboss.org/seam/2.1.0.GA/reference/en-US/html/" target="_blank">http://docs.jboss.org/seam/2.1.0.GA/reference/en-US/html/</a></li>
<li><a href="http://www.marcossousa.com/2008/01/14/jboss-seam-getting-started/" target="_blank">http://www.marcossousa.com/2008/01/14/jboss-seam-getting-started/</a></li>
<li><a href="http://www.urubatan.com.br/java-on-rails-produtividade-em-java-parte-1-jboss-seam/" target="_blank">http://www.urubatan.com.br/java-on-rails-produtividade-em-java-parte-1-jboss-seam/</a></li>
</ul>
<p>Usando o seam-gen para desenvolver projetos Seam:</p>
<ul>
<li><a href="http://docs.jboss.org/seam/2.1.0.GA/reference/en-US/html/gettingstarted.html" target="_blank">http://docs.jboss.org/seam/2.1.0.GA/reference/en-US/html/gettingstarted.html</a></li>
<li><a href="http://www.marcossousa.com/tag/seam-gen/" target="_blank">http://www.marcossousa.com/tag/seam-gen/</a></li>
</ul>
<p>Usando o JBoss Tools para desenvolver projetos Seam:</p>
<ul>
<li><a href="http://docs.jboss.org/seam/2.1.0.GA/reference/en-US/html/gettingstartedwithjbosstools.html" target="_blank">http://docs.jboss.org/seam/2.1.0.GA/reference/en-US/html/gettingstartedwithjbosstools.html</a></li>
<li><a href="http://techieexchange.wordpress.com/2008/02/01/how-to-make-jboss-seam-work-with-eclipse-for-windows/" target="_blank">http://techieexchange.wordpress.com/2008/02/01/how-to-make-jboss-seam-work-with-eclipse-for-windows/</a></li>
<li><a href="http://www.devx.com/Java/Article/37547?trk=DXRSS_JAVA" target="_blank">http://www.devx.com/Java/Article/37547?trk=DXRSS_JAVA</a></li>
</ul>
<p>Site do JBoss Tools:</p>
<ul>
<li><a href="http://www.jboss.org/tools/" target="_blank">http://www.jboss.org/tools/</a></li>
</ul>
<p>Sobre a JSR:</p>
<ul>
<li><a href="http://jcp.org/en/jsr/detail?id=299" target="_blank">http://jcp.org/en/jsr/detail?id=299</a></li>
<li><a href="http://www.urubatan.com.br/criada-uma-jsr-para-a-definio-de-web-beans-seam/" target="_blank">http://www.urubatan.com.br/criada-uma-jsr-para-a-definio-de-web-beans-seam/</a></li>
</ul>
<p>Sobre Facelets:</p>
<ul>
<li><a href="https://facelets.dev.java.net/" target="_blank">https://facelets.dev.java.net/</a></li>
<li><a href="http://javawora.blogspot.com/2007/08/tutorial-faceltes.html" target="_blank">http://javawora.blogspot.com/2007/08/tutorial-faceltes.html</a></li>
<li><a href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=5332" target="_blank">http://www.devmedia.com.br/articles/viewcomp.asp?comp=5332</a></li>
</ul>
<p>Sobre Ajax4JSF:</p>
<ul>
<li><a href="http://www.jboss.org/projects/jbossAjax4jsf/" target="_blank">http://www.jboss.org/projects/jbossAjax4jsf/</a></li>
<li><a href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=5529" target="_blank">http://www.devmedia.com.br/articles/viewcomp.asp?comp=5529</a></li>
</ul>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/victorvserta.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/victorvserta.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/victorvserta.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/victorvserta.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/victorvserta.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/victorvserta.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/victorvserta.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/victorvserta.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/victorvserta.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/victorvserta.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=20&subd=victorvserta&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://victorvserta.wordpress.com/2008/11/02/exemplo-de-cadastro-com-o-jboss-seam/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e1a1f0dfbafecd8514f033905b134d4d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">victorvserta</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2008/10/exemplo-contatos-list.png?w=300" medium="image">
			<media:title type="html">Exemplo - Lista de Contatos</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2008/10/exemplo-contatos-edit.png?w=300" medium="image">
			<media:title type="html">Exemplo - Cadastro de Contato</media:title>
		</media:content>
	</item>
		<item>
		<title>SVN + Eclipse 3.4 + Ubuntu 8.04</title>
		<link>http://victorvserta.wordpress.com/2008/10/04/svn-eclipse-34-ubuntu-804/</link>
		<comments>http://victorvserta.wordpress.com/2008/10/04/svn-eclipse-34-ubuntu-804/#comments</comments>
		<pubDate>Sat, 04 Oct 2008 15:11:22 +0000</pubDate>
		<dc:creator>Victor Villela Serta</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ganymede]]></category>
		<category><![CDATA[subeclipse]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[subversive]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://victorvserta.wordpress.com/?p=6</guid>
		<description><![CDATA[Se você está tentando usar o plugin Subeclipse no Eclipse 3.4 no Ubuntu 8.04 provavelmente já percebeu que arranjou uma dor de cabeça. O grande problema está na versão do SVN, que é a 1.4.x no Ubuntu 8.04 e o plugin precisa da 1.5.
Encontrei 2 soluções: a primeira que achei mais interessante fiz um passo-a-passo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=6&subd=victorvserta&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Se você está tentando usar o plugin Subeclipse no Eclipse 3.4 no Ubuntu 8.04 provavelmente já percebeu que arranjou uma dor de cabeça. O grande problema está na versão do SVN, que é a 1.4.x no Ubuntu 8.04 e o plugin precisa da 1.5.</p>
<p>Encontrei 2 soluções: a primeira que achei mais interessante fiz um passo-a-passo aqui, a segunda deixo um link indicado.</p>
<p><span id="more-6"></span></p>
<h3><strong>Solução 1: Usar o plugin Subversive</strong></h3>
<p>A partir do Eclipse 3.4 o Subversive se tornou o plugin padrão para acessar um repositório SVN. Entretanto, por problemas de licenciamento, uma parte do plugin está no site do eclipse.org e a outra (SVN Connectors) continuam no site polarion.org.</p>
<p><strong>Instalando o Subversive SVN Team Provider:</strong></p>
<ol>
<li>Vá em &#8220;Help&#8221; e &#8220;Software Updates&#8230;&#8221;</li>
<li>Na aba &#8220;Available Software&#8221; expanda o item da árvore &#8220;Ganymede&#8221; e depois &#8220;Collaboration Tools&#8221;</li>
<li>Marque &#8220;Subversive SVN Team Provider (Incubation)&#8221; e clique em &#8220;Install&#8230;&#8221;</li>
</ol>
<div id="attachment_7" class="wp-caption aligncenter" style="width: 310px"><a href="http://victorvserta.files.wordpress.com/2008/10/instalar_subversive.png"><img class="size-medium wp-image-7" title="instalar_subversive" src="http://victorvserta.files.wordpress.com/2008/10/instalar_subversive.png?w=300&#038;h=217" alt="Instalando o Subversive SVN Team Provider" width="300" height="217" /></a><p class="wp-caption-text">Instalando o Subversive SVN Team Provider</p></div>
<p><strong>Instalando SVN Subversive Connectors:</strong></p>
<ol>
<li>Na mesma tela (&#8220;Available Software&#8221;) clique em &#8220;Add Site&#8230;&#8221;</li>
<li>Coloque a url &#8220;http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/&#8221; e clique em &#8220;OK&#8221;</li>
<li>Expanda esse novo site, vá em &#8220;Subversive SVN Connectors&#8221; e selecione quais interessa a você.</li>
</ol>
<div id="attachment_8" class="wp-caption aligncenter" style="width: 310px"><a href="http://victorvserta.files.wordpress.com/2008/10/instalar_subversive_connectors.png"><img class="size-medium wp-image-8" title="instalar_subversive_connectors" src="http://victorvserta.files.wordpress.com/2008/10/instalar_subversive_connectors.png?w=300&#038;h=217" alt="Instalando SVN Subversive Connectors" width="300" height="217" /></a><p class="wp-caption-text">Instalando SVN Subversive Connectors</p></div>
<p><strong>Notas para quem vai usar o JavaHL:</strong></p>
<p>Se você for utilizar o Connector para o JavaHL é necessário instalá-lo no Ubuntu:</p>
<blockquote><p>sudo apt-get install libsvn-javahl</p></blockquote>
<p>Também adicione a seguinte linha no eclipse.ini:</p>
<blockquote><p>-Djava.library.path=/usr/lib/jni</p></blockquote>
<p><strong>Definir o SVN Subversive Connector:</strong></p>
<ol>
<li>Reinicie o Eclipse, vá em &#8220;Window&#8221; e &#8220;Preferences&#8221;</li>
<li>Em &#8220;Team&#8221;, &#8220;SVN&#8221; e &#8220;SVN Connector&#8221; defina qual você deseja utilizar (se a combo estiver vazia leia mais abaixo como resolver)</li>
</ol>
<div id="attachment_11" class="wp-caption aligncenter" style="width: 310px"><a href="http://victorvserta.files.wordpress.com/2008/10/definir_svn_connector.png"><img class="size-medium wp-image-11" title="definir_svn_connector" src="http://victorvserta.files.wordpress.com/2008/10/definir_svn_connector.png?w=300&#038;h=262" alt="Definir SVN Connector" width="300" height="262" /></a><p class="wp-caption-text">Definir SVN Connector</p></div>
<p><strong>A combo com os Connectors está vazia. O que fazer?</strong></p>
<p>Infelizmente quando realizei essa instalação a versão do Subversive no site eclipse.org estava desatualizada. Se você também está passando pelo mesmo problema aconselho desistalar o plugin &#8220;Subversive SVN Team Provider&#8221; e seguir os passos abaixo:</p>
<ol>
<li>Na aba &#8220;Available Software&#8221; clique em &#8220;Manage Sites…&#8221;</li>
<li>Desmarque a opção Ganymede</li>
<li>Vá para baixo, marque &#8220;http://download.eclipse.org/technology/subversive/0.7/update-site/&#8221; e clique em OK</li>
<li>Agora expanda na lista a opção &#8220;http://download.eclipse.org/technology/subversive/0.7/update-site/&#8221;</li>
<li>Instale o plugin normalmente</li>
</ol>
<h3><strong>Solução 2: Atualizar o SVN do Ubuntu</strong></h3>
<p>Eu não testei essa solução, pois por adicionar o repositório de uma versão instável do Ubuntu pode ser que ocorram alguns problemas. De qualquer forma, segue o link de onde li sobre essa solução: <a href="http://" target="_blank">http://muriloq.com/blog/2008/07/subclipse-no-eclipse-34-ganymede-e-ubuntu-804/</a></p>
<p><strong>UPDATE: Agora com o lançamento oficial do Ubuntu 8.10 você pode utilizar essa nova versão sem problemas.</strong></p>
<p><strong>Referências</strong>:</p>
<p><a href="http://muriloq.com/blog/2008/07/subclipse-no-eclipse-34-ganymede-e-ubuntu-804/" target="_blank">http://muriloq.com/blog/2008/07/subclipse-no-eclipse-34-ganymede-e-ubuntu-804/</a></p>
<p><a href="http://mohangk.org/blog/2008/09/ubuntu-subclipse-woes-use-javahl-bindings/" target="_blank">http://mohangk.org/blog/2008/09/ubuntu-subclipse-woes-use-javahl-bindings/</a></p>
<p><a href="http://olafsblog.sysbsb.de/?p=53" target="_blank">http://olafsblog.sysbsb.de/?p=53</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/victorvserta.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/victorvserta.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/victorvserta.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/victorvserta.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/victorvserta.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/victorvserta.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/victorvserta.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/victorvserta.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/victorvserta.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/victorvserta.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=victorvserta.wordpress.com&blog=5066149&post=6&subd=victorvserta&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://victorvserta.wordpress.com/2008/10/04/svn-eclipse-34-ubuntu-804/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e1a1f0dfbafecd8514f033905b134d4d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">victorvserta</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2008/10/instalar_subversive.png?w=300" medium="image">
			<media:title type="html">instalar_subversive</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2008/10/instalar_subversive_connectors.png?w=300" medium="image">
			<media:title type="html">instalar_subversive_connectors</media:title>
		</media:content>

		<media:content url="http://victorvserta.files.wordpress.com/2008/10/definir_svn_connector.png?w=300" medium="image">
			<media:title type="html">definir_svn_connector</media:title>
		</media:content>
	</item>
	</channel>
</rss>