-engineSetting

エンジン設定を行う、旧engineマジックカスタムタグはengineSettingに名前を変えました。それは、エンジン-ページ-テンプレートという連鎖の中、それぞれ{http://www.seasar.org/maya}engine、{http://www.seasar.org/maya}page、{http://www.seasar.org/maya}templateと、すべてのオブジェクトにQNameを割り当てたためです。これが理由でengineSettingによけてます。この後、engine、page、templateそれぞれにPOJOのインジェクション設定を作ります。Tapestryで言うところのIPageオブジェクトです。これらを式言語で引けるようにするとuseBeanを使わなくてよいのでシンプルになります。POJOなので自由に使ってください。useBeanと違う点は、ライフサイクルイベント管理を行う点です。式でバインディングします。たいそうなものに聞こえますが、Mayaはミドルはやらないので、しょせんuseBeanの賢いものにとどまります。
とりあえず、風呂に入って瞑想します。管理イベントの吟味をしないといけません。おやすみなさい。

-改造ほぼ完了

今回の大きな仕様変更に伴う実装がほぼ完了しました。ほぼというのは、超目玉機能があって、それがもう一息なのとOGNLのエンティティ解決をやってないためです。以前バージョンまでの機能は完了しています。CVSコミットしました。キチンと動くと思います。
エンジンパラメータのboolean値がきちんとわたらないのは、とほほなバグ。

Boolean.getBoolean("true");

これは常にfalseです。正しくは

Boolean.valueOf("true").booleanValue();

これだとtrue。Boolean#getBoolean()はシステムパラメータを取得するメソッドだった。。。

-目玉機能の片鱗

以下のファイルを最新CVS版Mayaに配置します。

<html
    xmlns:m="http://www.seasar.org/maya"
    xmlns:c="http://java.sun.com/jstl/core_rt"
    xmlns:jsp="http://java.sun.com/products/jsp/">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
    </head>
    <body>
        <h1>JSP</h1>
        <jsp:useBean m:name="localeModel" 
            m:class="org.seasar.maya.sample.hello.LocaleModel"/>
        <div>
            <c:out m:value="${ localeModel.processLocale(pageContext) }"/>
        </div>
    </body>
</html>

想像どおりの結果が描画されます。これの重大性がご理解いただけますでしょうか?m:プレフィックスが貼ってあるところがMayaオリジナルな雰囲気を残していますが、JSPに近い記述になっています。今の完成度ではここまでしかJSPに似ません(笑。useBeanもJSPのものではなく、Mayaのそれを使っています。そのため、式言語がOGNLなのは変わりません。
しかし、<%taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>もパースできるように、これから実装します。そうすると、よりJSPっぽくなります。また、「jsp名前空間を貼ってますが、jspに限っては宣言無しでも動くようにします。jsp名前空間およびテンプレに直書きのカスタムタグは明らかにHTMLタグではないので、名前空間無しのものをパラメータとして認識するようにそこだけ切り替えるとさらに良いでしょう。この機能の目指すところは、制限はありますが、既存のJSP1.2が普通に動くテンプレートエンジン。いまは素通しですが、このモードはスイッチでデフォルトオフにしたいと思います。
いくらJSPに似せても、スクリプトレットだけは許しません(笑。また、私はJSPは嫌いなんです。嫌いだからMayaを作ってるわけですからね。しかーし、互換モードは隠し機能で作っておきたかった。
追記
JSP仕様に近づけるべく、jsp名前空間URIを省略するようにしました。

-Taglib

新しい版から、Taglibマジックカスタムタグは追放されました。というか、マジックカスタムタグという概念が追放されたのです。説明が難しいのですが。。。エンジンの柔軟度合いは当社比150%です。下の例にもあるように、xmlns:*="***"という名前空間宣言の記法でTaglibへのプレフィックスマッピングをやります。また、XHTMLでの普通な名前空間宣言も有効ですし、ImplicitPageはユニークな見え方になります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<maya xmlns:x="/WEB-INF/implicit">
    <x:implicitpage.html mayaID="implicit"/>
</maya>

上記は動くサンプルの一部です。「x:implicitpage.html」がエレメント名になっているところがユニークだと思います。「xmlns:x="/WEB-INF/implicit"」がJSP2.0で翻訳すると、<%taglib prefix="x" tagdir="/WEB-INF/implicit"%>となります。この機能を実装する上での光るアイディアだと思うものは、XML名前空間はURLを書くのが普通だけど、アレは単なる文字識別でしかないということです。識別子としてどんな文字列でもXMLの仕様としてOKだということです。Mayaは基本のエンジンでは名前空間をキチンとノードに保存するということしかしていませんが、テンプレートプロセッサとそのレゾルバの対が容易にアクセスできる名前空間情報をもとに様々な解釈をする余地をつくりました。Taglibディレクティブの類似機能を名前空間に持たせているのは、maya-standardのTagProcesserResolverが勝手にやってます。

-JSP互換モード断念

残念!、<%taglib%>はうまくSAXパースできない! そりゃそうですね。独自にパーサーを書くほどの内容ではないので、とりあえず撤収〜。JSP互換モードは一時封印します。からさわぎでした。NekoHTMLをいじるか。。。いやいや。他にもっとやらんといかんことがある。とりあえず封印。
といっても、3箇所(IMPL_CONST/TemplateProcessorHandler/TagProcessorResolver各一箇所づつ)をコメントアウトしただけですが。とりあえず、http://d.hatena.ne.jp/masataka_k/20050306#1110129840http://d.hatena.ne.jp/masataka_k/20050309#1110384938 に考えたことは実装しきったので、また明日より品質を上げるべく邁進しますです。式言語エンジンに渡す文字列のエンティティ解決をやらんといけません。