domingo, 22 de novembro de 2009

Merlin para web com GWT

Primeiro, a imagem:

Agora, o texto:

Desde que troquei as minhas funções diárias de arquiteto de soluções por gerente de projetos, meu tempo disponível para projetar e implementar de aplicações e frameworks praticamente desapareceu.

Houve épocas que fiquei mais de mes sem abrir o meu (inchado de plugins) Eclipse. Uma dor.

Mas ei que a vontade de programar é grande, e neste fim de semana voltei a um tópico que há muito eu queria explorar: a versão Web do Merlin.

Abaixo as taglibs, viva o GWT!

Detesto XML. E o mesmo vale para frameworks UI que usam conceitos relacionados, baseados em taglibs e coisas afim. Logo, pensar em usar JSF para implementar o Merlin é meio que ir contra os meus princípios (bom, pelo menos da forma nativa; posso falar nisso outra hora...).

Desde que vi os primeiros esboços do GWT, eu adorei. Usar código Java puro para desenvolver telas é, simplesmente, coisiboa!

Porém, o GWT tem limitações (várias, para dizer a verdade) e, delas, a ausência de reflection é um empencilho grande para o Merlin.

Felizmente, boas almas acabam criando meios para os outros poderem avançar, e nisso, projetos como o Gwt-ent, Gwittir, SmartGwt são uma mão na roda para o Merlin.

Não vou entrar (ainda) no mérito de todos eles, mas o Gwt-ent é o foco aqui.

Gwt-ent

Vou fazer uma analogia: Sabem a API Mirror do JDK, aquela que faz parte do Annotation Processing Tool (APT)? Bem, considero o GWT-Ent e outros semelhantes a mesma coisa.

Em outras palavras, pelo que entendi, o GWT-Ent e coisas afimm processam as classes Java que precisam sofrer reflexão (que precisam implementar uma interface em específico - vide abaixo), e a partir disso, geram meta-informações que são acopladas aos bytecodes finais.

Assim, esses frameworks conseguem simular acesso reflexivo no lado cliente em tempo de execução, quando o código está, na verdade, sendo executado em Javascript no browser.

Na prática, a idéia é simples, mas ao olhar o SVN dos caras realmente tiro o chapéu, visto que é um monte de código burocrático e repetivito.

As Possibilidades

Agora, com meu primeiro exemplo funcionando, desperto a fagulha de implementar a versão Web do Merlin com GWT.

É claro, que a imagem acima mostra apenas o uso da "pseudo reflexão" para acesso simples a propriedades e métodos acessores.

Para chegar a coisas complexas, como Injeção de Dependências, inserção de Agentes e Configuração Realimentada (que é a base do Merlin) o caminho é longo.

Mas eis que demos o primeiro passso.

O Futuro

E o que vem agora?

Bem, primeiro achar uma forma para injetar a interface Reflection ou a anotação @Reflectable automaticamente nas classes que precisam sofrer a reflexão, ou seja, no mínimo, todas as que foram o Modelo de Domínio do sistema.

Imagino fazer isso via uma biblioteca CGLib ou então usar o (adoro ele) Javassist, pensando já (como meu amigo J.) em alguma Task do Ant ou então um plugin para o Maven.

O mundo é grande e a caminhada é longa. Espero que me sobrem muitos finais de semana para trabalhar ainda.

At+