(57)【要約】  クライアントにおいて実行するアプリケーションが、呼び出し要求をサーバーのリモート・オブジェクトに送るためのシステムを提供する。各呼び出し要求は、アプリケーションが、リモート・オブジェクト・クラスのリモート・オブジェクトに対応するアプリケーションのプロキシー・クラスのプロキシーを呼び出すときに生成される。呼び出し要求毎に、呼び出し要求が延期可能であるとき、システムは呼び出し要求を格納する。呼び出し要求が延期可能でないとき、システムは、サーバーに、格納されているが未だ送られていない各呼び出し要求と、現在の呼び出し要求とを含む呼び出し要求メッセージを送る。システムは、呼び出し応答メッセージをサーバーから受信する。受信した呼び出し応答メッセージの呼び出し応答毎に、システムは、呼び出し応答を受信したという指示をアプリケーションに出す。【選択図】図１６
2020506481.tif 000002
【特許請求の範囲】
【請求項１】
クライアント・コンピューティング・システムであって、
コンピューター実行可能命令を格納するコンピューター読み取り可能記憶媒体と、
前記コンピューター実行可能命令を実行するように構成されたプロセッサーと、
を備え、前記コンピューター実行可能命令が前記プロセッサーによって実行されると、
複数の呼び出し要求を待ち行列に入れる処理であって、各呼び出し要求が、サーバー・コンピューティング・システムのリモート・オブジェクト・クラスのリモート・オブジェクトに対応する前記クライアント・コンピューティング・システムのアプリケーションのプロキシー・クラスのプロキシー・オブジェクトから受け取られる、処理と、
受け取った呼び出し要求毎に、
前記呼び出し要求が延期可能であるとき、前記呼び出し要求を格納する処理と、
前記呼び出し要求が延期可能でないとき、呼び出し要求メッセージを前記サーバー・コンピューティング・システムに送る処理であって、前記呼び出し要求メッセージが、格納されているが未だ送られていない各呼び出し要求と、延期可能でない呼び出し要求とを含む、処理と、
前記サーバー・コンピューティング・システムから、複数の呼び出し応答メッセージを受信する処理であって、各呼び出し応答メッセージが、前記クライアント・コンピューティング・デバイスから以前に送られた呼び出し要求メッセージに応答するものであり、前記呼び出し応答メッセージの内少なくとも１つが複数の呼び出し応答を含む、処理と、
前記複数の呼び出し応答の中から呼び出し応答毎に、
前記呼び出し応答が出力パラメーターを含むとき、前記呼び出し応答から前記出力パラメーターを抽出する処理と、
前記アプリケーションに、前記呼び出し応答が受信されたことの指示、および抽出されたあらゆる出力パラメーターを供給する処理と、
を実行するように、前記クライアント・コンピューティング・システムを制御する、クライアント・コンピューティング・システム。
【請求項２】
請求項１記載のクライアント・コンピューティング・システムにおいて、前記呼び出し要求メッセージが、前記呼び出し要求が受け取られた順序を示す、クライアント・コンピューティング・システム。
【請求項３】
請求項１記載のクライアント・コンピューティング・システムにおいて、前記複数の呼び出し応答が、前記対応する呼び出し要求が受け取られた順序で処理される、クライアント・コンピューティング・システム。
【請求項４】
請求項１記載のクライアント・コンピューティング・システムにおいて、前記コンピューター実行可能命令が、前記プロセッサーによって実行されると、格納されている呼び出し要求が指定時間量よりも長く格納されているとき、前記格納されている呼び出し要求を含む呼び出し要求メッセージを送るように、前記クライアント・コンピューティング・システムを制御する、クライアント・コンピューティング・システム。
【請求項５】
請求項１記載のクライアント・コンピューティング・システムにおいて、前記コンピューター実行可能命令が、前記プロセッサーによって実行されると、送られていない呼び出し要求を送る要求を前記アプリケーションから受けたことに応答して、前記呼び出し要求を含む呼び出し要求メッセージを送るように、前記クライアント・コンピューティング・システムを制御する、クライアント・コンピューティング・システム。
【請求項６】
請求項１記載のクライアント・コンピューティング・システムにおいて、前記複数の呼び出し要求が、異なるサーバー・コンピューティング・システムによってホストされたリモート・オブジェクトに対して受け取られ、特定のサーバー・コンピューティング・システムに送られる呼び出し要求メッセージがいずれも、当該サーバー・コンピューティング・システムによってホストされたリモート・オブジェクトに対する呼び出し要求のみを含む、クライアント・コンピューティング・システム。
【請求項７】
請求項１記載のクライアント・コンピューティング・システムにおいて、前記アプリケーションがブラウザーの制御下において実行される、クライアント・コンピューティング・システム。
【請求項８】
方法であって、
クライアント・コンピューティング・システムによって、複数の呼び出し要求を受けるステップであって、各呼び出し要求が、サーバー・コンピューティング・システムのリモート・オブジェクト・クラスのリモート・オブジェクトに対応する前記クライアント・コンピューティング・システムのアプリケーションのプロキシー・クラスのプロキシー・オブジェクトから受け取られる、ステップと、
受け取られた呼び出し要求毎に、
前記呼び出し要求が延期可能であるとき、
前記クライアント・コンピューティング・システムによって、前記呼び出し要求を格納するステップと、
前記呼び出し要求が延期可能でないとき、前記クライアント・コンピューティング・システムによって、呼び出し要求メッセージを前記サーバー・コンピューティング・システムに送るステップであって、前記呼び出し要求メッセージが、格納されているが未だ送られていない各呼び出し要求と、延期可能でない呼び出し要求とを含む、ステップと、
前記クライアント・コンピューティング・システムによって、前記サーバー・コンピューティング・システムから、複数の呼び出し応答メッセージを受信するステップであって、各呼び出し応答メッセージが、前記クライアント・コンピューティング・システムから以前に送られた呼び出し要求メッセージに応答するものであり、前記呼び出し応答メッセージの内少なくとも１つが複数の呼び出し応答を含む、ステップと、
前記複数の呼び出し応答の中から呼び出し応答毎に、
前記呼び出し応答が出力パラメーターを含むとき、前記クライアント・コンピューティング・システムによって、前記呼び出し応答から前記出力パラメーターを抽出するステップと、
前記クライアント・コンピューティング・システムによって、前記アプリケーションに、前記呼び出し応答が受信されたことの指示、および抽出されたあらゆる出力パラメーターを供給するステップと、
を含む、方法。
【請求項９】
請求項８記載の方法において、前記呼び出し要求メッセージが、前記呼び出し要求が受け取られた順序を示す、方法。
【請求項１０】
請求項８記載の方法において、前記複数の呼び出し応答が、前記対応する呼び出し要求が受け取られた順序で処理される、方法。
【請求項１１】
請求項８記載の方法であって、更に、格納されている呼び出し要求が指定時間量よりも長く格納されているとき、前記クライアント・コンピューティング・システムによって、前記格納されている呼び出し要求を含む呼び出し要求メッセージを送るステップを含む、方法。
【請求項１２】
請求項８記載の方法であって、更に、前記アプリケーションから、送られていない呼び出し要求を送る要求を受けたことに応答して、前記呼び出し要求を含む呼び出し要求メッセージを送るステップを含む、方法。
【請求項１３】
請求項８記載の方法において、前記複数の呼び出し要求が、異なるサーバー・コンピューティング・システムによってホストされたリモート・オブジェクトに対して受け取られ、特定のサーバー・コンピューティング・システムに送られる呼び出し要求メッセージがいずれも、当該サーバー・コンピューティング・システムによってホストされたリモート・オブジェクトに対する呼び出し要求のみを含む、方法。
【請求項１４】
請求項８記載の方法において、前記アプリケーションが、ウェブ・ブラウザーの制御下において実行される、方法。
【請求項１５】
請求項８記載の方法において、前記複数の呼び出し要求が、非同期の呼び出し要求である、方法。
【発明の詳細な説明】
【背景技術】
【０００１】
[0001]  クラウド・ベース・サービスは、ウェブ・ブラウザーを通じて実行されるアプリケーションによって提供される場合が多い。このようなアプリケーションを開発するためには、プログラマーは、ウェブ・ブラウザーのクライアントによって実行され、クラウド・データー・センターのサーバーのサービスにアクセスするアプリケーションを開発すればよい。アプリケーション（またはクライアント・コード）は、通例、ユーザー・インターフェースを提供し、このユーザー・インターフェースを通じて、ユーザーはアプリケーションの機能(feature)にアクセスすることができる。例えば、アプリケーションがワード・プロセッサーである場合、アプリケーションは、編集される文書の内容、ワード・プロセッサーの機能にアクセスするためのメニュー・バー（例えば、文書を開く、および脚注を挿入する）等を表示する。編集されている文書は、サーバー上に格納される。つまり、ユーザーが文書を開くことを要求すると、アプリケーションは、開く要求をサーバーに送り、文書の少なくとも一部のコピーを受け取る。アプリケーションは、この文書の内容を表示する。ユーザーがこの文書に変更を加えると、アプリケーションは、表示されている内容を更新し、メッセージをサーバーに送る。次いで、サーバーが文書を変更する。クライアントとサーバーとの間における通信は、通例、ハイパーテキスト・トランスポート・プロトコル（「ＨＴＴＰ」）要求メッセージ（例えば、ＧＥＴ方法）および応答メッセージというような、リプリゼンテーショナル・ステート・トランスファ（「ＲＥＳＴ」： Representational State Transfer）またはＲＥＳＴｆｕｌｌモデルに基づく。
【０００２】
[0002]  このようなアプリケーションは、殆どのブラウザーがＪａｖａＳｃｒｉｐｔ（登録商標）アプリケーションの実行をサポートするので、通例、ＪａｖａＳｃｒｉｐｔで書かれている。対照的に、サーバー・コードは効率の理由のために、通例、Ｃ＃またはＣ＋＋のような、ＪａｖａＳｃｒｉｐｔ以外のプログラミング言語で書かれている。何故なら、ＪａｖａＳｃｒｉｐｔはインタプリタ型言語であり、Ｃ＃およびＣ＋＋は実行可能ファイルにコンパイルされるからである。ＪａｖａＳｃｒｉｐｔならびにＣ＃およびＣ＋＋は、オブジェクト指向プログラミング言語である。オブジェクト指向プログラミング言語は、インスタンス化することができるオブジェクトの型を定めるクラスをプログラムが指定するプログラミング・モデルをサポートする。クラスは、データー・メンバーおよびメソッド（メンバー関数とも呼ぶ）を、そのクラスのオブジェクトに対して定める。各メソッドは、そのメソッドの名称を指定する署名、メソッドに渡される入力パラメーターの型、およびメソッドによって戻される出力パラメーターの型を有する。例えば、文書クラスは、文書を開き、文書を修正し、そして文書を保存するためのメソッドを含むように定められてもよい。アプリケーションの実行中、特定のクラスのオブジェクトがインスタンス化された後、アプリケーションは、オブジェクトに対する参照、呼び出すメソッドの指示、およびメソッドに渡される入力パラメーター（何らかの入力パラメーターがある場合）を指定することによって、オブジェクトのメソッドを呼び出すことができる。メソッドが完了したとき、このメソッドは出力パラメーターを戻す（なんらかの出力パラメーターがある場合）。
【０００３】
[0003]  このようなアプリケーションは、従来から、ウェブ・サービス記述言語（「ＷＳＤＬ」：Web Service Description Language）によって定められるウェブ・サービス・インターフェースを使用して、または何らかの他の型のリモート・プロシージャ・コール（「ＲＰＣ」：remote procedure call）メカニズムを使用して、サーバーのサービスにアクセスしている。生憎、このようなアプリケーションからサーバーへの、リモート・メソッド呼び出し（「ＲＭＩ」：remote method invocations）とも呼ばれる、オブジェクト指向ＲＰＣに対するサポートは殆どない。その結果、このようなアプリケーションは、サーバーによってホストされたオブジェクトにアクセスするとき、オブジェクト指向手法を使用しないことが多い。
【発明の概要】
【０００４】
[0004]  サーバーによってホストされたリモート・オブジェクト・クラスのリモート・オブジェクトのリモート・オブジェクト・メソッドを呼び出すためにクライアントによって実行されるアプリケーションのためのシステムを提供する。アプリケーションは、リモート・オブジェクト・メンバー関数と同じ署名を有するプロキシー・メンバー関数を含むプロキシー・クラスのプロキシーをインスタンス化する。アプリケーションは、オブジェクト識別子をプロキシーと関連付ける。アプリケーションは、プロキシーのプロキシー・メンバー関数を呼び出す。呼び出されたプロキシー・メンバー関数の制御の下で、アプリケーションは、サーバーに呼び出し要求メッセージを送る。呼び出し要求メッセージは、プロキシーと、リモート・オブジェクト・メンバー関数の識別子とに関連付けられたオブジェクト識別子を含む。アプリケーションは、ブラウザーによって提供される機能を当てにしており、アプリケーションを実行するときに、ブラウザーがアドオン機能にアクセスする必要はない。
【０００５】
[0005]  クライアントのアプリケーションのプロキシーとサーバーの対応するリモート・オブジェクトとの間でプロパティ値を同期させるシステムを提供する。アプリケーションは、リモート・オブジェクト・クラスのリモート・オブジェクトに対応するプロキシー・クラスのプロキシーをインスタンス化し、プロキシー・クラスは、プロキシー・ゲッター(proxy getter)を有するプロパティを指定する。アプリケーションは、リモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出すために、呼び出し要求メッセージをサーバーに送り、呼び出し応答メッセージを受信する。呼び出し応答メッセージがプロパティ更新を含むとき、アプリケーションは、呼び出し応答メッセージから、プロパティ更新からのプロパティの値を抽出し、抽出した値をプロキシーに格納する。プロパティに対するプロキシー・ゲッターが呼び出されたとき、呼び出し要求メッセージをサーバーに送る必要なく、プロパティの値をプロキシーから引き出すことができる。
【０００６】
[0006]  クライアントにおいて実行するアプリケーションが、サーバーのリモート・オブジェクトに呼び出し要求を送るためのシステムを提供する。各呼び出し要求は、アプリケーションが、リモート・オブジェクト・クラスのリモート・オブジェクトに対応するアプリケーションのプロキシー・クラスのプロキシーを呼び出すときに生成される。呼び出し要求毎に、呼び出し要求が延期可能であれば、システムはこの呼び出し要求を格納する。呼び出し要求が延期可能でないとき、システムはサーバーに呼び出し要求メッセージを送る。呼び出し要求メッセージは、以前に送られておらず格納されている各呼び出し要求と、現在の呼び出し要求とを含む。このシステムは、呼び出し応答メッセージをサーバーから受信する。受信した呼び出し応答メッセージの呼び出し応答毎に、システムは、呼び出し応答が受信されたという指示を、アプリケーションに与える。
【０００７】
[0007]  この摘要は、詳細な説明において以下で更に説明する概念から選択したものを、簡略化した形態で紹介するために設けられている。この摘要は、特許請求する主題の主要な特徴や必須の特徴を特定することを意図するのではなく、特許請求する主題の範囲を限定するために使用されることを意図するのでもない。
【図面の簡単な説明】
【０００８】
【図１】ある実施形態におけるアプリケーションおよびサーバー・コンポーネントのデーター構造を示すブロック図である。
【図２】ある実施形態において、同期して呼び出されたプロキシーのメソッドの処理を示す流れ図である。
【図３】ある実施形態において、サーバー・コンポーネントの要求受信コンポーネントの処理を示す流れ図である。
【図４】ある実施形態において、クライアント・コンポーネントの応答オブジェクトのための応答オブジェクト・クラスのパラメーター抽出メソッドの処理を示す流れ図である。
【図５】ある実施形態において、サーバー・コンポーネントの応答オブジェクトに対する応答オブジェクト・クラスのパラメーター格納メソッドの処理を示す流れ図である。
【図６】ある実施形態において、ＩＤテーブル・オブジェクト・クラスのＩＤ引き出しメソッドの処理を示す流れ図である。
【図７】ある実施形態において、ＩＤテーブル・オブジェクトの基準引き出しメソッドの処理を示す流れ図である。
【図８】ある実施形態において、参照が渡されるＩＤテーブル・オブジェクトのエントリー追加メソッドの処理を示す流れ図である。
【図９】ある実施形態において、エントリーが渡されるＩＤテーブル・オブジェクトのエントリー追加メソッドの処理を示す流れ図である。
【図１０】ある実施形態において、リモート・オブジェクトのピア・ホスティングをサポートするＯＯＲＰＣシステムの実施態様を示すブロック図である。
【図１１】ある実施形態において、ＯＯＲＰＣシステムによるプロパティの値の同期をサポートするデーター構造を示すブロック図である。
【図１２】ある実施形態において、サーバー・コンポーネントのプロパティ値取得コンポーネントの処理を示す流れ図である。
【図１３】ある実施形態において、クライアント・コンポーネントのプロパティ値格納コンポーネントの処理を示す流れ図である。
【図１４】ある実施形態において、プロキシー・クラスに対してコードを自動的に生成するためのＯＯＲＰＣシステムのコード生成器を示す流れ図である。
【図１５】ある実施形態において、コード生成器のプロキシー・プロパティ処理コンポーネントの処理を示す流れ図である。
【図１６】ある実施形態において、クライアント・コンポーネントの要求送出コンポーネントの処理を示す流れ図である。
【図１７】ある実施形態において、サーバー・コンポーネントの要求受信コンポーネントの処理を示す流れ図である。
【発明を実施するための形態】
【０００９】
[0025]  サーバーまたは他のリモート・デバイスによってリモートにホストされたオブジェクトにアクセスするために、オブジェクト指向の仕方で、クライアントによって実行されるアプリケーションに対してコードを自動的に生成するための方法およびシステムを提供する。「クライアント」という用語は、コンピューティング・デバイスを指し、「サーバー」という用語はコンピューティング・デバイスを指す。ある実施形態では、オブジェクト指向型リモート・プロシージャ・コール（「ＯＯＲＰＣ」）システムが、サーバーによってリモートにホストされたオブジェクト（「リモート・オブジェクト」）に対するリモート・オブジェクト・クラスに対して、インターフェースの定義を入力する。リモート・オブジェクト・クラス毎に、ＯＯＲＰＣシステムは、リモート・オブジェクト・クラスのためにプロキシーとして役割を果たすプロキシー・クラスを自動的に生成する。「プロキシー」とは、オブジェクトであり、そのメソッドは主に呼び出し要求メッセージを、対応するリモート・オブジェクトをホストするサーバーに送る。通例、プロキシーとリモート・オブジェクトとの間には、１対１の対応がある。プロキシー・クラスは、対応するリモート・オブジェクト・クラスと同じインターフェース（例えば、同じメソッドおよびメソッド署名）を有するが、コードは、リモート・オブジェクト・クラスのコードとは異なる。プロキシー・クラスのメソッド毎に、ＯＯＲＰＣシステムは、そのメソッドに対してコードを生成する。このコードが呼び出されると、呼び出し要求メッセージを、プロキシー・クラスのプロキシーに対応するリモート・オブジェクトをホストするサーバーに送る。呼び出し要求メッセージは、リモート・オブジェクト、メソッド、およびメソッドに渡されるあらゆる入力パラメーターを識別する。また、ＯＯＲＰＣシステムは、メソッドに対してコードを生成する。このコードは、呼び出し応答メッセージがリモート・デバイスから受信された後、メソッドの呼び出しから、呼び出し応答メッセージにおいて識別されたあらゆる出力パラメーターを戻す。あるいは、メソッドの呼び出しが非同期の呼び出しである場合、ＯＯＲＰＣシステムは、呼び出し応答メッセージを処理するクライアント・コンポーネントを含み、呼び出し応答メッセージは、メソッドの一部ではなく、むしろコールバック・メソッドの一部であってもよく、コールバック・メソッドは、そのメソッドの実行が完了したことをアプリケーションに通知するために呼び出される。
【００１０】
[0026]  ある実施形態では、ＯＯＲＰＣシステムは、各プロキシーをその対応するリモート・オブジェクトにマッピングするクライアント・コンポーネントを、アプリケーションのために提供する。アプリケーションは、リモート・オブジェクトをインスタンス化するために使用される、作成リモート・オブジェクト(create remote object)に対応する作成プロキシーを有することができる。作成プロキシーの各メソッドを呼び出し、特定のリモート・オブジェクト・クラスのリモート・オブジェクトをインスタンス化することができる。各メソッドは、作成リモート・オブジェクト上に対応するメソッドを呼び出し、リモート・オブジェクト・クラスのリモート・オブジェクトをインスタンス化するために、「スタブ」(stub)と呼ばれる、呼び出し要求メッセージをサーバー・コンポーネントに送る。また、各メソッドは、リモート・オブジェクトのプロキシーをインスタンス化し、参照をこのプロキシーに戻す。例えば、作成プロキシーは、文書作成メソッドを有することができる。文書作成メソッドは、呼び出し要求メッセージを、作成リモート・オブジェクトの文書作成メソッドの呼び出しを要求したサーバー・コンポーネントに送り、文書リモート・オブジェクトをインスタンス化する。インスタンス化された文書リモート・オブジェクトには、オブジェクト識別子を割り当てることができる（アプリケーションまたはサーバー・コードのいずれかによって）。また、作成プロキシーの文書作成メソッドは、文書リモート・オブジェクトに対応する文書プロキシーもインスタンス化し、文書プロキシーに対する参照（例えば、文書プロキシーのアドレス）をオブジェクト識別子にマッピングする。次いで、作成プロキシーの文書作成メソッドは、文書プロキシーに対する参照を戻す。その後、アプリケーションが、参照によって示されるように、文書プロキシーのメソッドを呼び出すとき、このメソッドは、文書リモート・オブジェクトのオブジェクト識別子を引き出すために、その参照を使用する。次いで、この方法は、サーバー・コンポーネントに、前述のような呼び出し要求メッセージを送る。呼び出し要求メッセージは、文書リモート・オブジェクトをサーバー・コンポーネントに識別するオブジェクト識別子を含む。
【００１１】
[0027]  サーバー・コンポーネントが呼び出し要求メッセージを受信すると、サーバー・コンポーネントは、呼び出し要求メッセージから、オブジェクト識別子、メソッド識別子、およびあらゆる入力パラメーターを抽出する。サーバー・コンポーネントは、オブジェクト識別子によって識別されるリモート・オブジェクトに対する参照を引き出し、識別したメソッドを呼び出して、入力パラメーターを渡す。メソッドが戻るとき、サーバー・コンポーネントは呼び出し応答メッセージをクライアントに送る。呼び出し応答メッセージは、オブジェクト識別子、メソッド識別子、およびあらゆる出力パラメーターを含む。
【００１２】
[0028]  ある実施形態では、作成プロキシーおよび作成リモート・オブジェクトは、それぞれ、互いに独立して、アプリケーションおよびサーバー・コンポーネントの初期化中にインスタンス化される。即ち、アプリケーションは、サーバー・コンポーネントと通信することなく、作成プロキシーをインスタンス化し、サーバー・コンポーネントは、アプリケーションと通信することなく、作成リモート・オブジェクトをインスタンス化する。アプリケーションおよびサーバー・コンポーネントは双方共、作成プロキシーおよび作成リモート・オブジェクトを識別するために同じオブジェクト識別子（例えば、既定の）を割り当てるので、アプリケーションが作成プロキシーのメソッドを呼び出すとき、サーバーに送られる呼び出し要求メッセージは、作成リモート・オブジェクトのオブジェクト識別子を含む。サーバー・コンポーネントが作成リモート・オブジェクトのメソッドを呼び出した後、サーバー・コンポーネントには、新たに作成されたリモート・オブジェクトに対する参照が戻される。次いで、サーバー・コンポーネントは、新たに作成されたリモート・オブジェクトに対してオブジェクト識別子を生成し、このオブジェクト識別子を参照にマッピングし、オブジェクト識別子と呼び出されたメソッドのメソッド識別子とを含む呼び出し応答メッセージを送る。アプリケーションが呼び出し応答メッセージを受信すると、アプリケーションはオブジェクト識別子を、対応するプロキシーの参照にマッピングする。このため、対応するプロキシーのメソッドが後に呼び出されるときに、このメソッドは呼び出し要求メッセージにおけるリモート・オブジェクトのオブジェクト識別子を含むことができる。
【００１３】
[0029]  ある実施形態では、ＯＯＲＰＣシステムは、呼び出し要求メッセージ送出判断基準が満たされるまで、呼び出し要求を送らないのでもよい。呼び出し要求メッセージ送出判断基準が満たされたときに、ＯＯＲＰＣシステムは、未だ送られていない各呼び出し要求を含む呼び出し要求メッセージを送る。例えば、プロキシー・クラスのメソッドは、延期可能または延期不可能に指定することができる（例えば、リモート・オブジェクト・クラスのインターフェースと関連付けられたメタデーターを通じて）。アプリケーションが延期可能であるメソッドを呼び出すとき、ＯＯＲＰＣシステムは、オブジェクト識別子、メソッド識別子、およびあらゆる入力パラメーターを含む呼び出し要求を生成し、この呼び出し要求を待ち行列に入れる。アプリケーションが、延期不可能であるメソッドを呼び出すとき、ＯＯＲＰＣシステムは、待ち行列に入れられた呼び出し要求と、現在の呼び出しに対する呼び出し要求とを含む呼び出し要求メッセージを送る。呼び出し要求メッセージ送出判断基準を満たすことができるのは、延期不可能なメソッドが呼び出されるときである。同様に、呼び出し要求送出メッセージを満たすことができるのは、呼び出し要求が一定期間待ち行列に入れられたとき、一定数の呼び出し要求が待ち行列に入れられたとき、アプリケーションが呼び出し要求メッセージを送るように指令したとき等である。
【００１４】
[0030]  サーバー・コンポーネントが、複数の呼び出し要求を有する呼び出し要求メッセージを受信したとき、サーバー・コンポーネントは、呼び出し要求を、これらが待ち行列に入れられた順序で処理する。呼び出し要求の完了後に、サーバー・コンポーネントは、呼び出し要求メッセージの呼び出し要求毎の呼び出し応答を含む、呼び出し応答メッセージを送る。アプリケーションが呼び出し応答メッセージを受信すると、呼び出し応答を、それらの対応する呼び出し要求の順に処理する。
【００１５】
[0031]  ある実施形態では、ＯＯＲＰＣシステムは、リモート・オブジェクトのプロパティの値をローカルにクライアントに格納するためのサポートに対応する(provide)。ＯＯＲＰＣシステムがリモート・オブジェクト・クラスに対してプロキシー・クラスを生成するとき、ＯＯＲＰＣシステムは、プロパティに対するゲッター・メソッド（「ゲッター」）を、他のメソッドとは異なる方法で(differently)生成する。ＯＯＲＰＣシステムは、プロパティの値を引き出すためにサーバーに呼び出し要求メッセージを送るのではなく、ゲッター・メソッドを生成し、ローカルに格納されているプロパティの値を引き出し、その値を戻す。プロキシーのプロパティについてローカルに格納されている値が、対応するリモート・オブジェクトによって格納された値と同期されていることを確保するために、サーバー・コンポーネントは、最後の呼び出し応答メッセージが送られて以来値が変化したリモート・オブジェクトのプロパティ毎に、各呼び出し応答メッセージにプロパティ更新を添付する。サーバー・コンポーネントは、プロパティ毎に最後に送られた値のリストを維持することができ、呼び出し応答メッセージを送るときに、各リモート・オブジェクトのプロパティ毎にゲッター・メソッドを呼び出して、変化した値を識別することができる。
【００１６】
[0032]  アプリケーションが、プロパティ更新を有する呼び出し応答メッセージを受信すると、アプリケーションは、プロパティ更新の新たな値を対応するプロキシーに格納する。ＯＯＲＰＣシステムがリモート・オブジェクト・クラスのインターフェースからプロキシー・クラスを生成するとき、ＯＯＲＰＣシステムはプロキシー・クラス毎に格納クラスを生成することができる。格納クラスは、各プロパティの識別子（例えば、プロパティ名のハッシュ）をプロパティの型（例えば、整数）、およびそのプロパティの値を格納するための格納クラスのメソッドにマッピングするテーブルを含むことができる。ＯＯＲＰＣシステムは、プロキシー・クラスに、スタティック・データー・メンバーを追加することができる。スタティック・データー・メンバーは、そのプロキシー・クラスに対するインスタンス・格納クラスである格納オブジェクトに対する参照である。ＯＯＲＰＣシステムがプロパティに対して新たな値を受信すると、呼び出し応答メッセージ内のプロパティ更新から、リモート・オブジェクトのオブジェクト識別子、プロパティの識別子、およびプロパティの値を引き出す。ＯＯＲＰＣシステムは、オブジェクト識別子を使用して、対応するプロキシーに対する参照を引き出し、更にこのプロキシーから、格納オブジェクトに対する参照を引き出す。次いで、ＯＯＲＰＣは、プロパティに対応する格納オブジェクトの格納メソッドを呼び出して、プロキシーに対する参照および値を渡す。格納メソッドはその値をプロキシーに格納する。
【００１７】
[0033]  図１は、ある実施形態において、アプリケーションのデーター構造およびサーバー・コンポーネントを示すブロック図である。クライアント１１０は、アプリケーション１１１を実行し、サーバー１２０はサーバー・コンポーネント１２１を実行する。アプリケーションおよびサーバー・コンポーネントは、擬似コードとして表されている。初期化の間、クライアントにおいて実行するＯＯＲＰＣシステムのクライアント・コンポーネント１１９は、ＩＤテーブル・オブジェクト１１３を初期化することができ、ＯＯＲＰＣシステムのコンポーネントであるサーバー・コンポーネントはＩＤテーブル・オブジェクト１２３をインスタンス化することができる。ＩＤテーブル・オブジェクトは、プロキシーおよびリモート・オブジェクトのオブジェクト識別子と、それらの対応する参照との間のマッピングを、ＩＤテーブル・オブジェクトのＩＤテーブルに格納するおよび引き出すためのメソッドを提供する。アプリケーションは、作成プロキシー１１２をインスタンス化し、サーバー・コンポーネントは対応する作成リモート・オブジェクト１２２をインスタンス化する。クライアント・コンポーネントは、ＩＤテーブル・オブジェクト１１３に、作成プロキシーに対するオブジェクト識別子（例えば、１）と作成プロキシー（「Ｓ」）に対する参照（例えば、そのアドレス）との間のマッピングを追加し、サーバー・コンポーネントは、ＩＤテーブル・オブジェクト１２３に、作成リモート・オブジェクトに対するオブジェクト識別子と、作成リモート・オブジェクトに対する参照との間のマッピングを追加する。次いで、サーバー・コンポーネントは、クライアントから呼び出し要求を受けるのを待つ。クライアントのプロキシーに対するオブジェクト識別子、およびサーバーの対応するリモート・オブジェクトに対するオブジェクト識別子は、同じ値を有する。
【００１８】
[0034]  リモート・オブジェクト・クラスのリモート・オブジェクトを作成するために、アプリケーションは、リモート・オブジェクト・クラスのリモート・オブジェクトを作成するための作成プロキシーのメソッドを呼び出す。例えば、リモート・オブジェクト・クラスが「Ｘ」と命名された場合、アプリケーションは、作成プロキシーのｃｒｅａｔｅＸメソッドを呼び出して、リモート・オブジェクト・クラスＸのリモート・オブジェクトを作成することができる。作成プロキシーのｃｒｅａｔｅＸメソッドは、サーバーに、呼び出し要求メッセージ（「ｒｅｑ」）を送る。呼び出し要求メッセージは、作成リモート・オブジェクトのオブジェクト識別子（「ｒｅｑ．ＩＤ」）、ｃｒｅａｔｅＸメソッドのメソッド識別子（「ｒｅｑ．ｍｅｔｈｏｄ」）、およびあらゆる入力パラメーター（「ｒｅｑ．ｉｎｐａｒａｍ」）を含む。クライアント・コンポーネントは、要求オブジェクト１１７をインスタンス化し、送られる呼び出し要求メッセージのデーター、および受信された呼び出し応答メッセージのデーターを格納する応答オブジェクト１１８を格納することができる。同様に、サーバー・コンポーネントは、受信した呼び出し要求メッセージのデーターを格納するために要求オブジェクト１２７をインスタンス化し、更に送ろうとする呼び出し応答メッセージのデーターを格納するために応答オブジェクト１２８をインスタンス化することができる。
【００１９】
[0035]  呼び出し要求メッセージを受信すると、サーバー・コンポーネントはオブジェクト識別子を呼び出し要求メッセージから抽出し、作成リモート・オブジェクトに対する参照を引き出すために、そのＩＤテーブル・オブジェクトの参照引き出しメソッド（「ｒｅｔｒｉｅｖｅｒｅｆ）を呼び出し、オブジェクト識別子を渡す。次いで、サーバー・コンポーネントは、あらゆる入力パラメーター（「ｉｎｐａｒａｍ」）を抽出するために、要求オブジェクトの抽出メソッド（「ｅｘｔｒａｃｔ」）を呼び出す。次いで、サーバー・コンポーネントは、要求オブジェクトから、ｃｒｅａｔｅＸメソッドのメソッド識別子を抽出する。次いで、サーバー・コンポーネントは、作成リモート・オブジェクトに対する参照、およびｃｒｅａｔｅＸメソッドの識別子を使用して、作成リモート・オブジェクトのｃｒｅａｔｅＸメソッドを呼び出し、入力パラメーターを渡す。ｃｒｅａｔｅＸメソッドは、クラスＸのリモート・オブジェクト１２４（「Ｘ２オブジェクト」）をインスタンス化し、リモート・オブジェクト１２４に対する参照である出力パラメーターを戻す。擬似コードによって示されていないが、サーバー・コンポーネントは、ＩＤテーブル・オブジェクト１２３のエントリー追加メソッドも呼び出して、そのＩＤテーブルに、リモート・オブジェクト１２４に対するオブジェクト識別子（「２」）をリモート・オブジェクト１２４（「Ｘ２」）に対する参照にマッピングするエントリーを追加し、更に、応答オブジェクト（「ｒｅｓ」）に、オブジェクト識別子（「ｒｅｓ．ＩＤ」）およびｃｒｅａｔｅＸメソッドの識別子（「ｒｅｓ．ｍｅｔｈｏｄ」）を追加する。次いで、サーバー・コンポーネントは、応答オブジェクトの格納メソッド（「ｓｔｏｒｅ」）を呼び出し、あらゆる出力パラメーターを格納する。次いで、サーバー・コンポーネントは、応答オブジェクトに基づいて、クライアントに呼び出し応答メッセージを送る。
【００２０】
[0036]  呼び出し応答メッセージを受信すると、クライアント・コンポーネントは、呼び出し応答メッセージに基づいて、応答オブジェクトをインスタンス化する。次いで、クライアント・コンポーネントは、プロキシー１１４（「Ｘ２プロキシー」）をインスタンス化し、ＩＤテーブル・オブジェクト１１３のエントリー追加メソッドを呼び出し、そのＩＤテーブルに、プロキシー１１４に対するオブジェクト識別子（「２」）とプロキシー１１４に対する参照（「Ｘ２」）との間のマッピングを追加する。ｃｒｅａｔｅＸメソッドの呼び出しが同期している場合、ｃｒｅａｔｅＸメソッドは、プロキシー１１４に対する参照を戻す(return with)。
【００２１】
[0037]  リモート・オブジェクト１２４およびその対応するプロキシー１１４がインスタンス化された後、アプリケーションは、次いで、プロキシー１１４のメソッドを呼び出し、入力パラメーター（「ｉｎ」）の指示を渡す。呼び出されたメソッドは、クライアント・コンポーネントを呼び出し、プロキシー１１４のオブジェクト識別子（「２」）、メソッド識別子、および入力パラメーターを含む要求オブジェクトを生成し、要求オブジェクトに基づいて、呼び出し要求メッセージをサーバーに送る。呼び出し応答メッセージを受信すると、サーバー・コンポーネントは、リモート・オブジェクト１２４に対する参照をＩＤテーブル・オブジェクトから引き出し、リモート・オブジェクト１２４の識別されたメソッドを呼び出して、入力パラメーターを渡す。このメソッドが戻るとき、サーバー・コンポーネントは応答オブジェクトを生成する。この応答オブジェクトは、リモート・オブジェクト１２４のオブジェクト識別子（「２」）、メソッド識別子、およびあらゆる出力パラメーターを含む。次いで、サーバー・コンポーネントは、応答オブジェクトに基づいて、呼び出し応答メッセージをクライアントに送る。呼び出し応答メッセージを受信すると、クライアント・コンポーネントは、出力パラメーターを抽出し、同期および非同期呼び出し処理に作用するメソッドが戻ったことを知らせる。
【００２２】
[0038]  次いで、アプリケーションは、サーバーにおけるリモート・オブジェクト１２５（「Ｘ３オブジェクト」）およびリモート・オブジェクト１２６（「Ｙ４オブジェクト」）、ならびにクライアントにおける対応するプロキシー１１５（「Ｘ３プロキシー」）および対応するプロキシー１１６（「Ｙ４プロキシー」）の作成を実行するために、作成プロキシーのｃｒｅａｔｅＸメソッドおよびｃｒｅａｔｅＹメソッドを呼び出す。次いで、アプリケーションは、プロキシー１１５およびプロキシー１１６の対応するメソッドを呼び出すことによって、リモート・オブジェクト１２５およびリモート・オブジェクト１２６のメソッドを呼び出すことができる。
【００２３】
[0039]  ＯＯＲＰＣシステムを実装することができるコンピューティング・システム（例えば、クライアント、サーバー、クライアント・デバイス、サーバー・デバイス）は、中央処理ユニット、入力デバイス、出力デバイス（例えば、ディスプレイ・デバイスおよびスピーカー）、記憶デバイス（例えば、メモリーおよびディスク・ドライブ）、ネットワーク・インターフェース、グラフィクス処理ユニット、加速センサー(accelerometer)、セルラー無線リンク・インターフェース、全地球測位システム・デバイス等を含むことができる。コンピューティング・システムは、データー・センターのサーバー、大規模(massively)並列システム等を含んでもよい。コンピューティング・システムは、コンピューター読み取り可能記憶媒体およびデーター送信媒体を含むコンピューター読み取り可能媒体にアクセスすることができる。コンピューター読み取り可能記憶媒体は、一時的な伝搬信号を含まない、有形記憶手段である。コンピューター読み取り可能記憶媒体の例には、主メモリー、キャッシュ・メモリー、および副メモリー（例えば、ＤＶＤ）というようなメモリー、ならびに他のストレージが含まれる。コンピューター読み取り可能記憶媒体は、その上に、ＯＯＲＰＣシステムを実装するコンピューター実行可能命令またはロジックを記録することができ、またはコンピューター実行可能命令をエンコードすることができる。データー送信媒体は、一時的、伝搬信号または搬送波（例えば、電磁気）によって有線またはワイヤレス接続を介してデーターを送信するために使用される。
【００２４】
[0040]  ＯＯＲＰＣシステムは、１つ以上のコンピューター、プロセッサー、またはその他のデバイスによって実行されるプログラム・モジュールおよびコンポーネントというような、コンピューター実行可能命令という一般的なコンテキストで説明することができる。一般に、プログラム・モジュールまたはコンポーネントは、ルーチン、プログラム、オブジェクト、データー構造等を含み、特定のタスクを実行するか、または特定のデーター型を実装する。通例、プログラム・モジュールの機能は、種々の実施形態において、所望に応じて組み合わせることまたは分散することができる。ＯＯＲＰＣシステムの態様は、例えば、特定用途集積回路（ＡＳＩＣ）を使用して、ハードウェアで実装することができる。
【００２５】
[0041]  図２は、ある実施形態において、同期して呼び出されたプロキシーのメソッドの処理を示す流れ図である。方法２００は、ＯＯＲＰＣシステムのコード生成器によって自動的に生成され、１つ以上の入力パラメーターが渡され、１つ以上の出力パラメーターを戻す。この方法は、サーバーに呼び出し要求メッセージを送り、呼び出し応答メッセージを受信する。ブロック２０２において、この方法は、プロキシーのオブジェクト識別子を引き出すために、ＩＤテーブル・オブジェクトの識別子引き出しメソッドを呼び出し、プロキシーに対する参照（「ｔｈｉｓ」）を渡す。このメソッドは、プロキシーのオブジェクト識別子を要求オブジェクトに格納する。ブロック２０４において、このメソッドは、メソッド識別子を要求オブジェクトに追加する。ブロック２０６において、このメソッドは、入力パラメーターを格納するために、要求オブジェクトのパラメーター格納メソッドを呼び出す。ブロック２０８において、このメソッドは、サーバーに、要求オブジェクトに基づく呼び出し要求メッセージを送る。ブロック２１０において、このメソッドは、サーバーから呼び出し応答メッセージを受信し、応答オブジェクトを生成する。ブロック２１２において、このメソッドは、出力パラメーターを抽出するために、応答オブジェクトのパラメーター抽出メソッドを呼び出す。次いで、このメソッドは完了する。ある実施形態では、このメソッドは、ブロック２０２〜２１２の処理を実行するために、クライアント・コンポーネントを呼び出すこともできる。
【００２６】
[0042]  図３は、ある実施形態において、サーバー・コンポーネントの要求受信コンポーネントの処理を示す流れ図である。要求受信コンポーネント３００が呼び出されるのは、呼び出し要求メッセージがクライアントから受信され、呼び出し要求メッセージに基づく要求オブジェクトが渡されるときである。このコンポーネントは、リモート・オブジェクトのメソッドを呼び出し、クライアントに呼び出し応答メッセージを送る。ブロック３０２において、このコンポーネントは、リモート・オブジェクトのオブジェクト識別子を要求オブジェクトから抽出し、ＩＤテーブル・オブジェクトの参照引き出しメソッドを呼び出して、オブジェクト識別子を渡し、そしてリモート・オブジェクトに対する参照を受信する。ブロック３０４において、このコンポーネントは要求オブジェクトからメソッド識別子を抽出する。ブロック３０６において、このコンポーネントは、入力パラメーターを抽出するために、要求オブジェクトのパラメーター抽出メソッドを呼び出す。ブロック３０８において、このコンポーネントは、リモート・オブジェクトの識別子メソッドを呼び出し、入力パラメーターを渡し、戻り時にあらゆる出力パラメーターを受信する。ブロック３１０において、このコンポーネントは、オブジェクト識別子、メソッド識別子、および出力パラメーターを含む応答オブジェクトを生成する。ブロック３１２において、このコンポーネントは、クライアントに、応答オブジェクトに基づく呼び出し応答メッセージを送り、次いで完了する。
【００２７】
[0043]  図４は、ある実施形態において、クライアント・コンポーネントの応答オブジェクトに対する応答オブジェクト・クラスのパラメーター抽出メソッドの処理を示す流れ図である。パラメーター抽出メソッド４００は、呼び出されたメソッドによって戻された出力パラメーターを抽出するために、クライアント・コンポーネントによって呼び出される。ブロック４０２において、このメソッドは、最初のものから始めて、次の出力パラメーターを選択する。判断ブロック４０４において、全ての出力パラメーターが既に選択されている場合、このメソッドは完了し、そうでなければ、このメソッドはブロック４０６に進む。判断ブロック４０６において、選択した出力パラメーターがリモート・オブジェクトの識別子である場合、このメソッドはブロック４１０に進み、そうでなければ、このメソッドはブロック４０８に進む。ブロック４０８において、コンポーネントは、選択した出力パラメーターを出力パラメーターとして格納し、次いでブロック４０２に戻り、次の出力パラメーターを選択する。ブロック４１０において、このメソッドは、ＩＤテーブル・オブジェクトの参照引き出しメソッドを呼び出して、応答オブジェクト内で識別されているリモート・オブジェクトに対する参照を引き出す。判断ブロック４１２において、参照がヌルである場合、このリモート・オブジェクトに対するプロキシーは未だインスタンス化されておらず、このメソッドはブロック４１４に進む。そうでなければ、このメソッドはブロック４２２に進む。ブロック４１４において、このメソッドは、リモート・オブジェクトのクラスに対してプロキシーをインスタンス化する。ＯＯＲＰＣシステムのコード生成器は、リモート・オブジェクトのクラス、更に一般的には、任意のパラメーターの型を、呼び出されたメソッドの署名から識別することができる。ブロック４１６および４１８において、このメソッドはＩＤテーブルに対してエントリーを作成する。ブロック４２０において、このメソッドは、ＩＤテーブル・オブジェクトのエントリー追加メソッドを呼び出してエントリーを格納し、次いでブロック４２２に進む。ブロック４２２において、コンポーネントは、戻される参照に対して出力パラメーターをセットし、次いでブロック４０２に戻り、応答オブジェクトの次の出力パラメーターを選択する。
【００２８】
[0044]  図５は、ある実施形態において、サーバー・コンポーネントの応答オブジェクトに対する応答オブジェクト・クラスのパラメーター格納メソッドの処理を示す流れ図である。パラメーター格納メソッド５００には、応答オブジェクトに格納される、出力パラメーターが渡される。ブロック５０２において、このメソッドは次の出力パラメーターを選択する。判断ブロック５０４において、全ての出力パラメーターが既に選択されている場合、このメソッドは完了し、そうでなければ、このメソッドはブロック５０６に進む。判断ブロック５０６において、出力パラメーターがオブジェクトに対する参照である場合、コンポーネントはブロック５０８に進み、そうでなければ、コンポーネントはブロック５１０に進む。ブロック５０８において、コンポーネントはＩＤテーブル・オブジェクトのＩＤ引き出しメソッドを呼び出し、参照に対応するオブジェクト識別子を引き出し、出力パラメーターを参照にセットする。ブロック５１０において、コンポーネントは出力パラメーターを応答オブジェクトに格納し、次いでブロック５０２に戻り、次の出力パラメーターを選択する。図示しないが、要求オブジェクトは、パラメーター抽出メソッドおよびパラメーター格納メソッドも有し、これらのメソッドは、応答オブジェクトのそれらと同様に機能する。
【００２９】
[0045]  図６〜図９は、ある実施形態において、ＩＤテーブル・オブジェクト・クラスのメソッドを示す流れ図である。図６は、ある実施形態において、ＩＤテーブル・オブジェクト・クラスのＩＤ引き出しメソッドの処理を示す流れ図である。ＩＤ引き出しメソッド６００は、オブジェクトに対する参照が渡され、この参照に対応するオブジェクト識別子を戻す。ブロック６０２において、このメソッドはＩＤテーブルの次のエントリーを選択する。判断ブロック６０４において、全てのエントリーが既に選択されている場合、このメソッドは、この参照のエントリーがＩＤテーブルにないことを示すために、ヌル値を戻し、そうでない場合、このメソッドはブロック６０６に進む。判断ブロック６０６において、選択したエントリー内にある参照が、渡された参照と一致する場合、このメソッドは、このエントリーのオブジェクト識別子の指示を戻し、そうでない場合、このメソッドはブロック６０２にループし(loop)、ＩＤテーブルの次のエントリーを選択する。
【００３０】
[0046]  図７は、ある実施形態において、ＩＤテーブル・オブジェクトの参照引き出しメソッドの処理を示す流れ図である。参照引き出しメソッド７００は、オブジェクト識別子が渡され、このオブジェクト識別子に対応する参照を戻す。ブロック７０２において、このメソッドはＩＤテーブルの次のエントリーを引き出す。判断ブロック７０４において、全てのエントリーが既に選択されている場合、このメソッドは、このオブジェクト識別子のエントリーがＩＤテーブルにはないことを示すために、ヌル値を戻し、そうでない場合、このメソッドはブロック７０６に進む。判断ブロック７０６において、選択したエントリーのオブジェクト識別子が、渡されたオブジェクト識別子と一致する場合、このメソッドは、選択したエントリーの参照を戻し、そうでない場合、このメソッドはブロック７０２にループし、ＩＤテーブルの次のエントリーを選択する。
【００３１】
[0047]  図８は、ある実施形態において、参照を渡されたＩＤテーブル・オブジェクトのエントリー追加メソッドの処理を示す流れ図である。エントリー追加メソッド８００は、オブジェクト（即ち、プロキシーまたはリモート・オブジェクト）に対する参照が渡され、ＩＤテーブルがこの参照のエントリーを未だ収容していない場合、その参照のためにエントリーをＩＤテーブルに追加する。ブロック８０２において、このメソッドは、ＩＤテーブルが参照に対応するエントリーを収容している場合、オブジェクト識別子を引き出すために、ＩＤテーブル・オブジェクトのＩＤ引き出しメソッドを呼び出し、この参照を渡す。判断ブロック８０４において、戻されたオブジェクト識別子がヌルである場合、ＩＤテーブルは対応するエントリーを収容していないことになり、このメソッドはブロック８０６に進む。そうでない場合、このメソッドはオブジェクト識別子を戻す。ブロック８０６において、このメソッドは、オブジェクト識別子をＩＤテーブル・オブジェクトの次のオブジェクト識別子フィールドにセットし、次のオブジェクト識別子フィールドをインクリメント(increment)する。ブロック８０８〜８１０において、このメソッドは参照のエントリーを初期化する。ブロック８１２において、このメソッドはこのエントリーをＩＤテーブルに添付し、次いでオブジェクト識別子の指示を戻す。
【００３２】
[0048]  図９は、ある実施形態において、エントリーが渡されたＩＤテーブル・オブジェクトのエントリー追加メソッドの処理を示す流れ図である。エントリー追加メソッド９００は、ＩＤテーブル内に未だエントリーがない場合、ＩＤテーブルに追加されるべきエントリーを渡される。ブロック９０２において、このメソッドはこのＩＤテーブル・オブジェクトのＩＤ引き出しメソッドを呼び出し、エントリーの参照を渡す。判断ブロック９０４において、エントリーがヌルである場合、ＩＤテーブルはそのエントリーを収容しておらず、このメソッドはブロック９０６に進む。そうでない場合、このメソッドは戻る。ブロック９０６において、このメソッドはエントリーをＩＤテーブルに追加し、次いで戻る。
【００３３】
[0049]  ある実施形態では、ＯＯＲＰＣシステムは、クライアントおよびサーバーの双方が、他方によってリモートにアクセスされるリモート・オブジェクトをホストすることを許容する。つまり、クライアントおよびサーバーは、双方共リモート・オブジェクトをホストするという意味で、ピアであると見なされてもよい。例えば、複数のクライアントによって協調環境において文書が処理されている場合、各クライアントは、この文書に対する変更のイベント通知を受けるために、オブジェクトをサーバーに登録することができる。このような場合、クライアントは、文書プロキシーの登録メソッドを呼び出して、クライアントによってインスタンス化されたイベント待ち受けオブジェクトを渡す。クライアントは、オブジェクト識別子を、サーバーによってリモートにホストされたオブジェクトのプロキシーに対する参照にマッピングするためのプロキシーＩＤテーブルと、オブジェクト識別子を、クライアントによってローカルにホストされたオブジェクトに対する参照にマッピングするためのオブジェクトＩＤテーブルとを維持することができる。同様に、サーバーは、オブジェクト識別子を、クライアントによってリモートにホストされたオブジェクトのプロキシーに対する参照にマッピングするためのプロキシーＩＤテーブルと、オブジェクト識別子を、サーバーによってローカルにホストされたオブジェクトに対する参照にマッピングするためのオブジェクトＩＤテーブルとを維持することができる。文書プロキシーの登録メソッドは、イベント待ち受けオブジェクトのエントリーをオブジェクトＩＤテーブルに追加し、エントリーのオブジェクト識別子を入力パラメーターとして、登録メソッドに対する呼び出し要求メッセージ内に含ませる。サーバーが呼び出し要求メッセージを受信すると、サーバー・コンポーネントはオブジェクトＩＤテーブルおよびプロキシーＩＤテーブルの双方を検索し、一致するオブジェクト識別子を有するエントリーを求めることができる。このようなエントリーが発見された場合、サーバー・コンポーネントは、オブジェクト識別子を、登録メソッドへの入力パラメーターとして、エントリーの参照と置き換える。このようなエントリーが発見されない場合、サーバー・コンポーネントは、イベント待ち受けオブジェクトに対してイベント待ち受けプロキシーをインスタンス化し、エントリーをプロキシーＩＤテーブルに追加する。プロキシーＩＤテーブルは、オブジェクト識別子を、イベント待ち受けオブジェクト・プロキシーに対する参照にマッピングする。次いで、サーバー・コンポーネントは、文書リモート・オブジェクトの登録メソッドを呼び出し、待ち受けプロキシーに対する参照を渡す。サーバー・コンポーネントがイベントをアプリケーションに送ると、サーバー・コードは待ち受けプロキシーのイベント・メソッドを呼び出し、クライアントに呼び出し要求メッセージを送る。クライアントが呼び出し要求メッセージを受信すると、クライアント・コンポーネントは、サーバーのサーバー・コンポーネントが呼び出し要求メッセージを扱うのと全く同様に、呼び出し要求メッセージを処理する。このように、クライアントおよびサーバーの双方が、他方によってリ���ートにホストされたリモート・オブジェクトのメソッドを呼び出すことができる。
【００３４】
[0050]  ある実施形態では、リモート・オブジェクトのオブジェクト・メソッドが、値渡しされる(passed by value)入力パラメーターおよび／または出力パラメーターを有することができる。入力パラメーターを値渡しするために、リモート・オブジェクトに対応するプロキシーのプロキシー・メソッドは、入力パラメーターの値を引き出し、この引き出した値を呼び出し要求メッセージに追加する。入力パラメーター自体がサーバーによってホストされたリモート・オブジェクトである場合、プロキシー・メソッドは、その値を引き出すために、呼び出し要求メッセージをサーバーに送ることができる。同様に、出力パラメーターを値渡しによって戻すとき、オブジェクト・メソッドは出力パラメーターの値を引き出し、この引き出した値を呼び出し応答メッセージに追加する。ある実施形態では、入力パラメーターまたは出力パラメーターが、複数のオブジェクトを収容するデーター構造であってもよい。このようなデーター構造である入力パラメーターを渡すために、プロキシー・メソッドは、このデーター構造における各オブジェクトのオブジェクト識別子を引き出し、各オブジェクト識別子を呼び出し要求メソッドに追加する。例えば、データー構造がアレイである場合、このアレイのエレメント毎のプロキシー・メソッドはそのエレメントを選択し、選択したエレメントのオブジェクト識別子を引き出し、引き出したオブジェクト識別子を呼び出し要求メソッドに追加する。アレイである出力パラメーターを渡すためには、オブジェクト・メソッドは、アレイのエレメントを同様に処理する。入力パラメーターまたは出力パラメーターのデーター構造は、サーバー上にホストされたオブジェクト、およびクライアント上にホストされたオブジェクトを収容することができる。このような入力パラメーターを処理するとき、プロキシー・メソッドは各オブジェクトのオブジェクト識別子を呼び出し、要求メソッドに追加する。呼び出し要求メソッドを受け取ると、サーバー・コンポーネントは、オブジェクト識別子テーブルまたはプロキシー識別子テーブルのいずれかから、オブジェクトに対する参照を引き出し、オブジェクト・メソッドを呼び出して、引き出した参照を渡す。サーバー・コンポーネントは、対応するオブジェクトまたはプロキシーを、未だインスタンス化されてなければ、インスタンス化することができる。
【００３５】
[0051]  図１０は、ある実施形態において、リモート・オブジェクトのピア・ホスティングをサポートするＯＯＲＰＣシステムの実施態様を示すブロック図である。クライアント１０１０は、プロキシーＩＤテーブル・オブジェクト１０１１と、オブジェクトＩＤテーブル・オブジェクト１０１５とを含む。プロキシーＩＤテーブル・オブジェクト１０１１は、プロキシー１０１２のエントリーを収容するＩＤテーブルを含み、オブジェクトＩＤテーブル・オブジェクト１０１５は、リモート・オブジェクト１０１６のエントリーを収容するＩＤテーブルを含む。サーバー１０２０は、オブジェクトＩＤテーブル・オブジェクト１０２１と、プロキシーＩＤテーブル・オブジェクト１０２５とを含む。オブジェクトＩＤテーブル・オブジェクト１０２１は、各オブジェクト１０２２のエントリーを収容するＩＤテーブルを含み、プロキシーＩＤテーブル・オブジェクト１０２５は、各プロキシー１０２６のエントリーを収容するＩＤテーブルを含む。
【００３６】
[0052]  図１１は、ある実施形態において、ＯＯＲＰＣシステムによるプロパティの値の同期をサポートするデーター構造を示すブロック図である。クライアント１１１０は、ＩＤテーブルを有するＩＤテーブル・オブジェクト１１１１を含む。このＩＤテーブルは、リモート・オブジェクト・クラスＸのリモート・オブジェクトに対するプロキシー１１１２および１１１３の*エントリーを含み、更にリモート・オブジェクト・クラスＹのリモート・オブジェクトに対するプロキシー１１１４のエントリーを含む。各プロキシーは、そのリモート・オブジェクト・クラスに対する格納オブジェクトを参照するためにスタティック・データー・メンバーを含む。プロキシー１１１２および１１１３は、リモート・オブジェクト・クラスＸに対する格納オブジェクト１１１５に対する参照を含み、プロキシー１１１４は、リモート・オブジェクト・クラスＹに対する格納オブジェクト１１１６に対する参照を含む。リモート・オブジェクト・クラスに対する格納オブジェクトは、プロパティの値をローカルにプロキシーに格納するリモート・オブジェクト・クラスのゲッター・メソッド毎にメソッドを含むことができる。サーバー１１２０は、ＩＤテーブルを有するＩＤテーブル・オブジェクト１１２１を含む。このＩＤテーブルは、リモート・オブジェクト・クラスＸのリモート・オブジェクト１１２２および１１２３のエントリーを含み、更に、リモート・オブジェクト・クラスＹのオブジェクト１１２４のエントリーを含む。また、サーバーは、プロパティ・テーブルを有するプロパティ・テーブル・オブジェクト１１２５も含み、プロパティ・テーブルは各リモート・オブジェクトのプロパティ毎にエントリーを含む。各エントリーは、リモート・オブジェクトのオブジェクト識別子、リモート・オブジェクトの各プロパティの最後に引き出された値、およびリモート・オブジェクトのリモート・オブジェクト・クラスのゲッター・テーブルに対する参照を含む。ある実施形態では、各エントリーは、リモート・オブジェクトに対する最後に引き出された値を格納するデーター構造に対する参照を収容することができる。また、ＩＤテーブルおよびプロパティ・テーブルを組み合わせて１つのテーブルにすることもできる。図示のように、プロパティ・テーブルの第１エントリーはリモート・オブジェクト１１２２に対応し、リモート・オブジェクト・クラスＸに対するゲッター・テーブル１１２６へのポインタを含む。ゲッター・テーブル１１２６は、リモート・オブジェクト・クラスＸのゲッター・メソッド１１２８および１１２９毎にエントリーを含む。ゲッター・テーブル１１２７は、リモート・オブジェクト・クラスＹのゲッター・メソッド１１３０および１１３１毎にエントリーを含む。これらのエントリーは、プロパティの値を引き出すために、リモート・オブジェクトの対応するゲッター・メソッドを呼び出すコードを指し示す。
【００３７】
[0053]  応答呼び出しメッセージを送る前に、サーバー・コンポーネントは、プロパティ・テーブルの各エントリーを選択し、各プロパティの値を引き出すために、各エントリーのリモート・オブジェクトのゲッター・メソッドを呼び出すことができる。オブジェクトに対してゲッター・メソッドによって戻されたプロパティの値が、プロパティ・テーブルに格納されているそのプロパティの値と異なる場合、サーバー・コンポーネントはプロパティ更新を呼び出し応答メッセージに追加する。プロパティ更新は、オブジェクト識別子、プロパティ識別子、および新たな値を含む。クライアントが呼び出し応答メッセージを受信すると、クライアント・コンポーネントは各プロパティ更新を処理する。プロパティ更新毎に、クライアント・コンポーネントは、プロパティ更新のオブジェクト識別子に対応するプロキシーに対する参照を引き出す。クライアント・コンポーネントは、プロキシーから、格納オブジェクトに対する参照を引き出し、格納オブジェクトのそのプロパティに対する対応する格納メソッドを呼び出し、参照の指示を渡す。次いで、格納メソッドは、プロパティの値をプロキシーに格納する。ある実施形態では、各プロパティ更新が、リモート・オブジェクトの全ての変化したプロパティの値を収容することができる。即ち、呼び出し応答メッセージは、リモート・オブジェクトの変化したプロパティ毎に別個のプロパティ更新ではなく、リモート・オブジェクト毎に１つだけのプロパティ更新を収容する。
【００３８】
[0054]  図１２は、ある実施形態において、サーバー・コンポーネントのプロパティ値取得コンポーネントの処理を示す流れ図である。プロパティ値取得コンポーネント１２００は、値が変化した各リモート・オブジェクトのプロパティ毎に、プロパティ更新を呼び出し応答メッセージに追加するために呼び出される。ブロック１２０２において、このコンポーネントはプロパティ・テーブルの次のエントリーを選択する。判断ブロック１２０４において、全てのエントリーが既に選択されている場合、このコンポーネントは完了し、そうでない場合、このコンポーネントはブロック１２０６に進む。ブロック１２０６において、このコンポーネントは、選択したエントリーのオブジェクト識別子に対応する参照を引き出すために、ＩＤテーブル・オブジェクトの基準引き出しメソッドを呼び出す。ブロック１２０８〜１２１８において、このコンポーネントはループして、参照されたリモート・オブジェクトの各プロパティを処理する。ブロック１２０８において、このコンポーネントは、選択したエントリーによって参照されたゲッター・テーブルから次のゲッター・メソッドを選択する。判断ブロック１２１０において、全てのゲッター・メソッドが既に選択されている場合、このコンポーネントはブロック１２０２に戻り、プロパティ・テーブルにおいて次のエントリーを選択し、そうでない場合、このコンポーネントはブロック１２１２に進む。ブロック１２１２において、このコンポーネントは、参照されたリモート・オブジェクトの選択したゲッター・メソッドを呼び出す。判断ブロック１２１４において、プロパティの現在値が、このプロパティに対して選択したエントリー内の値と同じである場合、このコンポーネントはブロック１２０８にループし(loop back)、次のゲッター・メソッドを選択し、そうでない場合、このコンポーネントはブロック１２１６に進む。ブロック１２１６において、このコンポーネントは、プロパティのエントリー内の値を現在値にセットする。ブロック１２１８において、このコンポーネントは、オブジェクト識別子を有するプロパティ更新、プロパティ識別子、およびプロパティの現在値を呼び出し応答メッセージに追加し、次いでブロック１２０８にループして次のゲッター・メソッドを選択する。
【００３９】
[0055]  図１３は、ある実施形態において、クライアント・コンポーネントのプロパティ値格納コンポーネントの処理を示す流れ図である。プロパティ値格納コンポーネント１３００が呼び出されるのは、プロパティ更新を含む呼び出し応答メッセージを受信し、プロパティに対してローカルに格納されている値を更新するときである。ブロック１３０２において、このコンポーネントは呼び出し応答メッセージの次のプロパティ更新を選択する。判断ブロック１３０４において、全てのプロパティ更新が既に選択されている場合、このコンポーネントは完了し、そうでなければ、このコンポーネントはブロック１３０６に進む。ブロック１３０６において、コンポーネントは、ＩＤテーブル・オブジェクトの参照引き出しメソッドを呼び出し、選択したエントリーのオブジェクト識別子を渡し、対応するプロキシーに対する参照を受け取る。ブロック１３０８において、このコンポーネントは、プロキシーのスタティック・データー・メンバーによって参照された格納オブジェクトの格納メソッドを呼び出し、エントリーの値を渡す。次いで、このコンポーネントはブロック１３０２にループし、応答呼び出しメッセージの次のプロパティ更新エントリーを選択する。格納オブジェクトは、各プロパティを扱うために、別個の格納メソッドが生成されていてもよい。あるいは、格納オブジェクトは、オブジェクトの型およびプロパティの名称のような情報を有するプロパティ毎にエントリーを有するテーブルにアクセスする、１つの格納メソッドを有してもよい。
【００４０】
[0056]  図１４は、ある実施形態において、プロキシー・クラスに対するコードを自動的に生成するためのＯＯＲＰＣシステムのコード生成器を示す流れ図である。プロキシー・コード・コンポーネント１４００は、サーバーによってホストされたオブジェクトのクラス毎にインターフェースが渡され、プロキシー・クラス（例えば、ＪａｖａＳｃｒｉｐｔ）を生成する。ブロック１４０２において、コンポーネントは次のインターフェースを選択する。判断ブロック１４０４において、全てのインターフェースが既に選択されている場合、このコンポーネントは完了し、そうでない場合、このコンポーネントはブロック１４０６に進む。ブロック１４０６において、このコンポーネントはプロキシー・クラスに対して初期コードを生成する。初期コードは、クラスの名称、クラスの開始および終了シンボル（例えば、括弧）等を含むクラス・テンプレートを含むことができる。ブロック１４０８〜１４１２において、このコンポーネントはループして、ゲッター・メソッドではないインターフェースの各メソッドを処理する。ブロック１４０８において、このコンポーネントは次のメソッドを選択する。判断ブロック１４１０において、全てのメソッドが既に選択されている場合、このコンポーネントはブロック１４１４に進み、そうでない場合、このコンポーネントはブロック１４１２に進む。ブロック１４１２において、このコンポーネントはプロキシー・クラスの選択したメソッドに対してコードを生成し、ブロック１４０８に戻り次のメソッドを選択する。ブロック１４１４において、このコンポーネントは、コード生成器のプロキシー・プロパティ処理コンポーネントを呼び出して、プロパティ・クラスに対する格納クラスに対してコードを生成するために選択したインターフェースの指示を渡す。次いで、このコンポーネントはブロック１４０２にループし、次のインターフェースを選択する。
【００４１】
[0057]  図１５は、ある実施形態において、コード生成器のプロキシー・プロパティ処理コンポーネントの処理を示す流れ図である。プロキシー・プロパティ処理コンポーネント１５００は、プロキシー・クラスに対して格納クラスを生成し、プロキシー・クラスに対する格納オブジェクトに対する参照を格納するためにスタティック・データー・メンバーをプロキシー・クラスに追加するために呼び出される。ブロック１５０２において、このコンポーネントは格納クラスに対して初期コードを生成する。ブロック１５０４において、このコンポーネントは、プロキシー・クラスに、格納オブジェクトを参照するためのスタティック・データー・メンバーを追加する。ブロック１５０６において、このコンポーネントはインターフェースの次のプロパティを選択する。判断ブロック１５０８において、インターフェースの全てのプロパティが既に選択されている場合、このコンポーネントは完了し、そうでなければ、このコンポーネントはブロック１５１０に進む。ブロック１５１０において、このコンポーネントは、選択したプロパティに対して、呼び出し要求メッセージをサーバーに送る、プロキシー・クラスのセッター・メソッド(setter method)に対してコードを生成する。ブロック１５１２において、このコンポーネントは、選択したプロパティに対して、プロパティのローカル値を引き出す、プロキシー・クラスのゲッター・メソッドに対してコードを生成する。ブロック１５１４において、このコンポーネントは、選択したプロパティの値を呼び出し応答メッセージにおいて受け取り、プロキシーに格納するために、格納クラスの格納メソッドに対してコードを生成し、次いでブロック１５０６にループし、インターフェースの次のプロパティを選択する。
【００４２】
[0058]  ある実施形態では、ＯＯＲＰＣシステムのコード生成器は、サーバーがリモート・オブジェクトの呼び出しをサポートするためのサーバー・コンポーネントを自動的に生成することができる。コード生成器には、サーバーによってホストされたリモート・オブジェクトに対するインターフェースを設けることができる。コード生成器は、クライアントから呼び出し要求メッセージを受信するため、そして識別されたリモート・オブジェクトの識別されたリモート・オブジェクト・メソッドを呼び出して、識別された入力パラメーターを渡すためのコードを生成する。また、コード生成器は、呼び出されたリモート・オブジェクト・メソッドが戻った後に、クライアントに、リモート・オブジェクトのオブジェクト識別子、リモート・オブジェクト・メソッドのメソッド識別子、および呼び出されたリモート・オブジェクト・メソッドによって戻された出力パラメーターを有する呼び出し応答メッセージを送るためのコードも生成する。また、コード生成器は、インターフェースに基づいて、プロパティ値の同期をサポートするコードも自動的に生成することができる。
【００４３】
[0059]  図１６および図１７は、ある実施形態において、呼び出し要求の延期を示す流れ図である。図１６は、ある実施形態において、クライアント・コンポーネントの要求送出コンポーネントの処理を示す流れ図である。要求送出コンポーネント１６００を呼び出し、リモート・オブジェクトのメソッドの呼び出すための呼び出し要求を渡す（例えば、要求オブジェクトを通じて）。このコンポーネントは、メソッドの呼び出しが延期可能でないとき、サーバーに、任意の待ち行列に入れられた呼び出し要求を有する呼び出しメッセージを送る。ブロック１６０２において、このコンポーネントは呼び出し要求を要求キューに添付する。判断ブロック１６０４において、メソッドの呼び出しが延期可能である場合、このコンポーネントは完了し、そうでない場合、このコンポーネントはブロック１６０６に進む。ブロック１６０６において、このコンポーネントは呼び出し要求キューの呼び出し要求を、呼び出し要求メッセージに追加する。ブロック１６０８において、このコンポーネントはサーバーに呼び出し要求メッセージを送る。ブロック１６１０において、コンポーネントは要求キューを空にし、次いで完了する。
【００４４】
[0060]  図１７は、ある実施形態において、サーバー・コンポーネントの要求受信コンポーネントの処理を示す流れ図である。要求受信コンポーネント１７００は、サーバー・コンポーネントが呼び出し要求メッセージを受信したときに呼び出される。ブロック１７０２において、このコンポーネントは呼び出し要求メッセージの次の呼び出し要求を選択する。判断ブロック１７０４において、全ての呼び出し要求が既に選択されている場合、このコンポーネントは完了し、そうでない場合、このコンポーネントはブロック１７０６に進む。ブロック１７０６において、このコンポーネントは、呼び出し要求によって識別されたリモート・オブジェクトのメソッドを呼び出すことによって、選択した呼び出し要求を処理する。次いで、このコンポーネントはブロック１７０２に戻り、次の呼び出し要求を選択する。
【００４５】
[0061]  以下の章では、ＯＯＲＰＣシステムの態様の種々の実施形態について説明する。ＯＯＲＰＣシステムの実施態様は、実施形態の任意の組み合わせを採用することができる。以下で説明する処理は、ＯＯＲＰＣシステムを実装するコンピューター読み取り可能記憶媒体上に格納されたコンピューター実行可能命令を実行するプロセッサーを有するコンピューティング・デバイスによって実行することができる。
【００４６】
[0062]  ある実施形態では、リモート・オブジェクトがサーバーによってホストされた場合に、リモート・オブジェクト・クラスのリモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出すためにクライアントによって実行される方法を提供する。ブラウザーの制御下において、この方法は以下を実行する。この方法は、アプリケーションを含むウェブ・ページを引き出す。アプリケーションの制御下において、この方法は、プロキシー・クラスのプロキシーをインスタンス化する。このプロキシー・クラスは、リモート・オブジェクト・メンバー関数と同じ署名を有するプロキシー・メンバー関数を含む。この方法は、オブジェクト識別子をプロキシーと関連付ける。このオブジェクト識別子は、リモート・オブジェクトをサーバーに対して識別するときに使用するためのものである。この方法は、プロキシー・オブジェクトのプロキシー・メンバー関数を呼び出す。呼び出したプロキシー・メンバー関数の制御下において、この方法は、サーバーに呼び出し要求メッセージを送る。呼び出し要求メッセージは、プロキシーと関連付けられたオブジェクト識別子と、リモート・オブジェクト・メンバー関数の識別子とを含む。アプリケーションは、ブラウザーを必要とせずに、ブラウザーによって提供される機能を当てにしており、アプリケーションを実行するとき、アドオン機能にアクセスする。ある実施形態では、この方法は、更に、サーバーに呼び出し要求メッセージを送る。呼び出し要求メッセージは、リモート・オブジェクトをインスタンス化するために、作成リモート・オブジェクトのメンバー関数を呼び出すことを要求する。ある実施形態では、この方法は、更に、アプリケーションの制御下において、リモート・オブジェクトがインスタンス化されていることを示す呼び出し応答メッセージをサーバーから受信する。ある実施形態では、呼び出し応答メッセージは、サーバーによってリモート・オブジェクトに割り当てられたオブジェクト識別子を含む。ある実施形態では、呼び出し要求メッセージは、クライアントによってリモート・オブジェクトに割り当てられたオブジェクト識別子を含む。ある実施形態では、呼び出し要求メッセージは、プロキシー・メンバー関数に渡される入力パラメーターを含む。ある実施形態では、呼び出し応答メッセージは、プロキシー・メンバー関数によって戻される出力パラメーターを含む。ある実施形態では、プロキシーはプロキシー参照によって識別され、更に、プロキシー参照をオブジェクト識別子と関連付けるステップを含む。ある実施形態では、関連付けるステップは、オブジェクト識別子テーブルに、プロキシー参照およびオブジェクト識別子を含むエントリーを追加するステップを含む。ある実施形態では、リモート・オブジェクト・クラスおよびプロキシー・クラスは異なるプログラミング言語で実装される。ある実施形態では、プロキシー・クラスは、リモート・オブジェクト・クラスに対するインターフェース定義に基づいて、自動的に生成され、プロキシー・クラスはプロキシー・メンバー関数の実施態様を含む。ある実施形態では、プロキシー・メンバー関数の呼び出しは、非同期の呼び出しである。
【００４７】
[0063]  ある実施形態では、サーバーによってホストされたリモート・オブジェクト・クラスのリモート・オブジェクトにアクセスするために、クライアントにおいて実行するアプリケーションに対してプロキシー・クラスを生成するためにコンピューティング・システムによって実行される方法を提供する。この方法は、リモート・オブジェクト・クラスのインターフェースにアクセスし、各インターフェースは、リモート・クラスのリモート・オブジェクト・メンバー関数の署名を含む。リモート・オブジェクト・クラス毎に、この方法は、リモート・オブジェクト・クラスに対してプロキシー・クラスを生成する。プロキシー・クラスは、リモート・オブジェクト・クラスのリモート・オブジェクト・メンバー関数毎に、プロキシー・メンバー関数を含む。プロキシー・クラスの各プロキシー・メンバー関数は、プロキシー・メンバー関数の呼び出し時に、サーバーに呼び出し要求メッセージを送るために生成される。呼び出し要求メッセージは、リモート・オブジェクトのオブジェクト識別子、リモート・オブジェクト・メンバー関数のメンバー関数識別子、およびプロキシー・メンバー関数に渡される入力パラメーターを含む。この方法は、サーバーから呼び出し応答メッセージを受信した後に、リモート・オブジェクトのオブジェクト識別子、リモート・オブジェクト・メンバー関数のメンバー関数識別子、および呼び出し応答メッセージからの出力パラメーターを抽出し、リモート・オブジェクト・メンバー関数の呼び出しが完了したことを示すためのコードを供給する。ある実施形態では、この方法は、更に、サーバーに対してサーバー・コンポーネントを生成する。サーバー・コンポーネントは、ホストされたリモート・オブジェクトのインターフェースに基づいて、クライアントから呼び出し要求メッセージを受信し、識別されたリモート・オブジェクトの識別されたリモート・オブジェクト・メンバー関数を呼び出して、識別された入力パラメーターを渡し、呼び出したリモート・オブジェクト・メンバー関数が戻った後に、リモート・オブジェクトのオブジェクト識別子、リモート・オブジェクト・メンバー関数のメンバー関数識別子、および呼び出したリモート・オブジェクト・メンバー関数によって戻された出力パラメーターを有する呼び出し応答メッセージをクライアントに送るために生成される。ある実施形態では、アプリケーションのコードは、ブラウザーを必要とすることなく、ブラウザーによって提供される機能を当てにしており、アプリケーションを実行するときに、アドオン機能にアクセスする。
【００４８】
[0064]  ある実施形態では、プログラムのアプリケーション実行エンジンによって実行されるアプリケーションが、サーバーによってホストされたリモート・オブジェクト・クラスのリモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出すことを可能にするように構成されたクライアントを提供する。このクライアントは、コンピューター実行可能命令を実行するプロセッサーと、コンピューター実行可能命令を格納するコンピューター読み取り可能記憶媒体とを含み、コンピューター実行可能命令がプロセッサーによって実行されると、以下の処理を実行するようにクライアントを制御する。この処理は、プロキシー・クラスのプロキシーをインスタンス化する。プロキシー・クラスは、リモート・オブジェクト・メンバー関数と同じ署名を有するプロキシー・メンバー関数を含む。この処理は、オブジェクト識別子をプロキシーと関連付ける。オブジェクト識別子は、リモート・オブジェクトをサーバーに対して識別するときに使用するためのものである。この処理は、プロキシーのプロキシー・メンバー関数を呼び出す。呼び出したプロキシー・メンバー関数の制御下において、この処理は、サーバーに呼び出し要求メッセージを送る。呼び出し要求メッセージは、リモート・オブジェクトを識別するオブジェクト識別子と、リモート・オブジェクト・メンバー関数を識別するメンバー関数識別子とを含む。ある実施形態では、アプリケーションは、プログラムを必要とせず、プログラムによって提供される機能を当てにしており、アプリケーションを実行するときに、アドオン機能にアクセスし、アプリケーションのプロキシー・クラスは、リモート・オブジェクトのクライアントによるアクセスをサポートするために、リモート・オブジェクト・クラスのインターフェースから自動的に生成される。ある実施形態では、この処理は、更に、呼び出し要求メッセージを、サーバーに送る。この呼び出し要求メッセージは、リモート・オブジェクト・クラスのインスタンスをインスタンス化すること、およびリモート・オブジェクトがインスタンス化されたことを示す呼び出し応答メッセージをサーバーから受信することを要求する。ある実施形態では、この処理は、メンバー関数を有する作成プロキシーをインスタンス化する。これが呼び出されると、プロキシーのインスタンス化、および呼び出し要求メッセージの送出を指令する。ある実施形態では、呼び出し応答メッセージはオブジェクト識別子を含む。ある実施形態では、プログラムはブラウザーであり、アプリケーションは、ユーザーがブラウザーを介してウェブ・ページにアクセスしたことに応答して、ダウンロードおよび実行される。
【００４９】
[0065]  ある実施形態では、アプリケーション実行エンジンを有するプログラムによって実行されるアプリケーションが、サーバーによってホストされたリモート・オブジェクト・クラスのリモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出し、クライアントによってホストされたローカル・オブジェクト・クラスのローカル・オブジェクトのローカル・オブジェクト・メンバー関数のサーバーによる呼び出しをサポートすることを可能にするように構成されたクライアントを提供する。このクライアントは、コンピューター実行可能命令を実行するプロセッサーと、コンピューター実行可能命令を格納するコンピューター読み取り可能記憶媒体とを含み、コンピューター実行可能命令がプロセッサーによって実行されると、以下の処理を実行するようにクライアントを制御する。プログラムによって実行されるアプリケーションの制御下において、処理はプロキシー・クラスのプロキシーをインスタンス化する。このプロキシー・クラスは、リモート・オブジェクト・メンバー関数と同じ署名を有するプロキシー・メンバー関数を含む。この処理は、ローカル・オブジェクト・クラスのローカル・オブジェクトをインスタンス化する。この処理は、リモート・オブジェクト識別子を、プロキシーに対するプロキシー参照と関連付け、更にローカル・オブジェクト識別子をローカル・オブジェクトに対するローカル・オブジェクト参照と関連付ける。呼び出されたプロキシー・メンバー関数の制御下において、この処理は、サーバーに、リモート・オブジェクトを識別するリモート・オブジェクト識別子と、リモート・オブジェクト・メンバー関数を識別するメンバー関数識別子とを含む呼び出し要求メッセージを送る。ローカル・オブジェクト識別子を含みローカル・オブジェクト・メンバー関数を識別する呼び出し要求メッセージを、サーバーから受信すると、この処理は、含まれるローカル・オブジェクト識別子と関連付けられたローカル・オブジェクト参照を引き出し、引き出したローカル・オブジェクト参照によって参照されるローカル・オブジェクトのローカル・オブジェクト・メンバー関数を呼び出す。
【００５０】
[0066]  ある実施形態では、プロパティ値を同期させるためにクライアントによって実行される方法を提供する。この方法は、リモート・オブジェクト・クラスのリモート・オブジェクトに対応するプロキシー・クラスのプロキシーをインスタンス化する。リモート・オブジェクトは、サーバーにおいてインスタンス化される。プロキシー・クラスは、プロキシー・ゲッターを有する(with)プロパティを指定する。プロキシーのプロキシー・ゲッターは、プロキシーに格納されているプロパティの値を引き出すためのものである。この方法は、リモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出すために呼び出し要求メッセージを、サーバーに送る。この方法は、サーバーから、呼び出し要求メッセージに対する呼び出し応答メッセージを受信する。呼び出し応答メッセージがプロパティ更新を含むとき、この方法は、呼び出し応答メッセージから、プロパティ更新からのプロパティの値を抽出し、抽出した値をプロキシーに格納する。プロキシーに対するプロキシー・ゲッターが呼び出されると、この方法は呼び出し要求メッセージをサーバーに送る必要なく、プロパティの値をプロキシーから引き出すことを可能にする。ある実施形態では、プロキシーは、ブラウザーによって実行されるアプリケーションの一部である。ある実施形態では、サーバーに送るステップ、およびサーバーから受信するステップは、ＨＴＴＰメッセージを介して行われる。ある実施形態では、プロキシー・クラスは、プロパティに対する格納メンバー関数を有する格納クラスの格納オブジェクトに対する静的参照を含み、抽出するステップおよび格納するステップは、格納メンバー関数によって実行される。ある実施形態では、格納クラスは、プロキシー・クラスのプロパティ毎に、格納メンバー関数を含む。ある実施形態では、格納クラスはゲッター・テーブルを含む。ゲッター・テーブルは、抽出した値を格納するために、プロパティの識別子をそのプロパティに対する格納クラスの格納メンバー関数の識別子にマッピングし、更に プロパティの識別子をプロパティの型の識別子にマッピングする。ある実施形態では、格納メンバー関数は、プロキシーに対する参照が渡され、プロパティの型に基づいてプロパティの値の抽出、および参照されたプロキシーへの値の格納を実行する。ある実施形態では、格納メンバー関数には、プロキシーの識別子が渡される。ある実施形態では、呼び出し応答メッセージは、プロキシーの複数のプロパティの値を含む。ある実施形態では、呼び出し応答メッセージは、異なるプロキシーの複数のプロパティの値を含む。ある実施形態では、呼び出し応答メッセージは、以前の呼び出し応答メッセージがサーバーによって送られて以来値が変化したプロパティのみの値を含む。
【００５１】
[0067]  ある実施形態では、クライアントに格納されているプロパティ値を同期させるためにサーバーによって実行される方法を提供する。この方法は、クライアントから、サーバーによってホストされたリモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出す要求を受ける。この方法は、リモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出す。リモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出した後、この方法はリモート・オブジェクトのプロパティの値を引き出す。引き出した値が、プロパティに対して最後に引き出した値と同じでないとき、この方法は、呼び出し応答メッセージに、リモート・オブジェクトのオブジェクト識別子、プロパティのプロパティ識別子、および引き出した値を追加する。この方法は、クライアントに、リモート・オブジェクト・メンバー関数が呼び出されたこと、そしてプロパティの値が変化したことを示すための呼び出し応答メッセージを送るので、リモート・オブジェクトに対するクライアントのプロキシーのプロパティに対するゲッター・メンバー関数は、ローカルにサーバーにアクセスすることによって、プロパティの値を引き出すことができる。ある実施形態では、引き出すステップおよび送るステップは、複数のプロパティに対して実行される。ある実施形態では、複数のプロパティは異なるリモート・オブジェクトのプロパティを含む。ある実施形態では、引き出すステップおよび追加するステップは、リモート・オブジェクトのリモート・オブジェクト・メンバー関数が呼び出されたことを示すために送られる呼び出し応答メッセージ毎に実行される。
【００５２】
[0068]  ある実施形態では、リモート・オブジェクト・クラスのリモート・オブジェクトのプロパティの値と、プロキシー・クラスのプロキシーのプロパティの値との同期をサポートするためにコンピューティング・システムによって実行される方法を提供する。この方法は、リモート・オブジェクト・クラス毎にインターフェースの記述を入力する。リモート・オブジェクト・クラスに対するインターフェース毎に、この方法はプロキシー・クラスに対するコードを生成する。この方法は、プロキシー・クラスの各プロキシー・メンバー関数が、対応するリモート・オブジェクト上において対応するリモート・オブジェクト・メンバー関数を呼び出すための呼び出し要求メッセージを送るためのコードを生成する。この方法は、対応するリモート・オブジェクトにアクセスせずに、プロキシー・クラスのプロキシーにローカルに格納されているプロパティの値を引き出し、そして戻すために、プロキシー・クラスのプロパティのプロキシー・ゲッター・メンバー関数毎にコードを生成する。この方法は、プロキシー・クラスのプロパティの各プロキシー・ゲッター・メンバー関数が、プロパティに対してローカルに格納されている値を引き出すことができるように、サーバーから受け取ったプロキシー・クラスのプロパティの値を格納するためのコードを生成する。ある実施形態では、この方法は、更に、プロキシー・クラス毎に、プロパティの値を格納するためのコードに対する静的参照をプロキシー・クラスに追加する。ある実施形態では、プロパティの値を格納するためのコードは、格納クラスの一部として実装される。ある実施形態では、格納クラスはテーブルを含む。このテーブルは、プロキシー・クラスのプロパティ毎に、そのプロパティのプロキシー・ゲッター・メンバー関数によって値を引き出すことができるように、そのプロパティの値を格納するために、プロパティの識別子を格納メンバー関数にマッピングする。ある実施形態では、プロパティの識別子は、更に、サーバーから受信した呼び出し応答メッセージからプロパティの値を抽出するときに使用するために、プロパティの型の指示にマッピングされる。
【００５３】
[0069]  ある実施形態では、アプリケーションの呼び出し要求をサーバーのリモート・オブジェクトに送るためにクライアントによって実行される方法を提供する。この方法は、呼び出し要求を受ける。各呼び出し要求は、リモート・オブジェクト・クラスのリモート・オブジェクトに対応するアプリケーションのプロキシー・クラスのプロキシーからのものである。受けた呼び出し要求毎に、その呼び出し要求が延期可能であるとき、この方法はその呼び出し要求を格納する。呼び出し要求が延期可能でないとき、この方法は、格納されている呼び出し要求の内以前に送られていない各呼び出し要求、および受けた呼び出し要求を含む呼び出し要求メッセージを、サーバーに送る。この方法は、サーバーから呼び出し応答メッセージを受信する。各呼び出し応答メッセージは、１つ以上の呼び出し要求を含んだ呼び出し要求メッセージに対する応答である。少なくとも１つの呼び出し応答メッセージは、複数の呼び出し応答を含む。受信した呼び出し応答メッセージの呼び出し応答毎に、この呼び出し応答が出力パラメーターを含むとき、この方法は呼び出し応答からその出力パラメーターを抽出する。この方法は、アプリケーションに、呼び出し応答が受信されたことの指示と、あらゆる抽出された出力パラメーターとを供給する。ある実施形態では、呼び出し要求メッセージは、呼び出し要求が受け取られた順序を示す。ある実施形態では、呼び出し応答メッセージの呼び出し応答は、対応する呼び出し要求が受け取られた順序で処理される。ある実施形態では、呼び出し要求は非同期の呼び出し要求である。ある実施形態では、呼び出し要求が指定された時間量よりも長く格納されているとき、この方法は、その呼び出し要求を含む呼び出し要求メッセージを送る。ある実施形態では、未だ送られていない呼び出し要求を送る要求をアプリケーションから受けたことに応答して、この方法は、更に、その呼び出し要求を含む呼び出し要求メッセージを送る。ある実施形態では、呼び出し要求は、異なるサーバーによってホストされたリモート・オブジェクトに対して受け取られ、サーバーに送られる呼び出し要求メッセージは、そのサーバーによってホストされたリモート・オブジェクトに対する呼び出し要求のみを含む。ある実施形態では、アプリケーションはブラウザーの制御下において実行される。
【００５４】
[0070]  ある実施形態では、サーバーによってホストされたリモート・オブジェクトのメンバー関数を呼び出すためのアプリケーションの呼び出し要求を送るためのクライアントを提供する。このクライアントは、コンピューター実行可能命令を実行するプロセッサーと、コンピューター実行可能命令を格納するコンピューター読み取り可能記憶媒体とを含む。コンピューター実行可能命令がプロセッサーによって実行されると、以下の処理を実行するようにクライアントを制御する。この処理は、呼び出し要求を待ち行列に入れる。各呼び出し要求は、アプリケーションのリモート・オブジェクト・クラスのリモート・オブジェクトに対応する、アプリケーションのプロキシー・クラスのプロキシーからのものである。呼び出し要求は、リモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出すためのものである。呼び出し要求送出判断基準が満たされたとき、この処理は、サーバーに、待ち行列に入れられた各呼び出し要求を含む呼び出し要求メッセージを送る。この処理は、待ち行列に入れられた各呼び出し要求がもはや待ち行列に並べられていないことを示す。この処理は、サーバーから、呼び出し要求メッセージに応答する呼び出し応答メッセージを受信する。受信した呼び出し応答メッセージの呼び出し応答毎に、この処理は、呼び出し応答が受信されたという指示を、アプリケーションに供給する。ある実施形態では、呼び出し要求送出判断基準が満たされるのは、呼び出し要求が受け取られ、待ち行列に入れられないときである。ある実施形態では、呼び出し要求送出判断基準が満たされるのは、呼び出し要求が指定時間量よりも長く格納されているときである。ある実施形態では、呼び出し要求送出判断基準が満たされるのは、待ち行列に入れられた呼び出し要求を送る要求をアプリケーションから受けたときである。ある実施形態では、呼び出し要求メッセージは、呼び出し要求がアプリケーションによって生成された順序を示す。ある実施形態では、呼び出し応答メッセージの呼び出し応答は、対応する呼び出し要求が生成された順序で処理される。ある実施形態では、呼び出し要求は非同期の呼び出し要求である。ある実施形態では、異なるサーバーによってホストされたリモート・オブジェクトに対して呼び出し要求を受け、サーバーに送られる呼び出し要求メッセージは、そのサーバーによってホストされたリモート・オブジェクトに対する呼び出し要求のみを含む。ある実施形態では、アプリケーション実行エンジンを有するプログラムの制御下において、アプリケーションが実行される。
【００５５】
[0071]  ある実施形態では、アプリケーションの呼び出し要求を処理するためにサーバーによって実行される方法である。この方法は、クライアントから、呼び出し要求を含む呼び出し要求メッセージを受信する。各呼び出し要求は、アプリケーションのリモート・オブジェクト・クラスのリモート・オブジェクトに対応するアプリケーションのプロキシー・クラスのプロキシーからのものである。呼び出し要求は、リモート・オブジェクトのリモート・オブジェクト・メンバー関数を呼び出すためである。呼び出し要求メッセージの呼び出し要求毎に、呼び出し要求を処理する。この処理は、呼び出し要求から、リモート・オブジェクトのオブジェクト識別子、リモート・オブジェクト・メンバー関数のメンバー関数識別子、および入力パラメーターを抽出する処理を含む。この処理は、識別されたリモート・オブジェクトの識別されたリモート・オブジェクト・メンバー関数を呼び出して、入力パラメーターを渡す。呼び出されたリモート・オブジェクト・メンバー関数からの戻りのときに、この処理は、呼び出されたリモート・オブジェクト・メンバー関数によって戻された出力パラメーターを含む呼び出し要求に対する呼び出し応答を格納する。呼び出し要求を処理した後、この方法は、クライアントに、呼び出し応答を含む呼び出し応答メッセージを送る。ある実施形態では、呼び出し要求は、呼び出し要求メッセージによって指定された順序で処理される。ある実施形態では、呼び出し応答に対応する呼び出し要求は、呼び出し応答から識別可能である。ある実施形態では。
【００５６】
[0072]  以上、構造的特徴および／またはアクトに特定的な文言で主題について説明したが、添付する特許請求の範囲において定められる主題は、以上で説明した特定的な特徴やアクトに必ずしも限定されないことは理解されよう。逆に、以上で説明した特定的な特徴およびアクトは、特許請求の範囲を実施する形態例として開示したまでである。例えば、アプリケーションを実行するウェブ・ブラウザーのコンテキストでＯＯＲＰＣシステムについて主に説明したが、ＯＯＲＰＣは他のコンテキストでも使用することができる。例えば、顧客関係管理（「ＣＲＭ」：customer relationship management）システムが、ＣＲＭシステムをカスタム化するアプリケーションを開発することを可能にするのでもよい。このような場合、ＣＲＭシステムの顧客側コンポーネントが、ＣＲＭシステムのサーバー側コンポーネントを有するサーバーによってホストされたオブジェクトにアクセスするアプリケーションを実行する。このようなアプリケーションを実行するウェブ・ブラウザー、ＣＲＭシステム、およびその他のプログラムは、アプリケーション実行エンジンを有するプログラムと呼んでもよい。したがって、本発明は、添付する特許請求の範囲による以外では、限定されないものとする。
【図１】
2020506481.tif 000003
【図２】
2020506481.tif 000004
【図３】
2020506481.tif 000005
【図４】
2020506481.tif 000006
【図５】
2020506481.tif 000007
【図６】
2020506481.tif 000008
【図７】
2020506481.tif 000009
【図８】
2020506481.tif 000010
【図９】
2020506481.tif 000011
【図１０】
2020506481.tif 000012
【図１１】
2020506481.tif 000013
【図１２】
2020506481.tif 000014
【図１３】
2020506481.tif 000015
【図１４】
2020506481.tif 000016
【図１５】
2020506481.tif 000017
【図１６】
2020506481.tif 000018
【図１７】
2020506481.tif 000019
【国際調査報告】
2020506481.tif 000020
2020506481.tif 000021
2020506481.tif 000022