アーキテクチャ

概要

 SOSサーバは、サイトのページを表示するWebアプリケーションとSkypeと連携するRecorderに分かれています。

 WebアプリケーションはSarugau JSを利用しました。Sarugau JSはサーバサイドでJavaScriptを実行するオープンソースのWebアプリケーションフレームワークで、AJAXのテクニックをサーバ側で活用できることが大きな特徴です。今回はmochikitと呼ばれるAJAXライブラリを利用しています。Sarugau JSの仕組みについてはサイトを見て下さい。

 また、Webページ上から「声でオススメ」ボタンによってSkypeを起動する部分には、Skype社から提供されているSkype4COMを利用しました。β版にはIE上で稼動するActiveXモジュールが含まれており、JavaScriptやVBScriptでSkypeを操作することが可能になっています。今回はJavaScritpから操作しています。

 Recorderは、Skypeが提供するSkype APIを利用して処理を行なっています。SOSサーバが起動するとSkypeのイベントを監視し、ハンドらが処理を行なっています。今回はSkype社公認のオープンソースプロジェクトであるSkype API for Javaを利用しました(thanx hisanoさん)。

Webアプリケーションの概要

 Saruga JSを使う場合にはデータの取得などにJava、プレゼンテーションの書き出しにサーバサイドJavaScriptを使います。今回も、宿情報を取得する部分と音声データを検索する部分はJavaで記述されています。これらのクラスはDIコンテナを通じて、サーバサイドJavaScriptからグローバル変数のように呼び出すことができます。設定はsrc/webapps/WEB-INF/applicationContext-service.xmlを見て下さい。

 宿情報の取得はsrc/javaのjp.arclamp.sos.jalan.JalanApiImplを見て下さい。非常に単純なコードですが、リクセストオブジェクト引数に渡されると、そこからクエリーを生成しじゃらん宿表示APIを使用します。帰ってきたXML情報はSAXパーサを使ってオブジェクトモデルに組み上げられます。

 音声データの検索はsrc/javaのjp.arclamp.sos.user.MessageFinderImplを見て下さい。これまたシンプルすぎる実装です。

Webアプリケーションの処理フロー

 では、処理フローを見て行きます(図1を参照)。

@条件入力画面の表示

 クライアントがサーバ(http://[yourdomain]:8080/sos/index.html)にアクセスすると、条件入力画面が表示されます(@)。これはただのHTMLでサーバテクノロジーは使われていません。

A検索を実行

都道府県を選択して検索ボタンを押下するとサーバサイドJavaScriptが呼びされます(src/webapps/WEB-INF/sarugau/list.js)(A-1)。
 スクリプトでは、検索パラメタを利用して宿情報を取得します(A-2)。次に取得された宿ごとに音声データを探し(A-3)、最後にそれらの情報を組み合わせて画面を表示します(A-4)。

Skypeまわりの機能

 SOSサーバ側はサーバの起動時にSkypeにアタッチして、チャットの受信やコールのステータス変更などのイベントを監視しています。WebページではActiveXを使ってSkypeを操作しています。

 Skypeの監視はsrc/javaのjp.arclamp.sos.record.SkypeHandlerのinit処理で埋め込まれます。

 クライアントとやり取りするのはsrc/javaのjp.arclamp.sos.record.UserSessionです。クライアントごとにオブジェクトが生成されます。

 録音はsrc/javaのjp.arclamp.sos.record.SoundRecorderが行ないます。JavaのサウンドAPIを利用しています。

Bチャットの開始

 表示されたリストには、それぞれの宿ごとに「声でオススメ」ボタンがあります。これをクリックするとSkypeが起動します(B-1)。サーバ側でチャットのメッセージ(CONNECT:[宿ID])を受信すると、UserSessionを生成します(B-2)。UserSessionはすぐさまチャットを返信します(B-3)。

C録音

   チャットから10秒後に電話をかけます(C-1)。ユーザーが呼び出しに出ると録音が開始され、電話を切ると録音を停止します。最後のチャットメッセージを送信しチャットを終了します。

図1 アーキテクチャ概要図