leftovers...

about grails groovy

祝1.4系。Grails 1.4-M1リリース。

お久しぶりです。2011/2/16の1.3.7リリースが懐かしく感じます。
Grails 1.4系最初のマイルストーンリリースです。
今回は結構深いところまで大幅改善されています。ソースコードの階層が整頓されてたり、gradleビルドが大幅調整されてたり、GORM関連なんてそれはもう!
注目なのはUnitテストの大改造。コントローラのUnitテストが大変な事に!
ただし!まだM1なので気をつけましょう!


公式リリースノートはこちら!
http://grails.org/1.4-M1+Release+Notes
jira http://jira.grails.org/browse/GRAILS/fixforversion/11040
http://jira.grails.org/secure/ReleaseNote.jspa?projectId=10020&version=11040

ダウンロード http://grails.org/Download
直リン http://dist.springframework.org.s3.amazonaws.com/milestone/GRAILS/grails-1.4.0.M1.zip
ドキュメント http://grails.org/doc/1.4.0.M1/



では、新機能と向上等の内容をリリースノートの意訳どうぞ!


Upgraded Libraries ライブラリの更新
Grails 1.4には、Spring 3.1 M1, Groovy 1.8, Hibernate 3.6, Servlet 3.0 and Tomcat 7.0がバンドルされています。

リロードエイジェント
クラスのリロードを行う、新しいJVMエージェントの実装により、今までサポートされていなかったクラス、静的型のサービス、ドメインクラス等のリロードが可能になります。

プラグイン使用数等のトラッキング機能
プラグイン使用レポートを収集する機能が実装されました。近いうちにプラグイン使用統計がGrailsのサイトで公開されます。

スカッフォルドUIの向上
スカッフォルドUIは、HTML5で強化されました。

一新された、テストレポートとドキュメントテンプレート
新たなテンプレートにより、テストレポートとドキュメントが向上しました。

resourcesプラグインGrailsコアに統合
resourcesプラグインが完全に統合されました。簡単に、キャッシュ・gzip・バンドリングなどにより、最適化された静的リソースの取り扱いが可能となります。

ベターユニットテスト
詳しくは完全に書き直された、Unitテストのドキュメントを参照してください。
JUnit3,JUnit4,Spockで使用可能な、ユニットテストMixinがベースになっています。

全てのアーティファクトにおいて、もの凄くUnitテストが単純化されています。例えば。

// テストするクラス
class SimpleController {
    def home() {
        render view:"homePage", model:[title:"Hello World"]
    }
    …
}
void testIndex() {
    controller.home()
    assert view == "/simple/homePage"
    assert model.title == "Hello World"
}

このリリースで以前はインテグレーションテストが必要だった、フィルタ−、URLマッピング、ファイルアップロード、コンテントネゴシエーション、テンプレートビューレンダリング、クライテリアクエリーなどもUnitテストでサポートされます。


GORMでの抽象クラス継承のサポート
GORMが抽象クラス継承階層をサポートしました。これによって、関連リンクやクエリ等を抽象クラスに定義することができます。

abstract Media {
     String title
     …
}
class Book extends Media {
}
class Album extends Media {

}
class Account {
    static hasMany = [purchasedMedia:Media]
}

..

def allMedia = Media.list()

GORM APIJavaから使用可能に。
GORM APIは、Groovy transformationによって、GORMエンティティのバイトコードとして注入されます。これによりGORMのメソッドは、Javaコードから、呼び出したり見たりできます。

Book book = new Book();
book.setTitle("The Stand")
book.save();
System.out.println(Book.count());
System.out.println(Book.list());

linkネームスペースのタグのタグ属性サポート
linkネームスペースを持つタグが、attrs属性で、HTMLタグの属性を定義できます。

以下のようなタグがあって、

<link:accountDetails attrs="[class: 'fancy']" acctNumber="8675309">Show Account</link:accountDetails>

下のURLマッピングで定義されてたとします:

"/details/$acctNumber"(controller: 'account', action: 'showAccount')
  ...

処理された結果は:

<a href="/details/8675309" class="fancy">Show Account</a>

