SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

オープンソースApache Tuscanyで楽しむSOA

オープンソースApache Tuscanyで楽しむSOA
第3回「Web2.0から始めましょう(JSONRPC編)」

トスカーナワインはいかが?


  • X ポスト
  • このエントリーをはてなブックマークに追加

ワインリストのコンポーネントを作成する

 コンポーネントを作成すると言っても、従来の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のような構成になります。

図12:「Javaインターフェース」画面
図12:「Javaインターフェース」画面
図13:テキストエディタの起動
図13:テキストエディタの起動
図14:Javaインターフェース追加後のプロジェクトの構成
図14:Javaインターフェース追加後のプロジェクトの構成

 図13のようにEclipseがインターフェースを作成してくれますが、図15のように変更します。外部に公開する操作(メソッド)はgetのみです。Wineクラスを作成していないため「Wineを型に解決できません」と叱られますが、この後すぐに作成します。JavaのCollectionインターフェースを継承したクラスには多くの便利なクラスが存在しますが、あえてWineの配列を返しているのは、実装を他の言語に変更した場合を考慮しています。

図15:WineCatalog.java
図15:WineCatalog.java

 ここで作成したインターフェースが外部に公開するサービスとなります。サービスとするにはインターフェースの定義の前に@Remotableアノテーションを追加します。@Remotableアノテーションを実装しているorg.osoa.sca.annotations.Remotableクラスもインポートします。

ワインリストのためのWineクラスを作成する

 WineCatalogの実装クラスを作る前に、ワインリストを作るためのWineクラスを作成します。メンバー変数のkeyはワインの銘柄名称でもよかったのですが、銘柄名に空白が入るため、またヴィンテージと組み合わせないと主キーとはならないためランダムな値を入れるために用意しました。残りの変数は、銘柄名(name)、銘柄名読み方(nameKana)、ヴィンテージ(vintage)、価格(price)、ランク(category)があります。それぞれにgettersetterメソッドを作成します。mutableな作りになっているので、業務で使用する場合はsetterメソッドを制限するなどの工夫が必要になります。図16がWine.javaの内容です。key以外のgettersetterメソッドは図の中には収まっていません。それぞれの項目に対して作成してください。

図16:Wine.java
図16:Wine.java

Wineクラスの配列を返すWineCatalogImplクラスを作成する

 業務アプリケーションであるならば、データベースなどのデータストアに格納された情報からWineオブジェクトを生成し、配列として返すのが通常の方法だと思います。ここでは、サンプルとして単純化するために、initメソッドで直接Wineクラスをインスタンス化します。Wineクラスの作成でも説明しましたが、キーはUUIDを使用し、ランダムな値を設定しています。getメソッドはinitメソッドで作成したWineオブジェクトのArrayListを配列に変換し、返すだけのメソッドです。

 initメソッドの上に@Initアノテーションがありますが、これはコンポジットがインスタンス化される際、アノテーションしたメソッドが起動するようコンテナに伝えるためのものです。

図17:WineCatalogImpl.java
図17:WineCatalogImpl.java

 これでワインリストを作成するためのサーバ側の準備は整いました。繰り返しますが、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の複雑な処理を行ってくれるものです。

図18:WineShop.html
図18:WineShop.html

次のページ
コンポーネントを組み合わせる

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
オープンソースApache Tuscanyで楽しむSOA連載記事一覧

もっと読む

この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4329 2009/11/25 14:07

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング