<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>middleheaven &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/middleheaven/</link>
	<description>Feed of posts on WordPress.com tagged "middleheaven"</description>
	<pubDate>Sat, 21 Nov 2009 21:59:02 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Seguindo em frente]]></title>
<link>http://middleheaven.wordpress.com/2009/10/23/seguindo-em-frente/</link>
<pubDate>Fri, 23 Oct 2009 11:50:33 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://middleheaven.wordpress.com/2009/10/23/seguindo-em-frente/</guid>
<description><![CDATA[Como já devem saber o MiddleHeaven está sendo utilizado para suportar o site www.javabuilding.com o ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Como já devem saber o MiddleHeaven está sendo utilizado para suportar o site www.javabuilding.com o que significa que funciona <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O mecanismo de processamento de requisições HTTP é abstraido das classes de servlets e utilizado por um mecanismo baseado em ação.  Devido à injeção de dependência e injeção de parâmetros apenas precisamos escrever uma classe que atua como controlador/presenter e configurar quais url ela irá responder.  Todas as configurações são feitas em código. A razão para isto é que são configurações dos mecanismos que não mudarão no deploy, por isso não ha necessidade de as deixar em arquivos separados. Uma possivel futura é utilizar scripts groovy e javascript para as configurações mantendo o melhor dos dois mundos.</p>
<p>O foco do MiddleHeaven para GUI é prover um mecanismo comum para web e desktop orientado a componentes, mas enquanto isso não fica pronto com a toolbox de processamento e o processador baseado em ações já dá para fazer alguma coisa.</p>
<p>Junto com isso temos algumas tags próprias para ajudar a criar as páginas, em particular o forEach que aceita qualquer Iterable e não apenas List.</p>
<p>Entretanto o storage toolbox continua sendo remodelado. O problema é a utilização transparente em ambiente multi-thread e a possibilidade de utilizar o hibernate por detrás dos panos. A realidade é que esse não era o objetivo inicial, mas o mecanismo genérico está atrazado. Além disso é um exercicio para o design do toolbox já que será, provavelmente, o mais usado de todos é necessário que esteja bem solto para evoluir.</p>
<p>Por fim , queria deixar um pedido de comentário sobre as toolbox existentes e quais features seriam interessantes, como por exemplo, se deveria mesmo haver suporte ao hibernate.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[No céu do meio]]></title>
<link>http://middleheaven.wordpress.com/2009/08/03/no-ceu-do-meio/</link>
<pubDate>Mon, 03 Aug 2009 11:29:02 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://middleheaven.wordpress.com/2009/08/03/no-ceu-do-meio/</guid>
<description><![CDATA[O projeto Middleheaven continua  a passo curtos. Muita gente tem demonstrado o seu apoio. Obrigado. ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;">O projeto Middleheaven continua  a passo curtos. Muita gente tem demonstrado o seu apoio. Obrigado.</p>
<p style="text-align:justify;">A identidade do projeto talvez esteja um pouco nebulosa porque até agora o que ha para mostrar é apenas o código e um conjunto esparso de texto falando de umas coisas chamadas <em>toolboxes</em>. Toolboxes são como pedaços da API, como no JSE temos o JCF ,  I/O e Threads que na realidade se encaixam mas as vemos como partes separadas.</p>
<p style="text-align:justify;">O projeto começou por ser apenas um repositorio de código que eu utilizava repetidamente. Coisas como copia de arquivo e utiltários vários. Depois passou a ser um framework. Um conjunto de coisas prontas, mas complexas. À medida que construia outros frameworks mais simples eu pensava em poder levá-los até ao limite e incorporá-los no framework. Hoje, o MiddleHeaven não é mais um framework e sim uma plataforma de desenvolvimento. Uma arquitetura e design padronizada com partes extensiveis e plugáveis e um conjunto de plugins e extensões já preparadas.</p>
<p style="text-align:justify;">O MiddleHeaven pode-se comparar ao Spring no espirito de facilitar a programação e conexão de partes da aplicação.  Tal como o Spring o MiddleHeaven conta com um motor de injeção automática, mas à diferença do Spring ele não tem definição baseada em XML. Na ralidade não tem porque não foi implementado. O MiddleHeaven delega essa parte a um objeto especifico que pode ser implementado de muitas formas. Por agora, anotações são a base &#8211; pode escolher entre as do próprio MiddleHeaven ou as padrão como @Resource.</p>
<p style="text-align:justify;">Ao contrário do Spring que utiliza directamente outros frameworks e não oferece nenhum encaspulamento &#8211; no sentido que você ainda tem que saber usar esse outro framework &#8211; o MiddleHeaven oferece as suas próprias estruturas e design que pode ser extentido com implementações diversas baseadas em diferentes frameworks de terceiros.  Enquanto que no Spring estes frameworks são <em>le reason de être</em> do motor de injeção, no MiddleHeaven eles são apenas detalhes de implementação que podem mudar ou ser substituidos.</p>
<p style="text-align:justify;">Um outro framework com que poderiamos traçar um comparativo é o JCompany. O JCompany é um framework proprietário com uma versão livre que vai um passo além do Spring oferecendo um certo encapsulamento em torno de APIs de terceiros visando o máximo possivel aderir a padrões de mercado. O JCompany oferece muito já pronto e está mais para aplicação costumizável do que para framework propriamente dito. Contudo o conceito por detrás é muito semelhante ao do MiddleHeaven. A grande diferença é que &#8211; além da licença &#8211; o MiddleHeaven não corre atrás dos padrões de mercado. Esse é um objetivo explicito. Os padrões serão incorporados quando necessário e normalmente por debaixo dos panos já que todo o conceito do MiddleHeaven é exatamente abstrair toda essa parafernália de padrões e tecnologias que mudam constantemente.</p>
<p style="text-align:justify;">O MiddleHeaven é fortemente baseado, não apenas em padrões , mas também em conceitos. As abstrações do MiddleHeaven tendem a ser ir o mais longe possivel para que possam ser reutilizadas o máximo possivel.  Em alguns pontos isso pode significar menor performance ou uma complexidade extra que o programador considera desnecessária, contudo, é sempre possivel não utilizar o modelo do Middleheaven ou usá-lo parcialmente. O desafio é que o programador goste de usar o modelo do MiddleHeaven porque ele é natural.</p>
<p style="text-align:justify;">Embora eu tenha começado dizendo que o MiddleHeaven está caminhando a passos curtos isso é porque estou me referindo a todas as capacidades que foram sonhadas para ele. Contudo ele já faz muita coisa. Já é possivel desenvolver uma aplicação web no estilo do Spring MVC , o ponto que falta para fechar o ciclo e poder libertar uma versão beta ( ou talvez 0.2-alfa) é a persistencia; que está sofrendo uma remodelação.  Depois vem a parte de interação com o usuário que permitirá aplanar a diferença entre o mundo web e o desktop. Esta é a funcionalidade realmente nova do MiddleHeave,n mas  para chegar lá o básico tem que estar no lugar e ser sólido.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Novo Conteudo]]></title>
<link>http://middleheaven.wordpress.com/2009/05/30/novo-conteudo/</link>
<pubDate>Sat, 30 May 2009 14:18:07 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://middleheaven.wordpress.com/2009/05/30/novo-conteudo/</guid>
<description><![CDATA[O MiddleHeaven caminha a passos largos para um release que possa ser utilizado para fazer aplicações]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>O MiddleHeaven caminha a passos largos para um release que possa ser utilizado para fazer aplicações web basedas em JSP.</p>
<p>Foi adicionada a antevisão da toolbox de bootstrap para que se entenda como o MiddleHeaven carrega e se mantem a sua aplicação isolada. Foi adicionada também a antevisão da toolbox de critérios. Quanto a mim uma das preciosidades do MiddleHeaven que o diferencia de todos os outros frameworks e API por ai. Um cutucada ao Hibernate está inclusa (<em>pun intended</em>).</p>
<p>A mudança de layout é devida à falha do anterior em mostrar o menu ao lado quando na área de páginas.</p>
<p>Enquanto o MiddleHeaven não tem uma nova release, vá absorvendo todos os novos (novos?) conceitos que ele trás.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Utilitários: Coleções aumentadas]]></title>
<link>http://middleheaven.wordpress.com/2009/05/12/utilitarios-colecoes-aumentadas/</link>
<pubDate>Tue, 12 May 2009 22:11:44 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://middleheaven.wordpress.com/2009/05/12/utilitarios-colecoes-aumentadas/</guid>
<description><![CDATA[A plataforma java oferece uma vasto suporte ao conceito de conjuntos (coleções e mapas), mas não tão]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p align="justify">A plataforma java oferece uma vasto suporte ao  	<a href="http://sergiotaborda.wordpress.com/java/colecoes-em-java/" target="_new"> conceito de conjuntos</a> (coleções e mapas), mas não tão vasto quanto  	poderia ser.</p>
<p align="justify">A limitação à API de coleções atual é o uso da classe Colections para  	coisas avanaçadas como ordenação e a falta de suporte a Closures pelo  	Java. Mesmo se o Java tivesse suporte, depois das discussões para o Java 7 &#8211; 	a closures não ha garantia de que a API de coleções seria alterada.</p>
<p align="justify">Mesmo com o suporte a coleções da plataforma falta suporte a outras estruturas  	- que não sendo coleções &#8211; estão relacionadas a teoria de conjuntos como  	intervalos.</p>
<h2>Intervalo</h2>
<p align="justify">O MiddleHeaven dá suporta a intervalos pela classe <span style="font-family:courier;">Interval</span> definida  	conjunto de elementos ordenável. Elemento ordenável é todo aquele que implements <span style="font-family:courier;">Comparable</span> ou a que se possa associar um <span style="font-family:courier;">Comparator</span>. 	Um intervalo pode ser fechado ( tem principio e fim) , aberto ( sem principio 	ou sem fim) ou vazio ( o principio e o fim são iguais).</p>
<p align="justify">A classe <span style="font-family:courier;">Interval</span> suporta várias operações que podem ser feitas  	sobre ou com intervalos, tais como interseção, união ou verificar se um elemento  	está no intervalo.</p>
<p align="justify">Era importante incluir conceito de intervalo. Isso é especialmente relevante  	o dominio de tempos e datas (<a href="../toolboxes/quantidades-e-medidas/time-toolbox/" target="_new">Time Toolbox</a>) 	onde é comum definir intervalos de tempo. O MiddleHeaven define <span style="font-family:courier;">TimeInterval</span> como uma extensão de <span style="font-family:courier;">Interval</span> aplicada a <span style="font-family:courier;">TimePoint</span> e adiciona operações relacionadas a tempo como a conversão para <span style="font-family:courier;">Period</span></p>
<h2>Range</h2>
<p align="justify">Um intervalo não é iterável porque ele pode ser aberto. Para ter um objeto semelhante a um intervalo  	mas que é iterável temos o <span style="font-family:courier;">Range</span>. O objeto <span style="font-family:courier;">Range</span> parece-se muito com um intervalo,  	mas podemos iterar os elementos através de um <span style="font-family:courier;">Incrementator</span>.   	Um incrementador permite passar de um elemento ao próximo de uma forma controlada. Por exemplo, 	para passar de 1 a 2 adicionamos 1, mas para passar de 2009-09-10 a 2009-09-11 temos que obter a proxima data. 	Não podemos simplesmente adicionar 1.</p>
<p align="justify">O incrementador é especialmente relevante para elementos de um conjunto ordenável e denso como os numeros reais, já que para estes tipos de conjunto não podemos determinar qual é o proximo elemento a partir de um elemento dado. Por exemplo, nos numeros reais, a seguir a 1 existe um numero, mas não é 2, nem 1.5, nem 1.1, nem 1.0000001 , nem &#8230; Por causa desta impossibilidade matemática, ao criar um <span style="font-family:courier;">Range</span> sobre um      conjunto denso é necessário estabelecer o passo através de um incrementador. Por exemplo de 1 em 1, poderiamos     iterar de 2 a 5 e teriamos [2, 3 ,4, 5] , mas como passo de 0.5 teriamos [2, 2.5 , 3 , 3.5 , 4 , 4.5 , 5].</p>
<h2>Caminhando sobre o conjunto</h2>
<p align="justify">A API de collections é muito boa usando o padrão Iterator ( um dos padrões GoF) mas falha usando o  	padrão Visitor (também do GoF) . O padrão visitor é muito util para fazer passar um objeto por todos  	os elementos da coleção.  Assim, a coleção recebe um objeto que visita todos os elementos para um  	determinado fim. O padrão visitor é muito util porque esconde a iteração do for ou do while e  	desta maneira deixa a coleção fazer a caminhada pelos elementos como ela quiser ( em tese da forma mais eficiente).   	O padrão Visitor é aquele que seria utilzado por closures, caso elas existissem para aplicar uma certa logica 	a cada elementos do conjunto. O MiddleHeaven suporta o conceito por detrás do padrão visitor e introduz as  	interfaces <span style="font-family:courier;">Walkable</span> e <span style="font-family:courier;">Walker</span>. Um <span style="font-family:courier;">Walkable</span> é um objeto que pode  	ser &#8220;caminhado&#8221; por um &#8220;caminhante&#8221; (<span style="font-family:courier;">Walker</span>) em analogia a que um objeto  <span style="font-family:courier;">Iterable</span> pode ser iterado 	através de um <span style="font-family:courier;">Iterator</span>.</p>
<p align="justify">A interface <span style="font-family:courier;">Walker</span> apenas define um método genérico <span style="font-family:courier;">doWith()</span> que pode ser usado  	 para qualquer coisa. Embora o método não defina um retorno explicito, é possivel implementar uma outra classe 	 que implemente esta interface e permita o acesso a um resultado através de outro objeto. 	 Esse é o caso, por exemplo, de <span style="font-family:courier;">NumberAcumulator</span> que extend <span style="font-family:courier;">Acumulator</span> e implementa <span style="font-family:courier;">Walker</span> e permite somar valores continos na coleção.</p>
<table border="0" align="center">
<tbody>
<tr align="center">
<td>
<div class="java">
<table border="0" cellspacing="0" cellpadding="3" bgcolor="#ffffff">
<tbody>
<tr>
<td align="left" valign="top"><span style="color:#808080;">1</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">2</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">NumberAcumulator&#60;Real&#62; acumulator = NumberAcumulator.instance</span> <span style="color:#000000;">()</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">3</span> <span style="color:#ffffff;"> </span><br />
<span style="color:#808080;">4</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">Range range = Range.over</span> <span style="color:#000000;">(</span> <span style="color:#000000;">Real.valueOf</span> <span style="color:#000000;">(</span> <span style="color:#990000;">1</span> <span style="color:#000000;">)</span> <span style="color:#000000;">, Real.valueOf</span> <span style="color:#000000;">(</span> <span style="color:#990000;">6</span> <span style="color:#000000;">)</span> <span style="color:#000000;">,Real.ONE</span> <span style="color:#000000;">())</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">5</span> <span style="color:#ffffff;"> </span> <span style="color:#008000;">// calcula a soma de 1 até 6</span><br />
<span style="color:#808080;">6</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">range.each</span> <span style="color:#000000;">(</span> <span style="color:#000000;">acumulator</span> <span style="color:#000000;">)</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">7</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">8</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">assertEquals</span> <span style="color:#000000;">(</span> <span style="color:#000000;">Real.valueOf</span> <span style="color:#000000;">(</span> <span style="color:#990000;">21</span> <span style="color:#000000;">)</span> <span style="color:#000000;">, acumulator.getResult</span> <span style="color:#000000;">())</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">9</span> <span style="color:#ffffff;"> </span> </span></span></td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
<tr>
<td class="legend">
<hr />Código 1: Exemplo de uso de acumulador</td>
</tr>
</tbody>
</table>
<p align="justify">Aqui utilizámos a classe <span style="font-family:courier;">Real</span> porque <span style="font-family:courier;">NumberAcumulator</span> precisa de um objeto que implemente 	 a estrutura matemática <span style="font-family:courier;">GroupAditive</span>. <span style="font-family:courier;">Real</span> implementa uma forma especial de criar <span style="font-family:courier;">Range</span> O código ficaria assim:</p>
<table border="0" align="center">
<tbody>
<tr align="center">
<td>
<div class="java">
<table border="0" cellspacing="0" cellpadding="3" bgcolor="#ffffff">
<tbody>
<tr>
<td align="left" valign="top"><span style="color:#808080;">1</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">2</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">NumberAcumulator&#60;Real&#62; acumulator = NumberAcumulator.instance</span> <span style="color:#000000;">()</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">3</span> <span style="color:#ffffff;"> </span><br />
<span style="color:#808080;">4</span> <span style="color:#ffffff;"> </span> <span style="color:#008000;">// calcula a soma de 1 até 6</span><br />
<span style="color:#808080;">5</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">Real.ONE</span> <span style="color:#000000;">()</span> <span style="color:#000000;">.upTo</span> <span style="color:#000000;">(</span> <span style="color:#990000;">6</span> <span style="color:#000000;">)</span> <span style="color:#000000;">.each</span> <span style="color:#000000;">(</span> <span style="color:#000000;">acumulator</span> <span style="color:#000000;">)</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">6</span> <span style="color:#ffffff;"> </span><br />
<span style="color:#808080;">7</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">assertEquals</span> <span style="color:#000000;">(</span> <span style="color:#000000;">Real.valueOf</span> <span style="color:#000000;">(</span> <span style="color:#990000;">21</span> <span style="color:#000000;">)</span> <span style="color:#000000;">, acumulator.getResult</span> <span style="color:#000000;">())</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">8</span> <span style="color:#ffffff;"> </span><br />
<span style="color:#808080;">9</span> <span style="color:#ffffff;"> </span> </span></td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
<tr>
<td class="legend">
<hr />Código 2: Simplificação para criar um Range</td>
</tr>
</tbody>
</table>
<p align="justify">Imprimir os numeros de 1 a 6 mostra um uso mais tradicional do <span style="font-family:courier;">Walker</span></p>
<table border="0" align="center">
<tbody>
<tr align="center">
<td>
<div class="java">
<table border="0" cellspacing="0" cellpadding="3" bgcolor="#ffffff">
<tbody>
<tr>
<td align="left" valign="top"><span style="color:#808080;">01</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">02</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">Range.over</span> <span style="color:#000000;">(</span> <span style="color:#990000;">1</span> <span style="color:#000000;">,</span> <span style="color:#990000;">6</span> <span style="color:#000000;">)</span> <span style="color:#000000;">.each</span> <span style="color:#000000;">(</span> <span style="color:#0000c0;"> <strong>new </strong> </span> <span style="color:#000000;">Walker</span> <span style="color:#000000;">(){</span><br />
<span style="color:#808080;">03</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">04</span> <span style="color:#ffffff;"> </span> <span style="color:#0000c0;"> <strong>public </strong> </span> <span style="color:#c00000;"> <strong>void </strong> </span> <span style="color:#000000;">doWith</span> <span style="color:#000000;">(</span> <span style="color:#000000;">Integer it</span> <span style="color:#000000;">){</span><br />
<span style="color:#808080;">05</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">06</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">System.out.println</span> <span style="color:#000000;">(</span> <span style="color:#000000;">it</span> <span style="color:#000000;">)</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">07</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">08</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">}</span><br />
<span style="color:#808080;">09</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">10</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">})</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">11</span> <span style="color:#ffffff;"> </span> </span></span></span></span></span></td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
<tr>
<td class="legend">
<hr />Código 3: Usando Walker</td>
</tr>
</tbody>
</table>
<p>Em java puro não teria muito ganho porque este Walker é muito simples. Mas se o Walker executar operações  	 complexas (mais de 5 linhas)  escrever isso dentro de um for é  confuso.  colocando isso em uma objeto 	  é possivel definir a logia à parte e de forma genérica. Este é o objetivo, entre outros,  de trazer  	  closures para Java. Segundo as tendencias qualquer interface poderia ser substituida por uma closure.  	  Embora closures não venham na versão 7 do Java  é quase certo que virão em algum ponto.  	  Enquanto não, as classe anónimas internas terão que servir.O ganho real viria da simplificação  	  da sintaxe com o uso de Closures. Se um dia elas vierem vc poderia escrever assim:</p>
<table border="0" align="center">
<tbody>
<tr align="center">
<td>
<div class="java">
<table border="0" cellspacing="0" cellpadding="3" bgcolor="#ffffff">
<tbody>
<tr>
<td align="left" valign="top"><span style="color:#808080;">1</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">2</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">Range.over</span> <span style="color:#000000;">(</span> <span style="color:#990000;">1</span> <span style="color:#000000;">,</span> <span style="color:#990000;">6</span> <span style="color:#000000;">)</span> <span style="color:#000000;">.each</span> <span style="color:#000000;">() {</span> <span style="color:#000000;">System.out.println</span> <span style="color:#000000;">(</span> <span style="color:#000000;">it</span> <span style="color:#000000;">) }</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">3</span> <span style="color:#ffffff;"> </span> </span></td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
<tr>
<td class="legend">
<hr />Código 4: Exemplo de como seria o uso de Closures em futuras versões do Java</td>
</tr>
</tbody>
</table>
<p align="justify">Um outro tipo de  <span style="font-family:courier;">Walker</span> importante é aquele que caminha sobre uma arvore. 	 Para este tipo de objetos o MiddleHeaven introduz a interface <span style="font-family:courier;">TreeWalkable</span> que extende  	  <span style="font-family:courier;">Walkable</span> com os métodos <span style="font-family:courier;">eachRecursive()</span> e <span style="font-family:courier;">eachParent()</span>.  	 O método <span style="font-family:courier;">eachRecursive</span> aplica o  <span style="font-family:courier;">Walker</span> ao objeto, depois aos filhos  	 e depois aos filhos dos filhos, etc..  	 O método eachParent() é aplicado ao pai do objeto corrente e depois ao desse , assim até à raiz. 	 <span style="font-family:courier;">TreeWalkable</span> é especialmente útil para estruturas como o sistema de arquivos.  	 <span style="font-family:courier;">ManagedFile</span> da <a href="../toolboxes/managed-file-toolbox/" target="_new"> Managed File Toolbox</a> implementa esta interface.</p>
<h2>Enumerable</h2>
<p align="justify">A classe utilitária <span style="font-family:courier;">Collections</span> permite utilizar vários métodos sobre objetos que estendam <span style="font-family:courier;">Collection</span> ou <span style="font-family:courier;">Map</span>. Isso é feito para que os mapas e coleções em Java não tenham que implementar um numero elevado de métodos 	 assim diminuindo a sua área de superfície. Isto é considerado uma boa prática. Contudo é estre,amente chato e ineficiente 	 já que cada implementação não pode otimizar o processo definido pelo contrato do método. Além disso a chamada dos métodos 	 é pouco encadeável o que confunde os programadores iniciantes e frustra os experientes.</p>
<p align="justify">Um outro problema com os mapas e coleções em java é a fala de uma interface comum para coleções e mapas.</p>
<p align="justify">O MiddleHeaven introduz a interface <span style="font-family:courier;">Enumerable</span> (enumerável). Esta interface serve dois propósitos: 1) o de prover uma interface 	 comum para mapas e coleções e extender o numero de métodos directamente invocáveis sobre os conjuntos.Um <span style="font-family:courier;">Enumerable</span> é uma expanção do conceito de <span style="font-family:courier;">Iterator</span>.   	 Todos os <span style="font-family:courier;">Enumerable</span> são <span style="font-family:courier;">Iterator</span> mas têm mais coisas a oferecer.</p>
<p align="justify">A maior parte dos métodos de <span style="font-family:courier;">Enumerable</span> recebem implementações de <span style="font-family:courier;">Classifier</span>.  	 Este é um objeto que dado um objeto de um tipo retorna outro objeto do mesmo ou de outro tipo.  	 Em particular pode retornar um objeto do tipo <span style="font-family:courier;">Boolean</span>. A maior parte dos métodos de  	 <span style="font-family:courier;">Enumerable</span> usam classificadores para boolean excepto <span style="font-family:courier;">map</span> que usa  	 classificadores para qualquer outro objeto. O  objeto <span style="font-family:courier;">Classifier</span> pode ser usado como  	 filtro ou como transformador. Por exemplo, usando o método <span style="font-family:courier;">find()</span> é possivel encontrar  	 um objeto que passe no teste do classificador passado como argumento. Tudo isto sem ter que escrever 	 nenhuma instrução <span style="font-family:courier;">for</span>.</p>
<p align="justify"><span style="font-family:courier;">Enumerable</span> implementa <span style="font-family:courier;">Walkable</span> e todas as operações com <span style="font-family:courier;">Classifier</span> geram novos  	 conjuntos após aplicar o classificador a todos os elementos 	 do ocnjunto. Os métodos que usam <span style="font-family:courier;">Classifier</span> implementam o padrão Visitor de forma semelhante a <span style="font-family:courier;">Walker</span>, 	 a diferença é que o resultado obtido pelo <span style="font-family:courier;">Walker</span> não é convertido para um outro conjunto, enquanto que os que usam  	 <span style="font-family:courier;">Classifier</span> são.</p>
<p align="justify">Com isto o MiddleHeaven extende as interfaces <span style="font-family:courier;">Collection</span>,<span style="font-family:courier;">Set</span>, <span style="font-family:courier;">List</span> e <span style="font-family:courier;">Map</span> implementando <span style="font-family:courier;">Enumerable</span> e mais alguns métodos interessantes. Estes conjuntos são chamados de coleções aumentadas (enhanced)  	 e implementam as interfaces <span style="font-family:courier;">EnhancedCollection</span>, <span style="font-family:courier;">EnhancedSet</span> , <span style="font-family:courier;">EnhancedList</span> e <span style="font-family:courier;">EnhancedMap</span> respectivamente.  	 Para os obter basta invocar <span style="font-family:courier;">CollectionUtils.enhance()</span>. O uso deste método é inivitável em Jaa devido ao fato 	 de não ser possivel adicionar este método nas interfaces já existentes.  	 Criar uma coleção aumentada é muito simples:</p>
<table border="0" align="center">
<tbody>
<tr align="center">
<td>
<div class="java">
<table border="0" cellspacing="0" cellpadding="3" bgcolor="#ffffff">
<tbody>
<tr>
<td align="left" valign="top"><span style="color:#808080;">1</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">2</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">List&#60;Integer&#62; lista = Arrays.asList</span> <span style="color:#000000;">(</span> <span style="color:#990000;">1</span> <span style="color:#000000;">,</span> <span style="color:#990000;">2</span> <span style="color:#000000;">,</span> <span style="color:#990000;">3</span> <span style="color:#000000;">,</span> <span style="color:#990000;">4</span> <span style="color:#000000;">,</span> <span style="color:#990000;">5</span> <span style="color:#000000;">,</span> <span style="color:#990000;">6</span> <span style="color:#000000;">)</span> <span style="color:#000000;">; </span> <span style="color:#008000;">// lista na plataforma Java</span><br />
<span style="color:#808080;">3</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">4</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">EnhancedList&#60;Integer&#62; elista = CollectionUtils.enhance</span> <span style="color:#000000;">(</span> <span style="color:#000000;">lista</span> <span style="color:#000000;">)</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">5</span> <span style="color:#ffffff;"> </span><br />
<span style="color:#808080;">6</span> <span style="color:#ffffff;"> </span> </span></span></td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
<tr>
<td class="legend">
<hr />Código 5: Aumentando (enhancing) uma lista</td>
</tr>
</tbody>
</table>
<p align="justify"><span style="font-family:courier;">Enumerable</span> permite enumerar e iterar sobre um conjunto em uma certa ordem. Mas e que tal 	 obter um elemento aleatóriamente de uma lista ou coleção ? O MiddleHeaven inclui a interface  	 <span style="font-family:courier;">RandomEnumerable</span>. Esta interface define o método <span style="font-family:courier;">random()</span> que seleciona um elmento 	 aleatóriamente da coleção. Isso permite o sorteio de numeros em uma linha de codigo.  	 Por exemplo para sortear os numeros de um dado fariamos:</p>
<table border="0" align="center">
<tbody>
<tr align="center">
<td>
<div class="java">
<table border="0" cellspacing="0" cellpadding="3" bgcolor="#ffffff">
<tbody>
<tr>
<td align="left" valign="top"><span style="color:#808080;">1</span> <span style="color:#ffffff;"><br />
<span style="color:#808080;">2</span> <span style="color:#ffffff;"> </span> <span style="color:#000000;">Integer resultado = Range.over</span> <span style="color:#000000;">(</span> <span style="color:#990000;">1</span> <span style="color:#000000;">,</span> <span style="color:#990000;">6</span> <span style="color:#000000;">)</span> <span style="color:#000000;">.random</span> <span style="color:#000000;">()</span> <span style="color:#000000;">;</span><br />
<span style="color:#808080;">3</span> <span style="color:#ffffff;"> </span> </span></td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
<tr>
<td class="legend">
<hr />Código 6: Sorteando um numero de um dado</td>
</tr>
</tbody>
</table>
<h2>Porquê</h2>
<p align="justify">Muitos já tentaram criar bibliotecas alternativas para coleções. A Apache Commons Collections existia mesmo antes 	 da API ser padrão na plataforma Java. Trabalhar com conjuntos é realmente uma facilidade que permite ao mesmo tempo 	 tipagem forte, algoritmos eficientes e simplicidade para trabalhar com muitos objetos simultaneamente. O MiddleHeaven 	 não poderia,portanto, se escusar que dar algum suporte a coleções.</p>
<p align="justify">Com o olho no Java 7 e a suposta introdução de closures, as coleções aumentadas teriam um uso mais simples e omnipresente 	 mas mesmo sem a funcionalidade de closures ha muita coisa que é mais fácil de ser feita com o uso destas coleções. 	 Por outro lado, devido à necessidade de suportar intervalos (sobretudo os de tempo) era necessário introduzir  	 classes diferentes mas de forma compatível. Mas um intervalo não é iterável, então foi criado o objeto Range.</p>
<p align="justify">Converter qualquer conjunto da plataforma padrão para a biblioteca aumentada é muito simples. Aliás , à exceção de <span style="font-family:courier;">EnhancedArrayList</span> que pode ser usada independente, aumentar uma coleção já existente é a única forma de obter uma coleção aumentada.</p>
<p align="justify"><a name="pd_a_1615736"></a><div class="PDS_Poll" id="PDI_container1615736" style="display:inline-block;"></div><script type="text/javascript" language="javascript" charset="utf-8" src="http://static.polldaddy.com/p/1615736.js"></script>
		<noscript>
		<a href="http://answers.polldaddy.com/poll/1615736/">View This Poll</a><br/><span style="font-size:10px;"><a href="http://www.polldaddy.com">surveys</a></span>
		</noscript></p>
<table style="height:24px;" border="0" width="334" align="center">
<tbody>
<tr>
<td align="center" valign="center"></td>
<td align="left" valign="top"></td>
</tr>
</tbody>
</table>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Nosso novo blog]]></title>
<link>http://sergiotaborda.wordpress.com/2009/04/21/nosso-novo-blog/</link>
<pubDate>Wed, 22 Apr 2009 01:05:23 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://sergiotaborda.wordpress.com/2009/04/21/nosso-novo-blog/</guid>
<description><![CDATA[Já era hora, eu achei, de criar um novo blog para falar do MiddleHeaven. Tenho dedicado meu muito es]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;">Já era hora, eu achei, de criar um novo blog para falar do MiddleHeaven.</p>
<p style="text-align:justify;">Tenho dedicado meu muito escasso tempo livre a este projeto durantes os últimos anos e está na hora de o mostrar ao mundo (e ser criticado por isso &#8230;).</p>
<p style="text-align:justify;">O blog em inglês não deslanchou e o site feito pelo maven é pesado para atualizar. A ideias são muito mais fluidas e, contando que a minha equipe jornalística sou eu mesmo é bem mais facil utilizar um blog. A volta ao blog do WordPress em deterimento do Blogstop é que o Wrodpress apresenta a muito útil capacidade de criar páginas estáticas além do blog.</p>
<p style="text-align:justify;">Convido a todos a conhecerem o <a href="http://middleheaven.wordpress.com/" target="_blank">nosso novo blog</a> para entender e desenvolver o MiddleHeaven.</p>
<p style="text-align:justify;">A seu tempo vou colocar nele os textos já apresentados, em inglês, no blog antigo.<br />
Espero que acabe havendo algum cross-siting entre os dois blogs especialmente em referências a padrões e coisas relacionadas ao Java em si. Isso não era possível com o blog antigo devido à diferença da língua. Espero que isso, também, seja uma vantagem.
</p>
<p style="text-align:justify;">Aproveito para informar o estado do projeto. Embora já seja possível criar telas swing e sites jsp ainda falta um pouco para que as peças principais estejam no lugar.  Recentemente integrei o NeoDatis e parece bastante promissor, contudo, leva a uma revisao do modelo de dominio baseado em anotações (sem ORM , não ha necessidade das anotações). Por outro lado, revisei o mecanismo de wiring (injeção automática) para ser possível encontrar pontos de injeção por outras vias que não annotações. Desta forma é possível análises mais dinâmicas. O mecanismo de persistência é o próximo a ser revisto. Espero que após isso uma versão do framework possa ser usada para aplicações web simples (a la Spring / Struts / Vraptor / Mentawai) .</p>
<p style="text-align:justify;">Claro que, para isso, você precisa estar preparado para não usar o Hibernate&#8230; será que aguenta ? <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[MiddleHeaven Pré-Alfa]]></title>
<link>http://sergiotaborda.wordpress.com/2009/02/01/middleheaven-pre-alfa/</link>
<pubDate>Sun, 01 Feb 2009 20:05:06 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://sergiotaborda.wordpress.com/2009/02/01/middleheaven-pre-alfa/</guid>
<description><![CDATA[Uma versão utilizável do MiddleHeaven já está disponivel. A versão é a 0.0.1 o que significa que é p]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;">Uma versão utilizável do MiddleHeaven já está <a href="http://sourceforge.net/project/showfiles.php?group_id=211558" target="_blank">disponivel</a>. A versão é a 0.0.1 o que significa que é pre-alfa.</p>
<p style="text-align:justify;">Este release não é de produção, nem muito menos está em estado de completo, mas isso é porque estou tomando em consideração todos os toolboxes.  Alguns toolboxes estão 90% terminados e alguns já são utilizáveis mesmo sem estarem completos.</p>
<p style="text-align:justify;">O objetivo é deixar um jar disponível para que as pessoas possam experimentar o MiddleHeaven sem o esforço de baixar tudo do SVN e compilar em casa. Note-se que o MiddleHeaven tem muitas dependências externas. É bom dar uma olhada no arquivo POM dentro do jar.</p>
<p style="text-align:justify;">É claro que nem todos os bugs foram corrigidos, mas tentei deixar corrigidos todos os que encontrei.</p>
<p style="text-align:justify;">O<a href="http://middleheavendev.blogspot.com/"> blog de desenvolvimento</a> do MiddleHeaven está aberto aos comentários de todos assim como os <a href="http://sourceforge.net/forum/?group_id=211558" target="_blank">foruns</a>.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[MiddleHeaven Reloaded]]></title>
<link>http://sergiotaborda.wordpress.com/2008/10/24/middleheaven-reloaded/</link>
<pubDate>Fri, 24 Oct 2008 17:11:00 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://sergiotaborda.wordpress.com/2008/10/24/middleheaven-reloaded/</guid>
<description><![CDATA[Ha quase um ano o MiddleHeaven nasceu, mas a sua evolução anda um pouco lenta devido a minha falta d]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;">Ha quase um ano o MiddleHeaven nasceu, mas a sua evolução anda um pouco lenta devido a minha falta de disponibilidade para trabalhar nele. Então vou fazer algumas alterações.</p>
<p style="text-align:justify;">Primeiro, decidi criar um outro <a href="http://middleheavendev.blogspot.com/" target="_blank">blog para falar do MiddleHeaven</a>.  Isto porque: a) não caberia neste blog pessoal falar com detalhe desse asunto e; b) precisava atingir uma comunidade maior e por isso decidi escrever o blog em inglês. O meu blog pessoal é em português por escolha e não caberia misturar as duas línguas.</p>
<p style="text-align:justify;">No blog de desenvolvimento vou falar da estrutura, conceitos , idéias e trade-offs por detrás do MH e espero que isso ajude mais pessoas a entender OO e Java e me ajude a vislumbrar onde fiz a escolha errada.</p>
<p style="text-align:justify;">O blog do MiddleHeaven não é pessoal, por isso, espero que no futuro possam existir mais pessoas colaborando com conteúdo para ele (em tese, os mesmos que colaboram com o código).</p>
<p style="text-align:justify;">Convido a todos que estão interessados no projeto a seguir o novo blog.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Atualizações]]></title>
<link>http://sergiotaborda.wordpress.com/2008/07/17/atualizacoes/</link>
<pubDate>Thu, 17 Jul 2008 21:18:11 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://sergiotaborda.wordpress.com/2008/07/17/atualizacoes/</guid>
<description><![CDATA[Os artigos sobre exceções e coleções foram atualizados. Ao de coleções adicionei um fluxo de decisão]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;">Os artigos sobre exceções e coleções foram atualizados. Ao de coleções adicionei um fluxo de decisão de interfaces e implementações de coleções. São abrangidos os principais casos.  Notei que existe pouco entendimento das diferenças entre cada implementação, então espero que isto ajude a clarificar as coisas. Um terceiro, prometido, artigo  sobre exceções está na forja &#8230; <em>segura firme</em>.</p>
<p style="text-align:justify;">Adicionei um novo artigo sobre as palavras reservadas do Java. Curiosamente nunca tinha parado para pensar que true, false e null são palavras reservadas. O estranho é que no site da Sun só se listam as palavras-chave e não as palavras reservadas. Acho estranho porque o conceito de palavra reservada é mais <em>lato</em> que o de palavra-chave.</p>
<p style="text-align:justify;">Não tenho tido tempo para comentar sobre o projeto MiddleHeaven mas ele continua em desenvolvimento (alfa).  Estou com alguns problemas logísticos para decidir onde colocar o código &#8220;official&#8221;. O sourceforge parecia bom, mas a conexão é lenta demais. O Google Code parece bem mais rápido mas não dá para usar o site que o Maven produz (dá?).  No sourceforge tenho também o problema de não conseguir atualizar o ViewCVS que no Google Code funciona perfeitamente.  Quem quiser dar uma olhada pode fazê-lo no Google Code, embora o código esteja menos atualizado.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Wire It to me]]></title>
<link>http://sergiotaborda.wordpress.com/2008/04/10/wire-it-to-me/</link>
<pubDate>Thu, 10 Apr 2008 19:28:50 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://sergiotaborda.wordpress.com/2008/04/10/wire-it-to-me/</guid>
<description><![CDATA[Como saberão estou &#8211; no meu pouco tempo livre &#8211; envolvido no projeto MiddleHeaven. Umas ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;">Como saberão estou &#8211; no meu pouco tempo livre &#8211; envolvido no projeto MiddleHeaven. Umas das capacidades mais interessantes do Middleheaven é ganhar independência de plataforma através do uso de serviços. Como comentei antes, &#8220;serviço&#8221; é uma modelo que está em alta e que parece fornecer encapsulamento, isolamento e desacoplamento por definição. Adicionamos a isso a programação para interfaces e os mecanismos de meta-programação (reflection, bytecode-rewrite) e temos um mecanismo muito poderoso para adicionar funcionalidade no sistema.</p>
<p style="text-align:justify;">Ao trabalhar com serviços existem algums detalhes que precisam ser suportados por um framework. Primeiro, tem que existir uma forma de obter o serviço. Tudo bem que não sabemos qual a implementação do serviço &#8211; e não nos interessa &#8211; mas temos que a obter em algum momento. O padrão básico para isto é o Registry. A idéia é que a implementação é registrada &#8220;antes&#8221; e &#8220;depois&#8221; o serviço é recuperado. Esta mecânica existe em vários frameworks baseados em serviços como JMX ou OSGi.  Este simples requisito (obter a implementação) é mais complexo do que parece. Acontece que um mesmo serviço pode funcionar diferentemente conforme algum parâmetro e podemos estar interessados em usar mais do que um serviço do mesmo tipo. Por exemplo, um serviço de dicionário tem vários tipos: um para cada língua.  Ao pegar o serviço a interface não basta. É preciso (algumas vezes) adicionar algums parâmetros na busca. Dessa forma, é possivel dizer &#8220;obtenha a implementação do serviço dicionário para o  francês&#8221; e depois repetir &#8220;obtenha a implementação  do serviço para o inglês&#8221; e com isso construir um código que testa se uma certa palavra é homografa entre as línguas (como por exemplo <em>weekend</em>). Um mecanismo baseado em serviços tem que ser capaz de suportar diferentes &#8220;sabores&#8221; de um mesmo serviço. Até aqui parece simples. Basta passar os parâmetros durante a procura. Mas quais parâmetros são permitidos para cada serviço? Precisamos saber? Versão é um parâmetro?</p>
<p style="text-align:justify;">O outro ponto é que usar um Registry para obter os serviços torna o código dependente do próprio registro e da forma de o acessar. Um mecanismo melhor seria usar injeção de dependência.  Mas para ser realmente prático, uma implementação de um mecanismo destes teria que ser feito com base em anotações (compare Guice com Spring e veja a diferença entre usar anotações e XML). Isso é interessante porque não mais tenho que me preocupar com o mecanismo de procura , apenas espeficico o que quero. Algo assim:</p>
<p style="text-align:justify;">@Wire @ServiceParams(&#8220;language=fr_FR&#8221;) Dicionario dicionarioFrances;<br />
@Wire @ServiceParams(&#8220;language=en_UK&#8221;) Dicionario dicionarioIngles;</p>
<p style="text-align:justify;">O mecanismo de injeção faria algo como</p>
<p style="text-align:justify;">ServiceRegistry.getService(Dicionario.class, serviceProperties )</p>
<p style="text-align:justify;">em que serviceProperties seria um mapa populado pela instrospeção de @ServiceParams.<br />
Um mecanismo de injeção não demora a construir, embora demore a maturar para resolver problemas como referência cíclica e outros. Ou seja, em tese, não é pedir muito que o MiddleHeaven inclua um mecanismo de injeção e permita ao objetos pedir &#8220;Hey! MiddleHeaven, wire it to me!&#8221;</p>
<p style="text-align:justify;">Tudo muito bem, mas existe ainda um outro fator nesta história. Decidir quais implementações dos serviços devem ser usadas.  Esta decisão depende de vários fatores. Serviços de infra como transações e comunicação remota dependem do contexto em que a aplicação corre. Dentro de um container jee é apenas adaptar o serviço provido pelo próprio container, enquanto que em standalone precisamos de implementar o próprio mecanismo ou delegar a alguma biblioteca de terceiros. A aplicação também pode decidir que precisa de um certo serviço ( por exemplo, serviço de reports). Esse serviço tem que estar presente para a aplicação funcionar, mas não é essencial nem utilizado sempre e nem depende do contexto. Além desses, temos serviços externos como serviços de cotação ou B2B que a aplicação usuará.</p>
<p style="text-align:justify;">A este ponto deve estar pensando que já ouvi esta conversa em relação a SOA. SOA é orientado a comunicar sistema fora do mesmo &#8220;processo de negocio&#8221;. Mas podemos trazer o conceito para dentro e utilizar um design baseado em componentes que funcionam como serviços uns dos outros. Claro que isso é mais facil dito que feito.</p>
<p style="text-align:justify;">Como os serviços necessários à aplicação podem ser adicionadas conforme necessário eles podem também ser removidos ou subtituídos (especialmente os de terceiros) quando necessário. Isto pode significar que depois que a variável foi connectada à implementação, a implementação muda. E muda em runtime. O objeto que a variável aponta não é mais válido. Obviamente isto implica no uso do padrão Observer mas como não há interação com o registro de serviços, o próprio mecanismo de injeção tem que conter alguma lógica especial ou melhor, ser possível injetar alguma lógica especial no mecanismo de injeção <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  . Ou seja, temos que aliar AOP com o mecanismo de injeção para trabalhar com serviços errantes.</p>
<p style="text-align:justify;">Indo mais fundo no problema, a apliação em si mesma pode ser entendida como um conjunto de serviços. Normalmente chamamos as partes de um aplicação de módulos. A idéia é criar uma aplicação criando um conjunto de módulos. Um módulo &#8220;principal&#8221; contém o coração da aplicação. O que esse módulo faz (o seu serviço) depende de outros módulos e/ou pode ser estendido por outros modulos.</p>
<p style="text-align:justify;">Um exemplo classico são os ERP. Uma compra gera um conjunto de eventos de negócio. Cada módulo (contabilidade, financeiro, etc..) enxerga esse evento de forma diferente e o processa de forma diferente. Para um sistema básico a implementação do módulo pode simplesmente ignorar o evento ou apenas persisti-lo para tratamento posterior. Um módulo mais avançado não apenas produziria informação com base no evento, como ainda disponibilizaria seus serviços para serem consultados por outros modulos/sistemas (via webservice, por exemplo). Um módulo mais avançado poderia alterar o serviço de UI da aplicação para incluir mais telas que permitem ao usuário interagir com o módulo, e alterar o serviço de permissões para restringir o acesso dos usuários. Os módulos seriam então configuradores de serviços, conscientes dos outros módulos de que eles dependem e fornecendo novos serviços para serem consumidos por outros módulos, aplicações ou sistema.</p>
<p style="text-align:justify;">Esta é a idéia por detrás do MiddleHeaven como um framework orientado ao negócio. A aplicação é apenas mais um serviço, composto por outros serviços. O detalhe agora é saber como colocar tudo isto no mesmo caldeirão e funcionar.</p>
<p style="text-align:justify;">A minha idéia era, como comentei antes, utilizar frameworks como o OSGi ou o ainda não estreado Java Module System para cuidar da localização e registro de serviços, mas hoje parece-me que esse mecanismos podem não ser compativeis e/ou não seguir o caminho necessário para o MiddleHeaven. Ou serem mais abrangentes que esse caminho. Enfim, abstrair esses mecanismo parece uma boa idéia para manter a independência do MiddleHeaven mas parece complicado demais&#8230;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Padrões]]></title>
<link>http://sergiotaborda.wordpress.com/2008/03/31/padroes/</link>
<pubDate>Mon, 31 Mar 2008 17:31:05 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://sergiotaborda.wordpress.com/2008/03/31/padroes/</guid>
<description><![CDATA[Uma das mais inimitáveis características do ser humano é ser capaz de reconhecer padrões. Não apenas]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Uma das mais inimitáveis características do ser humano é ser capaz de reconhecer padrões.  Não apenas padrões de cor, forma ou som, mas também padrões em idéias, conceitos e abstrações. A matemática não seria possível sem essa capacidade.</p>
<p>Venho elaborando descrições do padrões mais importantes (a lista não pode ser exaustiva porque existem bastantes ) em orientação a objetos em java hoje em dia. Claro que a implementação é naturalmente orientada para java, mas os padrões em si mesmos são abstratos e podem ser implementados em qualquer linguagem O.O. ( a maioria, pelo menos).</p>
<p>Os padrões são resultado da estricta e repetida aplicação do Principio de Separação de Responsabilidade e são, na realidade, uma expressão  utilitária desse principio.</p>
<p>Espero apresentar uma vasta gama de padrões (pelo menos os usados no MiddleHeaven) mas não é um trabalho rápido devido ao imenso numero de padrões que existem.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Orientação a Serviços]]></title>
<link>http://sergiotaborda.wordpress.com/2008/03/02/orientacao-a-servicos/</link>
<pubDate>Sun, 02 Mar 2008 23:51:50 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://sergiotaborda.wordpress.com/2008/03/02/orientacao-a-servicos/</guid>
<description><![CDATA[Muitas coisas aconteceram desde a ultima mensagem. Esta vida corrida demanda demais. O projeto Middl]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p align="justify">Muitas coisas aconteceram desde a ultima mensagem. Esta vida corrida demanda demais.</p>
<p align="justify">O projeto <a href="http://middleheaven.sourceforge.net/">Middleheaven</a> continua. Um dos seus pontos fortes é o uso de serviços para fornecer funcionalidade. Serviços são interfaces que estabelecem contratos. A sua implementação é desconhecida, apenas sabemos que funciona. Desta forma a aplicação pode ser totalmente isolada de mecanismos de infraestrutura e, até, de outras aplicações sem que ela saiba.</p>
<p align="justify">A ideia de usar serviços  veio da api de JMX que é complemente orientada a componentes de serviço: os MBeans. Com o passar do tempo eu queria aumentar o nível e ser capaz de dizer que o serviço x depende do y de forma que o sistema tomasse conta da organização e avisasse quando o serviço não está disponível. Este controle de dependência mostrou-se muito complexo.</p>
<p align="justify">Perquisando na net encontrei uma coisa chamada OSGi framework. Também baseado no conceito de serviço com implementações separadas surge a ideia de o incorporar ao MiddleHeaven.  Existem várias implementações do  OSGi framework e escolhi o Apache Felix para começar. Contudo existe uma JSR (JSR 277) prevista para breve que faz algo semelhante. Por isso ainda não decidi qual dos mecanismo adotar. O JSR 277 promete ser o novo padrão java muito em breve, mas o OSGi já existe hoje. O  OSGi framework tem alguns problemas como classloading que o novo padrão pretende resolver.</p>
<p align="justify">WebServices e SOA são outras ideias que nos levam a um mecanismo de serviços como componentes, mas agora de forma remota. A implementação do serviço pode ser remota com a API de webservices fazendo a ponte. A famosa consulta de cep poderia muito bem se aproveitar disto.</p>
<p align="justify">Parece-me que o MiddlHeaven está no bom caminho no que toca a usar serviços como peças fundamentais para prover funcionalidades &#8230;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[MiddleHeaven]]></title>
<link>http://sergiotaborda.wordpress.com/2007/12/08/middleheaven/</link>
<pubDate>Sat, 08 Dec 2007 17:29:47 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://sergiotaborda.wordpress.com/2007/12/08/middleheaven/</guid>
<description><![CDATA[Decidi trocar o host do MiddleHeaven para o SourceForge já que o Java.net não oferece a simplicidade]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Decidi trocar o host do <a href="http://middleheaven.sourceforge.net/">MiddleHeaven</a>  para o SourceForge já que o Java.net não oferece a simplicidade de um webserver onde colocar a documentação e outras coisas. Como o projeto usa o Maven o site é criado e colocado online automáticamente.</p>
<p>Esta configuração do Maven é uma mão na roda quando está certa, mas é um complexo de configurar tudo da forma que se quer&#8230; O codigo está online</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Nasce o MiddleHeaven]]></title>
<link>http://sergiotaborda.wordpress.com/2007/12/01/nasce-o-middleheaven/</link>
<pubDate>Sat, 01 Dec 2007 21:57:51 +0000</pubDate>
<dc:creator>sergiotaborda</dc:creator>
<guid>http://sergiotaborda.wordpress.com/2007/12/01/nasce-o-middleheaven/</guid>
<description><![CDATA[Depois de muito , muito, tempo prepando o terreno decidi que é hora de lançar o projeto. A minha ide]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p align="justify">Depois de muito , muito, tempo prepando o terreno decidi que é hora de lançar o projeto.</p>
<p align="justify">A minha ideia original era trabalhar no projeto até ter uma fundação sólida para depois o libertar como open source. Mas devido ao pouco tempo que disponho decidi lançar por partes, conforme vai ficando pronto. A base de código contém tudo, mas apenas algumas partes são utilizáveis.</p>
<p align="justify">A ideia por detrás do <a href="http://middleheaven.sourceforge.net/">MiddleHeaven</a> não é criar um framework web, nem mais um framework.É criar um Business Framework. Um framework orientado aos negocios. A diferença fundamental para outros frameworks é que visa implementar um conjunto de padrão de aplicação além dos comuns padrões de projeto. A ideia é fazer o sistema depender de um único framework e o framework depender de um conjunto de outros frameworks de infraestrutura. Por exemplo, abstrair se o log é feito no Log4J ou não, se a persistencia é feita em banco de dados , e em qual, se o sistema correm em JBoss, Tomcat ou standalone, etc&#8230;</p>
<p align="justify">Em certa forma é uma implementação prove of concept mas espero que seja funcional.</p>
<p align="justify">&#160;</p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
