Maravilhas do Groovy: A propriedade metaClass
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 “slugs” (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.
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.
String.metaClass.slug { ->
def s = delegate.toLowerCase()
s = s.replaceAll(/[^a-z0-9\s-]/, "").replaceAll(/\s+/, " ").trim()
if (s.length() > 45)
s = s.substring(0, 45).trim()
s.replaceAll(/\s/, "-")
}
Em primeiro, definimos uma varíavel interna ’s’ com o valor da própria string que está sendo usada (através da propriedade delegate), 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.
Você pode rodar este script neste endereço, basta clicar em “Execute script”
Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx
Lucas Teixeira
25 Oct 09 at 12:57
Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (via @lucastex)
Paulo Suzart
25 Oct 09 at 13:02
RT: @lucastex: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx
Erico Marineli
25 Oct 09 at 13:20
[...] This post was mentioned on Twitter by Lucas Teixeira and Paulo Suzart, Erico Marineli. Erico Marineli said: RT: @lucastex: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx [...]
Tweets that mention Maravilhas do Groovy: A propriedade metaClass at Lucas Teixeira -- Topsy.com
25 Oct 09 at 13:21
Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx
lucastex
25 Oct 09 at 12:57
Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (via @lucastex)
paulosuzart
25 Oct 09 at 13:02
RT: @lucastex: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx
emarineli
25 Oct 09 at 13:20
Repostando: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (Por favor RT)
Lucas Teixeira
26 Oct 09 at 14:19
RT @lucastex: Repostando: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (Por favor RT)
Erico Marineli
26 Oct 09 at 14:21
Repostando: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (Por favor RT)
lucastex
26 Oct 09 at 14:19
RT @lucastex: Repostando: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (Por favor RT)
emarineli
26 Oct 09 at 14:21
[...] não é nada além de um conjunto de regexes encadeadas com uma ajudinha do StringEscapeUtils (que saudade deste post) do [...]
Criando um Transformer customizado para o Solr at Lucas Teixeira
26 Oct 09 at 19:00