SeamFramework.org Community Documentation

- 前のページ
- 次のページ

## 第11章 Groovy インテグレーション

JBoss Seamのもう一つの特徴として、RAD（高速アプリケーション開発）機能があります。RADと意味は異なりますが、ここで一つ興味深いのは動的言語です。最近まで、動的言語を取り入れるにはまったく異なる開発プラットフォームが必要でした。（そうした開発プラットフォームは使いやすいAPI一式とランタイムを備えているため、もはや古いレガシーJava[原文のまま]の APIを使う気にはなりませんでした。こうしてユーザーは開発プラットフォームごとに独自のAPIを使わざるを得ず、それは開発プラットフォーム側としては幸いな話でした。） Java バーチャルマシンの最上位に構築された動的言語の中でも、特にGroovyは、これまでの縦割り型手法を一新するものです。

JBoss Seam は静的言語と動的言語をシームレスに融合することで、Java EE の世界と動的言語の世界を一体化させています。JBoss Seam によって、アプリケーション開発者はコンテキストを切り替えることなく、最良のツールを使う使い開発することができます。動的な Seam コンポーネントを書くことは、従来のSeam コンポーネントを書くのとまったく同じようなものです。アノテーション、APIなど、これまでとすべて同じものを使うことができます。

## 11.1. はじめに

Groovy は、Java言語をベースにしたアジャイル動的言語ですが、Python、Ruby、Smalltalkによって影響を受けた特徴も取り入れています。Groovy が持つ長所は、次の2点です。

- Java シンタックスをサポートしているので、GroovyのコードはJavaと同じですので、スムースに習得できます。

- Groovy のオブジェクトとクラスはJavaと同じなので、既存のJavaのライブラリやフレームワークをスムースに統合できます。

TODO:Groovy シンタックスアドオンの概要を説明

## 11.2. Groovy による Seam アプリケーションの記述

これについては、あまり説明する必要はありません。Groovyオブジェクト は Java オブジェクトであるため、Seam コンポーネントや必要なクラスをそのままGroovyで記述し、デプロイすることができます。同じアプリケーション中でGroovyのクラスとJavaのクラスを一緒に使うこともできます。

### 11.2.1. Groovy コンポーネントの記述

ここまででお分かりのように、Seamではアノテーションを多用しています。従って、アノテーションをサポートしているGroovy 1.1 以上のバージョンをお使いください。以下はSeamアプリケーションで使われているGroovyコードの例です。

#### 11.2.1.1. エンティティ

    @Entity

        @Name("hotel")

        class Hotel implements Serializable

        {

            @Id @GeneratedValue

            Long id

            @Length(max=50) @NotNull

            String name

            @Length(max=100) @NotNull

            String address

            @Length(max=40) @NotNull

            String city

            @Length(min=2, max=10) @NotNull

            String state

            @Length(min=4, max=6) @NotNull

            String zip

            @Length(min=2, max=40) @NotNull

            String country

            @Column(precision=6, scale=2)

            BigDecimal price

            @Override

            String toString()

            {

                return "Hotel(${name},${address},${city},${zip})"

            }

        }

Groovyではもともとプロパティ(getter/setter)の概念をサポートしています。そのため、冗長なgetterやsetterを明示的に記述する必要はありません。上の例では、hotelクラスはJavaからhotel.getCity()でアクセスできますが、このgetterやsetterはGroovyのコンパイラが生成したものです。こうした簡略構文を使えば、エンティティコードは非常に簡潔になります。

#### 11.2.1.2. Seam コンポーネント

SeamコンポーネントをGroovyで記述するのは、Javaで記述するのと同じです。Seamコンポーネントとしてクラスに目印をつけるために、アノテーションを使います。

    @Scope(ScopeType.SESSION)

    @Name("bookingList")

    class BookingListAction implements Serializable

    {

        @In EntityManager em

        @In User user

        @DataModel List<Booking> bookings

        @DataModelSelection Booking booking

        @Logger Log log

        @Factory public void getBookings()

        {

            bookings = em.createQuery('''

                    select b from Booking b

                    where b.user.username = :username

                    order by b.checkinDate''')

                .setParameter("username", user.username)

                .getResultList()

        }

        public void cancel()

        {

            log.info("Cancel booking: #{bookingList.booking.id} for #{user.username}")

            Booking cancelled = em.find(Booking.class, booking.id)

            if (cancelled != null) em.remove( cancelled )

            getBookings()

            FacesMessages.instance().add("Booking cancelled for confirmation number #{bookingList.booking.id}", new Object[0])

        }

    }

