Criando um tipo de dados personalizado no Grails + Hibernate
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 zero — criar modelagem, tabelas e etc… — por isso é muito comum depararmos com padrões proprietários que muitas vezes não se “encaixam” 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.
Bom, vamos direto ao assunto, no meu projeto atual me deparei com um padrão que utiliza ‘S’ e ‘N’ 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.
Abaixo a implementação da classe SNUserType, não tem segredo é apenas a implementação da interface org.hibernate.usertype.UserType. Salve este código no pacote persistence na pasta de src/groovy do seu projeto Grails.
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("targetClass");
try {
targetClass = Class.forName(targetClassName);
} catch (ClassNotFoundException e) {
throw new HibernateException("Class " + targetClassName + " not found ", 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 ("S".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, "S");
} else {
ps.setString(index, "N");
}
}
}
}
Pronto, agora tudo que você precisa fazer é utilizar o novo tipo de dados no mapeamento de suas classes de domínio.
class Pessoa {
String nome
Boolean ativo
static mapping = {
ativo type: "persistence.SNUserType"
}
}
Com isso, resolvi o problema de integração e concluímos este post.
Um abraço
Volnei
Instalando o iOS 4 em seu iPhone 3G ou 3Gs
Oi pessoal,
Essa semana teve na WWDC o lançamento oficial do iPhone 4, o novo aparelho da apple, e junto com isso, também o lançamento da nova versão do sistema operacional, antigo iPhone OS, que agora é chamado de iOS, na versão 4.
A mudança de nome era fato que estava pra acontecer, já que o sistema já está sendo usado no iPad, e não fazia mais sentido o nome ‘iPhone’ nele.
Bom, o aparelho iPhone 4 veio com vários recursos legais, mas que dependem de hardware, ou seja, só conseguiremos brincar quando tivermos o aparelho em mãos, como filmagem em HD pela câmera, a tela tipo ‘retina’, que segundo o Jobs, foi a maior melhoria no iPhone, já que trouxe *muito* mais precisão e sensibilidade para a tela do iPhone, que já era simplesmente animal. Além disso, também o giroscópio, processador melhor, e outras coisas.
Já outras funcionalidades que não dependem de hardware, apenas de software (no caso, o iOS4), podem ser atualizadas pra quem tem o iPhone 3Gs, (e alguns itens dela no iPhone 3G). Ontem atualizei o meu iPhone 3Gs e estou aproveitando muito. Hoje vou atualizar o iPhone 3G da @kapiologo pra ver efetivamente o que de diferente ele vai ficar.
Recursos legais do iOS4 (alguns já em uso massivo por aqui):
- Pastas de aplicativos – Chega daquela bagunça nas páginas, agora está enfim, tudo organizado em “Jogos”, “Financeiro”, “Inutil”, “Social”, e outras categorias
- Multi-task – Enfim o tão esperado multi-task. Agora basta um duplo clique no botão home para que todos os programas que estejam abertos venham a tona, e você pode alterar entre eles sem perder tempo de recarregar ou perder o estado da app atual, muito bom mesmo.
- Novo cliente de e-mail: Com e-mails agrupados em threads, como o gmail, agora fica mais fácil acompanhar listas de discussão também.
- Bluetooth para teclados: Ainda não usei, nem sei se serviria para alguma coisa, mas vou fazer o teste hoje a noite com o teclado do iMac.
- Camera fotográfica: Zoom digital – legal, e até mantém uma qualidade bem aceitável.
- Personalização com papel de parede no home – particularmente não muda nada pra mim, mas pra quem gosta… :)
Entre outros pontos, também existem os novos softwares como um tal de “Game Center” que não vi explicações muito convincentes em lugar algum, mas me parece ser uma app no estilo do antigo GameSpy (alguém jogava quake?) ou do Steam, para os jogos do iPhone, mas não tenho certeza. Também o iBook (que não está presente ainda, acredito que virá na atualização oficial do iOS4).
Bom, só que, como o mel nem sempre é tão doce, a Apple prometeu a atualização do iOS4 pra quem tem iPhone 3G/3Gs apenas para quando o iPhone4 começar a ser vendido nos EUA, e isso será no dia 21 de junho.
Só que como o pessoal que faz parte do Developer Program da Apple já tem acesso a versão, isso acabou vazando pela internet e pode ser encontrado facilmente, só que com um detalhe: Apenas para usuários — abençoados — que possuem um Mac em casa.
Por quê? Pelo fato que só se consegue usar o ipsw do iOS4 se for atualizado a partir do iTunes 9.2, que ainda está na versão beta.
Então se você é um desses felizardos de ter um iPhone 3G/3Gs e um Mac em casa, pode correr pra instalar a nova versão.
Eu encontrei o link para baixar o beta do iTunes 9.2 pro Mac aqui: http://hotfile.com/dl/47027679/1629379/itunes_9.2_beta.dmg.html
O ipsw do iPhone 3G: http://hotfile.com/dl/47027501/b933959/iPhone12_4.0_8A293_Restore.ipsw.html
O ipsw do iPhone 3GS: http://depositfiles.com/en/files/imajjlubx (links retirados do blog Addictive Tips)
Bom, como fazer? Depois de baixar, é o procedimento normal de atualização. Execute o DMG do iTunes, e faça a instalação (mantenha sua versão do iTunes fechada durante o procedimento). Depois de instalar, abra o iTunes, e ele irá atualizar toda sua Library, esse processo demorou uns 5 minutos em minha library com 50gb aproximadamente.
Depois, é sempre bom dar uma verificada se a versão foi instalada corretamente, então vá no ‘About iTunes’, no menu para checar se está com a 9.2 e pronto.
Conecte seu iPhone no Mac, após o iTunes reconhecê-lo, faça o backup do seu aparelho (botão direito no item iPhone -> backup).
Selecione o iPhone no menu esquerdo e na direita existirá uma opção “UPDATE”, clique nesta opção com a tecla “ALT-OPTION” do Mac pressionada, e uma janela de localização de arquivo será aberta. Basta agora selecionar o firmware ipsw para o modelo do seu aparelho que você baixou, e aguardar a instalação.
No final, o backup será restaurado, e o iPhone pronto para ser usado.
Incrível :)
Palestra sobre Grails, meus agradecimentos
Como postado antes, ontem falei sobre Grails no SESTINFO – “Grails: Java produtivo e divertido”, evento aberto da UMESP (Universidade Metodista de São Paulo).
O evento foi incrível, com muita gente presente. O último número que recebi é que tinham 98 pessoas na sala assistindo e mais dois professores. Ainda depois do início da palestra cerca de 15 a 20 pessoas chegaram mas não puderam entrar pelo limite de pessoas na sala.
Pra quem não pode estar presente, comecei a apresentação falando de groovy e fazendo um paralelo de uma aplicação Java e a mesma em Groovy, passo-a-passo mostrando os benefícios e vantagens que o groovy pode trazer para o desenvolvimento (o antigo caso do seletor de palavras).
Tentei deixar bem claro o tempo inteiro que o importante é gastarmos tempo *PENSANDO* em resolver o problema e não tentando aprender e entender como a linguagem de programação funciona.
Logo depois, passei por vários pontos do Grails, tentando mostrar como ele trazia os benfícios do Groovy para o desenvolvimento web. Passei pelo GORM (mapeamento objeto-relacional dinâmico), plugins, convenções e vários outros pontos. Pra encerrar a parte teórica, deixei alguns links e sites interessantes para que o pessoal pudesse consultar além de oferecer para os presentes cupons de desconto para a GroovyMag, revista focada em desenvolvimento Groovy e Grails.
Ao fim, apresentei uma aplicação simples, desenvolvida em bem pouco tempo que funcionava como um ‘twitter wall’, ou seja, fazendo buscas automaticamente no twitter de palavras previamente cadastradas, inclusive capturando automaticamente tweets do pessoal que estavam assistindo a palestra e twittando… :)
Bom, como eu já falei, foi muito bom, e além de satisfeito, fiquei muito agradecido, então não posso deixar de agradecer:
Principalmente ao Prof. Mauro Schneider (@muschneider), professor da Universidade que me fez o convite e viabilizou tudo isso, a Universidade não só o meu agradecimento, mas também os meus parabéns pelo ótimo evento. Aos meus amigos que me confirmara, e foram me apoiar e ajudar, Emerson (@erbernardino), Paulo (@paulosuzart), Leonardo (@leonardofigs), Rafael (@rafaelfelini), Luca (@lucabastos) e Jailton (@jailton). Ao Jailton, não só pela presença, mas também pelo apoio divulgando o evento na lista do SOUJava.
Pra quem quiser, a apresentação segue abaixo. E também 2 repositórios que criei no github, um com os fontes do projeto apresentado, e outro com a apresentação em HTML.
Repositório da apresentação: http://github.com/lucastex/slides-grails-umesp
Repositório dos fontes do projeto: http://github.com/lucastex/projeto-grails-umesp
Lucas
Palestra aberta de Grails na Universidade Metodista
Pra quem estará em São Paulo na próxima terça-feira, eu irei apresentar uma palestra sobre Grails na SESTINFO – Semana de Estudos em Tecnologia da Universidade Metodista de São Paulo.
O título da palestra será – “Grails – Java produtivo e divertido” e a entrada é liberada para quem quiser assistir. Vou falar de Groovy e Grails além da comunidade envolvida em torno dessas tecnologias. E ao final da apresentação, vou fazer algum hands on com o pessoal, desenvolvendo uma aplicação live com todos.
Divulgue em suas listas de discussões, empresa, amigos e inimigos, aproveitem que a entrada é liberada!
Data: 25 de maio
Horário: A partir das 19:00
Local: Universidade Metodista
Endereço: Rua Alfeu Tavares, 149 – Rudge Ramos – São Bernardo do Campo – SP
Depois da palestra, vou divulgar os slides e os fontes do hands on aqui no blog.
Ajude a divulgar, retwittando esta mensagem: http://twitter.com/lucastex/status/14333780136
[Atualizado!]
Vou distribuir uma edição grátis da Groovy Magazine (groovymag.com) para cada pessoa presente no local, compareça!
Usando o textmate como editor de texto padrão do Mac
Uma coisa bem chata que acontece, é que quando tentava abrir arquivos com a extensão txt no Mac, sempre abria o TextEdit, o editor padrão do Mac OS.
É um editor muito simples e pouco funcional, o que me fazia todas as vezes buscar o textmate para editar e trabalhar com os arquivos. Resolvi definir ele como padrão da seguinte forma
- Localize algum arquivo com a extensão que quer mudar (no meu caso, .txt)
- Vá em propriedades deste arquivo (ou selecione-o e aperte cmd+I)
- Na ‘aba’ “Open with”, selecione o programa que deseja usar
- Selecione o botão “Change All” para setar como padrão para todos os arquivos deste tipo.
Pronto, agora os arquivos TXT serão abertos diretamente no Textmate!
Plugin grails para calcular valor de frete dos correios
Acabei de lancar um novo plugin grails.
Este calcula o valor do envio de uma encomenda através dos Correios. Contempla SEDEX, SEDEX 10, SEDEX a cobrar e outros. O texto explicativo está bem simples e legal, e está no github junto com os fontes:
http://github.com/lucastex/correios-br
Mesmo os fontes no github, você pode instalar o plugin usando o comando padrão do grails:
grails install-plugin correios-br
Deem uma olhada nos docs do github, vale a pena!
Google agora analisa a velocidade dos sites
O google iniciou no fim da semana passado com mais um fator de relevância para indexação e rankeamento dos sites que são retornados por ele. Por incrível que pareça, “velocidade do site” agora também conta.
Isso impacta diratamente em arquivos e chamadas externas do site (imagens, css, js), e traz a tona com MUITA importância um assunto que já estava ganhando foco nos ultimos tempos que é a otimização dos sites. Otimização de tudo, desde tamanho de imagens, estrutura de HTML bem formatado, compactação de JS, união de estilos e funções JS em menos arquivos e etc.
Este recurso entrou em uso no Google.com, e ainda está no famoso “beta” do google. Em algum tempo, conforme for ganhando maturidade, será estendido a todos outros, incluindo Brasil. Vou deixar aqui o link oficial do anuncio pra que quem esteja interessado possa ler, e também ver as dicas de frameworks e tecnologias que o google recomenda para este trabalho de otimização.
http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html
:)
Unboxing do meu iMac de 27″
Enfim chegou meu novo PC. Faz um tempo já que estava adiando comprar um computador de mesa para desenvolver e ficar mais a vontade em casa. Com o uso intensivo apenas de notebook a alguns anos, meu pescoço e minhas costas começaram a reclamar feio esse ano.
Resolvi aproveitar a promoção de lançamento do site do carrefour, que dava 20% de desconto em qualquer produto do site e comprei o tão sonhado iMac de 27″. 20% de desconto em cima do preço da Apple Store fez uma grande diferença, pode acreditar :) Cheguei de viagem este fim de semana e enfim hoje uma notícia boa, chegou meu iMac. :)
Ponto mega-positivo: Tela. Não podia imaginar a qualidade desse display de LED. É fantástico. Em relação a tamanho, já estava usando um Samsung de 24″, mas o brilho, a definição do display de LED da Apple é fora de sério. Tirando ainda a resolução alcançada, de 2560 por 1440.
Preciso agora encontrar uma maneira efetiva de manter um sincronismo REAL entre os dados do iMac e do MacBook. Não queria nem algo web-based como dropbox ou sugarsync, seria alguma coisa normal mesmo, talvez até quem sabe um rsync possa ajudar. Se você tiver alguma opinião ou sugestão, me salve :)
Sobre o problema de flickering reportado por aí a alguns meses, achei que pudesse estragar a minha alegria, mas não, logo que liguei, junto com as atualizações, já veio um firmware do LED pra deixar tudo OK. :)
Segue algumas fotos do unboxing.
Como, e por que usar um DataSource JNDI.
Recebi uma pergunta esses dias por aqui.
Lucas,
gostaria de saber como trabalhar com arquivos .properties pra conexão com o banco de dados.
No Grails a gente nota que a conexão fica no código-fonte (DataSorce.class)…
Estou tentando descobrir como faço para ter um arquivo de propriedade com os parametros da conexão. Caso eu precise apontar para outro banco, não terei que recoompilar tudo.
production {
dataSource {
jndiName = "<nome_datasource>"
}
}
[GSolr] Beans declarados automagicamente
GSolr, é o nome do plugin de solr que estamos fazendo de solr para grails. Para quem quiser acompanhar o trabalho, o repositório está no github: http://github.com/lucastex/gsolr.
Uma coisa que já está feita é a leitura da configuração do gsolr e a declaração mágica de beans, um para cada servidor solr que estiver configurado. Exemplificando, vamos imaginar que a configuração esteja declarando três servidores Solr que serão consultados:
gsolr {
solr {
produtos {
(...)
}
noticias {
(...)
}
usuarios {
(...)
}
}
}
Particularmente, achei bem interessante usar o nome da closure para o nome do servidor ao invés de termos um atributo name = produtos :)
A mágica legal mesmo, é que o plugin vai ler esta configuração quando a aplicação for para o ar, e depois disso irá declarar / criar beans spring dinâmicamente, usando a Spring DSL. E os beans vão ter no nome a declaração feita na closure do usuário.
Ou seja, para os servidores solr declarados acima, o plugin irá declarar os Spring Beans produtosGSolr, noticiasGSolr e usuariosGSolr .
Desta maneira, vamos garantir que se você quiser o usar o plugin, o processo como um todo ficará o menos intrusivo possível, e você poderá usar os métodos (de pesquisa e outros) do GSolr apenas injetando o bean do servidor Solr que você quiser.
class PesquisaService {
def noticiasGSolr
def pesquisar = {
(...)
}
}
Achei no mínimo, muito prático. Tudo isso graças a Spring DSL que temos em groovy. Com um pouco mais de tempo, coloco o procedimento passo a passo para declarar os beans desta maneira. Enquanto isso, conheça um pouco mais sobre a Spring DSL aqui, ou veja o código fonte aqui e também aqui.
Tem alguma idéia ou sugestão para o plugin? Deixe um comentário!






















