<?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>Objectzilla</title>
	<atom:link href="http://www.objectzilla.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.objectzilla.com.br</link>
	<description>por Leonardo Veríssimo</description>
	<lastBuildDate>Sat, 05 Jun 2010 18:58:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>O uso de sessão em aplicações web</title>
		<link>http://www.objectzilla.com.br/2010/06/05/o-uso-de-sessao-em-aplicacoes-web/</link>
		<comments>http://www.objectzilla.com.br/2010/06/05/o-uso-de-sessao-em-aplicacoes-web/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 18:58:50 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=289</guid>
		<description><![CDATA[Há uma corrente de pensamento que diz que aplicações web deveriam ser stateless. É um pouco confuso, pois certos requisitos naturalmente possuem estado; porém, ser stateless não significa ignorar que o mundo real possuem transições, significa que o armazenamento do estado deve ser empurrado o máximo possível para o lado cliente. Mas programadores Java EE [...]]]></description>
			<content:encoded><![CDATA[<p>Há uma corrente de pensamento que diz que aplicações web deveriam ser <em>stateless</em>. É um pouco confuso, pois certos requisitos naturalmente possuem estado; porém, ser <em>stateless</em> não significa ignorar que o mundo real possuem transições, significa que o armazenamento do estado deve ser empurrado o máximo possível para o lado cliente.</p>
<p>Mas programadores Java EE não tão nem aí. O <a href="http://java.sun.com/javaee/6/docs/api/javax/servlet/http/HttpSession.html">HttpSession</a> é tão acessível e tão simples de usar que o programador não pensa duas vezes antes utilizá-lo. E talvez aí seja a fonte dos problemas: usa-se demais! As pessoas não se dão conta de que é difícil escalar aplicações web que usam muito <em>Session</em>; e que também pode ir contra a uma boa experiência de usuário, como o voltar ou o <em>favoritar</em> que deixa de funcionar. Acredito que existam alternativas tão melhores que o <em>HttpSession</em> que este só seria raramente lembrado. Veja as seguintes situações e suas alternativas.<br />
<span id="more-289"></span></p>
<h1>Preciso fazer cache de entidades<a name="cache"></a></h1>
<p>Veja, o cache é sobre entidades obtidas através de classes da camada de persistência; mas a <em>HttpSession</em> é uma classe de arquitetura que somente a camada de apresentação depende. Entretanto, ao guardar e obter objetos na sessão de usuário, a camada de apresentação está ido além de seu escopo, que é simplesmente mostrar a tela para o usuário; é uma solução ruim.</p>
<p>Uma solução boa é usar bibliotecas de cache de verdade como <a href="http://memcached.org/">Memcached</a> ou <a href="http://www.jboss.org/jbosscache">JBoss Cache</a>. Pois você pode colocá-las na camada de persistência, e ainda assim, não se amarrar à tecnologia Web. Sem falar que o cache, com essas ferramentas, é único por todo o sistema (e não único por usuário, como na <em>Session</em>), o que lhe garante maior controle sobre os dados não-atualizados.</p>
<p>Minha dica é, se não houver uma configuração de cache automatizado, como no <a href="http://www.hibernate.org/">Hibernate</a>, ponha-os em classes que funcionam como <em>decorator</em> de DAOs, mas isso <a href="http://www.objectzilla.com.br/2009/05/02/ja-usou-memcached/">eu já falei antes</a>.</p>
<h1>O framework web guarda dados em sessão</h1>
<p>Algumas <em>vendors</em> gostam de fazer ferramentas que sejam <em>jumento-proof</em>, com o intuito de convencer gerentes de que é possível contratar programadores a preço de banana. Muitos <em>frameworks</em> web já saem com essa mentalidade na sua concepção, e é tão <em>jumento-proof</em> que a ferramenta faz uso constante da <em>HttpSession</em> internamente sem o programador perceber.</p>
<p>Pra não usar sessão nesses casos, só há um jeito: troque de framework web, para um que nunca faça uso implícito de sessão. Porém, se você está no meio de um projeto, ainda é possível criar novas páginas com um novo framework, mas mantendo as antigas, só fazendo a transição quando estas precisarem de alterações. Ah, e se onde você está exigem o uso de uma &#8220;arquitetura padrão&#8221;? Então troque de emprego, porque ninguém merece, né?</p>
<h1>O objeto que eu estou armazenando vai ser usado na próxima tela</h1>
<p>São duas situações bastante comuns:</p>
<ol>
<li>existe uma tela onde aparece uma lista de um domínio qualquer; dado o clique de um elemento, uma nova página com os detalhes aparecerão;</li>
<li>existe uma página com campos &#8220;somente-leitura&#8221;, onde o clique de um <em>link</em> muda para uma página com campos editáveis.
</ol>
<p>Nos dois casos, um desenvolvedor comum percebe logo que, como a segunda página irá requisitar os mesmos dados que a primeira, coloca os dados da primeira requisição na sessão para ser consultado depois. Não faça isso! Você pode estar achando que está economizando no banco, mas está negligenciando outros fatores. Exemplos: é mais fácil escalar um banco de dados quando há muita leitura (topologia mestre-escravo, por exemplo), do que escalar sessão de servidor web. E, às vezes, o usuário gostaria de entrar pela segunda página diretamente.</p>
<p>Prefira realizar a consulta de novo quando ocorrer a segunda requisição, e controle o estado pela URL, colocando a chave primária do domínio como parâmetro. Isso te livra de um monte de inconveniências, como no caso de o usuário apertar o botão voltar ou consultar a URL no histórico.<br />
	&#8220;Ah, mas toda vez que faço uma consulta, um porquinho-da-índia morre.&#8221; Então o problema pode ser resolvido pelo <a href="#cache">primeiro ítem acima: cache</a>.</p>
<h1>A lógica de negócio exige várias telas para sua conclusão</h1>
<p>Existem casos onde a conclusão de um objetivo depende do envio de vários formulários, mas isso não é tão comum de acontecer. Mesmo assim, muitos consideram que escrever cada formulário no banco não compensa, porque o usuário pode desistir no meio do caminho. A solução mais comum é ficar guardando dados intermediários na sessão até chegar a última tela do processo, quando tudo é persistido.</p>
<p>Bom, pode ser um raro caso onde seja interessante armazenar na sessão. Porém, faça a coisa direito! Não espalhe por todo o código o armazenamento e a obtenção de objetos na Sessão. Se você tiver usando EJB, use um Stateful Session Bean para armazenar todos os objetos obtidos do usuário antes de persistir. Se tiver usando Spring ou outro contêiner de injeção de dependência, use uma classe de escopo de sessão para armazenar todos os objetos. Use o mínimo de classes de infraestrutura para evitar dependências desnecessárias.</p>
<h1>Vou implementar um &#8220;carrinho de compras&#8221;</h1>
<p>Todo mundo aprendeu <em>HttpSession</em> usando um exemplo de carrinho de compras. O problema é gente acreditar que, pra esse caso, só existe uma única solução possível, a única que lhe ensinaram, o armazenamento na sessão de usuário! Porém, isso pode não ser verdade num mundo real. Imagine que alguém tenha colocado um produto no carrinho virtual, mas desistido de comprar. Talvez essa informação de compra não-efetuada possa ser interessante para a loja, pois ela pode gerar alguma <em>newsletter</em>. Portanto, manter esses dados na <em>Session</em> está fora de cogitação!</p>
<p>Não quero dizer que um carrinho deve ser feito sempre em banco, mas determinadas regras de negócio podem ser implementados de jeitos diferentes dependendo do contexto. Os exemplos e <em>templates</em> de livros e apostilas só servem pra aprendizagem, não leve-os tão a sério!</p>
<hr/>
E aí? Convencido que dá pra fazer uma aplicação sem <em>HttpSession</em>? Ou vocês acham que existem situações que não falei onde é realmente necessário? Comentem&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2010/06/05/o-uso-de-sessao-em-aplicacoes-web/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Go With the Flow</title>
		<link>http://www.objectzilla.com.br/2009/11/21/go-with-the-flow/</link>
		<comments>http://www.objectzilla.com.br/2009/11/21/go-with-the-flow/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 23:57:34 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[go]]></category>
		<category><![CDATA[go lang]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[paralelismo]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=268</guid>
		<description><![CDATA[A Google tem um poderoso canal de comunicação com os nerds de todo o planeta. Tudo que sai da cabeça desses engenheiros é motivo de burburinho em todo o lugar, até que desapareça tempos depois. A mais recente invenção dos caras é a GO, uma linguagem de programação de sistemas, compilável, com coletor de lixo [...]]]></description>
			<content:encoded><![CDATA[<p>A Google tem um poderoso canal de comunicação com os nerds de todo o planeta. Tudo que sai da cabeça desses engenheiros é motivo de burburinho em todo o lugar, até que desapareça tempos depois.</p>
<p>A mais recente invenção dos caras é a <a href="http://golang.org/">GO</a>, uma linguagem de programação de sistemas, compilável, com coletor de lixo e primitivas para concorrência. Em poucos dias, causou vários comentários que, obviamente, se arrefeceram uma semana depois. Mas não vamos deixar essa ausência de comentários abalar este post onde, com apenas meus poucos dias de estudo, mostrarei meus pitacos com relações a aspectos da linguagem que mais se destacam dos demais. (Não mostrarei como montar o ambiente, nem como fazer compilação. Isso você encontra no Google.)<span id="more-268"></span></p>
<h1>Sintaxe</h1>
<p>A sintaxe é ligeiramente igual às famílias da linguagem C (como Java, C++ ou C#), com a diferença que os tipos vem depois do nome da variável ou da função. Um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">package main
&nbsp;
import <span style="color: #ff0000;">&quot;fmt&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// constante, tipo é implícito</span>
<span style="color: #993333;">const</span> Pi <span style="color: #339933;">=</span> <span style="color:#800080;">3.1415</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* 
Métodos começam com &quot;func&quot;, seguido do nome,
dos parâmetros e depois o retorno.
No parâmetro, tipo &quot;int&quot; vem depois no nome &quot;v&quot;
*/</span>
func doubleIt<span style="color: #009900;">&#40;</span>v <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #993333;">int</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> v <span style="color: #339933;">*</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// o começo de um programa é o método main do pacote main</span>
func main<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;">// variáveis começam com var, seguido de nome e tipo</span>
	var number1 <span style="color: #993333;">int</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// mas também pode ser assim</span>
	var number2 <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// ou assim</span>
	number3 <span style="color: #339933;">:=</span> <span style="color: #0000dd;">12</span><span style="color: #339933;">;</span>
&nbsp;
	fmt.<span style="color: #202020;">Printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Number1: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> doubleIt<span style="color: #009900;">&#40;</span>number1<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fmt.<span style="color: #202020;">Printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Number2: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> doubleIt<span style="color: #009900;">&#40;</span>number2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fmt.<span style="color: #202020;">Printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Number3: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> doubleIt<span style="color: #009900;">&#40;</span>number3<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pode parecer muito revolucionário, mas não é! Dê uma olhada em <a href="http://www.haskell.org/">Haskell</a> ou <a href="http://www.erlang.org/">Erlang</a> e depois a gente conversa.</p>
<h1>Sem herança nem sobrecarga, e muito diferente</h1>
<p>Em Go, existe a noção de objetos, mas não do jeito tradicional, como visto por aí. Se bobear, alguns nem a chamem de orientado a objetos, afinal.</p>
<p>Primeiro, que não existe herança: todos os objetos não fazem parte de uma classe pai e nem há a possibilidade de classes filhas. Como consequência, a composição de objetos é a única forma possível de se trabalhar. E o mais interessante é que, sem heranças, uma grande Caixa de Pandora desaparece, porque:</p>
<ul>
<li><strong>os métodos e atributos <em><strong>protected</strong></em> vão embora:</strong> só existe visibilidade pública e privada ao pacote, e seu discernimento é feito da seguinte forma: quando um atributo ou método começa em letra maiúscula, é visível a todo mundo; quando minúscula, é protegido (mais sobre isso daqui a pouco).</li>
<li>Nada de atributo <strong>virtual</strong> que tanto enche quem programa em C# ou C++. Nada de depender do <em>“worst-case”</em> de outras linguagens que assumem que todo <em>dispatch</em> de métodos 	é dinâmico. Em Go, por objetos não terem filhos, todo <em>dispatch</em> de métodos é estático, a menos que você esteja usando uma referência à interface (mais sobre isso depois).</li>
</ul>
<p>Além do mais, diferente de Java e mais parecido com Python, o atributo <strong>this</strong> não é implícito. E não, não fica no primeiro parâmetro do método, mas num lugar especial, antes do nome do método. Também não há a noção de um escopo de classe onde todos os métodos ficam dentro. Em Go, primeiro é criada uma <strong>struct</strong>, e fora dela, os métodos – lembra um pouco Javascript.</p>
<p>Pra não ficarem boiando, um exemplo de uma classe <em>Time</em> simplificada, que exibe horas e minutos:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">package mytime
&nbsp;
import <span style="color: #ff0000;">&quot;fmt&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// os atributos de uma classe ficam numa struct</span>
type Time <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
	hour uint<span style="color: #339933;">;</span>
	minute uint<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// método &quot;solto&quot; que cria um Time.</span>
<span style="color: #666666; font-style: italic;">// repare que, por iniciar em letra minúscula,</span>
<span style="color: #666666; font-style: italic;">// só codigos sobre o pacote mytime podem acessá-lo</span>
func newTime<span style="color: #009900;">&#40;</span>hour uint<span style="color: #339933;">,</span> minute uint<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span>Time <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// um jeito de iniciar uma struct</span>
	t <span style="color: #339933;">:=</span> Time <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// minutos - overflow em hora</span>
	t.<span style="color: #202020;">minute</span> <span style="color: #339933;">=</span> minute <span style="color: #339933;">%</span> <span style="color: #0000dd;">60</span><span style="color: #339933;">;</span>
	t.<span style="color: #202020;">hour</span> <span style="color: #339933;">=</span> minute <span style="color: #339933;">/</span> <span style="color: #0000dd;">60</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// horas - ignora overflow</span>
	t.<span style="color: #202020;">hour</span> <span style="color: #339933;">+=</span> hour <span style="color: #339933;">%</span> <span style="color: #0000dd;">24</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #339933;">&amp;</span>t<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// método de fábrica</span>
<span style="color: #666666; font-style: italic;">// não existe construtor de objetos</span>
<span style="color: #666666; font-style: italic;">// letra maiúscula indica que é método público</span>
func Create<span style="color: #009900;">&#40;</span>hour uint<span style="color: #339933;">,</span> minute uint<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span>Time <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> newTime<span style="color: #009900;">&#40;</span>hour<span style="color: #339933;">,</span> minute<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;">// aqui é que fica interessante</span>
<span style="color: #666666; font-style: italic;">// este método torna-se membro de Time ao declará-lo como receptor</span>
<span style="color: #666666; font-style: italic;">// (declaração antes do nome do método)</span>
func <span style="color: #009900;">&#40;</span>t <span style="color: #339933;">*</span>Time<span style="color: #009900;">&#41;</span> AddMinute<span style="color: #009900;">&#40;</span>min uint<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	totalMin <span style="color: #339933;">:=</span> t.<span style="color: #202020;">minute</span> <span style="color: #339933;">+</span> min<span style="color: #339933;">;</span>
	t.<span style="color: #202020;">minute</span> <span style="color: #339933;">=</span> totalMin <span style="color: #339933;">%</span> <span style="color: #0000dd;">60</span><span style="color: #339933;">;</span>
&nbsp;
	t.<span style="color: #202020;">AddHour</span><span style="color: #009900;">&#40;</span>totalMin <span style="color: #339933;">/</span> <span style="color: #0000dd;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
func <span style="color: #009900;">&#40;</span>t <span style="color: #339933;">*</span>Time<span style="color: #009900;">&#41;</span> AddHour<span style="color: #009900;">&#40;</span>hour uint<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	totalHour <span style="color: #339933;">:=</span> t.<span style="color: #202020;">hour</span> <span style="color: #339933;">+</span> hour<span style="color: #339933;">;</span>
	t.<span style="color: #202020;">hour</span> <span style="color: #339933;">=</span> totalHour <span style="color: #339933;">%</span> <span style="color: #0000dd;">24</span><span style="color: #339933;">;</span>		
<span style="color: #009900;">&#125;</span>
&nbsp;
func <span style="color: #009900;">&#40;</span>t <span style="color: #339933;">*</span> Time<span style="color: #009900;">&#41;</span> Increment<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	t.<span style="color: #202020;">AddMinute</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</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;">// os métodos de print chamam esse método</span>
func <span style="color: #009900;">&#40;</span>time <span style="color: #339933;">*</span>Time<span style="color: #009900;">&#41;</span> String<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> string <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> fmt.<span style="color: #202020;">Sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%02d:%02d&quot;</span><span style="color: #339933;">,</span> time.<span style="color: #202020;">hour</span><span style="color: #339933;">,</span> time.<span style="color: #202020;">minute</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ah, ia me esquecendo! As interfaces! Um exemplo que eu precisei fazer é criar um tipo standardInput que lê do <em>File Descriptor</em> 0 (zero) (em Unix, 0 é <em>sdtin</em>, 1 é <em>stdout</em> e 2 é <em>stderr</em>), porque não existe um método <em>scanf</em>, como em C.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// tipo necessário para o reader do bufio,</span>
<span style="color: #666666; font-style: italic;">// que aceita qualquer classe com interface io.Reader		</span>
type standardInput <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
func <span style="color: #009900;">&#40;</span>si <span style="color: #339933;">*</span>standardInput<span style="color: #009900;">&#41;</span> Read<span style="color: #009900;">&#40;</span>p <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #993333;">uint8</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>n <span style="color: #993333;">int</span><span style="color: #339933;">,</span> err os.<span style="color: #202020;">Error</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	r<span style="color: #339933;">,</span> e <span style="color: #339933;">:=</span> syscall.<span style="color: #202020;">Read</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> e <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#123;</span>
		err <span style="color: #339933;">=</span> os.<span style="color: #202020;">Errno</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span>r<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> err<span style="color: #339933;">;</span>		
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Não tem nada de <strong>implements</strong> aí, mas o tipo já implementa a interface <a href="http://golang.org/pkg/io/#Reader">io.Reader</a>, apenas porque aquele realiza o mesmo método deste. Isso tanto é verdade que quando é usado como parâmetro para <a href="http://golang.org/pkg/bufio/#Reader.NewReader">bufio.NewReader</a>, não ocorre problemas.</p>
<h1>Com paralelismo mais fácil, o design muda</h1>
<p><strong><em>Goroutines</em></strong> é o jeito da linguagem implementar paralelismo. Não chega a ser tão &#8220;na unha&#8221; quanto a <a href="http://java.sun.com/javase/6/docs/api/java/lang/Thread.html">Thread</a> em Java ou a <a href="http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html">pthread</a> em C/Posix, mas não é tão alto nível quanto o modelo de atores implementado em Erlang ou Scala.</p>
<p>Uma <em>goroutine</em> é um método que roda em <em>background</em>, e que não avisa ninguém quando termina a execução. Não existe uma comunicação entre o chamador e o chamado, a não ser com o uso de <em>channels</em>: uma estrutura síncrona e bidirecional para troca de mensagens. Como comparação, parece igual ao C, onde é possível dar um <em>fork</em> no processo (criar <em>goroutine</em>), e depois fazer comunicação entre si através de <em>pipes</em> (<em>channels</em>). Porém, com Go é muito mais fácil e flexível.</p>
<p><em>Goroutine</em> lembra apenas vagamente o modelo de <strong><em>coroutines</em></strong> em Python (com seu <em>yield</em>, <em>next</em> e <em>send</em>), ou o modelo de <strong>Fibers</strong> do Ruby 1.9. Nesses, a diferença é que não existem <em>channels</em>, porque os métodos de envio e recebimentos de mensagens fazem parte da referência da <em>coroutine</em>.</p>
<p>Acredito que, apesar de <em>goroutine</em> estar associado à otimização de aplicativos que rodam em múltiplos <em>cores</em>, a grande vantagem pode ser uma melhor modularização das aplicações. Já vi idéias de se usar uma corrotina para separar códigos com estados mutáveis dos não-mutáveis, mas isso eu discutiria num outro post. Por hora, resolvi fazer uma aplicação interativa que pergunta ao usuário como manipular a hora (classe definida anteriormente). Resolvi fazer uma <em>goroutine</em> que isola o <em>input-output</em> do restante da aplicação. Sim, com certeza, não vai melhorar a execução paralela, mas modulariza melhor. Primeiro, a parte do <em>input-output</em> no código abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">package iocontrol
&nbsp;
import <span style="color: #009900;">&#40;</span>
	<span style="color: #ff0000;">&quot;bufio&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;syscall&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;fmt&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;os&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;strings&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;strconv&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#41;</span>
&nbsp;
&nbsp;
type Query <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
	What string<span style="color: #339933;">;</span>
	HowMany uint<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// tipo necessário para o reader do bufio,</span>
<span style="color: #666666; font-style: italic;">// que aceita qualquer classe com interface io.Reader		</span>
type standardInput <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
func <span style="color: #009900;">&#40;</span>si <span style="color: #339933;">*</span>standardInput<span style="color: #009900;">&#41;</span> Read<span style="color: #009900;">&#40;</span>p <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #993333;">uint8</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>n <span style="color: #993333;">int</span><span style="color: #339933;">,</span> err os.<span style="color: #202020;">Error</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	r<span style="color: #339933;">,</span> e <span style="color: #339933;">:=</span> syscall.<span style="color: #202020;">Read</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> e <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#123;</span>
		err <span style="color: #339933;">=</span> os.<span style="color: #202020;">Errno</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span>r<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> err<span style="color: #339933;">;</span>		
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// converte uma string para o tipo Query</span>
func ToQuery<span style="color: #009900;">&#40;</span>line string<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span>Query <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// separando a linha em dois valores</span>
	arr <span style="color: #339933;">:=</span> strings.<span style="color: #202020;">Split</span><span style="color: #009900;">&#40;</span>line<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;:&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	var what string <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>len<span style="color: #009900;">&#40;</span>arr<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// o primeiro é uma string sem espaços em volta</span>
		what <span style="color: #339933;">=</span> strings.<span style="color: #202020;">TrimSpace</span><span style="color: #009900;">&#40;</span>arr<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</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;">// não havendo uma string com dois pontos no meio,</span>
	<span style="color: #666666; font-style: italic;">// o array tem tamanho 1</span>
	var howMany uint <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>len<span style="color: #009900;">&#40;</span>arr<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// o segundo é um número</span>
		var err os.<span style="color: #202020;">Error</span><span style="color: #339933;">;</span>
		howMany<span style="color: #339933;">,</span> err <span style="color: #339933;">=</span> strconv.<span style="color: #202020;">Atoui</span><span style="color: #009900;">&#40;</span>
			strings.<span style="color: #202020;">TrimSpace</span><span style="color: #009900;">&#40;</span>arr<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>err <span style="color: #339933;">!=</span> nil<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			fmt.<span style="color: #202020;">Println</span><span style="color: #009900;">&#40;</span>err<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: #666666; font-style: italic;">// criando a estrutura Query</span>
	<span style="color: #b1b100;">return</span> <span style="color: #339933;">&amp;</span>Query<span style="color: #009900;">&#123;</span>what<span style="color: #339933;">,</span> howMany<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
func IOControl<span style="color: #009900;">&#40;</span>channel chan string<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// obtendo do channel a resposta a ser exibida</span>
		<span style="color: #666666; font-style: italic;">// na tela</span>
		output <span style="color: #339933;">:=</span> <span style="color: #339933;">&lt;-</span>channel<span style="color: #339933;">;</span>
&nbsp;
		fmt.<span style="color: #202020;">Println</span><span style="color: #009900;">&#40;</span>output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// lendo a linha de comando</span>
		reader <span style="color: #339933;">:=</span> bufio.<span style="color: #202020;">NewReader</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>standardInput<span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		line<span style="color: #339933;">,</span> err <span style="color: #339933;">:=</span> reader.<span style="color: #202020;">ReadString</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> err <span style="color: #339933;">==</span> nil <span style="color: #009900;">&#123;</span>
			channel <span style="color: #339933;">&lt;-</span> line<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			channel <span style="color: #339933;">&lt;-</span> <span style="color: #ff0000;">&quot;error:0&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O código que vai virar uma <em>goroutine</em> é o último aí em cima, o <strong>IOControl</strong>. No código principal abaixo, será criado o <em>channel</em> e a <em>goroutine</em> para execução.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">package main
&nbsp;
import <span style="color: #009900;">&#40;</span>
	<span style="color: #ff0000;">&quot;fmt&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;./mytime&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;./iocontrol&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#41;</span>
&nbsp;
func main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// criando um channel</span>
	var io <span style="color: #339933;">=</span> make<span style="color: #009900;">&#40;</span>chan string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// e criando uma goroutine</span>
	go iocontrol.<span style="color: #202020;">IOControl</span><span style="color: #009900;">&#40;</span>io<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	time <span style="color: #339933;">:=</span> mytime.<span style="color: #202020;">Create</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	fmt.<span style="color: #202020;">Println</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Possible commands:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
		<span style="color: #ff0000;">&quot;hour : n<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
		<span style="color: #ff0000;">&quot;minute : n<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
		<span style="color: #ff0000;">&quot;tick<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
		<span style="color: #ff0000;">&quot;exit<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// mandando o time em String para o channel &quot;io&quot;</span>
	io <span style="color: #339933;">&lt;-</span> time.<span style="color: #202020;">String</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	loop<span style="color: #339933;">:</span> <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// obtendo do channel uma string do próximo pedido</span>
		query <span style="color: #339933;">:=</span> iocontrol.<span style="color: #202020;">ToQuery</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&lt;-</span>io<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// &quot;switch&quot; em Go não requer &quot;break&quot;</span>
		<span style="color: #b1b100;">switch</span> query.<span style="color: #202020;">What</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">&quot;hour&quot;</span><span style="color: #339933;">:</span>
			time.<span style="color: #202020;">AddHour</span><span style="color: #009900;">&#40;</span>query.<span style="color: #202020;">HowMany</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">&quot;minute&quot;</span><span style="color: #339933;">:</span>
			time.<span style="color: #202020;">AddMinute</span><span style="color: #009900;">&#40;</span>query.<span style="color: #202020;">HowMany</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">&quot;tick&quot;</span><span style="color: #339933;">:</span>
			time.<span style="color: #202020;">Increment</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">&quot;error&quot;</span><span style="color: #339933;">:</span>
			fmt.<span style="color: #202020;">Println</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;an error occurred&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">&quot;exit&quot;</span><span style="color: #339933;">:</span>
			<span style="color: #000000; font-weight: bold;">break</span> loop<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		io <span style="color: #339933;">&lt;-</span> time.<span style="color: #202020;">String</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Executando-o, será perguntado como e quanto a acrescentar na hora atual, até que você digite <em>exit</em>.</p>
<p>Preciso dizer também que não é difícil cometer erros na programação paralela. Eu por exemplo, esqueci de por o conteúdo de <strong>IOControl</strong> dentro de um laço infinito. E aí, com a <em>thread</em> morta após a primeira rodada de resposta e pergunta, o <em>channel</em> foi bloqueado na escrita sem ninguém pra ler. Com isso, a aplicação em entrou em <em>deadlock</em>, havendo a interrupção do programa com o erro na tela. Ou seja, não é tão desgraçado quanto Thread, mas fique atento.</p>
<h1>Sem exceção, literalmente</h1>
<p>Talvez isso decepcione alguns, mas a linguagem Go não tem <em>exceptions</em>. Ainda não digeri bem essa notícia, mas existem coisas que fazem com que essa linguagem não caia na armadilha do C.</p>
<p>Uma é que o <em>“finally”</em> pode ser substituído pelo <strong>defer</strong>, que indica o comando que precisa ser invocado incondicionalmente antes da saída do método. Outra, é que, como em Go é possível haver múltiplos retornos, criam-se métodos com dois retornos, o primeiro sendo o conteúdo normal e o segundo o código de erro (se houver).  Assim:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">&nbsp;
package main
&nbsp;
import <span style="color: #009900;">&#40;</span>
	<span style="color: #ff0000;">&quot;os&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;io&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;flag&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #ff0000;">&quot;fmt&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#41;</span>
&nbsp;
func data<span style="color: #009900;">&#40;</span>name string<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>string<span style="color: #339933;">,</span> os.<span style="color: #202020;">Error</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	var content string <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	f<span style="color: #339933;">,</span> err <span style="color: #339933;">:=</span> os.<span style="color: #202020;">Open</span><span style="color: #009900;">&#40;</span>name<span style="color: #339933;">,</span> os.<span style="color: #202020;">O_RDONLY</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>err <span style="color: #339933;">==</span> nil<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		defer f.<span style="color: #202020;">Close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		var rawContent <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>byte <span style="color: #339933;">=</span> nil<span style="color: #339933;">;</span>
		rawContent<span style="color: #339933;">,</span> err <span style="color: #339933;">=</span> io.<span style="color: #202020;">ReadAll</span><span style="color: #009900;">&#40;</span>f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		content <span style="color: #339933;">=</span> fmt.<span style="color: #202020;">Sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span> rawContent<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> content<span style="color: #339933;">,</span> err<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
func main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	flag.<span style="color: #202020;">Parse</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	filename <span style="color: #339933;">:=</span> flag.<span style="color: #202020;">Arg</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	content<span style="color: #339933;">,</span> err <span style="color: #339933;">:=</span> data<span style="color: #009900;">&#40;</span>filename<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>err <span style="color: #339933;">==</span> nil<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		fmt.<span style="color: #202020;">Println</span><span style="color: #009900;">&#40;</span>content<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		fmt.<span style="color: #202020;">Println</span><span style="color: #009900;">&#40;</span>err<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O compilador impede que método com dois retornos seja associada a apenas uma variável (mesmo com tipo implícito). Então, supõe-se que o programador não tenha como esquecer de tratar os erros.</p>
<h1>Conclusão</h1>
<p>Go não é uma linguagem inovadora, mas pode ser um refresco para quem precisa de uma linguagem que tenha um contato próximo à máquina, e não quer depender de C ou C++. Nitidamente, é uma linguagem muito crua, e muitos anos de desenvolvimento precisam acontecer. Mas tem potencial.</p>
<p>P.S.: &#8220;Go With the Flow&#8221; é um rock do <em>Queens of the Stone Age</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/11/21/go-with-the-flow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A cauda longa das linguagens</title>
		<link>http://www.objectzilla.com.br/2009/08/29/a-cauda-longa-das-linguagens/</link>
		<comments>http://www.objectzilla.com.br/2009/08/29/a-cauda-longa-das-linguagens/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 23:49:18 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[uma linguagem por ano haskell erlang great good]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=256</guid>
		<description><![CDATA[Andy Hunt já dizia que nós deveríamos aprender uma nova linguagem a cada ano. É claro que sempre tem uns merdas que citam Malcolm Gladwell (e sua teoria de que se leva 10 anos de prática pra que alguém desenvolva um grande talento (link, link)) para desqualificar a sugestão de Hunt, afirmando que um ano [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.toolshed.com/">Andy Hunt</a> <a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X">já dizia que</a> nós deveríamos aprender uma nova linguagem a cada ano. É claro que sempre tem uns merdas que citam <a href="http://en.wikipedia.org/wiki/Malcolm_Gladwell">Malcolm Gladwell</a> (e sua teoria de que se leva 10 anos de prática pra que alguém desenvolva um grande talento (<a href="http://www.amazon.com/Outliers-Story-Success-Malcolm-Gladwell/dp/0316017922">link</a>, <a href="http://en.wikipedia.org/wiki/Outliers_%28book%29">link</a>)) para desqualificar a sugestão de Hunt, afirmando que um ano &#8220;é muito pouco&#8221;. Puro jogo de palavras! Pois não se espera de ninguém ser um fodão na linguagem em que se aventurou. É suficiente apenas um mínimo de entendimento nos princípios e na filosofia da nova linguagem, além da cultura dos principais evangelistas. Um ano é suficiente para ter, sei lá, um quinto de conhecimento que o guru-criador da linguagem tem.</p>
<p>Outros usam também a conhecida citação <em>&#8220;programar é difícil&#8221;</em> para demonstrar que aprender novas linguagens não vale a pena, já que é contra-senso encarar coisas difíceis todo ano. Discordo, uma coisa é aprender a programar, outra é aprender <em>uma nova linguagem</em>. Programar é um conceito abstrato: transformar uma idéia em solução computacional. Linguagem é concreto: a ferramenta utilizada para por a solução computacional em prática. Confundir programação com linguagem é típico de quem nunca aprendeu mais de uma linguagem.</p>
<p>Aprender uma nova linguagem é útil. Principalmente quando você sai de uma &#8220;visão de mundo&#8221;, que é apregoada pela comunidade da linguagem, e entra numa outra, completamente diferente. Isso é tão libertador quanto aqueles sortudos viajantes, que andam de país em país; onde, em cada uma, percebe como as pessoas são diferentes e que existe um mundo muito maior do que eles próprios supunham imaginar.</p>
<p>Tudo isso para sugerir duas linguagens da cauda longa: uma é <a href="http://www.haskell.org/">Haskell</a>, linguagem funcional que gera código nativo (com desempenho comparável a C), a outra é <a href="http://erlang.org/">Erlang</a>, linguagem também funcional com foco em concorrência e que roda em uma máquina virtual especial para sistemas que não podem cair.</p>
<p>Eu estou aprendendo Haskell e comecei pelo ótimo tutorial <strong><a href="http://learnyouahaskell.com/">Learn You a Haskell for Great Good</a></strong>, escrito pelo esloveno Miran Lipovača. Já Erlang (que eu havia começado a aprender há dois anos atrás, mas parei no meio), pretendo comecar no ano que vem, e irei seguir um tutorial que ainda não li, mas é cria do anterior: <strong><a href="http://learnyousomeerlang.com/">Learn You Some Erlang for Great Good</a></strong>, escrito pelo franco-canadense Frederic Trottier-Hebert.</p>
<p>Se você já está de saco cheio da <a href="http://www.guj.com.br/recentTopics/list.java">mediocriade dos usuários de Java</a>, vale a tentativa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/08/29/a-cauda-longa-das-linguagens/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A hora e indústria de TI</title>
		<link>http://www.objectzilla.com.br/2009/08/24/a-hora-e-industria-de-ti/</link>
		<comments>http://www.objectzilla.com.br/2009/08/24/a-hora-e-industria-de-ti/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 01:22:06 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=253</guid>
		<description><![CDATA[Bom, já havia falado que havia lido o livro &#8220;The Mythical Man-Month&#8221;. Hoje vou falar sobre mais algumas coisas sobre o texto. O autor defende que horas e pessoas não são intercambiáveis, ou seja, não dá para aumentar a equipe e esperar que o produto seja entregue mais rápido. Com mais pessoas, pode ser que [...]]]></description>
			<content:encoded><![CDATA[<p>Bom, já havia falado que havia lido o livro <strong>&#8220;The Mythical Man-Month&#8221;</strong>. Hoje vou falar sobre mais algumas coisas sobre o texto.</p>
<p>O autor defende que horas e pessoas não são intercambiáveis, ou seja, não dá para aumentar a equipe e esperar que o produto seja entregue mais rápido. Com mais pessoas, pode ser que seja mais rápido, pode ser que seja a mesma coisa, ou ainda pode ser mais lento que se mantivesse a equipe menor. E foi ainda mais enfático: adicionar pessoas num projeto atrasado, deixa-o mais atrasado.</p>
<p>A razão para esse fenômeno, para muitos ainda contraintuituvo, é que determinadas tarefas são difíceis de serem feitas em paralelo, e quanto mais pessoas, maior o tempo gasto em comunicação entre os membros, em detrimento do trabalho <em>&#8220;útil&#8221;</em>.</p>
<p>Uma outra coisa que o livro fala é que a diferença de produtividade entre um excelente programador e um mau programador é de 10 para 1. O que significa que nem sempre compensa contratar os piores programadores porque não compensa pelo custo-benefício.</p>
<p>Mas chega a desanimar se comparar o livro com a realidade brasileira. Não se fala na área <em>man-month</em>, <em>man-day</em>, homens-mês ou homens-dia; fala-se simplesmente <strong>hora</strong> (do tipo: &#8220;essa alteração leva tantas horas&#8221;), como se a pessoa encarregada em construir o programa simplemente ficasse fora da equação, e o projeto ficasse pronto pela simples passagem do tempo.</p>
<p>Pra piorar: o valor percebido de um software está em quanto satisfez as expectativas do cliente, não em quantas horas foram gastas na construção. Entre uma <em>feature</em> que traz grande satisfação, mas poucas horas, e outra que traz pouca satisfação, mas muitas horas; a última seria economicamente vantajosa pra quem vende horas. (Percebe porque está cheio de consultoria pereba?)</p>
<p>E a razão 10:1 para a produtividade entre o melhor e o pior pode até indicar pra uma empresa de software que vale a pena contratar o melhor. Mas como são raras as empresas sensíveis a esse ponto, essa razão significa simplesmente uma coisa: quem faz muito ganha relativamente pouco e quem faz pouco ganha relativamente muito. Implica que não é vantagem para nenhum programador melhorar seu próprio nível educacional, pois uma eventual reciclarem teria pouco reconhecimento.</p>
<p>E isso é verdade! Acredito que tenha muitos profissionais que não sabem como é um bom projeto de software, seja porque nunca trabalhou num, seja porque nunca se qualificou para tal.</p>
<p>Dá até tristeza ler &#8220;The Mythical Man-Month&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/08/24/a-hora-e-industria-de-ti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails e a bala de prata</title>
		<link>http://www.objectzilla.com.br/2009/08/21/rails-e-a-bala-de-prata/</link>
		<comments>http://www.objectzilla.com.br/2009/08/21/rails-e-a-bala-de-prata/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 01:51:54 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=251</guid>
		<description><![CDATA[Estou quase acabando de ler o livro &#8220;The Mythical Man-Month&#8221;, aquele que todo líder deveria ler antes de meter os pés pelas mão em projetos de software. O que achei mais interessante não é tanto o fato dele derrubar o &#8220;senso-comum&#8221; de que um projeto pode terminar mais cedo simplesmente adicionando mais pessoas (isso vai [...]]]></description>
			<content:encoded><![CDATA[<p>Estou quase acabando de ler o livro <a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959">&#8220;The Mythical Man-Month&#8221;</a>, aquele que todo líder deveria ler antes de meter os pés pelas mão em projetos de software. O que achei mais interessante não é tanto o fato dele derrubar o &#8220;senso-comum&#8221; de que um projeto pode terminar mais cedo simplesmente adicionando mais pessoas (isso vai pro próximo post), mas o fato dele enfatizar que <em>não existem balas de prata</em>, ou seja, não existirá nada que faça a construção de software ganhar um incremento gigantesco de produtividade. Inclua aí as IDEs, a orientação a objetos ou o desenvolvimento visual.</p>
<p>Incrivelmente, os caras da nossa área sentem-se como alquimistas, na busca pela tranformação do ferro em ouro. Rails, por exemplo, é ainda visto pelos <em>noobs</em> como um framework que iria trazer incríveis ganhos de produtividade em relação ao Java. Mas quando o cara começa a &#8220;pegar mais&#8221; nos estudos, percebe uma coisa incômoda: o framework não traz tanto ganho assim! Só-que não traz mesmo! Software é complexo de se fazer, porque você ainda terá de lidar com espectativas de usuários, com facilidade de uso e com facilidade de manutenção, independentemente de qual linguagem utilizada. (Se bobear, talvez seja esse o motivo da adoção de Rails ser fraca: não é produtivo o <em>bastante</em>.)</p>
<p>Mas ignorar Rails por não ser bala de prata é imbecil demais! É a opção, esquisita, das pessoas que só irão sair da zona de conforto quando a verdadeira bala de prata for apresentada diante de seus olhos. Porém, a solução mágica não existe, né? Meu, Rails é mais produtivo, um pouquinho só, e não é em todas as determinadas situações. Ainda assim, vale a pena aprender, pois a proporção entre legais/idiotas é alto entre os &#8220;railers&#8221;, ao contŕario dos javeiros. E sua cultura de testes é de invejar qualquer um.</p>
<p>Se ainda não conhece, vai atrás e aprenda. Não deixe o conforto pela espera da solução mágica tomar conta de você.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/08/21/rails-e-a-bala-de-prata/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MVC: Supostas perguntas frequentes</title>
		<link>http://www.objectzilla.com.br/2009/06/29/mvc-supostas-perguntas-frequentes/</link>
		<comments>http://www.objectzilla.com.br/2009/06/29/mvc-supostas-perguntas-frequentes/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 01:12:56 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=244</guid>
		<description><![CDATA[P. Por que um tópico sobre &#8220;supostas perguntas frequentes&#8221;? R. Dois motivos: 1. É incrível a quantidade de gente perguntando as mesmas coisas em fóruns por aí. 2. É incrível gente com anos trabalhando que simplesmente erra feio nesse negócio de MVC. E eu tava pensando em fazer um post épico, como havia feito anteriormente, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>P. Por que um tópico sobre <em>&#8220;supostas perguntas frequentes&#8221;</em>?</strong><br />
R. Dois motivos: 1. É incrível a quantidade de gente perguntando as mesmas coisas em fóruns por aí. 2. É incrível gente com anos trabalhando que simplesmente erra feio nesse negócio de MVC. E eu tava pensando em fazer um post épico, como havia feito anteriormente, mas como ainda tá &#8220;assando&#8221;, resolvi fazer um outro post épico sobre isso daqui.</p>
<p><strong>P. O que é MVC?</strong><br />
R. Háááá! Ainda bem que perguntou, acredita que tem gente que faz cara de conteúdo ao ouvir essas três letras? Enfim, deixa pra lá. MVC é um pattern usado, geralmente, para apresentações visuais de uma aplicação. Por ser pattern, implica que MVC também é uma descrição de uma solução para um problema recorrente; e que também não é uma receita de bolo para ser seguido de olhos vendados. O nome segue a sigla das três &#8220;coisas&#8221; que a aplicação vai ser dividida:</p>
<p><em>Model:</em> é como o seu programa seria se o usuário fosse um &#8220;über-geek&#8221; e pudesse manipular o sistema fazendo simples classes com main() invocando as funções desejadas. Ou seja, é o domínio do seu sistema.<br />
<em>View: </em>é o que o Homer Simpson do seu usuário vê: uma representação visual do domínio realizado pelo model.<br />
<em>Controller:</em> é o que fica entre o model e a view. Entre várias coisas, ele faz o que o model não deve fazer: manipular a view.</p>
<p>Implicação: o Controller conhece a View e o Model, a View conhece o Model, e o Model não conhece ninguém.</p>
<p><strong>P. Model, View e Controller são camadas, certo?</strong><br />
R. Não, na realidade, nunca vi ninguém por nome nesses &#8220;troços&#8221;. Sério! Às vezes, ouvi dizer que eram componentes, outros que eram camadas. Não acho nenhum dos dois nomes apropriados. Componentes remetem ao modismo do início da década de 00 de se usar &#8220;componentes reusáveis&#8221; por &#8220;operários&#8221; em &#8220;fábricas de softwares&#8221; (eca!). Ou então a um outro modismo de componentes distribuídos como COM+ ou EJB (daqueles antigão). Nenhuma das duas coisas deram certo, e o MVC não tem nada a ver com isso. E camadas refere-se a um estilo de design para dividir um domínio grande, que pode ser feito num software com ou sem interface visual.</p>
<p>A real é que, na dúvida, o pessoal dá um jeito não dizer em que Model, View e Controller são classificados.</p>
<p><strong>P. Mas perái! M, V e C são camadas sim! Model é a de persistência, View, a de apresentação e Controller, de negócio!</strong><br />
R. Nããããão, tá loco! Ponha uma coisa na sua cabeça: os objetivos tanto da divisão em camadas, quanto do MVC são distintas: a primeira tem o objetivo de controlar dependências, a segunda, de representar um domínio visualmente. Não são a mesma coisa, e nem dá para unificá-las em um modelo único. Algumas classes suas serão uma coisa do ponto de vista do MVC e serão outra coisa do ponto de vista das camadas.</p>
<p><strong>P. O Controller serve para controlar o sistema?</strong><br />
R. Não, o nome controller é que é confuso, e remete a alguns programadores o &#8220;objeto deus&#8221; <em>(God Object)</em> ou o &#8220;objeto bolha-assassina&#8221; <em>(Blob Object)</em>. Porém, objetos deuses são anti-patterns, ou seja, soluções aparentemente ideiais para problemas recorrentes que causam mais problemas ainda. Quando vier à sua cabeça <em>&#8220;Controller&#8221;</em>, pense-o como<em> &#8220;Input Controller&#8221;</em> (controlador de entrada), e este &#8220;coiso&#8221; deve fazer, estritamente, as seguintes atividades:<br />
- ouve eventos;<br />
- obtém os parâmetros de entrada desejados da View;<br />
- obtém do Model um domínio (invariavelmente, este está num meio persistente);<br />
- chama um método do domínio;<br />
- escolhe a view a ser renderizada, fazendo &#8220;bind&#8221; de algum domínio do Model.</p>
<p>Não raro, programadores pouco experientes colocam, no &#8220;Controller&#8221;, lógicas de negócio ou tranformações de objeto para a view. Não é isso, remova esses códigos e ponham nos seus devidos lugares.</p>
<p><strong>P. Ouvi falar de um tal de Model 2, ele é diferente do MVC?</strong><br />
R. Model 2 é uma adaptação do MVC, usando tecnologias padrão do J2EE como era conhecido no início da década de 00 (ou seja: Struts ou Servlet e JSP). O nome é puramente mercadológico, servia para diferenciar do &#8220;Model 1&#8243;, que era a utilização exclusiva de JSP para construção da aplicação web (assim como era o ASPão e o PHP). Por ser intimamente relacionado com tecnologias ultrapassadas, toda a burocracia da época está no Model 2, como Form Beans e XMLs, manipulação direta de mapas de escopos; sem falar de domínios fracos, normalmente misturados no meio da view ou das queries do banco. Minha recomendação: esqueça Model 2, porque você pode aprender MVC por outros meios.</p>
<p><strong>P. O MVC da Web é diferente do MVC do Desktop?</strong><br />
R. Sim, existem duas diferenças: 1) um Controller de Desktop recebe eventos de clique do mouse, de teclado, de botões e outros componentes; um Controller de Web recebe exclusivamente eventos de submissão. Consequência: aplicações Desktop são orientadas a eventos, enquanto aplicações Web, orientadas a fluxos. Tudo que uma aplicação web entende é uma &#8220;stringona&#8221; com os dados de um suposto formulário (não dá pra saber se o cliente é humano ou que viu a interface gráfica) e que precisa devolver uma nova &#8220;stringona&#8221; para o cliente que, supostamente, renderiza para algum desenho gráfico. A aplicação Desktop sabe exatamente os eventos recebidos e pode agir diferentemente para cada um deles. 2) A View de Desktop mantém sincronia constante do Model (através do pattern Observer), qualquer alteração que o usuário fizer no model através de um painel, será refletida imediatamente em outros painéis que, porventura, estejam visualizando o mesmo Model. Na Web, não existe nada disso, a partir do momento em que o usuário está diante de uma tela, essa representação do Model estará desconectada do Model real e o usuário não saberá quanto (e se) o Model mudou. O único momento de mudança é quando o usuário aperta F5, mas isso implica num evento consciente do usuário, não numa coisa automática, como as aplicações Desktop de qualidade fazem.</p>
<p><strong>P. Estava pensando em fazer um MVC distribuído, penso que o Model ficaria no Server e a View, no Client; só não sei onde ficaria o Controller, tem alguma sugestão?</strong><br />
R. Antes de mais nada, não existe MVC distribuído. O erro da sua pergunta baseia-se numa premissa equivocada, a de que é possível esconder a distribuição na aplicação. Não pode, e pra piorar, muitas &#8220;vendors&#8221; no passado (e ainda no presente) vendem soluções onde você poderia chamar um objeto remoto como se fosse local. Mas na real, chamadas locais e remotas somente são iguais quando ocorre sucesso, não quando ocorrem falhas, como queda na rede, versões incompatíveis ou falhas de autenticação/autorização.</p>
<p>Se você realmente precisar de uma aplicação distribuída (ex.: uma aplicação Desktop em C# conversando remotamente com um servidor Tomcat) você terá um MVC para o Client (o Model são Active Records que se comunicam com o Server, a View é o módulo onde se instancia componentes e o Controller, os métodos que entende os eventos) e um outro MVC para o Server (o Model são entidades, com seus services e mapeamento objeto-relacional, a View é XML, JSON, um formato binário ou outro qualquer e o Controller é o que entende requisições remotas).</p>
<p><strong>P. Tenho uma aplicação Web, gostaria de reaproveitar o Controller se precisasse mudar minha aplicação para Desktop, como fazer isso?</strong><br />
R. Não faz. O controller é intimamente ligado à view, ou seja, nova view, novo controller. A origem do seu problema pode ser Controllers agindo como God Objects (ver aqui), e a solução seria um refactoring, não um Controller multi-uso.</p>
<p><strong>P. O que o framework MVC faz? Age como Controller?</strong><br />
R. Quase. Lembra da lista citada acima sobre o que um Controller faz? Veremos o que um framework faz sozinho e outros que depende da ajuda manual do programador:<br />
- ouve eventos <strong>(framework)</strong>;<br />
- obtém os parâmetros de entrada desejados da View <strong>(framework, obtidos via DI)</strong>;<br />
- obtém do Model um domínio <strong>(manualmente)</strong>;<br />
- chama um método do domínio <strong>(manualmente)</strong>;<br />
- escolhe a view a ser renderizada, fazendo &#8220;bind&#8221; de algum domínio do Model <strong>(parcialmente pelo framework, a escolha da view pode ser sobreescrita manualmente)</strong>.</p>
<p>Há tentativas de algumas comunidades para criarem um framework onde o Controller deixa de existir, mas acredito que não funciona em todos os casos e dependem de models fixados a um padrão imposto ao framework. </p>
<p>Frameworks vão além, é claro, pois proveem funcionalidades adicionais como <em>helpers</em> para <em>views</em> e outras coisas.</p>
<hr/>
<p>São essas as perguntas que eu consegui imaginar. E você? Tem alguma dúvida sobre MVC além dessas daqui?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/06/29/mvc-supostas-perguntas-frequentes/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Já usou Memcached?</title>
		<link>http://www.objectzilla.com.br/2009/05/02/ja-usou-memcached/</link>
		<comments>http://www.objectzilla.com.br/2009/05/02/ja-usou-memcached/#comments</comments>
		<pubDate>Sat, 02 May 2009 20:02:17 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java cache memcached]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=207</guid>
		<description><![CDATA[Cache não é algo que os programadores desconhem. Quem esteve numa universidade, e teve uma aula séria de Arquitetura de Computadores, sabe que a memória é disposta numa hierarquia de caches. E quem já programou em Java, já ouviu falar de inicialização tardia, muito usado em singletons (apesar de não ser só para isso): public [...]]]></description>
			<content:encoded><![CDATA[<p>Cache não é algo que os programadores desconhem. Quem esteve numa universidade, e teve uma aula séria de Arquitetura de Computadores, sabe que a memória é disposta numa hierarquia de caches. E quem já programou em Java, já ouviu falar de inicialização tardia, muito usado em <em>singletons</em> (apesar de não ser só para isso):<span id="more-207"></span></p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MinhaClasse <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> MinhaClasse instance<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> MinhaClasse getInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    	<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>instance == <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    		instance = <span style="color: #000000; font-weight: bold;">new</span> MinhaClasse<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> instance<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// outras coisas</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esse é um jeito de fazer cache. Apenas deve-se tomar cuidado para que o objeto a ser retornado não seja mutável. Afinal, todos os interessados estão com a mesma instância, e se um dos clientes puderem mudar uma propriedade desse único objeto, todos terão o efeito indesejável de ter um objeto com comportamento diferente sem saber. Detalhe: a implementação de <em>singleton</em> dessa maneira é ingênua, evite-a.</p>
<p>Um outro jeito, comumente usado, de fazer cache é usar <em>session</em>. Pra quem tem uma aplicação web, parece mágico: joga-se uma entidade da persistência na sessão passando uma chave. Ao precisar do mesmo objeto de novo, ao invés de acessar o banco, pega-se o objeto da sessão com a mesma chave usada na escrita. Esse é a estratégia mais comum que eu já vi por aí. Mas existem vários problemas : já vi aplicações com mais código pra cache em sessão do que pro próprio negócio! Além do mais, <em>sessions</em> são únicas para cada usuário no <em>browser</em>, enquanto que a entidade a ser cacheada é, não raro, visível a vários usuários. Significa duas coisas: 1) Não vai ter uma cacheamento efetivo, se 20 usuários se logarem e todos acessarem a mesma entidade duas vezes, haverá vinte cópias do objeto, que será escrita e lida uma vez cada; 2) Ninguém sabe o que um outro usuário pode fazer, se um alterar a entidade, todos os dezenove usuários restantes não terão como saber disso e manterão cópias desatualizadas. <em>Session</em> não foi feita pra cache, e existe até um problema de design: apesar do mapa de sessão pertencer à camada de apresentação, o cache lida com problemas de objetos que surgem na camada de persistência. Dizer que um pode ser usado para implementação do outro resulta em confusões de conceitos.</p>
<p>Uma solução melhor é usar bibliotecas de cache. No Java, um bastante comum é o EHCache &#8212; usado principalmente para o cache de segundo nível de Hibernate &#8212; que fica na mesma JVM da sua aplicação. Não que seja ruim (tem até uns javeiros roxos que acham que esta é a melhor solução do mundo), mas quando se quer usar um cluster de aplicações web, por exemplo, passa-se a ter vários caches para cada instância de servidor, que é não o desejável. Uma das opções de cache, que fica fora da JVM de sua aplicação, é o Memcached.</p>
<p>A seguir, apresentarei as vantagens do Memcached, seu mecanismo básico junto com uma API do Java, e no final, o uso integrado com o Hibernate.</p>
<h2>Características do Memcached</h2>
<p>Memcached permite a chamada <strong>escalabilidade horizontal</strong>, ou seja, é possível usar várias instâncias de memcached em paralelo como se fosse uma única unidade, onde cada processo possui somente parte dos registros. Parece idiota, mas não é. Não é toda infraestrutura que lhe permite isso; bancos de dados tradicionais, sistemas operacionais e máquinas virtuais possuem uma dificuldade tremenda de configurações para que isso seja possível.</p>
<p>Porém, ser fácil de se escalar horizontalmente trouxe certos custos na sua implementação. Exemplo: Não existe replicação de dados automática, se quiser duas instâncias com dados iguais, terá que fazer seu script. Não existe transação e nem lock, pois isso gera contenção. Não existem busca por todos os registros ou por wildcards, pois pode causar demora nos resultados. E não há garantia de durabilidade de objetos armazenados em casos de <em>crash</em>.</p>
<p>E ainda duas características peculiares, uma é que o <strong>tempo de expiração no cache</strong> não é zerado com consultas (como é tradicional nas sessions de containeres web), ou seja, se você definir como tempo de expiração dois minutos, esse será o tempo que ficará armazenado, independente se houve consulta do registro nesse meio-tempo ou não. Portanto, sempre coloque no memcached objetos que já estejam persistidos em outro lugar. A segunda característica é que o tempo de expiração é definido por segundos que devem ser armazenados, ou seja, uma hora é 3600. Mas apenas se o tempo de permanência for menor que trinta dias, se for maior, o Memcached assume que é o tempo UNIX absoluto, ou seja, 1240699927 significa que o registro deve permanecer em cache até em 25 de abril de 2009 às 22h52min07 em UTC.</p>
<h2>Como usar</h2>
<p>Se você estiver usando alguma distribuição Linux, com certeza o Memcached pode ser baixado diretamente de seu repositório. Caso você seja um usuário Windows, existem portes do cache para esse Sistema Operacional <a href="http://www.splinedancer.com/memcached-win32/">aqui</a> e <a href="http://code.jellycan.com/memcached/">aqui</a>. Como só tenho o Fedora, não testei pra ver se funciona, então o <a href="http://www.google.com.br/">Google</a> será melhor pra resolver problemas de instalação no Windows do que eu.</p>
<p>Além disso, é necessário um cliente Memcached, que existem para várias linguagens. No Java, a melhor biblioteca que encontrei é a <a href="http://code.google.com/p/spymemcached/">Spy Memcached</a>, disponível na <a href="http://spymemcached.googlecode.com/files/memcached-2.3.1.jar">versão 2.3.1</a>. Baixe o arquivo e coloque no classpath de sua aplicação.</p>
<p>Incialize o Memcached no seu shell dessa maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">memcached <span style="color: #660033;">-p</span> <span style="color: #000000;">18000</span> <span style="color: #660033;">-vv</span></pre></div></div>

<p>A opção -p indica a porta da conexão TCP por onde será &#8220;ouvida&#8221; (não é necessário, se não informar será assumido o padrão 11211), e o -vv é a opção <em>verbose</em>.</p>
<p>Na sua aplicação Java, você abre um cliente Memcached dessa maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">MemcachedClient mem = <span style="color: #000000; font-weight: bold;">new</span> MemcachedClient<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InetSocketAddress</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, <span style="color: #cc66cc;">18000</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ou seja, passando um endereço de rede ao construtor do MemcachedClient. Caso você queira um cluster de aplicações Memcached, é possível também passar uma lista de endereços de redes, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">MemcachedClient mem = <span style="color: #000000; font-weight: bold;">new</span> MemcachedClient<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InetSocketAddress</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InetSocketAddress</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, <span style="color: #cc66cc;">18000</span><span style="color: #009900;">&#41;</span>,
				<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InetSocketAddress</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, <span style="color: #cc66cc;">18001</span><span style="color: #009900;">&#41;</span>,
			<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Obviamente, é necessário duas instâncias de Memcached disponíveis nesses endereços.</p>
<p>As operações que o Memcached suporta são simples, exemplos:</p>
<h3>set</h3>
<p><img src="/wp-content/pic/memcached/opcao_set.png" alt="Memcached - exemplo do comando SET" /></p>
<p>A operação <strong>set</strong> insere um valor para uma dada chave, independente se esta já possuía um valor anterior ou não:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #003399; font-weight: bold;">String</span> marca = <span style="color: #0000ff;">&quot;Ford&quot;</span><span style="color: #339933;">;</span>
     <span style="color: #006600; font-weight: bold;">int</span> expira = <span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> + <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span> / <span style="color: #cc66cc;">1000</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// uma hora pra expirar</span>
&nbsp;
     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> valido = mem.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;marca&quot;</span>, expira, marca<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Lembre-se também do comportamento dos trinta dias, as duas formas abaixo setam o mesmo período de expiração:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> valido = mem.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;marca&quot;</span>, <span style="color: #cc66cc;">24</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, marca<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// um dia para expirar</span>
     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> valido = mem.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;marca&quot;</span>, <span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> + <span style="color: #cc66cc;">24</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span> / <span style="color: #cc66cc;">1000</span>, marca<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// também um dia</span></pre></div></div>

<p>É possível <em>setar</em> qualquer coisa, inclusive objetos Java que sejam seriálizáveis. Porém, qualquer coisa diferente de um tipo simples não é identificável para programas em outras linguagens que se conectarem a esse mesmo Memcached.</p>
<h3>add</h3>
<p><img src="/wp-content/pic/memcached/opcao_add.png" alt="Memcached - exemplo do comando ADD" /></p>
<p>A operação <strong>add</strong>, apesar do nome, insere um valor para uma dada chave, deste que esta não esteja com um elemento previamente armazenado:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     Pessoa pessoa1 = <span style="color: #000000; font-weight: bold;">new</span> Pessoa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     pessoa1.<span style="color: #006633;">setId</span><span style="color: #009900;">&#40;</span>28L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     pessoa1.<span style="color: #006633;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Leonardo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> valido1 = mem.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pessoa&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, pessoa1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// valido1 é true</span>
&nbsp;
     Pessoa pessoa2 = <span style="color: #000000; font-weight: bold;">new</span> Pessoa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     pessoa2.<span style="color: #006633;">setId</span><span style="color: #009900;">&#40;</span>41L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     pessoa2.<span style="color: #006633;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Vinicius&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> valido2 = mem.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pessoa&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, pessoa2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// valido2 é false</span></pre></div></div>

<h3>replace</h3>
<p><img src="/wp-content/pic/memcached/opcao_replace.png" alt="Memcached - exemplo do comando REPLACE" /></p>
<p>A operação <strong>replace</strong>, ao contrário do <em>add</em>, insere um valor para uma dada chave apenas se esta já estiver anteriormente armazenado:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #006600; font-weight: bold;">int</span> anoLancamento = <span style="color: #cc66cc;">2010</span><span style="color: #339933;">;</span>
     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> valido1 = mem.<span style="color: #006633;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, anoLancamento<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// valido1 é false</span>
&nbsp;
     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> ok = mem.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, anoLancamento<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// set armazena de qualquer jeito</span>
     ok.<span style="color: #006633;">get</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;">// bloqueia até a conclusão</span>
&nbsp;
     <span style="color: #006600; font-weight: bold;">int</span> novoAnoLancamento = <span style="color: #cc66cc;">2011</span><span style="color: #339933;">;</span>
     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> valido2 = mem.<span style="color: #006633;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, novoAnoLancamento<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// valido2 é true</span></pre></div></div>

<h3>get</h3>
<p><img src="/wp-content/pic/memcached/opcao_get.png" alt="Memcached - exemplo do comando GET" /></p>
<p>A operação <strong>get</strong> busca um registro armazenado anteriormete, dada uma chave:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #003399; font-weight: bold;">String</span> marca = <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">String</span><span style="color: #009900;">&#41;</span> mem.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;marca&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// &quot;Ford&quot;, ou null se demorou demais ou expirou</span></pre></div></div>

<h3>delete</h3>
<p><img src="/wp-content/pic/memcached/opcao_delete.png" alt="Memcached - exemplo do comando DELETE" /></p>
<p>A operação <strong>delete</strong> apaga um valor no Memcached dada a chave. O valor armazenado não é retornado:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> valido1 = mem.<span style="color: #006633;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// true</span>
&nbsp;
     <span style="color: #003399; font-weight: bold;">Future</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Boolean</span><span style="color: #339933;">&gt;</span> valido2 = mem.<span style="color: #006633;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// false</span></pre></div></div>

<h3>incr</h3>
<p>A operação <strong>incr</strong> incrementa um valor previamente armazenado. Válido somente para números:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #006600; font-weight: bold;">long</span> valor1 = mem.<span style="color: #006633;">incr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contador&quot;</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* o segundo parâmetro é valor a ser incrementado */</span>
                                               <span style="color: #666666; font-style: italic;">/* o terceiro parâmetro (opcional) é o valor inicial caso não haja nenhum par armazenado */</span>
                                               <span style="color: #666666; font-style: italic;">/* valor1 = 5 */</span>
&nbsp;
     <span style="color: #006600; font-weight: bold;">long</span> valor2 = mem.<span style="color: #006633;">incr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contador&quot;</span>, <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* se não informasse o valor inicial e esta fosse a primeira chamada, o retorno seria -1 */</span>
                                            <span style="color: #666666; font-style: italic;">/* valor2 = 12 */</span></pre></div></div>

<h3>decr</h3>
<p>A operação <strong>decr</strong> decrementa um valor previamente armazenado. Válido somente para números:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #006600; font-weight: bold;">long</span> valor1 = mem.<span style="color: #006633;">decr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contador&quot;</span>, <span style="color: #cc66cc;">12</span>, <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* valor1 = 20 */</span>
     <span style="color: #006600; font-weight: bold;">long</span> valor2 = mem.<span style="color: #006633;">decr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contador&quot;</span>, <span style="color: #cc66cc;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      <span style="color: #666666; font-style: italic;">/* valor2 = 11 */</span></pre></div></div>

<p>Lembre-se: os números são só positivos. Se o valor armazenado é 4 e você decrementar 6, o valor final é 0 (zero).</p>
<h2>Exemplo de cache para banco de dados</h2>
<p>Vamos a uma situação prática. Imagine um banco de consulta de preços de um supermercado. Alguns preços são consultados com bastante frequência e seus preços são raramente alterados. Idealmente, seria interessante cachear esses valores retornados para aliviar a carga do banco. Meu objeto de domínio é um só:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProductDescription <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399; font-weight: bold;">Serializable</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">long</span> barCode<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> description<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">BigDecimal</span> price<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> type<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// getters e setters omitidos</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Meu acesso aos dados obedece a essa interface:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.testeDaoMemcached</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> ProductDescriptionRepository <span style="color: #009900;">&#123;</span>
&nbsp;
	ProductDescription getByBarCode<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> barCode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">void</span> refreshProductInformation<span style="color: #009900;">&#40;</span>ProductDescription product<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ou seja, existe um método para retornar um pedido por código de barras (<em>getByBarCode()</em>) e outro que atualiza ou insere um produto (<em>refreshProductInformation()</em>).Também tenho uma classe, implementando essa interface, que executa comandos SQL no banco via JDBC (ProductDescriptionDAO, não mostrado).</p>
<p>O pulo do gato é uma classe, que fica como um Decorator, que realiza o cache, veja:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.testeDaoMemcached</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.spy.memcached.MemcachedClient</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProductDescriptionCacheDecorator <span style="color: #000000; font-weight: bold;">implements</span> ProductDescriptionRepository <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> MemcachedClient memcachedClient<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">int</span> expiration<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> ProductDescriptionRepository other<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> ProductDescription getByBarCode<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> barCode<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		ProductDescription product = <span style="color: #009900;">&#40;</span>ProductDescription<span style="color: #009900;">&#41;</span> memcachedClient.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;product_descr/&quot;</span> + barCode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>product == <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			product = other.<span style="color: #006633;">getByBarCode</span><span style="color: #009900;">&#40;</span>barCode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			memcachedClient.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;product_descr/&quot;</span> + barCode, expiration, product<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> product<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> refreshProductInformation<span style="color: #009900;">&#40;</span>ProductDescription product<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		other.<span style="color: #006633;">refreshProductInformation</span><span style="color: #009900;">&#40;</span>product<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		memcachedClient.<span style="color: #006633;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;product_descr/&quot;</span> + product.<span style="color: #006633;">getBarCode</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>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setMemcachedClient<span style="color: #009900;">&#40;</span>MemcachedClient memcachedClient<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;">memcachedClient</span> = memcachedClient<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setExpiration<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">int</span> expiration<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;">expiration</span> = expiration<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setOther<span style="color: #009900;">&#40;</span>ProductDescriptionRepository other<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;">other</span> = other<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Primeiro, a variável other refere-se a uma outra classe que implementa também ProductDescriptionRepository, como a classe acima é um decorator, natural que essa referência seja de um objeto que realmente faz acesso ao banco. Tem-se também a instância de um MemcachedClient e a instância de um período de expiração, para ser usado para a manipulação de dados do Memcached.</p>
<p>Veja, primeiro, o método <strong>getByBarCode</strong>, a primeira coisa que se faz é buscar um registro no memcached usando uma chave formada do nome abreviado do objeto seguido do código de barras do produto (o id). Havendo esse registro, retorna-o, e aí a consulta ao banco não é realizada e fim de papo. Se esse registro não estiver no Memcached, aí este é buscado no banco (através de <em>other</em>) e, em sequência, realizada a inserção do objeto no cache, para que as próximas chamadas desse método não façam busca no banco de novo. Lembre-se que o cache expira, e não é apropriado assumir que o objeto está sempre no cache, portanto é sempre necessário ter essa verificação de registro vazio em todas as suas consultas.</p>
<p>Ao inserir ou alterar um registro, o dado no cache fica desatualizado. Por isso, existe uma chamada para remover o ítem após a inserção bem sucedida no método <strong>refreshProductInformation()</strong>. Poderia haver uma inserção no memcache nesse ponto, mas preferi não fazer, porque de qualquer forma, isso será feito no método de busca.</p>
<p>A aplicação que exercita esse cache está disponível nesse <a href="/wp-content/zip/testeDaoMemcached.zip">zip</a>, caso queiram estudá-lo com mais detalhes.</p>
<h2>Usando como cache de segundo nível do Hibernate</h2>
<p>O <a href="https://www.hibernate.org/">Hibernate</a> possui suporte a cache de segundo nível, e a implementação mais comum é o <a href="http://ehcache.sourceforge.net/">EHCache</a>, que vem junto com o framework de persistência. Por ter um cache quase automático (pois você precisa habilitá-lo para cada entidade mapeada), é meio desvantajoso fazer cacheamento manualmente como fiz anteriormente. Incrivelmente, na minha busca por Memcached no Google, me deparei com o plugin <a href="http://code.google.com/p/hibernate-memcached/">hibernate-memcached</a> que usa o Memcached como cache de segundo nível.</p>
<p>Se a opção for essa, as coisas facilitam bastante. Primeiro, anotaremos a entidade ProductDescription, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@<span style="color: #003399; font-weight: bold;">Entity</span>
@Table<span style="color: #009900;">&#40;</span>name=<span style="color: #0000ff;">&quot;product_description&quot;</span><span style="color: #009900;">&#41;</span>
@Cache<span style="color: #009900;">&#40;</span>usage=CacheConcurrencyStrategy.<span style="color: #006633;">NONSTRICT_READ_WRITE</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> ProductDescription <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399; font-weight: bold;">Serializable</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	@Id
	@Column<span style="color: #009900;">&#40;</span>name=<span style="color: #0000ff;">&quot;bar_code&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">long</span> barCode<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> description<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">BigDecimal</span> price<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> type<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// getters e setters</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Existem as anotações triviais do JPA, como @Entity, @Table, @Id e @Column. Mas existe também a anotação específica do Hibernate, que é o @Cache. Na estratégia de concorrência, estou dizendo que é possível haver escrita e leitura, mas que a escrita não bloqueia leituras. Sem esta anotação, o cache não funciona pra essa entidade. (Por isso, se você um dia colocou o cache de segundo nível que você queria nas configurações, mas nunca colocou a anotação @Cache nas entidades, é a mesma coisa que não ter cache de segundo nível.)</p>
<p>O Dao faz acessos ao Hibernate normalmente (estou usando o template do Spring):</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.hibernateMemcached</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.hibernate.SessionFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.springframework.orm.hibernate3.HibernateTemplate</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.springframework.transaction.annotation.Transactional</span><span style="color: #339933;">;</span>
&nbsp;
@Transactional
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProductDescriptionDAO <span style="color: #000000; font-weight: bold;">implements</span> ProductDescriptionRepository <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> HibernateTemplate hibernateTemplate<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> ProductDescription getByBarCode<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> barCode<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>ProductDescription<span style="color: #009900;">&#41;</span> hibernateTemplate.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>ProductDescription.<span style="color: #000000; font-weight: bold;">class</span>, barCode<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: #006600; font-weight: bold;">void</span> refreshProductInformation<span style="color: #009900;">&#40;</span>ProductDescription product<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		product = <span style="color: #009900;">&#40;</span>ProductDescription<span style="color: #009900;">&#41;</span> hibernateTemplate.<span style="color: #006633;">merge</span><span style="color: #009900;">&#40;</span>product<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		hibernateTemplate.<span style="color: #006633;">saveOrUpdate</span><span style="color: #009900;">&#40;</span>product<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: #006600; font-weight: bold;">void</span> setSessionFactory<span style="color: #009900;">&#40;</span>SessionFactory sessionFactory<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		hibernateTemplate = <span style="color: #000000; font-weight: bold;">new</span> HibernateTemplate<span style="color: #009900;">&#40;</span>sessionFactory<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E pra configurar, basta adicionar essas propriedades no hibernate.cfg.xml:</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;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;hibernate.cache.provider_class&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>com.googlecode.hibernate.memcached.MemcachedCacheProvider<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;hibernate.cache.use_query_cache&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;hibernate.memcached.servers&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>localhost:14001<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Onde eu indico o provedor do cache, a opção de se fazer cache de queries, e o servidor do Memcached. Não são as únicas opções, mas as outras possuem opção <em>default</em>, que você encontra <a href="http://code.google.com/p/hibernate-memcached/wiki/Configuration">aqui</a>.</p>
<p>É só isso, agora é só adiconar o hibernate-memcached e o spy-memcached no seu classpath e rodar a aplicação. Também disponibilizei um <a href="/wp-content/zip/hibernateMemcached.zip">zip</a> para esse exemplo, caso vocês queiram dar uma olhada.</p>
<h2>Conclusão</h2>
<p>Usar cache, seja o Memcached ou qualquer outro, é uma boa opção para evitar acesso a recursos custosos, como o banco de dados. Mas, numa aplicação dividida em camadas não é sempre necessário que a responsabilidade de cachear fique no lado cliente (camada de apresentação). Se deixar que o lado servidor (camada de persistência) tenha essa responsabilidade, você pode deixar que os clientes acessem a camada de persistência na hora e do jeito que bem entenderem e, ainda assim, de maneira transparente, estará sendo feito acesso eficiente de recursos.</p>
<p>Eu havia feito uma medição bem informal de quanto o Memcached economizaria o tempo de busca. Levei à conclusão de que por causa de warm-up e tudo mais, eu não sei fazer benchmarks. <img src='http://www.objectzilla.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  O mais importante do cache não costuma nem ser o tempo de acesso mais rápido, mas o fato de não deixar &#8220;engargalar&#8221; o banco com muitos acessos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/05/02/ja-usou-memcached/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aprenda Java EE 6, agora! (3)</title>
		<link>http://www.objectzilla.com.br/2009/03/22/aprenda-java-ee-6-agora-3/</link>
		<comments>http://www.objectzilla.com.br/2009/03/22/aprenda-java-ee-6-agora-3/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 22:22:02 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=198</guid>
		<description><![CDATA[Seguindo o post anterior, continuaremos a aplicação de AgendaMedica. Lembra do que faltava? Precisávamos de um conceito de Consulta, que não havia no nosso modelo. E precisávamos que a consulta tivesse uma característica melhor do mundo real, como, por exemplo, não permitir duas consultas no mesmo horário e não permitir consultas fora do horário do [...]]]></description>
			<content:encoded><![CDATA[<p>Seguindo o <a href="http://www.objectzilla.com.br/2009/02/24/aprenda-java-ee-6-agora-2/">post anterior</a>, continuaremos a aplicação de AgendaMedica. Lembra do que faltava? Precisávamos de um conceito de Consulta, que não havia no nosso modelo. E precisávamos que a consulta tivesse uma característica melhor do mundo real, como, por exemplo, não permitir duas consultas no mesmo horário e não permitir consultas fora do horário do médico.<br />
<span id="more-198"></span></p>
<p>Como faríamos isso? Bom, primeiro haveria a classe Consulta, que só existirá a partir do relacionamento entre Paciente e Medico.</p>
<p>Mas antes vou subdividir as minhas classes atuais em pacotes, assim:</p>
<pre>
.
|-- aplicacao
|   |-- AgendaFormServlet.java
|   |-- Agendamento.java
|   |-- AgendamentoServlet.java
|   `-- ConsultaServlet.java
|-- dominio
|   |-- AgendamentoImpl.java
|   |-- Medico.java
|   |-- MedicoNaoEncontradoException.java
|   |-- MedicoRepositorio.java
|   |-- Paciente.java
|   |-- PacienteNaoEncontradoException.java
|   `-- PacienteRepositorio.java
`-- persistencia
    |-- MedicoDAO.java
    `-- PacienteDAO.java
</pre>
<p>Se desse jeito é uma boa idéia ou não, eu não sei. Mas sei que a famosa subdivisão por <em>patterns</em> que se encontra por aí não tem o menor sentido. Pacotes deveriam ser divididos sobre a regra: <em>&#8220;alta coesão e baixo acoplamento&#8221;</em>, assim como é com classes, arquivos e métodos. A subdivisão por <em>patterns</em> parece ser o contrário disso: tem <b>baixa coesão</b> porque um determinado domínio está espalhado entre os pacotes <em>to</em>, <em>dto</em>, <em>entity</em>, <em>sessionbean</em> etc.; e tem <b>alto acoplamento</b> porque sob o mesmo pacote está uma classe sobre Veiculo e outra sobre Arvore. Tudo bem que é importante a subdivisão por camadas, mas não vai achar que os TOs estão em uma camada própria!</p>
<p>Dando prosseguimento, vamos criar uma nova classe de teste para a criação da classe Consulta. Sabemos que essa classe não existe sem Paciente e Medico, portanto iremos colocar essas classes no construtor. Não só isso, Consulta não existe sem um horário inicial e a duração dela, e portanto também estará no construtor. </p>
<p>Mas vamos definir uma regra clara: só é possível marcar consulta em horário disponível. Nesse primeiro teste, como não foi setado um horário, então deve dar erro sempre que marcar uma consulta.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Test
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> consultaNaoDisponivel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	Paciente p = <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	p.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Leonardo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	Medico m = <span style="color: #000000; font-weight: bold;">new</span> Medico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	m.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dr. Meredith Grey&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// não informo o período de consulta </span>
&nbsp;
	<span style="color: #003399; font-weight: bold;">Calendar</span> c = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	c.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2009</span>, <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MARCH</span>, 01, <span style="color: #cc66cc;">15</span>, 00, 00<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">new</span> Consulta<span style="color: #009900;">&#40;</span>p, m, c.<span style="color: #006633;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		Assert.<span style="color: #006633;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Esperava-se o lançamento de exceçao&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>ConsultaNaoDisponivel e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
	Assert.<span style="color: #006633;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Gere o construtor e a classe de exceção (eu herdei de <strong>IllegalStateException</strong>) para o compilador não reclamar. Após rodar o teste, vai acusar um erro. Faça o teste rodar adicionando a seguinte instrução no construtor:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> Consulta<span style="color: #009900;">&#40;</span>Paciente paciente, Medico medico, <span style="color: #003399; font-weight: bold;">Date</span> inicio, <span style="color: #006600; font-weight: bold;">int</span> duracaoMinutos<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> ConsultaNaoDisponivel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Não é o que se espera, mas faz, por enquanto, o teste rodar.</p>
<p>Agora, qual seria um caso onde realmente a consulta aconteceria com sucesso? Seria quando o consulta estivesse dentro de um horário disponível pelo médico. Minha idéia é que médico teria seus horários disponíves (classe HorarioDisponivel) com dia da semana, horário inicial e horário final. A consulta só ocorreria quando a consulta batesse com pelo menos um desses intervalos.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> consultaDisponivel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		Paciente p <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		p.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Leonardo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		Medico m <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Medico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		m.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dr. Meredith Grey&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		m.<span style="color: #006633;">adicioneDisponibilidade</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> HorarioDisponivel<span style="color: #009900;">&#40;</span>DiaSemana.<span style="color: #006633;">SEGUNDA</span>, <span style="color: #cc66cc;">13</span>, 00, <span style="color: #cc66cc;">19</span>, 00<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;">// não informo o período de consulta </span>
&nbsp;
		<span style="color: #003399;">Calendar</span> c <span style="color: #339933;">=</span> <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		c.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2009</span>, <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">MARCH</span>, 02, <span style="color: #cc66cc;">15</span>, 00, 00<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
		Consulta consulta <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Consulta<span style="color: #009900;">&#40;</span>p, m, c.<span style="color: #006633;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">SimpleDateFormat</span> sdf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">SimpleDateFormat</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ddMMyyyyhhmmss&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">Assert</span>.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>p, consulta.<span style="color: #006633;">getPaciente</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: #000000; font-weight: bold;">Assert</span>.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>m, consulta.<span style="color: #006633;">getMedico</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: #000000; font-weight: bold;">Assert</span>.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;02032009150000&quot;</span>, sdf.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span>consulta.<span style="color: #006633;">getInicio</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">Assert</span>.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;02032009160000&quot;</span>, sdf.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span>consulta.<span style="color: #006633;">getFim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Depois de acertar os problemas de compilação, rode o teste. O construtor de consulta irá lançar exceção, falhando o teste. Claro, agora é hora de acertarmos este construtor para que não lance a exceção nesse segundo caso de teste.</p>
<p>A nova classe de consulta ficou assim:</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> Consulta <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Serializable</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Consulta<span style="color: #009900;">&#40;</span>Paciente paciente, Medico medico, <span style="color: #003399;">Date</span> inicio, <span style="color: #000066; font-weight: bold;">int</span> duracaoMinutos<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Set<span style="color: #339933;">&lt;</span>HorarioDisponivel<span style="color: #339933;">&gt;</span> disponibilidades <span style="color: #339933;">=</span> medico.<span style="color: #006633;">getDisponibilidades</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">Calendar</span> inicioConsulta <span style="color: #339933;">=</span> <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		inicioConsulta.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>inicio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">Calendar</span> finalConsulta <span style="color: #339933;">=</span> <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		finalConsulta.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>inicio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		finalConsulta.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Calendar</span>.<span style="color: #006633;">MINUTE</span>, duracaoMinutos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">boolean</span> disponivel <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>HorarioDisponivel disponibilidade <span style="color: #339933;">:</span> disponibilidades<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>inicioConsulta.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Calendar</span>.<span style="color: #006633;">DAY_OF_WEEK</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> disponibilidade.<span style="color: #006633;">diaSemana</span>.<span style="color: #006633;">ordinal</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #003399;">Calendar</span> limiteInicial <span style="color: #339933;">=</span> <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">getInstance</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;">// o dia seria igual à data marcada, apenas para não complicar</span>
				limiteInicial.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>inicio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				limiteInicial.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Calendar</span>.<span style="color: #006633;">HOUR_OF_DAY</span>, disponibilidade.<span style="color: #006633;">horaInicial</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				limiteInicial.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Calendar</span>.<span style="color: #006633;">MINUTE</span>, disponibilidade.<span style="color: #006633;">minutoInicial</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				limiteInicial.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Calendar</span>.<span style="color: #006633;">SECOND</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #003399;">Calendar</span> limiteFinal <span style="color: #339933;">=</span> <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">getInstance</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;">// o dia seria igual à data marcada, apenas para não complicar</span>
				limiteFinal.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>inicio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #666666; font-style: italic;">// se hora final é menor que hora inicial, assumimos que a hora</span>
				<span style="color: #666666; font-style: italic;">// final refere-se ao dia seguinte. Exemplo: inicial: 22 e</span>
				<span style="color: #666666; font-style: italic;">// final: 04 significa um período que começa às 10 da noite de</span>
				<span style="color: #666666; font-style: italic;">// um dia e vai até às 4 da manhã do dia seguinte</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>disponibilidade.<span style="color: #006633;">horaFinal</span> <span style="color: #339933;">&lt;</span> disponibilidade.<span style="color: #006633;">horaInicial</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					limiteFinal.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Calendar</span>.<span style="color: #006633;">DAY_OF_MONTH</span>, <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
&nbsp;
				limiteFinal.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Calendar</span>.<span style="color: #006633;">HOUR_OF_DAY</span>, disponibilidade.<span style="color: #006633;">horaFinal</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				limiteFinal.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Calendar</span>.<span style="color: #006633;">MINUTE</span>, disponibilidade.<span style="color: #006633;">minutoFinal</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				limiteFinal.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Calendar</span>.<span style="color: #006633;">SECOND</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #666666; font-style: italic;">// verifica se a data está no intervalo</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>inicioConsulta.<span style="color: #006633;">compareTo</span><span style="color: #009900;">&#40;</span>limiteInicial<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span> finalConsulta.<span style="color: #006633;">compareTo</span><span style="color: #009900;">&#40;</span>limiteFinal<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					disponivel <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
					<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>disponivel<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;">paciente</span> <span style="color: #339933;">=</span> paciente<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">medico</span> <span style="color: #339933;">=</span> medico<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">inicio</span> <span style="color: #339933;">=</span> inicioConsulta.<span style="color: #006633;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">fim</span> <span style="color: #339933;">=</span> finalConsulta.<span style="color: #006633;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> ConsultaNaoDisponivel<span style="color: #009900;">&#40;</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;">// getters omitidos</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> Paciente paciente<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> Medico medico<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> inicio<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> fim<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E ainda precisei alterar a classe do médico para adicionar os seguintes métodos e atributos:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Medico <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399; font-weight: bold;">Serializable</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// ...	</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> adicioneDisponibilidade<span style="color: #009900;">&#40;</span>HorarioDisponivel horarioDisponivel<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		disponibilidades.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>horarioDisponivel<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; font-weight: bold;">Set</span><span style="color: #339933;">&lt;</span>HorarioDisponivel<span style="color: #339933;">&gt;</span> getDisponibilidades<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: #003399; font-weight: bold;">Collections</span>.<span style="color: #006633;">unmodifiableSet</span><span style="color: #009900;">&#40;</span>disponibilidades<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;">//...	</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">Set</span><span style="color: #339933;">&lt;</span>HorarioDisponivel<span style="color: #339933;">&gt;</span> disponibilidades = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">HashSet</span><span style="color: #339933;">&lt;</span>HorarioDisponivel<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Com isso, a classe HorarioDisponivel ficou assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> HorarioDisponivel <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">enum</span> DiaSemana <span style="color: #009900;">&#123;</span>DOMINGO, SEGUNDA, TERCA, QUARTA, QUINTA, SEXTA, SABADO<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> HorarioDisponivel<span style="color: #009900;">&#40;</span>DiaSemana diaSemana, <span style="color: #006600; font-weight: bold;">int</span> horaInicial, <span style="color: #006600; font-weight: bold;">int</span> minutoInicial,
			<span style="color: #006600; font-weight: bold;">int</span> horaFinal, <span style="color: #006600; font-weight: bold;">int</span> minutoFinal<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;">diaSemana</span> = diaSemana<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">horaInicial</span> = horaInicial<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">minutoInicial</span> = minutoInicial<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">horaFinal</span> = horaFinal<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">minutoFinal</span> = minutoFinal<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	DiaSemana diaSemana<span style="color: #339933;">;</span>
	<span style="color: #006600; font-weight: bold;">int</span> horaInicial<span style="color: #339933;">;</span>
	<span style="color: #006600; font-weight: bold;">int</span> minutoInicial<span style="color: #339933;">;</span>
	<span style="color: #006600; font-weight: bold;">int</span> horaFinal<span style="color: #339933;">;</span>
	<span style="color: #006600; font-weight: bold;">int</span> minutoFinal<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Hora de refatorar, três problemas à vista: um é o fato do construtor da Consulta estar acessando demais as propriedades de HorarioDisponivel, indício que boa parte dessa lógica poderia estar nessa classe; outro é o fato do médico ter <strong>duas</strong> formas de realizar consulta, a antiga através dos métodos <em>consulta(Calendar)</em> e <em>consulta(Paciente, Calendar)</em> e a nova que foi feita agora, ou seja, o antigo precisa ser removido; por último é o fato da aplicação ainda salvar o objeto Médico na hora de criar uma consulta.</p>
<p>Ao primeiro problema, criei um método <em>isDentroHorario()</em> dentro de HorarioDisponivel, contendo o &#8220;miolo&#8221; do laço <em>for</em>. Assim, o construtor de Consulta foi reduzido a:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #003399; font-weight: bold;">Set</span><span style="color: #339933;">&lt;</span>HorarioDisponivel<span style="color: #339933;">&gt;</span> disponibilidades = medico.<span style="color: #006633;">getDisponibilidades</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399; font-weight: bold;">Calendar</span> inicioConsulta = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		inicioConsulta.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>inicio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399; font-weight: bold;">Calendar</span> finalConsulta = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		finalConsulta.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>inicio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		finalConsulta.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MINUTE</span>, duracaoMinutos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #006600; font-weight: bold;">boolean</span> disponivel = <span style="color: #006600; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000;  font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>HorarioDisponivel disponibilidade : disponibilidades<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
			<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>disponibilidade.<span style="color: #006633;">isDentroHorario</span><span style="color: #009900;">&#40;</span>inicioConsulta, finalConsulta<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				disponivel = <span style="color: #006600; font-weight: bold;">true</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">break</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;">if</span> <span style="color: #009900;">&#40;</span>disponivel<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;">paciente</span> = paciente<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">medico</span> = medico<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">inicio</span> = inicioConsulta.<span style="color: #006633;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">fim</span> = finalConsulta.<span style="color: #006633;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000;  font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> ConsultaNaoDisponivel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O teste rodou com sucesso.</p>
<p>Ao segundo problema, retirei os dois métodos <em>consulta()</em> e adicionei o novo método <em>marcaConsulta()</em>, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> marcaConsulta<span style="color: #009900;">&#40;</span>Paciente paciente, <span style="color: #003399; font-weight: bold;">Date</span> horario<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Consulta novaConsulta = <span style="color: #000000; font-weight: bold;">new</span> Consulta<span style="color: #009900;">&#40;</span>paciente, <span style="color: #000000; font-weight: bold;">this</span>, horario, <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>getConsultas<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> == <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			setConsultas<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">HashSet</span><span style="color: #339933;">&lt;</span>Consulta<span style="color: #339933;">&gt;</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>
		getConsultas<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>novaConsulta<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>É claro que isso teve impacto em alguns casos de testes. Mas o código final não será mostrado aqui.</p>
<p>Ao terceiro problema, movi o método</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> MedicoRepositorio <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// ...</span>
	<span style="color: #006600; font-weight: bold;">void</span> salvaConsultaMedico<span style="color: #009900;">&#40;</span>Medico medico<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>para a nova classe ConsultaRepositorio, agora com novo nome:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> ConsultaRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">void</span> marca<span style="color: #009900;">&#40;</span>Consulta consulta<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Resolvi problemas de compilação. O método marcaConsulta de AgendamentoImpl ficou assim (não mostrei, mas foi adicionado mais um bean do EJB):</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> marcaConsulta<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> medicoId, <span style="color: #006600; font-weight: bold;">long</span> pacienteId, <span style="color: #003399; font-weight: bold;">Date</span> horario<span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">throws</span> PacienteNaoEncontradoException, MedicoNaoEncontradoException <span style="color: #009900;">&#123;</span>
&nbsp;
		Paciente paciente = pacienteRepositorio.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span>pacienteId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Medico medico = medicoRepositorio.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span>medicoId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		consultaRepositorio.<span style="color: #006633;">marca</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Consulta<span style="color: #009900;">&#40;</span>paciente, medico, horario, <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Resolvi outros problemas de compilação também; e criei também um &#8220;DAO&#8221;, à semelhança dos outros, que também é um Singleton:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Singleton
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConsultaDAO <span style="color: #000000; font-weight: bold;">implements</span> ConsultaRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Consulta<span style="color: #339933;">&gt;</span> consultas = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">ArrayList</span><span style="color: #339933;">&lt;</span>Consulta<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> marca<span style="color: #009900;">&#40;</span>Consulta consulta<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		consultas.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>consulta<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Descobri também que ninguém chama o método marcaConsulta() de Medico. Vou apagá-lo. Vou rodar o teste e&#8230; opa! Deu erro! No método pacienteMarcaHoraComMedico(), é feita a verificação de consulta através da propriedade &#8220;lista de consultas&#8221; de médico. Porém, por não estar persistido de verdade, essa relação acaba não existindo.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medicoId, pacienteId, horario.<span style="color: #006633;">getTime</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;">// verifica se os métodos definidos no mock foram realmente chamados</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>
&nbsp;
			<span style="color: #666666; font-style: italic;">// agora, médico tem consulta com paciente marcada às 5</span>
			Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>, medicoRetornado.<span style="color: #006633;">getConsultas</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			Consulta consulta = medicoRetornado.<span style="color: #006633;">getConsultas</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">iterator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">next</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;">// &lt;-- ocorre erro aqui</span>
			Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>pacienteRetornado.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, consulta.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNome</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: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>PacienteNaoEncontradoException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			Assert.<span style="color: #006633;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>MedicoNaoEncontradoException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			Assert.<span style="color: #006633;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Vamos mudar um pouco e retornar o registro obtido através do DAO de Consulta. Assim: lá em cima, eu criei uma classe falsa (tá, o nome correto é classe interna anônima) de ConsultaRepositorio:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Consulta<span style="color: #339933;">&gt;</span> consultaRetornada = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">LinkedList</span><span style="color: #339933;">&lt;</span>Consulta<span style="color: #339933;">&gt;</span><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;">// ajustando o repositório de médico</span>
		<span style="color: #000000; font-weight: bold;">final</span> MedicoRepositorio medicoRep = context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>MedicoRepositorio.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">final</span> ConsultaRepositorio consultaRep = <span style="color: #000000; font-weight: bold;">new</span> ConsultaRepositorio<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			@<span style="color: #003399; font-weight: bold;">Override</span>
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> marca<span style="color: #009900;">&#40;</span>Consulta consulta<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				consultaRetornada.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>consulta<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: #339933;">;</span></pre></div></div>

<p>e o código com problemas fica assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medicoId, pacienteId, horario.<span style="color: #006633;">getTime</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;">// verifica se os métodos definidos no mock foram realmente chamados</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>
&nbsp;
			<span style="color: #666666; font-style: italic;">// agora, médico tem consulta com paciente marcada às 5</span>
			Consulta consulta = consultaRetornada.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>pacienteRetornado.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, consulta.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNome</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: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>PacienteNaoEncontradoException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			Assert.<span style="color: #006633;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>MedicoNaoEncontradoException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			Assert.<span style="color: #006633;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sucesso.</p>
<p>Ufa! Vamos continuar com o problema do agendamento. O que acontece quando são marcadas duas consultas ao mesmo tempo? Deveria dar erro, certo? Mas, se rodarmos esse novo teste:</p>
<pre lang="JAVA5>
@Test
	public void duasConsultasAoMesmoTempo() {
		medico.adicioneDisponibilidade(HorarioDisponivel.getInstance(DiaSemana.SEGUNDA, 8, 00, 17, 00));

		// a primeira consulta está ok
		Consulta consulta = new Consulta(paciente, medico, horarioConsulta, 60);
		SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyyHHmmss");

		Assert.assertEquals(paciente, consulta.getPaciente());
		Assert.assertEquals(medico, consulta.getMedico());
		Assert.assertEquals("02032009150000", sdf.format(consulta.getInicio()));
		Assert.assertEquals("02032009160000", sdf.format(consulta.getFim()));

		// a segunda consulta é no mesmo horário
		Paciente paciente2 = new Paciente();
		paciente2.setNome("Maria");
		try {

			new Consulta(paciente2, medico, horarioConsulta, 60);

			Assert.fail("Realizada segunda consulta por engano");
		} catch (ConsultaNaoDisponivel e) {

		}
</pre>
<p>Vai dar erro. Pois o sistema atual não restringe duas consultas.</p>
<p>Para resolver isso, precisamos que, ao marcar uma nova consulta, verifica-se primeiro a existência de um registro no mesmo horário antes de começar. Porém, não acho prudente fazer isso no construtor da entidade, delegarei isso para o repositório.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> ConsultaRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">void</span> marca<span style="color: #009900;">&#40;</span>Consulta consulta<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">boolean</span> existeConsultaPara<span style="color: #009900;">&#40;</span>Medico medico, <span style="color: #003399; font-weight: bold;">Date</span> horario, <span style="color: #006600; font-weight: bold;">int</span> duracaoMinutos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Mas também, não dá pra contar que esse método sempre será chamado ao criar uma consulta. Imaginei uma factory de objetos que retornaria a Consulta e que também chamaria esse método do DAO antes de devolver o objeto. Qualquer um faria esse objeto como Singleton ou algo parecido, farei ele como um Session Bean, mas (pra ficar diferente) farei sem interface, coisa que agora será possível, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.agendamedica.dominio</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Date</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.ejb.EJB</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.ejb.Stateless</span><span style="color: #339933;">;</span>
&nbsp;
@Stateless
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConsultaFactory <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Consulta novaConsulta<span style="color: #009900;">&#40;</span>Paciente paciente, Medico medico, <span style="color: #003399; font-weight: bold;">Date</span> inicio, <span style="color: #006600; font-weight: bold;">int</span> duracaoMinutos<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-weight: bold;">boolean</span> agendado = consultaRepositorio.<span style="color: #006633;">existeConsultaPara</span><span style="color: #009900;">&#40;</span>medico, inicio, duracaoMinutos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>agendado<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> ConsultaNaoDisponivel<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> <span style="color: #000000; font-weight: bold;">new</span> Consulta<span style="color: #009900;">&#40;</span>paciente, medico, inicio, duracaoMinutos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setConsultaRepositorio<span style="color: #009900;">&#40;</span>ConsultaRepositorio consultaRepositorio<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;">consultaRepositorio</span> = consultaRepositorio<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> ConsultaRepositorio consultaRepositorio<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Legal, mas o teste se complica, já que a decisão por existir ou não a consulta cabe à camada de dados, e acabou ficando assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> duasConsultasAoMesmoTempo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		medico.<span style="color: #006633;">adicioneDisponibilidade</span><span style="color: #009900;">&#40;</span>HorarioDisponivel.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span>DiaSemana.<span style="color: #006633;">SEGUNDA</span>, <span style="color: #cc66cc;">8</span>, 00, <span style="color: #cc66cc;">17</span>, 00<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		ConsultaFactory consultaFactory = <span style="color: #000000; font-weight: bold;">new</span> ConsultaFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Mockery context = <span style="color: #000000; font-weight: bold;">new</span> JUnit4Mockery<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;">final</span> ConsultaRepositorio consultaRep =  context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>ConsultaRepositorio.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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>
			one<span style="color: #009900;">&#40;</span>consultaRep<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">existeConsultaPara</span><span style="color: #009900;">&#40;</span>medico, horarioConsulta, <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> will<span style="color: #009900;">&#40;</span>returnValue<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			one<span style="color: #009900;">&#40;</span>consultaRep<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">existeConsultaPara</span><span style="color: #009900;">&#40;</span>medico, horarioConsulta, <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> will<span style="color: #009900;">&#40;</span>returnValue<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		consultaFactory.<span style="color: #006633;">setConsultaRepositorio</span><span style="color: #009900;">&#40;</span>consultaRep<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// a primeira consulta está ok</span>
		Consulta consulta = consultaFactory.<span style="color: #006633;">novaConsulta</span><span style="color: #009900;">&#40;</span>paciente, medico, horarioConsulta, <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399; font-weight: bold;">SimpleDateFormat</span> sdf = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">SimpleDateFormat</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ddMMyyyyHHmmss&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>paciente, consulta.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>medico, consulta.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;02032009150000&quot;</span>, sdf.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span>consulta.<span style="color: #006633;">getInicio</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;02032009160000&quot;</span>, sdf.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span>consulta.<span style="color: #006633;">getFim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</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;">// a segunda consulta é no mesmo horário</span>
		Paciente paciente2 = <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		paciente2.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Maria&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
&nbsp;
			consultaFactory.<span style="color: #006633;">novaConsulta</span><span style="color: #009900;">&#40;</span>paciente2, medico, horarioConsulta, <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			Assert.<span style="color: #006633;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Realizada segunda consulta por engano&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>ConsultaNaoDisponivel e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sempre fico com uma pulga na orelha quando uso mocks para testes. Afinal, estou testando o meu código (como se espera) ou o mock?  Bom, não consigo pensar em algo melhor. Vou deixar assim, que está rodando com sucesso.</p>
<p>Dessa vez, irei usar o JavaServer Faces 2.0 como camada visual, e vou ignorar aqueles Servlets que estavam antes.</p>
<p>Não irei mostrar todas as páginas, mas gostaria de mostrar como é para fazer um managed bean. É assim agora:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@ManagedBean<span style="color: #009900;">&#40;</span>name=<span style="color: #0000ff;">&quot;consulta&quot;</span><span style="color: #009900;">&#41;</span>
@SessionScoped
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConsultaManagedBean <span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nada de XML, você define o seu managed bean através de anotação. E o escopo é definido através de anotações @SessionScoped, @ViewScoped (um novo escopo que dura enquanto existir a página), @RequestScoped e @ApplicationScoped.</p>
<p>Uma outra coisa é que não é necessário declarar o destino da página em faces-config.xml todas as vezes. Por exemplo, se você definir um retorno com uma String, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399; font-weight: bold;">String</span> novo<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;">// preenche combo de médicos</span>
		<span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Medico<span style="color: #339933;">&gt;</span> listaMedico = medicoRepositorio.<span style="color: #006633;">todosMedicos</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		medicosItens = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">LinkedHashMap</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">String</span>, <span style="color: #003399; font-weight: bold;">Long</span><span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000;  font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>Medico m : listaMedico<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			medicosItens.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>m.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, m.<span style="color: #006633;">getId</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: #009900;">&#125;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// preenche combo de pacientes</span>
		<span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Paciente<span style="color: #339933;">&gt;</span> listaPaciente = pacienteRepositorio.<span style="color: #006633;">todosPacientes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		pacientesItens = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">LinkedHashMap</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">String</span>, <span style="color: #003399; font-weight: bold;">Long</span><span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000;  font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>Paciente p : listaPaciente<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			pacientesItens.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>p.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, p.<span style="color: #006633;">getId</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>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;formNovaConsulta&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E não definir essa String na navegações, será exibido a página cujo nome é essa String. Nesse caso acima, será exibido à página &#8220;formNovaConsulta.xhtml&#8221;.</p>
<p>Bom, é isso. Eu sei que demorei demaaais para mostrar essa nova parte. Mas ficou muito complicado, e percebi que fugi muito o tópico. Nas próximas séries sobre Java EE 6, não utilizarei esse exemplo, focando apenas nas novas features. Até.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/03/22/aprenda-java-ee-6-agora-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aprenda Java EE 6, agora! (2)</title>
		<link>http://www.objectzilla.com.br/2009/02/24/aprenda-java-ee-6-agora-2/</link>
		<comments>http://www.objectzilla.com.br/2009/02/24/aprenda-java-ee-6-agora-2/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 20:49:34 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=182</guid>
		<description><![CDATA[Dessa vez, estarei utilizando a versão b37 do Glassfish v3. Por causa disso, você vai ter que fazer alterações à mão no plugin do Eclipse para o servidor Glassfish. Na versão b36 havia as pastas web e ejb dentro de module. Agora, todos os jars estão dentro de module, sem distinção de pastas. Primeiro, feche [...]]]></description>
			<content:encoded><![CDATA[<p>Dessa vez, estarei utilizando a versão b37 do Glassfish v3. Por causa disso, você vai ter que fazer alterações à mão no plugin do Eclipse para o servidor Glassfish. Na versão b36 havia as pastas web e ejb dentro de module. Agora, todos os jars estão dentro de module, sem distinção de pastas.</p>
<p>Primeiro, feche o Eclipse. Iremos copiar o plugin do Glassfish e descompactá-lo, para alterar o seu arquivo de configurações. No Linux eu fiz assim, supondo que ECLIPSE_HOME seja uma variável onde aponta para a pasta do Eclipse:<span id="more-182"></span></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> ~<span style="color: #000000; font-weight: bold;">/</span>plugin <span style="color: #666666; font-style: italic;"># cria pasta plugin dentro de seuhome</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$ECLIPSE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>plugins <span style="color: #666666; font-style: italic;">#entra na pasta plugins dentro de eclipse</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">cp</span> com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar ~<span style="color: #000000; font-weight: bold;">/</span>plugin<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># copia o plugin do Glassfish para sua pasta</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>plugin<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># vá para a sua pasta...</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">unzip</span> com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar <span style="color: #660033;">-d</span> plugin_glassfish <span style="color: #666666; font-style: italic;"># e extrai o conteúdo do jar dentro da subpasta plugin_glassfish</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> plugin_glassfish<span style="color: #000000; font-weight: bold;">/</span>serverdef<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;">#entre na pasta serverdef (do conteúdo recém extraído)</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">vim</span> glassfishv3preludeserverdef.xml <span style="color: #666666; font-style: italic;"># edite este arquivo (não precisa ser, necessariamente, o vim)</span></pre></div></div>

<p>Você vai encontrar isso na linha 184:</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;archive</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;${sunappserver.rootdirectory}/modules/web/jsf-impl.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;archive</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;${sunappserver.rootdirectory}/modules/web/jstl-impl.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>Troque para:</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;archive</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;${sunappserver.rootdirectory}/modules/jsf-impl.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;archive</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;${sunappserver.rootdirectory}/modules/jstl-impl.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>Agora vamos reempacotar o jar e devolvê-lo pro Eclipse:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>plugin <span style="color: #666666; font-style: italic;"># volta onde está a cópia do plugin do Eclipse</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">mv</span> com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar__old <span style="color: #666666; font-style: italic;"># mude o nome</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> plugin_glassfish<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># entre na pasta com conteúdo &quot;dezipado&quot;</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">zip</span> <span style="color: #660033;">-r</span> ..<span style="color: #000000; font-weight: bold;">/</span>com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar .<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># e faça o zip de novo com o mesmo nome do jar</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> .. <span style="color: #666666; font-style: italic;"># volte um nível</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">cp</span> com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar <span style="color: #007800;">$ECLIPSE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># e copie o novo jar para a pasta de plugins do Eclipse</span></pre></div></div>

<p>Ao abrir o Eclipse de novo, na versão b37, o projeto não sentirá mais falta de bibliotecas. Voltando&#8230;</p>
<p>No <a href="http://www.objectzilla.com.br/2009/02/15/aprenda-java-ee-6-agora/">post anterior</a>, fizemos uma aplicação já utilizando os recursos do EJB Lite. Porém, faltava alguma coisa para persistir os objetos.</p>
<p>No teste, instanciava-se ali mesmo os objetos necessários e jogava-os no método marcaConsulta(). Porém, num caso real, os objetos precisariam existir muito antes, armazenados num meio persistente (na maioria das vezes, em um banco de dados relacional). A prática corrente é encapsular essa obtenção de objetos do meio persistente através do DAO (Data Access Object, ou objeto de acesso aos dados). Nessa aplicação, seguiremos a prática de separar a interface da implementação, e chamarei a interface de <strong>.*Repository</strong> e a classe que a implementa de <strong>.*DAO</strong>. Usarei EJB Lite também para a implementação de persistência.</p>
<p>Aquele primeiro teste será modificado para buscar os objetos do repositório. Estaremos utilizando o JMock para simular o DAO, pois, além de não termos uma fonte de dados real (por enquanto), testes que dependem de recursos externos perdem a confiabilidade. Melhor fazer um stub e ter certeza que traz o resultado esperado</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.agendamedica</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Calendar</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jmock.Expectations</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jmock.Mockery</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jmock.integration.junit4.JUnit4Mockery</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Assert</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoTeste <span style="color: #009900;">&#123;</span>
&nbsp;
	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> pacienteMarcaHoraComMedico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		Mockery context = <span style="color: #000000; font-weight: bold;">new</span> JUnit4Mockery<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;">// ajustando o repositório de paciente</span>
		<span style="color: #000000; font-weight: bold;">final</span> PacienteRepositorio pacienteRep =  context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>PacienteRepositorio.<span style="color: #000000; font-weight: bold;">class</span><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><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>
			Paciente paciente = <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			paciente.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Maria&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			oneOf <span style="color: #009900;">&#40;</span>pacienteRep<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span>32L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> will<span style="color: #009900;">&#40;</span>returnValue<span style="color: #009900;">&#40;</span>paciente<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><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ajustando o repositório de médico</span>
		<span style="color: #000000; font-weight: bold;">final</span> MedicoRepositorio medicoRep = context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>MedicoRepositorio.<span style="color: #000000; font-weight: bold;">class</span><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><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>
			Medico medico = <span style="color: #000000; font-weight: bold;">new</span> Medico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			medico.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dr. Gregory House&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			oneOf <span style="color: #009900;">&#40;</span>medicoRep<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span>4L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> will<span style="color: #009900;">&#40;</span>returnValue<span style="color: #009900;">&#40;</span>medico<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><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// um paciente...</span>
		Paciente paciente = pacienteRep.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span>32L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// um médico...</span>
		Medico medico = medicoRep.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span>4L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ambos agendam um horário</span>
		Agendamento agendamento = <span style="color: #000000; font-weight: bold;">new</span> AgendamentoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399; font-weight: bold;">Calendar</span> horario = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2009</span>, <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MARCH</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">17</span>, 00, 00<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medico, paciente, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// agora, médico tem consulta com paciente marcada às 5</span>
		Paciente pacienteMarcado = medico.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>paciente.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, pacienteMarcado.<span style="color: #006633;">getNome</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></pre></div></div>

<p>Tanto MedicoRepositorio quanto PacienteRepositorio são interfaces (mais tarde, criarei as implementações). Ao criá-las, o teste já é executado com sucesso.</p>
<p>Agora chegou a hora de refatorar. Repare que o teste, do jeito que está, é imbecil. Os mocks apenas complicaram a obtenção de objetos e, se deixasse como antes, seria a mesma coisa! Mas eu fiz essa alteração para um próximo passo: os repositórios não serão mais chamados pelo meu teste, mas pelo método marcaConsulta(), que receberia apenas os ids de médico e paciente. E como consequência, os mocks servirão para indicar que os métodos dos repositórios realmente são chamados. Veja como fica:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">		<span style="color: #666666; font-style: italic;">// ajustando o repositório de paciente (omitido, pois é como era antes)</span>
		<span style="color: #666666; font-style: italic;">// ajustando o repositório de médico (omitido, pois é como era antes)</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// id de paciente e médico</span>
		<span style="color: #006600; font-weight: bold;">long</span> pacienteId = 32L<span style="color: #339933;">;</span>
		<span style="color: #006600; font-weight: bold;">long</span> medicoId = 4L<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// cria um agendamento, passando os repositórios como parâmetro</span>
		Agendamento agendamento<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#123;</span>
			AgendamentoImpl impl = <span style="color: #000000; font-weight: bold;">new</span> AgendamentoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			impl.<span style="color: #006633;">setPacienteRepositorio</span><span style="color: #009900;">&#40;</span>pacienteRep<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			impl.<span style="color: #006633;">setMedicoRepositorio</span><span style="color: #009900;">&#40;</span>medicoRep<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			agendamento = impl<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// cria um horário para a consulta</span>
		<span style="color: #003399; font-weight: bold;">Calendar</span> horario = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2009</span>, <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MARCH</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">17</span>, 00, 00<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medicoId, pacienteId, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// verifica se os métodos definidos no mock foram realmente chamados</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>
&nbsp;
		<span style="color: #666666; font-style: italic;">// agora, médico tem consulta com paciente marcada às 5</span>
		Paciente pacienteMarcado = medicoRetornado.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>pacienteRetornado.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, pacienteMarcado.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Tente executar até que fique com sucesso. Se quiser, dentro do método marcaConsulta(), ao invés de pegar os objetos dentro dos repositórios, crie novos objetos Medico e Paciente. Vai dar erro, porque foi adicionado no teste a instrução <em>context.assertIsSatisfied()</em>, que garante que os métodos definidos no mock sejam realmente chamados por apenas uma vez (e dê erro caso contrário).</p>
<p>Existe ainda mais uma oportunidade de teste: o que acontece quando eu uso um identificador para um objeto que não existe? Deveria lançar exceção, mas, atualmente, a assinatura do método dos repositórios não possui qualquer sinalização disso. Farei também um teste para o caso de não achar objetos. Mas nesse caso, não mostrarei aqui, estando apenas no <a href="http://github.com/leonardoverissimo/javaee-6-application/tree/master">meu GitHub</a>.</p>
<p>Chegou a hora da verdade, como fazer os façades existentes se tornarem Session Beans? Simples, com anotações! Primeiro, as interfaces de repositório:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> MedicoRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	Medico getMedico<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> id<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> MedicoNaoEncontradoException<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> PacienteRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	Paciente getPaciente<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> id<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> PacienteNaoEncontradoException<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A implementação do Session Bean Agendamento possui agora as dependências com os repositórios:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Stateless
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoImpl <span style="color: #000000; font-weight: bold;">implements</span> Agendamento <span style="color: #009900;">&#123;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> marcaConsulta<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> medicoId, <span style="color: #006600; font-weight: bold;">long</span> pacienteId, <span style="color: #003399; font-weight: bold;">Calendar</span> horario<span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">throws</span> PacienteNaoEncontradoException, MedicoNaoEncontradoException <span style="color: #009900;">&#123;</span>
		Paciente paciente = pacienteRepositorio.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span>pacienteId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Medico medico = medicoRepositorio.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span>medicoId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		medico.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>paciente, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		medicoRepositorio.<span style="color: #006633;">salvaConsultaMedico</span><span style="color: #009900;">&#40;</span>medico<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setPacienteRepositorio<span style="color: #009900;">&#40;</span>PacienteRepositorio pacienteRep<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		pacienteRepositorio = pacienteRep<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setMedicoRepositorio<span style="color: #009900;">&#40;</span>MedicoRepositorio medicoRep<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		medicoRepositorio = medicoRep<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> PacienteRepositorio pacienteRepositorio<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> MedicoRepositorio medicoRepositorio<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Na implementação dos repositórios, ainda não colocarei a persistência com o banco de dados. Ao invés disso, deixarei os objetos em memória. Numa situação como essa, esse lugar da memória deveria ser o único em toda a aplicação, ou seja, <em>singleton</em>. Até agora, <em>singletons</em> deveriam ser feitos à mão; na próxima versão, será possível usar EJB, bastando uma anotação, veja:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Singleton
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MedicoDAO <span style="color: #000000; font-weight: bold;">implements</span> MedicoRepositorio <span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Isso é ainda uma demonstração, quando eu usar um banco de dados de verdade, voltarei a usar <strong>@Stateless</strong>. De fato, não é porque existe <strong>@Singleton</strong> que você sempre deve usá-lo porque, com essa anotação, as chamadas aos métodos serão serializadas (não ocorre execução em paralelo), reduzindo sensivelmente a escalabilidade. Portanto, use como último recurso. O código completo do DAO, você vê no <a href="http://github.com/leonardoverissimo/javaee-6-application/tree/master">meu GitHub</a>.</p>
<p>Acabou? Nããããããooo! Vamos imaginar como seria uma tela de agendamento:<br />
- Mostra-se uma lista de médicos, uma lista de pacientes e pede-se um horário de consulta.<br />
- O usuário marca a consulta.<br />
- Mostra-se a consulta marcada.</p>
<p>Três coisas que falta nos DAOs, uma busca por lista de médicos, outra para lista de pacientes, e um método que salva a consulta. Farei os três métodos:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> PacienteRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	Paciente getPaciente<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> id<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> PacienteNaoEncontradoException<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Paciente<span style="color: #339933;">&gt;</span> todosPacientes<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> MedicoRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	Medico getMedico<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> id<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> MedicoNaoEncontradoException<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Medico<span style="color: #339933;">&gt;</span> todosMedicos<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">void</span> salvaConsultaMedico<span style="color: #009900;">&#40;</span>Medico medico<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>No teste, adicionarei também a exigência do método de <em>marcarConsulta()</em> salvar a consulta do médico. Mas, pra variar, não vou mostrar. (Se você estiver atento, faltou o conceito de Consulta, que está escondido como um atributo do médico. Numa próxima oportunidade, antes de adicionar qualquer outra funcionalidade, criarei esse tipo.)</p>
<p>Vamos às páginas web! Usarei Servlets e JSPs. A primeira página pega todos os pacientes e todos os médicos e exibe uma tela para digitar o horário da consulta. Seguindo o MVC, temos o Servlet agindo como Controller:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@WebServlet<span style="color: #009900;">&#40;</span>value=<span style="color: #0000ff;">&quot;/agendaForm&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> AgendaFormServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #006600; font-weight: bold;">long</span> serialVersionUID = -7874706688461756994L<span style="color: #339933;">;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399; font-weight: bold;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// obtém médicos</span>
		<span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Medico<span style="color: #339933;">&gt;</span> medicos = medicoRepositorio.<span style="color: #006633;">todosMedicos</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		req.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;medicos&quot;</span>, medicos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// obtém pacientes</span>
		<span style="color: #003399; font-weight: bold;">List</span><span style="color: #339933;">&lt;</span>Paciente<span style="color: #339933;">&gt;</span> pacientes = pacienteRepositorio.<span style="color: #006633;">todosPacientes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		req.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pacientes&quot;</span>, pacientes<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// passa para uma página jsp</span>
		req.<span style="color: #006633;">getRequestDispatcher</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/WEB-INF/agendaForm.jsp&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">forward</span><span style="color: #009900;">&#40;</span>req, resp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> MedicoRepositorio medicoRepositorio<span style="color: #339933;">;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> PacienteRepositorio pacienteRepositorio<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Não se deveria haver duas chamadas ao model dentro de um controller. Mas nesse caso, não consigo imaginar uma situação melhor. Acho muito burocrático fazer um método que retorna um DTO contendo as listas de Medico e Paciente; além do nome do método resultante não ter uma boa abstração (ou você acha que <strong>listaMedicoEPaciente()</strong> é um nome bom?). E não consigo achar um jeito de usar apenas um objeto raiz, onde os outros seriam obtidos através deste; a relação entre Medico e Paciente ainda vai ser criada, ela não existe no momento de carregar o formulário. Portanto, deixarei assim mesmo.</p>
<p>A view não possui nada de novo em relação às versões anteriores:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">	<span style="color: #009900;">&lt;jsp:useBean <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;medicos&quot;</span> <span style="color: #000066;">scope</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;request&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;java.util.List&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
	<span style="color: #009900;">&lt;jsp:useBean <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;pacientes&quot;</span> <span style="color: #000066;">scope</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;request&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;java.util.List&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;POST&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;marcaConsulta&quot;</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Selecione o m<span style="color: #ddbb00;">&amp;eacute;</span>dico:
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">select</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;medicoId&quot;</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0&quot;</span>&gt;</span>M<span style="color: #ddbb00;">&amp;eacute;</span>dicos<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
			<span style="color: #009900;">&lt;c:forEach items<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${medicos}&quot;</span> var<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;medico&quot;</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${medico.id}&quot;</span>&gt;</span>${medico.nome}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>c:forEach&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">select</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Selecione o paciente:
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">select</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;pacienteId&quot;</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0&quot;</span>&gt;</span>Pacientes<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
			<span style="color: #009900;">&lt;c:forEach items<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${pacientes}&quot;</span> var<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;paciente&quot;</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${paciente.id}&quot;</span>&gt;</span>${paciente.nome}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>c:forEach&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">select</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
		Dia: <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dia&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;10&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span><span style="color: #66cc66;">/</span>&gt;</span>
		Hora: <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hora&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;10&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span><span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Marcar Consulta&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<p>O conteúdo será enviado à ação marcaConsulta, que será feita através da alteração do antigo Servlet AgendamentoServlet:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.agendamedica</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.PrintWriter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.text.DateFormat</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Calendar</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Date</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.ejb.EJB</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.ServletException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.annotation.WebServlet</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServlet</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServletRequest</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServletResponse</span><span style="color: #339933;">;</span>
&nbsp;
@WebServlet<span style="color: #009900;">&#40;</span>value <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/marcaConsulta&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> AgendamentoServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>1218896541620785877L<span style="color: #339933;">;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> Agendamento agendamento<span style="color: #339933;">;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doPost<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">long</span> medicoId <span style="color: #339933;">=</span> <span style="color: #003399;">Long</span>.<span style="color: #006633;">parseLong</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;medicoId&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">long</span> pacienteId <span style="color: #339933;">=</span> <span style="color: #003399;">Long</span>.<span style="color: #006633;">parseLong</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pacienteId&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">DateFormat</span> dateFormat <span style="color: #339933;">=</span> <span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">getDateTimeInstance</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">SHORT</span>,
					<span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">SHORT</span>, req.<span style="color: #006633;">getLocale</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;">String</span> horario <span style="color: #339933;">=</span> req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;dia&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; &quot;</span> <span style="color: #339933;">+</span> req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hora&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">Date</span> date <span style="color: #339933;">=</span> dateFormat.<span style="color: #006633;">parse</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">Calendar</span> cal <span style="color: #339933;">=</span> <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getLocale</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			cal.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>date<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// chamando método de agendamento</span>
			agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medicoId, pacienteId, cal<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			resp.<span style="color: #006633;">sendRedirect</span><span style="color: #009900;">&#40;</span>resp.<span style="color: #006633;">encodeRedirectURL</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;consulta?medicoId=&quot;</span> <span style="color: #339933;">+</span> medicoId
					<span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;&amp;horario=&quot;</span> <span style="color: #339933;">+</span> horario<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<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;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">PrintWriter</span> out <span style="color: #339933;">=</span> resp.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			out.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Você fez alguma coisa de errado!&quot;</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;">&#125;</span></pre></div></div>

<p>Dessa vez, apaguei o <strong>doGet()</strong> e coloquei a ação de salvar a consulta em um <strong>doPost()</strong>. Realizei um redirect em um outro Servlet que faz a consulta de horários.</p>
<p>Servlet:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.agendamedica</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.PrintWriter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.text.DateFormat</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Calendar</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Date</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.ejb.EJB</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.ServletException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.annotation.WebServlet</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServlet</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServletRequest</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServletResponse</span><span style="color: #339933;">;</span>
&nbsp;
@WebServlet<span style="color: #009900;">&#40;</span>value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;/consulta&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> ConsultaServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 8084899967543431263L<span style="color: #339933;">;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">long</span> medicoId <span style="color: #339933;">=</span> <span style="color: #003399;">Long</span>.<span style="color: #006633;">parseLong</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;medicoId&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			Medico medico <span style="color: #339933;">=</span> medicoRep.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span>medicoId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">DateFormat</span> df <span style="color: #339933;">=</span> <span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">getDateTimeInstance</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">SHORT</span>, <span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">SHORT</span>, req.<span style="color: #006633;">getLocale</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;">Date</span> d <span style="color: #339933;">=</span> df.<span style="color: #006633;">parse</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;horario&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">Calendar</span> horario <span style="color: #339933;">=</span> <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getLocale</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			horario.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>d<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			req.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;horario&quot;</span>, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			Paciente paciente <span style="color: #339933;">=</span> medico.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>paciente <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				paciente <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				paciente.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;(ninguém)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			req.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;paciente&quot;</span>, paciente<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			req.<span style="color: #006633;">getRequestDispatcher</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/WEB-INF/consulta.jsp&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">forward</span><span style="color: #009900;">&#40;</span>req, resp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<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;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">PrintWriter</span> out <span style="color: #339933;">=</span> resp.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			out.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Você fez alguma coisa de errado!&lt;br/&gt;&lt;br/&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span>out<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> MedicoRepositorio medicoRep<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E JSP:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">	<span style="color: #009900;">&lt;jsp:useBean <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;paciente&quot;</span> <span style="color: #000066;">scope</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;request&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;br.com.objectzilla.agendamedica.Paciente&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
	<span style="color: #009900;">&lt;jsp:useBean <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;horario&quot;</span> <span style="color: #000066;">scope</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;request&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;java.util.Calendar&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Data: <span style="color: #009900;">&lt;fmt:formatDate <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${horario.time}&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;both&quot;</span> dateStyle<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;long&quot;</span> timeStyle<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;medium&quot;</span><span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
&nbsp;
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Paciente: ${paciente.nome}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
&nbsp;
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;agendaForm&quot;</span>&gt;</span>De novo<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div>

<p>Você pode agora digitar http://localhost:8080/AgendaMedica/agendaForm no seu browser e inserir uma consulta qualquer. Ao fazer a submissão, uma nova página será exibida, cuja URL tem parâmetros de <em>medicoId</em> e <em>horario</em>. Mude esses parâmetros e você verá que, em horários que você não marcou horário, aparece <em>(ninguém)</em> como paciente.</p>
<p>Faltam coisas ainda. A agenda permite horários esdrúxulos, como agendamento no passado, agendamento fora do horário comercial, agendamento de dois pacientes com um minuto de intervalo, e sobreposição de horário. Precisamos resolver todas essas validações. E outra, precisamos criar a classe Consulta, pois não faz sentido temos que mudar Médico quando um paciente quer marcar um dia. E seria bem melhor também, fazer as páginas web com algum framework. JSF 2.0 seria uma ótima pedida.</p>
<p>Mas tudo isso num próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/02/24/aprenda-java-ee-6-agora-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aprenda Java EE 6, agora!</title>
		<link>http://www.objectzilla.com.br/2009/02/15/aprenda-java-ee-6-agora/</link>
		<comments>http://www.objectzilla.com.br/2009/02/15/aprenda-java-ee-6-agora/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 21:44:53 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=154</guid>
		<description><![CDATA[Quando fiquei craque no Java, a versão do &#8220;Enterprise Edition&#8221; era ainda 1.4. Eu aprendi a versão 5, logo depois do lançamento do Glassfish. Mas agora estou fazendo algo diferente, não vou esperar a versão Java EE 6 sair, vou aprender as coisas tão logo as novidades apareçam. E você também pode fazer isso. Pegue [...]]]></description>
			<content:encoded><![CDATA[<p>Quando fiquei craque no Java, a versão do &#8220;Enterprise Edition&#8221; era ainda 1.4. Eu aprendi a versão 5, logo depois do lançamento do Glassfish. Mas agora estou fazendo algo diferente, não vou esperar a versão Java EE 6 sair, vou aprender as coisas tão logo as novidades apareçam.</p>
<p>E você também pode fazer isso. Pegue <a href="http://download.java.net/glassfish/v3/promoted/">uma versão promoted do Glassfish no site deles</a>, que, assim como o <a href="http://abc.go.com/primetime/lost/index?pn=index">Lost</a>, tem sempre uma versão nova nas quartas à noite, que você baixa na quinta. A última versão, que estou usando nesta semana, é a b36.</p>
<p>Baixe a última versão disponível e descompacte num lugar que você achar apropriado. No Eclipse, na hora de instalar o servidor, basta escolher a opção &#8220;Glassfish v3 Prelude&#8221; (se você não usava Glassfish, na tela de novo servidor há uma opção de baixar os adaptadores para outros servidores). Pronto!</p>
<p>Eu vou fazer uma aplicação de exemplo, que é uma agenda de consultório médico. É babaca, mas tem uma regras óbvias que não dá pra ser tratado com o velho CRUD.</p>
<p>Vamos lá. Crie um &#8220;Dynamic Web Project&#8221; cujo Runtime seja o &#8220;Glassfish v3 Prelude&#8221;, vou chamá-lo de <strong>AgendaMedica</strong>. Não sei como vocês lidam com testes no Eclipse, mas costumo criar um novo projeto Java que referencia o projeto que estou interessado em testar. No caso, criarei também o projeto Java <strong>AgendaMedicaTeste</strong>. Após criado, dê &lt;Alt&gt; + &lt;Enter&gt; sobre o projeto, clique em &#8220;Java Build Path&#8221;, vá na aba &#8220;Projects&#8221; e adicione o projeto AgendaMedica.</p>
<p>No projeto AgendaMedicaTeste, eu já criei um método de testes pra realizar a consulta:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.agendamedica</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Calendar</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Assert</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoTeste <span style="color: #009900;">&#123;</span>
&nbsp;
	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> pacienteMarcaHoraComMedico<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;">// um paciente...</span>
		Paciente paciente = <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		paciente.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Maria&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// um médico...</span>
		Medico medico = <span style="color: #000000; font-weight: bold;">new</span> Medico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		medico.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dr. Gregory House&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ambos agendam um horário</span>
		Agendamento agendamento = <span style="color: #000000; font-weight: bold;">new</span> AgendamentoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399; font-weight: bold;">Calendar</span> horario = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2009</span>, <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MARCH</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">17</span>, 00, 00<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medico, paciente, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// agora, médico tem consulta com paciente marcada às 5</span>
		Paciente pacienteMarcado = medico.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>paciente.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, pacienteMarcado.<span style="color: #006633;">getNome</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></pre></div></div>

<p>Beleza, mas o código não compila, né? Ora, não seja por isso. Vá criando as classes clicando nos erros com o botão direito do mouse, só não se esqueça de colocar as classes no projeto AgendaMedica. No caso, Agendamento é uma interface e o restante são classes.</p>
<p>Bom, tente rodar o script de teste (clique com botão direito sobre a classe e dê Run As&#8230; > JUnit Test). Vai dar erro, óbvio! Por isso, convido a você a escrever código nas classes até o script rodar com sucesso. Não se preocupe, se você não conseguir ou não tiver paciência, no final do post eu mostro o link onde você pode baixar o código.</p>
<p>Agora, vamos transformar a interface Agendamento em um Stateless Session Bean. Não precisa nem mover pra um projeto próprio, pois agora os EJBs podem ser &#8220;deployados&#8221; em aplicações WAR. Basta adicionar @Local na interface (a v3 ainda não possui suporte a @Remote), assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Agendamento <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E adicionar @Stateless na classe que implementa:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Stateless
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoImpl <span style="color: #000000; font-weight: bold;">implements</span> Agendamento <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pronto, faça o deploy do projeto web no servidor Glassfish v3 e veja o seguinte log aparecer:</p>
<pre>
INFO: Bound Java:Global name [business view] : java:global/AgendaMedica/AgendamentoImpl#br.com.objectzilla.agendamedica.Agendamento
INFO: Bound Java:Global name [single business view] : java:global/AgendaMedica/AgendamentoImpl
</pre>
<p>Repare em como é realizado o <em>binding</em> com o JNDI. A partir da versão 6, não será mais uma implementação específica de contêiner. Todos os servidores de aplicações, se quiserem ser homologados para Java EE 6, deverão dispor seus EJBs, em contextos JNDI, de acordo com o seguinte padrão:</p>
<p><strong>java:global[/&lt;application-name&gt;]/&lt;module-name&gt;/&lt;bean-name&gt;#&lt;interface-name&gt;</strong></p>
<p>Onde:</p>
<p><strong>&lt;application-name&gt;</strong> é opcional, refere-se ao nome do pacote EAR (não tem no nosso caso).</p>
<p><strong>&lt;module-name&gt;</strong> é o módulo onde está o EJB (<em>AgendaMedica</em>).</p>
<p><strong>&lt;bean-name&gt;</strong> é o nome do bean (<em>AgendamentoImpl</em>).</p>
<p><strong>&lt;bean-name&gt;</strong> é o nome do bean (<em>AgendamentoImpl</em>).</p>
<p><strong>&lt;interface-name&gt;</strong> é o nome completo da interface que implementa o bean (<em>br.com.objectzilla.agendamedica.Agendamento</em>).</p>
<p>O leitor atento deve ter reparado: está sendo feito <strong>dois <em>bindings</em></strong> para o EJB! Isso também faz parte do padrão. Se o bean implementar apenas uma interface, um <em>alias</em> será criado onde o nome da interface não aparece.</p>
<p>Já que criamos o Session Bean, seria interessante se usássemos, não é não? Vamos fazer um Servlet, mas não precisa tomar o susto de configurar o wer.xml, pois basta criar um classe que herde de HttpServlet e adicionar uma anotação de acordo com o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@WebServlet<span style="color: #009900;">&#40;</span>value=<span style="color: #0000ff;">&quot;/agendamento&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> AgendamentoServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399; font-weight: bold;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Após o deploy, basta digitar http://localhost:8080/AgendaMedica/agendamento e você vai ver&#8230; uma tela em branco. Normal, a gente não fez nada mesmo. Agora, vamos preencher o doGet() com uma chamada ao método de marcarConsulta() de agendamento. Eu também injetei uma instância de EJB.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@WebServlet<span style="color: #009900;">&#40;</span>value=<span style="color: #0000ff;">&quot;/agendamento&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> AgendamentoServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> Agendamento agendamento<span style="color: #339933;">;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399; font-weight: bold;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #003399; font-weight: bold;">String</span> nomeMedico = req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;medico&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399; font-weight: bold;">String</span> nomePaciente = req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;paciente&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #006600; font-weight: bold;">int</span> hora = <span style="color: #003399; font-weight: bold;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hora&quot;</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;">// criando médico</span>
		Medico medico = <span style="color: #000000; font-weight: bold;">new</span> Medico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		medico.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span>nomeMedico<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// criando paciente</span>
		Paciente paciente = <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		paciente.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span>nomePaciente<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// criando horário</span>
		<span style="color: #003399; font-weight: bold;">Calendar</span> horario = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">HOUR</span>, hora<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MINUTE</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">SECOND</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// chamando método de agendamento</span>
		agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medico, paciente, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399; font-weight: bold;">PrintWriter</span> pw = resp.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		pw.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Eu juro que marquei consulta para o paciente %s, com o médico %s, na hora %d.&quot;</span>,
				medico.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, paciente.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, horario.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">HOUR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Se você rodar http://localhost:8080/AgendaMedica/agendamento?medico=Jose&#038;paciente=Adolfo&#038;hora=14, vai ver que a aplicação mostra uma mensagem na tela que não diz se foi, ou não foi, feito algo. Precisaria de uma tela de consulta, mas só dá pra fazer isso se nossa aplicação persistisse os objetos entre as requisições, o que atualmente não ocorre.</p>
<p>Vou fazer isso no próximo post, onde apresentarei mais novos recursos e novas funcionalidades na aplicação pra que ela finalmente funcione de verdade.</p>
<p>Quem quiser, pode ir alterando a aplicação por conta própria, deixei no repositório <a href="https://github.com/">GitHub</a> em <a href="http://github.com/leonardoverissimo/javaee-6-application/tree/master">http://github.com/leonardoverissimo/javaee-6-application/tree/master</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/02/15/aprenda-java-ee-6-agora/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

