BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース イベント・モデルでGrailsアプリケーションの振る舞いをカスタマイズする

イベント・モデルでGrailsアプリケーションの振る舞いをカスタマイズする

一般的なGrails(リンク)アプリケーションは、ビルド・プロセスかあるいはドメイン・クラス(リンク)やコントローラ(リンク)といった個々のアーティファクトかは問わず、アプリケーション・ライフサイクルの重要なポイントでイベントをスローする。アプリケーション・イベントはリスナがそのイベントを遮断し(リンク)、カスタムの振る舞いでイベントに対応するよう設定するのに適した拡張ポイントと言える。HTTPリクエストおよびレスポンスの標準的なWebアプリケーション・ライフサイクルに加え、Grailsには、開発者がイベント・モデルを利用しカスタムな振る舞いを提供するためのカスタム・タッチポイントが多く用意されている。これらのタッチポイントには以下のものが含まれている。

  • ビルド・プロセス中にスローされるイベント
  • アプリケーションの起動および停止
  • Grailsドメイン・クラスのライフサイクル・イベント

バージョン0.5から利用可能であるGant(リンク)スクリプト向けのイベント・ハンドラは、Grailsターゲットおよびプラグイン・スクリプトの実行中にトリガーされる。Events.groovyスクリプトの一連のクロージャ(Grailsの他のすべてのもの)として実装され、「event」で始まる名前で定義される。Grantスクリプトで対応する「イベント」が発生したとき、イベントのクロージャは呼び出される。Grailsは以下のロケーションでこれらのスクリプトを検索する。

  • USER_HOME/.grails/scripts - user-specific event handlers
  • PROJECT_HOME/scripts - applicaton-specific event handlers
  • PROJECT_HOME/plugins/*/scripts - plugin-specific event handlers

Grailsのイベント処理(リンク)はマクロおよびマイクロ・レベルで管理できる。マクロ・レベルとはビルドおよびアプリケーションの規模である。マイクロ・レベルのイベントはドメイン・レイヤで発生し、ドメイン・クラスがデータベースと対話するたびにイベントを発行する。 Scott Davis氏(リンク)は近ごろGrailsイベント・モデルについて、またデベロッパがアプリケーションの振る舞いをさらにカスタマイズする際に、Grailsアプリケーション・ライフサイクルを通じたイベントがどのように役に立つのかについて書いた(リンク)。 デベロッパは、Events.groovyファイルを作成し、それにカスタム・コードを置くことで、標準Grailsスクリプトを修正せずに、ビルド・プロセスを拡張することができる。

ビルド・イベント:

「grails create-app」および「grails run-app」(または「grails war」)コマンド間のビルド・プロセスのすべてのステップには、重要なポイントでスローされるイベントがある。リスナを作成することで、これらのビル・ドイベント(リンク)をプロジェクトで利用することができる。これらのイベントは、インストール後の構成およびアプリケーション・アップグレードでも使用することができる。(カスタムイベントをスローするために)GRAILS_HOME/スクリプトでスクリプトをカスタマイズする場合、カスタム・スクリプトが他のものと一緒にソース・コントロールにチェックインするように、これらのファイルをプロジェクトのスクリプト・ディレクトリに直接コピーすることを、Scott氏は提言している。

アプリケーション・イベント:

ビルド・イベントの他に、アプリケーション・ロジックのカスタマイズにアプリケーション・イベントも利用可能である。grails-app/confにあるBootStrap(リンク)ファイルは、Grailsの起動および停止のたびに実行される。BootStrapファイルのinitクロージャは起動時に呼び出され、destroyクロージャはアプリケーションがシャットダウンされる際に呼び出される。init イベントおよびdestroyイベントの両方が発生した場合、デバッグ・メッセージを確認するには次のように入力しGrailsを対話モードで起動する。

grails interactive" 

アプリケーション・イベントの拡張の例は、ブートストラップ時、データベースに新たなレコードを追加することである。Scott氏は、データベースでの重複レコードを避けるために、BootStrap.groovyにおけるFailsafeデータベースの挿入および削除について述べた。また、GrailsUtil(リンク)クラスを使用して、Bootstrapスクリプトでの環境固有の(Development、TestまたはProduction)アクションについて説明した。 スクリプトの上部にあるgrails.util.GrailsUtilをインポートして、静的メソッドGrailsUtil.getEnvironment() (Groovyの簡潔なgetter構文が理由で、GrailsUtil.を簡略化するためにメソッドは省略可能)を呼び出し、実行しているモードを確認することができる。 

ドメイン・クラス・イベント:

CRUD操作の4つのイベント・フックが含まれる。 onLoad、beforeInsert、befortUpdateおよびbeforeDeleteであり、データベース操作が呼び出されたときにトリガーされる。

  • onLoadはデータベースからクラスがロードされる際に呼び出される。
  • beforeInsertクロージャはsave()メソッドの前に呼び出される。
  • beforeUpdateクロージャはupdate()メソッドの前に呼び出される。
  • beforeDeleteクロージャはdelete()メソッドの前に呼び出される。

上記イベントを補強するために、GrailsはGORMイベント(リンク)とHibernateプラグイン(リンク)をサポートしている。GORMイベントのカスタマイズには、削除、挿入、更新といった特定イベントの発生とともに発生するイベントの登録も含まれる。Hibernateイベント・プラグインにより、メソッド(AfterInsert、afterUpdate、afterDelete、beforeLoad、afterLoad、beforeSave、およびafterSave)を使用してhibernateイベント・システムと連携するためのドメイン・モデルが強化された。他のドメイン・レイヤ・イベントにドメイン・クラスのタイムスタンプがある。具体的な名前付きフィールドをいくつか(lastUpdatedおよびateCreated)設定すると、GORM(リンク)は自動的にクラスのタイムスタンプを取得する。

Webアプリケーションの他のレイヤでは、GrailsはWebフローを実行するトランザクションをある状態から別の状態へ(ビューの状態またはアクション状態が該当する)管理するためにWeb Layer Flow Execution Event(リンク)を提供している。また、Webアプリケーションで特定のイベントが発生した際に、明確なjavascript関数を呼び出すためのAjax Event(リンク)も用意されている。

GrailsはAuto Reload Event(リンク)の抑止もサポートしている。このイベントはあらゆるデータ変更のリソース監視、および変更が発生した際のリロードに使用される。このようにしてGrailsでは実行時のアプリケーション状態のリロードが実装されている。

原文はこちらです:http://www.infoq.com/news/2008/09/grails-event-model

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

BT