管理されないハブによるpublish/subscribeの例
前述のように、信頼度の異なるウィジェットを単純にマッシュアップすることによるセキュリティ的な脅威が発生するため,管理されたハブのセキュリティ機能が重要になってきます。ただし信頼できるウィジェットを組み合わせてマッシュアップを行う場合(たとえば自分の作成したウィジェットを組み合わせる場合)には、管理されないハブを使用することができます。管理されないハブはプログラムの大きさやパフォーマンスの点で、管理されたハブよりメリットがあります。
管理されないハブに対してメッセージを発行 (publish) するコードの例を以下に示します。
var myData = { x: 12.3, y: 45.6 }; OpenAjax.hub.publish("org.example.myTopic", myData);
ここで“org.example.myTopic”はメッセージを発行するトピックの名前、myData は任意のJavaScriptオブジェクトです。
メッセージを受信する場合は、購読のためのコールバック関数を定義し、トピック名を指定して購読(subscribe) します。
function myCallbackOnDataReceive(topic, data){ alert(“Received data! x = ” + data.x +”, y = ” + data.y); } var subscription = OpenAjax.hub.subscribe(“org.example.myTopic” , myCallbackOnDataReceive);
subscribe関数は、復帰値として subscription というオブジェクトを返します。購読を中止するときにはこの subscription オブジェクトを指定して、unsubscribe 関数を呼び出します。
OpenAjax.hub.unsubscribe(subscription);
管理されたハブによる publish/subscribe の例
管理されたハブ (ManagedHub) では、個々のウィジェットをサンドボックス内で実行することにより、ウィジェットを安全にマッシュアップすることができます。管理されたハブはセキュリティを実現するために、より複雑な構造を持っています。(図3)
管理されたハブを使ってウィジェットのマッシュアップを行う手順のおおまかな流れは以下のとおりです。
- まず、ホストアプリケーションはOpenAjax Hubのライブラリをロードし、管理されたハブのインスタンス ManagedHub を生成し、保持します。
- また,ホストアプリケーションは個々のウィジェットをコンテナの中にロードします。コンテナとはウィジェットのコードをカプセル化するための仕組みの総称ですが、管理されたハブの場合には、サンドボックスを実現するために、HTMLのIFRAME要素がコンテナとして使用されます。
- それぞれのコンテナでは、ハブの機能を使用するためのHubClient の機能が提供されます。ウィジェット内のコードはHubClientを使用し、ManagedHub経由でホストアプリケーションや他のウィジェットと通信を行います。
- また、ホストアプリケーションはセキュリティ・マネージャ機能をコールバック関数として提供する必要があります。ウィジェットがメッセージの publish / subscribe を行った場合に、このコールバック関数が呼び出され、この中でセキュリティポリシーに応じて、処理を中断するか継続するかといった制御を行うことが可能です。
以下に、管理されたハブによるウィジェットのマッシュアップ例を見てみましょう。
準備
管理されたハブではウィジェットをサンドボックス実行するために、各ウィジェットを(少なくとも見た目上)異なるサーバから IFRAMEの中にロードします。一台のマシン上にホストアプリケーションとウィジェットを両方配置するためには、あらかじめ仮想ホストなどの仕組みを使って、同じサーバに異なるサーバ名でアクセスできるようにします.
以下の例では、ホストアプリケーションを mashup.example.com というサーバから、2つのウィジェットをそれぞれ widget1.example.com、widget2.example.com というサーバからダウンロードしています。自分のパソコン上で簡単に試す場合には、たとえば hosts ファイルに
127.0.0.1 mashup.example.com 127.0.0.1 widget1.example.com 127.0.0.1 widget2.example.com
のように記述しておくといいでしょう。
また、OpenAjax Hub 2.0のライブラリをWebサーバ上に展開して、アクセスできるようにしておく必要があります。
以下の例では、http://mashup.example.com/hub20 というURLの下に、公開されているOpenAjax Hub 2.0のリファレンス実装が展開されていることを前提としています。