<?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>Lucas Teixeira &#187; Groovy</title>
	<atom:link href="http://lucastex.com.br/category/groovy/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucastex.com.br</link>
	<description>@lucastex</description>
	<lastBuildDate>Fri, 07 Jan 2011 12:44:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Criando um tipo de dados personalizado no Grails + Hibernate</title>
		<link>http://lucastex.com.br/2010/07/19/criando-um-tipo-de-dados-personalizado-no-grails-hibernate/</link>
		<comments>http://lucastex.com.br/2010/07/19/criando-um-tipo-de-dados-personalizado-no-grails-hibernate/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 11:39:24 +0000</pubDate>
		<dc:creator>Volnei Munhoz</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[boolean]]></category>
		<category><![CDATA[usertype]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=388</guid>
		<description><![CDATA[

Olá Pessoal,
Estou invadindo o Blog do meu grande amigo Lucas para postar uma solução que encontrei para um problema no mapeamento de dados de uma base de dados existente. Gostaria, em primeiro lugar, de agradecer o espaço cedido pelo Lucas e parabenizá-lo pelo excelente Blog.
Hoje em dia são poucos os projetos que precisamos desenvolver do [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F07%252F19%252Fcriando-um-tipo-de-dados-personalizado-no-grails-hibernate%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FbkhFEI%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Criando%20um%20tipo%20de%20dados%20personalizado%20no%20Grails%20%2B%20Hibernate%22%20%7D);"></div>
<p>Olá Pessoal,</p>
<p>Estou invadindo o Blog do meu grande amigo Lucas para postar uma solução que encontrei para um problema no mapeamento de dados de uma base de dados existente. Gostaria, em primeiro lugar, de agradecer o espaço cedido pelo Lucas e parabenizá-lo pelo excelente Blog.</p>
<p>Hoje em dia são poucos os projetos que precisamos desenvolver do zero &#8212; criar modelagem, tabelas e etc&#8230; &#8212; por isso é muito comum depararmos com padrões proprietários que muitas vezes não se &#8220;encaixam&#8221; na ferramenta de desenvolvimento. Não preciso dizer que não é uma tarefa fácil convencer os desenvolvedores a se adequarem aos novos padrões, então, se não pode com eles, una-se a eles.</p>
<p>Bom, vamos direto ao assunto, no meu projeto atual me deparei com um padrão que utiliza &#8216;S&#8217; e &#8216;N&#8217; para o mapeamento de propriedades booleanas no banco de dados Oracle. Na pesquisa que realizei encontrei várias pseudo-soluções mas a única que atendeu 100% as necessidades foi a implementação de um tipo de dados do Hibernate.</p>
<p>Abaixo a implementação da classe SNUserType, não tem segredo é apenas a implementação da interface <strong>org.hibernate.usertype.UserType</strong>. Salve este código no pacote <strong>persistence</strong> na pasta de <strong>src/groovy</strong> do seu projeto Grails.</p>
<pre class="brush: groovy; title: ;">package persistence;

import org.hibernate.*;
import org.hibernate.usertype.*;
import java.sql.*;
import java.util.*;
import java.io.Serializable;

public class SNUserType implements UserType {

   def SQL_TYPES = [Hibernate.YES_NO.sqlType()];

   public int[] sqlTypes() {
      return SQL_TYPES;
   }

   private Class targetClass;

   public void setParameterValues(Properties params) {
      String targetClassName = params.getProperty(&quot;targetClass&quot;);
      try {
         targetClass = Class.forName(targetClassName);
      } catch (ClassNotFoundException e) {
         throw new HibernateException(&quot;Class &quot; + targetClassName + &quot; not found &quot;, e);
      }
   }

   public Class returnedClass() {
      return targetClass;
   }

   public boolean isMutable() {
      return false;
   }

   public Object deepCopy(Object value) {
      return value;
   }

   public Serializable disassemble(Object value) {
      return (Serializable) value;
   }

   public Object assemble(Serializable cached, Object owner) {
      return cached;
   }

   public Object replace(Object original, Object target, Object owner) {
      return original;
   }

   public boolean equals(Object x, Object y) {
      if (x == y)
         return true;
      if (x == null || y == null)
         return false;
      return x.equals(y);
   }

   public int hashCode(Object x) {
      return x.hashCode();
   }

   public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException {
      String value = rs.getString(names[0]);
      if (&quot;S&quot;.equals(value))
         return true;
      else
         return false;
   }

   public void nullSafeSet(PreparedStatement ps, Object value, int index) throws HibernateException, SQLException {
      if (value == null) {
         ps.setNull(index, Hibernate.YES_NO.sqlType());
      } else {
         if((Boolean)value) {
            ps.setString(index, &quot;S&quot;);
         } else {
            ps.setString(index, &quot;N&quot;);
         }
      }
   }
}</pre>
<p>Pronto, agora tudo que você precisa fazer é utilizar o novo tipo de dados no mapeamento de suas classes de domínio.</p>
<pre class="brush: groovy; title: ;">class Pessoa {

   String nome
   Boolean ativo

   static mapping = {
      ativo type: &quot;persistence.SNUserType&quot;
   }

}</pre>
<p>Com isso, resolvi o problema de integração e concluímos este post.</p>
<p>Um abraço</p>
<p>Volnei</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/07/19/criando-um-tipo-de-dados-personalizado-no-grails-hibernate/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Config.groovy &#8211; Cuidado ao manipular suas configurações</title>
		<link>http://lucastex.com.br/2010/01/11/config-groovy-cuidado-ao-manipular-suas-configuracoes/</link>
		<comments>http://lucastex.com.br/2010/01/11/config-groovy-cuidado-ao-manipular-suas-configuracoes/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 00:18:00 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Maldades do Groovy]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[grailsapplication]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[problema]]></category>
		<category><![CDATA[referencia]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=234</guid>
		<description><![CDATA[

Hum, reportando uma situação no mínimo inusitada que tive por aqui.
Acabei descobrindo, da maneira ruim, que no Grails, quando lêmos a configuração da aplicação (Config.groovy) através da referência grailsApplication.config estamos manipulando uma variável passível de alterações, ou seja, qualquer atributo que você recuperar de lá, e modificar, assim estará para toda a execução.
Na minha situação, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F01%252F11%252Fconfig-groovy-cuidado-ao-manipular-suas-configuracoes%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F6RuMHa%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Config.groovy%20-%20Cuidado%20ao%20manipular%20suas%20configura%C3%A7%C3%B5es%20%22%20%7D);"></div>
<p>Hum, reportando uma situação no mínimo inusitada que tive por aqui.</p>
<p>Acabei descobrindo, da maneira ruim, que no Grails, quando lêmos a configuração da aplicação (Config.groovy) através da referência <strong>grailsApplication.config</strong> estamos manipulando uma variável passível de alterações, ou seja, qualquer atributo que você recuperar de lá, e modificar, assim estará para toda a execução.</p>
<p>Na minha situação, eu mantinha uma lista de e-mails lá no arquivo de configuração para que quando disparado, eu pudesse enviar o e-mail a estes destinatários somados ao e-mail do usuário, que tinha acabado de ser inputado no formulário. Tinha algo assim:</p>
<pre class="brush: groovy; title: ;">contato.destinatarios = [&quot;email1@xpto.com&quot;, &quot;email2@xpto.com&quot;, &quot;email3@xpto.com&quot;]</pre>
<p>E dentro do controller, usando o mail plugin (<a href="http://lucastex.com.br/2010/01/02/envio-de-e-mails-com-o-mail-plugin/">leia este post sobre o mail plugin</a>), executava o seguinte trecho de código:</p>
<pre class="brush: groovy; title: ;">def destinatarios = grailsApplication.config.contato?.destinatarios?.toArray()
destinatarios &lt;&lt; params.email
sendMail {
    to destinatarios
    subject &quot;Contato ...&quot;
    body &quot;......&quot;
 }</pre>
<p>Ou seja, quando eu pegava a referência dos destinatários do Config, eu mantinha essa referência em &#8216;destinatários&#8217;. Quando eu adicionava neste array o destinatário que vinha do formulários &#8220;params.email&#8221;, eu alterava a *instância* e referência da configuração da aplicação, e aquele e-mail ali ficava.</p>
<p>Resultado, no primeiro contato, receberam o e-mail a lista de destinatários e o primeirocontato@xpto.com, na segunda execução, todos eles da configuração, o primeirocontato@xpto.com e também o segundocontato@xpto.com foram copiados.</p>
<p>E assim sucessivamente.</p>
<p>Vivendo e aprendendo, tomem cuidado com isso!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/11/config-groovy-cuidado-ao-manipular-suas-configuracoes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Portal imobiliário usando Groovy e Grails</title>
		<link>http://lucastex.com.br/2010/01/10/portal-imobiliario-usando-groovy-e-grails/</link>
		<comments>http://lucastex.com.br/2010/01/10/portal-imobiliario-usando-groovy-e-grails/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 13:05:34 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[acegi]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[GORM]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[imob]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[locaweb]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[richui]]></category>
		<category><![CDATA[runtimelogging]]></category>
		<category><![CDATA[settings]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[sqlserver]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=220</guid>
		<description><![CDATA[

Ontem (dia 09/01) fizemos o lançamento de um site que desenvolvemos usando Groovy e Grails, um desafio e tanto, pela responsabilidade de colocar o sistema no ar e pelo timing do projeto. Todo o site e a integração com o sistema legado (onde algumas informações ainda estão sendo gerenciadas), tiveram que sair do simples &#8220;create [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F01%252F10%252Fportal-imobiliario-usando-groovy-e-grails%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F7iywM2%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Portal%20imobili%C3%A1rio%20usando%20Groovy%20e%20Grails%22%20%7D);"></div>
<p>Ontem (dia 09/01) fizemos o lançamento de um site que desenvolvemos usando <a href="http://lucastex.com.br/tag/groovy/" target="_blank">Groovy</a> e <a href="http://lucastex.com.br/tag/grails/" target="_blank">Grails</a>, um desafio e tanto, pela responsabilidade de colocar o sistema no ar e pelo timing do projeto. Todo o site e a integração com o sistema legado (onde algumas informações ainda estão sendo gerenciadas), tiveram que sair do simples &#8220;<em>create app</em>&#8221; para produção em 2 meses. Esse é também o grande motivo para a falta de tempo de postar mais por aqui.</p>
<p>Trata-se dos sites <a href="http://www.imoveisnomorumbi.com.br" target="_blank">http://www.imoveisnomorumbi.com.br</a> e <a href="http://www.imoveisnopanamby.com.br" target="_blank">http://www.imoveisnopanamby.com.br</a>, site de duas imobiliárias do mesmo grupo, que negocia imóveis de alto padrão nestes dois bairros.</p>
<p>Algumas informações interessantes sobre o projeto:</p>
<p><strong>Tecnologia e Infraestrutura:</strong> O site antigo usava <a href="http://pt.wikipedia.org/wiki/Microsoft_SQL_Server" target="_blank">SQLServer</a> como banco de dados e tecnologia <a href="http://pt.wikipedia.org/wiki/ASP" target="_blank">ASP</a>. Como usamos Groovy e Grails, por trás temos uma JVM <a href="http://pt.wikipedia.org/wiki/Plataforma_Java">Java</a> em execução, e o banco de dados, o bom e velho <a href="http://pt.wikipedia.org/wiki/MySQL">MySQL</a>.</p>
<p>Antes, para suportar o ASP, o <a href="http://pt.wikipedia.org/wiki/IIS">IIS</a> era usado como web server, e agora Um <a href="http://pt.wikipedia.org/wiki/Servidor_Apache">apache</a> balanceia as requisições aos dois <a href="http://pt.wikipedia.org/wiki/Tomcat">Tomcats</a>. Tudo isto está deployado e rodando em um Cloud Server da Locaweb, por opção do cliente, onde já mantinha a conta antiga.</p>
<p><strong>Integração com o sistema legado:</strong> Para a integração do modelo de dados antigo e o novo modelo, construímos rotinas de importação dos dados usando <a href="http://docs.codehaus.org/display/GROOVY/Tutorial+6+-+Groovy+SQL" target="_blank">Groovy SQL</a>, uma maneira <span style="text-decoration: line-through;"> fácil, </span> muito fácil, de fazer rotinas em banco de dados.</p>
<p><strong>Plugins utilizados: </strong>Ahhh, os bons e velhos plugins do Grails, não canso de dizer que esta é a melhor parte do Grails! Foram usados os plugins:</p>
<p><a href="http://grails.org/plugin/mail" target="_blank"><strong>Grails-Mail</strong></a>, para envio dos e-mails e formas de contato do site<br />
<a href="http://grails.org/plugin/acegi" target="_blank"><strong>Grails-Acegi</strong></a>, para autenticação e segurança<br />
<a href="http://grails.org/plugin/cookie" target="_blank"><strong>Grails-Cookie</strong></a>, para manipulação dos cookies do cliente<br />
<a href="http://grails.org/plugin/navigation" target="_blank"><strong>Grails-Navigation</strong></a> para criação de menus/submenus da interface administrativa<br />
<a href="http://grails.org/plugin/richui" target="_blank"><strong>Grails-RichUi</strong></a> para alguns componentes gráficos como auto-complete e nuvem de tags<br />
<a href="http://grails.org/plugin/runtime-logging" target="_blank"><strong>Grails-RuntimeLogging</strong></a>, um ótimo plugin para moder trabalhar com o nível de log de cada artefato (controller, service, etc), da app em runtime<br />
<a href="http://grails.org/plugin/settings" target="_blank"><strong>Grails-Settings</strong></a> para algumas parametrizações da aplicação.</p>
<p>E com certeza, se eu tivesse pesquisado com um pouco mais de tempo, teria usado outros plugins para evitar algum trabalho que tenha feito na mão. E é claro, além disso, bastante (mesmo) <a href="http://www.jquery.com" target="_blank">jquery</a>, <a href="http://pt.wikipedia.org/wiki/AJAX_%28programa%C3%A7%C3%A3o%29" target="_blank">ajax</a> e <a href="http://pt.wikipedia.org/wiki/Json" target="_blank">json</a>.</p>
<p>É isso, qualquer dúvida sobre o projeto, como aconteceu, soluções e problemas, basta comentar!</p>
<p>Obrigado a todos!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/10/portal-imobiliario-usando-groovy-e-grails/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Gerenciamento de dependências com Grape</title>
		<link>http://lucastex.com.br/2009/10/30/gerenciamento-de-dependencias-com-grape/</link>
		<comments>http://lucastex.com.br/2009/10/30/gerenciamento-de-dependencias-com-grape/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 17:47:25 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[dependencia]]></category>
		<category><![CDATA[ivy]]></category>
		<category><![CDATA[libs]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=112</guid>
		<description><![CDATA[

Mais uma maneira de se gerenciar dependências :)
Agora é a vez do Grape, um módulo construindo em Groovy que abstrai toda aquela configuração do maven/ivy que vc teria por padrão. O grande diferencial do Grape, é que ele traz essa configuração mais para perto de quem precisa dela, ou seja, no próprio código fonte!
Funciona basicamente [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F30%252Fgerenciamento-de-dependencias-com-grape%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Gerenciamento%20de%20depend%C3%AAncias%20com%20Grape%22%20%7D);"></div>
<p>Mais uma maneira de se gerenciar dependências :)</p>
<p>Agora é a vez do <a href="http://groovy.codehaus.org/Grape" target="_blank">Grape</a>, um módulo construindo em <a href="http://groovy.codehaus.org/" target="_blank">Groovy</a> que abstrai toda aquela configuração do maven/ivy que vc teria por padrão. O grande diferencial do Grape, é que ele traz essa configuração mais para perto de quem precisa dela, ou seja, no próprio código fonte!</p>
<p>Funciona basicamente assim, você anota o seu método que irá precisar da dependência com a anotação <strong>@Grab</strong> dizendo qual é o grupo, artefato e versão da biblioteca que você precisa e pronto! Quando a classe for carregada, esta anotação irá disparar o download desta dependência automaticamente. Os arquivos que são baixados via grape são guardados dentro do diretório do usuário na pasta <em>.groovy/grapes</em></p>
<p>Segue um simples exemplo que depende do commons-lang 2.4 e usa um método simples da classe StringUtils para trocar o case de uma string.</p>
<pre class="brush: groovy; title: ;">import org.apache.commons.lang.StringUtils

@Grab(group='commons-lang', module='commons-lang', version='2.4')
void testGrape() {

   def name = &quot;Lucas Frare Teixeira&quot;
   println StringUtils.swapCase(name) //lUCAS fRARE tEIXEIRA

}

//Chama a execução do método
testGrape()</pre>
<p>Veja que a únca coisa que precisamos fazer, é anotar o método com a dependência e ele fica responsável por fazer o download.</p>
<p>Mas, conversando com o <a href="http://www.twitter.com/paulosuzart" target="_blank">@paulosuzart</a> do <a href="http://codemountain.wordpress.com/" target="_blank">CodeMountain</a>, chegamos a conclusão, que sistemas de maior porte, merecem um controle de dependências mais centralizado e até por que não dizer, organizado.</p>
<p>Ou seja, fica a minha dica de uso do Grape para a distribuição de scripts e arquivos pequenos, para evitar aquela coisa chata de enviar jars, setar classpath, ou então ter arquivos pom que definem dependência e etc.</p>
<p>Para evitar esta dor de cabeça, sem dúvidas o <a href="http://groovy.codehaus.org/Grape">grape</a> é ideal!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/30/gerenciamento-de-dependencias-com-grape/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Maravilhas do Groovy: A propriedade metaClass</title>
		<link>http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/</link>
		<comments>http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 14:55:53 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maravilhas do Groovy]]></category>
		<category><![CDATA[metaClass]]></category>
		<category><![CDATA[mop]]></category>
		<category><![CDATA[slug]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=70</guid>
		<description><![CDATA[

Uma das facilidades que o groovy também traz, é a possibilidade de adicionar métodos em nossas classes em tempo de execução através da propriedade metaClass dos objetos.
Agora mesmo, eu precisava de um recurso para criar &#8220;slugs&#8221; (essas URLs amigáveis que o WordPress cria) de titulos de artigos. Tradicionalmente, o processo é criar aquelas classes **Utils.java [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F25%252Fmaravilhas-do-groovy-a-propriedade-metaclass%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Maravilhas%20do%20Groovy%3A%20A%20propriedade%20metaClass%22%20%7D);"></div>
<p>Uma das facilidades que o groovy também traz, é a possibilidade de adicionar métodos em nossas classes em tempo de execução através da propriedade <strong>metaClass</strong> dos objetos.</p>
<p>Agora mesmo, eu precisava de um recurso para criar &#8220;slugs&#8221; (essas URLs amigáveis que o WordPress cria) de titulos de artigos. Tradicionalmente, o processo é criar aquelas classes **Utils.java com todos os métodos utilitários, mas com a metaprogramação, o mais usual passa a ser adicionar o métodos nas próprias classes que geram este comportamento.</p>
<p>No exemplo abaixo, eu adicionei o método slug() em runtime dentro da classe String e a partir de agora, qualquer objeto da classe java.lang.String possui o método slug(), com o comportamento descrito abaixo.</p>
<pre class="brush: groovy; title: ;">String.metaClass.slug { -&gt;
    def s = delegate.toLowerCase()
    s = s.replaceAll(/[^a-z0-9\s-]/, &quot;&quot;).replaceAll(/\s+/, &quot; &quot;).trim()
    if (s.length() &gt; 45)
        s = s.substring(0, 45).trim()
    s.replaceAll(/\s/, &quot;-&quot;)
 }</pre>
<p>Em primeiro, definimos uma varíavel interna &#8217;s&#8217; com o valor da própria string que está sendo usada (através da propriedade <em>delegate</em>), após isso, aplicamos a primeira regex de caracteres especiais, outra para substituir os espaços em excesso e cortamos a string caso ela tenha mais que 45 caracteres. Por fim, substituímos os espaços por dashes.</p>
<p>Você pode rodar este script <a href="http://groovyconsole.appspot.com/?id=28001" target="_self">neste endereço</a>, basta clicar em &#8220;Execute script&#8221;</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Maravilhas do Groovy: Elvis Operator</title>
		<link>http://lucastex.com.br/2009/10/22/maravilhas-do-groovy-elvis-operator/</link>
		<comments>http://lucastex.com.br/2009/10/22/maravilhas-do-groovy-elvis-operator/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 14:09:42 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Maravilhas do Groovy]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=64</guid>
		<description><![CDATA[

Nova categoria de posts &#8220;Maravilhas do Groovy&#8221;, inspirada pelo MrHaki e seus posts sobre o diferencial e tricks que o groovy oferece.
O Elvis Operator é um operador em Groovy (já estará embutido no Java7) representado pelo &#8220;ponto de interrogação&#8221; seguido pelos caracteres &#8220;dois pontos&#8221; ou seja  ?:
O objetivo é fazer a comparação do valor de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F22%252Fmaravilhas-do-groovy-elvis-operator%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Maravilhas%20do%20Groovy%3A%20Elvis%20Operator%22%20%7D);"></div>
<p>Nova categoria de posts &#8220;Maravilhas do Groovy&#8221;, inspirada pelo MrHaki e seus posts sobre o diferencial e <em>tricks </em>que o groovy oferece.</p>
<p>O Elvis Operator é um operador em Groovy (já estará embutido no Java7) representado pelo &#8220;ponto de interrogação&#8221; seguido pelos caracteres &#8220;dois pontos&#8221; ou seja  <span style="color: #ff0000;"><strong>?:</strong></span></p>
<p>O objetivo é fazer a comparação do valor de uma referencia a <strong>null</strong>, para decidir sobre uma atribuição de valor. Um exemplo bem comum é comparar o um parametro que vem do request de qual página irá ser mostrada de uma lista de objetos, porém, caso a página não esteja presente, devemos sempre mostrar a primeira página.</p>
<p>Tradicionalmente, em java, com o operador ternário:</p>
<pre class="brush: java; title: ;">Integer pageParam = (...)
pageParam = (pageParam == null) ? 1 : pageparam;
</pre>
<p>Com o elvis operator, ele já faz esta comparação implicitamente e caso o valor da variável seja null, recebe o valor que está a direita do operador.</p>
<pre class="brush: groovy; title: ;">def pageParam = (...)
pageParam = pageParam ?: 1
</pre>
<p><em>&#8212; Post editado as 18:10 do dia 22/10 &#8212;</em><br />
Meu amigo <a href="http://twitter.com/paulosuzart" target="_blank">@paulosuzart</a> do <a href="http://codemountain.wordpress.com" target="_self">CodeMountain </a>fez um post sobre o Elvis Operator em Scala.<br />
A gente sabe que não existe, mas <a href="http://codemountain.wordpress.com/2009/10/22/sem-elvis-operator-crie-um/" target="_blank">ele criou um</a>. Vale a pena conferir. :)</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/22/maravilhas-do-groovy-elvis-operator/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Não tenha medo das closures</title>
		<link>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/</link>
		<comments>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 13:55:24 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[mop]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=26</guid>
		<description><![CDATA[

Você tem medo das closures? Já vi muita gente dizer que closures são perigosas e trazê-las a tona seria como acordar um monstro adormecido (o medonho GOTO &#8211; veja uma ótima definição neste link).
Não eu não concordo, closures só querem o seu bem, eis a razão.
Bom, uma closure nada mais é que um trecho de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F21%252Fnao-tenha-medo-das-closures%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22N%C3%A3o%20tenha%20medo%20das%20closures%22%20%7D);"></div>
<p>Você tem medo das <a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29">closures</a>? Já vi muita gente dizer que closures são perigosas e trazê-las a tona seria como acordar um monstro adormecido (o medonho <a href="http://i.techrepublic.com.com/blogs/goto.png">GOTO</a> &#8211; veja uma ótima definição neste link).</p>
<p>Não eu não concordo, closures só querem o seu bem, eis a razão.</p>
<p>Bom, uma closure nada mais é que um trecho de código! Mas o que difere este bloco de instruções chamado closure de um método? A grande diferença neste caso, é que as closures são um pouco mais flexíveis que os métodos, e por sua vez podem até ser passadas como parâmetro na chamada de outras funções, ou seja, podem ser atribuídas a uma variável.</p>
<p>Em <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29">java</a> não temos closures nativas na linguagem, e uma das formas de tentar alcançar o objetivo é através do uso de <a href="http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html">classes anônimas</a>, o que particularmente não me agrada muito, pela sujeira que fica no código.</p>
<p>Em um primeiro exemplo, mais simples, segue como definir uma closure, associá-la a uma variável e depois executá-la. (exemplo em <a href="http://groovy.codehaus.org/">groovy</a>).</p>
<pre class="brush: groovy; title: ;">def c = {
    println &quot;Testando o uso de uma closure&quot;
}
c.call()</pre>
<p>Este é um exemplo simples, onde a frase acima será impressa no console.</p>
<p>Para incrementarmos um pouco, podemos fazer com que nossa closure receba um parâmetro para usá-lo dentro da execução, além de criar um método que faça o uso dela. O exemplo abaixo mostra isto.</p>
<pre class="brush: groovy; title: ;">//definição da closure para dizer oi
def ola = { nome -&gt;
    println &quot;E ai ${nome}, tudo bom?&quot;
}

//definição da closure para dizer tchau
def tchau = { nome -&gt;
    println &quot;To indo ${nome}, ate a proxima!&quot;
}

//criação do método que fará o uso da closure
void falar(Closure c, String paraQuem) {
    c.call(paraQuem)
}

//invoke do método com as closures de parametro
//note que a closure é passada como se fosse uma variável qualquer
falar(ola, &quot;Fulano&quot;)
falar(tchau, &quot;Ciclano&quot;)</pre>
<p>Mas uma das maiores vantagens que eu enxergo nas closures, é a possibilidade de definição delas em runtime. Isso mesmo, conforme você programa, pode criar uma nova closure e chamar uma função que precise dela! Vemos isso em ruby e groovy com frequência para métodos onde iteramos listas e mapas.</p>
<p>Por exemplo, as listas e arrays em groovy possuem um método each que recebe uma closure como parâmetro, esta closure define o que será feito com cada um dos items da lista/array em questão. O exemplo abaixo mostra a praticidade de se fazer a definição da closure inline, ou seja, sem criar uma variável para ela antes.</p>
<p>Em groovy</p>
<pre class="brush: groovy; title: ;">//groovy
def lista = [&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;]
lista.each { equipe -&gt;
    println &quot;A equipe ${equipe} correu na #F1 em 2009&quot;
}</pre>
<p>Em ruby</p>
<pre class="brush: ruby; title: ;">
#ruby
lista = [&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;]
lista.each { |equipe|
    puts &quot;A equipe #{equipe} correu na #F1 em 2009&quot;
}
</pre>
<p>Em scala</p>
<pre class="brush: scala; title: ;">//scala
val teams = List(&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;)
teams foreach {
   team =&gt; printf(&quot;A equipe %s correu na #F1 em 2009&quot;, team)
}
</pre>
<p>Dá pra perceber que a closure foi criada já no momento em que ela foi usada. Desta maneira, além de fácil, um código muito mais limpo e fácil de ser entendido.</p>
<p>Acredite, closures são suas amigas, e estão aqui pra te ajudar, então aproveite!</p>
<p>Ahh, e fica a dica de sempre: Ler a documentação:</p>
<p>Closures em Groovy <a href="http://groovy.codehaus.org/Closures" target="_blank">(wiki)</a> <a href="http://groovy.codehaus.org/api/groovy/lang/Closure.html">(groovydoc)</a> <a href="http://groovy.codehaus.org/Closures+-+Formal+Definition" target="_blank">(definição formal)</a><br />
Closures (Proc) em Ruby <a href="http://www.ruby-doc.org/core/classes/Proc.html" target="_blank">(doc)</a> <a href="http://c2.com/cgi/wiki?BlocksInRuby" target="_blank">(wiki)</a><br />
Closures em Scala <a href="http://www.scala-lang.org/node/138" target="_blank">(wiki)</a></p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

