.mayaaファイルのフォーマットを編集時にチェックする

S2StrutsなどでMayaaを使う時にお世話になっているmayaaファイル。修正後に再起動は不要とは言え、実行しないとエラーが分からないのはとても不便だ。できればEclipse(+WTP)上で編集時にチェックしたい。


.mayaaファイルはXML形式なので、スキーマ言語での定義さえあればそれに従って書式のチェックができる(もちろん実行時のエラーを全て拾えるわけではないけど。) ありがたい事に公式サイトにxsdファイル(mayaa_core_1_0_0.xsd)が置いてあるので、それを使ってXML Schemaでチェックするようにする。

設定方法

  1. .mayaaファイルをXMLとして認識させる。Eclipseの設定ダイアログで「General」>「Content Type」(日本語なら「一般」>「コンテンツ・タイプ」)を選び、「Content types:」のツリービューから「Text」>「XML」を選択し、「Add...」ボタンで「File types:」に「*.mayaa」を追加する。
  2. 以下のように、.mayaaファイルのルートエレメントに「xmlns:xsi」と「xsi:schemaLocation」を追加する
<m:mayaa xmlns:m="http://mayaa.seasar.org"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://mayaa.seasar.org http://mayaa.seasar.org/schema/mayaa_core_1_0_0.xsd">
...
</m:mayaa>

これで、セーブ時にチェックがおこなわれるようになる。


さらに、エディタ上でエレメント名や属性の補完も出来るようになる*1。 これは便利。

適用例

パラメータ名を忘れやすいm:forなど、だけ打ってとりあえずセーブすれば、次のようにエラーが出る。

    <m:for />
  • Attribute 'after' must appear on element 'm:for'.
  • Attribute 'init' must appear on element 'm:for'.
  • Attribute 'test' must appear on element 'm:for'.

手で打っても良いし、補完入力してもよい。


うっかり属性を勘違いして入力していても教えてくれる。

    <m:if value="${bean.value != null}"/>
  • Attribute 'value' is not allowed to appear in element 'm:if'.
  • Attribute 'test' must appear on element 'm:if'.

そうそう、valueじゃなくてtestだった。


実行可能なものでも、エラーになることもある。以下のような行だと二カ所で警告が出る

    <m:forEach m:id="repetition1" items="${employees}" var="employee"/>
  • Attribute 'm:id' is not allowed to appear in element 'm:forEach'.
  • Attribute 'index' must appear on element 'm:forEach'.

前者は「id」に変えればOK(prefixを取る。確かに要らないし。) 後者はxsdファイル内でindexがuse="required"になっているからみたい。気に入らなきゃ自前でxsd変えればよいか。(少なくともinsertでpathが必須なのはレイアウト側などで困る。)


もう少し自分で使ってみないとなんとも言えないかも。

感想

自分で作る時は窮屈だけど、使うだけならXMLスキーマ言語ってとても便利だ。


本当はもう一歩進んで、EL内で使用しているプロパティ名などもチェックしたい。ただその場合はスキーマ言語では無理なので、プラグインなどを作る事になりそう。


テンプレートエンジンのHTLMテンプレートや設定ファイルはもっと型情報を有効に使っても良いと思う。でも、インアウトとELや各プロセッサ内で型情報の関係(itemsがCollectionならvarの中身はHogeBeanであるとか)が分からない限りはトレース出来ない。どのみちrequestやpageスコープを何でも入れに使ってる限りはダメそうだけど。


事前にインタフェース切ったりしなくても適当にリフレクションで情報取って来て表示してくれ便利さは捨て難いので、その辺りをどこで妥協するかも難しいかも。


ちょっと話は外れるけど、個人的にクラスはロジックを書くところであって、設定やオブジェクト間の関係を記述する所ではないと思ってるので、個別のクラス(Daoとか)のインスタンスをDIする為だけにアクション毎にアクションクラスを書いたり、設定値をアノテーションで書く為だけにクラスを分けたりするの嫌なんだよね。そういうのは設定ファイルに書くべきだと思うんだけど、設定ファイルが(少なくともJavaソースコードと同じぐらいに)型情報を利用出来れば、そういう方向に進めやすくなるなると思う。実際DIコンテナの設定ファイルだと型チェックしてくれるプラグインがあったりする。

*1:エディタの種類によるかも。ダメなら強引にHTML Editorとかで編集するといける。