Groovyのちょっとしたこと「GrailsのScaffoldingページのGSPに出てくる謎の<f:table />タグ」

またもGrailsでくっそ悩んだのでメモがてらの体験談。

GrailsもRubyOnRailsと同様にモデルたるDomain ClassからScaffoldingページを生成する機能がある。

その操作は至極簡単で、コマンドで以下を打てばとりあえずその挙動は確かめることができる。

```
grails create-app hello
cd hello
grails create-domain-class my.hello.Person
# note:Add a String field "name" to created domain class before running next grails command.
# ./hello/grails-app/domain/my/hello/Person.groovy
#
# package my.hello
# class Person{
#  String name
#  static constraints = {} 
# }
grails generate-all my.hello.Person
```

以上の操作で、Domain class PersonによるデータのCRUD操作を行う画面のためのソース一式が生成される。

さて、何のファイルが出来たのかといえば、GrailsはMVCモデルに基づいて設計されているため、

* Model: Domain Class
* View : GSP File
* Controller : Controller Class
* (Test Classes for those classes)

ができている。

ここまでの操作というのは、Grailsの初学者がチュートリアル的に最初に実行する操作であろうと思う。

ここで、ViewであるGSPを見てみる。

```jsp:./hello/grails-app/person/index.gsp
<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="main">
        <g:set var="entityName" value="${message(code: 'person.label', default: 'Person')}" />
        <title><g:message code="default.list.label" args="[entityName]" /></title>
    </head>
    <body>
        <a href="#list-person" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content&hellip;"/></a>
        <div class="nav" role="navigation">
            <ul>
                <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li>
                <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>
            </ul>
        </div>
        <div id="list-person" class="content scaffold-list" role="main">
            <h1><g:message code="default.list.label" args="[entityName]" /></h1>
            <g:if test="${flash.message}">
                <div class="message" role="status">${flash.message}</div>
            </g:if>
            <f:table collection="${personList}" />

            <div class="pagination">
                <g:paginate total="${personCount ?: 0}" />
            </div>
        </div>
    </body>
</html>
```

このファイルについて、Grailsのドキュメントなどをあたっても必ずしもわかりやすい解説があるとは限らない行がある。

それは、

```jsp:
  <f:table collection="${personList}" />
```

という一行である。
もちろんこれは、GSPタグなのだが、その他のGSPタグと違い、namespaceが<code>g:</code>ではなく<code>f:</code>となっている。

つまり、このタグのみがpluginによって追加されているカスタムGSPタグなのである。
むろん、このタグについての説明は、GrailsのGSP Tagsのドキュメントには載っていない。

どのドキュメントに当たっても（少なくとも私は）見つける事ができなかった。
このタグにはどんなAttributeが許可されていて、どんなBodyを書いてカスタマイズ可能なのかなど、一切不明なのだ。

Google先生に質問しようにも、<code>f:table</code>というあまりにもGooglabilityの低いタグ名なのでまともに情報を出す事ができない。

そこで、間違いなくライブラリとしては読み込まれているはずなので、DependancyにGrailsと名の付くjarに定義されているカスタムタグを探してみた。

ところが、見つからない。

最終的に、Grailsが起動時にどうやってタグライブラリをlookupしているのかを調べて、そのポイントにブレークポイントを貼り、ようやく見つけることができた。

このカスタムタグを定義しているプラグインは、FieldsGrailsPluginというもので、jarの名前はGrailsもpluginもついていない<code>fields-2.0.1.jar</code>だった。分かるかよ。

```
Customizable form-field rendering based on overrideable GSP template
```

ということらしい。

なお、念願のドキュメントも手に入れることができて、
http://grails-fields-plugin.github.io/grails-fields/guide/usage.html
という使い方らしく（ソース読んだほうがわかりやすいのはともかく）、これで安心してScaffoldingページからカスタマイズしてページを作れるようになった。

このように、どこから生えてきたんだかわからないGSPタグを調べる場合に効果的だったことをまとめると、

* .\grails-web-taglib-3.0.1.jar - grails.artefact.TagLibrary

にブレークポイントを貼って調べる。

ということでした。。。