### 11.2.2. seam-gen

seam-gen はGroovyと透過的に統合できます。seam-gen で生成されるプロジェクトでは、開発環境に一切追加することなく、Groovyコードを記述できます。Groovyエンティティを記述する場合には、`.groovy`ファイルを`src/main`に置くだけです。驚くことではないですが、アクションを記述する場合には、`.groovy`ファイルを`src/hot`に置くだけです。

## 11.3. デプロイ

Groovyクラスのデプロイは、Javaクラスのデプロイと非常によく似ています。（驚くべきことに、多言語のコンポーネントフレームワークをサポートするよう、国名3レターコードの複合仕様で記述する必要もなく、それに従う必要もありません。）

標準的なデプロイだけでなく、開発時にJavaBeansのSeamコンポーネントクラスを再デプロイする場合、JBoss Seamではアプリケーションを再起動する必要がありません。これにより、開発/テストのサイクルでかかる時間を大幅に短縮できます。`.groovy`ファイルをデプロイする場合には、GroovyBeansのSeamコンポーネントでも同様に再デプロイできます。

### 11.3.1. Groovy コードのデプロイ

GroovyのクラスはまさにJavaのクラスで、バイトコード表現はそのままJavaクラスと同じものです。GroovyエンティティやGroovyセッションbean、Groovy Seamコンポーネントでデプロイする際に必要となるコンパイル方法があります。一般的な方法は、`groovyc` antタスクを使うものです。一旦コンパイルすると、GroovyクラスはJavaクラスと同じになるので、アプリケーションサーバーはどちらも同じように扱うことになります。このため、GroovyとJavaのコードはシームレスに使うことができるのです。

### 11.3.2. 開発時のネイティブ .groovy ファイルのデプロイ

JBoss Seamでは元々、増分ホットデプロイメントモード（開発のみ）を使った`.groovy`ファイル（つまりコンパイルされていないもの）のデプロイをサポートしています。これによって、修正／テストサイクルが非常に速くなります。.groovyデプロイメントでは、項2.8. 「Seam と増分ホットデプロイメント」に従って設定し、Groovyコード(`.groovy` ファイル)を`WEB-INF/dev`ディレクトリにデプロイします。アプリケーションを再起動することなく、GroovyBeanコンポーネントが追加されます。（もちろんアプリケーションサーバーの再起動も不要です。）

ネイティブ.groovyファイルのデプロイでは、従来のSeamホットデプロイメントと同じように以下の制約があります。

- コンポーネントは必ずJavaBeans もしくは GroovyBeansとし、EJB3 beanを使うことはできません。

- エンティティはホットデプロイできません。

- ホットデプロイ可能なコンポーネントは、 `WEB-INF/dev` の外部にデプロイされたクラスからは見えません。

- Seam デバックモードを有効にしなければなりません。

### 11.3.3. seam-gen

Seam-gen はGroovyファイルのデプロイとコンパイルを透過的にサポートしています。これには、（コンパイル不要の）開発モードにおけるネイティブ`.groovy`ファイルのデプロイも含まれます。`src/hot`にWAR, Java, Groovyクラスで構成されたseam-genプロジェクトを作成する場合、自動的に増分ホットデプロイメントの対象になります。プロダクションモードでは、単にデプロイ前にGroovyファイルをコンパイルします。

`examples/groovybooking`にあるGroovyで記述した予約システムの実例では、増分ホットデプロイメントに対応しています。

- 前のページ第10章 Seam での JSF フォーム検証
- 上に戻る
- ホーム
- 次のページ第12章 アプリケーションのプレゼンテーション層にApache Wicketを使用する