Sunday, August 26, 2012

Framework Occam

Occam

Apresentação

Occam é um framework web acadêmico desenvolvido como um trabalho em grupo do curso de Tecnologias e Arquiteturas na Construção de Software do SENAC. A disciplina era a de Design Arquitetural de Software OO e como trabalho final, toda a turma foi envolvida na construção de uma aplicação web. Foram divididos três grupos para construir essa aplicação web. Um dos grupos, no qual me encontrava, era para fazer o framework web. Surgia assim o framework Occam.

Como requisitos para a construção do framework, foram listados:

  • Injeção de Dependências
  • Inversão de Controle

De posse dos requisitos, comecei a pensar em como construir o framework. A primeira coisa que pensei foi:  "Devo fazer o mais simples possível!". Daí o nome: Occam em homenagem à Navalha de Occam, como na citação extraída da Wikipedia:
Se em tudo o mais forem idênticas as várias explicações de um fenômeno, a mais simples é a melhor

Conceitos


Comecei a me lembrar de todos os frameworks web com os quais já trabalhei e pensei na tecnologia PUSH. Como algo simples, pensei em imitar o STRUTS com um servlet que processa todas as chamadas de um padrão URL. O que está depois dessa porta de entrada é o mais interessante.

Porta de Entrada

No framework, tudo é uma Operacao. Seu POJO é anotado com @Operation, transformando em uma operação do Occam. O desenvolvedor ainda pode configurar se a Operação que está desenvolvendo é SINGLETON, ou seja, possui uma instancia única durante o tempo de execução do sistema, ou PROTOTYPE, ou seja, a cada request, cria uma nova instância da classe de Operação.

Ainda na Operação, cada atributo da classe pode mapear os atributos do formulário da página da web. Para que isso aconteça, seus atributos devem estar anotados com @Bean. Na parte Campos do formulário explico melhor como essa mágica acontece.

Convencionei que todas as ações do formulários fossem operacao.metodo, onde  metodo é um método da classe da operação e tiver a anotação @NavigationCases, que irá realizar o redirecionamento correto conforme a execução correta ou não do método. Outra regra é que ele não pode ter parâmetros.

A ideia da anotação @NavigationCases é o de redirecionar a navegação para uma página quando  o processo finaliza com sucesso ou quando finaliza com falha. Desse modo, o desenvolvedor somente precisa configurar nesse ponto o redirecionamento.

Para completar a parte de entrada, o desenvolvedor deve configurar pelo menos um arquivo XML para que o framework encontre as operações desenvolvidas. O arquivo é o operation.xml e deve estar localizado no diretório WEB-INF junto com o arquivo WEB.XML. A raiz do arquivo é representada pela tag operations e possui tags filhas operation. Cada operation possui os atributos name com o nome da operação, que é mapeada para a operacao da action do formulário, e class que é a implementação dessa operação.

Com isso, finaliza a porta de entrada do Framework.

Servlet

Para o imitar o STRUTS, foi necessário criar um servlet, que escuta todas as requisições no padrão url   /occam/operacao.metodo. O servlet obtém o substring e orquestra, por meio de um facade o fluxo do framework.

Após a conclusão do processo, é responsável também por fazer o redirecionamento correto.

O desenvolvedor não precisa se preocupar em declarar o servlet no WEB.XML, pois o projeto occam-servlet foi pensado como um web-fragment, que necessita declarar no arquivo web-fragment.xml todos os servlets, filters e outros recursos de aplicação web java. Esse recurso está disponível no Java EE6. Basta somente instalar em um servidor de aplicações Java EE6 que o servlet já é carregado.

Injeção de Dependências

Esta parte do framework é basicamente representado por um Service Locator.  O servlet carrega o arquivo de configuração e passa uma URL e o nome da operação para o Service Locator, que implementa o padrão de projeto Singleton. A principal responsabilidade é de procurar a classe daquela operação em um HashMap interno e, se for necessário, criar uma instância dessa classe.

Ao criar a instância da classe, o Service Locator irá buscar a tag @Operation para verificar a estratégia de instância. Se a estratégia for SINGLETON, a instância da classe será armazenada no HashMap interno, senão (PROTOTYPE), irá resolver as dependências anotadas com @Inject do Java EE6 e retornar a instância para o servlet.

Campos do formulário

Antes da execução do método, o framework irá carregar os dados do formulário para os atributos que estiverem anotados com @Bean da instância da classe resolvida pelo Service Locator. O servlet irá passar um HashMap de Strings que representam os campos e os valores do formulário.

Para cada tipo primitivo existe uma classe mapeada para fazer a conversão. Existe também uma classe mapeada para o tipo String e para o tipo Date, que em particular atende a somente um formato.

Para que não houvessem problemas na conversão dos dados, a direção da conversão sempre é dos dados do formulário para os campos Bean. Assim, pode-se eliminar o problema de Nullpointers, mas ainda existe o problema de NoSuchFieldException.

Execução do Método

Basicamente, o executor de método invoca o método definido na action do formulário dentro de um try-catch. Se houver algum problema, o framework irá redirecionar para a página de erro definido no método da Operação na annotation NavigationCases do caso FAIL.

O contrário acontece quando o método é executado com sucesso. O que mais acontece nesse caso é que se existir um retorno, esse objeto será registrado na request.

The Return of the Request (aka Response)

Após a execução do método, ocorrendo ou não com sucesso, o framework lerá o valor da annotation NavigationCases e irá redirecionar para o caso adequado. Se a execução falhou, será redirecionado para a URL de erro, senão para a de sucesso com o retorno na request, se o método tem algo para retornar.

