O OmniFaces é uma biblioteca de utilitários que busca facilitar o desenvolvimento JSF para aplicações corporativas. Foi criada por Bauke Scholtz (ou BalusC) e Arjan Tijms, colaboradores regulares no popular site Stack Overflow de perguntas e respostas. O duo implementou o OmniFaces após perceber alguns problemas comuns do JSF 2.x nas questões do fórum.
Apesar do nome, o OmniFaces não é outra implementação do JSF; o projeto complementa as bibliotecas JSF existentes com várias classes auxiliares e soluções para problemas específicos. A amostra de componentes no site de demonstração do OmniFaces (live showcase), por exemplo, é baseada no PrimeFaces.
A biblioteca OmniFaces tem uma extensa lista de funcionalidades que inclui:
- Destaque de campos que falharam na validação;
- Importação de valores de constantes para dentro do escopo da EL (Expression Language);
- Conversão automática de objetos do modelo em drop-downs e outros componentes de seleção;
- Validadores multi-campos para valores como "todos ou nenhum", "todos iguais", "um ou mais" e "em ordem", além de validações de "valor único";
- RenderKit HTML5, que adiciona suporte a diversos atributos específicos do HTML5 para componentes UIForm e UIInput;
- Manipulador de exceções Ajax: uma página de erro será exibida quando uma exceção ocorrer durante uma solicitação Ajax do JSF;
- Árvore com código de marcação personalizado por nível (utilizável para vários casos de uso recursivos);
- Coleções de funções da EL para lidar com arrays, conversões, datas e strings;
- Filtro de compressão GZIP para respostas HTTP;
- Funcionalidades para inclusão de Servlets e páginas JSP no Facelets.
O InfoQ.com falou com os autores do OmniFaces: quanto às razões para a criação da biblioteca, ressaltam que o JSF carecia de um equivalente do Apache Commons ou Google Guava, de modo que "cada empresa ou desenvolvedor de aplicações web em JSF desenvolve seu próprio conjunto de utilitários, o que é demorado e sujeito a erros". Os autores também apontam que há uma série de necessidades recorrentes em aplicações JSF, como "fazer o reset de componentes de entrada inválidos mas não processados, antes de uma atualização Ajax; ou ter um manipulador de exceções 100% Ajax que usa o mecanismo de páginas de erros padrão do web.xml, ou ainda a necessidade de um conversor genérico para itens de drop-downs ".
Falamos também sobre como OmniFaces se compara com as bibliotecas JSF existentes, como PrimeFaces, RichFaces e IceFaces:
O OmniFaces não oferece componentes realmente visuais, com renderizadores personalizados, para oferecer um visual/funcionamento sofisticado. Em vez disso, os componentes e Tag Handlers do OmniFaces aprimoram os principais componentes e Tag Handlers JSF existentes, como f:viewParam, f:converter, f:validator, h:form e h:outputLabel.
O OmniFaces também oferece uma série de utilitários reutilizáveis para tornar o desenvolvimento JSF mais fácil, sem a necessidade de reinventar a roda. Isto não é oferecido pelas demais bibliotecas. As bibliotecas PrimeFaces, RichFaces e IceFaces parecem todas se concentrar nos componentes visuais (widgets); já o OmniFaces se concentra em utilitários e soluções alternativas para preencher lacunas ou solucionar problemas do JSF.
InfoQ: Não seria possível melhorar um dos frameworks JSF existentes em vez de criar um novo?
Teoricamente poderíamos sim, mas preferimos não fazer. Pretendemos desenvolver uma biblioteca de utilitários, utilizável em toda aplicação web JSF. Uma exceção é uma solução alternativa para o RichFaces que criamos, no ResetInputAjaxActionListener, devido a um bug não resolvido na implementação do RichFaces do PartialViewContext.
InfoQ: Quais foram os problemas ou perguntas recorrentes que vocês viram no Stack Overflow e que orientaram o projeto?
Exemplos de temas foram a necessidade de um componente de árvore sem uso de código de marcação; a estratégia estranha de utilizar comentários condicionais do IE; a necessidade de um conversor no f:selectItems que converte apenas os elementos fornecidos, em vez de fazer chamadas dispendiosas ao DAO; a necessidade de reset dos campos de entrada invalidados em uma solicitação Ajax anterior mas que precisam ser atualizados na requisição Ajax atual; um manipulador de exceções Ajax... Bem, vimos de tudo.
No momento, nosso planejamento é determinado principalmente pelos problemas que os usuários observam com o JSF. Não sentamos e definimos um plano do que gostaríamos e fazer; tentamos reagir a problemas da vida real. Essa forma de trabalhar não é imutável, podemos apresentar algumas funcionalidades em alguns pontos de nossa escolha. Mas no momento o foco é em resolver os problemas das pessoas.
O OmniFaces está na versão 1.1. Para mais informações, consulte o blog, o Javadoc e informações da biblioteca de tags do projeto.