OmniFaces は,エンタープライズアプリケーションの JSF 開発を容易する目的を持ったユーティリティライブラリである。Bauke Scholtz (別名 BalusC) と Arjan Tijms 両氏の開発によるものだ。人気の QA サイト Stack Overflow の常連回答者である両氏は,同サイトに JSF 2.x 関連の同じ質問が何度も掲載されていることに気付き,その後 OmniFaces を開発した。ただしその名称とは裏腹に,OmniFaces は JSF を再実装したものではない。特定の問題向けにいくつかのヘルパあるいはソリューションを提供することで,JSF ライブラリを補完するものだ。事実 ライブショーケース では,PrimeFaces がベースとして使用されている。
OmniFaces ライブラリには,実装機能の膨大なリストがある。
- バリデーションエラーになった フィールドの強調表示 機能。
- EL スコープへの定数インポート。
- ドロップダウンなど選択コンポーネントの モデルオブジェクトを自動変換 する機能。
- マルチフィールドバリデータ。"すべて/なし", "すべて等しい", "ひとつ/複数", "すべて正常", "ユニーク" などといったバリデーションを行う。
- HTML5 レンダラ・キット。HTML5 特有の属性サポートを UIForm および UIInput コンポーネントに追加する。
- 完全な Ajax 例外ハンドラ。
- レベル単位の完全カスタム対応マークアップを備えた ツリー (さまざまな再帰的ユースケースで使用可能)。
- 配列,変換,日付,文字列などを扱う EL 関数のコレクション。
- HTTP レスポンス用 GZIP 圧縮フィルタ。
- Servlet と JSP Pages を Facelet に追加。
さらに説明を聞くために,InfoQ は OmniFaces の2人の作者にコンタクトを取った。インタビューはライブラリの開発理由に関する話題から始まった。氏らが指摘したのは,JSF に Apache Commons あるいは Guava に相当するものが存在しないという点だ,その結果,"すべての企業や JSF Web アプリケーション開発者が,自分自身でユーティリティを作成しなければなりません。最初の開発時には時間の浪費にもなりますし,エラーも頻繁に発生します。" さらに氏らは,JSF アプリケーションに同じ課題が繰り返し発生している点も指摘した。例えば "Ajax を更新する前に無効あるいは未処理のコンポーネントを初期化したい",あるいは "標準的な web.xml エラーページの機構を用いて Ajax 完全対応の例外ハンドラを実装したい", "ドロップダウンの項目に対応する汎用コンバータ" といったものだ。
JSF ライブラリには PrimeFaces や RichFaces, ICEFaces など, すでに多数のものが存在している。OmniFaces に関する次の話題は,それらとの比較になった。
OmniFaces では,カスタムレンダラ (CSS や JS を生成することで,しゃれたルック・アンド・フィールや拡張動作を実現するような) を持ったビジュアルコンポーネントは提供していません。OmniFaces のコンポーネントやタグハンドラは,既存のコア JSF コンポーネントやタグハンドラを拡張したものなのです。f:viewParam や f:converter, f:validator, h:form, h:outputLabel といったものです。
コンポーネントとタグハンドラ以外にも,再利用可能なユーティリティを多数提供しています。これは他のライブラリにはないもので,車輪を再発明するような作業を不要にすることで,JSF 開発をより簡単にします。
PrimeFaces や RichFaces,ICEFaces などのライブラリは,どれも視覚的なコンポーネント (ウィジェット) に重きを置いているようですが,OmniFaces はユーティリティの提供や,JSF の欠点と問題点の回避手段により力を注いでいるのです。先の3つが JSF コンポーネントライブラリで,OmniFaces は JSF ユーティリティライブラリである,と言ってもよいでしょう。
InfoQ: 新たなライブラリを開発する代わりに,既存の JSF フレームワークを拡張する,という選択肢はなかったのでしょうか。
理屈の上では可能ですが,私たちはそうはしませんでした。すべての JSF web アプリケーションで利用可能なユーティリティライブラリを作りたいと思っていたからです。ただし RichFaces の PartialViewContext 実装に未解決なバグがあったため, ResetInputAjaxActionListener には RichFaces 特有の回避コードがあります。
InfoQ: Stack Overflow サイトで見た,繰り返し発生している問題あるいは質問というのは,どのようなものだったのでしょう。
マークアップの不要なツリーコンポーネントへの要望,IE の条件付きコメントの扱いにくさ,設定された項目を高価な DAO コールを行わずに変換可能な f:selectitems コンバータの要望,前回バリデーションでエラーとなったが,現在のバリデーションで更新の必要な入力処理のリセット実行,Ajax 対応の例外ハンドラなど,それこそ数限りなくあります。
現時点でのロードマップは,ユーザが JSF に対して抱いている問題点によってほぼ決定されています。つまり私たちは,自分たちのやりたいことを机上で計画しているのではなく,現実に発生している問題に対応しているのです。この方法がが絶対的ということではありません。私たちが適切と考えれば,ある時点で特定の機能を導入することもあるでしょう。しかし今のところは,ユーザの問題を解決するというのがすべてですね。
InfoQ: その他,InfoQ 読者に伝えておきたいと思うことはありますか。
特に強調しておきたいことがあるとすれば,私たちは PrimeFaces (あるいは RichFaces) との競合を目指しているわけではない,という点です。それどころか,私たちは PrimeFaces の大ファンで,関係しているビジネスアプリケーション開発では日常的に利用している位なのです。OminiFaces を紹介するアプリケーションには, PrimeFaces を使ってビルドされていることが右上に明記されています。この事実からも十分に分かって頂けるものと思っています。
OmniFaces は バージョン 1.0 (追記: バージョン 1.1 ) がリリース済みで,Maven を通じて入手することができる。詳細については ブログ や Javadoc,タグライブラリの資料 などを参照してほしい。