管理コンソールは本当に JSF 2.x で構築されているのか?

この記事はGlassFish Advent Calendar 201318日目として新たに書き下ろしたものです。昨日は「GlassFishファミリーのご紹介」でした。


以前のGlassFish勉強会で、Javaエバンジェリストの寺田さんが「GlassFish v3の管理コンソールはJSF 2.xで構築されている」と発言していたことがありまして、興味本位にその裏付けをやっていたところ、実は寺田さんの誤認識であることがわかりました。この状況はGlassFish 4のリリースにより改善される(つまりJSF 2.2ベースになる)ことも予想されましたが、結果は残念なものでした。

結論から申し上げますと、

GlassFishの管理コンソールはJavaServer Faces 1.2で実装されている。もしJSF 2.xのようなコードがあるとすれば、JSF 1.2に対して個別にFaceletsを適用していると考えるのが妥当である。

と言うことです。では、その証拠をご覧に入れましょう。

GlassFishの管理コンソールは、Nucleusから見ると単なるWebアプリケーションに過ぎません。そしてその実態は as-install\lib\install\applications\__admingui に展開された形で存在しています。この下の WEB-INF/faces-config.xml を見ることで、どのバージョンのJSFで動作しているのかが分かります(faces-config.xmlのスキーマは、JSFのバージョンによって異なるためです)。

そして、faces-config.xmlがどうなっているのかを示します。見やすくするため、実際のfaces-config.xmlからコメントアウトされている部分を省略していますので、ご了承ください。

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2">
<application>
        <locale-config>
          <default-locale>en</default-locale>
          <supported-locale>de</supported-locale>
          <supported-locale>sv</supported-locale>
          <supported-locale>en_US</supported-locale>
          <supported-locale>fr</supported-locale>
          <supported-locale>ko</supported-locale>
          <supported-locale>ja</supported-locale>
          <supported-locale>zh_TW</supported-locale>
          <supported-locale>zh_CN</supported-locale>
          <supported-locale>es</supported-locale>
          <supported-locale>it</supported-locale>
          <supported-locale>pt_BR</supported-locale>
        </locale-config>
	<el-resolver>com.sun.webui.jsf.faces.UIComponentELResolver</el-resolver>
    </application>

    <managed-bean>
        <description></description>
    	<managed-bean-name>JavaHelpBean</managed-bean-name>
    	<managed-bean-class>com.sun.webui.jsf.bean.HelpBackingBean</managed-bean-class>
    	<managed-bean-scope>request</managed-bean-scope>
    </managed-bean> 

    <render-kit>
    </render-kit>
</faces-config>

注目して頂きたいのは faces-config 要素の属性、xsi:schemalocationversion の設定値です。この2属性の設定値により、JSFの動作バージョンが決定されます。ここから判断するに、管理コンソールでJSF 1.2が使用されていることは否定しようのない事実です。

JSF 2.0以降でデフォルトとなったFaceletsですが、実はJSF 1.2でも追加設定を行うことで使用可能です(そもそも、JSF 2.0よりも先にFaceletsがリリースされている)。ただし、現状の管理コンソールの設定内容からは、Faceletsが組み込まれている形跡は発見できませんでした。

そもそも管理コンソールの実装がこのような複雑な構成を取るようになったのは、歴史的な背景によるものです。

現在の管理コンソールは、GlassFish v2の時点で完成されたもので、当時の最新技術であったJSF 1.2とFaceletsで構築されました。GlassFish v3の開発時点で管理コンソールを一新する計画はあったのですが(build 50より少し前のことだったと記憶していますが、その時のリソースが発見できませんでした)、あまり評判が良くなかったようで廃案となり、GlassFish v2ベースの管理コンソールを引き続き使用することになりました。参考まで、GlassFish v3で提案された新管理コンソールはAjaxの積極的採用により、画面遷移がスムーズに行われる優れものでした。


明日は誕生日枠で @yumix_h が投稿してくれることを願っていますが、それがかなわない場合は筆者が軽めの話題を提供します

誕生日枠をお二方に固辞されたところに、救世主・菊田 @kikutaro_ さんが現れ、19日を担当していただけることになりました。ありがとうございます。