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

<channel>
	<title>marcuscavalcanti.net &#187; Java</title>
	<atom:link href="http://www.marcuscavalcanti.net/blog/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcuscavalcanti.net/blog</link>
	<description>Software, tecnologia e etc.</description>
	<lastBuildDate>Sun, 22 Jan 2012 21:18:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Groovy + Grails</title>
		<link>http://www.marcuscavalcanti.net/blog/2011/07/29/groovy-grails/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2011/07/29/groovy-grails/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 05:21:26 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[grails groovy jvm java framework]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1410</guid>
		<description><![CDATA[Desenvolver para WEB com Java nunca foi algo prazeroso, eu particularmente que sou oriundo de linguagens dinâmicas e de frameworks RoR like, nunca gostei de desenvolver com Java para WEB. Já tive a oportunidade de participar de projetos que utilizam frameworks como: Apache Beehive, Struts e Mentawaii. Assim como também tive a oportunidade de testar [...]]]></description>
			<content:encoded><![CDATA[<p>Desenvolver para WEB com Java nunca foi algo prazeroso, eu particularmente que sou oriundo de <a href="http://en.wikipedia.org/wiki/Dynamic_programming_language" target="_blank" style="text-decoration: underline">linguagens dinâmicas</a> e de frameworks <a href="http://www.rubyonrails.org" target="_blank" style="text-decoration: underline">RoR</a> <em>like</em>, nunca gostei de desenvolver com Java para WEB. Já tive a oportunidade de participar de projetos que utilizam <em>frameworks</em> como: <a href="http://beehive.apache.org/" target="_blank" style="text-decoration: underline">Apache Beehive</a>, <a href="http://struts.apache.org/" target="_blank" style="text-decoration: underline">Struts</a> e <a href="http://www.mentaframework.org/" target="_blank" style="text-decoration: underline">Mentawaii</a>. Assim como também tive a oportunidade de testar outros como: <a href="http://wicket.apache.org/" target="_blank" style="text-decoration: underline">Wicket</a>, <a href="http://tapestry.apache.org/" target="_blank" style="text-decoration: underline">Tapestry</a>, <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html" target="_blank" style="text-decoration: underline">Spring-MVC</a>, etc. Desses, o que mais se aproximou de algo razoável foi o Spring-MVC, que parece nunca ser levado a sério pela própria <a href="http://www.springsource.com/" target="_blank" style="text-decoration: underline">SpringSource</a>, que lançou a versão 3, mas nunca de forma realmente oficial, uma prova disso é que documentações a seu respeito são um tanto difíceis de serem achadas.</p>
<p>Quanto a <a href="http://www.oracle.com/technetwork/java/javaee/servlet/index.html" target="_blank" style="text-decoration: underline">Servlets</a> (um mal necessário) e <a href="http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html" target="_blank" style="text-decoration: underline">JSF</a> (e suas <a href="http://en.wikipedia.org/wiki/JavaServer_Faces" target="_blank" style="text-decoration: underline">N implementações</a>), prefiro nem citar a minha opinião.</p>
<p>Paralelo a isso, aconteceu toda uma <a href="http://www.marcuscavalcanti.net/blog/2009/03/17/ponto-para-o-rails/" target="_blank" style="text-decoration: underline">revolução</a> na maneira de pensar em desenvolvimento para WEB com o lançamento do Ruby on Rails &#8211; <em>framework</em> WEB da linguagem Ruby &#8211; que foi um verdadeiro marco e que acabou impactando quase todas as outras linguagens, inclusive o próprio Java. A <a href="http://en.wikipedia.org/wiki/KISS_principle" target="_blank" style="text-decoration: underline">idéia</a> do RoR é simples: facilitar, simplificar e tornar prazeroso o desenvolvimento para web. Seguir essa idéia sempre me pareceu uma boa opção.</p>
<h3>Java como plataforma</h3>
<p>Com todo esse advento dos novos <em>frameworks</em> WEB baseados no RoR e do crescimento de algumas linguagens como o próprio <a href="http://www.ruby-lang.org/en/" target="_blank" style="text-decoration: underline">Ruby</a>, <a href="http://www.python.org/" target="_blank" style="text-decoration: underline">Python</a> e até linguagens de <a href="http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_funcional" target="_blank" style="text-decoration: underline">programação funcional</a>, o Java, que já tem um estigma de ser uma linguagem complexa e que demora a evoluir, acabou perdendo força na comunidade como linguagem, mas em compensação passou a ser mais notada  como plataforma, principalmente por causa do poder da <a href="http://en.wikipedia.org/wiki/Java_Virtual_Machine" target="_blank" style="text-decoration: underline">JVM</a> e das possibilidades que a mesma trás, com isso alguns projetos interessantes como <a href="http://www.jython.org/" target="_blank" style="text-decoration: underline">Jython</a> e <a href="http://www.jruby.org/" target="_blank" style="text-decoration: underline">JRuby</a> surgiram e esses projetos nada mais são do que outras linguagens rodando em cima da JVM, ou seja, é possível desenvolver código Python e no final o mesmo virar <em><a href="http://en.wikipedia.org/wiki/Java_bytecode" target="_blank" style="text-decoration: underline">byte-code</a></em> e ser executado pela JVM.</p>
<p>E é nesse ponto que eu quero chegar, o assunto do próximo tópico.</p>
<h3>Groovy</h3>
<p><a href="http://groovy.codehaus.org/" target="_blank" style="text-decoration: underline">Groovy</a> é uma nova linguagem, que roda em cima da JVM e que foi pensada de uma forma para ser dinâmica, simples e enxuta e ainda com a vantagem de poder se usar as <a href="http://en.wikipedia.org/wiki/Application_programming_interface" target="_blank" style="text-decoration: underline">API&#8217;s</a> do Java.</p>
<p>Fora isso, foram criadas API&#8217;s específicas do próprio Groovy que facilitam muito o uso de alguns recursos/api&#8217;s do Java, como: coleções, mapas, strings, arquivos, etc.</p>
<p>A grande diferença do Groovy para o Java, é que o Groovy é uma linguagem de tipagem dinâmica, o que inicialmente pode ser um perigo para programadores habituados com Java, mas depois desse &#8220;trauma&#8221; inicial, a linguagem se mostra extremamente poderosa através de recursos como a possibilidade de se definir <a href="http://martinfowler.com/bliki/DomainSpecificLanguage.html" target="_blank" style="text-decoration: underline">DSL&#8217;s</a>.</p>
<p>Outra possibilidade interessante, é que é possível construir <em>scripts</em> com a linguagem Groovy, o que é uma verdadeira mão na roda para criação de rotinas de automatização, <em>builds</em>, etc.</p>
<h3>Grails</h3>
<p><a href="http://grails.org/" target="_blank" style="text-decoration: underline">Grails</a> é um <em>framework</em> Groovy para WEB baseado no RoR e que tenta resolver todos os problemas já citados da burocracia de se desenvolver para WEB com Java.</p>
<p>Dentro do &#8220;pacotão&#8221; do Grails, já vem embutidos recursos como: <a href="http://www.grails.org/doc/1.3.7/guide/8.%20The%20Service%20Layer.html#8.3%20Dependency%20Injection%20and%20Services" target="_blank" style="text-decoration: underline">injeção de dependência</a>, <a href="http://grails.org/doc/1.3.7/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html" target="_blank" style="text-decoration: underline">mapeamento objeto relacional</a>, segurança, <a href="http://www.grails.org/doc/1.3.7/guide/9.%20Testing.html" target="_blank" style="text-decoration: underline">testes</a> (unitários e funcionais), <a href="http://grails.org/doc/1.3.7/ref/Constraints/Usage.html" target="_blank" style="text-decoration: underline">validações</a>, etc. Além do que, o <em>framework</em> é completamente focado em uma abordagem <em><a href="http://en.wikipedia.org/wiki/Anemic_Domain_Model" target="_blank" style="text-decoration: underline">rich domain</a></em>, diferentemente de outros <em>frameworks</em>.</p>
<p>Outro recurso muito interessante são os <em><a href="http://www.grails.org/plugins/" target="_blank" style="text-decoration: underline">plugins</a></em>, que são como mini-aplicações que podem ser instaladas dentro do Grails de acordo com a sua necessidade. Atualmente existem muitos plugins disponíveis no repositório do Grails e que atendem as mais variadas necessidades.</p>
<p>O <em>framework</em> é todo baseado em <a href="http://en.wikipedia.org/wiki/Convention_over_configuration" target="_blank" style="text-decoration: underline">convenções</a> e dispensa o uso de complexos arquivos XML para fins de configurações, o que no final das contas acaba sendo mais um fator para facilitar e agilizar o desenvolvimento, pois dessa maneira a equipe de desenvolvimento acaba ficando focada no que realmente interessa, que são os requisitos de negócio.</p>
<h3>Porque escolhi Groovy+Grails</h3>
<p>Antes de mais nada, escolhi por todos os motivos apresentados anteriormente, talvez até não tivesse toda essa visibilidade no começo do projeto, mas como o projeto novo não apresentava desafios muito grandes e ao mesmo tempo não era tão crítico, pensei que uma boa maneira em deixar minha equipe motivada seria investir em uma nova tecnologia.</p>
<p>Fora o fato, que como a equipe tinha experiência com Java, na pior das hipóteses, no caso da não adaptação da equipe com o Groovy, poderíamos usar códigos Java dentro do projeto, já que a linguagem permite isso, ou seja, foi um risco, mas um risco controlado e calculado.</p>
<p>Outro fator que contou muito para escolha dessa dobradinha, foi que passamos a adotar uma abordagem mais ágil e interativa com a presença mais próxima do cliente junto ao time de desenvolvimento e isso significava que deveríamos ter algo entregável toda semana, que foi a periodicidade que definimos para as nossas iterações. A adoção do Groovy e Grails agilizaria nosso tempo de desenvolvimento, consequentemente conseguiríamos produzir mais <em>features</em> em menos tempo, que era exatamente o que estavámos buscando.</p>
<h3> Qual tem sido a minha experiência</h3>
<p>A melhor possível. Quando eu digo a melhor possível, é porque tem sido melhor que o esperado, mas obviamente, como tudo na vida, tem seus prós e contras.</p>
<p>Um dos pontos positivos, foi que a curva de aprendizado foi bem menor do que o esperado, ou seja, a equipe entrou no &#8220;ritmo&#8221; do <em>framework</em> bem rápido.</p>
<p>Outro ponto positivo, é a abordagem do <em>framework</em> de ser realmente orientado a objetos, favorecendo uso de uma modelagem focada em domínio rico e testes. Para toda entidade, <em>service</em>, ou <em>controller</em> novos criados, automaticamente um teste já é criado, ou seja, isso torna claro para o desenvolvedor, que seguindo os conceitos do <a href="http://www.agiledata.org/essays/tdd.html" target="_blank" style="text-decoration: underline">TDD</a>, o mais aconselhável é que os testes sejam criados antes da implementação, pois só dessa maneira o <em>design</em> do seu código será influenciado para se tornar mais coeso, menos acoplado e com as camadas bem definidas de acordo com a sua responsabilidade dentro do contexto.</p>
<p>Como o <em>framework</em> é <em>full-stack</em> e baseado em convenções, configurar um projeto e rodar tem o custo quase zero, ou seja, muito pouco tempo é disperdiçado.</p>
<p>Como nem tudo são flores, tivemos um impacto inicial com a curva de aprendizado de uma linguagem dinâmica (para quem não tinha prática com isso), fora os novos conceitos do próprio <em>framework</em>. Mas volto a repetir: o impacto foi menor que o previsto. Para resolver esse tipo de problema, adotamos algumas medidas como: <em><a href="http://www.extremeprogramming.org/rules/pair.html" target="_blank" style="text-decoration: underline">pair programming</a></em> e um grupo de estudo interno para troca de conhecimento, onde cada um deveria mostrar algum tópico em que já tivesse mais avançado, para o restante.</p>
<p>Outro impacto que tivemos foram de algumas peculiaridades do <em>framework</em>, que apesar de ser muito bom, ainda apresenta alguns pequenos <em>bugs</em> (e até manhas) que demoram a serem notados. Como o <em>framework</em> está em evolução e ainda em versão 1.*, é normal que esteja um pouco imaturo, portanto não o recomendaria ainda para um projeto mais complexo e crítico.</p>
<p><a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank" style="text-decoration: underline">IDE&#8217;s</a> ainda são um problema quando se pensa em Groovy + Grails, na verdade, existe uma IDE muito boa, mas que é paga e não é o <a href="http://www.eclipse.org/home/categories/index.php?category=ide" target="_blank" style="text-decoration: underline">Eclipse</a>, IDE no qual a maioria dos desenvolvedores Java já está acostumada. Essa IDE é o <a href="http://www.jetbrains.com/idea/" target="_blank" style="text-decoration: underline">Intellij</a> da Jet Brains, no qual já testei e realmente é a melhor opção no mercado.</p>
<h3>Conclusão</h3>
<p>Recomendaria Groovy+Grails se você tem uma visão semelhante a minha sobre desenvolvimento para WEB com Java e também se você tiver a oportunidade de usá-los em algum projeto sem muita criticidade e complexidade (apesar de existirem alguns <em><a href="http://www.grails.org/Success+Stories" target="_blank" style="text-decoration: underline">cases</a></em>), mas é importante mensurar sempre os riscos da adoção de algo novo, pois no final isso pode ser irreversível.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2011/07/29/groovy-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BDD com JBehave</title>
		<link>http://www.marcuscavalcanti.net/blog/2010/01/08/bdd-com-jbehave/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2010/01/08/bdd-com-jbehave/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 19:39:55 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1304</guid>
		<description><![CDATA[Conforme prometido no tópico anterior, irei mostrar o conceito de BDD através da utilização do framework JBehave, que é o framework de BDD mais famoso para Java e que foi desenvolvido pelo Dan North, o idealizador deste conceito. Antes de mais nada, vamos citar alguns conceitos importantes de BDD. Estórias e Cenários BDD é baseado [...]]]></description>
			<content:encoded><![CDATA[<p>Conforme prometido no <a href="http://www.marcuscavalcanti.net/blog/2010/01/07/algumas-observacoes-sobre-bdd/" style="text-decoration: underline" target="_blank">tópico anterior</a>, irei mostrar o conceito de <a href="http://dannorth.net/introducing-bdd" style="text-decoration: underline" target="_blank">BDD</a> através da utilização do <em>framework</em> <a href="http://jbehave.org/" style="text-decoration: underline" target="_blank">JBehave</a>, que é o <em>framework</em> de BDD mais famoso para Java e que foi desenvolvido pelo <a href="http://dannorth.net/" style="text-decoration: underline" target="_blank">Dan North</a>, o idealizador deste conceito.</p>
<p>Antes de mais nada, vamos citar alguns conceitos importantes de BDD.</p>
<h3>Estórias e Cenários</h3>
<p>BDD é baseado em estórias e cenários, e para criarmos ambos, vamos seguir alguns padrões pré-definidos por autores de BDD. Uma vez que BDD é focado em comportamento e sequência, as estórias e cenários devem ter um formato rígido para que as ferramentas consigam entendê-los e interpretá-los.</p>
<p>As estórias, possuem o seguinte formato:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="text"><pre class="de1">As I [X]
I want [Y]
so that [Z]</pre></div></div></div></div></div></div></div>


<p>E os cenários possuem o seguinte formato:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="text"><pre class="de1">Given some initial context (the givens),
When an event occurs,
then ensure some outcomes.</pre></div></div></div></div></div></div></div>


<p>Ou seja, isso quer dizer que devemos pensar em nossos requisitos de maneira que possam ser escritos baseados nessa convenção.</p>
<p>O JBehave é originalmente escrito para entender estórias em inglês, entretanto como BDD é focado em pessoas (<em>stakeholders</em>) e na descrição de situações reais, faz muito mais sentido semanticamente que as estórias e cenários sejam escritos em português e para resolver isso, usei uma <a href="http://codificando.com/2009/04/15/jbehave-brasil-bdd-em-java-no-nosso-idioma/" target="_blank" style="text-decoration: underline">contribuição</a> do <a href="http://codificando.com/" target="_blank" style="text-decoration: underline">Emerson Macedo</a> para que os cenários possam ser escritos e entendidos em português pelo JBehave.</p>
<h3>Começando com o JBehave</h3>
<p>O primeiro passo para utilização do JBehave, é fazer <em><a href="http://jbehave.org/software/download/" target="_blank" style="text-decoration: underline" class="broken_link">download</em> do JAR</a> do projeto e incluí-lo no <em>classpath</em> do seu projeto.</p>
<p>O próximo passo é escrever a estória juntamente com o cenário e para tal resolvi criar um exemplo simples para que o entendimento do conceito possa ser casado através do código a ser desenvolvido. </p>
<p>O exemplo escolhido é baseado no requisito: <strong>Compra de produtos em promoção com aviso por email</strong>. E é isso que nosso cenário BDD deve descrever.</p>
<p>Por questão de organização, resolvi quebrar a estória em 3 cenários diferentes, onde a primeira parte representa a verificação de produtos em promoção, a segunda representa a compra desses produtos e o terceiro é a finalização da compra e o envio de email. Então, a estória e os cenários ficaram assim:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="text"><pre class="de1">Compra de produtos em promoção com aviso por email
&nbsp;
Narrativa:
Como um usuário
Eu quero comprar produtos em promoção
E então receber um email de confirmação
&nbsp;
Cenário: Verificar produtos em promoção
Dado Que uma loja possui 10 produtos
E Que 5 estão em promoção
Quando Eu verifico quais estão em promoção
Então Preencho minha sacola apenas com produtos em promoção
&nbsp;
Cenário: Comprar produtos em promoção
Dado Que minha sacola de compras está preenchida com 5 produtos em promoção
Quando Eu verifico o somatório de produtos
Então Devo ter somente um total de 500 reais em produtos
&nbsp;
Cenário: Enviar email
Dado Que minha sacola está preenchida de produtos
Quando Enviar um email de confirmação
Então Devo receber o status do envio &quot;true&quot;</pre></div></div></div></div></div></div></div>


<p>A primeira linha do arquivo texto representa o título da nossa estória, o requisito de fato. A narrativa é um resumo do que essa estória deve cumprir e a seguir vem os três cenários, que no caso são as três etapas da estória.</p>
<p>É importante notar, que as palavras chaves em inglês (<em>Given</em>, <em>When</em>, <em>Then</em>, <em>And</em>) foram substituídas  por palavras em português (Dado, Quando, Então, E).</p>
<p>Esse arquivo texto deve ser salvo com a extensão <em>*.cenario</em> e o seu nome está diretamente ligado a classe que irei criar no passo a seguir, que no caso é a classe que representa a estória e a associação com os cenários.</p>
<h3>Criando a classe que irá comportar os cenários</h3>
<p>Nesse passo irei criar a classe que irá apontar os cenários que compõe a estória e essa classe deve extender a classe <a href="http://jbehave.org/reference/stable/concepts.html" target="_blank" style="text-decoration: underline"><em>Scenario</em></a> do JBehave. Dessa forma, a classe ficaria assim:</p>
<p><strong>PrecoPromocaoTeste.java</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">scenario1</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.steps.CompraSteps</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.steps.EmailSteps</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.steps.PromocaoSteps</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.util.PtBRScenario</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> PrecoPromocaoTeste <span class="kw1">extends</span> PtBRScenario <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> PrecoPromocaoTeste<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">           addSteps<span class="br0">&#40;</span><span class="kw1">new</span> PromocaoSteps<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">           addSteps<span class="br0">&#40;</span><span class="kw1">new</span> CompraSteps<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">           addSteps<span class="br0">&#40;</span><span class="kw1">new</span> EmailSteps<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>No exemplo acima, estou extendo a classe <em>PtBRScenario</em> só para que a estória e o cenário sejam escritos em português, mas essa classa herda a classe <em>Scenario</em> como descrito anteriormente.</p>
<p>No construtor da classe, inclui os passos que a estória deve seguir para ser satisfeita e como quebrei a estória em três pedaços, precisei incluir três passos sequenciados.</p>
<h3>Criando os passos da estória</h3>
<p>Como a estória foi quebrada em três partes, se faz por necessário a criação de 3 classes que irão representar os passos da estória e todas essas classes devem herdar a classe <em><a href="http://jbehave.org/reference/stable/concepts.html" target="_blank" style="text-decoration: underline">Steps</a></em> do JBehave.</p>
<p>Pela ordem definida na nossa classe de cenário, vamos aos passos:</p>
<p><strong>PromocaoSteps.java</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">scenario1.steps</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">java.util.List</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">junit.framework.Assert</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.jbehave.scenario.annotations.Given</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.jbehave.scenario.annotations.Then</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.jbehave.scenario.annotations.When</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.entity.Loja</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.entity.Produto</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.util.PtBRSteps</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.vo.Sacola</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> PromocaoSteps <span class="kw1">extends</span> PtBRSteps <span class="br0">&#123;</span>	</pre></li><li class="li1"><pre class="de1">	Loja loja 		<span class="sy0">=</span> <span class="kw1">new</span> Loja<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	Sacola sacola 	<span class="sy0">=</span> <span class="kw1">new</span> Sacola<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	List<span class="sy0">&lt;</span>Produto<span class="sy0">&gt;</span> listaProdutoPromocao<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw4">int</span> quantidadeProdutoPromocao<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@Given<span class="br0">&#40;</span><span class="st0">&quot;Que uma loja possui $quant produtos&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> populaLoja<span class="br0">&#40;</span><span class="kw3">Integer</span> quantidade<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		loja.<span class="me1">inicializaProdutos</span><span class="br0">&#40;</span>quantidade<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span>	</pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@Given<span class="br0">&#40;</span><span class="st0">&quot;Que $quant estão em promoção&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> informaProdutosPromocao<span class="br0">&#40;</span><span class="kw3">Integer</span> quantidade<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		loja.<span class="me1">colocaProdutosPromocao</span><span class="br0">&#40;</span>quantidade<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		quantidadeProdutoPromocao <span class="sy0">=</span> quantidade<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span>	</pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@When<span class="br0">&#40;</span><span class="st0">&quot;Eu verifico quais estão em promoção&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> verificaProdutosPromocao<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>		</pre></li><li class="li1"><pre class="de1">		listaProdutoPromocao <span class="sy0">=</span> loja.<span class="me1">retornaProdutosPromocao</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@Then<span class="br0">&#40;</span><span class="st0">&quot;Preencho minha sacola apenas com produtos em promoção&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> populaSacola<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		sacola.<span class="me1">populaSacola</span><span class="br0">&#40;</span>listaProdutoPromocao<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">		<span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>listaProdutoPromocao.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, quantidadeProdutoPromocao<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p><strong>CompraSteps.java</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">scenario1.steps</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">java.util.ArrayList</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">java.util.List</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">junit.framework.Assert</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.jbehave.scenario.annotations.Given</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.jbehave.scenario.annotations.Then</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.jbehave.scenario.annotations.When</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.entity.Produto</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.util.PtBRSteps</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.vo.Sacola</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> CompraSteps <span class="kw1">extends</span> PtBRSteps <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	Sacola sacola 				<span class="sy0">=</span> <span class="kw1">new</span> Sacola<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw4">double</span> somatorioProdutos 	<span class="sy0">=</span> 0d<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@Given<span class="br0">&#40;</span><span class="st0">&quot;Que minha sacola de compras está preenchida com $quant produtos em promoção&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> verificaSacola<span class="br0">&#40;</span><span class="kw3">Integer</span> quantidade<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		List<span class="sy0">&lt;</span>Produto<span class="sy0">&gt;</span> listaProduto <span class="sy0">=</span> <span class="kw1">new</span> ArrayList<span class="sy0">&lt;</span>Produto<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">		<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i<span class="sy0">=</span><span class="nu0">1</span><span class="sy0">;</span> i<span class="sy0">&lt;=</span>quantidade<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">			Produto produto 	<span class="sy0">=</span> <span class="kw1">new</span> Produto<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">			produto.<span class="me1">preco</span> 		<span class="sy0">=</span> <span class="kw3">Math</span>.<span class="me1">round</span><span class="br0">&#40;</span><span class="kw3">Math</span>.<span class="me1">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">*</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">			produto.<span class="me1">emPromocao</span> 	<span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">			listaProduto.<span class="me1">add</span><span class="br0">&#40;</span>produto<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">		sacola.<span class="me1">populaSacola</span><span class="br0">&#40;</span>listaProduto<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@When<span class="br0">&#40;</span><span class="st0">&quot;Eu verifico o somatório de produtos&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> verificaTotalProdutosSacola<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw1">for</span> <span class="br0">&#40;</span> Produto produto <span class="sy0">:</span> sacola.<span class="me1">retornaProdutos</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">			somatorioProdutos <span class="sy0">=</span> produto.<span class="me1">preco</span> <span class="sy0">+</span> somatorioProdutos<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@Then<span class="br0">&#40;</span><span class="st0">&quot;Devo ter somente um total de R$ $total reais em produtos&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> validaSacola<span class="br0">&#40;</span><span class="kw4">double</span> totalProduto<span class="br0">&#41;</span> <span class="br0">&#123;</span>		</pre></li><li class="li1"><pre class="de1">		<span class="kw1">if</span> <span class="br0">&#40;</span> somatorioProdutos <span class="sy0">&gt;</span> totalProduto <span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">			<span class="kw1">Assert</span>.<span class="me1">fail</span><span class="br0">&#40;</span><span class="st0">&quot;Total de produtos é acima de R$ 500&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;/</span>rpe<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;</span>strong<span class="sy0">&gt;</span>EmailSteps.<span class="me1">java</span><span class="sy0">&lt;/</span>strong<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;</span>pre lang<span class="sy0">=</span><span class="st0">&quot;java&quot;</span> line<span class="sy0">=</span><span class="st0">&quot;1&quot;</span><span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">scenario1.steps</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">static</span> org.<span class="me1">jbehave</span>.<span class="me1">Ensure</span>.<span class="me1">ensureThat</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.jbehave.scenario.annotations.Given</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.jbehave.scenario.annotations.Then</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.jbehave.scenario.annotations.When</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.util.PtBRSteps</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">scenario1.vo.Sacola</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">com.guilhermechapiewski.fluentmail.email.EmailMessage</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">com.guilhermechapiewski.fluentmail.transport.EmailTransportConfiguration</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> EmailSteps <span class="kw1">extends</span> PtBRSteps <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	Sacola sacola 		<span class="sy0">=</span> <span class="kw1">new</span> Sacola<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw3">Boolean</span> statusEnvio <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@Given<span class="br0">&#40;</span><span class="st0">&quot;Que minha sacola está preenchida de produtos&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> verificaSacola<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Lista cheia..&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@When<span class="br0">&#40;</span><span class="st0">&quot;Enviar um email de confirmação&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> enviaEmail<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		EmailTransportConfiguration.<span class="me1">configure</span><span class="br0">&#40;</span><span class="st0">&quot;localhost&quot;</span>, <span class="kw2">false</span>, <span class="kw2">false</span>, <span class="st0">&quot;&quot;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">		<span class="kw1">new</span> EmailMessage<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	    	.<span class="me1">from</span><span class="br0">&#40;</span><span class="st0">&quot;eusou@marcuscavalcanti.net&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	    	.<span class="me1">to</span><span class="br0">&#40;</span><span class="st0">&quot;eusou@marcuscavalcanti.net&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	    	.<span class="me1">withSubject</span><span class="br0">&#40;</span><span class="st0">&quot;Testando BDD&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	    	.<span class="me1">withBody</span><span class="br0">&#40;</span><span class="st0">&quot;Testando terceiro cenário e o final da estória.&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	    	.<span class="me1">send</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">		statusEnvio <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@Then<span class="br0">&#40;</span><span class="st0">&quot;Devo receber o status do envio <span class="es0">\&quot;</span>$retorno<span class="es0">\&quot;</span>&quot;</span><span class="br0">&#41;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> <span class="kw4">void</span> recebeStatusEnvio<span class="br0">&#40;</span><span class="kw3">String</span> retorno<span class="br0">&#41;</span> <span class="br0">&#123;</span>	</pre></li><li class="li1"><pre class="de1">		ensureThat<span class="br0">&#40;</span>statusEnvio.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>retorno<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Nos exemplos acima, que representam os passos de um cenário, é importante notar que os métodos seguem a ordem definida no arquivo texto, assim como todos são anotados com as palavras chaves correspondentes, no caso <em>Given</em>, <em>When</em>, <em>And</em>, <em>Then</em>. As anotações recebem como parâmetro as frases descritas no arquivo texto, excluindo apenas as palavras chaves no começo da frase, que estão devidamente representadas pelas anotações.</p>
<p>Os parâmetros são identificados com o formato <em>$variavel</em>, e uma vez que usamos esses parâmetros, devemos também colocá-los na assinatura dos métodos. Esses parâmetros são automaticamente capturados pelo JBehave através do uso de <a href="http://guia-er.sourceforge.net/" target="_blank" style="text-decoration: underline">expressões regulares</a>. </p>
<h3>Executando o exemplo</h3>
<p>Para executar o exemplo deve-se executar a classe que extende a classe <em>Scenario</em> do JBehave, nesse caso seria a classe <em>PrecoPromocaoTeste.java</em>, e para acompanhar os resultados, eu utilizo a integração do <a href="http://www.eclipse.org/" target="_blank" style="text-decoration: underline">Eclipse</a> com o <a href="http://www.junit.org/" target="_blank" style="text-decoration: underline">JUnit</a>, através de uma <em><a href="http://www.eclipse.org/articles/viewArticle/ViewArticle2.html" target="_blank" style="text-decoration: underline">view</a></em> própria da <a href="http://pt.wikipedia.org/wiki/IDE" target="_blank" style="text-decoration: underline">IDE</a>.</p>
<p>No exemplo, usei ainda algumas classes auxiliares criadas especificamente para o exemplo, mas que não irei mostrar aqui os seus códigos para não tornar o tópico extenso demais. De qualquer forma, ao final desse tópico botarei um <em>link</em> para <em>download</em> do projeto no Eclipse que contém todos os códigos.</p>
<h3>Observações finais</h3>
<p>Um dos problemas que eu notei no JBehave é em relação a parametrização de alguns valores no arquivo texto para o código Java, em alguns casos isso pode se tornar um trabalho sacal e pouco produtivo, mas acredito que com a evolução do <em>framework</em> esse problema será resolvido.</p>
<p>Algumas pessoas utilizam alternativas variadas para resolver esse problema, como  por exemplo criar o valor dos parâmetros diretamente como atributos nas classes que representam os passos. Eu particularmente não gosto dessa abordagem, pois acredito que isso faz com que os arquivos que descrevem os cenários percam seu valor e esses arquivos são essencial para utilização e sentido do BDD.</p>
<p>No exemplo citado, usei ainda algumas bibliotecas como <a href="http://code.google.com/p/fluentmailapi/" target="_blank" style="text-decoration: underline">FluentMailApi</a>, Mail e Activation da <a href="http://java.sun.com/products/javamail/" target="_blank" style="text-decoration: underline">JavaMail</a> e <a href="http://code.google.com/p/hamcrest/" target="_blank" style="text-decoration: underline">Hamcrest</a>. Essas bibliotecas servem basicamente para o envio de email e uso mais aperfeiçoado de expressões regulares por parte do JBehave.</p>
<p>Para finalizar, é importante citar que as classes do meu negócio (Sacola, Usuario, Loja, etc) foram construídas baseadas no meu requesito, no meu cenário, que foi a primeira etapa a ser elaborada na construção do exemplo.</p>
<h3>Download</h3>
<p>Para <em>download</em> do projeto completo no Eclipse, basta <a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/JBehave/JBehaveLab.rar" style="text-decoration: underline" target="_blank">clicar aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2010/01/08/bdd-com-jbehave/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Entendendo como funciona a arquitetura do Weblogic Server em ambientes clusterizados</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/11/24/entendendo-como-funciona-a-arquitetura-do-weblogic-server-em-ambientes-clusterizados/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/11/24/entendendo-como-funciona-a-arquitetura-do-weblogic-server-em-ambientes-clusterizados/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 16:50:07 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Managed Server]]></category>
		<category><![CDATA[Node Manager]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[Weblogic Domain]]></category>
		<category><![CDATA[Weblogic Server]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1231</guid>
		<description><![CDATA[Antes de mais nada, gostaria de ressaltar que esse post não tem o intuito de ensinar ou mostrar o passo-a-passo para a criação de um ambiente clusterizado com o Weblogic Server, na verdade o intuito é mostrar como é e como funciona essa arquitetura, usando um exemplo prático criado para esse propósito específico. Para criação [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de mais nada, gostaria de ressaltar que esse post não tem o intuito de ensinar ou mostrar o passo-a-passo para a criação de um ambiente clusterizado com o <a href="http://pt.wikipedia.org/wiki/BEA_Weblogic_Server" target="_blank" style="text-decoration: underline">Weblogic Server</a>, na verdade o intuito é mostrar como é e como funciona essa arquitetura, usando um exemplo prático criado para esse propósito específico. Para criação e configuração de um ambiente clusterizado, indico a <a href="http://www.oracle.com/technology/documentation/bea.html" target="_blank" style="text-decoration: underline">documentação da Oracle/BEA</a>, na qual estarei citando os links ao final do post.</p>
<h3>Domínio</h3>
<p>Quando trabalhamos em um ambiente de desenvolvimento, basicamente o que temos que nos preocupar é referente a criação de um domínio. Um domínio nada mais é que um conjunto de recursos e serviços que fisicamente são mantidos através de arquivos.</p>
<p>A parte principal de um domínio chama-se Administration Server, que é uma instância de um Weblogic Server responsável por manter e configurar seus recursos. Todo esse gerenciamento do Adminstration Server é feito através do Admin Console, que por sua vez é uma aplicação que é deployada no seu Administration Server e que será responsável por fornecer uma interface gráfica para que você possa gerenciar seu domínio, ou seja, toda a configuração feita pelo Admin Console é baseada em XML e é ele quem gerencia esses arquivos.</p>
<p>É através do Administration Server que você faz o <em>deploy/undeploy</em> das suas aplicações, porém em um ambiente de produção, ou até mesmo de homologação, o mais indicado é que tenhamos nossas aplicações em um servidor a parte, que são chamados de Managed Servers.</p>
<h3>Managed Servers</h3>
<p>Uma instância de um Weblogic Server, que não é uma instância do Administration Server, é chamada de Managed Server, é no Managed Server onde suas aplicações e recursos serão deployados de fato, deixando para o Administration Server apenas a responsabilidade de gerenciá-los.</p>
<p>São os Managed Servers que hospedam todos os componentes e recursos que constituem uma aplicação, e toda vez que um Managed Server é inicializado, ele se conecta com o Administration Server para obter informações de configuração e <em>deployment</em>.</p>
<h3>Cluster. O quê é e por quê usar?</h3>
<p>Em ambientes de produção é normal que existam certas preocupações que não ocorrem com ambientes de desenvolvimento, como alta disponibilidade das aplicações e balanceamento de carga.</p>
<p>Imagine que ocorra qualquer problema na máquina onde a sua aplicação está deployada? O quê fazer? Para não ficar a mercê desse tipo de problema, o correto é pensar em uma estrutura em que sua aplicação possa ser replicada em N instância de servidores em máquinas diferentes, onde caso uma máquina dê problema, a outra assume e assim sucessivamente.</p>
<p>Outro problema comum é a sobrecarga de uma aplicação. Um cenário normal em aplicações web é o acesso de muitos usuários e consequentemente o processamento a exaustão das máquinas onde essas aplicações estão deployadas, isso por muitas vezes pode ocasionar um estouro de processamento ou até mesmo um tempo de resposta maior para o usuário. E como fazer para resolver esse problema? A resposta é através do balanceamento de carga.</p>
<p>Para resolver esses tipos de problemas foi criada uma estrutura cuja o nome é Cluster. Um Cluster é um conjuto de computadores que trabalham de forma conjunta cujo objetivo é fazer com que todo o processamento da aplicação seja distribuído a N computadores, mas de forma que pareça com que eles sejam um computador só.</p>
<h3>Cluster e Managed Servers</h3>
<p>Um Cluster de Weblogic Server corresponde a múltiplas instância de Weblogic Server que estão trabalhando e ﻿rodando simultaneamente com o objetivo de prover escalabilidade e disponibilidade.</p>
<p>Ou seja, um Cluster é um conjunto de Managed Servers, e cada Managed Server representa um nó de um cluster.</p>
<p>Quando se pensa em uma arquitetura usando Clusters, é normal que se pense em mais de uma máquina, afinal não faz muito sentido ter um Cluster com uma máquina, pois caso essa máquina pare de funcionar, todas as aplicações também irão parar.</p>
<h3>A relação Managed Servers, Machines e Domínio</h3>
<p>Partindo do princípio que um Cluster deve necessariamente ter mais de uma máquina, chegamos ao conceito de &#8220;Machines&#8221; do Weblogic Server.</p>
<p>Uma &#8220;machine&#8221; é exatamente uma máquina, um computador físico, e essa máquina pode ter mais de um managed server, ou seja, pode ter mais de uma instância do Weblogic Server rodando ao mesmo tempo. É óbvio que nesse caso teríamos que ter essas duas instâncias rodando em portas diferentes.</p>
<p>Dessa forma, chegamos a seguinte associação: Domínio -> Administration Server -> Cluster -> Machine -> Managed Server.</p>
<h3>Node Manager</h3>
<p>Quando falamos a nível de máquina (machine), devemos falar também dos Node Managers. Um Node Manager não está associado a um domínio, está associado a uma máquina, já que uma máquina pode ter mais de um Managed Server.</p>
<p>Um Node Manager é uma aplicação standalone responsável por gerenciar Managed Servers em uma máquina (machine) remota. Através do Node Manager é possível inicializar, parar e re-startar instâncias do Administration Server e dos Managed Servers de uma máquina remota.</p>
<h3>Multi-cast Address</h3>
<p>Em um ambiente clusterizado, precisamos ter N computadores trabalhando de forma conjunta de forma que isso seja transparente, mas quando usamos recursos como sessões, ou até mesmo conexões distribuídas, precisamos que isso também seja feito de forma distribuída, sem que seja necessário por exemplo criar uma sessão para cada Managed Server.</p>
<p>Isso é feito através do multi-cast address, que é um IP associado a um cluster, que por sua vez irá informar esse IP para seus Managed Servers para que os mesmos possam usar um único IP para fazer esse tipo de compartilhamento.</p>
<h3>Juntando tudo</h3>
<p>Para dar uma visão mais clara de toda essa arquitetura e quem está associado a o que, resolvi criar um diagrama que mostra todos os elementos citados acima e associação/relação entre eles.</p>
<p>No exemplo usei ainda o <a href="http://httpd.apache.org/" target="_blank" style="text-decoration: underline">Apache</a> como Servidor Web, que será a porta de entrada de tudo, será ele que irá receber as requisições HTTP, fazer o balanceamento de carga e delegar as responsabilidades para os Managed Servers. Será o Apache ainda o responsável por identificar e servir conteúdo estático sem que seja necessário passar pelo Cluster.</p>
<h3>Diagrama</h3>
<div class="wp-caption alignnone" style="width: 160px"><a href="http://img99.imageshack.us/img99/6514/weblogicserverarchitect.jpg" target="_blank"><img alt="clique para ampliar" src="http://img99.imageshack.us/img99/6514/weblogicserverarchitect.th.jpg" title="Weblogic Server Architecture" width="150" height="111" border="0" /></a><p class="wp-caption-text">clique para ampliar</p></div>
<h3>Mais Informações</h3>
<p><strong>Weblogic Server</strong><br />
<a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs92/admin.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E13222_01/wls/docs92/admin.html</a></p>
<p><strong>Understanding Cluster Configuration </strong><br />
<a href="http://download.oracle.com/docs/cd/E12840_01/wls/docs103/cluster/config.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E12840_01/wls/docs103/cluster/config.html</a></p>
<p><strong>Understanding Weblogic Server Clustering</strong><br />
<a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs92/cluster/overview.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E13222_01/wls/docs92/cluster/overview.html</a></p>
<p><strong>Setting Up Weblogic Cluster</strong><br />
<a href="http://download.oracle.com/docs/cd/E12840_01/wls/docs103/cluster/setup.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E12840_01/wls/docs103/cluster/setup.html</a></p>
<p><strong>Using Node Manager</strong><br />
<a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs92/server_start/nodemgr.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E13222_01/wls/docs92/server_start/nodemgr.html</a></p>
<p><strong>Node Manager Architecture</strong><br />
<a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs81b/adminguide/nodemgr.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E13222_01/wls/docs81b/adminguide/nodemgr.html</a></p>
<p><strong>Configure Apache HTTP Server</strong><br />
<a href="http://download.oracle.com/docs/cd/E15051_01/wls/docs103/plugins/apache.html" target="_blank" style="text-decoration: underline">http://download.oracle.com/docs/cd/E15051_01/wls/docs103/plugins/apache.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/11/24/entendendo-como-funciona-a-arquitetura-do-weblogic-server-em-ambientes-clusterizados/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Dica rápida: recuperando um domínio corrompido no Weblogic</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/11/11/dica-rapida-recuperando-um-dominio-corrompido-no-weblogic/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/11/11/dica-rapida-recuperando-um-dominio-corrompido-no-weblogic/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 16:54:03 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Abruptly]]></category>
		<category><![CDATA[Corrompido]]></category>
		<category><![CDATA[Domain]]></category>
		<category><![CDATA[Start]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[Workshop]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1211</guid>
		<description><![CDATA[Essa é uma dica rápida para quem trabalha com aplicações em cima do Weblogic. Um domínio Weblogic pode ser corrompido por diversos motivos, como: domínio ser encerrado de forma forçada ( com um kill -9, por exemplo), máquina ser desligada de forma repentina, falta de luz, etc. Quando isso acontece, seu domínio que estava rodando [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é uma dica rápida para quem trabalha com aplicações em cima do Weblogic.</p>
<p>Um domínio Weblogic pode ser corrompido por diversos motivos, como: domínio ser encerrado de forma forçada ( com um <em>kill -9</em>, por exemplo), máquina ser desligada de forma repentina, falta de luz, etc. Quando isso acontece, seu domínio que estava rodando pode ser corrompido, e com isso a seguinte mensagem é retornada ao tentar iniciá-lo novamente:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="text"><pre class="de1">Server cannot be started.   The server process cannot be started, or terminated abruptly. Check the start script.</pre></div></div></div></div></div></div></div>


<p>Para resolver isso é muito simples, basta remover todas as pastas <strong>build</strong> pré-existentes (são geradas automaticamente pela seu Workshop, quando a aplicação é compilada) e em seguida basta fazer um <em>start</em> do seu domínio novamente.</p>
<p>Outra dica, é que antes de tentar fazer o <em>deploy</em> das aplicações em cima desse domínio novamente, que antes faça um <em>undeploy</em> (usando o <em>console</em>) das mesmas, pois se o domínio foi encerrado de forma forçada, as aplicações ainda estarão lá deployadas e caso você tente novamente, provavelmente não conseguirá.</p>
<p>Procurei sobre isso nos forums da Oracle e não achei nada, então fica aí a dica, pois isso evita que você tenha que re-criar e configurar seu domínio novamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/11/11/dica-rapida-recuperando-um-dominio-corrompido-no-weblogic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando o HermesJMS com JDK 1.6 no Weblogic</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/07/08/usando-o-hermesjms-com-jdk-16-no-weblogic/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/07/08/usando-o-hermesjms-com-jdk-16-no-weblogic/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 20:41:05 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hermes]]></category>
		<category><![CDATA[HermesJMS]]></category>
		<category><![CDATA[JDK]]></category>
		<category><![CDATA[JMS]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[Weblogic]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1043</guid>
		<description><![CDATA[O HermesJMS é uma ferramenta muito útil para dar suporte ao desenvolvimento de aplicações que trabalham com JMS (menssageria), ou seja, para quem trabalha com integrações, processos e SOA é de grande utilidade. Com o HermesJMS é possível publicar mensagens, remover, ver o conteúdo das mensagens publicadas, a quantidade, dentre outras funcionalidades. Eu diria que [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.hermesjms.com/" target="_blank" style="text-decoration: underline">HermesJMS</a> é uma ferramenta muito útil para dar suporte ao desenvolvimento de aplicações que trabalham com <a href="http://java.sun.com/products/jms/" target="_blank" style="text-decoration: underline">JMS</a> (menssageria), ou seja, para quem trabalha com integrações, processos e SOA é de grande utilidade.</p>
<p>Com o HermesJMS é possível publicar mensagens, remover, ver o conteúdo das mensagens publicadas, a quantidade, dentre outras funcionalidades. Eu diria que o HermesJMS está para JMS como o <a href="http://www.soapui.org/" target="_blank" style="text-decoration: underline">soapUI</a> está pra <em>Web Services</em>.</p>
<p>Só que existe um pequeno probleminha de incompatibilidade entre o HermesJMS e o Weblogic 10.2. O HermesJMS foi construído com a <a href="http://java.com/pt_BR/download/faq/jvm.xml" target="_blank" style="text-decoration: underline">JVM</a> 1.6 e o <a href="http://e-docs.bea.com/platform/suppconfigs/configs102/102_over/overview.html" target="_blank" style="text-decoration: underline" class="broken_link">Weblogic 10.2</a> roda com a JVM 1.5, portanto quando tentamos acessar <em>resources</em> JMS configurados em um servidor Weblogic temos um probleminha com o <a href="http://nullability.org/?p=95" target="_blank" style="text-decoration: underline"><em>ClassLoader</em></a>, segundo <em>bug</em> relatado <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149" target="_blank" style="text-decoration: underline">nesse link</a>.</p>
<p>Geralmente para resolução desse problema, quando eu ia usar o Hermes,  eu mudava a minha <a href="http://lowfatlinux.com/linux-environment-variables.html" target="_blank" style="text-decoration: underline">váriavel ambiente</a> JAVA_HOME para apontar para o JDK 1.5, para agilizar esse processo pode ser feito um <a href="http://pt.wikipedia.org/wiki/Shell_script" target="_blank" style="text-decoration: underline">Shell Script</a> que seta essa varíavel de ambiente apontando para o JDK 1.5 e abrindo o HermesJMS logo em seguida, mas existe uma solução melhor e mais limpa para isso, que é setando uma propriedade na inicialização do HermesJMS, seguem os passos necessários:</p>
<p>1) Entrar no diretório de instalação do HermesJMS, no meu caso é /opt/HermesJMS<br />
2) Editar o arquivo <strong>hermes.sh</strong> que fica dentro do diretório <strong>bin</strong><br />
3) Ir para a última linha desse arquivo e adicionar a propriedade: <em>-Dsun.lang.ClassLoader.allowArraySyntax=true</em></p>
<p>Dessa forma, a última linha do arquivo /bin/hermes.sh ficaria assim:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1"><span class="st0">&quot;<span class="es2">$JAVACMD</span>&quot;</span> -XX:<span class="re2">NewSize</span>=256m <span class="re5">-Xmx1024m</span> -Dsun.lang.ClassLoader.allowArraySyntax=<span class="kw2">true</span> <span class="re1">$HERMES_OPTS</span> -Dhermes.home=<span class="re1">$HERMES_HOME</span> <span class="re5">-Dhermes</span>=<span class="re1">$HERMES_CFG</span> -Dhermes.libs=<span class="re1">$HERMES_LIB_PROPERTY</span> <span class="re5">-classpath</span> <span class="re1">$LOCALCLASSPATH</span> hermes.browser.HermesBrowser</pre></div></div></div></div></div></div></div>


<p>Esse pequeno <em>workaround</em> corrige esse probleminha de incompatibilidade entre o HermesJMS e o Weblogic 10.2 e nos permite usar o HermesJMS com o JDK 1.6.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/07/08/usando-o-hermesjms-com-jdk-16-no-weblogic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mostrando mensagens de log no stdOut (console) do Weblogic</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/27/mostrando-mensagens-de-log-no-console-do-weblogic/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/27/mostrando-mensagens-de-log-no-console-do-weblogic/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 04:17:26 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[stdOut]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[Workshop]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=837</guid>
		<description><![CDATA[Essa é uma dica bem rapidinha, que na verdade estou postando, pois não achei nada no Google muito relevante a respeito. Como imagino que existem pessoas com o mesmo probleminha, então segue a dica logo abaixo. Na aplicação web do projeto que estou trabalhando, nós fazemos o uso da API Commons Logging do Apache para [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é uma dica bem rapidinha, que na verdade estou postando, pois não achei nada no Google muito relevante a respeito. Como imagino que existem pessoas com o mesmo probleminha, então segue a dica logo abaixo.</p>
<p>Na aplicação web do projeto que estou trabalhando, nós fazemos o uso da API <a href="http://commons.apache.org/logging/" target="_blank" style="text-decoration: underline">Commons Logging</a> do Apache para poder fazer <em>logging</em> da aplicação, só que para o <em>log</em> aparecer corretamente no <em>console</em> existe um pequeno &#8220;macete&#8221;, que por incrivel que pareça não diz com mais detalhes na <a href="http://e-docs.bea.com/wls/docs103/logging/config_logs.html#wp1011903" target="_blank" style="text-decoration: underline" class="broken_link">documentação do Weblogic</a>.</p>
<p>O probleminha era, que por mais que eu fizesse o seguinte:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> SovWS <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw1">private</span> <span class="kw1">static</span> Log log <span class="sy0">=</span>  LogFactory.<span class="me1">getLog</span><span class="br0">&#40;</span><span class="st0">&quot;SOV-&quot;</span><span class="sy0">+</span>SovWS.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	@WebMethod</pre></li><li class="li1"><pre class="de1">	<span class="kw1">public</span> SaveMetaResponseDocument saveMeta<span class="br0">&#40;</span>SaveMetaRequestDocument request<span class="br0">&#41;</span> <span class="br0">&#123;</span>		</pre></li><li class="li1"><pre class="de1">		log.<span class="me1">info</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">getClass</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot; iniciando a nova meta&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">               ....</pre></li><li class="li1"><pre class="de1">        <span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Eu não conseguia fazer com que a mensagem de <em>log</em> aparecesse no console do <em>Workshop</em>, ainda que tudo estivesse correto.</p>
<p>Para resolver é muito simples, basta ir nas propriedades do projeto, ir nos <em>facets</em> do projeto e verificar se a extensão <strong><em>Weblogic Integrated Commons Logging</em></strong> está como um <em>facet</em> do projeto, se não estiver, está aí o problema e para resolver basta adicionar esse novo <em>facet</em>.</p>
<p>Para ter certeza que está tudo certinho, sugiro abrir o arquivo <strong>weblogic-application.xml</strong> e verificar se a seguinte configuração está presente:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="xml"><pre class="de1"><span class="sc3"><span class="re1">&lt;wls:library-ref<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;wls:library-name<span class="re2">&gt;</span></span></span>wls-commonslogging-bridge<span class="sc3"><span class="re1">&lt;/wls:library-name<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;wls:specification-version<span class="re2">&gt;</span></span></span>1.0<span class="sc3"><span class="re1">&lt;/wls:specification-version<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;wls:exact-match<span class="re2">&gt;</span></span></span>true<span class="sc3"><span class="re1">&lt;/wls:exact-match<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/wls:library-ref<span class="re2">&gt;</span></span></span></pre></div></div></div></div></div></div></div>


<p>Se a seguinte configuração estiver presente, pronto, tudo ok! Agora o <em>log</em> deverá aparecer no console sem problemas.</p>
<p>PS: Só para ressaltar que essa dica é válida para ambiente de desenvolvimento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/27/mostrando-mensagens-de-log-no-console-do-weblogic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

