SeamFramework.orgCommunity Documentation
JBoss Seamのもう一つの特徴として、RAD(高速アプリケーション開発)機能があります。RADと意味は異なりますが、ここで一つ興味深いのは動的言語です。最近まで、動的言語を取り入れるにはまったく異なる開発プラットフォームが必要でした。(そうした開発プラットフォームは使いやすいAPI一式とランタイムを備えているため、もはや古いレガシーJava[原文のまま]の APIを使う気にはなりませんでした。こうしてユーザーは開発プラットフォームごとに独自のAPIを使わざるを得ず、それは開発プラットフォーム側としては幸いな話でした。) Java バーチャルマシンの最上位に構築された動的言語の中でも、特にGroovyは、これまでの縦割り型手法を一新するものです。
JBoss Seam は静的言語と動的言語をシームレスに融合することで、Java EE の世界と動的言語の世界を一体化させています。JBoss Seam によって、アプリケーション開発者はコンテキストを切り替えることなく、最良のツールを使う使い開発することができます。動的な Seam コンポーネントを書くことは、従来のSeam コンポーネントを書くのとまったく同じようなものです。アノテーション、APIなど、これまでとすべて同じものを使うことができます。
Groovy は、Java言語をベースにしたアジャイル動的言語ですが、Python、Ruby、Smalltalkによって影響を受けた特徴も取り入れています。Groovy が持つ長所は、次の2点です。
Java シンタックスをサポートしているので、GroovyのコードはJavaと同じですので、スムースに習得できます。
Groovy のオブジェクトとクラスはJavaと同じなので、既存のJavaのライブラリやフレームワークをスムースに統合できます。
TODO:Groovy シンタックスアドオンの概要を説明
これについては、あまり説明する必要はありません。Groovyオブジェクト は Java オブジェクトであるため、Seam コンポーネントや必要なクラスをそのままGroovyで記述し、デプロイすることができます。同じアプリケーション中でGroovyのクラスとJavaのクラスを一緒に使うこともできます。
ここまででお分かりのように、Seamではアノテーションを多用しています。従って、アノテーションをサポートしているGroovy 1.1 以上のバージョンをお使いください。以下はSeamアプリケーションで使われているGroovyコードの例です。
@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のコンパイラが生成したものです。こうした簡略構文を使えば、エンティティコードは非常に簡潔になります。
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])
}
}
Groovyクラスのデプロイは、Javaクラスのデプロイと非常によく似ています。(驚くべきことに、多言語のコンポーネントフレームワークをサポートするよう、国名3レターコードの複合仕様で記述する必要もなく、それに従う必要もありません。)
標準的なデプロイだけでなく、開発時にJavaBeansのSeamコンポーネントクラスを再デプロイする場合、JBoss Seamではアプリケーションを再起動する必要がありません。これにより、開発/テストのサイクルでかかる時間を大幅に短縮できます。.groovy
ファイルをデプロイする場合には、GroovyBeansのSeamコンポーネントでも同様に再デプロイできます。
GroovyのクラスはまさにJavaのクラスで、バイトコード表現はそのままJavaクラスと同じものです。GroovyエンティティやGroovyセッションbean、Groovy Seamコンポーネントでデプロイする際に必要となるコンパイル方法があります。一般的な方法は、groovyc
antタスクを使うものです。一旦コンパイルすると、GroovyクラスはJavaクラスと同じになるので、アプリケーションサーバーはどちらも同じように扱うことになります。このため、GroovyとJavaのコードはシームレスに使うことができるのです。
JBoss Seamでは元々、増分ホットデプロイメントモード(開発のみ)を使った.groovy
ファイル(つまりコンパイルされていないもの)のデプロイをサポートしています。これによって、修正/テストサイクルが非常に速くなります。.groovyデプロイメントでは、項2.8. 「Seam と増分ホットデプロイメント」に従って設定し、Groovyコード(.groovy
ファイル)をWEB-INF/dev
ディレクトリにデプロイします。アプリケーションを再起動することなく、GroovyBeanコンポーネントが追加されます。(もちろんアプリケーションサーバーの再起動も不要です。)
ネイティブ.groovyファイルのデプロイでは、従来のSeamホットデプロイメントと同じように以下の制約があります。
コンポーネントは必ずJavaBeans もしくは GroovyBeansとし、EJB3 beanを使うことはできません。
エンティティはホットデプロイできません。
ホットデプロイ可能なコンポーネントは、 WEB-INF/dev
の外部にデプロイされたクラスからは見えません。
Seam デバックモードを有効にしなければなりません。
Seam-gen はGroovyファイルのデプロイとコンパイルを透過的にサポートしています。これには、(コンパイル不要の)開発モードにおけるネイティブ.groovy
ファイルのデプロイも含まれます。src/hot
にWAR, Java, Groovyクラスで構成されたseam-genプロジェクトを作成する場合、自動的に増分ホットデプロイメントの対象になります。プロダクションモードでは、単にデプロイ前にGroovyファイルをコンパイルします。
examples/groovybooking
にあるGroovyで記述した予約システムの実例では、増分ホットデプロイメントに対応しています。