H2データベースエンジン
Grailsでは新規アプリケーション作成時のデフォルトデータベースが、今までのHSQLDBにかわりH2になります。
管理コンソール付き!

名前付きクエリから関係先の名前付きクエリを参照。
名前付きクエリがドメインクラスのリレーションを含んでいる場合、そのリレーション先の名前付きクエリを使用することが可能になりました。

class Author {
    static hasMany = [publications:Publication]

    static namedQueries = {
         authorsWithRecentPublications {
             publications {
                 // invoking a named query defined in the Publication class…
                 recentPublications()
             }
         }
    }
}

class Publication {

    Author author

    static namedQueries = {
        recentPublications {
            def now = new Date()
            gt 'datePublished', now - 10
        }
    }
}

フィルターの除外定義
フィルターでのコントローラ・アクション・URIの除外指定が実装されました。

filter1(actionExclude: 'log*') {
    before = {
        // …
    }
}
filter2(controllerExclude: 'auth') {
    before = {
        // …
    }
}

filter3(uriExclude: '/secure*') {
    before = {
        // …
    }
}

共有制約とコマンドオブジェクト
コマンドオブジェクトが共有制約をサポートしました。実装方法は以前に追加されたドメインクラスと同じです。

OrCreateとOrSaveクエリーの実装追加
ドメインクラスに、findWhereやfindByメソッドに似た、nullを返さない、findOrCreateWhere, findOrSaveWhere, findOrCreateBy, findOrSaveByのクエリーをサポートしました。
実行結果にインスタンスが見つからない場合は、指定された値で、新規にインスタンスを作成して返します。findOrSaveWhereとfindOrSaveByの場合はインスタンスを保存してからインスタンスを返します。

def book = Book.findOrCreateWhere(author: 'Douglas Adams', title: "The Hitchiker's Guide To The Galaxy")
def book = Book.findOrSaveWhere(author: 'Daniel Suarez', title: 'Daemon')
def book = Book.findOrCreateByAuthorAndTitle('Daniel Suarez', 'Daemon')
def book = Book.findOrSaveByAuthorAndTitle('Daniel Suarez', 'Daemon')

依存ライブラリ・プラグインにSNAPSHOTが有る場合の自動更新
依存ライブラリ・プラグインのバージョン番号が"SNAPSHOT"で終わる物は、常に最新を確認するようになりました。

パーマネントリダイレクト(301)のサポート
redirect() メソッドにtrueを指定すると、リダイレクトは、301のHTTPステータスで送信され、その逆であれば、302で送信されます。

1.4での変更点と非推奨になった項目

  • OpenRicoBuilderは除外されました。
  • grails.web.JSONBuilderが外されたことにより、JsonBuilderは非推奨となりました。
  • 全てのスタティックホルダーは非推奨となりました。
  • GORMエンティティを拡張した抽象クラスは必ずsrc/groovyに入れましょう
  • クライテリアクエリのJOINは、デフォルトでINNER JOINになりました。(元はLEFT JOIN)
  • コントローラのパブリックメソッドは、アクションとして扱われます。そうでない物はprivateかprotectedにしましょう。
  • 'count'はドメインクラスの正当なプロパティでは無くなりました。
  • 'release-plugin'コマンドは無くなります。プラグインをリリースする際は、Releaseプラグインの 'publish-plugin'を使用します。
  • resourcesプラグインがインストールされている場合、g:resourceはFileNotFoundExceptionを投げるようになります。
  • redirect()の後にヘッダーを追加を可能にするためのresponseは、redirect()ではコミットされなくなります。response.isCommitted()を使用している場合は、request.isRedirected()を使用するように変更する必要があります。
  • withFormatメソッドは、CONTENT_TYPEを精査しなくなります。今後はファイル拡張子・フォーマットパラメータ・ACCEPTヘッダーを参照します。request.withFormat(Closure)の追加により、CONTENT_TYPEを処理できます。
  • デフォルトのapplicationContext.xmlが変更されたのでアップグレードの際は、grails upgradeコマンドを使いましょう。