leftovers...

about grails groovy

ドメインクラスのコメント情報から、i18nのmessages_xx.propertiesに追記する。

Grails 1.2から実装された、i18nでのクラス名プロパティ名対応は、スカッフォルド時の強い味方です。

おさらい。
i18nの messages.propertieに以下のように記述できるようになりました。これらの設定をおこなうとデフォルトのエラーメッセージにも定義した内容で表示されます。i18m-templateプラグインとほぼ同等です。

book.label = ラベル
book.title.label = ラベルの名称

※ついでですが、まだ報告をあげていない、最新版の messages_ja.propertie は、以下に置いてあります。
http://gist.github.com/258601

Grails 1.3.0でしか、テストしていませんが、ドメインクラスのコメント情報から、i18nのmessages_xx.propertiesに、ラベルを追記するスクリプトを書いてみました。結構グダグダなコードですが、どうにか使えるっぽい。

使い方
ターゲットgenerate-i18n-labels に、引数は、自分のLang、日本語は'ja'をあたえて実行。 'ja'の場合は、messages_ja.propertiesに追記。引数を渡さなければ、messages.propertiesに追記されます

grails generate-i18n-labels ja

例えば、こんな感じのドメインクラス。
クラスのコメントに関しては、@labelが書いてあった場合は、@labelの後ろの文字列が優先されます。@labelが無い場合は、コメントがそのまま入ります。

/**
 * ブック用ドメイン
 * @label 書籍
 */
class Book {
  /** タイトル */
  String title
  /** 著者 */
  String author
  /** 出版元 */
  String publisher
  /** ISBN */
  String isbn
  /** コメント */
  String comment
  
  static constraints = {
  }
}

コマンドを実行すると、messages_ja.propertiesに以下の情報が追記されます。

book.label=書籍
book.author.label=著者
book.comment.label=コメント
book.isbn.label=ISBN
book.publisher.label=出版元
book.title.label=タイトル

インストール方法
ソースはここに置いてあります。
http://gist.github.com/402921
軽く試すのであれば、ファイル名 GenerateI18nLabels.groovy で、PROJECT_HOME/scriptsにスクリプトをコピーして実行。いつも使うのであれば、USER_HOME/.grails/scripts にスクリプトを置いておけばいつでも実行出来ます。


これ書いてての記録
意外と悩んだ結果GroovyDoc関連はGroovyのソースコードのテストみて簡単にわかった。
ってのと、eachFileRecurseってしらんかった :-)
以下が今回書いたスクリプトのGroovyDocToolの辺り

import org.codehaus.groovy.tools.groovydoc.GroovyDocTool
import org.codehaus.groovy.groovydoc.GroovyRootDoc
import static groovy.io.FileType.*
//... 省略 ...//
  File domainDir = new File('grails-app','domain') // ドメインクラスのディレクトリ
  List srcFiles =[]
  String domainSrcPath = domainDir.absolutePath+'/'
  //ソースディレクトリ以下のパッケージからのソースへのパスを収集
  domainDir.eachFileRecurse FILES,{ srcFiles<<(it.absolutePath - domainSrcPath) }
  //ソースディレクトリでGroovyDocToolインスタンス生成。
  def docTool = new GroovyDocTool([domainSrcPath] as String[])
  //ソースファイルを指定。
  docTool.add(srcFiles)
  //GroovyRootDocをGroovyDocToolから取得
  GroovyRootDoc root = docTool.getRootDoc()
  //GroovyRootDocから、クラスを取得。
  def classes = root.classes()
//... 省略 ...//

GroovyDocTool関連、意外とわかりやすかった、もっと深いかと思った。。。:-)