以下、図面に基づいて本発明の実施の形態を説明する。図2は、本発明の実施の形態における情報処理装置のハードウェア構成例を示す図である。図2の情報処理装置10は、それぞれバスBで相互に接続されているドライブ装置100、補助記憶装置102、メモリ装置103、CPU104、インタフェース装置105、表示装置106、及び入力装置107等を有する。
情報処理装置10での処理を実現するプログラムは、CD−ROM等の記録媒体101によって提供される。プログラムを記憶した記録媒体101がドライブ装置100にセットされると、プログラムが記録媒体101からドライブ装置100を介して補助記憶装置102にインストールされる。但し、プログラムのインストールは必ずしも記録媒体101より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置102は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
メモリ装置103は、プログラムの起動指示があった場合に、補助記憶装置102からプログラムを読み出して格納する。CPU104は、メモリ装置103に格納されたプログラムに従って情報処理装置10に係る機能を実現する。インタフェース装置105は、ネットワークに接続するためのインタフェースとして用いられる。表示装置106はプログラムによるGUI(Graphical User Interface)等を表示する。入力装置107はキーボード及びマウス等で構成され、様々な操作指示を入力させるために用いられる。
図3は、情報処理装置の基本機能に関するソフトウェア構成例を示す図である。図3において、情報処理装置10は、ウィジェット11、ウィジェットランタイム12、及びエージェント13等を含む。
ウィジェット11は、一般的に、ウィジェット(Widget)若しくはデスクトップウィジェット、又はガジェット(Gadget)等と呼ばれる、簡易なアプリケーションプログラムである。ウィジェット11は、例えば、HTML(HyperText Markup Language)若しくはXML(eXtensible Markup Language)、及びJavaScript(登録商標)若しくはVBScript(以下、単に「スクリプト」として総称する。)等を利用して実装される。
ウィジェットランタイム12は、ウィジェット11の実行環境を実現するソフトウェアプログラムである。ウィジェットランタイム12は、クライアントとしてHTTP通信を実行する機能、HTML又はXML等を解釈して画面を描画する機能、及びスクリプトを解釈して実行する機能等、一般的なWebブラウザが有している機能を備える。ウィジェットランタイム12は、斯かる機能によって、ウィジェット11の画面の表示、ウィジェット11に定義されたスクリプトの実行等を行う。
エージェント13は、WebAPIを介して機能を提供するプログラム群である。具体的には、エージェント13は、クライアントからのHTTPリクエストに応じ、当該HTTPリクエストにおいて指定されたURL(Uniform Resource Locator)に対応する機能を提供する。すなわち、WebAPIとは、URLを機能の識別情報として、機能の実行要求を受け付けるAPI(Application Program Interface)をいう。
本実施の形態では、ウィジェット11よりURLの指定を受け付けるウィジェットランタイム12が、エージェント13に対するクライアントに相当する。
図3において、エージェント13は、一以上のプログラムモジュール131、モジュールプラットフォーム132、及びモジュールランタイム133等を含む。
各プログラムモジュール131は、それぞれに固有の機能を実行するプログラムモジュールである。同図には、プログラムモジュール131の一例として、Aモジュール131a、Bモジュール131b、WebAPIモジュール131w、及び拡張モジュール131e等が例示されている。このうち、WebAPIモジュール131w及び拡張モジュール131eは、特別な機能及び役割を有するプログラムモジュール131である。
WebAPIモジュール131wは、他のプログラムモジュール131の機能に対するインタフェースを、WebAPIとして公開する役割を担う。具体的には、WebAPIモジュール131wは、所定のポート番号のポートを開設し、当該ポート宛のHTTPリクエストに指定されたURLに対応するプログラムモジュール131を呼び出す。すなわち、各プログラムモジュール131には、URLが割り当てられ、WebAPIモジュール131wは、各プログラムモジュール131のURLを、各プログラムモジュール131に対応付けて管理する。
拡張モジュール131eは、エージェント13には実装されていない機能を実現するプログラムモジュール131の追加機能を実現するプログラムモジュール131である。プログラムモジュール131の追加の意味については、後述される。拡張モジュール131eによって、エージェント13の機能拡張が簡便かつ安全に行われる。
モジュールランタイム133は、モジュールの実行環境を提供する。モジュールランタイム133の一例として、Java(登録商標)VM(Virtual Machine)が挙げられる。
モジュールプラットフォーム132は、モジュールランタイム133が提供する実行環境におけるプログラムのモジュール化又は部品化を容易にするためのプラットフォームである。モジュールプラットフォーム132の一例として、OSGi(Open Services Gateway Initiative)プラットフォームが挙げられる。OSGiプラットフォームとは、OSGiアライアンスによる標準化技術であり、Java(登録商標)言語に基づいたオープンなソフトウェア部品化技術に基づいて作成されたプログラムモジュール131の実行環境を提供するソフトウェアプラットフォームである。OSGiプラットフォーム上において、Java(登録商標)言語のプログラムモジュールは「バンドル」と呼ばれるソフトウェア部品の形で実装される。一つのバンドルは、それぞれ独立して動的に(情報処理装置10の再起動を要することなく)インストール可能である。したがって、モジュールプラットフォーム132として、OSGiプラットフォームが採用される場合、本実施の形態における各プログラムモジュール131は、バンドルとして実装される。
なお、図3において、ウィジェットランタイム12及びエージェント13は、相互に異なるプロセスとして動作する。ウィジェット11は、ウィジェットランタイム12のプロセス上で起動される。各プログラムモジュール131は、エージェント13上のプロセス上で、スレッドとして起動される。
以下、情報処理装置10において実行される処理手順について説明する。図4は、プログラムモジュールの機能に対するインタフェースをWebAPIとして公開するための処理手順の第一の例を説明するためのシーケンス図である。例えば、図4の処理は、エージェント13のプロセスの起動時に実行される。
ステップS101において、モジュールプラットフォーム132は、モジュールプラットフォーム132に登録されている各プログラムモジュール131に対して、起動指示を行う。起動とは、例えば、各プログラムモジュール131をスレッドとして起動させることである。
各プログラムモジュール131は、起動指示に応じ、当該プログラムモジュール131の機能を識別するURLと、当該機能に関するアドレス情報(例えば、ポインタ等)とをWebAPIモジュール131wに通知する(S102)。当該通知は、例えば、WebAPIモジュール131wが有する所定のメソッドを呼び出すことにより行われる。なお、URLは、当該プログラムモジュール131の機能に対するインタフェースをエージェント13の外部に公開するために利用される識別情報である。
アドレス情報(ポインタ等)は、エージェント13の内部において、プログラムモジュール131の呼び出し機構の実装上の都合により、必要となる識別情報である。URLは、静的な情報であり、アドレス情報は、動的な識別情報であるともいえる。アドレス情報は、プログラムモジュール131が起動されるたびに変化する可能性が有るからである。
例えば、拡張モジュール131eからは、「/exmodule」といったURLが通知される。すなわち、ここで通知されるURLは、WebAPIモジュール131wが規定するルートのURLに対する相対パスである。本実施の形態において、WebAPIモジュール131wが規定するルートのURLは、「<host>:<port>/platform」であるとする。<host>は、実際には、具体的なホスト名又はIPアドレスによって置換される。<port>は、実際には、具体的なポート番号によって置換される。
続いて、WebAPIモジュール131wは、通知されたURLとアドレス情報とを対応付けて、メモリ装置103に記憶しておく(S103)。その結果、当該URLに係るプログラムモジュール131のインタフェースは、WebAPIとして公開されたことになる。WebAPIモジュール131wは、当該URLが指定されたHTTPリクエストの受信に応じ、当該URLに対応するアドレス情報に基づいて、当該URLに対応するプログラムモジュール131を呼び出すことができるからである。
なお、例えば、拡張モジュール131eのWebAPIに対するURLは、エージェント13の外部に対しては、「<host>:<port>/platform/exmodule」として公開される。換言すれば、ウィジェット11が、拡張モジュール131eの機能を利用したい場合、URLとして「<host>:<port>/platform/exmodule」が指定されたHTTPリクエストを、WebAPIモジュール131wに対して送信すればよい。
続いて、WebAPIモジュール131wは、各プログラムモジュール131に対して応答を返却する(S104)。各プログラムモジュール131は、モジュールプラットフォーム132に応答を返却する(S105)。
続いて、図4に対する変形例について説明する。図5は、プログラムモジュールの機能に対するインタフェースをWebAPIとして公開するための処理手順の第二の例を説明するためのシーケンス図である。図5中、図4と同一又は対応するステップには、図4と同じステップ番号又は図4のステップ番号に対して枝番が付与されたステップ番号を付し、その説明は適宜省略する。
図5では、ステップS102及びS104におけるWebAPIモジュール131wと各プログラムモジュール131とのやり取りが、モジュールプラットフォーム132によって仲介される例が示されている。
すなわち、各プログラムモジュール131の機能に対するURLと、当該機能に関するアドレス情報とは、モジュールプラットフォーム132を介して、各プログラムモジュール131からWebAPIモジュール131wに通知される(S102−1、S102−2)。
また、WebAPIモジュール131wからの応答は、モジュールプラットフォーム132を介して、各プログラムモジュール131へ返却される(S104−1、S104−2)。
図5に示される処理手順によれば、各プログラムモジュール131について、WebAPIモジュール131wへの依存度を低減させることができる。すなわち、各プログラムモジュール131は、WebAPIモジュール131wの存在を意識することなく、自らの機能に対するインタフェースをWebAPIとして公開することができる。
なお、新たなプログラムモジュール131がモジュールプラットフォーム132上に追加された場合、追加されたタイミングで当該プログラムモジュール131に関して、図4又は図5において説明した処理が実行される。その結果、当該プログラムモジュール131のインタフェースは、自動的にWebAPIとして公開される。
続いて、拡張モジュール131eの機能について説明する。上記したように、拡張モジュール131eは、プログラムモジュール131の追加機能を有する。当該追加機能は、例えば、次のように利用される。
図6は、拡張モジュールが有するプログラムモジュールの追加機能の利用形態の一例を示す図である。
図6において、ウィジェット11aは、エージェント13が有していない機能を実現するプログラムモジュール131であるCモジュール131cの機能を必要とするウィジェット11である。この場合、例えば、ウィジェット11aの配布時には、ウィジェット11aと共にCモジュール131cが配布されることが考えられる。ウィジェット11の配布形態の一例として、例えば、所定のサイトからのウィジェット11のダウンロードが挙げられる。
ウィジェット11aは、起動されると、プログラムモジュール131の追加機能に対応するURL(すなわち、拡張モジュール131eに対するURL)と、Cモジュール131cの保存先のファイルパス名とを指定して、ウィジェットランタイム12にWebAPIの呼び出しを要求する(S201)。なお、Cモジュール131cの保存先のファイルパス名の代わりに、Cモジュール131cを特定可能なURLが指定されてもよい。
ウィジェットランタイム12は、プログラムモジュール131の追加機能に対応するURL及び当該ファイルパス名が指定されたHTTPリクエストを、WebAPIモジュール131w宛に送信する(S202)。WebAPIモジュール131wは、当該URLに対応するプログラムモジュール131を呼び出す。上述したように、プログラムモジュール131の追加機能を示すURLに対応するプログラムモジュール131は、拡張モジュール131eである。したがって、ここでは、拡張モジュール131eが呼び出される(S203)。
拡張モジュール131eは、呼び出しに応じ、拡張エージェント13aを起動させる(S204)。拡張エージェント13aは、モジュールプラットフォーム132及びモジュールランタイム133に関して、エージェント13と同じプログラムを用いて、エージェント13とは異なるプロセスとして起動される。したがって、拡張エージェント13aは、エージェント13と同様に、モジュールプラットフォーム132a及びモジュールランタイム133aを含む。
但し、図6に示されるように、拡張モジュール131eが基本構成として有するプログラムモジュール131は、プロキシモジュール131pである。プロキシモジュール131pは、拡張モジュール131eと協調して(S205)、Cモジュール131cを、拡張エージェント13aのモジュールプラットフォーム132aに登録する(S206)。プロキシモジュール131pは、また、拡張モジュール131eと協調して、Cモジュール131cの機能に対するインタフェースをWebAPIとして公開するための処理を行う。
このように、Cモジュール131cは、エージェント13ではなく、拡張エージェント13aに登録される。ウィジェット11の都合でプログラムモジュール131を拡張エージェント13aに追加可能となることで、ウィジェット11の実装上の制限を超えた機能の実現が可能となる。ここで、Cモジュール131cがエージェント13ではなく、拡張エージェント13aに登録されるのは、次のような理由による。
すなわち、プログラムモジュール131の自由な追加が許容されると、テストが不十分なプログラムモジュール131等、動作の安定性が保証されていないプログラムモジュール131も、エージェント13に登録される可能性がある。このようなプログラムモジュール131がエージェント13に登録されると、当該プログラムモジュール131の不具合やメモリの消費等によって、エージェント13内の他のプログラムモジュール131の動作にも悪影響が及ぶ可能性がある。エージェント13に含まれる各プログラムモジュール131は、同一のプロセス上で動作するため、いずれかのプログラムモジュール131による不正動作によって当該プロセスが終了してしまうと、他のプログラムモジュール131も動作不能となってしまうからである。
そこで、本実施の形態では、ウィジェット11から追加が要求されたプログラムモジュール131に関しては、エージェント13とは別プロセスの拡張エージェント13aに登録されるのである。そうすることで、エージェント13のプロセスの安定性又は安全性を確保することができる。
図6において説明した、ウィジェット11によるプログラムモジュール131の追加要求に応じて実行される処理について、シーケンス図を用いて説明する。
図7は、ウィジェットからのプログラムモジュールの追加要求に応じて実行される処理概要を説明するためのシーケンス図である。括弧内のステップ番号は、図6において対応するステップのステップ番号を示す。図7においても、新たなプログラムモジュール131の追加を要求するウィジェット11は、ウィジェット11aであるとする。また、新たなプログラムモジュール131は、Cモジュール131cであるとする。なお、図7においては、WebAPIモジュール131w、拡張モジュール131e、及びプロキシモジュール131pは、エージェント13又は拡張エージェント13aとして抽象化されて示されている。
ウィジェット11aは、起動されると、プログラムモジュール131の追加機能に対応するURLと、Cモジュール131cの保存先のファイルパス名とを指定して、ウィジェットランタイム12にWebAPIの呼び出しを要求する(S301)。ここでは、当該URLとして、「<host>:<port>/platoform/exmodule」が指定される。なお、Cモジュール131cは、必ずしもウィジェット11aと共に配布されなくてもよい。図6は、Cモジュール131cの配布形態の一例を示したものに過ぎない。
続いて、ウィジェットランタイム12は、当該URL及び当該ファイルパス名が指定されたHTTPリクエストを、エージェント13に送信する(S302)。当該HTTPリクエストに応じ、エージェント13は、拡張エージェント13aをプロセスとして起動させる(S303)。
続いて、エージェント13は、Cモジュール131cのファイルパス名を指定して、Cモジュール131cの追加要求を拡張エージェント13aに対して送信する(S304)。当該追加要求に応じ、拡張エージェント13aは、Cモジュール131cを拡張エージェント13a上のプログラムモジュール131として登録する。続いて、拡張エージェント13aは、Cモジュール131cの追加の完了を示す応答を返信する(S305)。
続いて、エージェント13は、Cモジュール131cの起動要求を拡張エージェント13aに送信する(S306)。当該起動要求に応じ、拡張エージェント13aは、Cモジュール131cをスレッドとして起動させる。Cモジュール131cの起動に応じて、拡張エージェント13a上では、図4又は図5において説明したような処理が、Cモジュール131cに関して実行される。すなわち、Cモジュール131cより、Cモジュール131cの機能に対するURLと、当該機能に関するアドレス情報とが拡張エージェント13aに対して通知される。当該URLと当該アドレス情報との対応関係は、拡張エージェント13aにおいて管理される。
続いて、拡張エージェント13aは、当該URLを指定して、Cモジュール131cの機能に関して、WebAPIの登録要求をエージェント13に送信する(S307)。エージェント13は、当該URLと当該拡張エージェント13aに関する識別情報とを対応付けてメモリ装置103に記憶する(S308)。その結果、Cモジュール131cのインタフェースは、WebAPIとして公開されたことになる。すなわち、エージェント13は、当該URLが指定されたHTTPリクエストの受信に応じ、当該URLに対応する識別情報に係る拡張エージェント13aを呼び出すことができる。この際、拡張エージェント13aには、当該URLが通知される。拡張エージェント13aは、当該URLとアドレス情報とを対応付けて管理している。したがって、拡張エージェント13aは、当該URLに対応するアドレス情報に基づいて、Cモジュール131cを呼び出すことができる。
続いて、エージェント13は、Cモジュール131cのインタフェースがWebAPIとして登録されたことを示す応答を、拡張エージェント13aに返信する(S308)。当該応答に応じ、拡張エージェント13aは、Cモジュール131cの起動が完了したことを示す応答を、エージェント13に返信する(S309)。
続いて、エージェント13は、Cモジュール131cの追加の完了を示すHTTPレスポンスをウィジェットランタイム12に返信する(S310)。ウィジェットランタイム12は、Cモジュール131cの追加の完了を示す応答をウィジェット11aに返却する(S311)。
続いて、図7の処理内容をエージェント13内又は拡張エージェント13a内のプログラムモジュール131のレベルに細分化して説明する。
図8は、ウィジェットからのプログラムモジュールの追加要求に応じて実行される処理手順の第一の例を説明するためのシーケンス図である。括弧内のステップ番号は、図7において対応するステップのステップ番号を示す。なお、図8では、便宜上、ウィジェットランタイム12は省略されている。すなわち、図8において、ウィジェット11aと、WebAPIモジュール131wとの通信は、厳密には、ウィジェットランタイム12を経由して行われる。
ステップS401において、WebAPIモジュール131wは、起動されたウィジェット11aからの要求に基づいて送信された、プログラムモジュール131の追加機能に対応するURLと、Cモジュール131cの保存先のファイルパス名とが指定されたHTTPリクエストを受信する(S401)。WebAPIモジュール131wは、プログラムモジュール131の追加機能に対応するURLに対応付けられているアドレス情報に基づいて、拡張モジュール131eを呼び出す(S402)。この際、拡張モジュール131eには、Cモジュール131cのファイルパス名が通知される。
続いて、拡張モジュール131eは、モジュールプラットフォーム132aを含む拡張エージェント13aをプロセスとして起動させる(S403)。続いて、拡張モジュール131eは、Cモジュール131cのファイルパス名を指定して、Cモジュール131cの追加要求をモジュールプラットフォーム132aに対して送信する(S404)。当該追加要求に応じ、モジュールプラットフォーム132aは、Cモジュール131cをモジュールプラットフォーム132a上のプログラムモジュール131として登録する。登録に応じて、Cモジュール131cに対してIDが割り当てられる。当該IDを、以下「登録ID」という。ここでは、登録IDとして、「001」が割り当てられたこととする。モジュールプラットフォーム132aは、登録ID(「001」)を含む応答を、拡張モジュール131eに返信する(S405)。
拡張モジュール131eは、当該登録IDに基づいて、Cモジュール131cのルートURLを生成する。例えば、「/exmodule/001」が、当該ルートURLとして生成される。すなわち、拡張モジュール131eのURLの相対パス(「/exmodule」)に対して、Cモジュール131cの登録IDが追加された文字列が、Cモジュール131cのルートURLとされる。なお、Cモジュール131cのルートURLとは、Cモジュール131cの機能ではなく、Cモジュール131c自体を示すURLである。ルートURLは、例えば、Cモジュール131cの削除が行われる場合に、削除対象のCモジュール131cを特定するために用いられる。
拡張モジュール131eは、当該ルートURLをWebAPIとして登録することを、当該ルートURLと、拡張モジュール131eが有するプログラムモジュール131の追加機能に関するアドレス情報(例えば、ポインタ等)とを指定して、WebAPIモジュール131aに要求する(S406)。
続いて、WebAPIモジュール131wは、Cモジュール131cのルートURLと、拡張モジュール131eが有するプログラムモジュール131の追加機能に関するアドレス情報とを対応付けて、例えば、メモリ装置103に記憶する(S407)。これによって、ルートURLは、WebAPIとして公開される。なお、エージェント13の外部に対しては、Cモジュール131cのルートURLの絶対パスは、「<host>:<port>/platform/exmodule/001」となる。
続いて、WebAPIモジュール131wは、ルートURLがWebAPIとして登録されたことを示す応答を拡張モジュール131eに返信する(S408)。
なお、ここまででWebAPIとして登録又は公開されたのは、Cモジュール131cのルートURLであって、Cモジュール131cの機能に対するURLではない。したがって、例えば、ウィジェット11aは、この段階では、Cモジュール131cの機能を呼び出すことはできない。
続いて、拡張モジュール131eは、Cモジュール131cの登録ID(「001」)を指定して、Cモジュール131cの起動要求をモジュールプラットフォーム132aに送信する(S409)。当該起動要求に応じ、モジュールプラットフォーム132aは、当該登録IDに基づいて特定されるCモジュール131cをスレッドとして起動させる(S410)。
Cモジュール131cは、起動されると、図4のステップS102と同様に、当該Cモジュール131cの機能に対するURLと、当該機能に関するアドレス情報(例えば、ポインタ等)とをプロキシモジュール131pに通知する(S411)。プロキシモジュール131pは、当該URLと、当該アドレス情報とを対応付けて、例えば、メモリ装置103に記憶する。ここでは、Cモジュール131cの機能に対するURLの相対パスは、「/001/functionC」であるとする。当該URLは、Cモジュール131cの登録IDに対して、「functionC」が付加されたものである。Cモジュール131cの機能に対する本来的な識別子は、「functionC」である。登録IDが付加されることにより、Cモジュール131cと他のモジュールとのURLの重複が回避される可能性を高めることができる。基本的に登録IDは、重複しないからである。
但し、当該URLに対して、登録IDが付加されなくてもよい。この場合、プロキシモジュール131pによって、URLの重複の有無がチェックされてもよい。URLの重複が検出された場合、プロキシモジュール131pは、別のURLの指定をCモジュール131cに対して要求してもよいし、プロキシモジュール131pが、別のURLを自動的に生成してもよい。
なお、プロキシモジュール131pは、拡張エージェント13a内のプログラムモジュール131からは、WebAPIモジュール131wと同様に見える。すなわち、プロキシモジュール131pは、拡張エージェント13a内のプログラムモジュール131に対して、WebAPIモジュール131wと同じインタフェース(メソッド)を公開する。したがって、Cモジュール131cも含めて各プログラムモジュール131は、自らが起動された環境が、モジュールプラットフォーム132であるのか又はモジュールプラットフォーム131aであるのかを意識することなく、所定のメソッドを呼び出せばよい。そうすることで、各プログラムモジュール131は、WebAPIモジュール131w又はプロキシモジュール131pに、当該プログラムモジュール131の機能に対するURLと、当該機能に関するアドレス情報とを通知することができる。
続いて、プロキシモジュール131pは、Cモジュール131cの機能に対するURL(「/001/functionC」)を指定して、Cモジュール131cの機能に関して、WebAPIとしての登録要求を拡張モジュール131eに送信する(S412)。この際、プロキシモジュール131pに対する通信用の識別子が、当該URLと共にプロキシモジュール131pに通知されてもよい。プロキシモジュール131pに対する通信用の識別子とは、プロキシモジュール131pと、拡張モジュール131eとの通信において、拡張モジュール131eが、プロキシモジュール131pを識別するための識別子である。当該識別子の実体は、当該通信のプロトコルに依存する。但し、拡張モジュール131eにとって、当該識別子が既知である場合、当該識別子は通知されなくてもよい。なお、プロキシモジュール131pと拡張モジュール131eとの通信は、例えば、RMI(Remote Method Invocation)に基づいて行われてもよい。または、HTTPやSOAP(Simple Object Access Protocol)等、プログラム言語に非依存な通信プロトコルに基づいて行われてもよい。
なお、ステップS412において、Cモジュール131cのアドレス情報が通知されないのは、当該アドレス情報は、拡張エージェント13aのプロセス内において有効な値であり、エージェント13内においては、無効な値であるからである。
続いて、拡張モジュール131eは、Cモジュール131cの機能に関して、WebAPIとしての登録をWebAPIモジュール131wに要求する(S413)。当該要求には、ステップS412において通知されたCモジュール131cの機能に対するURLに対して拡張モジュール131eのURLが付加されたURLと、拡張モジュール131eの仲介機能に関するアドレス情報とが指定される。本実施の形態において、Cモジュール131cの機能に対するURLに対して拡張モジュール131eのURLを付加したURLとは、「exmodule/001/functionC」である。以下、当該URLを、Cモジュール131cの機能に対するURLという。
WebAPIモジュール131wは、Cモジュール131cの機能に対するURLと、拡張モジュール131eの仲介機能に関するアドレス情報とを対応付けて、例えば、メモリ装置103に記憶する。なお、拡張モジュール131eの仲介機能とは、WebAPIモジュール131wが受け付けたHTTPリクエストを、拡張エージェント13a内のプログラムモジュール131に仲介又は転送する機能をいう。上記したように、拡張モジュール131eは、当該仲介機能とは別に、プログラムモジュール131の追加機能を有する。当該追加機能のアドレス情報は、WebAPIモジュール131wによって、当該追加機能に対するURLに対応付けられて記憶されている。ステップS413では、当該追加機能と、当該仲介機能とを区別可能するために、当該仲介機能のアドレス情報として、当該追加機能とは異なるアドレス情報が、WebAPIモジュール131wに通知される。
なお、例えば、Cモジュール131cのWebAPIに対するURLは、エージェント13の外部に対しては、「<host>:<port>/platform/exmodule/001/functionC」として公開される。当該URLは、Cモジュール131cのルートURLに対して、「/functionC」が付加されたものである。
続いて、WebAPIモジュール131wは、通知されたURLに係る機能に対するインタフェースがWebAPIとして登録されたことを示す応答を、拡張モジュール131eに返却する(S415)。
拡張モジュール131eは、Cモジュール131cの機能に対するインタフェースがWebAPIとして登録されたことを示す応答を、プロキシモジュール131pに返信する(S416)。続いて、プロキシモジュール131pは、Cモジュール131cの機能に対するインタフェースがWebAPIとして登録されたことを示す応答を、Cモジュール131cに対して返却する(S417)。Cモジュール131cは、ステップS410における起動指示に対する応答を、モジュールプラットフォーム132aに対して行う(S418)。モジュールプラットフォーム132aは、ステップS409における、Cモジュール131cの起動要求に対する応答を、拡張モジュール131eに対して返信する(S419)。
拡張モジュール131eは、ステップS402における、Cモジュール131cの追加要求に対する応答を、WebAPIモジュール131wに返却する(S420)。WebAPIモジュール131wは、Cモジュール131cのルートURLを含む応答を、ウィジェットランタイム12経由で、ウィジェット11aに返信する(S421)。その後、ウィジェット11aは、当該ルートURLに基づいて、Cモジュール131cの削除や、Cモジュール131cの機能の呼び出しを行うことができる。
続いて、図8に対する変形例について説明する。図9は、ウィジェットからのプログラムモジュールの追加要求に応じて実行される処理手順の第二の例を説明するためのシーケンス図である。図9中、図8と同一又は対応するステップには、図8と同じステップ番号又は図8のステップ番号に対して枝番が付与されたステップ番号を付し、その説明は適宜省略する。
図8と図9との関係は、図4と図5との関係と同様である。すなわち、図9では、各プログラムモジュール131間のやり取りが、モジュールプラットフォーム132又はモジュールプラットフォーム132aによって仲介されている。
具体的には、ステップS406、S408、S413、及びS415に関して、WebAPIモジュール131wと拡張モジュール131eとのやり取りは、モジュールプラットフォーム132によって仲介されている。
また、ステップS411及びS417に関して、Cモジュール131cとプロキシモジュール131pとのやり取りは、モジュールプラットフォーム132aによって仲介されている。
その他の点は、図8と同様である。
続いて、ウィジェット11aが、Cモジュール131cの機能を呼び出す際に実行される処理について説明する。
図10は、拡張エージェントにおけるプログラムモジュールの実行要求に応じて実行される処理手順の一例を説明するためのシーケンス図である。
ステップS501において、ウィジェット11aは、Cモジュール131cの実行要求をウィジェットランタイム12に入力する。当該実行要求には、Cモジュール131cの機能に対するURL(「<host>:<port>/platform/exmodule/001/functionC」)が指定される。
なお、図8又は図9のステップS421において、ウィジェット11aには、Cモジュール131cのルートURLしか返信されていない。すなわち、Cモジュール131cの機能に対するURLは返信されていない。それにも拘わらず、ウィジェット11aがCモジュール131cの機能に対するURLを指定できるのは、ウィジェット11aは、当初よりCモジュール131cの利用を予定して実装されているからである。すなわち、ウィジェット11aは、Cモジュール131cの機能の識別子が「functionC」であることを知っており、当該識別子を、Cモジュール131cのルートURLに付加されたものが、Cモジュール131cの機能に対するURLになるという規則又は約束事を知っているからである。なお、ステップS421において、Cモジュール131cの機能に対するURLが返信されてもよい。
続いて、ウィジェットランタイム12は、当該URL宛にHTTPリクエストを送信する(S502)。当該HTTPリクエストは、WebAPIモジュール131wによって受信される。
WebAPIモジュール131wは、当該URLに対応づけられてメモリ装置103に記憶されているアドレス情報に係る拡張モジュール131eに対して、Cモジュール131cの実行を要求する(S503)。当該実行要求には、当該URLが指定される。但し、当該URLの全てが指定されなくてもよい。例えば、「/001/functionC」のみが指定されてもよい。
続いて、拡張モジュール131eは、指定されたURLを含む、Cモジュール131cの実行要求を、プロキシモジュール131pに送信(転送)する(S504)。続いて、プロキシモジュール131pは、当該URLに対応付けられてメモリ装置103に記憶されているアドレス情報に基づいて、Cモジュール131cを呼び出す(S505)。Cモジュール131cは、呼び出しに応じ、自らに実装されている機能を実現するための処理を実行する(S506)。続いて、Cモジュール131cは、機能の実行結果(成果物)をプロキシモジュール131pに返却する(S507)。
プロキシモジュール131pは、当該実行結果を含む応答を機能モジュールに返信する(S508)。機能モジュールは、当該実行結果を含む応答をWebAPIモジュール131wに返却する(S509)。WebAPIモジュール131wは、当該実行結果を含むHTTPレスポンスを、ウィジェットランタイム12に返信する(S510)。ウィジェットランタイム12は、当該実行結果を含む応答を、ウィジェット11aに返却する(S511)。
続いて、Cモジュール131cの削除について説明する。Cモジュール131cの削除命令は、例えば、Cモジュール131cのルートURLに対して、削除命令を示す所定の文字列(例えば、「DELETE」等)が指定されることによって表現される。本実施の形態では、「<host>:<port>/platform/exmodule/001/DELETE」によって、Cモジュール131cの削除命令が表現される。
ウィジェット11aは、Cモジュール131cの削除を希望する際、URLとして、「<host>:<port>/platform/exmodule/001/DELETE」が指定されたHTTPリクエストを、ウィジェットランタイム12を介して送信する。
WebAPIモジュール131wは、当該HTTPリクエストを受信すると、当該URLに含まれている「DELETE」に基づいて、当該HTTPリクエストが、「/exmodule/001」によって識別されるプログラムモジュール131の削除命令であることを解釈する。そこで、WebAPIモジュール131wは、「/exmodule/001」に対応付けられてメモリ装置103に記憶されているアドレス情報に係る拡張モジュール131eに対して、登録IDが「001」であるプログラムモジュール131の削除を要求する。拡張モジュール131eは、モジュールプラットフォーム132aに対して、登録IDが「001」であるプログラムモジュール131の削除を要求する。モジュールプラットフォーム132aは、登録IDが「001」であるCモジュール131cを削除する。すなわち、Cモジュール131cに関して、モジュールプラットフォーム132aに対する登録が解除される。
なお、Cモジュール131c以外であって、拡張エージェント13aに追加された他のプログラムモジュール131についても、同様の手順で削除することができる。
上述したように、本実施の形態によれば、エージェント13は、機能拡張用のインタフェース(プログラムモジュール131の追加機能に対するインタフェース)を備え、当該インタフェースの呼び出しに応じて、機能を拡張することができる。したがって、ウィジェット11に機能を提供するエージェント13に関して、機能拡張の簡便性を向上させることができる。
また、機能拡張に係るプログラムモジュール131は、エージェント13とは別プロセスにおいて機能する拡張エージェント13aに追加される。したがって、複数のウィジェット11から同時に利用される可能性の高いエージェント13が、当該プログラムモジュール131の動作不正やメモリの消費等の影響を受ける可能性は低い。よって、ウィジェット11に機能を提供するエージェント13に関して、機能拡張の安全性を向上させることができる。
また、プログラムモジュール131の機能に対するURLは、当該プログラムモジュール131より通知される(取得される)。換言すれば、プログラムモジュール131の機能に対するURLは、ランダムに割り当てられるものではなく、プログラムモジュール131より取得される識別子に基づいて、所定の規則に則して生成される。したがって、プログラムモジュール131を利用するウィジェット11にとって、プログラムモジュール131の機能に対するURLがどのような値であるかについて、予測性を高めることができる。
なお、WebAPIモジュール131wは、メモリ装置103に記憶しているURLの一覧を、ウィジェット11に対して提供するインタフェースを有していてもよい。具体的には、当該一覧の提供機能に対するURLがWebAPIモジュール131wに対して割り当てられてもよい。WebAPIモジュール131wは、当該URLが指定されたHTTPリクエストが受信された場合は、メモリ装置103に記憶しているURLの一覧を返信する。ウィジェット11は、当該一覧の中から、例えばキーワード検索によって所望の機能に対するURLを特定することができる。その結果、ウィジェット11と機能(プログラムモジュール131)との関係を、疎又は動的なものとすることができる。
なお、本実施の形態において、エージェント13は、第一の機能実行手段の一例である。拡張エージェント13aは、第二の機能実行手段の一例である。プログラムモジュール131の機能に対するURLは、機能毎に割り当てられた識別情報の一例である。
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。