<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2portuguesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Rafael Liu Blog</title>
	
	<link>http://rafaelliu.net</link>
	<description>Café, pinguins e outras coisas</description>
	<pubDate>Sat, 24 Oct 2009 12:21:32 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/rafaelliu" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">rafaelliu</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Frafaelliu" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Frafaelliu" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Frafaelliu" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/rafaelliu" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Frafaelliu" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Frafaelliu" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Frafaelliu" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Frafaelliu" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Conferência Internacional de Segurança de Aplicações (AppSec Brasil 2009)</title>
		<link>http://rafaelliu.net/?p=231</link>
		<comments>http://rafaelliu.net/?p=231#comments</comments>
		<pubDate>Thu, 22 Oct 2009 11:07:47 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[Evento]]></category>

		<category><![CDATA[segurança]]></category>

		<category><![CDATA[OWASP]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=231</guid>
		<description><![CDATA[Acontecerá nos dias de 27 a 30 de outubro:
A comunidade Comunidade TI-Controle e o Centro de Informática da Câmara dos Deputados apresentam a Conferência Internacional de Segurança de Aplicações, que será realizada com o apoio do OWASP (Open Web Application Security Project) em Brasília, capital do Brasil. A conferência consistirá de dois dias de treinamentos, [...]]]></description>
			<content:encoded><![CDATA[<p>Acontecerá nos dias de 27 a 30 de outubro:</p>
<blockquote><p>A comunidade Comunidade TI-Controle e o Centro de Informática da Câmara dos Deputados apresentam a Conferência Internacional de Segurança de Aplicações, que será realizada com o apoio do OWASP (Open Web Application Security Project) em Brasília, capital do Brasil. A conferência consistirá de dois dias de treinamentos, seguidos de dois dias de plenárias em trilha única.</p></blockquote>
<p>Mais informações: <a title="AppSec Brasil 2009" href="http://www.owasp.org/index.php/AppSec_Brasil_2009_(pt-br)" target="_blank">AppSec Brasil 2009</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=231</wfw:commentRss>
		</item>
		<item>
		<title>Atraso de vida: IE6</title>
		<link>http://rafaelliu.net/?p=228</link>
		<comments>http://rafaelliu.net/?p=228#comments</comments>
		<pubDate>Thu, 22 Oct 2009 11:03:13 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[Diverso]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=228</guid>
		<description><![CDATA[Sou o mais novo participante da campanha. Instalei até plugin do WP

]]></description>
			<content:encoded><![CDATA[<p>Sou o mais novo participante da campanha. Instalei até plugin do WP</p>
<p><img class="aligncenter size-full wp-image-229" title="2644891323_e5fb590a93" src="http://rafaelliu.net/wp-content/uploads/2009/10/2644891323_e5fb590a93.jpg" alt="2644891323_e5fb590a93" width="436" height="238" /></p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=228</wfw:commentRss>
		</item>
		<item>
		<title>Deployment no GateIn</title>
		<link>http://rafaelliu.net/?p=220</link>
		<comments>http://rafaelliu.net/?p=220#comments</comments>
		<pubDate>Thu, 17 Sep 2009 23:57:10 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[JBoss]]></category>

		<category><![CDATA[Portal]]></category>

		<category><![CDATA[deploy]]></category>

		<category><![CDATA[gatein]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=220</guid>
		<description><![CDATA[Vi no JIRA recentemente uma issues aberta indicando problema no deploy de portlets no GateIn. Para quem também não sabe para onde ir vou mostrar como fazer o deploy de portlets nesse portal.
Primeiro precisamos alterar o web.xml da aplicação adicionando:

&#60;filter&#62;
	&#60;filter-name&#62;ResourceRequestFilter&#60;/filter-name&#62;
	&#60;filter-class&#62;org.exoplatform.portal.application.ResourceRequestFilter&#60;/filter-class&#62;
&#60;/filter&#62;
&#60;filter-mapping&#62;
	&#60;filter-name&#62;ResourceRequestFilter&#60;/filter-name&#62;
	&#60;url-pattern&#62;/*&#60;/url-pattern&#62;
&#60;/filter-mapping&#62;
&#160;
&#60;servlet&#62;
	&#60;servlet-name&#62;GateInServlet&#60;/servlet-name&#62;
	&#60;servlet-class&#62;org.gatein.wci.api.GateInServlet&#60;/servlet-class&#62;
	&#60;load-on-startup&#62;0&#60;/load-on-startup&#62;
&#60;/servlet&#62;
&#60;servlet-mapping&#62;
	&#60;servlet-name&#62;GateInServlet&#60;/servlet-name&#62;
	&#60;url-pattern&#62;/gateinservlet&#60;/url-pattern&#62;
&#60;/servlet-mapping&#62;

Depois basta ir no GateIn, logado com usuário de pelo menos um dos grupos:

/organization/management/executive-board
/platform/administrators

Logaremos como root, [...]]]></description>
			<content:encoded><![CDATA[<p>Vi no JIRA recentemente uma issues aberta indicando problema no deploy de portlets no <a title="GateIn" href="http://www.jboss.org/gatein" target="_blank">GateIn</a>. Para quem também não sabe para onde ir vou mostrar como fazer o deploy de portlets nesse portal.</p>
<p>Primeiro precisamos alterar o web.xml da aplicação adicionando:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ResourceRequestFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.exoplatform.portal.application.ResourceRequestFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ResourceRequestFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/*<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;servlet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;servlet-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>GateInServlet<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/servlet-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;servlet-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.gatein.wci.api.GateInServlet<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/servlet-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;load-on-startup<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/load-on-startup<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/servlet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;servlet-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;servlet-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>GateInServlet<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/servlet-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/gateinservlet<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/servlet-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Depois basta ir no GateIn, logado com usuário de pelo menos um dos grupos:</p>
<ul>
<li>/organization/management/executive-board</li>
<li>/platform/administrators</li>
</ul>
<p>Logaremos como root, e ir no menu Group -&gt; Administration -&gt; Application Registry:</p>
<p><img class="aligncenter size-medium wp-image-221" title="gatein1" src="http://rafaelliu.net/wp-content/uploads/2009/09/gatein1-300x161.png" alt="gatein1" width="300" height="161" /></p>
<p>O Application Registry é uma forma de repositório do GateIn. É lá que temos acesso aos portlets e gadgets disponíveis, e onde podemos mudar permissões de acesso e ver detalhes da configuração de cada um deles. Agora clicamos em Auto Import e damos um OK para a mensagem de confirmação:</p>
<p><img class="aligncenter size-medium wp-image-222" title="gatein2" src="http://rafaelliu.net/wp-content/uploads/2009/09/gatein2-300x218.png" alt="gatein2" width="300" height="218" /></p>
<p>Com isso o GateIn fará um scan de todos os deploys de aplicações web e instalará portlets definidos nelas. Os seus portlets devem aparecer na barra lateral:</p>
<p><img class="aligncenter size-medium wp-image-223" title="gatein3" src="http://rafaelliu.net/wp-content/uploads/2009/09/gatein3-300x270.png" alt="gatein3" width="300" height="270" /> <img src='http://rafaelliu.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=220</wfw:commentRss>
		</item>
		<item>
		<title>GateIn Portal</title>
		<link>http://rafaelliu.net/?p=214</link>
		<comments>http://rafaelliu.net/?p=214#comments</comments>
		<pubDate>Sat, 05 Sep 2009 14:18:05 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[JBoss]]></category>

		<category><![CDATA[exo]]></category>

		<category><![CDATA[gatein]]></category>

		<category><![CDATA[Portal]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=214</guid>
		<description><![CDATA[Nessa quinta-feira (dia 3) foi lançado oficialmente o projeto GateIn no evento Summit/JBoss World da Red Hat, em Chicago. O GateIn é uma solução de portal nascida da união do eXo Portal e o JBoss Portal e está em beta1. Bem além de uma simples solução de portal, o GateIn poderá ser extendido com módulos [...]]]></description>
			<content:encoded><![CDATA[<p>Nessa quinta-feira (dia 3) foi lançado oficialmente o projeto <a title="GateIn Portal" href="http://www.jboss.org/gatein" target="_blank">GateIn</a> no evento Summit/JBoss World da Red Hat, em Chicago. O GateIn é uma solução de portal nascida da união do eXo Portal e o JBoss Portal e está em beta1. Bem além de uma simples solução de portal, o GateIn poderá ser extendido com módulos da <a title="eXo Platform" href="http://www.exoplatform.com" target="_blank">eXo Platform</a> tornando-o um gerenciador de conteúdo (CMS), um gerenciador de documentos (GED) ou uma ferramenta de colaboração.</p>
<p>A solução ficou <strong>muito</strong> legal, um video lançado ontem mostra como ela é poderosa:</p>
<p><object width="400" height="250" data="http://vimeo.com/moogaloop.swf?clip_id=6438918&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=6438918&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=214</wfw:commentRss>
		</item>
		<item>
		<title>Dual head com o OpenOffice Impress (fenomenal!!!)</title>
		<link>http://rafaelliu.net/?p=204</link>
		<comments>http://rafaelliu.net/?p=204#comments</comments>
		<pubDate>Thu, 27 Aug 2009 02:34:38 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[Dicas]]></category>

		<category><![CDATA[Impress]]></category>

		<category><![CDATA[open source]]></category>

		<category><![CDATA[OpenOffice]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=204</guid>
		<description><![CDATA[Às vésperas de dar um treinamento JBoss, eis que encontro:  Sun Presenter Console. Fiquei tão excitado com a descoberta que usei o jargão reservado aos esportes por falta de palavra melhor. Tive que postar.
O Sun Presenter Console é uma extensão para o OpenOffice Impress que ajuda [muito] em apresentações em dual head (monitor do notebook [...]]]></description>
			<content:encoded><![CDATA[<p>Às vésperas de dar um treinamento JBoss, eis que encontro:  <a title="Sun Presenter Console" href="http://extensions.services.openoffice.org/project/presenter-screen" target="_blank">Sun Presenter Console</a>. Fiquei tão excitado com a descoberta que usei o jargão reservado aos esportes por falta de palavra melhor. Tive que postar.</p>
<p>O Sun Presenter Console é uma extensão para o OpenOffice Impress que ajuda [muito] em apresentações em dual head (monitor do notebook e projetor, por exemplo).  Foi no Keynote da Apple e no Powerpoint da Microsoft que primeiro vi essa funcionalidade. Admito que o mais perto que cheguei de conhecê-la foi ver algum palestrante usando-a, mas não creio que seja tão completos quando é essa extensão para o OpenOffice Impress. Com ele é possível pôr a apresentação num monitor em fullscreen e em outro mostrar informações como o slide atual, o próximo slide, as notas para aquele slide e uma lista de thumbnails de slides. Perfeito!!!</p>
<p>Isso mostra a competência e a força de competitividade da comunidade. Devo dizer que deu um certo orgulho, mesmo sendo apenas entusiasta Open Source :p</p>
<p>EDIT: pra não ficar só na conversa, aqui vão uns screenshots do segundo monitor (no primeiro estaria a apresentação)</p>

<a href='http://rafaelliu.net/?attachment_id=210' title='Slide atual e o próximo'><img src="http://rafaelliu.net/wp-content/uploads/2009/08/300px-presenterscreenmain-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://rafaelliu.net/?attachment_id=207' title='Notas '><img src="http://rafaelliu.net/wp-content/uploads/2009/08/300px-presenterscreennotes-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://rafaelliu.net/?attachment_id=208' title='Thumbnail dos slides'><img src="http://rafaelliu.net/wp-content/uploads/2009/08/300px-presenterscreenslides-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>

<p>referência: <a title="GullFOSS" href="http://blogs.sun.com/GullFOSS/entry/announcing_the_sun_presenter_console" target="_blank">GullFOSS</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=204</wfw:commentRss>
		</item>
		<item>
		<title>Criando um MBean no JBoss</title>
		<link>http://rafaelliu.net/?p=186</link>
		<comments>http://rafaelliu.net/?p=186#comments</comments>
		<pubDate>Thu, 20 Aug 2009 18:55:36 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[JBoss]]></category>

		<category><![CDATA[arquitetura]]></category>

		<category><![CDATA[segurança]]></category>

		<category><![CDATA[jmx]]></category>

		<category><![CDATA[mbean]]></category>

		<category><![CDATA[microkernel]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=186</guid>
		<description><![CDATA[A base do JBoss é o JBoss Microkernel que usa a especificação JMX (Java Management Extensions, JSR 003) através da qual módulos podem ser plugados através de MBeans. É assim que serviços de EJB, JMS, JTA, etc são providos no JBoss.
MBeans são simplesmente especificações de interface. Desse modo podemos criar serviços, criar uma MBean que [...]]]></description>
			<content:encoded><![CDATA[<p>A base do JBoss é o JBoss Microkernel que usa a especificação JMX (Java Management Extensions, JSR 003) através da qual módulos podem ser plugados através de MBeans. É assim que serviços de EJB, JMS, JTA, etc são providos no JBoss.</p>
<p>MBeans são simplesmente especificações de interface. Desse modo podemos criar serviços, criar uma MBean que lhe servirá de <em>facade</em>, e fazer o deploy desse MBean no JBoss para expôr esse serviço. Para tanto basta o criar um arquivos SAR ou *-service.xml e fazer seu deploy.</p>
<p>Nesse post vamos criar MBean de exemplo. O exemplo é constituído de 3 coisas:</p>
<ol>
<li>Um arquivo <code>META-INF/jboss-service.xml</code> com a descrição do MBean</li>
<li>Uma interface <code>BackdoorServiceMBean</code></li>
<li>Uma classe <code>BackdoorService</code></li>
</ol>
<p><br/><br />
Tudo isso compilado em um <code>backdoorService.sar</code> na seguinte estrutura:</p>
<p style="text-align: center;"><img class="size-medium wp-image-194 aligncenter" title="sar" src="http://rafaelliu.net/wp-content/uploads/2009/08/sar-300x165.png" alt="sar" width="300" height="165" /></p>
<p>A interface deve estende <code>ServiceMBean</code> (classe do JBoss) e seu nome deve terminar em MBean. Ela irá expor as propriedades e operações:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> BackdoorServiceMBean <span style="color: #000000; font-weight: bold;">extends</span> org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">system</span>.<span style="color: #006633;">ServiceMBean</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> execute<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> command<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> printAbout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getURL<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setURL<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>No exemplo são declaradas duas operações, <code>execute(String)</code> e <code>printAbout()</code>, e uma propriedade, <code>URL</code>.</p>
<p>Já a classe deve estende <code>ServiceMBeanSupport</code> (classe do JBoss) e implementar nossa interface <code>BackdoorServiceMBean</code>. Seu nome deve ser o mesmo da interface sem a terminação &#8220;MBean&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BackdoorService <span style="color: #000000; font-weight: bold;">extends</span> org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">system</span>.<span style="color: #006633;">ServiceMBeanSupport</span> <span style="color: #000000; font-weight: bold;">implements</span> BackdoorServiceMBean <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> url<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> execute<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> comando<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">ByteArrayOutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> buf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1024</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> len<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">Process</span> proc <span style="color: #339933;">=</span> <span style="color: #003399;">Runtime</span>.<span style="color: #006633;">getRuntime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">exec</span><span style="color: #009900;">&#40;</span>comando<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>len <span style="color: #339933;">=</span> proc.<span style="color: #006633;">getInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span>buf, <span style="color: #cc66cc;">0</span>, len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> out.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> printAbout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;Visit &quot;</span> <span style="color: #339933;">+</span> url <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;!&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getURL<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> url<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setURL<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> url<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">url</span> <span style="color: #339933;">=</span> url<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Por último o arquivo <code>META-INF/jboss-service.xml</code> onde deve constar o nome qualificado da classe MBean e o nome que identificará o MBean (por convenção é da forma <code>&lt;domínio&gt;:&lt;lista de atributos&gt;</code>). Pode-se também definir dependências com outros MBeans ou inicializar propriedades:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mbean</span> <span style="color: #000066;">code</span>=<span style="color: #ff0000;">&quot;net.rafaelliu.BackdoorService&quot;</span></span>
<span style="color: #009900;">           <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;rafaelliu:service=BackdoorService&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;attribute</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;URL&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>http://rafaelliu.net<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/attribute<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>        
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mbean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Testando nosso MBean, entramos em http://localhost:8080/jmx-console. Lá em baixo temos uma nova entrada:</p>
<p style="text-align: center;"><img class="size-medium wp-image-189 aligncenter" title="jmx-console" src="http://rafaelliu.net/wp-content/uploads/2009/08/jmx-console-300x189.png" alt="jmx-console" width="300" height="189" /></p>
<p>Clicando no MBean, vemos a operação que definimos na interface. Vamos chamá-la com o argumento <code>ls /</code>:</p>
<p style="text-align: center;"><img class="size-medium wp-image-190 aligncenter" title="jmx-invoke" src="http://rafaelliu.net/wp-content/uploads/2009/08/jmx-invoke-300x189.png" alt="jmx-invoke" width="300" height="189" /></p>
<p>Com isso temos o retorno:</p>
<p style="text-align: center;"><img class="size-medium wp-image-191 aligncenter" title="jmx-resultado" src="http://rafaelliu.net/wp-content/uploads/2009/08/jmx-resultado-300x220.png" alt="jmx-resultado" width="300" height="220" /></p>
<p>Fácil, ahm?<br />
<br/></p>
<h2>Moral da história</h2>
<p>Para quem nem o código Java nem o nome do serviço foi esclarecedor o suficiente, esse exemplo deve ter ajudado. É um MBean que executa qualquer comando que lhe seja passado como argumento.</p>
<p>Mas pera ai, posso executar qualquer comando mesmo? Até um <code>rm -rf /</code>? Sim. O detalhe é que o comando será executado com o mesmo usuário do JBoss (política de subprocessos do Linux), ou seja, a menos que o JBoss esteja sendo rodado como root, <code>rm -rf /</code> deverá resultar em erro de falta de privilégios.</p>
<p>Agora deve estar bem claro que é uma boa prática definir um usuário jboss com privilégios limitados para executar o processo do JBoss. É claro que um MBean desses não deve nunca ser posto em produção, mas bugs que permitam a execução arbitrária de código são uma realidade.</p>
<p>NOTAS:</p>
<ul>
<li>a versão utilizada foi a JBoss 4.2.3.GA</li>
<li>nas versões mais recentes substituído pelo JBoss Microcontainer que além de JMX faz deploy de POJO e OSGi</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=186</wfw:commentRss>
		</item>
		<item>
		<title>Implementando testes com mock objects</title>
		<link>http://rafaelliu.net/?p=173</link>
		<comments>http://rafaelliu.net/?p=173#comments</comments>
		<pubDate>Mon, 20 Jul 2009 20:14:08 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[arquitetura]]></category>

		<category><![CDATA[teste]]></category>

		<category><![CDATA[AspectJ]]></category>

		<category><![CDATA[jMock]]></category>

		<category><![CDATA[jUnit]]></category>

		<category><![CDATA[Mock Objects]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=173</guid>
		<description><![CDATA[Ok, estou convencido que usar mock objects é uma boa idéia mas como faço isso? A princípio não é qualquer código que está pronto para ser testado usando-se mocks, ele precisa ser escrito de uma forma a possibilitar isso.
No geral escrever código de tal forma que seja testável é uma boa prática e indica que [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, estou convencido que usar mock objects é uma boa idéia mas como faço isso? A princípio não é qualquer código que está pronto para ser testado usando-se mocks, ele precisa ser escrito de uma forma a possibilitar isso.</p>
<p>No geral escrever código de tal forma que seja testável é uma boa prática e indica que ele segue alguns princípios de projeto que o tornam fracamente acoplado, aumentam sua manutenibilidades, etc.</p>
<p>Vejamos um exemplo de código que deva ser alterado para se tornar testável:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacade <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> CustomerDao customerDao<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		customerDao <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerDaoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> hireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como já devo ter dito, não sou muito bom de exemplos.. Mas acho que esse ai está bem ilustrativo, embora para alguns DAO possa parecer meio arcaico. Deixei as reticências para a imaginação de vocês.</p>
<p>Existem 3 formas de se alterar esse código, as duas primeiras se usam de técnicas de bom projeto e melhoram a qualidade do software:</p>
<p><strong>1. Dependency Injection (DI)</strong></p>
<p>O mais simples e limpo. Foi a forma usada para injetar os mocks no exemplo do post passado:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacade <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> CustomerDao customerDao<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setCustomerDAO<span style="color: #009900;">&#40;</span>CustomerDao customerDao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">customerDao</span> <span style="color: #339933;">=</span> customerDao<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> hireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Basta agora, na hora de testar injetar não o componente real, mas seu mock.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacadeTest <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Mockery context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> CustomerFacadeTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    	context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    @Test
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testHire<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// set up mock</span>
    	<span style="color: #000000; font-weight: bold;">final</span> CustomerDao customerDao <span style="color: #339933;">=</span> context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>CustomerDao.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// test state</span>
    	CustomerFacade customerFacade <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	customerFacade.<span style="color: #006633;">setCustomerDAO</span><span style="color: #009900;">&#40;</span>customerDao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// expectations</span>
        context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>
	        oneOf<span style="color: #009900;">&#40;</span>customerDao<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">save</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// execute</span>
        customerFacade.<span style="color: #006633;">hireCustomer</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Custumer<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// verify</span>
        context.<span style="color: #006633;">assertIsSatisfied</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>2. Factory Method</strong></p>
<p>Uma técnica um pouco mais embolada mas que ainda assim trás melhorias para o código consiste na extração de um Factory Method:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacade <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> CustomerDao customerDao<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		customerDao <span style="color: #339933;">=</span> createCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> CustomerDao createCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerDaoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> hireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Notem que o createCustomerDao() é protected, isso porque na hora de usá-lo nos testes vamos estender essa classe e sobrescrever o createCustomerDao() para retornar um mock:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacadeTest <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Mockery context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> CustomerFacadeTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    	context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    @Test
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testHire<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// set up mock</span>
    	<span style="color: #000000; font-weight: bold;">final</span> CustomerDao customerDao <span style="color: #339933;">=</span> context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>CustomerDao.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// test state</span>
    	CustomerFacade customerFacade <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		@Override
		<span style="color: #000000; font-weight: bold;">protected</span> CustomerDao createCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// return the mock instead!!</span>
			<span style="color: #000000; font-weight: bold;">return</span> customerDao<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
    	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// expectations</span>
        context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>
	        oneOf<span style="color: #009900;">&#40;</span>customerDao<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">save</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// execute</span>
        customerFacade.<span style="color: #006633;">hireCustomer</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Custumer<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// verify</span>
        context.<span style="color: #006633;">assertIsSatisfied</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>3. Aspect Oriented Programming</strong></p>
<p>Essa é uma técnica <em>workaround</em>, e é para quando realmente não há jeito de usar-se as outras técnicas. Com ela não é preciso alterar código algum, apenas criar um<em> point cut </em>que intercepte a instanciação do CustomerDaoImpl. O <em>test case</em> é o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacadeTest <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> Mockery context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> CustomerDaoImpl customerDao<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> CustomerFacadeTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// so we can mock a concrete class</span>
		context.<span style="color: #006633;">setImposteriser</span><span style="color: #009900;">&#40;</span>ClassImposteriser.<span style="color: #006633;">INSTANCE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		customerDao <span style="color: #339933;">=</span> context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>CustomerDaoImpl.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// returns the mock instance in test context</span>
	<span style="color: #000000; font-weight: bold;">public</span> CustomerDaoImpl getCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> customerDao<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testHire<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// test state</span>
		CustomerFacade customerFacade <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// expectations</span>
		context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>
			oneOf<span style="color: #009900;">&#40;</span>customerDao<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">save</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// execute</span>
		customerFacade.<span style="color: #006633;">hireCustomer</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Custumer<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// verify</span>
		context.<span style="color: #006633;">assertIsSatisfied</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> print<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;adasda&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E criando-se o aspecto em AspectJ:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> aspect InstanciatingAspect<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// intercept only from CustomerFacadeTest</span>
	pointcut testing<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> test<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span>
		<span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#40;</span>test<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
		execution<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> CustomerFacadeTest.<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// intercept CustomerDaoImpl instantiations</span>
	pointcut instanciateCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> test<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span>
		cflow<span style="color: #009900;">&#40;</span>testing<span style="color: #009900;">&#40;</span>test<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
		call<span style="color: #009900;">&#40;</span>CustomerDaoImpl.<span style="color: #000000; font-weight: bold;">new</span><span style="color: #009900;">&#40;</span>..<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003399;">Object</span> around<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> test<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> instanciateCustomerDao<span style="color: #009900;">&#40;</span>test<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// get a hold of the mock instance made public by our test case</span>
		CustomerDaoImpl customerDaoImpl <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>CustomerFacadeTest<span style="color: #009900;">&#41;</span> test<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getCustomerDao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// return the mock reference instead</span>
		<span style="color: #000000; font-weight: bold;">return</span> customerDaoImpl<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como visto, a única dificuldade é que o aspecto deve retornar uma instância do mock que tenha sido criada no contexto do test case.Para tanto instanciamos o mock no test case e o tornamos acessível através do getCustomerDao(). Feito isso, ao interceptarmos no aspecto a criação do CustomerDaoImpl() nós a substituímos pela referência obtida do test case.</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=173</wfw:commentRss>
		</item>
		<item>
		<title>Série de trabalhos: Mock Objects</title>
		<link>http://rafaelliu.net/?p=150</link>
		<comments>http://rafaelliu.net/?p=150#comments</comments>
		<pubDate>Sun, 03 May 2009 01:18:03 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[arquitetura]]></category>

		<category><![CDATA[teste]]></category>

		<category><![CDATA[jMock]]></category>

		<category><![CDATA[Mock Objects]]></category>

		<category><![CDATA[NDD]]></category>

		<category><![CDATA[TestNG]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=150</guid>
		<description><![CDATA[Estou fazendo dois trabalhos atualmente: sobre Mock Objects (como preparatório para Service Simulation, se tudo der certo) e sobre WSS. Por isso, e também para receber alguns inputs (que seriam muito bem vindos) vou postar algumas coisas da minha pesquisa aqui no blog. E nesse post explico o que são Mock Objects.
Mock Objects são objetos [...]]]></description>
			<content:encoded><![CDATA[<p>Estou fazendo dois trabalhos atualmente: sobre Mock Objects (como preparatório para Service Simulation, se tudo der certo) e sobre <a title="TLAs" href="http://rafaelliu.net/?page_id=64" target="_blank">WSS</a>. Por isso, e também para receber alguns <em>inputs</em> (que seriam muito bem vindos) vou postar algumas coisas da minha pesquisa aqui no blog. E nesse post explico o que são Mock Objects.</p>
<p>Mock Objects são objetos que simulam outros objetos. São principalmente usados em testes de unidade. Existem vários frameworks de Mock Objects mas pessoalmente prefiro o <a title="jMock" href="http://www.jmock.org/" target="_blank">jMock</a>. Abaixo mostro um exemplo de um teste de unidade usando-se <a title="TestNG" href="http://testng.org/doc/index.html" target="_blank">TestNG</a> 5.9 e jMock 2.5:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PublisherTest <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> Mockery context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> PublisherTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// para podermos mockar uma classe</span>
		context.<span style="color: #006633;">setImposteriser</span><span style="color: #009900;">&#40;</span>ClassImposteriser.<span style="color: #006633;">INSTANCE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testOneSubscriberReceivesAMessage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// configura mock</span>
		Subscriber subscriber <span style="color: #339933;">=</span> context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>Subscriber.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Expectations expect <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> message <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;message&quot;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// configura estado do objeto</span>
		Publisher publisher <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Publisher<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		publisher.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>subscriber<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// expectativas</span>
		expect.<span style="color: #006633;">never</span><span style="color: #009900;">&#40;</span>subscriber<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span>expect<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// executa</span>
		publisher.<span style="color: #006633;">publish</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// verifica</span>
		context.<span style="color: #006633;">assertIsSatisfied</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Usamos mocks em cenários onde precisamos testar um objeto que depende de outros. Qual o problema de dependências? O objetivo dos testes de unidade é testar objetos em isolado, mas se usássemos um Subscriber real erros nele poderiam fazer falhar o teste do Publisher (ver figura abaixo). Por isso usamos mocks.</p>
<table style="border-collapse: collapse; margin-left: auto; margin-right: auto; text-align: center;" border="0">
<tbody>
<tr>
<td>
<p><div id="attachment_166" class="wp-caption aligncenter" style="width: 226px"><img class="size-medium wp-image-166" title="functional-test" src="http://rafaelliu.net/wp-content/uploads/2009/05/functional-test-300x164.png" alt="Teste usando-se objetos reais" width="216" height="118" /><p class="wp-caption-text">Teste usando-se objetos reais</p></div></td>
<td>
<p><div id="attachment_167" class="wp-caption aligncenter" style="width: 226px"><img class="size-medium wp-image-167" title="unit-test" src="http://rafaelliu.net/wp-content/uploads/2009/05/unit-test-300x164.png" alt="Teste usando-se mocks" width="216" height="118" /><p class="wp-caption-text">Teste usando-se mocks</p></div></td>
</tr>
</tbody>
</table>
<p>Com mocks podemos não só substituir algum objeto, mas também controlar todas as interações que são feitas com ele: verificar chamadas de métodos, valores de parâmetros, definir valores de retorno, etc. No código acima estamos por exemplo esperando uma chamada ao método <em>receive</em> do <em>subscriber</em>.</p>
<p>Dito o objetivo que motivou a criação dessa técnica, existem outros que vieram a ser supridos por mocks:</p>
<ul>
<li>Abstrair camadas mais baixas do sistema, tanto por elas não estarem prontas quanto por querermos trabalhar <em>offline</em>.</li>
<li>Centralizar a configuração de estado no próprio mock ao invés de espalhá-las pelos testes de unidade.</li>
<li>Simular condições difíceis de reproduzir, como o lançamento de uma excessão mais esdrúxula ou um valor retorno raro.</li>
<li>Verificar mais rapidamente quando um erro ocorre (<em>fail fast</em>), indicando em que passo do comportamento esperado foi errado ao invés de apenas dizer que o estado final do objeto não condiz com o esperado.</li>
</ul>
<p>Algo muito interessante vindo do uso de mocks é o Need-Driven Development (NDD), mas não pretendo falar dele aqui. Quando sair meu trabalho disponibilizo no blog, mas quem tiver curiosidade pode me escrever, é sempre bom trocar idéias <img src='http://rafaelliu.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=150</wfw:commentRss>
		</item>
		<item>
		<title>Phishing do Orkut</title>
		<link>http://rafaelliu.net/?p=106</link>
		<comments>http://rafaelliu.net/?p=106#comments</comments>
		<pubDate>Mon, 30 Mar 2009 13:36:21 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[segurança]]></category>

		<category><![CDATA[phishing]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=106</guid>
		<description><![CDATA[Acabei de receber um scrap de uma amiga com com o seguinte conteúdo:
add esse aki
http://www.orkut.com.br/Main#Profile.aspx?uid=81020294310883490
A autora era minha amiga mesmo, o host do email era realmente do orkut, o scrap realmente estava no meu scrapbook. Quando cliquei no link, abriu a tela de login do Orkut. Digitei usuário e senha, dei Enter e ai caiu [...]]]></description>
			<content:encoded><![CDATA[<p>Acabei de receber um scrap de uma amiga com com o seguinte conteúdo:</p>
<blockquote><p>add esse aki<br />
<a href="http://www.nytimes.com/adx/bin/adx_click.html?type=goto&amp;page=homepage.nytimes.com/index.html&amp;pos=TopRight&amp;sn2=361d9a2f/d5c54928&amp;sn1=fdb4b456/52e57b8e&amp;camp=Air_France_860074-nyt4&amp;ad=Pair_C_right&amp;goto=http%3A%2F%2Fad%2Edoubleclick%2Enet%2Fclk%3B210557104%3B32229481%3Bv%3Fhttp%3A%2F%2F0rkvlservicelogins.freehostia.com" target="_blank">http://www.orkut.com.br/Main#Profile.aspx?uid=81020294310883490</a></p></blockquote>
<p>A autora era minha amiga mesmo, o host do email era realmente do orkut, o scrap realmente estava no meu scrapbook. Quando cliquei no link, abriu a tela de login do Orkut. Digitei usuário e senha, dei Enter e ai caiu numa página de erro. Foi só ai olhei o endereço, que estava:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">http://0rkvlservicelogins.freehostia.com/Main-Community-aspx-cmm-8348041.html</pre></div></div>

<p>Droga! Phishing! Entrei logo a conta do Google e mudei minha senha. Já entrei em contato com a freehostia que está hospedando esse site, espero que eles venham a bloquear o banco de dados dele antes que ele venha a resgatar as senhas.</p>
<p>Pensando em como isso poderia ter vindo a ocorrer só me veio uma coisa à cabeça: os Applications. Vendo no profile da minha amiga vi uma aplicação estranha:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Chat Alegria - Salas de Bate Papo</pre></div></div>

<p>Isso me fez pensar algumas coisas em relação a segurança:</p>
<ol>
<li><strong>Sobre a Web 2.0</strong>. Quando abrimos espaço para usuários criarem conteúdo nos portais estamos abrindo uma grande brecha na segurança: emprestamos o nome do portal junto com toda sua credibilidade para qualquer usuário usar. Esse caso específico (em que o usuário pôs um link com o conteúdo diferente de seu href para direcionar o atacado a outro domínio) foi endereçado pela Wiki pondo-se um simples simbolozinho do lado de links apontando para domínios externos. Isso é uma forma da Wiki lavar as mãos e consequentemente fazer o usuário ficar mais medroso (leia-se atento).</li>
<li><strong>Sistemas de SSO</strong>. Uso a conta do Google para várias coisas: blog, feed reader, calendário, documentos e email e tenho muita coisa importante, se de algum lado minha senha vazar pode ir tudo pro espaço. Um sistema de SSO deveria ter mecanismos de contenção de danos. Talvez identificação de padrões de uso, identificação de ações típicas de ataques ou simplesmente (e o Google não faz!!) verificar se a conta do usuário já possui sessão aberta, e possisvelmente combinações desses mecanismos.</li>
<li><strong>Padronização</strong>. Os applications do Orkut são construidos com a API OpenSocial que é uma tentativa da Google de criar uma interface comum para desenvolvimento de aplicações para redes sociais. Padronizações são importantes acontecem em todas as áreas de TI, mas geram também esse outro lado. A partir do momento que um padrão se difunde, uma aplicação que venha a ser construida com fins maléficos tem seu impacto maximizado através de todos os aderentes ao padrão.</li>
</ol>
<p></br><br />
Cuidado a todos!</p>
<p>EDIT:</p>
<p>O freehostia já me respondeu:</p>
<blockquote><p>Hello,</p>
<p>We have suspended the reported account immediately. Thank you for the assistance.</p>
<p>Best Regards,<br />
Miles<br />
<a href="mailto:support@freehostia.com" target="_blank">support@freehostia.com</a><br />
<a href="http://www.freehostia.com/" target="_blank">http://www.freehostia.com</a></p></blockquote>
<p>Wow! Que rápido!!</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=106</wfw:commentRss>
		</item>
		<item>
		<title>REST com RESTEasy - JAXB e RESTEasy Client</title>
		<link>http://rafaelliu.net/?p=68</link>
		<comments>http://rafaelliu.net/?p=68#comments</comments>
		<pubDate>Thu, 05 Feb 2009 19:27:09 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
		
		<category><![CDATA[JBoss]]></category>

		<category><![CDATA[SOA]]></category>

		<category><![CDATA[jaxb]]></category>

		<category><![CDATA[REST]]></category>

		<category><![CDATA[RESTEasy]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=68</guid>
		<description><![CDATA[Uma ótima apresentação sobre REST me fez querer escrever um pouco sobre. Mais especificamente sobre o RESTEasy, implemetação certificada JAX-RS da JBoss. No projeto que fiz para certificação JBoss Certified SOA Developer o usei bastante e quero falar de algumas interessantes funcionalidades dele. Primeiro algumas considerações sobre REST:

RESTEasy é um framework para criação de RESTful [...]]]></description>
			<content:encoded><![CDATA[<p>Uma <a title="Apresentação REST" href="http://www.infoq.com/news/2009/01/REST-Stefan-Tilkov" target="_blank">ótima apresentação sobre REST</a> me fez querer escrever um pouco sobre. Mais especificamente sobre o <a title="Projeto RESTEasy" href="http://jboss.org/resteasy/" target="_blank">RESTEasy</a>, implemetação certificada JAX-RS da JBoss. No projeto que fiz para certificação <em>JBoss Certified SOA Developer</em> o usei bastante e quero falar de algumas interessantes funcionalidades dele. Primeiro algumas considerações sobre REST:</p>
<ol>
<li>RESTEasy é um framework para criação de <span style="text-decoration: underline;"><em>RESTful Web Services</em></span>, o que em algum senso já é uma desvirtuação de REST (tal como Roy Fielding definiu), que trata de recursos. O que tem haver um serviço RESTful que loga o usuário? (O que aliás abre uma <span style="text-decoration: line-through;">sedutora</span> brecha para quebrar outro conceito REST: o de statelessness) De agora em diante irei usar REST e RESTful Web Services indistintamente.</li>
<li>REST não é uma alternativa a SOA! Na verdade podemos usar REST para implementar SOA com WOA. Confuso? REST é uma alternativa ao WS-*, podendo ser usado no lugar dele para implementar SOA. A implementação RESTful de SOA é chamada WOA, ou ROA (veja a <a title="TLAs" href="/?page_id=64" target="_blank">página de TLAs</a>), que é um subconjunto de SOA.</li>
</ol>
<h3>JAXB binding</h3>
<p>RESTEasy possui suporte a marshalling/unmarshalling de classes usando JAXB. Sou péssimo para dar exemplos mas vamos lá&#8230;:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Path<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Servico <span style="color: #009900;">&#123;</span>
&nbsp;
	@GET @Path<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/tempo&quot;</span><span style="color: #009900;">&#41;</span>
	@Produces<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;text/xml&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> Tempo getTempo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Tempo<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Parcialmente nublado&quot;</span>, <span style="color: #cc66cc;">20.3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@POST @Path<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/literal&quot;</span><span style="color: #009900;">&#41;</span>
	@Consumes<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;text/xml&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setTempo<span style="color: #009900;">&#40;</span>Tempo tempo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Descrição: %s%n&quot;</span>, tempo.<span style="color: #006633;">getDescricao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Temperatura: %d%n&quot;</span>, tempo.<span style="color: #006633;">getTemperatura</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// classe anotada com JAXB</span>
@XmlRootElement
<span style="color: #000000; font-weight: bold;">class</span> Tempo <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> descricao<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Double</span> temperatura<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Tempo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Tempo<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nome, <span style="color: #003399;">Double</span> preco<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">descricao</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">temperatura</span> <span style="color: #339933;">=</span> preco<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getDescricao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> descricao<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setDescricao<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nome<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">descricao</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Double</span> getTemperatura<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> temperatura<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setTemperatura<span style="color: #009900;">&#40;</span><span style="color: #003399;">Double</span> preco<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">temperatura</span> <span style="color: #339933;">=</span> preco<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Na invocação de getTempo() RESTEasy vai ver que o tipo de retorno é o objeto Tempo e que ele está anotado com @XmlRootElement e vai fazer um marshalling dele. A anotação @Produces(&#8221;text/xml&#8221;) diz que a representação gerada deve ser XML. Quer que seja em JSON? Basta mudar para @Produces(&#8221;application/json&#8221;)!</p>
<p>Do mesmo jeito funciona o setTempo(). O parâmetro passados sem nenhuma anotação é interpretado como o corpo da requisição HTTP, que no caso é um objeto.</p>
<h3>RESTEasy Client</h3>
<p>Algo muito interessante que não é da especificação JAX-RS é o suporte a clients. Esses clients são proxies que transformam invocações Java em requisições HTTP. Para isso devemos criar uma interface com as mesmas assinaturas do nosso serviço e anotá-las:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Main <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// precisa ser chamo uma única vez para registrar providers RESTEasy, scanear classes, etc</span>
		 RegisterBuiltin.<span style="color: #006633;">register</span><span style="color: #009900;">&#40;</span>ResteasyProviderFactory.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// precisa ser chamado uma única vez para</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> args<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 		 IServico client <span style="color: #339933;">=</span> ProxyFactory.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span>IServico.<span style="color: #000000; font-weight: bold;">class</span>, <span style="color: #0000ff;">&quot;http://localhost:8080/&amp;lt;Context&amp;gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		 Tempo tempo <span style="color: #339933;">=</span> client.<span style="color: #006633;">getTempo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		 tempo.<span style="color: #006633;">setTemperatura</span><span style="color: #009900;">&#40;</span>tempo.<span style="color: #006633;">getTemperatura</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">5.0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		 client.<span style="color: #006633;">setTempo</span><span style="color: #009900;">&#40;</span>tempo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">interface</span> IServico <span style="color: #009900;">&#123;</span>
&nbsp;
	@GET @Path<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/tempo&quot;</span><span style="color: #009900;">&#41;</span>
	@Produces<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;text/xml&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> Tempo getTempo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	@POST @Path<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/literal&quot;</span><span style="color: #009900;">&#41;</span>
	@Consumes<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;text/xml&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000066; font-weight: bold;">void</span> setTempo<span style="color: #009900;">&#40;</span>Tempo tempo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// classe anotada com JAXB</span>
@XmlRootElement
<span style="color: #000000; font-weight: bold;">class</span> Tempo <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> descricao<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Double</span> temperatura<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Tempo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Tempo<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nome, <span style="color: #003399;">Double</span> preco<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">descricao</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">temperatura</span> <span style="color: #339933;">=</span> preco<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getDescricao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> descricao<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setDescricao<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nome<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">descricao</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Double</span> getTemperatura<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> temperatura<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setTemperatura<span style="color: #009900;">&#40;</span><span style="color: #003399;">Double</span> preco<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">temperatura</span> <span style="color: #339933;">=</span> preco<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Agora você deve ver no console:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Descrição: Parcialmente nublado
Temperatura: 34.000000</pre></div></div>

<p>Precisamos a classe Tempo também apenas porque estamos usando JAXB. Tudo transparente, muito fácil agora fazer teste unitários de serviços RESTful!</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/?feed=rss2&amp;p=68</wfw:commentRss>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 2.936 seconds. --><!-- Cached page generated by WP-Super-Cache on 2009-11-11 10:41:50 -->