O detalhe é que o retorno será salvo na request com o nome de bean. O desenvolvedor deve lembrar de usar o tipo correto do retorno quando utilizar a tag jsp:useBean.

Com isso termino de explicar como funciona o framework Occam. Espero que tenha despertado em alguém o interesse por fazer um exemplo.

Para baixar acesse os links a seguir:

occam-servlet - O servlet
occam-infra - O pacote de infra-estrutura
occam - O arquivo JAR que deve ser incorporado no projeto

Existe ainda um tutorial que explica passo a passo a construção de uma aplicação básica com o framework.

Existem dois exemplos:

Calculadora: Uma calculadora simples
Hello, World: O exemplo que não podia faltar!

Por que usar Occam?


  • Framework leve
  • Fácil de configurar
  • Fácil de implementar
  • Free!

Por que NÃO usar Occam?


  • Possui falhas
  • Não possui um sistema de Exceptions muito bem definido
  • O Service Locator não clona instâncias, portanto instâncias são reutilizadas
  • Não possui um conversor para Array
  • O conversor de datas não permite outro formato
  • Não possui redirecionamentos customizados
  • É acadêmico e não sei quando darei manutenção nele
  • Mais um framework web, pra quê?

Algumas outras coisas...

Vocês estão convidados a usar, criticar, xingar e olhar o código.

Friday, December 30, 2011

Feliz new Year();

Assim como no natal, desejo à todos os poucos, mas fiéis visitantes deste blog, um feliz ano novo. E, por favor, não abram o Eclipse ou a IDE de sua preferência na virada! Vão para fora de casa e curtam a noite de domingo!

Até++;

Friday, December 23, 2011

Feliz Natal!

Eu desejo à todos os poucos visitantes do meu blog, um Feliz Natal. Deixem um pouco o teclado, as classes, as interfaces, os padrões de projetos, enfim... Façam a ceia e comemorem o Natal com aqueles parentes que você vê pelo menos uma vez só por ano.

Feliz Natal!
até++;

Tuesday, December 20, 2011

Meus projetos Open Source

Como programador Java, tenho uma workspace no meu Eclipse somente para aquelas idéias mirabolantes, ou testes de APIs nas quais eu trabalho e também que quero testar. Acontece que de vez em quando algum teste ou alguma idéia me inspira. Então um projeto surge dessas idéias ou desses testes. Nisso, três dessas idéias geraram projetos no SourceForge.

Meus projetos são:

JavaWizard: Não é um projeto para instalar arquivos, mas pode ser usado para essa finalidade. É um framework que gera um JPanel e tem um xml que controla o fluxo. Faz um bom tempo que esse framework está no ar sem manutenção e a última coisa que eu fiz para esse projeto foi organizar as pastas para conter várias versões e uma versão estável de base.

JDM - Java Download Manager: É um projeto em swing que faz downloads simultâneos de arquivos. Achei interessante o projeto visto que existem poucos projetos em java que fazem isso. É um projeto simples, mas funciona muito bem. Em algumas ocasiões eu preciso dele. O problema que é meio chato de cadastrar os downloads, deveria ser mais configurável e deveria ter uma interface mais bonita.

WebDice - É um framework de rolagem de dados para jogadores de RPG e mestres de mesa programadores.  Ou seja, é para um público extremamente restrito. Ou não! É um framework web e utiliza DWR para calcular a rolagem dos dados. Foi iniciado o desenvolvimento de uma segunda versão, para retornar arrays de inteiros para os resultados das rolagens, porém alguns problemas aconteceram.

Ainda tenho um projeto chamado JLabirynth que era para ser um joguinho de labirinto em Java, mas não publiquei nenhum código fonte, pois fui postergando o desenvolvimento até não ter mais oportunidade e a inspiração fugir da minha cabeça, mas ainda tenho a idéia desse joguinho na minha cabeça. Futuramente posso tentar discutir sobre ele no blog.

Minha idéia é a de escolher um desses projetos a cada semana, discutir sobre as minhas escolhas de desenvolvimento, criticar o meu código e melhorá-lo, e por fim, se der certo, lançar uma segunda versão melhorada. Se for possível documentar o fluxo principal com diagramas de classe e de sequência.

Espero que façam download das minhas criações e possam deliciar enquanto não corrijo nem documento o código.

Até a próxima!

Saturday, December 17, 2011

Caelum lança livro de Introdução à Arquitetura e Design de Software

Dia 15/12/2011 a Caelum lançou seu livro de Introdução à Arquitetura e Design de Software inspirado no curso FJ-91. O livro é publicado pela Elsevier e pela Editora Campus e está a venda na Saraiva. O acabamento é com capa dura e ainda terá sua versão ePub. Vale a pena conferir!

Post no blog da Caelum | Site Oficial

Friday, December 2, 2011

Em 1991, nos laboratórios da Stanford University Network...

Em 1991, nos laboratórios da Stanford University Network, nascia a idéia de uma linguagem portável, que rodasse em dispositivos e orientada a objetos. Surgia a idéia da linguagem Oak. Após cinco anos de análise e desenvolvimento, surge então a liguagem de programação orientada a objetos Java. Por problemas de registro, o nome da linguagem foi modificado.

Hoje, milhares de empresas e desenvolvedores no mundo inteiro utilizam a linguagem para criar suas aplicações. A linguagem java possibilitou a criação de softwares comerciais, frameworks, servidores de aplicação, entre outros milhões de aplicação para diversas camadas da sociedade: governo, comercial, industrial, comunidade científica, etc...

Este blog tem a intenção de discutir alguns tópicos de Java e mostrar mais do universo da Linguagem de Programação e Orientação a Objetos.

Aguarde por novidades!

Paulo Henrique Ortolan