ワインリストのコンポーネントを作成する
コンポーネントを作成すると言っても、従来のJavaのプログラミングと何1つ変わりません。コンポーネントと言っているのは、コンポーネントの実装がJavaに限らず、C++などでも実装できるからです。またBPELなどもコンポーネントになることができます。今回はJavaで実装しますが、将来的に実装をRubyやGroovy置き換えることも可能です。Scalaについては私の勝手な願い事ですが、コンポーネントの作成には非常に向いていると思います。Java VM上で動作することから早く取り込んでほしいと思っています。
インターフェースを作成する
実装はTuscanyがサポートしているものなら何でもいいのですが、サービスとして外部に公開する場合、SCA Javaの場合、インターフェースはJavaで作成します。jp.kawakubo.wineを選択した状態で、図3のツールバーの[D]をクリックすると、「インターフェース」がプルダウンメニューにあるので、選択します。図12の「Javaインターフェース」画面が表示されます。名前の入力ボックスに「WineCatalog」を入力します。[完了]ボタンをクリックすると図13のようにテキストエディタが起動します。また、パッケージ・エクスプローラーは図14のような構成になります。
図13のようにEclipseがインターフェースを作成してくれますが、図15のように変更します。外部に公開する操作(メソッド)はget
のみです。Wineクラスを作成していないため「Wineを型に解決できません」と叱られますが、この後すぐに作成します。JavaのCollectionインターフェースを継承したクラスには多くの便利なクラスが存在しますが、あえてWineの配列を返しているのは、実装を他の言語に変更した場合を考慮しています。
ここで作成したインターフェースが外部に公開するサービスとなります。サービスとするにはインターフェースの定義の前に@Remotable
アノテーションを追加します。@Remotable
アノテーションを実装しているorg.osoa.sca.annotations.Remotableクラスもインポートします。
ワインリストのためのWineクラスを作成する
WineCatalogの実装クラスを作る前に、ワインリストを作るためのWineクラスを作成します。メンバー変数のkey
はワインの銘柄名称でもよかったのですが、銘柄名に空白が入るため、またヴィンテージと組み合わせないと主キーとはならないためランダムな値を入れるために用意しました。残りの変数は、銘柄名(name
)、銘柄名読み方(nameKana
)、ヴィンテージ(vintage
)、価格(price
)、ランク(category
)があります。それぞれにgetter
/setter
メソッドを作成します。mutableな作りになっているので、業務で使用する場合はsetter
メソッドを制限するなどの工夫が必要になります。図16がWine.javaの内容です。key
以外のgetter
/setter
メソッドは図の中には収まっていません。それぞれの項目に対して作成してください。
Wineクラスの配列を返すWineCatalogImplクラスを作成する
業務アプリケーションであるならば、データベースなどのデータストアに格納された情報からWineオブジェクトを生成し、配列として返すのが通常の方法だと思います。ここでは、サンプルとして単純化するために、init
メソッドで直接Wineクラスをインスタンス化します。Wineクラスの作成でも説明しましたが、キーはUUID
を使用し、ランダムな値を設定しています。get
メソッドはinit
メソッドで作成したWineオブジェクトのArrayListを配列に変換し、返すだけのメソッドです。
init
メソッドの上に@Init
アノテーションがありますが、これはコンポジットがインスタンス化される際、アノテーションしたメソッドが起動するようコンテナに伝えるためのものです。
これでワインリストを作成するためのサーバ側の準備は整いました。繰り返しますが、JSONを使用すると言ったにも係わらず、Javaのコードには一切、JSONを扱うコードがありません。従って、このWineCatalogImplクラスはWebサービスからも呼び出すことが可能なのです。その場合でも、Webサービスを扱うコードを記述する必要はありません。非常に移植性(portability)の高いコンポーネントであることをご理解いただけたと思います。
クライアント画面を作成する
サーバ側の実装は完了したので、クライアント画面を作成して、ワインリストを表示します。まずはパッケージを作成します。今回と次回でJSONとAtomを紹介しますので、ここでは「uijsonatom」としています。その下にWineShop.htmlファイルを作成します。できあがったHTMLファイルが図18です。
サーバ側のコンポーネントのスタブはtuscany.sca.Referenceコンストラクタ(図18の[C])を使って生成します。引数には、後ほど紹介するコンポジットファイルのWineShopを属性とするcomponent
要素で、その子要素であるreference
要素のname
属性の値を渡します。宣言したwineCatalog(図18の[B])をスクリプト中で使用します。宣言の前の@Reference
アノテーションにより、WineShopというコンポーネントは、wineCatalogというサービスが利用できるようになります。
onload
関数でinit
関数を呼び出しており、初期処理を行います。ここではワインリストを取得します。wineCatalogのget
関数の引数は、戻り値のための関数です。JavaScriptでは関数も変数であり、この場合は引数になります。get
の引数は関数を指しているため、wineCatalog_getResponse
関数(図18の[E])が呼び出され、ワインリストのテーブルが作成されます。
なお、図18の[A]は決まり事で、WineShop.htmlというHTMLファイルの場合、WineShop.jsというJavaScriptを宣言します。これはサーバ起動時にログを観察すると生成されることが分かります。このJavaScriptこそAjaxの複雑な処理を行ってくれるものです。