次に添付図面に関連して、特に図1〜図2に関連して、本発明の例示的な諸実施形態を実装可能なデータ処理環境の対応する図について説明する。図1〜図2は模範的なものに過ぎず、種々の実施形態を実装可能な環境に関するいかなる制限も主張または暗示するためのものではないことを認識されたい。描写された環境に対して多くの変更を行うことができる。
次に添付図面に関連して説明すると、図1は、本発明の例示的な諸実施形態を実装可能なデータ処理システムのネットワークの図表現を描写している。ネットワーク・データ処理システム100は、諸実施形態を実装可能なコンピュータのネットワークである。ネットワーク・データ処理システム100はネットワーク102を含み、このネットワークは、ネットワーク・データ処理システム100内でまとめて接続された様々なデバイスおよびコンピュータ間の通信リンクを提供するために使用される媒体である。ネットワーク102は、ワイヤ、無線通信リンク、または光ファイバ・ケーブルなどの接続部を含むことができる。
描写されている例では、サーバ104およびサーバ106は記憶装置108とともにネットワーク102に接続している。加えて、クライアント110、112、および114はネットワーク102に接続している。これらのクライアント110、112、および114は、たとえば、パーソナル・コンピュータまたはネットワーク・コンピュータにすることができる。描写されている例では、サーバ104は、クライアント110、112、および114にブート・ファイル、オペレーティング・システム・イメージ、およびアプリケーションなどのデータを提供する。クライアント110、112、および114は、この例ではサーバ104に対するクライアントである。ネットワーク・データ処理システム100は、図示されていない追加のサーバ、クライアント、およびその他のデバイスを含むことができる。
描写されている例では、ネットワーク・データ処理システム100は、相互に通信するために伝送制御プロトコル/インターネット・プロトコル(TCP/IP)というプロトコル・スイートを使用するネットワークおよびゲートウェイの世界的集合を表すネットワーク102を備えたインターネットである。インターネットの中心には、データおよびメッセージを経路指定する数千の商用、行政、教育、およびその他のコンピュータ・システムからなる、大ノードまたはホスト・コンピュータ間の高速データ通信回線のバックボーンがある。当然のことながら、ネットワーク・データ処理システム100は、たとえば、イントラネット、ローカル・エリア・ネットワーク(LAN)、または広域ネットワーク(WAN)などのいくつかの異なるタイプのネットワークとして実装することもできる。図1は、一例としてのものであり、種々の実施形態に関するアーキテクチャ上の制限としてのものではない。
次に図2に関連して説明すると、本発明の例示的な諸実施形態を実装可能なデータ処理システムのブロック図が示されている。データ処理システム200は、図1のサーバ104またはクライアント110などのコンピュータの一例であり、本発明の様々な例示的な諸実施形態のプロセスを実装するコンピュータ使用可能コードまたは命令をそこに配置することができる。
描写されている例では、データ処理システム200は、ノース・ブリッジおよびメモリ・コントローラ・ハブ(MCH)202と、サウス・ブリッジおよび入出力(I/O)コントローラ・ハブ(ICH)204とを含む、ハブ・アーキテクチャを使用する。プロセッサ206、メイン・メモリ208、およびグラフィックス・プロセッサ210は、ノース・ブリッジおよびメモリ・コントローラ・ハブ202に結合されている。グラフィックス・プロセッサ210は、たとえば、アクセラレイテッド・グラフィックス・ポート(AGP)を介してMCHに結合することもできる。
描写されている例では、ローカル・エリア・ネットワーク(LAN)アダプタ212はサウス・ブリッジおよび入出力コントローラ・ハブ204に結合され、オーディオ・アダプタ216、キーボードおよびマウス・アダプタ220、モデム222、読み取り専用メモリ(ROM)224、ユニバーサル・シリアル・バス(USB)ポートおよびその他の通信ポート232、ならびにPCI/PCIeデバイス234はバス238を介してサウス・ブリッジおよび入出力コントローラ・ハブ204に結合され、ハード・ディスク・ドライブ(HDD)226およびCD−ROMドライブ230はバス240を介してサウス・ブリッジおよび入出力コントローラ・ハブ204に結合されている。PCI/PCIeデバイスは、たとえば、イーサネット・アダプタ、アドイン・カード、およびノートブック・コンピュータ用のPCカードを含むことができる。ROM224は、たとえば、フラッシュ・バイナリ入出力システム(BIOS)にすることができる。ハード・ディスク・ドライブ226およびCD−ROMドライブ230は、たとえば、インテグレーテッド・ドライブ・エレクトロニクス(IDE)またはシリアル・アドバンスド・テクノロジー・アタッチメント(SATA)インターフェースを使用することができる。図示の通り、スーパー入出力(SIO)デバイス236もバス238を介してサウス・ブリッジおよび入出力コントローラ・ハブ204に結合することができる。
図2の例示的な実施形態では、オペレーティング・システムはプロセッサ206上で実行され、データ処理システム200内の様々なコンポーネントを調整し、その制御を行う。オペレーティング・システムは、Microsoft(商標)のWindows(商標)XPなどの市販のオペレーティング・システムにすることができる(MicrosoftおよびWindowsは、米国、その他の国、またはその両方におけるマイクロソフト社の商標である)。Java(商標)プログラミング・システムなどのオブジェクト指向プログラミング・システムは、オペレーティング・システムに併せて実行することができ、データ処理システム200上で実行されるJavaプログラムまたはアプリケーションからオペレーティング・システムに呼び出しを行う(JavaおよびすべてのJavaベースの商標は、米国、その他の国、またはその両方におけるサンマイクロシステムズ社の商標である)。
オペレーティング・システム、オブジェクト指向プログラミング・システム、およびアプリケーションまたはプログラムのための命令は、ハード・ディスク・ドライブ226などの記憶装置上に位置し、プロセッサ206による実行のためにメイン・メモリ208にロードすることができる。例示的な諸実施形態のプロセスは、たとえば、メイン・メモリ208、読み取り専用メモリ224などのメモリあるいは1つまたは複数の周辺装置に位置することができるコンピュータ実行可能命令を使用してプロセッサ206によって実行することができる。
図1〜図2のハードウェアは実装例に応じて様々になる可能性がある。フラッシュ・メモリ、同等の不揮発性メモリ、または光ディスク・ドライブなどのその他の内部ハードウェアまたは周辺装置は、図1〜図2に描写されたハードウェアに加えてまたはその代わりに使用することができる。また、例示的な諸実施形態のプロセスはマルチプロセッサ・データ処理システムに適用することもできる。
いくつかの例示的な例では、データ処理システム200は携帯情報端末(PDA)にすることができ、これは一般にオペレーティング・システム・ファイルまたはユーザ生成データあるいはその両方を保管するための不揮発性メモリを提供するためにフラッシュ・メモリとともに構成されている。バス238および240などのバス・システムは、システム・バス、入出力バス、およびPCIバスなどの1つまたは複数のバスで構成することができる。当然のことながら、このバス・システムは、任意のタイプの通信ファブリックまたはアーキテクチャに接続された種々のコンポーネントまたはデバイス間でデータの転送を可能にするファブリックまたはアーキテクチャを使用して実装することができる。通信装置は、モデムまたはネットワーク・アダプタなど、データを送受信するために使用される1つまたは複数のデバイスを含むことができる。メモリは、たとえば、メイン・メモリ208またはノース・ブリッジおよびメモリ・コントローラ・ハブ202内に検出されるようなキャッシュにすることができる。処理装置は1つまたは複数のプロセッサまたはCPUを含むことができる。図1〜図2に描写されている例および上記の例は、アーキテクチャ上の制限を暗示するためのものではない。たとえば、データ処理システム200は、PDAの形を取ることに加えて、タブレット・コンピュータ、ラップトップ・コンピュータ、または電話装置にすることもできる。
例示的な例では、サーバ104はホストとしてWikiアプリケーションを処理することができる。サーバ104の環境は、例示的な一実施形態によりクライアント110、112、および114などのクライアントが共同作業し、アプリケーションを開発できるようにする。これらのアプリケーションとしては、たとえば、気象関連アプリケーション、学校用の学籍登録および名簿、電子メール・アプリケーション、その他のタイプのビジネス指向アプリケーションを含むことができる。この種々の実施形態は、例示的な一実施形態によりWikiアプリケーションを開発するための共同環境を提供する際のサーバ側、クライアント側、またはその両方のプロセスを含むことができる。
例示的な諸実施形態では、現行のWikiアプリケーションが知識ベースまたは文書としてのテキストとファイルの協調を越えるアプリケーションの共同開発に適していないことを認識している。
次に図3を参照すると、本発明の例示的な一実施形態によりWikiアプリケーションを生成し使用する際に使用するためのコンポーネントを例示する図が描写されている。この例では、ユーザは、クライアント環境300と対話して、Wiki環境302によってサポートされるアプリケーションを生成し使用することができる。クライアント環境300は、図1のクライアント110などのクライアント上で実行されるソフトウェア・アプリケーションまたは環境である。Wiki環境302は、図1のサーバ104などのデータ処理システム上で実行される。
これらの例では、クライアント環境300のユーザは、あるページに関してWiki環境302に要求を送信することができる。ユーザは、これらの例ではクライアント環境300内のブラウザを介して要求を行う。Wiki環境302はそのページをユーザに返す。これらの例示的な例では、このページは、生成すべきページに関するコンテンツをユーザが操作し選択できるようにするJavaScriptを含む。例示的な諸実施形態では、これらのページは、アプリケーションへのユーザ・アクセスを可能にする共同Webページである。これらのアプリケーションは、クライアント・コンピュータのユーザによって使用し変更可能な共同アプリケーションである。
特に、種々の例示的な実施形態は、ユーザが共同作成ツールの機能を上回る機能を備えたアプリケーションを生成するための方法および装置を提供する。
これらの例の特徴の多くはハイパーテキスト・プリプロセッサ(PHP:HypertextPreprocessor)を介して提供される。PHPは、Wiki環境302上で実行されるWebアプリケーションを作成するためのプログラミング言語である。PHPは、動的Webコンテンツを生成するための高レベル・ツールとして設計されたスクリプト言語に埋め込まれたオープン・ソースのハイパーテキスト・マークアップ言語である。
特定の実装例に応じて、例示的な諸実施形態で提供される種々の特徴は、Java仮想マシン(JVM:Java virtual machine)などの仮想マシンの使用によって促進することができる。また、特定の環境に応じて、JavaScript以外のその他のスクリプト言語を使用して、これらのプロセスを実装することもできる。
次に図4を参照すると、本発明の例示的な一実施形態によるWikiアーキテクチャを例示する図が描写されている。これらの特定の例では、このアーキテクチャは、非常に簡単に完了(QED:quite easily done)のWikiアーキテクチャである。例示されている通り、Wiki環境400はWikiエンジン402を含む。このエンジンは、要求ハンドラ404と、コマンド・プロセッサ406と、ページ・コンポーザ408とを含む。要求ハンドラ404はクライアントから要求を受信する。
たとえば、ユーザは、ユニバーサル・リソース・ロケータ(URL:universalresource locator)の形でユニバーサル・リソース識別子(URI:universalresource identifier)をWiki環境400に送信することができる。この要求は処理のために要求ハンドラ404によって受信される。これらの例では、要求ハンドラ404によって処理される各要求ごとに1つのページが生成される。また、要求ハンドラ404は、完全なハイパーテキスト・マークアップ・ページでなく、ハイパーテキスト・マークアップ言語ソース・フラグメントであるAJAXベースの対話を処理するために「ページ・フラグメント(page fragment)」も生成する。
コマンド・プロセッサ406は、要求ハンドラ404によって受信された要求に応答して、ページまたはページ・フラグメントを構築するために種々のコマンドを処理する。さらに、コマンド・プロセッサ406は、コマンドおよびテキスト・フラグメントの処理が完了したときにページを描画する。ページ・コンポーザ408もユーザによるページ要求の生成に関係する。これらの例では、ページ・コンポーザ408は、あるページに関するレイアウト、ページ・ボディ・コンテンツ、およびスクリプト・コレクションに使用される。
Wiki環境400は補助機能410も含む。この例では、補助機能410は、リスト412と、コメント414と、電子メール416と、添付物(attachment)418とを含む。リスト412により、ユーザは他のユーザが見るためのリストを生成することができる。さらに、コメント414を使用して、ユーザは種々のページに注解またはその他のテキストを追加することができる。添付物418により、ユーザは特定のページにファイルを添付することができる。電子メール416により、ページが更新または変更されたときにユーザに通知するか、あるいはユーザが添付物としてあるページに電子メールを送信することができる。また、電子メール416により、単一または複数のユーザが指定のページに対する変更についてメッセージを受信することができる。ユーザは、Wikiのリッチ・サイト・サマリ(RSS:rich site summary)フィードに加入して、Wikiのページが変更される時期を判断することができる。
さらに、Wiki環境400はWikiコマンド420を含む。例示された実施形態内のWikiコマンド420は、組み込みコマンド422とカスタム・コマンド424という2つのタイプのコマンドを含む。組み込みコマンド422は、Wiki環境400内に存在するコマンドまたはサービスである。カスタム・コマンド424は、外部ソースを介して提供されるコマンドを参照する。基本的に、これらのコマンドにより、ユーザはあるページに関するデータを含め処理することができる。
1つまたは複数の実施形態では、Wikiコマンド420は、サービス指向アーキテクチャ(SOA:service oriented architecture)の使用を伴う。このようなSOAコマンドにより、ユーザはページとともにサービスを含めることができる。これらの例では、コマンドは、アプリケーションおよびそれらが実行される競合プラットフォームとは無関係の明確なインターフェースによってサービスを参照することができる。
描写されている例では、サービスはソフトウェア・モジュールである。これらのタイプのサービスは、典型的には、ウェブ・サービス記述言語(WSDL:web service description language)などの標準準拠インターフェースに基づくものである。当然のことながら、Wikiコマンド420によって参照されるサービスは任意のタイプのインターフェースを伴う可能性がある。これらのコマンドは様々な形を取ることができる。たとえば、コマンドは、金融、気象、マッピング、ニュースおよびイベント、検索、行政、または国際情報に関するものにすることができる。
データベース426は、ユーザによって要求され作成されたページなどの情報を含む。さらに、ページの改訂、添付物、コメント、およびその他の情報がデータベース426内に保管される。情報は、典型的には、例示的な諸実施形態では、データベース426内のテーブル428の形で保管される。
次に図5を参照すると、本発明の例示的な一実施形態によりページを描画する際のデータフローを例示する図が描写されている。これらの例では、ページの処理が完了し、そのページがクライアントに送信できる状態になると、そのページがサーバ上に描画される。図5に例示されている種々のコンポーネントは、図4のWikiエンジン402などのWikiエンジンを介して操作される。
これらの例示的な諸実施形態に例示されているプログラミング・アーキテクチャおよびモデルは、クライアント上のブラウザを使用してWikiコンテンツの視覚的アセンブリを可能にする。クライアントによって要求されたものはいずれも、概念上、ページである。たとえば、ページおよび変数名などのユニバーサル・リソース識別子モデルを使用して変数が参照される。さらに、これらの例では、ページがデータ構造として使用される。変数は、その後の使用のために保管される。これらの変数としては、セッション変数、要求変数、および永続変数を含む。
例示的な例では、ユーザはリストを介して構造化データを作成する。これらのリストについては、照会、検索、または結合、あるいはそれらの組み合わせを行うことができる。リストを操作する際に、ユーザは、作成検索更新削除(CRUD:create, retrieve, update, and delete)プロセスを使用する。
Wikiコントローラ500はユーザからユニバーサル・リソース識別子506を受信する。Wikiコントローラ500は、ルータ502とオブジェクト変数504とを含む。ルータ502は、要求処理を適切な要求ハンドラに委任する。オブジェクト変数504は、処理コンポーネント間の相互接続を提供する。たとえば、Wikiコントローラ500は、Wikiオブジェクト508へのポインタである「Wiki」というオブジェクト変数504を有する。図5の各オブジェクトは、オブジェクト対話に必要なその他のリソースへの参照であるオブジェクト変数を有する。Wikiコントローラ500は、図4の要求ハンドラ404などの要求ハンドラによって処理される。
ユニバーサル・リソース識別子506を受信したことに応答して、Wikiコントローラ500は、Wikiオブジェクト508のインスタンスをインスタンス化する。例示されている通り、Wikiオブジェクト508は、オブジェクト変数510、変数512、PHPセキュリティ514、電子メール・チェック516、ユーザ518、およびページ520を含む。Wikiオブジェクト508は、要求が受信されたときに必ずインスタンス化されるインスタンスであり、ページ520に関するコンテンツを生成するために使用されるオブジェクトのすべてに関するリポジトリとして動作する。
これらの例では、オブジェクト変数510は、ページ520を処理するために必要な情報を含む。変数512は、セッション522に保管されたセッション情報を含む。このセッション情報は、これらの例では、あるページとのユーザ対話中またはあるページの生成中に使用される情報である。オブジェクト変数510内のより永続的なデータはデータベース524に保管される。データベース524は、描写されている例では、ページを生成するためにまたはユーザによって行われた変更を保管するために使用可能なすべての情報を保管する。
PHPセキュリティ514は、クライアントによって識別されたコードを実行可能であるかどうかを判断するためにならびにそのコードの実行を開始するために使用される機能である。PHPは、主にサーバ側アプリケーション上で使用されるオープン・ソース・プログラミング言語である。これらの例示的な例では、PHPコードは、Wiki環境内の種々のオブジェクトによって実行することができる。これらの例では、ユーザは、クライアント側ならびにサーバ側からPHPコードを実行することができる。電子メール・チェック516は、ページ520が描画され、ユーザに送信されたときにページ520上に表示可能な電子メール・メッセージの有無をチェックするために、Wikiオブジェクト508内に提供される。ユーザ518は、ユーザ特権レベル、ID、およびセッション・ログなど、ユーザに関する情報を含む。
ページ526は、Wikiオブジェクト508内に含まれるページ520のより詳細な例である。この例では、ページ526は、オブジェクト変数528、添付物530、プロセス532、アクセス534、レイアウト536、スクリプト538、およびコンテンツ540を含む。
これらの例では、オブジェクト変数528は、ページ・データ構造に関する変数のインスタンスを含む。たとえば、レイアウト情報を提供するためにセクション・アレイが存在する可能性がある。コンテキスト・ポインタはルートWikiコマンドを参照することができる。内部ページIDを参照するためにオブジェクト変数528内にインスタンスIDが存在する可能性がある。これらの種々の変数は、ユーザに送信すべき、ページ526などのページを描画するために必要な情報を含む。
添付物530は、あるページ上に提示可能な添付物の識別コードである。ユーザがある添付物を選択した場合、その添付物はその時点でユーザにダウンロードすることができる。プロセス532は、ユーザに配信すべきページを生成するために使用されるコードを含む。これらの例示的な例では、プロセスは、たとえば、そのページに関するコンテンツを識別し、任意の添付物を識別し、ユーザに送信すべきページに含めることができる任意のスクリプトを識別するためのメソッドである。
アクセス534は、そのページに配置すべきコンテンツについてユーザがどのアクセス特権を有するかを判別するために使用される。このようなアクセス特権は、アクセス制御リスト(ACL)542を使用する一実施形態で識別される。含めるべきコンテンツは、そのページを要求している特定のユーザが有するアクセス権に応じて、ページ526について様々になる可能性がある。このユーザは、ページ526を要求しているユーザである。ページ526に関するコンテンツを生成する際に、オブジェクト変数528はWikiコマンド・コンテキスト544を参照する。このコマンド・コンテキストは、オブジェクト変数546とコンテンツ548を含む。オブジェクト変数546は、あるページのコンテンツのメモリ内バージョンを表す。これらの変数は、コマンドのリストと、現行ページを含むテキスト・フラグメントのリストとを含む。コンテンツ548は、ページ・コンテンツを操作するために使用されるオブジェクト・メソッドを表す。
ページ526内のプロセス532を実行する際に、コマンド550からの1組のコマンドがWikiコマンド・コンテキスト544を介して識別される。Wikiコマンド・コンテキスト544は、コマンド550から1組のコマンド・インスタンスを生成する。Wikiコマンド・コンテキスト544は、コンテンツ540を構文解析し、コマンドをロードして、フラグメント552などのフラグメントのツリー構造を作成する。フラグメント552は、オブジェクト変数554およびコンテンツ556も含む。フラグメント552は、描画されていない形のページ526の一部分である。この例では、Wikiコマンド・コンテキスト544は、そのページに含めるべきコマンドの構造を表すフラグメントを含む。これらは、ユーザ操作可能なコマンドである。プロセス532が完了すると、ページ526は要求側ユーザに送信される。データ・ハブ558は、その対話で後で使用するために保存される。また、この例では、データ・ハブ558は、ユーザがページ526内のコンポーネントと対話するときに復元され、プロセスおよびデータ構造を含む。データ・ハブ558内のプロセスは、フラグメント552内のページに関するどのコマンドが、データ・ハブ558によって受信可能な任意のデータまたはコマンドのコンシューマであるかを識別するために使用される。さらに、データ・ハブ558は、結果をクライアントに返すことになる。これらの結果は、クライアント上に位置するデータ・ハブに送信される。
次に図6を参照すると、本発明の例示的な一実施形態によりWikiアプリケーションのためのクライアントおよびサーバ上のコンポーネントを例示する図が描写されている。この例では、クライアント環境600は、図3のクライアント環境300のより詳細な例証である。これらの例示的な諸実施形態のクライアント環境600は、インターネットなどのネットワークに対する接続性を有するクライアントWebブラウザまたはその他の何らかのアプリケーションの形を取ることができる。Wiki環境601は、図1のサーバ104などのデータ処理システム上で実行される。
この例では、クライアント環境600はページ602を受信する。ページ602は、ヘッダ604、フッタ606、左マージン608、右マージン610、メニュー612、およびボディ614などの複数のコンポーネントを含む。ヘッダ604、フッタ606、左マージン608、および右マージン610は、ページをレイアウトするためのページ・コンポーネントである。これらのコンポーネントは、ハイパーテキスト・マークアップ言語(HTML)コンテンツなどの様々なコンテンツを含む。
メニュー612は、ページ602上でまたはページ602に併せてユーザが実行できるアクションまたは機能へのアクセスを可能にする。たとえば、メニュー612は、サーバに要求を送信するためのメニュー項目であって、授与されたときに、ユーザがWYSIWYGエディタでページ・コンテンツを編集できるようにするメニュー項目を含むことができる。
この例では、ボディ614内に種々のタイプのコンテンツが検出される。この例では、ボディ614は、HTMLコンテンツ616、日付情報618、および変数620を含む。また、ボディ614は、コマンド622、624、626、628、630、および632も含む。コマンド622、624、626、628、630、および632は、図4のWikiコマンド420などのWikiコマンドである。これらのコマンドは、ページ602を介して提示されるWikiアプリケーション用のコマンドである。データ・ハブ634とともにコマンド622、624、626、628、630、および632により、ページ602内の動的コンテンツを提供する。
データ・ハブ634は、図5のデータ・ハブ558と同様に、Wiki環境内のデータ・ハブ・オブジェクトである。しかし、データ・ハブ634はクライアント側データ・ハブである。データ・ハブ634は、ページ602内のコマンドとWiki環境601内のコマンドとの間でイベント・オブジェクトを送受信するための属性および1組のメソッドを含む。データ・ハブ634は、ページ602内のコマンドとWiki環境601内のコマンドとの間でイベントまたはデータあるいはその両方を送受信するための属性および1組のメソッドを含む。
イベント・オブジェクトは、ページ602などのWikiページに関連するコマンド間で伝送されるイベントを定義するデータ・オブジェクトである。イベント・オブジェクトは、イベント・データを含むことができるが、これを含むよう要求されているわけではない。これらの例では、イベントは、タスク、プログラム、またはコマンドにとって重要な出現または出来事など、何かが発生したことを示すメッセージである。たとえば、イベントは、ユーザ入力の受信、最小必須引数セットの収集、コマンド動作の完了、所与の時間の発生、あるいは任意のその他の活動、入力またはデータの受信、出現、出来事、または活動を含むことができる。
ページ602内の種々のタイプのコンテンツの例証は、Wikiアプリケーションをユーザに提示できる方法を描写するために提示されている。しかし、この例証は、Wikiアプリケーションで使用可能なコンテンツのタイプおよび範囲に関する制限を暗示するためのものではない。たとえば、ページ602は、本発明の例示的な諸実施形態の範囲を逸脱せずに、図6に例示されていないその他の追加のコンテンツ、コマンド、またはコンポーネント、あるいはそれらの組み合わせを含むことができる。
ユーザは、ページ602内のコンテンツを操作して、Wikiアプリケーションを使用するか、またはWikiアプリケーションが実行する方法を変更するか、あるいはその両方を行うことができる。換言すれば、ユーザは、ページ602用のコンテンツまたは機能あるいはその両方を生成または変更するために、これらのコマンドの図解表現を操作することにより、ページ602からコマンドなどのコンテンツの追加またはコンテンツの削除を行うことができる。
この例では、Wiki環境601は、図3のWiki環境302および図4のWiki環境400などのWiki環境である。Wiki環境601は、コマンド・ツリーまたは抽象構文ツリーの形でコマンド640〜650を含む。コマンド640〜650はWiki環境で更新される。コマンド640〜650およびコマンド624〜632は、実装例が異なるが、同様のコマンドを参照する。たとえば、コマンド632は、クライアント環境に関連付けられ、ユーザによってクライアント環境600で更新される。対応するコマンド650は、ネットワーク接続によるAJAX636を使用して非同期JavaScriptおよび拡張可能マークアップ言語によりWiki環境601で更新される。
AJAX636は、Wikiページなどの対話型Webアプリケーションを作成するためのWeb開発技法である。AJAX636は、要求されたページに対してユーザが変更を行うたびにページ全体がリロードされないように、シーンの背後で関連ホスト・サーバと少量のデータを交換する。AJAX636は、ページ602などのページの対話性、速度、応答性、および有用性を高めるためのものである。例示的な諸実施形態ではAJAXまたはJSONを介するデータ交換を描写しているが、所与の1組のコンポーネント間で合意に達した任意の通信プロトコルを使用して、本発明の例示的な諸実施形態によりデータを交換することができる。
Wiki環境601内のコマンド640、642、644、646、648、および650は、データ・ハブ638と対話する。データ・ハブ638は、図5のデータ・ハブ558などのサーバ側データ・ハブである。この例示的な例では、クライアント環境600のデータ・ハブ634と、データ・ハブ638は、AJAX640を介してイベントまたはデータあるいはその両方を交換する。AJAX636および640は、クライアント環境600とWiki環境601との間でデータを転送するためのフォーマットとして拡張可能マークアップ言語(XML:extensible markup language)を使用して通信することができるが、プリフォーマット・ハイパーテキスト・マークアップ言語(HTML)、プレーン・テキスト、およびJavaScriptオブジェクト表記(JSON:JavaScript object notation)を含む、いずれのフォーマットでも機能する。JavaScriptオブジェクト表記は、軽量コンピュータ・データ交換フォーマットである。JSONはJavaScriptのオブジェクト・リテラル表記のサブセットであるが、その使用はJavaScriptを必要としない。
例示的な諸実施形態は、アプリケーションWikiのためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードを提供する。Wikiアプリケーションは、単一または複数のユーザが静的および対話型コンテンツを効率よく統合できるようにする共同Web環境である。Wikiページは、Wikiアプリケーション内のページである。本発明の例示的な諸実施形態により、ユーザはWikiページを容易に作成し管理することができる。ユーザは、ライブ・コンテンツをドラッグ・アンド・ドロップすることにより、Wikiページを編集することができる。ライブ・コンテンツは、変化する情報に基づいて更新される動的コンテンツである。たとえば、ライブ・コンテンツは、気象レーダー基地にリンクされたサーバによって更新される、指定の地理的位置に関する気象グラフィックを含むことができる。
Wikiページはページ・ツリー・ビューに保存される。ページ・ツリー・ビューは、ページとサブページを含むコンテンツ階層である。ページ・ツリー・ビューは、Wikiスペース、ページ空間、ツリー、またはその他のコンテンツ階層と呼ぶこともできる。現在の記述内の各ページは、必要なその他のサブページ用のコンテンツ・プロバイダとコンテナの両方にすることができる。すべてのページがコンテンツを含むことができ、同時にコンテナと見なすことができるので、ページ・ツリー・ビューは他のファイル構造とは異なる。ページ・ツリー・ビュー内のページは、各ページに割り当てられた名前によって区別される。ページはノードおよびリーフ・ノードを含む。ノードは、他のWikiページ用のフォルダまたはコンテナとしてコンテンツおよび機能を表示することができる。リーフ・ノードは厳密にコンテンツを提供する。
次に図7を参照すると、本発明の例示的な一実施形態によりライブ・コンテンツをドラッグするための模範的なディスプレイ画面が描写されている。Wikiページ700は、図6のページ602などのページである。Wikiページ700は、設計モードで具体的に編集することができる。たとえば、ユーザは、Wikiページが編集されていることを示す、非常に簡単に完了(QED)のチェックボックスをチェックすることができる。設計モードでは、Wikiページ700はパレット702を表示することができる。パレット702は、協力してWebページを操作するために使用されるツールバーまたは1組のツールである。たとえば、ユーザは、パレット702を使用して、Wikiページ700のボディ704に表示するためのライブ・コンテンツを選択することができる。ボディ704は、Wikiページ700の一部分であり、ユーザ指定のコンテンツを表示するためにカスタマイズし編集することができる部分である。
パレット702は、任意の数のアイコン706、708、および710を含むことができる。各アイコンは使用可能なコマンドの図解表現である。パレット702は、コマンド、データ、ページ・コンテンツ、Wikiユーティリティ、データ・サービス、カスタマイズ済みリスト、および任意の数のその他の特徴を含むことができるコンテンツを表示するために使用することができる。
アイコン706は、たとえば、アイコンの形でGoogle(商標)検索ツールへのライブ・リンクにすることができる。アイコン708は、Google(商標)マップへのライブ・リンクにすることができる(Google、Google Search、およびGoogle Mapsは、米国、その他の国、またはその両方におけるグーグル社の商標である)。アイコン710は、リッチ・サイト・サマリまたはリアリー・シンプル・シンジケーション(RSS:really simple syndication)フィードにすることができる。リッチ・サイト・サマリは、Webコンテンツを配信(syndicate)し集成(aggregate)するオープン・メソッドを提供する、拡張可能マークアップ言語(XML)のプロトコルおよびアプリケーションである。リッチ・サイト・サマリを使用すると、ユーザは、Webサイトからの見出し、リンク、記事要約(article summary)を供給するデータ・フィードを作成することができる。ユーザは、ボディ704内のニュース・アグリゲータ(news aggregator)を介してWikiページ700に配信されたWebサイトからのコンテンツを絶えず更新している可能性がある。ニュース・アグリゲータは、これらのタイプのフィードを受信するように具体的に調整されたソフトウェアの1つである。
一例では、ユーザは、アイコン708をパレット702からボディ704にドラッグすることにより、ボディ704にGoogle(商標)マップを表示することができる。ユーザは、図8に記載されるように、プロパティ・エディタを使用して、Wikiコマンドによって表示されたコンテンツをさらにカスタマイズすることができる。ページ・コンテンツ内の既存のWikiコマンドは、既存のWikiコマンドのプロパティを編集可能であることを示す、アイキャッチャ(eye-catcher)712などのアイキャッチャを表示する。
次に図8を参照すると、本発明の例示的な一実施形態によりコマンドのプロパティを編集するためのディスプレイ画面が示されている。現代のアプリケーションWikiは、不快なページ・リフレッシュおよび概念的なコンテキスト・スイッチなしでユーザがコマンド設定を変更できるようにし、ユーザがページを編集することを要求しない、Wiki「マークダウン(markdown)」コマンド属性を編集する視覚的手段を必要とする。
アプリケーションWikiは、ユーザがハイパーテキスト・マークアップ言語のマークアップを把握または学習しなければならないという負担を軽減する。これらの例では、アプリケーションWikiは、短い文字シーケンス、行位置(line position)、および空白(white space)の組み合わせを使用する、リストおよびテーブルならびにその他のハイパーテキスト・マークアップ言語構成体を作成するための速記構文(shorthand syntax)を導入する。たとえば、リスト項目は、ある行の1桁目の単一アステリスク(*)と、それに続く単一スペースによって定義されるのに対し、ハイパーテキスト・マークアップ言語では<OL><LI></LI></OL>というタグが必要である。アプリケーションWikiによって導入された速記構文は、ハイパーテキスト・マークアップ言語によるコンテンツの作成とWiki環境でのコンテンツの作成との相違点を強調するために「マークダウン」と呼ばれる。Wikiコマンド・クラスは、「マークダウン」コマンドを編集するための視覚的プロパティ・エディタの生成をサポートする。
Wikiページ800は、図7のWikiページ700などのWikiページの部分図である。パレット802は、図7のパレット702と同様のものである。Wikiページ800は、ストア(store)およびリストというアイキャッチャ804および806を表示するWikiコマンドを含む。
アイキャッチャ804および806を表示するWikiコマンドのプロパティは、プロパティ・エディタ808を使用して編集することができる。プロパティとは、図7のWikiページ700上にコンテンツを表示するためにアイキャッチャによって表されるコマンドによって使用される属性、データ、フィールド、およびその他の情報である。プロパティ・エディタ808により、ユーザはライブ・コンテンツによって表示された情報をカスタマイズすることができる。プロパティ・エディタ808は、ハイパーテキスト・マークアップ言語と、Wikiページ・コンテンツとともにブラウザ・クライアントにダウンロードされるJavaScriptから構成される。たとえば、ユーザは、Google(商標)マップを表示するための特定のアドレスを指定することができる。同様に、ユーザは、照会を行い、Wikiページ800に表示される情報を制限することができる。
ユーザは、プロパティ・エディタ808を使用して、その視覚表現をサイズ設定できるようにするWikiコマンド用の幅と高さの値を入力することができる。さらに、プロパティ・エディタ808を使用して倍率を入力することができ、データ・ソースの名前ならびに最大値および最小値は他のいくつかの例である。プロパティ・エディタ808は、Wikiコマンドの可変性のポイントをユーザに対して表面化するために使用される。
たとえば、図5のプロセス532は、必要に応じて各コマンド用のデフォルト・プロパティ・エディタを生成することができる。各Wikiコマンドは、Wikiコマンド用の可変性の固有のポイントを表面化するためにカスタム・プロパティ・エディタに寄与することができる。あるコマンドのためのアイキャッチャ804または806を選択すると、その関連コマンド用のプロパティ・エディタが表示される。
次に図9を参照すると、本発明の例示的な一実施形態によるページ・ツリー・ビューが描写されている。ページ・ツリー・ビュー900は、Wikiページの編成をユーザに対して視覚的に表示するための視覚的記憶構造である。ページ・ツリー・ビュー900は、Wikiアプリケーション内のWikiページの名前またはタグを示している。タグは、Wikiのコンテンツをカテゴリ化するために使用されるユーザ割り当てラベルである。これらの例の各ページはノードまたはリーフ・ノードである。
Wikiスペース902は、ページ・ツリー・ビュー900のベース・ページであり、ページ・ツリー・ビュー900のコンテンツを参照するために使用することもできる。テスト(test)904、試験(testing)906、トップレベル908、およびWiki910を含むWikiスペース902およびその他のベース・ページまたはノードは、他のWikiページに関するフォルダまたはコンテナとしてコンテンツおよび機能を表示できるので、ページ・ツリー・ビュー900は他のファイル・システムおよびデータ構造とは異なる。「+」符号などのグラフィカル・インジケータは、Wikiページがノードであることを示すことができる。Wikiスペース902は、ノードによって表される各ページがコンテナおよびコンテンツ・プロバイダになり得る、平らな階層を使用する。たとえば、Wikiスペース902は、コンテンツを含むが、ハローワールド(helloworld)912、ホームページ914、およびメニューテスト(menutest)916を含む、Wikiサブページまたはリーフ・ノードにリンクするために使用することもできる。ページ・ツリー・ビュー900内のベース・ページは、これらの例ではコンテンツ・プロバイダおよびページ・コンテナの両方として表示することができる。
ユーザは、ページ・ツリー・ビュー900を使用して、Wikiページをナビゲートすることができる。たとえば、Wikiページをクリックすることにより、Wikiページのコンテンツまたはサブページあるいはその両方が表示される。その結果、ユーザは、ページ名を選択することにより、容易にWikiをナビゲートすることができる。
次に図10を参照すると、本発明の例示的な一実施形態によるWikiページのためのディスプレイ画面が示されている。Wikiページ1000は、図6のWikiページ602などのページである。ユーザは、図7のアイキャッチャ708およびパレット702などのパレット内のアイキャッチャを使用して、ライブ・コンテンツをWikiページ1000にドラッグしている可能性がある。
たとえば、出張者は、来るべき出張のために行き先のリスト1002を表示するようにWikiページ1000を前に変更している可能性がある。行き先のリスト1002内のそれぞれの位置をクリックすることにより、Wikiページは、その番地に関する全米地図1004、天気予報1006、ならびに局地的警報1008を表示する。カスタマイズされた情報により、ユーザは、その出張に関する気象その他の状況を考慮して計画するとともに、それぞれの会議の場所を視覚的に描くことができる。局地的警報1008は、営業会議に関連する可能性のあるローカル・イベントをユーザに通知して、指定の地理的位置に関する進行中のイベントおよび新しいストアへのリンクを含む可能性がある。
例示的な諸実施形態は、Wiki環境で表示するためのWebページを処理するためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードをさらに提供する。追加されたコンポーネントは、最終的なビューを描画する前に他のコンポーネントと対話することができる。コンポーネントは、ページ供給コンテキスト(page serve context)から新しい属性およびパラメータ設定を発見できるようになっている。最終的なビューを描画する前にコンポーネントが入力を妥当性検査し、エラーを報告するために、妥当性検査メカニズムが使用される。ターゲットになっているイベントは、ページ供給シーケンスのライフサイクル内で処理される。単一サーバ上で同じコンポーネントの複数バージョンが管理される。
次に図11を参照すると、本発明の例示的な一実施形態による抽象構文ツリーのブロック図が示されている。抽象構文ツリー環境1100は、抽象構文ツリー1102を形成し処理するために使用される様々なコンポーネントを含む。
Wikiコマンド・テキスト(WCC:Wiki commandcontext)1104は、図6のページ602などのWikiページのマークアップ言語から抽象構文ツリー1102を作成するオブジェクトである。Wikiコマンド・テキスト1104は、コマンドの抽象構文ツリーの親である。Wikiコマンド・テキスト1104は、あるページまたはソース・フラグメントに関するコマンドをロードする責任がある。抽象構文ツリー1102は、Wikiソースに関する図6のコマンド640、642、644、646、648、および650などのコマンドから構成される。ツリーは、リーフまたはノードを含むように広がるソースまたはベースを含むデータ構造である。ツリー内の相互接続ノードは、他の相互接続ノードに依存しているコマンドを表す。ノード1106〜1110などのノードは抽象構文ツリー1102内の種々のコマンドを表す。
たとえば、ノード1106は、アコーディオンと命名され、アコーディオンに対してユーザによって割り当てられた属性および変数を内面化し、クライアント・ブラウザ環境をターゲットにするアコーディオン用のハイパーテキスト・マークアップ言語フラグメントを放出するために必要なステップを実行する。ノード1108は、テンプレートと命名され、アコーディオンと命名されたノード1106の子である。ノード1106は、クライアント・ブラウザ環境上で表示するためにアコーディオン内のタブの名前を提供する。ノード1110は、予報と命名され、Wikiページ内に天気予報を挿入するためのコマンドである。
データ・ハブ1112は、図6のデータ・ハブ638などのデータ・ハブである。データ・ハブ1112は、前順走査(pre-order traversal)で抽象構文ツリー1102を進み、各ノードで特定の機能を呼び出すことにより、抽象構文ツリー1102を処理する。たとえば、ノード1114は、緯度と経度を提供するための機能を有する。ノード1114は、指定のアドレスに関する緯度と経度を提供する、Google(商標)マップのコマンドにすることができる。
そのページの複雑さに応じて、Wikiコマンド・コンテキスト(WCC)1104によって表された抽象構文ツリー1102は、2つのタイプの子ノードを含むことができ、第1のタイプは前に記述されたものであり、第2のタイプはそのルートがもう1つのWikiコマンド・コンテキストである他の抽象構文ツリーである。もう1つのWikiコマンド・コンテキストは、同じく処理する必要のある他のWikiソース・フラグメントを生成するユニフォーム・リソース・インジケータ要求を処理するときに使用される。
本発明の例示的な諸実施形態は、Wiki環境の機能を拡張するためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードをさらに提供する。Wikiは、単一または複数のユーザが静的および対話型コンテンツを効率よく統合できるようにする共同Webページである。共同環境を容易に作成するためにオブジェクトをどのように拡張するかを定義するためにオブジェクト指向フレームワークが使用される。Wiki環境は、中核ランタイム・コンポーネントに対する変更を必要とせずに中核環境を拡張するための基本メカニズムをサポートする必要がある。
例示的な諸実施形態は、任意の数のWikiコマンドを含む配備済み環境を管理するためにWikiコマンドを処理する、クライアントおよびサーバ側エレメントを含む。さらに記述するように、Wikiコマンド・クラスの具象実装例を処理するために、Wiki環境内のベース・クラスと中核処理エンジンの抽象セットが使用される。中核処理エンジンは、Wiki環境の機能を拡張するために中核ランタイム・コンポーネントの処理およびライフサイクル管理をサポートする。中核処理エンジンは、図4のWikiエンジン402などのエンジンである。
次に図12を参照すると、本発明の例示的な一実施形態によるコマンドのブロック図が描写されている。Wikiコマンドは、図3のWiki環境302などのWikiの機能およびプロセスを実装するために使用されるコマンドである。図12は、Wikiコマンド・メタデータ・インターフェースと関連コマンド1200を記述している。コマンド1200は、図5のコマンド550などのコマンドである。
コマンド1200は、カタログ1202、ライフサイクル1204、プロパティ編集1206、およびページ処理1208を含むことができる、様々なコマンド・カテゴリを含む。コマンド1200には、いくつかの例しか示されていない。たとえば、コマンドとしては、Get/setCategory1210、getName1212、およびgetDescription1214を含む。Get/setCategory1210は、そのWikiコマンドが属すカテゴリを記述する。getName1212はそのコンポーネントの簡略名である。getDescription1214は、ユーザがそのコマンドを理解するのを支援するためのWikiコマンドのテキスト記述である。
カタログ1202は、以下のような他のコマンドも含むことができる。
getHelpは、ユーザがそのページまたはパレット内のWikiコマンドについて躊躇しているときに提示されるヘルプ・テキストである。
getSampleは、そのコマンドを挿入するために使用されるサンプルWikiコマンド・ソースを返す。
getIconは、そのパレット内のWikiコマンドについて表示すべきアイコンを返す。
getDragContentは、そのWikiコマンドに関するパレットからの初期ドラッグ中に使用されるWikiソース・フラグメントを返す。
getDropContentは、そのWikiコマンドが初期配置にドロップされるときに挿入されるWikiソース・フラグメントを返す。
ライフサイクル1204は、wasSaved1216、wasDeleted1218、およびwasCopied1220などのコマンドを含むことができる。wasSaved1216は、そのコマンドがサーバ環境で保存された後に呼び出される。これらの例では、wasDeleted1218は、そのコマンドがサーバ・ページ環境から除去されたときに呼び出される。wasDeleted1218は、所与のページ上のWikiコマンドに関連する永続リソースをWikiコマンドが一掃するための手段を提供する。wasCopied1220は、所与のWikiコマンドを含むページが他の名前にコピーされたときに呼び出される。wasCopied1220は、新たにコピーされたページ上で必要な任意の永続変更をWikiコマンドが適用するための手段を提供する。
ライフサイクル1204は、以下のような他のコマンドも含むことができる。
getVersionは、そのWikiコマンドのバージョンを返す。
getParametersは、そのWikiコマンドに関連するパラメータのリストを返す。
aboutToSaveは、そのコマンドがサーバ環境に保存されようとしているときに呼び出され、そのコマンドを持続するために必要な任意の活動を実行するための機会をそのコマンドに提供する。
configureは、そのコマンドを構成する必要があるときに呼び出される。
get/setPluginDataは、configureコマンド中にそのWikiコマンドに関連するデータを保存/取得する。
wasUndeleteは、前に所与のページから削除された後でそのコマンドがそのページに戻されたときに呼び出される。
wasRenamedは、そのWikiコマンドを含むページが名称変更されたときに呼び出される。
aboutToExportは、そのWikiコマンドがWikiの保存フォーマットにエクスポートされる直前に呼び出される。
wasImportedは、そのWikiコマンドがWiki保存フォーマットからインポートされた直後に呼び出される。
プロパティ編集1206は、generatePropertyEditor1222およびallowEdit1224などのコマンドを含むことができる。例示的な実施形態では、generatePropertyEditor1222は、そのコマンドがクライアント側編集画像(client side editing visual)を生成できるようにするために中核エンジンによって呼び出される。generatePropertyEditor1222が実装されない場合、Wikiコマンドのパラメータを編集するためにデフォルト・プロパティ・エディタが生成される。プロパティ・エディタは、ユーザがそのWikiコマンドに関するパラメータ、値、テキスト、変数、およびその他のデータを入力できるようにするインターフェースである。allowEdit1224は、そのWikiコマンドが編集可能であるかどうかを判断する。
ページ処理1208は、render1226、drawEyeCatcher1228、refreshOnUpdate1230、およびgetTargetDIV1232などのコマンドを含むことができる。render1226は、そのWikiコマンドがハイパーテキスト・マークアップ言語用の出力ストリームにそれ自体を表示する必要があるときに呼び出される。drawEyeCatcher1228は、クライアント上でそのWikiコマンドを操作するためにクリックすることができるコンテンツを提供するためにそのコマンドがそのページ上に描かれるときに呼び出され、通常、選択されたコマンド上でプロパティ・エディタを呼び出す。アイキャッチャは、単集合編集機能を追跡するために使用される。refreshOnUpdate1230は、プロパティ・エディタを使用してそのコマンドの引数が更新された後でそのページ全体をリフレッシュしなければならないかどうかを判断するために呼び出される。getTargetDIV1232は、更新すべきハイパーテキスト・マークアップ言語DIVの名前を返す。DIVは、ハイパーテキスト・マークアップ言語ファイル内のディビジョン/セクションを表す。各コマンドは、クライアント・ブラウザ上のDIV内に表示される。DIVは、Wikiエンジンが自動的に生成するか、またはそのコマンドがgetTargetDIVプロトコルを実装することによって1つを提供する可能性のある、関連識別コードを有する。
ページ処理1208は、以下のような他のコマンドも含むことができる。
getDestinationDivは、そのコマンドがページ上で再描画されたときに更新すべきハイパーテキスト・マークアップ言語/DIVの名前識別コードを返す。コマンドを描画することは、コード化されたデータを指定の方法で再生または表示することである。たとえば、アイキャッチャは、そのアイキャッチャを表示するためにWikiページに描画されたハイパーテキスト・マークアップ言語を生成することによって描画される。
getArgumentsは、処理のためにコマンドに渡される実引数のリストを返す。引数は、そのコマンドの仮引数リストを返すgetParameters呼び出しによって返されるパラメータの「実際の」値を含む。
refreshOnInsertは、そのコマンドがWikiページ上に配置された後でそのページ全体をリフレッシュしなければならないかどうかを判断するために呼び出される。
areArgumentsSetは、そのコマンドがそのinvokeメソッドを「始動(fire)」してモデル・アクションを実行できるようにそのWikiコマンドに関するすべての入力引数が満足されているかどうかを指定する値を返す。
initは、内部Wikiコマンドを初期設定するために呼び出される。
上記のメソッドおよびコマンドは、図32〜図44のプロセスを提供するために使用される。
次に図13を参照すると、本発明の例示的な一実施形態によるプロパティ編集コンポーネントを示す図が描写されている。プロパティ編集システム1300は、アイキャッチャ1302と、プロパティ・エディタ1304と、セレクタ・エディタ1306とを含む。
アイキャッチャ1302は、選択されたコマンドの図解表現である。たとえば、アイキャッチャ1302は、指定のアドレスのマップを表示するためのGoogle(商標)マップのコマンドを表すことができる。アイキャッチャ1302は、選択されたコマンドをユーザが編集できるようにするプロパティ・エディタ1304を呼び出すためにアイコン形式でクリックすることができる。
プロパティ・エディタ1304は、コマンドの属性を確立するために使用される。たとえば、属性は、情報のタイプ、プロパティ、パラメータ、その属性に関するバインディング情報、ならびにデフォルト値および許容値を指定することができる。たとえば、プロパティ・エディタ1304により、ユーザは、Google(商標)マップ用のアドレスを指定して、要求されたマップを生成することができる。セレクタ・エディタ1306は、ユーザが特定の属性メタデータを確立できるようにする専門のプロパティ・エディタである。たとえば、ユーザは、セレクタ・エディタ1306を使用してアドレス編集を指定することができる。プロパティ・エディタ1304で属性を確立している間に、特定の属性は、自動的にセレクタ・エディタ1306を開き、プロパティ・エディタ1304内のある属性またはフィールドに関するより具体的な情報を入力することができる。
本発明の例示的な諸実施形態は、サーバ側データ・ハブのリモート・データ処理システムでクライアント側データ・ハブから受信したWikiページに関する要求を処理するためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードをさらに提供する。サーバ側データ・ハブは、そのページ要求がサーバによって受信されたときにインスタンス化される、サーバ上のデータ・ハブ・オブジェクト・インスタンスである。サーバ側データ・ハブは、特定のページ・インスタンスに関連付けられる。したがって、サーバが、そのページの変更または更新などのそのページに関連するクライアントからの要求を受信するたびに、特定のページに関連するサーバ側データ・ハブのインスタンスを検索しロードして、その要求を処理することができる。
サーバ側データ・ハブは、複数の属性と1組のメソッドとを含む。この1組のメソッドはデータ・ハブ上の1つまたは複数のメソッドであり、サーバ上のプロデューサ・コマンドから共同アプリケーションのインスタンスに関連する1組のコンシューマ・コマンドにイベントを送信するために使用される。この1組のコンシューマ・コマンドは、これらの例ではサーバ側、クライアント側、またはその両方に位置することができる。
コンシューマ・コマンドは、そのコマンドの機能を処理するかまたは実行するかあるいはその両方を行うためにイベントまたはデータあるいはその両方を受信する必要があるか、または受信することを希望するコマンドである。コンシューマ・コマンドは、所与のトピックに関連するイベント・オブジェクトを受信するためにそのデータ・ハブに登録する。
たとえば、検索コンポーネントは、検索コンポーネントの検索機能を実行するために検索入力語を受信する必要があるか、または受信することを希望する。したがって、検索コンポーネントは、検索入力語のコンシューマである。したがって、検索コマンドは、検索語および使用可能なトピックに関連するイベントのコンシューマである。
また、コンシューマ・コマンドは、1つまたは複数の特定のトピックに関連するイベントを聴取しているかまたは待っているので、リスナ・コマンド(listener command)と呼ぶこともできる。上記の例では、検索コンポーネントは、使用可能な検索語に関連するトピックを聴取している。
これらの例では、1組のコンシューマは、単一コンシューマならびに2つ以上のコンシューマを含む。
クライアント側データ・ハブは、要求されたページがクライアントで受信されたときにクライアントに作成される。このクライアント側データ・ハブは、Wikiアプリケーションなどの共同アプルケーションのインスタンスに関連付けられる。
サーバ側データ・ハブと対応するクライアント側データ・ハブを使用すると、要求されたページに関連するWikiコマンドは、サーバ側データ・ハブまたはクライアント側データ・ハブあるいはその両方を介してコマンド間で伝送されたイベントを経路指定することにより、ページ要求の処理中に、より容易に対話することができる。
本発明の例示的な諸実施形態により、サーバ側データ・ハブまたはクライアント側データ・ハブあるいはその両方を使用して、イベント・メカニズム(eventing mechanism)を使用して任意のアプリケーション内のコマンド間でイベントを経路指定することができる。イベント・メカニズムは、Wikiコマンドなど、アプリケーション内のモジュールがそのアプリケーション内の他のモジュールと通信できるようにするメカニズムである。たとえば、Webブラウザはイベント・メカニズムを使用する。加えて、電子メール・コンポーネントおよびニュースリーダなどのWebアプリケーションもイベント・メカニズムを使用する。
次に図14を参照すると、本発明の例示的な一実施形態によりWikiアプリケーションのためのクライアントおよびサーバ上のコマンド間のデータフローを例示する図が描写されている。サーバ1400は、図1のサーバ104および106などのサーバである。サーバ1400は、図3のWiki環境302、図4のWiki環境400、および図6のWiki環境601などのWiki環境の一部である。
データ・ハブ1402は、図5のデータ・ハブ558および図6のデータ・ハブ638などのサーバ側データ・ハブである。データ・ハブ1402は、ページに関する要求がクライアント1408から受信されたときにサーバ1400上に作成される。したがって、サーバ側データ・ハブ1402は、クライアント側データ・ハブから要求を受信するとインスタンス化される。サーバ側データ・ハブ1402は、Wiki環境内のコマンド間でイベントを伝搬または経路指定するための属性およびメソッドを有するデータ・ハブ・オブジェクトのインスタンスである。クライアント1408上のユーザから受信したページ要求に関連するイベントおよびコマンドを処理するために、サーバ側データ・ハブ1402上の1組のメソッドが使用される。
Wikiコマンド1404は、図4のコマンド422、図5のコマンド550、および図6のコマンド640〜650など、Wikiシステム内に存在するWikiコマンド・オブジェクトである。Wikiコマンド1404により、ユーザは、ページにデータを含めるかまたはページに関するデータを処理するか、あるいはその両方を行うか、もしくは要求されたWikiページに関連する任意のその他の機能を行うことができる。この例では、Wikiコマンド1404は、図5のWikiページ・オブジェクト526などのWikiページ・オブジェクトのページ・プロセス・ループによって処理される。
データ・ハブ1402は、Wikiコマンド1404の引数パラメータによって要求された必須データまたは入力値あるいはその両方が存在するかどうかを判断する。すべての必須データまたは入力値あるいはその両方が存在する場合、データ・ハブ1402は、Wikiコマンド1404上でinvokeメソッドをトリガする。invokeメソッドは、Wikiコマンド1404をトリガして、サーバ側データ・ハブ1402へのイベント1406を始動する。イベント1406は、イベントを定義するイベント・オブジェクトである。
この例示的な例では、イベント1406は、サーバ1400上のWikiコマンド1404によって始動される。しかし、本発明の例示的な諸実施形態により、イベント1406は、クライアント側データ・ハブ1410からサーバ側データ・ハブ1402によって受信されたイベントも含むことができる。このような場合、イベント1406は、クライアント側Wikiコマンド1412によって始動されたイベント・オブジェクトであるイベント1407など、クライアント上のコマンドによって始動されたイベントになるであろう。他の例示的な例により、イベント1407は、クライアント側Wikiコマンド1412によって生成され、クライアント上で処理するかまたはサーバ1400上で処理するためにサーバ側データ・ハブに経路指定するためにクライアント側データ・ハブ1410に送信されたイベントを含むことができる。
Wikiコマンド1404からイベント1406を受信すると、データ・ハブ1402は、処理のためにイベント・キューにイベント1406を送信する。イベント・キューは、イベント・オブジェクトが処理されるまでそのイベント・オブジェクトを保管するためのバッファまたはデータ構造である。
processEventsフェーズ中に、サーバ側データ・ハブ1402はイベント1406を処理する。イベント1406の処理中に、サーバ側データ・ハブ1402は、Wikiコマンド1404などのコマンドがイベント1406のコンシューマ・コマンドとして登録されるかどうかを判断する。コンシューマ・コマンドは、所与のイベント・トピックに関連するイベントを必要とするコマンドである。イベント・トピックは、イベント・オブジェクトに関連する主題またはテーマである。たとえば、ユーザが検索語を入力した結果として始動されたイベント・オブジェクトは、「検索(search)」または「検索使用可能(search available)」イベント・トピックを有することになるであろう。
コンシューマ・コマンドは、所与のトピックに関するコンシューマ・コマンドとして、データ・ハブに登録する。したがって、所与のトピックに関するイベント・オブジェクトがデータ・ハブによって受信されると、データ・ハブは、所与のイベント・トピックについて登録された1組のコンシューマ・コマンドにそのイベントを送信することができる。
登録されたコンシューマ・コマンドは、所与のトピックのイベントのコンシューマとして登録したコマンドである。たとえば、表示コマンドは、事故などのトピックに関する複数のデータ・セットを集約する。このコマンドは、マップ・ディスプレイ上に表示するために報告し、トピック「事故」に関するコンシューマ・コマンドとしてデータ・ハブに登録することになる。データ・ハブが事故に関するイベントを受信すると、表示コマンドを含む、トピック「事故」について登録されたすべてのコンシューマ・コマンドに事故イベント・オブジェクトが送信される。表示コマンドが事故トピック・イベントを受信すると、表示コマンドは、そのデータを消費または使用して、事故データを示すマップ・ディスプレイを生成するか、または前に表示されたマップを更新して新しい事故データを示すことになる。
データ・ハブ1410は、処理のためにWikiコマンド1412にイベント1406を送信する。データ・ハブ1410は、Wikiコマンド1412によって要求された所与の引数/パラメータに関する必須データまたは入力値あるいはその両方がすべてWikiコマンド1412に存在するかどうかを判断する。すべての必須データまたは入力値あるいはその両方が存在する場合、データ・ハブ1410は、Wikiコマンド1412上でinvokeメソッドをトリガする。データ・ハブ1410がWikiコマンド1412上でinvokeメソッドを呼び出したことに応答して、Wikiコマンド1412は処理のためにデータ・ハブ1410にイベント1407を送信するかまたは始動する。イベント1407が完全に処理されると、データ・ハブ1410は表示のためにブラウザまたはクライアントにイベント1406を送信することになる。イベントがハイパーテキスト・マークアップ言語コードなど、ブラウザで表示するために適切なフォーマットになっていると、そのイベントは完全に処理される。
したがって、例示的な諸実施形態は、ページに関する要求を処理するためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードを提供する。サーバ側データ・ハブは、リモート・データ処理システム上のクライアント側データ・ハブからそのページに関する要求を受信する。クライアント側データ・ハブは、共同アプリケーションのインスタンスに関連付けられる。サーバ側データ・ハブは、1組のメソッドを使用して、初期ページ描画プロセス中にその要求を処理する。この1組のメソッドは、共同アプリケーションに関連する1組のコンシューマ・コマンドにサーバ上のプロデューサ・コマンドからイベントを送信するために使用される。
次に図15を参照すると、本発明の例示的な一実施形態により初期ページ描画プロセス中のサーバ上のコマンド間のデータフローを例示する図が描写されている。データ・ハブ1500は、図5のデータ・ハブ558および図6のデータ・ハブ638などのサーバ側データ・ハブである。この例示的な例では、データ・ハブ1500は、ハイパーテキスト・プリプロセッサ(PHP)で実装される。Wikiコマンド・プロデューサ1502は、サーバに関連するコマンドである。プロデューサは、他のWikiコンポーネントによって使用または消費可能なデータを提供するWikiコマンド・コンポーネントである。この例示的な例では、Wikiコマンド・プロデューサ1502は、トピック「自動車(car)」に関するイベントのプロデューサとして登録する。トピック「自動車」のプロデューサとしてWikiコマンド・プロデューサ1502を登録するために、データ・ハブ1500は、トピック「自動車」に関連するプロデューサIDに関するオブジェクト変数にWikiコマンド・プロデューサ1502のIDを追加する。
Wikiコマンド・コンシューマ1506は、サーバに関連するコマンドである。Wikiコマンド・コンシューマ1506は、トピック「自動車」1508に関するコンシューマとしてデータ・ハブ1500に登録する。トピック「自動車」のコンシューマとしてWikiコマンド・コンシューマ1506を登録するために、データ・ハブ1500は、データ・ハブ1500上のコンシューマ・オブジェクト変数内のコンシューマ・コマンドIDのアレイにWikiコマンド・コンシューマ1506のIDを追加する。
Wikiページ1510は、Wiki環境にロードされている所与の要求されたページに関連するプロセス・ループを有するオブジェクトである。initフェーズ中に、サーバはinitメソッドを呼び出して、Wikiコマンド・プロデューサ1502など、所与の要求されたページに関連するすべてのコマンドを初期設定する。初期設定時に、コマンドは、Wikiコマンド・プロデューサ1504などのプロデューサ・コマンドとして、またはWikiコマンド・コンシューマ1506などのコンシューマ・コマンドとして、データ・ハブに登録する。
Wikiコマンド・プロデューサ1502は、データを検索し、Wikiコマンド・プロデューサ1502が有するデータまたはイベントが始動できる状態になると、トピック「自動車/使用可能」を有するイベントを始動する。Wikiコマンド・プロデューサ1502がイベント・トピック「自動車/使用可能」イベント1512を始動すると、そのイベントはデータ・ハブ1500に送信される。データ・ハブ1500は、データ・ハブ1500内のイベント・キュー1514にトピック「自動車/使用可能」イベントを追加する。イベント・キューからトピック「自動車/使用可能」イベントを処理した後、イベント・トピック「自動車」について登録したすべてのコンシューマにトピック「自動車/使用可能」イベントが送信される。
Wikiページ・オブジェクトのWikiページ・プロセス・ループは、第一のprocessEventsメソッドを呼び出す。このprocessEventsフェーズ中に、データ・ハブは、Wikiコマンド・プロデューサ1502によって始動された「自動車/使用可能」イベント・オブジェクトを含む、サーバ側データ・ハブ上のイベント・キュー内のイベントを処理する。データ・ハブ1500は、イベント・キューからイベント「自動車/使用可能」を検索する。データ・ハブ1500は、Wikiコマンド・コンシューマ1506を含む、イベント・トピック「自動車」1518用のコンシューマとして登録された各コマンド上でcallbackメソッドを呼び出す。このイベントは、callbackメソッドへの引数/パラメータとしてWikiコマンド・コンシューマ1506に渡される。consumer callbackメソッドは、callbackメソッド内でコードを実行することにより、イベント・オブジェクトを処理する。
すべてのコンポーネントを初期設定した後であって、要求されたページを描画する前に実行すべき追加の処理が存在する場合、各コマンドは、discoverメソッドを呼び出すことにより、コードを実行する機会を有する。第2のprocessEventsフェーズ1520は、discoverフェーズ中に始動した可能性のあるすべてのイベントを処理するために呼び出される。
最後に、Wikiページ・オブジェクト1510は、すべてのコマンド上でrenderフェーズを呼び出す。renderフェーズ中に、すべてのコマンドは、クライアント・ブラウザで要求されたページとして描画するために、ハイパーテキスト・マークアップ言語コードを生成し、クライアントに送信できるように、その使用可能なデータのすべてを備えていなければならない。Wikiコンシューマ1506がプロデューサによって生成された「自動車」データのテーブル表示である場合、renderフェーズは図16に示されているような自動車のテーブルを生成できるであろう。
次に図16を参照すると、本発明の例示的な一実施形態によりユーザからのページ要求に応答して生成されたWikiページ1600を例示する図が示されている。上記で述べた通り、あるページに関連するすべてのコマンドは、プロデューサおよびコンシューマとしてデータ・ハブに登録することができる。イベントはプロデューサによって生成されるので、そのイベントは、ページ全体またはページ・フラグメントを描画するためにハイパーテキスト・マークアップ言語またはJavaScriptを描画するためにコンシューマによって使用される。ハイパーテキスト・マークアップ言語またはJavaScriptは、表示のためにクライアント・ブラウザに送信される。
したがって、すべての対話は、Wikiページ・プロセス・ループ中にデータ・ハブ全体に波及する。これらの対話の結果として、すべてのイベントが描画時に処理される。したがって、ページ1600などの初期描画ページは、Wikiページの正確なビューを完全に描写する。換言すれば、サーバから新しいページをロードすることに関連するすべてのイベントはサーバ側データ・ハブにより処理されるので、クライアントは、初期描画ページを変更してページ・ビューを正確なものにするためにイベントを始動する必要はない。
あるページに関する初期要求がサーバで処理されると、そのサーバは、要求されたページに関するハイパーテキスト・マークアップ言語コードまたはJavaScriptあるいはその両方を生成する。ハイパーテキスト・マークアップ言語コードまたはJavaScriptあるいはその両方がクライアントで受信されると、クライアント・ブラウザで表示するために新しいページがクライアントでロードされる。
ページ・ロード・プロセス中に、そのページに関するハイパーテキスト・マークアップ言語コードまたはJavaScriptコードあるいはその両方がクライアント側データ・ハブ・オブジェクトを作成する。クライアント側データ・ハブ・オブジェクトは、サーバでの初期ページ・プロセス・ループ中にサーバ側データ・ハブに登録されたサーバ上のコマンドと同じように、クライアント上のすべてのコマンドをプロデューサ・コマンドおよびコンシューマ・コマンドとしてクライアント側データ・ハブに登録する。
初期ページがロードされた後でクライアントで行われるコマンド対話をクライアント上で完全に含み処理することができる場合、これらの例ではそのコマンド対話はサーバに送信されない。換言すれば、Wikiコマンドは、クライアント上で対話して、クライアント側のユーザ・アクションまたはその他の出現によってトリガされた追加の入力またはイベントを反映するように表示されたページを変更する。コンポーネント対話をクライアント上で完全に処理することができる場合、クライアント生成イベントはサーバに送信されない。このイベントは、クライアントで完全に処理することができる可能性がある。その通りである場合、サーバは、いずれにしてもそのイベントの処理に関係する必要はない。描写されている諸実施形態では、変更(modify)という用語は、新しいデータまたは新しいページ・コンテンツあるいはその両方を反映するために、ページを更新することまたはページに対してその他の変更を行うことを含む。
したがって、本発明の例示的な諸実施形態は、クライアント側データ・ハブがイベントを処理するためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードを提供する。クライアント側データ・ハブは、所与のトピックに関するイベントを受信する。このイベントは、クライアントに関連するプロデューサ・コマンドによって生成される。クライアント側データ・ハブは、イベントを処理し、所与のトピックに関する1組のコンシューマ・コマンドを識別する。クライアント側データ・ハブは、所与のトピックに関する1組のコンシューマにそのイベントを送信する。クライアント側データ・ハブは、その1組のコンシューマのうちの1つまたは複数のコンシューマから新しいページ・コンテンツを受信し、表示されたページはその新しいページ・コンテンツで更新されて、更新済みページを形成する。
次に図17を参照すると、本発明の例示的な一実施形態によりクライアント・ブラウザで表示された描画ページを例示する図が描写されている。描画ページ1700には、コンポーネント1702からの検索入力がイベント・トピック「検索/使用可能」のプロデューサとしてクライアント側データ・ハブに登録している。エコー・コンシューマ・コンポーネント1704は、トピック・イベント「検索/使用可能」のコンシューマとしてクライアント側データ・ハブに登録している。コンシューマ・コンポーネント1704は、検索コンポーネントが「検索/使用可能」イベントを始動したときにユーザが検索コンポーネント1702に入力したものを反響するように機能する。
図18は、本発明の例示的な一実施形態により新しいページがロードされ、クライアント・ブラウザで表示された後のクライアント側データ・ハブ上のコンポーネント間のデータフローを例示する図である。データ・ハブ1800は、図6のデータ・ハブ634および図14のデータ・ハブ1410などのクライアント側データ・ハブである。データ・ハブ1800は、ページ・ロード中にクライアント上に作成される。この例示的な例では、クライアント側データ・ハブ1800はJavaScriptおよびハイパーテキスト・マークアップ言語で実装される。
Wikiコマンド・プロデューサ1802は、他のWikiコマンドによって消費可能なデータを提供するかまたは特定のイベントが発生したことを他のコンポーネントに通知することを希望する、クライアント上のコマンドである。Wikiコマンド・プロデューサ1802は1804により、トピック「検索/使用可能」に関するプロデューサとしてデータ・ハブ1800に登録する。この例では、Wikiコマンド・プロデューサ1802は図17の検索コンポーネント1702である。
Wikiコマンド・コンシューマ1806は、イベント・オブジェクトを消費するか、データを消費するか、またはイベントが通知されることを希望する、クライアント上のコマンドである。Wikiコマンド・コンシューマ1806は1808により、イベント・トピック「検索/使用可能」に関するコンシューマとしてクライアント側データ・ハブ1800に登録する。この例では、Wikiコマンド・コンシューマ1806は図17のエコー・コンシューマ・コンポーネント1704である。Wikiコマンド・コンシューマ1806は、サーバ上の対応するWikiコマンド・オブジェクトのクライアント・バージョンである。クライアント上のWikiコマンド・コンシューマ1806は、サーバ上のWikiコマンド・オブジェクトのすべてのデータを含むが、サーバ上の対応するWikiコマンドで検出されるすべてのメソッドを含むわけではない。
Wikiコマンド・プロデューサ1802は、図17に示されている「Wiki」検索語などの検索語を入力した後でユーザが「実行(go)」ボタンを押すと、「検索/使用可能」イベントを始動する。Wikiコマンド・プロデューサ1802は、イベント・オブジェクトを作成し、そのイベント・オブジェクトにデータを添付し、次にデータ・ハブ1800にイベントを送信するためにデータ・ハブ1800上でfireEventメソッド1810を呼び出すことにより、そのイベント・オブジェクトを始動する。データ・ハブでイベントをキューに入れ、processEventsフェーズ中にイベントを処理するサーバ側データ・ハブとは異なり、クライアント側データ・ハブ1800はイベント・キューにイベントを送信しない。その代わりに、クライアント側データ・ハブ1800は、直ちにイベントを処理し、そのイベントのために登録された1組のコンシューマにそのイベントを送信する。
この例示的な例では、エコー・コンポーネント・コールバック1812がデータ・ハブ1800によって呼び出される。Wikiコマンド・コンシューマ1806は、JavaScriptを使用してテキスト「検索語:Wiki」を表示されたページに挿入して、図17のページ1700などの描画ページを変更する。Wikiコマンド・コンシューマ1806によって描画ページのコンテンツを動的に更新するために使用されるJavaScriptの模範的な例証は以下のように含む。
var divId =document.getElementById('echoDivId');
divId.innerHTML = "検索語:"+event.getValue();
しかし、本発明の例示的な一実施形態により、ドキュメント・オブジェクト・モデル(DOM:document object model)操作を含むがこれに限定されない、ページを変更するための任意の既知のまたは使用可能なメソッドを使用して、Wikiコマンド・コンシューマ1806によって描画ページを変更することができる。
しかし、サーバがイベントの処理に関係することを対話が要求している場合、そのイベントはサーバに送信される。データはサーバ上に存続するかまたはサーバによって検索されるので、クライアント上で始動されたイベントにより、そのイベントがサーバ・データ・ハブに送信されることを要求することは、ありそうなことである。
換言すれば、あるページがクライアント側で表示された後、新しいイベントまたは新しいデータがユーザから受信される。このイベントは、全部または一部をサーバで処理することを必要とする可能性がある。その通りである場合、クライアントは、表示されたページを更新する前にサーバにイベントを送信する。
クライアントおよびサーバ上のデータ・ハブ・オブジェクトにより、Wikiコンポーネントおよびコマンドは、クライアント上で対話し、サーバ上で対話し、トピック・ベースのイベント・メカニズムを使用してコンポーネントを効果的に配線/接続することができる。ユーザ対話の結果により、クライアント上では不可能な何らかの動作またはプロセスを実行するためにサーバにアクセスすることが要求される場合、クライアント側データ・ハブはそのイベントをサーバ側データ・ハブに送信する。
たとえば、データベース・テーブルなど、所与のユーザ対話に必要なデータであって、クライアントが所有していないかまたはアクセスできないものを、サーバが所有しているかまたはアクセスできる場合、そのイベントがサーバに送信される。加えて、データ・フィードなど、ユーザ対話に必要なデータを検索するためにサーバが必要である場合、そのイベントがサーバに送信される。これらの場合、イベントは、取り扱い/処理のためにサーバに送信される。サーバ上でのそのイベントの取り扱い/処理が完了すると、サーバは、クライアントで表示されたページを変更するために、更新済みページ・コンテンツをクライアントに送信する。
たとえば、検索コンポーネントは、ユーザからの入力を受け入れるコンポーネントである。ユーザによって入力されたテキストに基づいて、検索テキストがサーバに送信される。サーバはこの検索を実行する。サーバは、テーブル・コンポーネントを使用して、検索の結果を描画する。サーバ上でテーブル・コンポーネントによって生成された描画テーブルは、表示のためにクライアントに返される。
また、本発明の例示的な実施形態は、データ・ハブがイベントを処理するためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードも提供する。クライアント側データ・ハブは、現在表示されているページに関連する所与のトピックに関するイベントを受信する。クライアント側データ・ハブは、サーバ上でイベントを処理するためにイベント・データをサーバ側データ・ハブに送信する。
サーバ側データ・ハブは、あるページに関連するイベントを受信したことに応答して、サーバ側データ・ハブ上のイベント・キューに所与のトピックに関するイベントを追加する。サーバ側データ・ハブは、イベント・キュー内のイベントを処理する。そのイベントに関連する所与のトピックに関する1組のコンシューマ・コマンドが識別される。コンシューマ・コマンドは、所与のトピックに関するイベントを受信するコマンドである。サーバ側データ・ハブは、所与のトピックに関する1組のコンシューマ・コマンドにイベントを送信する。その1組のコンシューマ・コマンドのうちの1つまたは複数のコンシューマがイベントを処理し、そのページに関するページ・コンテンツを描画する。次にサーバ側データ・ハブは、イベントを処理した結果をクライアント側データ・ハブに返送する。
クライアント側データ・ハブは、イベント処理の結果をサーバ側データ・ハブから受信する。イベントを処理した結果は新しいページ・コンテンツを含む。現在表示されているページは、クライアント・ブラウザでその新しいページ・コンテンツで更新されて、更新済みページを形成する。
次に図19および図20に関連して説明すると、本発明の例示的な一実施形態によりページ更新中のクライアント側データ・ハブとサーバ側データ・ハブとの間のデータフローを例示する図が示されている。Wikiページが最初にロードされると、図8〜図9に示されているように、ユーザに表示するためにクライアントに送信される初期ページ描画を生成するために、サーバ側コマンドが処理される。この例示的な例では、そのページが最初にロードされると、サーバ側データ・ハブ1900が作成される。Wikiコマンド・プロデューサ1902は検索コンポーネントである。
initフェーズ中に、Wikiコマンド・プロデューサ1902は1904により、イベント・トピック「検索/使用可能」および「検索/クリック済み」のプロデューサとして、初期設定し、データ・ハブ1900に登録する。Wikiコマンド・プロデューサ1902の検索コンポーネントは、クライアントによって生成される「検索/クリック済み」イベント・トピックに関するコンシューマとしても登録する。このように、Wikiコンポーネントのクライアント表現は、サーバ側コンポーネントと通信するか、またはサーバ側コンポーネント上でメソッドを呼び出すことができる。
Wikiコマンド・コンシューマ1906はリスト・コンポーネントである。Wikiコマンド・コンシューマ1906は1908により、「検索/使用可能」イベント・トピックのコンシューマとして、初期設定し、データ・ハブ1900に登録する。第1のprocessEventsフェーズ中に、サーバ側データ・ハブ上でprocessEventsメソッドが呼び出される。データ・ハブ1900は、Wikiコマンド・プロデューサ1902上でinvokeメソッドを呼び出す。応答として、Wikiコマンド・プロデューサ1902は、検索を実行し、「検索/使用可能」イベント・オブジェクト内に含まれるデータを生成する。Wikiコマンド・プロデューサ1902は、イベント・オブジェクト「検索/使用可能」を始動し、検索データの準備ができていることを示す。
データ・ハブ1900は、Wikiコマンド・コンシューマ1906のリスト・コンポーネント上でcallbackメソッドを呼び出して、「検索/使用可能」イベント・オブジェクトをWikiコマンド・コンシューマ1906に送信する。次に、discoverおよび2次processEventsフェーズが実行される。最後に、renderフェーズ中に、データ・ハブ1900は、要求されたページに関連するすべてのコマンド上でrenderを呼び出す。Wikiコマンド・プロデューサ1902は、ハイパーテキスト・マークアップ言語およびJavaScriptを描画して、検索フォームを表示する。Wikiコマンド・コンシューマ1906のリスト・コンポーネントは、ここではプロデューサ・コンポーネントであり、ハイパーテキスト・マークアップ言語およびJavaScriptを描画して、テーブルを表示する。描画コンポーネントの結果は、ハイパーテキスト・マークアップ言語の残りと結合され、表示のためにクライアントに送信される。そのページがブラウザによってロードされている間、JavaScriptコードはクライアント側データ・ハブ1910を作成し、すべてのプロデューサ1912およびすべてのコンシューマ1914をクライアント側データ・ハブ1910に登録する。これは初期ページ描画である。
そのページが最初に表示されると、ユーザ対話により、1つまたは複数のコンポーネントの描画に対する変更を引き起こす可能性がある。たとえば、ユーザが検索語を入力し、「実行」を押すと、データを変更するユーザ対話が行われる。クライアント側検索コンポーネントWikiコマンド・プロデューサ1916は1918により、トピック「検索/クリック済み」を有するイベントを始動する。検索フェーズはデータとしてイベント・オブジェクトに添付される。クライアント側データ・ハブ1910は、イベント・オブジェクトを受信し、それをイベント・トピック「検索」に関するコンシューマとして登録されたクライアント上の任意のリスナに送信する。サーバ側データ・ハブ内とは異なり、クライアント側データ・ハブはイベント・キューにイベントを入れない。
クライアント側データ・ハブ1910は、サーバ側データ・ハブに関連するサーバ上のコンシューマ・コマンドにそのイベントを送信しなければならないかどうかを判断する。サーバ上のコンシューマ・コマンドにそのイベントを送信しなければならない場合、クライアント側データ・ハブは、AJAX、JSON、または任意のその他の既知のまたは使用可能なリモート・メソッド呼び出し方法を介してprocessClientEventメソッド1920を呼び出すことにより、サーバにイベントを送信する。
サーバ側データ・ハブ1900は、受信したイベントをイベント・キュー1922に追加する。サーバ側データ・ハブ1900はイベント・キュー内のイベントを処理し、そのうちの1つはクライアントから受信された「検索/クリック済み」イベントである。サーバ側データ・ハブ1900は1924により、イベント・トピック「検索/クリック済み」に関するコンシューマとして登録されたWikiコマンド・プロデューサ1902の検索コンポーネントに「検索/クリック済み」イベントを送信する。Wikiコマンド・プロデューサ1902の検索コンポーネントは、検索を実行し、検索データを生成/作成する。Wikiコマンド・プロデューサ1902は、トピック「検索/使用可能」を有するイベント・オブジェクトを作成し、生成された検索データをそのイベント・オブジェクトに添付する。
サーバ側データ・ハブ1900は、「検索/使用可能」イベント・オブジェクトをイベント・キューに追加する。サーバ側データ・ハブ1900は依然としてprocessEventsフェーズでイベントを処理しているので、「検索/使用可能」イベント・オブジェクトは直ちにイベント・キューから除去され、サーバ側データ・ハブ1900によって処理される。次に、Wikiコマンド・コンシューマ1906は1926により「検索/使用可能」トピックに関するコンシューマとして登録されるので、サーバ側データ・ハブ1900は、「検索/使用可能」イベント・オブジェクトをWikiコマンド・コンシューマ1906に送信する。
Wikiコマンド・コンシューマ1906は、「検索/使用可能」イベント・オブジェクトからの新しいデータを保存する。サーバ側データ・ハブ1900は1928により、クライアント側データ・ハブ1910から受信した元のイベント「検索/クリック済み」の処理に関係していたすべてのコンポーネント上でrenderメソッドを呼び出す。Wikiコマンド・コンシューマ1906のリスト・コンポーネントのrenderメソッドは、ハイパーテキスト・マークアップ言語およびJavaScriptを使用して、新しいリストを構築する。Wikiコマンド・コンシューマ1906は、新しいリスト・コンテンツをサーバ側データ・ハブ1900に返す。サーバ側データ・ハブ1900は、Wikiコマンド・コンシューマ1906を含む、関係するすべてのコンポーネント/コマンドから新しい描画を収集し、クライアント側データ・ハブ1910に返すために新しい描画をバンドルする。クライアント側データ・ハブは、1930によりprocessClientEventメソッドの結果を受信し、新しいページ・コンテンツ1932でクライアント上のコマンド描画を更新する。
次に、図21は、本発明の例示的な一実施形態によりページ更新中のサーバ側データ・ハブとクライアント側データ・ハブとの間のメッセージ・フローを例示する図である。このメッセージ・フローは、クライアント側プロデューサ・コンポーネントがイベントの名前と連結されたトピック「クリック済み」を有するイベントを始動したときに始まる(メッセージ1)。メッセージ2.1で、クライアント側データ・ハブはそのイベントを受信し、それをクライアント上の任意のリスナに送信する。
クライアント側データ・ハブは、そのイベントをサーバ上のリスナに送信しなければならないかどうかを判断する(メッセージ2.2)。これらの例示的な例では、リスナは、所与のイベント・トピックに関するコンシューマとして登録されたコマンドまたはコンポーネントである。そのイベントをサーバ上のリスナに送信しなければならない場合、クライアント側データ・ハブは、processClientEventを呼び出すかまたは他のリモート・メソッド呼び出し方法により、サーバにイベントを送信する(メッセージ2.3)。サーバ側データ・ハブは、受信したイベントをイベント・キューに追加する(メッセージ3)。
メッセージ4.1で、サーバ側データ・ハブはキュー内のイベントを処理し、そのうちの1つはクライアントからのイベントである。サーバ側データ・ハブは、リスナとして登録された、対応するコンシューマに「クリック済み」イベントを送信する(メッセージ4.2)。
コンポーネントは、イベントによって要望されたアクションを実行する(メッセージ5.1)。そのイベントがクライアントから受信されたかサーバから受信されたかにかかわらず、すべてのイベントはサーバ側データ・ハブによって同じように扱われる。コンポーネントは、その結果が使用可能であることを示す、新しい「使用可能」イベントを作成する(メッセージ5.2)。サーバ・データ・ハブは「使用可能」イベントをキューに追加する(メッセージ6)。
サーバ側データ・ハブは、「使用可能」イベントを処理し、そのイベントをサーバ上の1組のコンシューマに送信する(メッセージ7)。コンシューマ・コンポーネントは、「使用可能」イベント・オブジェクトからのデータを使用する。サーバ側データ・ハブは、すべてのコンポーネント上でrenderメソッドを呼び出す(メッセージ8.1)。すべてのコンポーネントは、ハイパーテキスト・マークアップ言語およびJavaScriptで新しい描画をサーバ側データ・ハブに返す(メッセージ8.2)。サーバ側データ・ハブは、すべての関係するコンポーネントから収集した描画をクライアント・データ・ハブに返す(メッセージ9)。クライアント側データ・ハブは、サーバがイベントを処理した結果を受信する。クライアントは、クライアント・ブラウザ上でページ更新を描画するためにその結果をクライアント上のリスナに送信する(メッセージ10)。
代替一実施形態では、クライアント側データ・ハブからイベントを受信せずに、サーバ側データ・ハブが本発明の例示的な諸実施形態により動作するシステムにおいて、ページ要求を処理し、コマンド間の対話を可能にすることも可能にすることができる。他の例では、クライアントがPDA、携帯電話、GPSナビゲータ、またはJavaScriptをサポートしない任意のその他のクライアント・デバイスであるシステムにおいて、ページ要求の処理を実装することもできる。
図22は、本発明の例示的な一実施形態によるサーバ側データ・ハブ・オブジェクトを例示する図である。描写されている例では、データ・ハブ2100は、図5のデータ・ハブ558、図6のデータ・ハブ638、および図7のデータ・ハブ702などのデータ・ハブ・オブジェクトである。この例示的な例では、データ・ハブ2100はPHPで実装されたデータ・ハブ・オブジェクトである。
データ・ハブ2100などのデータ・ハブは、ユーザによって要求されたWikiページの各インスタンスごとに作成される。ページ・インスタンスは、特定のページ・ビューと、そのページの関連データ・ハブ・インスタンスを参照するために使用される。所与のページに関連するクライアント上の要求またはイベントがサーバに送信されると、サーバはその所与のページに関連する指定のデータ・ハブ・インスタンスをロードする。
換言すれば、データ・ハブのインスタンスは、クライアントによって要求されたWikiページの各インスタンスごとにサーバ上に作成される。ページ・インスタンスがクライアント上にロードされ表示された後、クライアント上のそのページに関するデータ・ハブ・インスタンスはもはや必要ではない。データ・ハブ・インスタンスは、図1の記憶装置108などの記憶装置に保存される。ユーザが新しい入力を入力するか、またはそのページに関するアクションを要求すると、特定のページ・ビューに関連するデータ・ハブの前にシリアル化されたインスタンスをリロードすることにより、特定のページ・ビューに関するWiki環境がサーバ上に再現される。データ・ハブの保存されリロードされたインスタンスは、クライアント・ブラウザ上の特定のページの現行状態を反映する。データ・ハブ2100は、属性/オブジェクト変数および1組のメソッドを含む。
この1組のメソッドは、5通りのカテゴリまたは分類のメソッドを含む。このメソッドのカテゴリは、データ・ハブ管理2102、プロデューサおよびコンシューマ2104、トピック2106、イベント処理2108、ならびにコマンド管理2110である。これらの例示的な例では、データ・ハブ2100など、1つまたは複数のオブジェクトに関連するアクションまたはプロセスを実行するためのプロシージャ、関数、またはルーチンである。
データ・ハブ2100に関する1組のメソッドは、データ・ハブ・インスタンスの保存、データ・ハブ・インスタンスの検索/リロード、コマンドの追加、プロシージャの追加、プロシージャの除去などの様々な機能を実行するためのメソッドに関するメソッド・インターフェースを含む。たとえば、データ・ハブ管理2102という1組のメソッド・インターフェースは、図1の記憶装置108などのデータ記憶装置からデータ・ハブの保管インスタンスを検索するためのメソッドに関する「public static function init (page instance)」というメソッド・インターフェースを含む。
また、データ・ハブ2100は、Wiki環境およびクライアント環境内でコマンド間のイベントの転送を可能にするために、データ・ハブ・トピック・オブジェクト2112およびデータ・ハブ・イベント・オブジェクト2114上でメソッドを呼び出す。データ・ハブ・トピック・オブジェクト2112は、主として、コンシューマ・コマンドが加入できるトピックを定義するデータ・オブジェクトである。これらの例示的な例では、コンシューマは、コマンド/コンポーネントの特定の機能を実行するために、ユーザ、他のコマンド、他のコンポーネント、または他のオブジェクト、あるいはこれらの組み合わせから、データ、イベント、または入力を必要とするかまたは要求するかあるいはその両方を行う、コマンド、コンポーネント、またはオブジェクトである。これらの例示的な例では、プロデューサは、ユーザ、他のコマンド、他のコンポーネント、または他のオブジェクト、あるいはこれらの組み合わせからのデータ、イベント、または出力を提供する、コマンド、コンポーネント、またはオブジェクトである。
データ・ハブ・イベント・オブジェクト2114は、イベント・オブジェクトに関連する所与のイベント・トピックに関する、プロデューサによって作成されコンシューマに送信される、データ・ハブ・イベントを定義するデータ・オブジェクトである。
図23は、本発明の例示的な一実施形態によるクライアント側データ・ハブ・オブジェクトを例示する図である。データ・ハブ2200は、図6のデータ・ハブ634および図14のデータ・ハブ1410などのデータ・ハブ・オブジェクトである。この例示的な例では、データ・ハブ2200はJavaScriptで実装されたクライアント側データ・ハブ・オブジェクトである。
データ・ハブ2200は、Wikiコンポーネントがサーバ上の他のWikiコンポーネントおよびクライアント上の他のWikiコンポーネントと対話できるようにするクライアント・データ・ハブである。また、データ・ハブ2200は、Wikiコンポーネントが処理のためにクライアント上で生成されたイベントをサーバに送信できるようにする。
データ・ハブ2200は、属性および1組のメソッドを含む。この例示的な例では、この1組のメソッドは、4通りのカテゴリのメソッドを含む。このメソッドのカテゴリは、プロデューサおよびコンシューマ2202、トピック2204、イベント処理2206、ならびにコマンド管理2208である。
また、クライアント側データ・ハブ2200は、Wiki環境およびクライアント環境内でコマンド間のイベントの転送を可能にするために、クライアント側データ・ハブ・トピック・オブジェクト2210およびクライアント側データ・ハブ・イベント・オブジェクト2212上でメソッドを呼び出す。データ・ハブ・トピック・オブジェクト2210は、図22のデータ・ハブ・トピック・オブジェクト2112などのデータ・ハブ・トピック・オブジェクトである。データ・ハブ・イベント・オブジェクト2212は、図22のデータ・ハブ・イベント・オブジェクト2114などのデータ・ハブ・イベント・オブジェクトである。
Wikiページ・レイアウトは、本発明の1つまたは複数の実施形態では静的である場合が多い。さらに、Wikiページ・レイアウトの性的特徴と1組のページの各ページのレイアウトを個別に変更しなければならないという要件により、それらがすべて同じ特定のレイアウトを共用するようにWikiページまたは1組のWikiサブページのレイアウトを編集することは非常に時間のかかるものになる。Wikiページ・レイアウトは、すべてのコンポーネントが所定の位置にある完全なWikiページを作成するために使用されるページ・コンポーネントのアセンブリを示すページである。図6に戻って説明すると、ページ600は、ヘッダ604、フッタ606、左マージン608、右マージン610、メニュー612、およびボディ614などのページ・コンポーネントの例を示している。WikiページはWikiアプリケーション内のページである。したがって、ユーザが新しいWikiページを作成するのと同じように単純に新しいWikiページ・レイアウトを作成できるように、Wikiページ・レイアウトを動的に構成可能なものにし、Wikiページ内に定義させることは、望ましいことになるであろう。また、関連Wikiページの集合に同じWikiレイアウト・ページを共用させることも、望ましいことになるであろう。
本発明の例示的な諸実施形態は、Wikiレイアウト・ページのボディにWikiページ・コンテンツを埋め込むことを可能にする。Wikiレイアウト・ページは、Wikiページに関するページ・レイアウトを定義するWikiページである。さらに、具体的なレイアウトをWikiページに関連付けることができる。ユーザは、単純に新しいWikiページを作成し、新たに作成したWikiページのコンテンツを編集することにより、新しいWikiレイアウト・ページを作成することができる。新たに作成したWikiページの各ページ・コンポーネントのデフォルト・コンテンツは、コマンドがコンテンツを提供するページ・コンポーネントにちなんで命名されたWikiコマンドによって提供される。Wikiコマンドは、Wikiアプリケーションの機能またはプロセスあるいはその両方を実装するために使用されるコマンドである。たとえば、本発明の例示的な一実施形態では、Wikiコマンドは、ヘッダ、フッタ、メニュー、左マージン、および右マージンと命名される。
ユーザは、HTMLページ・フローを使用することにより、ユーザが希望するWikiページ上の任意の位置にこれらのWikiコマンドからのコンテンツを含めることができる。HTMLページ・フローは、ページ・ソースを含むHTMLタグに反応して、ブラウザがWebページのコンテンツをどのように位置決めするかである。たとえば、Webページのソース内にHTMLの<TABLE>タグがあると、ブラウザは、上から下に垂直に流れる行と列に分割された表形式表示を描画する。したがって、ユーザは、任意の他のWikiページに使用されているものと同じ手法を使用してWikiレイアウト・ページを編集することができる。ユーザは、ユーザが適合すると見なすように、その他の静的HTMLコンテンツおよびその他の動的Wikiコマンドを新たに作成したWikiページ内に含めることができる。したがって、本発明の例示的な諸実施形態により、ユーザは、たとえば、会社のロゴまたはイメージなど、どのコンテンツがヘッダ内に現れるか、ならびにメニューがどこに現れるかなど、共通外観およびレイアウトを共用するページを作成することができる。さらに、本発明の例示的な諸実施形態により、ユーザは、ユーザが実行することに精通しているもの、すなわち、Wikiページの作成および編集と一貫する単純な方法でこの共通外観を作成することができる。
ユニバーサル・リソース・ロケータを入力することにより、ユーザがWikiページを要求するときはいつでも、Wikiページ・テーブルがチェックされ、そのページまたは1組のサブページに関連するレイアウト・ページ名が存在するかどうかを判断する。レイアウト・ページが要求されたWikiページに関連付けられている場合、レイアウト情報が追加され、要求されたWikiページをラップアラウンドして、Wikiページが描画され、結合ページを形成する。
本発明の例示的な一実施形態では、特殊テンプレート変数がWikiレイアウト・ページに含まれる。特殊テンプレート変数は、新しいWikiレイアウト・ページが使用されるときに、ターゲットWikiページのコンテンツによって置き換えられる。これらの例では、テンプレート変数は文字列変数である。この特殊テンプレート変数に命名するときに、ユーザは、可能な限り新たに要求されたページ上の他のテキストとの衝突を回避したいと希望する。したがって、特殊テンプレート変数の名前は、典型的には、自然に発生しそうもないパターンである。本発明の例示的な一実施形態では、特殊テンプレート変数は%_BODY_%と呼ばれる。特殊テンプレート変数は、Wikiレイアウト・ページのボディ・フィールド内に位置する。ボディ・フィールドは、図5のオブジェクト変数528などのWikiレイアウト・ページ・オブジェクトのオブジェクト変数である。ボディ・フィールドは、Wikiページの生の未描画コンテンツを含む。
本発明の例示的な諸実施形態は、あるWikiページが祖先WikiページからそのWikiページのレイアウトを継承することを可能にする。各Wikiページは、そのWikiページに関する祖先Wikiページであって、そのWikiページに関連するWikiページのリストを有する。祖先Wikiページは、ページ命名階層内のより上位レベルに発生するWikiページである。たとえば、あるWikiページが「LevelOne/LevelTwo」と命名され、「LevelOne」というWikiページが存在する場合、「LevelOne」というWikiページは「LevelOne/LevelTwo」というWikiページの祖先と見なされる。この1組の祖先Wikiページのリストは、Wikiページ・オブジェクトのフィールドに保管される。1組の祖先Wikiページは1つまたは複数の祖先Wikiページを含むことができる。本発明の例示的な一実施形態では、そのフィールドはパス・フィールドと呼ばれる。Wikiページ・レイアウト修飾子(specifier)を含む祖先Wikiページのリスト内で逆階層順に第1のWikiページを検出する照会が使用される。本発明の例示的な一実施形態では、図5のデータベース524などのデータベース内のWiki_pagesテーブルと照らし合わせて、祖先ページのリストがチェックされる。Wiki_pagesテーブルは項目のリストを含む。各項目は、あるWikiページと、その特定のWikiページに関連する任意のWikiレイアウト・ページとを含む。祖先Wikiページのリスト内の各Wikiページは、Wiki_pagesテーブル内の項目と比較される。祖先Wikiページのリスト内のWikiページと一致する項目が、関連Wikiレイアウト・ページを有することが判明すると、継承すべきターゲットWikiページについて、指定のレイアウト・ページが選択される。
次に図24は、本発明の例示的な一実施形態によりWikiレイアウト・ページのボディにWikiページ・コンテンツを埋め込むプロセスを例示するブロック図である。図24のこのプロセスは、図4のWikiエンジン402などのWikiエンジンによって実装することができる。現行ページ・オブジェクト2302は、図5のWikiページ526などのWikiページ・オブジェクトである。ボディ2310は、図5のオブジェクト変数528などのWikiページ・オブジェクトのオブジェクト変数である、Wikiページのボディ・フィールドである。レイアウト・ページ・オブジェクト2304は、ページ・コンポーネント・ヘッダ2322、メニュー2324、右マージン2326、左マージン2328、フッタ2330、およびボディ2320を含む。レイアウト・ページ・オブジェクト2304内のページ・コンポーネントは、図5のオブジェクト変数528など、レイアウト・ページ・オブジェクトのオブジェクト変数である、レイアウト・ページ・オブジェクト2304のボディ・フィールドに含まれる。現行ページ・オブジェクト2302のボディ・フィールドのコンテンツであるボディ2310は、レイアウト・ページ・オブジェクト2304のボディ・コンポーネントであるボディ2320内に置かれる。次に、ページ・コンポーネント・ヘッダ2322、メニュー2324、右マージン2326、左マージン2328、フッタ2330、およびボディ2320を含む、レイアウト・ページ・オブジェクト2304のボディ・フィールドのコンテンツは、現行ページ・オブジェクト2302のボディ・フィールドであるボディ2310内に置かれる。
次に現行ページ・オブジェクト2302は結合ページ2306として描画される。現行ページ2306は、現行ページ・オブジェクト2302とレイアウト・ページ・オブジェクト2304を結合した結果である。結合ページ2306は、レイアウト・ページ・オブジェクト2304からのレイアウト・ページ・コンポーネント・ヘッダ2322、メニュー2324、右マージン2326、左マージン2328、およびフッタ2330とともに、ボディ2310によって表される現行ページ・オブジェクト2302のボディ・フィールドのコンテンツを含む。
従来のWikiアプリケーションでは、Wikiページ・レイアウトの特定のページ・コンポーネントを条件付きで示したり隠したりできるように、Wikiレイアウト・ページを動的に構成可能なものにするためのメソッドは、現在のところ、まったく存在しない。Wikiページ・レイアウトは、すべてのコンポーネントが所定の位置にある完全なWikiページを作成するために使用されるページ・コンポーネントのアセンブリを示すページである。WikiページはWikiアプリケーション内のページである。
本発明の例示的な諸実施形態は、Wikiページ・レイアウト・コンポーネントをプログラムにより隠したり示したりすることができる。Wikiレイアウト・ページは1組のページ・コンポーネントに分割される。このページ・コンポーネントは、ヘッダ、メニュー、左、右、ボディ、およびフッタ・コンポーネントと呼ばれる。図6は、ヘッダ604、フッタ606、左マージン608、右マージン610、メニュー612、およびボディ614などのページ・レイアウト・コンポーネントの例を示している。各コンポーネントのコンテンツはWikiコマンドによって生成される。Wikiコマンドは、Wikiアプリケーションの機能またはプロセスあるいはその両方を実装するために使用されるコマンドである。本発明の例示的な一実施形態では、Wikiコマンドは、それらがコンテンツを生成するページ・コンポーネントと同じ名前を有する。Wikiページ・レイアウトは、埋め込みWikiコマンド・マークアップを有する単純なHTMLマークアップを含む。そのページが描画されると、Wikiコマンドは、ページ・コンポーネントがWikiコマンドによって生成されたコンテンツを表示しなければならないかどうかを制御するWikiページ設定について問い合わせる。
本発明の例示的な一実施形態では、Wikiページ設定は、ユーザがWikiページを設定するときにユーザによって編集可能なチェックボックスとして実装される。チェックボックスにチェックを付け、チェックをはずすことにより、ユーザは、様々なページ・コンポーネント、ならびに、ページ・コメント、添付物、および電子メールの可視性を制御する。この設定は、それに照らし合わせて表示論理がチェックできるビット・マスクとして「コンポーネント」列において、図5のデータベース524などのデータベースの一部であるWiki_pagesテーブルに保存される。このページ・テーブル内の項目は、アイデンティティ(ID)、アカウント、タグ、時間、ボディ、所有者アイデンティティ(所有者ID)、modified_by、isLatest、レイアウト、isLayout、isEditing、commentOn、セクション、パス、属性(attrib)、およびエラーというフィールドを含む。ビット・マスクは、各ビットが別個の変数に関するyes値またはno値(1または0)を表す2進数である。高速ビット単位動作を使用することにより、特定変数の値を決定または変更することができる。したがって、ビット・マスクは、このような変数を保管する、小型かつ効率的な手段である。
次に図25を参照すると、本発明の例示的な一実施形態によりページ・コンポーネントのコンテンツの可視性を決定するためのチェックボックスを描写するブロック図が描写されている。可視性設定2402は、それによりユーザが様々なページ・レイアウト・コンポーネントの可視性を制御できる表示領域である。可視性設定2402は、Wikiページのコンテンツの一部として実装することができる。本発明の例示的な代替一実施形態では、可視性設定2042は、クライアント・ブラウザ上のメニュー・オプションとして実装される。ボディ2406はチェックボックス2408を含む。チェックボックス2408は、ヘッダ、メニュー、左、右、およびフッタ・レイアウト・ページ・コンポーネント用のチェックボックスとともに、コメント、添付物、および電子メール用のチェックボックスを含む。チェックボックスにチェックを付けるかまたはチェックをはずすことにより、ユーザは、指名されたレイアウト・ページ・コンポーネントのコンテンツならびにページ・コメント、添付物、および電子メールの可視性を制御することができる。本発明の例示的な一実施形態では、ボックスにチェックを付けると、指名されたレイアウト・ページ・コンポーネントならびにページ・コメント、添付物、および電子メールのコンテンツがクライアント・ブラウザに表示される。このような実装例では、可視性設定2404の最上部分は、表示(show)または可視(visible)という単語または同等の意味の何らかのその他の用語を含むことになるであろう。図25の最上部2404は表示という単語を含み、チェックボックスにチェックを付けると、そのレイアウト・ページ・セクションに属すコンテンツがクライアント・ブラウザに表示されることを示している。
本発明の例示的な代替一実施形態では、可視性設定2402のチェックボックスにチェックを付けると、対応するレイアウト・ページ・コンポーネントのコンテンツがクライアント・ブラウザで隠される。このような実装例では、上部領域である最上部2404は、たとえば、隠蔽(hide)など、この実装例を示す用語を含むことになるであろう。
本発明の例示的な一実施形態では、チェックボックス2408にチェックを付けたり、チェックをはずした結果は、ビット・マスクとしてデータベースに保管される。表示のためにページを描画するプロセス中に、表示論理はビット・マスクをチェックして、どのコンテンツをクライアント・ブラウザに表示すべきかを判断する。
次に図26を参照すると、本発明の例示的な一実施形態によりWikiページを作成するためのプロセスの流れ図が描写されている。図26のプロセスは、図6のWikiページ602などのWikiページを作成するためのものである。図26のプロセスは、新しいWikiページを作成するためにユーザ入力を受信することにより始まる(プロセス・ブロック2502)。ユーザは、プロセス・ブロック2502でユーザ入力を提供するためのメニューから新しいページ・コマンドを選択するためにクライアント・ブラウザを使用することができる。
次に、プロセスは、新しいWikiページ用の名前を入力するようプロンプトでユーザに指示する(プロセス・ブロック2504)。一例では、ページ名は、CamelCaseルールに従う英字および数字を含むことができる。また、Wikiのページ名は、階層内のディビジョンまたはレベルを示す「/」という文字も含むことができる。たとえば、新しいWikiページは図9のテスト904にすることができる。
次に、プロセスは、編集要求ユニフォーム・リソース・ロケータ(URL)を構築し、対応するハイパーテキスト転送プロトコル(HTTP)要求をサーバに送信する(プロセス・ブロック2506)。編集要求は、クライアント・ブラウザ上のJavaScript機能によって構築することができ、新しいページ・アクションおよび新しいページ名を指定することができる。
次に、プロセスは、適切なエディタをロードし、ハイパーテキスト転送プロトコル応答でそのページをクライアント・ブラウザに供給する(プロセス・ブロック2508)。プロセス・ブロック2508は、図5のWikiコントローラ500によって実装することができる。
次に、プロセスは、ユーザ変更を受信し、ハイパーテキスト転送プロトコル・フォーム送信をサーバにサブミットする(プロセス・ブロック2510)。プロセス・ブロック2510は、ユーザがクライアント・ブラウザでWikiページを編集し、保存すべきコンテンツをサブミットしたことに応答して発生する可能性がある。
次に、プロセスは、サブミットされたコンテンツを有するWikiページを作成して保存し(プロセス・ブロック2512)、その後、プロセスは終了する。プロセス・ブロック2512では、Wikiコントローラは、ページ・ハイパーテキスト転送プロトコル要求を処理し、createPageおよびsaveメソッドを使用して、Wikiページ・オブジェクトをインスタンス化し、その後、そのWikiページ・オブジェクトを保存することができる。図5のWikiオブジェクト508などのWikiページ・オブジェクトは、新しいWikiページを表すために、図5のデータベース524などのWikiページ・データベース・テーブル内に行を作成する。
次に図27を参照すると、本発明の例示的な一実施形態によりページを表示するためのプロセスの流れ図が描写されている。プロセスは、Wikiページのユーザ指定ユニフォーム・リソース・ロケータ(URL)を受信し、ハイパーテキスト転送プロトコル要求をサーバに送信することにより始まる(プロセス・ブロック2602)。プロセス・ブロック2602は、図3のクライアント環境300でクライアント・ブラウザによって受信することができる。
次に、プロセスは、要求を処理し、Wikiページ上のオブジェクトをインスタンス化し、Wikiページを処理し、ハイパーテキスト転送プロトコル応答としてWikiページのコンテンツをクライアント・ブラウザに描画し(プロセス・ブロック2604)、その後、プロセスは終了する。プロセス・ブロック2604は、図5のWikiコントローラ500によって実装することができる。Wikiコントローラは、Wikiオブジェクト上でshowPageメソッドを呼び出すことができる。showPageメソッドは、Wikiページ・データベース・テーブル内の指定の行のWikiページ・コンテンツを維持するWikiページ・オブジェクトをインスタンス化する。次にWikiコントローラは、Wikiページを処理し、そのページのコンテンツをクライアント・ブラウザに描画する、Wikiページ・オブジェクト上のプロセス・メソッドを呼び出す。
次に図28を参照すると、本発明の例示的な一実施形態によりページ・ツリー・ビューを生成するためのプロセスの流れ図が描写されている。図28のプロセスは、図9のページ・ツリー・ビュー900を作成するために使用することができる。図28のプロセスは、図5のコマンド550内でPageTreeCommandによって実装することができる。
プロセスは、PageTreeCommandがWikiページ・データベース・テーブル内のすべての行を読み取り、ページ名列値を抽出することから始まる(プロセス・ブロック2702)。ページ名はタグにすることもできる。タグは、Wikiページのコンテンツをカテゴリ化するために使用されるページ名またはラベルである。データベースは、図5のデータベース524などのデータベースにすることができる。
次に、PageTreeCommandは、ページ・ツリー・ビューを構築するためにページ名値について繰り返す(プロセス・ブロック2704)。プロセス・ブロック2704中に、ページの階層はノードおよびリーフ・ノードにグループ分けされ、視覚的ツリー構造を形成する。ノードはコンテナとコンテンツ・プロバイダの両方であり、リーフ・ノードはもっぱらコンテンツ・プロバイダのみである。たとえば、ページ名が「/」という文字で終わる場合、そのページは、コンテナおよびコンテンツ・プロバイダとして扱われ、図9のテスト904など、包含を表す適切なアイコンで表される。「/」を含むその名前で始まるすべてのWikiページ名は、そのページの子孫と見なされる。Wikiページの残りの部分が「/」を含む場合、そのWikiページはコンテナおよびコンテンツ・プロバイダとも見なされる。Wikiページの残りの部分が「/」を含まない場合、Wikiページはリーフ・ノードと見なされ、図9のハローワールド912などの適切なアイコンで表される。あるページがノードまたはリーフ・ノードであることを指定するために、「/」などの任意の数の異なるページ・インジケータを使用することができる。
次に、PageTreeCommandはページ・ツリー・ビューのハイパーテキスト・マークアップ言語表現を返し(プロセス・ブロック2706)、その後、プロセスは終了する。ページ・ツリー・ビューのハイパーテキスト・マークアップ言語表現は、ユーザがWikiページをナビゲートする際に使用するために、クライアント・ブラウザ上に表示される。
次に図29を参照すると、本発明の例示的な一実施形態によりライブ・コンテンツをドラッグするためのプロセスの流れ図が示されている。本発明の例示的な諸実施形態により、動的コンテンツをWikiページ上にドラッグすることができ、動的コンテンツがページ上にドラッグされるとコンテンツのサンプルが提供される。XMLHttpRequestを使用して、Wikiコンポーネントはリモートで呼び出され、コンテンツはドラッグ・ビジュアル(drag visual)としてXMLHttpResponseで返される。要求は、ブラウザ・アカウントからWebサーバに送信されるデータである。応答は、受信した要求データへの反応(応答)としてWebサーバからブラウザ・アクションに送信されるデータである。ハイパーテキスト転送プロトコルは、Webサーバとの間で送信される要求および応答に関する特定のフォーマットおよびコンテンツを定義する国際標準である。XMLHttpRequest/Responseは、拡張可能マークアップ言語データ・コンテンツおよび特定の応答フォーマットをサポートする、ハイパーテキスト転送プロトコル要求/応答をさらに専門化したものである。図29のプロセスは、図7のWikiページ700を使用して実装することができる。
プロセスは、ドラッグ・アンド・ドロップ動作を実行するためにユーザ入力を受信し、選択されたWikiコンポーネントのサンプル出力を要求するサーバにXMLHttpRequestを送信するJavaScript機能を呼び出すことにより始まる(プロセス・ブロック2802)。プロセス・ブロック2802のユーザ入力は、ユーザが図7のアイキャッチャ708などのアイコンをパレット702からWikiページ700のボディ704上にドラッグすることによって生成することができる。プロセス・ブロック2802のプロセスは、図3のクライアント環境300でクライアント・ブラウザによって受信することができる。
次に、プロセスは、XMLHttpRequestを処理し、選択されたWikiコンポーネントに関するWikiコマンド・サブクラスのインスタンスを作成し、ドラッグしたコンテンツを検索するためのメソッドを呼び出す(プロセス・ブロック2804)。プロセス・ブロック2804中に、図5のWikiコントローラ500は、XMLHttpRequestを処理し、Wikiコマンド・オブジェクト・インスタンス上のgetDragContentなどのメソッドを呼び出す前にWikiコマンド・サブクラスのインスタンスを作成するAJAXフォーマッタにその要求を経路指定することができる。AJAXフォーマッタは、図4の要求ハンドラ404などの要求ハンドラの一部であり、図5のWikiコントローラ500の拡張部分と見なされる。前に記載したように、図5のルータ502は、着信要求をデコードし、その要求を正しい要求ハンドラに経路指定する。AJAXフォーマッタは要求ハンドラの1つである。
次に、プロセスは、Wikiオブジェクトから現行Wikiページ・インスタンスを検索し、描画した出力をXMLHttpResponseでクライアント・ブラウザに返す前にrenderメソッドを呼び出す(プロセス・ブロック2806)。プロセス・ブロック2806のプロセスは、AJAXフォーマッタによって実行することができ、getDragContent呼び出しの結果をrenderFragmentなどのメソッドに渡すことができる。
次に、プロセスは、XMLHttpResponseを処理し、ハイパーテキスト・マークアップ言語ドラッグ・コンテンツを抽出して表示し(プロセス・ブロック2808)、その後、プロセスは終了する。プロセス・ブロック2808のプロセスは、クライアント・ブラウザ上で非同期JavaScriptコードによって実行される。JavaScriptコードは、ドラッグ・コンテンツを半透明に出現させるカスケーディング・スタイル・シート(CSS:cascading style sheet)スタイルを使用することができる。応答が処理され、抽出され、表示されると、プロセスの制御をドラッグ・サポートに手渡すことができる。
ドラッグ・サポートは、マウス移動イベントに応答するイベント駆動型JavaScriptコードで構成される。ユーザがマウス・ボタンを押し下げられて、マウスを移動する間、ブラウザJavaScriptランタイムはマウス移動イベントを始動する。ドラッグ・サポートは、マウス移動イベントを処理するために呼び出されたマウス移動イベント・ハンドラJavaScript機能を実装する。ドラッグ・サポートは、ブラウザのJavaScriptドキュメント・オブジェクト・モデル(DOM)アプリケーション・プログラミング・インターフェース(API)機能を使用して、マウス・カーソルの現行位置を決定する。次に、ドラッグ・サポートは、ドキュメント・オブジェクト・モデル・アプリケーション・プログラミング・インターフェース機能を使用して、AJAX要求からgetDragContentに返された半透明視覚などのドラッグ・コンテンツの位置を設定する。次に、プロセスは、ユーザがマウス・ボタンを押し下げた状態で保持する限り繰り返され、マウスを移動し続ける。ユーザがマウス・ボタンを解除すると、ブラウザのJavaScriptランタイムによってマウス・アップ・イベントが始動される。ドロップ・サポートは、マウス・アップ・イベントを処理するために呼び出されたマウスアップ・イベント・ハンドラJavaScript機能を実装する。ドロップ・サポートは、ブラウザのドキュメント・オブジェクト・モデル・アプリケーション・プログラミング・インターフェース機能を使用して、マウス・カーソルの現行位置を設定する。次に、ドロップ・サポートは、コンテンツをWikiページに挿入させるために、XMLHttpRequestとサーバに送信する。
次に図30を参照すると、本発明の例示的な一実施形態によりWikiページのコンテンツを結合するためのプロセスの流れ図である。補員発明の例示的な諸実施形態のアプリケーションは、様々なページ上で作成されたコンテンツを合成するためにパワフルで一貫した方法を必要とする。Wikiコンポーネントは、2つの「{」文字と、その直後に続くWikiコンポーネント名と、それに続くホワイト・スペースと、さらにそれに続く「name=“value”」構文内の任意選択のスペースで分離された引数から構成される、「markdown」構文を介してWikiページ・ソースに含まれる。たとえば、{{ImportPage page=“HomePage”/}}では、「ImportPage」はWikiコンポーネントの名前である。任意のWikiページのコンテンツは、Wikiコンポーネントと同じWiki「markdown」構文を使用して、他のページ内に含めることができる。「HomePage」というWikiページのコンテンツを現行ページに含めるために、Wikiユーザは、{{HomePage/}}と入力するだけで良く、このHomePageコンテンツはインライン展開されることになる。
図30のプロセスは、図10のWikiページ1000などの複合コンテンツ上で実装することができる。プロセスは、Wikiページ・ソースを、静的テキスト・コンテンツとWikiコンポーネントを表す構文解析フラグメント・オブジェクトに構文解析することにより始まる(プロセス・ブロック2902)。プロセス・ブロック2902のプロセスは、図5のWikiコマンド・コンテキスト544などのWikiコマンド・コンテキスト・オブジェクトによって実装される。プロセス・ブロック2902中に、そのページは、Wikiページ・コンテンツのメモリ内の内部表現である抽象構文ツリー(AST)と呼ばれるツリー構造に編成された構文解析フラグメントに構文解析される。これで、今後のステップの動作は、ツリーを走査し、ツリー・ノード上で動作を実行することにより、ページ・コンテンツを操作することができる。
次に、プロセスは、Wikiページ上のWikiコンポーネントのリストについて繰り返す、load pluginメソッドを呼び出す(プロセス・ブロック2904)。loadPluginsなどのメソッドは、各Wikiコンポーネントの機能性を実装する適切なWikiコマンド・サブクラスをインスタンス化するために各Wikiコンポーネントごとに呼び出される。プロセス・ブロック2904は、ページ・コンテンツのメモリ内表現の作成をさらに改良したものであり、過渡的プロセスである。
次に、プロセスは、Wikiオブジェクトのload commandメソッドを呼び出して、Wikiコマンド・クラス・ロードを実行する。load commandメソッドが適切なWikiコマンド・クラスを検出し損なった場合、このメソッドは例外をスローする(throw)(プロセス・ブロック2906)。プロセス・ブロック2906のload pluginメソッドはloadPluginにすることができる。プロセス・ブロック2906は、サポート・コマンド・オブジェクトをWikiコンポーネント構文解析フラグメントに関連付けることにより、Wikiページのメモリ内表現の作成を完了する。
次に、プロセスは、例外をキャッチし、Wikiオブジェクトのpage existsメソッドを呼び出して、指名されたWikiコンポーネントが実際にWikiページであるかどうかを判断する。有効なページ名がインポート・ページ・コンポーネントにロードされる(プロセス・ブロック2908)。プロセス・ブロック2908では、pageExistsなどのメソッドが有効なページを返す場合、Wikiコマンド・コンテキストは、loadPluginメソッドを呼び出して、Wikiページ名を提出するインポート・ページ・コンポーネントをロードする。インポート・ページ・コンポーネントは、指名されたページのコンテンツを埋め込むように機能する。
次に、プロセスは、インポート・ページ・コンポーネントをWikiコマンド・コンテキスト・コンポーネントのリストに追加する(プロセス・ブロック2910)。次に,プロセスは、描画中に指名されたWikiページのコンテンツにインポート・ページ・コンポーネントを展開し(プロセス・ブロック2912)、その後、プロセスは終了する。プロセス・ブロック2912では、プロセスは、importPageコマンド・インスタンスをコンポーネントのリストに追加する。
次に図31を参照すると、本発明の例示的な一実施形態によりコマンドを編集するためのプロセスの流れ図が示されている。図31のプロセスは、図8のWikiページ800などのページ上で実装することができる。プロセスは、Wikiページを編集するためのユーザ入力を受信したことに応答して、Wikiコンポーネントのパレットを表示することから始める(プロセス・ブロック3002)。プロセス・ブロック3002では、ユーザは、非常に簡単に完了チェックボックスを選択することにより、ユーザ入力を提供することができる。パレットは、図8のパレット802などのパレットである。Wikiページ800などのページは、そのコンポーネントを選択し編集できるという視覚的合図をユーザに与える、任意の数のアイキャッチャを含むことができる。プロセス・ブロック3002は、図3のクライアント環境300でクライアント・ブラウザによって受信することができる。
次に、プロセスは、ユーザがアイキャッチャを選択したことに応答して、選択されたWikiコンポーネントに関するプロパティ・エディタを検索するために、XMLHttpRequestをサーバに送信するJavaScript機能を呼び出す(プロセス・ブロック3004)。アイキャッチャは、図7のアイキャッチャ708などのGoogle(商標)マップ・アイコンにすることができる。
次に、プロセスは、要求を処理し、AJAXフォーマッタに処理を委任する。AJAXフォーマッタは、Wikiコマンド・コンテキスト・オブジェクトを作成し、プロパティ・エディタWikiコンポーネントをロードすることを要求する関連load pluginメソッドを呼び出す(プロセス・ブロック3006)。プロセス・ブロック3006は、図5のWikiコントローラ500によって実行される。
次に、プロセスは、選択されたWikiコンポーネント名を提出するプロパティ・エディタ・コンポーネントのdrawメソッドを呼び出す。drawメソッドの結果は、XMLHttpResponseでクライアントに返される(プロセス・ブロック3008)。
次に、プロセスは、選択されたコンポーネントに関するプロパティ・エディタのハイパーテキスト・マークアップ言語およびJavaScriptを含むXMLHttpResponseを処理し、プロパティ・エディタを視覚化する(プロセス・ブロック3010)。処理は非同期で実行され、プロパティ・エディタはカスケーディング・スタイル・シート(CSS)を使用して視覚化することができる。プロセス・ブロック3010のプロセスは、図5のWikiコントローラ500内のAJAXフォーマッタによって実装することができる。
次に、プロセスは、プロパティ・エディタでユーザ入力を受信し、サーバに対してXMLHttpRequestを発行して、選択されたWikiコンポーネントのプロパティを更新する(プロセス・ブロック3012)。プロセス・ブロック3012は、プロパティ・エディタおよび対応するクライアント・ブラウザによって実行される。
次に、プロセスは、要求を処理し、AJAXフォーマッタに処理を委任する。AJAXフォーマッタは、Wikiコマンド・コンテキスト・オブジェクトを作成し、updateコマンドWikiコンポーネントをロードすることを要求する関連load pluginメソッドを呼び出す(プロセス・ブロック3014)。次に、プロセスは、選択されたWikiコンポーネント名を提出するupdateコマンド・コンポーネントのdrawメソッドを呼び出す。updateコマンド・コンポーネントは、サーバ上でWikiコンポーネント・ソースの「markdown」を更新し、成功または失敗を示すXMLHttpResponseを返し(プロセス・ブロック3016)、その後、プロセスは終了する。プロセス・ブロック3016のプロセスは、図5のWikiコントローラ500内のAJAXフォーマッタによって実装することができる。
したがって、本発明の例示的な諸実施形態は、アプリケーションWikiに関するコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードを提供する。本発明の例示的な諸実施形態により、ユーザは、Wikiページを容易に作成し管理することができる。ユーザは、ライブ・コンテンツをドラッグ・アンド・ドロップすることにより、Wikiページを編集することができる。Wikiページは、ユーザによって要求された通りに結合することができ、プロパティ・エディタを使用して編集することができる。Wikiページは、Wikiをナビゲートするためにノードおよびリーフ・ノードを含むページ・ツリー・ビューに保存される。
次に図32を参照すると、本発明の例示的な一実施形態によりWikiコマンドを描画するためのプロセスの流れ図が描写されている。図32のプロセスは、図4のWikiエンジン404で実装することができる。Wikiページは、いくつかのWikiコマンドを含むことができる。各Wikiコマンドは他のWikiコマンドも含むことができる。図32のプロセスは、WikiエンジンがWikiコマンド上でrenderメソッドを呼び出すことから始まる(プロセス・ブロック3102)。Wikiエンジンは、図4のWikiエンジン402などのエンジンにすることができる。renderメソッドは、図12のrender1226などのページ処理メソッドにすることができる。
次に、プロセスは、openメソッドを呼び出す(プロセス・ブロック3104)。プロセス・ブロック3104のopenメソッドは、Wikiコマンドが描画コンテンツの表示を開始するためのメカニズムを提供する。たとえば、コマンドは、<SPAN>Forecastコマンドなど、ハイパーテキスト・マークアップ言語の「開始(opening)」フラグメントを生成することができる。SPANの終了フラグメントは、closeメソッドを使用して生成されることになる。次に、プロセスは、Wikiコマンドが編集を許可するかどうかについて判断を行う(プロセス・ブロック3106)。Wikiコマンドは、allowEditの設定を無効にし、そのコマンドがコマンドのコンテンツの編集を許可するかどうかを判断する。真(true)という値は、コマンドを編集できることを示す。Wikiコマンドが編集を許可する場合、プロセスはアイキャッチャを生成する(プロセス・ブロック3108)。
Wikiコマンドが編集を許可しない場合、プロセスはrenderBodyを呼び出す(プロセス・ブロック3110)。renderBodyは、コマンドが対応するハイパーテキスト・マークアップ言語コンテンツを描画または放出するための機会を提供する。次に、renderBodyは、アイキャッチャを表示し、次に任意の既存の子のそれぞれでrenderを呼び出す(プロセス・ブロック3112)。たとえば、プロセス・ブロック3112では、drawメソッドを使用してアイキャッチャを表示することができる。Wikiコマンドは階層を形成することができ、すなわち、Wikiコマンドは他のWikiコマンドを含むことができる。その結果、Wikiコマンドはコマンドのツリーを形成する。子は、含まれるかまたは埋め込まれたWikiコマンドの第一世代である。次に、プロセスはcloseメソッドを呼び出し(プロセス・ブロック3114)、その後、プロセスは終了する。
次に図33を参照すると、本発明の例示的な一実施形態によるプロパティ編集のための予備プロセスの流れ図が描写されている。図33のプロセスは、Wikiコマンドのプロパティを編集するためのものである。プロセスは、コマンドを描画することにより始まる(プロセス・ブロック3202)。コマンドは、図32のプロセスなどの描画プロセスで描画される。次に、プロセスは、デフォルト・プロパティ・エディタを生成し、生成されたページ上のプロパティ・エディタを隠し(プロセス・ブロック3204)、その後、プロセスは終了する。ほとんどの場合、ユーザはプロパティ・エディタと対話しないので、プロパティ・エディタのデフォルト状態は、ユーザによって必要とされるまで隠される。コマンドがそれ自体を実装しないことを選んだ場合、デフォルト・プロパティ・エディタはプロセス・ブロック3204で生成される。コマンドは、generatePropertyEditorプロトコルを無効にすることにより、プロパティ・エディタを実装することができる。
次に図34を参照すると、本発明の例示的な一実施形態によるプロパティ編集のためのプロセスの流れ図が描写されている。図34のプロセスは図33のプロセスの後で行うことができる。まず、プロセスは、選択されたコマンド上で呼び出すべきプロパティ・エディタをトリガするためにユーザから信号を受信する(プロセス・ブロック3302)。たとえば、プロセス・ブロック3302では、ユーザは、プロパティ・エディタをトリガするWikiコマンドのアイキャッチャをクリックすることができる。
次に、プロセスは、クライアント側プロパティ・エディタ・サブシステムに対して選択されたコマンドを識別する(プロセス・ブロック3304)。Wiki環境は、生成されたアイキャッチャ上のマウス・クリックを追跡することにより、選択されたコンポーネントを追跡するJavaScriptベース・サブシステムを含む。アイキャッチャをクリックするアクションによって、選択されたコマンドが識別される。プロセス・ブロック3304は、図13のアイキャッチャ1302などのアイキャッチャによって実行することができる。
次に、プロセスは、クライアント側プロパティ・エディタを描画するようにサーバ側コマンド代表に要求するためのAJAX呼び出しを生成する(プロセス・ブロック3306)。プロセス・ブロック3306は、図13のプロパティ・エディタ1304などのプロパティ・エディタによって実行することができる。プロセス・ブロック3306の実行中に、AJAX呼び出しは、要求のオブジェクト変数で識別されたサーバにページをロードしたWikiコマンド・プロセッサのサーバ・ユニフォーム・リソース・インジケータを呼び出す。また、ユニフォーム・リソース・インジケータは、Wikiコマンドに関する入力値の新しい値を表す1組の新しいオブジェクト変数も含む。次に、エンジンは、Wikiコマンドの入力値を更新し、新しい値に基づいて対応する視覚表現を更新するようWikiコマンドに要求する。プロセス・ブロック3306は、図12のgeneratePropertyEditor1222などのコマンドによって開始することができる。
次に、プロセスは、プロパティ・エディタを選択する(プロセス・ブロック3308)。プロセス・ブロック3308では、選択されたWikiコマンドが、generatePropertyEditorメソッドを無効にすることにより、専門のプロパティ・エディタを提供することを選ぶ場合もあれば、デフォルト実装例を継承する場合もある。代わって、Wikiコマンドは、Wikiコマンドのパラメータ、プロパティ、および属性を編集するために必要なハイパーテキスト・マークアップ言語から構成される、それ自体のプロパティ・エディタを提供することもできる。プロパティ・エディタは、選択されたコマンドの属性に基づいて、プロセス・ブロック3308で選択することができる。
次に、プロパティ・エディタは、ユーザ対話を受信し、その後、Wikiコマンドのパラメータにupdateをサブミットする(プロセス・ブロック3310)。次に、プロパティ・エディタは、所与のページ上の選択されたWikiコマンドに関するパラメータのリストを更新するようサーバ・ページ・プロセッサに指示する、AJAXベースの要求を生成する(プロセス・ブロック3312)。次に、コマンド・プロセッサは、そのコマンドを配置し、そのコマンドをインスタンス化し、クライアントから渡された新しい値にそのコマンドの値を設定する(プロセス・ブロック3314)。次に、コマンド・プロセッサは、refreshOnUpdateメソッドを呼び出すことによりページ全体を更新しなければならないかどうかをコマンドに尋ねる(プロセス・ブロック3316)。プロセス・ブロック3316は、図4のコマンド・プロセッサ406によって実装される。ページ全体を更新しなければならないことをコマンドが示している場合。そのページ全体がクライアント上で再表示され(プロセス・ブロック3318)、その後、プロセスは終了する。ページ全体を更新する必要がないことをコマンドが示している場合、コマンドはそれ自体を描画し、クライアントのハイパーテキスト・マークアップ言語文書上のgetTargetDIV領域に新しいコンテンツが表示され(プロセス・ブロック3320)、その後、プロセスは終了する。
プロセス・ブロック3320の一例として、ユーザは、プロパティ・エディタを使用して、以下の例で記述するプロセスを実装することができるForecast Wikiコマンドのプロパティ値を更新することができる。ユーザは、プロパティ・エディタを使用して郵便番号プロパティを更新する。プロパティ・エディタは、updateコマンド要求を生成し、そのコマンドをサーバに送信する。サーバは、要求を受信し、Forecastコマンドを含むページをロードし、新しい郵便番号をそのページに配置し、更新済みページを保存し、そのコマンドがそのページをリフレッシュする必要があるかどうかをForecastコマンドに尋ねる。ForecastコマンドがNOと応答し、その結果、サーバは、プロパティ・エディタから送信された入力値の新しい値を使用してそれ自体を描画するようForecastコマンドに要求する。生成されたハイパーテキスト・マークアップ言語フラグメントは、クライアントに返送され、getTargetDIVプロトコルによって識別されたハイパーテキスト・マークアップ言語エレメント内に配置される。コマンドは、図32のプロセスなどのプロセスでそれ自体を描画することができる。
次に図35を参照すると、本発明の例示的な一実施形態によりプロパティ・エディタを選択するプロセスの流れ図が示されている。図35のプロセスは、図34のプロセス・ブロック3308をより詳細に記載したものである。プロセスは、デフォルト・プロパティ・エディタがgetPrametersを呼び出して、選択されたコマンドに関連するパラメータのリストおよびタイプを決定することから始まる(プロセス・ブロック3402)。次に、プロセスは、返された各パラメータごとにクライアント側エディタを生成する(プロセス・ブロック3404)。パラメータ・リストは、返されたパラメータに関する名前、ヘルプ文字列、および可能な値を提供する。
次に、プロセスは、クライアント・プロパティ・エディタで描画するために集約されたコンテンツをクライアントに配信し(プロセス・ブロック3406)、その後、プロセスは終了する。集約されたコンテンツは、特定のコマンドについてプロパティ・エディタから受信した情報である。たとえば、集約されたコンテンツは、プロパティ・エディタを示すために表示されたコマンドについてプロセス・ブロック3402および3404で入手された、それぞれのメタデータおよびパラメータを含む。集約されたコンテンツは、図34のプロセス・ブロック3306などのステップ中に定義されたクライアント・プロパティ・エディタで描画することができる。
図36〜図37は、Wikiページのライフサイクル中に使用されるページ・ライフサイクル・プロセスである。次に図36を参照すると、本発明の例示的な一実施形態によりページを削除するためのプロセスの流れ図が示されている。プロセスは、削除のためにページにマークを付けることから始まる(プロセス・ブロック3502)。ユーザは、コンテンツが古いこと、無関係であること、または任意のその他の理由により、ページにパークを付けることができる。プロセス・ブロック3502では、削除されるページにマークが付けられる。そのページは、実際にデータベースから除去されるわけではない。次に、そのページの各コマンドに対し、そのコマンドの所有ページが除去されたことが通知され(プロセス・ブロック3504)、その後、プロセスは終了する。各コマンドは、図12のwasDeleted1218などのメソッドを使用して、通知を受けることができる。プロセス・ブロック3504は、所与のページ上のWikiコマンドに関連する永続リソースを一掃するために使用される。
次に図37を参照すると、本発明の例示的な一実施形態によりページを改訂するためのプロセスの流れ図が描写されている。プロセスは、新しい空ページを作成することにより始まる(プロセス・ブロック3602)。次に、プロセスは、既存のページのクローンを新しいページに作成する(プロセス・ブロック3604)。次に、プロセスは、それがaboutToSaveであることをページ上の各コマンドに通知する(プロセス・ブロック3606)。aboutToSaveは、図12のライフサイクル1204などのライフサイクル・コマンドにすることができる。
次に、ページはデータベースに保存される(プロセス・ブロック3608)。次に、プロセスは、wasDeletedメソッドを呼び出して、もはやそのページの一部ではなくなることにより、それがそのページから削除されたことをそのページに通知する(プロセス・ブロック3610)。プロセス・ブロック3610は、もはやそのページの一部ではない各コマンドごとに実行される。次に、プロセスは、そのページがwasSavedであることをそのページ上の各コマンドに通知し(プロセス・ブロック3612)、その後、プロセスは終了する。プロセス・ブロック3612は、図12のwasSaved1216などのメソッドを使用することができる。
次に図38を参照すると、本発明の例示的な一実施形態によりページをコピーするためのプロセスの流れ図が描写されている。プロセスは、新しい空ページを作成することにより始めることができる(プロセス・ブロック3702)。次に、プロセスは、既存のページのクローンを新しいページに作成する(プロセス・ブロック3704)。次に、プロセスは、ページ上の各コマンドごとにwasCopiedメソッドを呼び出す(プロセス・ブロック3706)。プロセス・ブロック3706は、図12のwasCopied1220などのメソッドを使用することができる。
次に、プロセスは、そのページ上の各コマンドについてwasSavedを呼び出して、クローン・ページを保存し(プロセス・ブロック3708)、その後、プロセスは終了する。
次に図39を参照すると、本発明の例示的な一実施形態によりページを名称変更するためのプロセスの流れ図が描写されている。図39のプロセスは、元のページをロードすることにより始まる(プロセス・ブロック3802)。次に、プロセスは、そのページによって含まれるすべての子ページについてそのページの新しい名前を反映するために、そのページのタグ名を更新する(プロセス・ブロック3804)。次に、プロセスは、wasRenamedを呼び出して、そのページ上の各Wikiコマンドについてそれが名称変更されたことをWikiコマンドに通知し(プロセス・ブロック3806)、その後、プロセスは終了する。
次に図40を参照すると、本発明の例示的な一実施形態によりページを復旧するためのプロセスの流れ図が描写されている。図40のプロセスは、isLatestフラグを真に設定することにより、そのページを失効状態からアクティブに除去することにより始まる(プロセス・ブロック3902)。次に、プロセスは、そのページがwasUndeletedであることをそのページ上の各コマンドに通知し(プロセス・ブロック3904)、その後、プロセスは終了する。wasUndeletedは、前にそのページから削除された後でそのコマンドが所与のページ上に戻されたときに呼び出される。
次に図41を参照すると、本発明の例示的な一実施形態によるパレット構築のためのプロセスの流れ図が示されている。Wiki環境は、Wikiにインストールされた使用可能コマンドのパレットを提供する。このパレットは、Wiki環境内で使用可能なWikiコマンドを表示するための可視メカニズムを提供する。このパレットは、getCategoryプロトコルによって定義されたカテゴリに定義される。このパレットは、図41のプロセスを使用して、Wiki内の各コマンドについて生成される。
まず、プロセスは、そのコマンドが編集をサポートするかどうかを判断する(プロセス・ブロック4002)。Wikiが編集をサポートする場合、プロセスは、所与のWikiコマンドに関連するページに挿入すべきデフォルトWikiマークアップを返すgetDropContentを呼び出し(プロセス・ブロック4004)、その後、プロセスは終了する。プロセス・ブロック4004は、Wikiコマンドがパレットからドラッグされ、そのページ上に置かれたことに応答して、実行することができる。
プロセス・ブロック4002でそのコマンドが編集をサポートしないとプロセスが判断した場合、プロセスはそのコマンドのカテゴリを検索する(プロセス・ブロック4006)。カテゴリは、Wiki環境内のコマンドによって定義される。いくつかの模範的なカテゴリとしては、「データ・サービス」および「ページ・コンテンツ」を含む。同じカテゴリ内の各コマンドは、バレット・ビュー上の同じタブに表示される。次に、プロセスは名前を検索する(プロセス・ブロック4008)。名前は、図12のgetName1212などのメソッドを使用して検索することができる。次に、プロセスは記述を検索する(プロセス・ブロック4010)。記述は、図12のgetDescription1214などのメソッドを使用して検索することができる。次に、プロセスはアイコンを検索する(プロセス・ブロック4012)。アイコンは、getIconなどのメソッドを使用して検索することができる。次に、プロセスは、ドラッグ・コンテンツを検索し、各コマンド用のパレット上にそのエレメントを配置する(プロセス・ブロック4014)。ドラッグ・コンテンツは、getDragContentなどのメソッドを使用して検索することができる。
コマンドは、そのコマンドの使い方を伝達する固有のアイコンまたはアイキャッチャを表示することができる。getIconプロトコルは、描画されたときにそのコマンドのアイコンを表示するハイパーテキスト・マークアップ言語フラグメントを検索するために使用される。往々にして、コマンドは、新しいコマンドをそのページに挿入するためにそのページ上にコンポーネントが最初にドロップされたときにそのページ内に置かれるパレットからドラッグするためのハイパーテキスト・マークアップ言語コンテンツの異なる部分をユーザに提供する必要がある場合がある。実際にパレットからドラッグされるコンテンツは、getDragContentメソッドを無効にすることによって指定することができる。
次に、プロセスは、プロセス・ブロック4004に戻り、所与のWikiコマンドに関連するページに挿入すべきデフォルトWikiマークアップを返すgetDropContentを呼び出し、その後、プロセスは終了する。
次に図42を参照すると、本発明の例示的な一実施形態による構成のためのプロセスの流れ図が示されている。Wiki環境内に存在するWikiコマンドは、構成を必要とする場合がある。たとえば、GoogleMapコマンドは、アプリケーション・プログラミング・インターフェースとともに使用するためのキーを必要とする。
図42のプロセスは、コマンドがそれ自体を構成し、特定のWikiコマンドに関連する1組の構成データを維持できるようにするために使用される。図42のプロセスは、一般カタログ作成情報を表示することにより始まる(プロセス・ブロック4102)。次に、プロセスは、configureメソッドを呼び出す(プロセス・ブロック4104)。configureメソッドにより、コマンドは、Wiki内でWikiコマンドに関連するデータを編集するためにハイパーテキスト・マークアップ言語ビューを生成することができる。次に、プロセスは、get/setPluginDataメソッドを呼び出し(プロセス・ブロック4106)、その後、プロセスは終了する。get/setPluginDataメソッドは、Wikiサイトに影響するWikiコマンド・データを検索し保管するために使用される。たとえば、コマンド・データは、登録キーなど、そのコマンドを呼び出すために必要な初期設定データを含む。
次に図43を参照すると、本発明の例示的な一実施形態によるエクスポートのためのプロセスの流れ図が描写されている。Wikiは、完全なWikiまたはWikiのサブセットのインポートおよびエクスポートをサポートする。エクスポート・フォーマットは、エクスポートされるページのリストと、コマンドおよび添付物を含むページ・コンテンツとを含む。Wikiエンジンは、1組のページのエクスポートを支援するために図43のプロセスを呼び出す。1組のページは1つまたは複数のWikiページである。
図43のプロセスは、ページの名前を含む一般ページ情報をエクスポートすることにより始まる(プロセス・ブロック4202)。次に、プロセスは、ページ上の各WikiコマンドについてaboutToExportを呼び出す(プロセス・ブロック4204)。次に、プロセスは、getVersionメソッドを呼び出し、それを出力の一部として保管する(プロセス・ブロック4206)。プロセス・ブロック4204で呼び出されたaboutToExportがデータを返す場合、そのデータは、プロセス・ブロック4206で出力ストリーム内の専門PHPオブジェクトとして保存される。
次に,プロセスは、ページに関連するコマンドをエクスポートし(プロセス・ブロック4208)、その後、プロセスは終了する。各ページに関するユーザ注解を表すコメントを書くWikiページに添付することができる。コメントは、Wiki内で共同作業するためのメカニズムとして使用される。たとえば、弁理士は、Wikiページ上でどのようなコメントが使用されるかを発明者に尋ねることができる。
次に図44を参照すると、本発明の例示的な一実施形態によるインポートのためのプロセスの流れ図が描写されている。Wikiエンジンは、図44のプロセスを呼び出して、ページ上の各Wikiコマンドをインポートする。
図44のプロセスは、ページの名前を含む一般ページ情報をインポートすることにより始まる(プロセス・ブロック4302)。次に、プロセスは、コマンドがデータを保存したかどうかを判断する(プロセス・ブロック4304)。たとえば、プロセスは、図43のプロセス・ブロック4206などのステップでコマンドがデータを保存したかどうかを判断する。コマンドがデータを保存した場合、プロセスは、データをシリアル化解除する(プロセス・ブロック4306)。デフォルト実装例では、保存されたバージョン名が現行のインストール済みWikiコマンド・バージョンのものと一致することを保証する。次に、プロセスは、シリアル化解除されたデータとともにwasImportedを呼び出し(プロセス・ブロック4308)、その後、プロセスは終了する。プロセス・ブロック4304でデータが保存されなかった場合、プロセスは新しいページを返し(プロセス・ブロック4310)、その後、プロセスは終了する。
したがって、本発明の例示的な諸実施形態は、Wiki環境の機能を拡張するためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードをさらに提供する。共同環境を容易に作成するためにオブジェクトをどのように拡張するかを定義するためにオブジェクト指向フレームワークが使用される。Wikiコマンド・クラスは、再使用性、適応性、および使いやすさを促進する配備された環境を効果的に管理するために処理される。
次に図45を参照すると、本発明の例示的な一実施形態によりツリーを検索し構文解析するためのプロセスの流れ図が描写されている。ツリーは、例示的な諸実施形態によって使用される中核プロセス・データ構造である。ツリーは、図11の抽象構文ツリー1102などの抽象構文ツリーにすることができる。図45のプロセスは、図11のWikiコマンド・コンテキストなどのWikiコマンド・コンテキストによって実装される。Wikiコマンド・コンテキストは、ページを検索し、それを抽象構文ツリーに構文解析し(プロセス・ブロック4402)、その後、プロセスは終了する。WikiページはWikiによってロードされる。Wikiページは、ツリーを作成するWikiコマンド・コンテキストをインスタンス化する。
次に図46を参照すると、本発明の例示的な一実施形態によりWikiで表示するためのWebページを処理するためのプロセスが描写されている。図46のプロセスは、Wikiエンジンによって、より具体的には、図4のWikiエンジン402およびコマンド・プロセッサ406などのコマンド・プロセッサによって実装することができる。図46のプロセスは、抽象構文ツリー内に存在するコマンド上でinitiationメソッドを呼び出して、プロセス・エンジンが抽象構文ツリー内の各ノードを訪問することから始まる(プロセス・ブロック4502)。initiationメソッドはinitと命名することができる。initは、抽象構文ツリーの各ノード内のコマンドを検出し、そのコマンドを他のコマンドにとって使用可能なものにする。その結果、コマンドは、他の同一コマンドを含む他のコマンドと通信することができる。プロセス・ブロック4502中に、コマンドは、そのコマンドの内部データ構造を初期設定し、提供されたトピックを公表し、データ・ハブ上で関心のあるトピックに加入する責任を負っている。トピックは、提供者(publisher)と加入者(subscriber)との間で関心のある領域を表す。たとえば、提供者/加入者環境で重要なトピックの1つは「データ/使用可能」である。トピックの他の例としては「アドレス」および「latlong」を含む。プロセス・ブロック4502中に、コマンドは、initメソッドを使用して、すべてのコマンドが呼び出された後で処理する必要があるイベントをキューに入れることができる。イベントは、ある状態から他の状態への状態変化を伝達する。イベントは、状態変化を実装するための通信を刺激する。
イベントを規則正しい順次方式で処理することができ、JavaScriptクライアントなどの単一スレッド式実行環境で失われないように、イベントのキューイングが実行される。イベントのキューイングにより、中核実行環境は、すべてのコンポーネントが適切に初期設定され、イベントがディスパッチされる前にイベントを処理できる状態になることを保証する。コマンドは、本発明の例示的な諸実施形態のすべてのフェーズを実行することができ、デフォルト実装例を無効にすることができる。
次に、コマンド・プロセッサは、データ・ハブ上でprocessEventsを呼び出して、任意のキューイングされたイベントを配信する(プロセス・ブロック4504)。公表および加入モデルは、データ・ハブから受信するために、加入者が関心のあるイベントについてデータ・ハブに登録することを指図する。提供者は、データ・ハブ上でキューイングされたイベントをトリガする。processEventsフェーズ中に、データ・ハブは、各キューイングされたイベントを処理し、関心がある加入者を決定し、そのイベントを配信するために加入者を呼び出す。キューイングされたイベントは、プロセス・ブロック4502でキューに入れられたイベントである。次に、コマンド・プロセッサは、抽象構文ツリー内に存在するコマンド上でdiscoverメソッドを呼び出して、抽象構文ツリー内の各ノードを訪問する(プロセス・ブロック4506)。
discoverメソッドは、コマンド間のより詳細な対話のためにコマンド関連情報ソースの場所を突き止める。プロセス・ブロック4506中に、プロデューサ、コンシューマ、またはコントローラ・コマンドは、データ・ハブを使用して相互に場所を突き止め、データ・ハブの代わりに相互の直接イベント接続を確立することができる。コマンドは、上記のようにデータ・ハブを介して間接的に対話するかまたは発見フェーズ中に他のコマンドの場所を突き止めることを選ぶことができる。発見フェーズの処理中に、コマンドは、提供者、加入者、およびトピックについてデータ・ハブに問い合わせることができる。また、コマンドは、上記で確立された間接通信方法をバイパスして、必要であれば直接的に通信することもできる。この機能により、より効率的なイベントの処理が可能になり、通信インターフェースとしてのデータ・ハブの必要性が解消される。さらに、コマンドは、データ・ハブからそれ自体を除去することができる。コマンドは、initiationメソッドを使用して、すべてのコマンドが呼び出された後で処理する必要があるイベントをエンキューすなわちキューに入れることができる。
次に、コマンド・プロセッサは、データ・ハブ上でprocessEventsを呼び出して、任意のキューイングされたイベントを配信する(プロセス・ブロック4508)。キューイングされたイベントは、プロセス・ブロック4506でエンキューされたイベントである。次に、コマンド・プロセッサは、抽象構文ツリー内に存在するコマンド上でrenderメソッドを呼び出して、抽象構文ツリー内の各ノードを訪問し(プロセス・ブロック4510)、その後、プロセスは終了する。プロセス・ブロック4510中に、コマンドはそのページに関する視覚的コンテンツと非視覚的コンテンツの両方を描画する。たとえば、視覚的コンテンツは、リスト・データのテーブル表示を含むことができる。非視覚的コンテンツは、データのリストを検索し、いかなる視覚的コンテンツも持たない、SearchListコマンドを含むことができる。そのページのテキスト・フラグメントなどの非コマンド・ノードもプロセス・ブロック4510中に描画される。図46のステップのいずれでも、コマンドは、ページ・ソース・フラグメント上で図46のプロセスを再帰的に呼び出すことにより、ページ・ソース・フラグメントの他の部分をさらに処理することができる。ページ・ソース・フラグメントは、すべての非コマンド・コンテンツである。ページ・ソース・フラグメントは、そのページ上のコマンド間のすべての非コマンド・コンテンツを収集する。
次に図47を参照すると、本発明の例示的な一実施形態によりイベントを処理する流れ図が描写されている。図47の処理ステップは、図11のデータ・ハブ1112などのデータ・ハブによって実行される。図47は、図46のプロセス・ブロック4504のより詳細な説明である。
プロセスは、データ・ハブがキューからイベントを除去することから始まる(プロセス・ブロック4602)。次に、データ・ハブは、登録加入者にイベントを配信する(プロセス・ブロック4604)。登録加入者は、一般にコマンドであるが、代わって独立型機能ユニットにすることもできる。登録加入者は、コマンドが他のすべてのコマンドに対する関心を公表、加入、または登録する開始処理中に登録される。次に、データ・ハブは、登録加入者に配信された任意の結果イベントをキューに入れる(プロセス・ブロック4606)。プロセス・ブロック4606のイベントは、プロセス・ブロック4606で登録加入者に配信されたものである。
次に、データ・ハブは、データ・ハブのデータ配信メカニズムによってその入力値が履行されているコマンド上でinvokeメソッドをトリガし(プロセス・ブロック4608)、その後、プロセスは終了する。コマンドは、その機能を実行するために1組の入力値を提供する。入力値は静的または動的である可能性がある。入力値が動的である場合、Wikiエンジンは、そのコマンドへの入力として使用されるデータが使用可能になる時期を追跡する。入力が使用可能になると、それは、コマンドに配信され、その結果、「履行された」状態になる。
したがって、本発明の例示的な諸実施形態は、Wiki環境で表示するためのWebページを処理するためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードをさらに提供する。新たに追加されたコンポーネントは、最終的なビューを描画する前に抽象構文ツリーの形で他のコンポーネントと対話することができる。コンポーネントは、抽象構文ツリーのノードの形でページ供給コンテキストから新しい属性およびパラメータ設定を発見できるようになっている。最終的なビューを描画する前にコンポーネントが入力を妥当性検査し、エラーを報告するために、処理および妥当性検査メカニズムが使用される。ターゲットになっているイベントは、ページ供給シーケンスのライフサイクル内で処理される。単一サーバ上で同じコンポーネントの複数バージョンが管理される。
次に図48を参照すると、本発明の例示的な一実施形態によりサーバ側データ・ハブ・オブジェクトがインスタンス化されるときに行われる動作の流れ図が示されている。プロセスは、図4のWikiエンジン402によって実装される。
プロセスは、クライアントから新しいページをロードするための要求を受信することにより始まる(プロセス・ブロック4702)。新しいページをロードするための要求がサーバによって受信されると、プロセスは、サーバ側Wikiデータ・ハブ・クラス変数およびメソッドによって指定された属性およびメソッドにより、要求された新しいページに関連するクライアント側データ・ハブ・オブジェクトのインスタンスを作成する(プロセス・ブロック4704)。プロセスは、サーバ上のすべてのコンポーネントをサーバ側データ・ハブ・オブジェクトに登録し(プロセス・ブロック4706)、その後、プロセスは終了する。
次に図49を参照すると、本発明の例示的な一実施形態によりクライアント側データ・ハブ・オブジェクトがインスタンス化されるときに行われる動作の流れ図が示されている。プロセスは、図2のクライアント200内の処理装置206などのクライアント上の処理装置によって実装される。
プロセスは、サーバから受信した新しいページをロードすることにより始まる(プロセス・ブロック4802)。クライアント上の処理装置がそのページに関するハイパーテキスト・マークアップ言語またはJavaScriptをロードすると、プロセスは、クライアント側Wikiデータ・ハブ・クラス変数およびメソッドによって指定された属性およびメソッドにより、要求された新しいページに関連するクライアント側データ・ハブ・オブジェクトのインスタンスを作成する(プロセス・ブロック4804)。プロセスは、クライアント上のすべてのコンポーネントをクライアント側データ・ハブ・オブジェクトに登録し(プロセス・ブロック4806)、その後、プロセスは終了する。
次に図50を参照すると、本発明の例示的な一実施形態によりサーバ側データ・ハブがクライアント側データ・ハブからイベントを処理するための要求を受信するときに行われる動作の流れ図が示されている。データ・ハブは、図5のデータ・ハブ558および図6のデータ・ハブ638などのサーバ上のデータ・ハブによって実装される。
データ・ハブ・オブジェクトは、クライアント側データ・ハブからページ要求またはイベントあるいはその両方を受信することにより始まる(プロセス・ブロック4902)。データ・ハブ・オブジェクトは、1組のメソッドを使用して、要求/イベントを処理する(プロセス・ブロック4904)。要求/イベントは、クライアントに関連するプロデューサ・コマンドによって生成される。1組のメソッドは、データ・ハブ・オブジェクトの1組のメソッド、データ・ハブ・トピック・オブジェクトの1組のメソッド、データ・ハブ・イベント・オブジェクト、もしくは、データ・ハブ・オブジェクト、データ・ハブ・トピック・オブジェクト、またはデータ・ハブ・イベント・オブジェクトあるいはこれらの組み合わせに関連するメソッドの任意の組み合わせにすることができる。データ・ハブ・オブジェクトは、処理されたイベントを1組のコンシューマ・コマンドに送信し(プロセス・ブロック4906)、その後、プロセスは終了する。
次に図51を参照すると、本発明の例示的な一実施形態によりプロデューサ・コマンドがイベントを処理するときに行われる動作の流れ図が示されている。この例示的な例では、プロセスは、図14のWikiコマンド・オブジェクト1404および1412などのコマンド・オブジェクトによって実装される。
プロセスは、コマンドがそのコマンド上のinitメソッドの呼び出しの結果として初期設定するときに始まる(プロセス・ブロック5002)。コマンドを初期設定するためのinitメソッドはデータ・ハブによって呼び出される。コマンドは、トピックAなどの所与のイベント・トピックに関するプロデューサとしてデータ・ハブに登録する(プロセス・ブロック5004)。コマンドはデータを検索する(プロセス・ブロック5006)。この例示的な例では、データを検索することは、ユーザから入力を受信することとともに、データベースまたはその他のデータ記憶装置からデータを検索することを含むことができる。コマンドは、データ・ハブに対してトピックAに関するイベント・オブジェクトを始動し(プロセス・ブロック5008)、その後、プロセスは終了する。
次に図52を参照すると、本発明の例示的な一実施形態によりコンシューマ・コマンドがイベントを処理するときに行われる動作の流れ図が示されている。この例示的な例では、プロセスは、図14のWikiコマンド・オブジェクト1404および1412などのコマンド・オブジェクトによって実装される。
プロセスは、データ・ハブがすべてのコマンド上でinitializeメソッドを呼び出したことに応答してコンシューマ・コマンドが初期設定することから始まる(プロセス・ブロック5102)。コマンドは、トピックAなどの所与のイベント・トピックに関するコンシューマ・コマンドとしてデータ・ハブに登録する(プロセス・ブロック5104)。コマンドは、データ・ハブがコンシューマ・コマンド上でcallbackメソッドを呼び出したときにデータ・ハブからトピックAに関するイベントを受信する(プロセス・ブロック5106)。コマンドはイベントを処理する(プロセス・ブロック5108)。コマンドは、データ・ハブがコマンド上でrenderメソッドを呼び出したことに応答して、処理の結果をハイパーテキスト・マークアップ言語またはJavaScriptに描画する(プロセス・ブロック5110)。最後に、コマンドは、描画された結果をデータ・ハブに送信し(プロセス・ブロック5112)、その後、プロセスは終了する。
次に図53を参照すると、本発明の例示的な一実施形態によりクライアント側データ・ハブがイベントを受信するときに行われる動作の流れ図が示されている。この例示的な例では、プロセスは、図6のデータ・ハブ634、図14のデータ・ハブ1412、および図19のデータ・ハブ1910などのクライアント側データ・ハブによって実装される。
プロセスは、クライアント側データ・ハブがプロデューサ・コンポーネントなどのユーザまたはコンポーネントあるいはその両方からイベントを受信するときに始まる(プロセス・ブロック5202)。クライアント側データ・ハブは直ちにイベントを処理する(プロセス・ブロック5204)。このステップでは、クライアント側データ・ハブは、1つまたは複数のコマンドがイベント・オブジェクトに関連する所与のトピックに関するコンシューマとして登録しているかどうかを判断する。1つまたは複数のコマンドが所与のトピックに関するコンシューマとして登録している場合、クライアント側データ・ハブは1組の登録されたコンシューマ上でcallbackメソッドを呼び出して(プロセス・ブロック5212)、登録されたコンシューマにイベントを送信し、その後、プロセスは終了する。
次に図54を参照すると、本発明の例示的な一実施形態によりサーバ側データ・ハブがイベントを処理するときに行われる動作の流れ図が示されている。この例示的な例では、プロセスは、図6のデータ・ハブ634、図14のデータ・ハブ1404、および図15のデータ・ハブ1500などのサーバ側データ・ハブによって実装される。プロセスは、サーバ側データ・ハブがサーバに関連するすべてのコマンド上でinitialize「init()」メソッドを呼び出すときに始まる(プロセス・ブロック5302)。
サーバ側データ・ハブは、所与のトピック・イベントに関するコンシューマとしてのコマンドの登録を受信する(プロセス・ブロック5304)。サーバ側データ・ハブは所与のイベント・トピックに関するイベントを受信する(プロセス・ブロック5306)。イベントはデータを含むことができる。イベントは、ユーザ入力からまたは他のコマンドから受信することができる(プロセス・ブロック5308)。サーバ側データ・ハブはイベントをイベント・キューに追加する(プロセス・ブロック5310)。
サーバ側データ・ハブは、processEventsメソッド・フェーズ中にイベント・キュー内のイベントを処理する。サーバ側データ・ハブは、所与のトピックについて登録されたすべてのコンシューマ・コマンド上でcallbackメソッドを呼び出す。サーバ側データ・ハブは、callbackメソッドを呼び出して、そのイベントに関連するイベント・トピックについて登録されたコンシューマにイベントを送信する(プロセス・ブロック5316)。
サーバ側データ・ハブは、処理中の所与のイベント・トピックについて新しいイベントが受信されるかどうかについて判断を行う(プロセス・ブロック5318)。新しいイベントが受信される場合、サーバ側データ・ハブは、次のprocessEventフェーズ中に処理するためにイベントをイベント・キューに追加する(プロセス・ブロック5310)。プロセス・ブロック5318に戻り、新しいイベント・データがまったく受信されない場合、サーバ側データ・ハブは、イベントの処理に関係するすべてのコマンド上でrenderメソッドを呼び出す(プロセス・ブロック5320)。サーバ側データ・ハブは、イベントの処理に関係するすべてのコマンドから受信された描画された結果を収集し、表示のためにそのコンテンツをクライアントに送信し(プロセス・ブロック5322)、その後、プロセスは終了する。クライアントに返されたコンテンツは、クライアント・ブラウザで表示するためにハイパーテキスト・マークアップ言語またはJavaScriptで返される。
次に図55を参照すると、本発明の例示的な一実施形態によりクライアント側データ・ハブが処理のためにサーバにイベントを送信すべきかどうかを判断するときに行われる動作の流れ図が示されている。この例示的な例では、プロセスは、図6のデータ・ハブ634、図14のデータ・ハブ1412、および図19のデータ・ハブ1910などのクライアント側データ・ハブによって実装される。
プロセスは、クライアント側データ・ハブがプロデューサ・コマンドによって始動されたイベントを受信するときに始まる(プロセス・ブロック5402)。クライアント側データ・ハブは、そのイベントに関連するイベント・トピックのコンシューマとしてデータ・ハブに登録されたクライアント上の任意のコマンドにそのイベントを送信する(プロセス・ブロック5404)。クライアント側データ・ハブは、サーバ側データ・ハブにそのイベントを送信しなければならないかどうかについて判断を行う(プロセス・ブロック5406)。サーバ側データ・ハブにそのイベントを送信する必要はないとクライアント側データ・ハブが判断した場合、クライアント側データ・ハブはクライアント上でそのイベントを処理する(プロセス・ブロック5408)。サーバにそのイベントを送信しなければならないとクライアント側データ・ハブが判断した場合、クライアント側データ・ハブは、processClientEventを呼び出して、処理のためにサーバ側データ・ハブにイベントを送信する(プロセス・ブロック5410)。クライアント側データ・ハブは、サーバ側データ・ハブからprocessClientEventの結果を受信する(プロセス・ブロック5412)。クライアント側データ・ハブは、サーバからprocessClientEventの結果として受信した新しいWikiページ・コンテンツでクライアント上に表示されたWikiページを更新し(プロセス・ブロック5414)、その後、プロセスは終了する。
次に図56を参照すると、本発明の例示的な一実施形態によりサーバ側データ・ハブがprocessClientEventメソッド呼び出しの結果としてクライアント側データ・ハブからイベントを受信するときに行われる動作の流れ図が示されている。この例示的な例では、プロセスは、図6のデータ・ハブ634、図14のデータ・ハブ1404、および図15のデータ・ハブ1500などのサーバ側データ・ハブによって実装される。
プロセスは、クライアント側データ・ハブからトピックBなどの所与のイベント・トピックに関するイベントを受信するときに始まる(プロセス・ブロック5502)。サーバ側データ・ハブは、トピックBに関するイベントをイベント・キューに送信する(プロセス・ブロック5504)。サーバ側データ・ハブは、次のprocessEventフェーズ中にイベント・キュー内のトピックBに関するイベントを処理する(プロセス・ブロック5506)。サーバ側データ・ハブは、トピックBに関するリスナ/コンシューマとして登録されたサーバ上の1組のコンシューマにトピックBに関するイベントを送信する(プロセス・ブロック5508)。サーバ側データ・ハブは、サーバ上のプロデューサからトピックBに関する新しいイベント・データを受信する(プロセス・ブロック5510)。新しいイベント・データを始動するプロデューサは、プロセス・ブロック5508でイベント・データを受信したコンシューマのうちの1つまたは複数であった。サーバ側データ・ハブは、新しいイベント・データをイベント・キューに追加する(プロセス・ブロック5512)。
サーバ側データ・ハブは、次のprocessEventフェーズ中にトピックBに関する新しいイベントを処理する(プロセス・ブロック5514)。サーバ側データ・ハブは、トピックBに関するリスナ/コンシューマとして登録されたサーバ上のコンシューマに新しいイベントを送信する(プロセス・ブロック5516)。サーバ側データ・ハブは、トピックBに関するイベントの処理に関係するすべてのコマンド上でrenderメソッドを呼び出す(プロセス・ブロック5518)。サーバ側データ・ハブは、ハイパーテキスト・マークアップ言語またはJavaScriptでの描画の形でイベントのコマンド処理の結果を受信する(プロセス・ブロック5520)。サーバ側データ・ハブは、すべてのコマンドからの描画をバンドルし、その描画をクライアント側データ・ハブに送信し(プロセス・ブロック5522)、その後、プロセスは終了する。
また、本発明の例示的な諸実施形態は、イベント始動のための引数検出のためのコンピュータで実行される方法、装置、およびコンピュータ使用可能プログラム・コードも提供する。イベント始動は、処理のためにデータ・ハブにイベントを送信するプロセスを指す。
プロセスは、1組のソースからの引数データを集約して、集合データ・セットを形成する。プロセスは、1組の最小引数を形成するためのイベントを始動するために最小十分引数のリストを生成する。プロセスは、集合データ・セットを1組の最小引数と比較して、1組の最小引数が使用可能であるかどうかを判断する。プロセスは、1組の最小引数が使用可能であると判断したことに応答して、イベントを始動するためのコマンドをトリガする。
次に図57を参照すると、本発明の例示的な一実施形態によりWiki引数オブジェクトが最小十分引数プロセスを実行するときに行われる動作の流れ図が示されている。この例示的な例では、プロセスは、図14のWikiコマンド1404またはWikiコマンド1412などのWikiコマンド・オブジェクトによって実装される。
プロセスは、Wiki引数オブジェクトが1組のソースからの引数データを集約するときに始まる(プロセス・ブロック5602)。Wiki引数オブジェクトは、引数セットを形成するための宣言されたパラメータ基準に基づいて最小十分引数セットを生成する(プロセス・ブロック5604)。プロセスは、集合データ・セットを最小引数セットと比較する(プロセス・ブロック5606)。Wiki引数オブジェクトは、十分引数が存在するかどうかについて判断を行う(プロセス・ブロック5608)。十分引数が存在するとWiki引数オブジェクトが判断した場合、Wikiオブジェクトは、イベントを始動するために必須データが使用可能であることを示す、dataAvailableイベントを始動し(プロセス・ブロック5610)、その後、プロセスは終了する。
十分引数が存在しないとWiki引数オブジェクトが判断した場合、Wiki引数オブジェクトは、新しいデータが受信されたかどうかについて判断を行う(プロセス・ブロック5612)。新しいデータが受信されている場合、プロセスはプロセス・ブロック5604に戻り、そこでWiki引数が新しい集合引数データ・セットを生成して、この時点で十分引数が存在していたかどうかを判断する。新しいデータがまったく受信されていない場合、プロセスは、その後、終了する。
次に図58を参照すると、本発明の例示的な一実施形態によりコマンドの最小必須引数が設定されているかどうかをWiki引数オブジェクトが判断するときに行われるareArgumentsセット・メソッドに関するプロセスの流れ図が描写されている。この例示的な例では、プロセスは、図14のWikiコマンド1404またはWikiコマンド1412などのWikiコマンド・オブジェクトによって実装される。
プロセスは、引数を始動する前に最小十分セットの引数値が存在することを要求するイベントを始動するために、オブジェクトから呼び出しを受信することにより始まる(プロセス・ブロック5702)。プロセスは、引数リスト内に必須引数のリストを生成する(プロセス・ブロック5704)。次に、プロセスは、引数のリスト内に、まだチェックされていない引数がそれ以上存在するかどうかについて判断を行う(プロセス・ブロック5706)。換言すれば、プロセスは、引数リスト内のどの引数がリスト内で次にチェックすべき引数であるかを判断することにより、次にチェックまたは処理すべき引数を識別する。プロセスは、可用性および有効性についてリスト内のすべての引数をチェックするまで、その引数が使用可能かつ有効であるかどうかについて繰り返し判断を行うことにより、リスト内の次の引数をチェックする。リストが任意の追加の未処理または未チェックの引数を含まない場合、プロセスは、呼び出し側オブジェクトに「真」というブール値を返し(プロセス・ブロック5710)、その後、プロセスは終了する。
プロセス・ブロック5706に戻り、リストが次の未処理または未チェックの引数を含む場合、プロセスは、引数リスト内の次の引数が設定されているかどうかについて判断を行う(プロセス・ブロック5708)。プロセスは、未処理引数のリストから次の引数を除去する(プロセス・ブロック5706)。プロセス・ブロック5708で引数が設定されているとプロセスが判断した場合、プロセスはプロセス・ブロック5706に戻り、引数のリスト内のすべての引数がチェックされるまで、リストの処理を続行する。引数が設定されていないとプロセスが判断した場合、メソッドは呼び出し側に「偽」というブール値を返し(プロセス・ブロック5712)、その後、プロセスは終了する。
次に図59を参照すると、本発明の例示的な一実施形態により引数/使用可能イベントを始動すべきかどうかを検出するためのsetCheckArgumentsメソッドのためのプロセスの流れ図が示されている。この例示的な例では、プロセスは、図14のWikiコマンド1404またはWikiコマンド1412などのWikiコマンド・オブジェクトによって実装される。
プロセスは、ID引数が設定されているかどうかについて判断を行うことにより始まる(プロセス・ブロック5802)。ID引数は、データ・ハブ・コマンドに属すデフォルト引数である。ID引数は、データ・ハブ内のその存在を通じてイベントを明確に識別するために使用される。ID引数が設定されていないとプロセスが判断した場合、その後、プロセスは終了する。
プロセス・ブロック5802に戻り、ID引数が設定されている場合、プロセスは、識別されたイベントを始動する前に存在することが要求されるすべての引数が使用可能であるかどうかについて判断を行う(プロセス・ブロック5806)。プロセスは、前に定義された1組の必須引数内のすべての引数が使用可能であるかどうかを判断するフラグをチェックすることにより、この判断を行う。1組の必須引数内の前に定義された引数が使用可能ではないという判断をプロセスが行った場合、プロセスはareArgumentsSetメソッドを呼び出す(プロセス・ブロック5808)。プロセスがareArgumentsSetメソッドから「偽」という戻り値を受信した場合、その後、プロセスは終了する。
次にステップ5808に戻り、引数設定プロセスが真という値を返した場合、プロセスはデータ使用可能イベント・オブジェクトを作成する(プロセス・ブロック5810)。データ使用可能イベント・オブジェクトは、識別されたイベントを始動する前に存在することが要求されるすべての引数が存在することを示している。プロセスは、データ使用可能イベント・オブジェクトを始動して、識別されたイベントを始動するために識別されたイベントに関連するコマンドをトリガする(プロセス・ブロック5812)。
プロセス・ブロック5806に戻り、図58のプロセス・ブロック5708に示されているようにareArgumentsSetメソッドが「真」を返すとプロセスが判断した場合、プロセスはデータ使用可能イベント・オブジェクトを作成する(プロセス・ブロック5810)。次に、プロセスは、イベント・オブジェクトを始動するためのメソッドへの引数としてデータ使用可能イベントを有するデータ・ハブ・オブジェクト上でfireEventメソッドを呼び出す(プロセス・ブロック5812)。fireEventメソッドは、そのイベントを任意の聴取プロセスにリレーする。その後、プロセスは終了する。
図60は、本発明の例示的な一実施形態によりWikiページによってWikiページ・レイアウトを定義する動作を例示する流れ図である。Wikiページに関するWikiページ・レイアウトを継承する動作は、プロセス・ブロック5912〜5920で特に強調されている。図60の動作は、図4のWikiエンジン402などのWikiエンジン、より具体的には、図5のWikiコントローラ500などのWikiコントローラによって実装することができる。動作は、Wikiエンジンがページを表示するための要求を受信するときに始まる(プロセス・ブロック5902)。この要求は、典型的には、リモート・クライアント・ブラウザによって発行されたHTTP要求である。Wikiコントローラ・オブジェクトがこの要求を処理する。Wikiコントローラ・オブジェクトは、レイアウト・ページと結合された要求されたページを描画するプロセスを開始する(プロセス・ブロック5904)。
本発明の例示的な一実施形態では、要求されたページを描画するプロセスは、図5のWikiオブジェクト508などのWikiオブジェクトのshowPageメソッドを呼び出すことによって呼び出される。showPageメソッドは、要求されたWikiページを検索し、要求されたWikiページのHTMLバージョンを描画し、これはクライアント・ブラウザで表示することができる。Wikiオブジェクトは、新たに要求されたWikiページに関するコンテンツを生成するために使用されるオブジェクトおよびフィールドのすべてに関するリポジトリとして動作する。ページ描画プロセスの一部として、第1のサブプロセスが呼び出される(プロセス・ブロック5906)。第1のサブプロセスは、要求されたページのデータ・モデルを作成するために必要なデータ操作を実行する。本発明の例示的な一実施形態では、要求されたWikiページのデータ・モデルは、図5のWikiページ526などのWikiページ・オブジェクトである。本発明の例示的な一実施形態では、第1のサブプロセスは、showPageメソッドによって呼び出されるprocessPageメソッドである。
第1のサブプロセスは第2のサブプロセスを呼び出す(プロセス・ブロック5908)。第2のサブプロセスの目的は、現行要求の主題である、Wikiページに関連するWikiレイアウト・ページをロードすることである。本発明の例示的な一実施形態では、第2のサブプロセスはloadLayoutメソッドである。
第2のサブプロセスは、要求されたWikiページのデータ・モデルのレイアウト・フィールドがWikiレイアウト・ページ名を含むかどうかについて判断を行う(プロセス・ブロック5910)。本発明の例示的な一実施形態では、レイアウト・フィールドは、図5のページ526などのオブジェクト変数528などのWikiページ・オブジェクトのオブジェクト変数である。レイアウト・フィールドが現在要求されているWikiページ用のWikiレイアウト・ページ名を含まないと第2のサブプロセスが判断した場合(プロセス・ブロック5910に対するNOの出力)、第2のサブプロセスは、現在要求されているWikiページが祖先Wikiページを有するかどうかについて判断を行う(プロセス・ブロック5912)。祖先Wikiページは、ページ命名階層内のより上位レベルで発生するWikiページである。たとえば、Wikiページが「レベル1/レベル2」と命名され、「レベル1」と命名されたWikiページが存在する場合、「レベル1」と命名されたWikiページは、「レベル1/レベル2」というWikiページの「祖先(ancestor)と見なされる。本発明の他の例示的な実施形態では、第2のサブプロセスは、Wikiページ・オブジェクトのパス・フィールドをチェックすることにより、現在要求されているWikiページが祖先Wikiページを有するかどうかを判断する。パス・フィールドがWikiページの名前を含む場合、現在要求されているWikiページは祖先Wikiページを有するものと判断される。
現在要求されているWikiページが祖先Wikiページを有すると第2のサブプロセスが判断した場合(プロセス・ブロック5912に対するYESの出力)、第2のサブプロセスは、パスを検索し、パスをアレイにロードし、最も近い祖先が最初に現れるようにアレイの順序を逆にする(プロセス・ブロック5914)。ページ名階層では、最も近い祖先ページは、最後のセグメントの直前に発生する名前セグメントである。たとえば、あるページが「レベル1/レベル2/レベル3」と命名されている場合、そのページの最も近い祖先ページは「レベル2」と命名されたページである。そのページの最も遠い祖先ページは「レベル1」と命名されたページである。次に、第2のサブプロセスは、Wiki_pagesテーブル内の行または項目がパス・アレイ内のページ・アイデンティティの1つと一致するかどうかについて判断を行う(プロセス・ブロック5916)。Wiki_pagesテーブルは、Wikiページ・オブジェクトのオブジェクト変数を含むデータベース内のテーブルである。本発明の例示的な一実施形態では、ページ・テーブル内の項目または行は、アイデンティティ(ID)、アカウント、タグ、時間、ボディ、所有者アイデンティティ(所有者ID)、modified_by、isLatest、レイアウト、isLayout、isEditing、commentOn、パス、属性(attrib)、およびエラーというフィールドを含む。
一致が存在すると第2のサブプロセスが判断した場合(プロセス・ブロック5916に対するYESの出力)、第2のサブプロセスは、一致として返されるWikiレイアウト・ページをロードする(プロセス・ブロック5918)。Wiki_pagesテーブル内に一致項目を有することが判明した祖先ページは、整合(matched)祖先ページと呼ばれる。本発明の例示的な一実施形態では、第2のサブプロセスは、照会から一致として返されるWikiレイアウト・ページをロードする第3のサブプロセスを呼び出すことにより、照会から一致として返されるWikiレイアウト・ページをロードする。本発明の他の例示的な実施形態では、第3のサブプロセスはWikiオブジェクトのloadPageメソッドである。次に動作はプロセス・ブロック5924に移行する。
一致が存在しないと第2のサブプロセスが判断した場合(プロセス・ブロック5916に対するNOの出力)、第2のサブプロセスは、デフォルト・レイアウト・ページをロードする(プロセス・ブロック5920)。本発明の例示的な一実施形態では、デフォルト・レイアウト・ページをロードするためにWikiオブジェクトのloadPageメソッドが呼び出される。その後、動作はプロセス・ブロック5924に移行する。
現在要求されているWikiページが祖先Wikiページを有していないと第2のサブプロセスが判断した場合(プロセス・ブロック5912に対するNOの出力)、第2のサブプロセスは、第2のサブプロセスは、デフォルト・レイアウト・ページをロードする(プロセス・ブロック5920)。本発明の例示的な一実施形態では、デフォルト・レイアウト・ページをロードするためにWikiオブジェクトのloadPageメソッドが呼び出される。その後、動作はプロセス・ブロック5924に移行する。
レイアウト・フィールドが現在要求されているWikiページ用に設定されていると第2のサブプロセスが判断した場合(プロセス・ブロック5910に対するYESの出力)、第2のサブプロセスは、レイアウト・フィールドで指名されたレイアウト・ページをロードする(プロセス・ブロック5922)。本発明の例示的な一実施形態では、指名されたレイアウト・ページをロードするためにWikiオブジェクトのloadPageメソッドが呼び出される。
次に、第2のサブプロセスは、レイアウトWikiページ・オブジェクトを第1のサブプロセスに返す(プロセス・ブロック5924)。本発明の例示的な一実施形態では、第2のサブプロセスは、第3のサブプロセスを介してレイアウトWikiページ・オブジェクトを第1のサブプロセスに返す。第1のサブプロセスは、現在要求されているWikiページのWikiページ・オブジェクトのボディ・フィールドのコンテンツをWikiレイアウト・ページ・オブジェクトのボディ・フィールドの一部であるページ・コンポーネント「ボディ」に入れる(プロセス・ブロック5926)。ボディ・フィールドは、図5のページ526のオブジェクト変数528などのWikiページ・オブジェクトのオブジェクト変数である。本発明の例示的な一実施形態では、第1のサブプロセスは、Wikiレイアウト・ページ・オブジェクトの特殊テンプレート変数を現在要求されているWikiページのWikiページ・オブジェクトのボディ・フィールドで置き換えることにより、現在要求されているWikiページのWikiページ・オブジェクトのボディ・フィールドのコンテンツをWikiレイアウト・ページ・オブジェクトのボディ・フィールドに入れる。本発明の例示的な一実施形態では、特殊テンプレート変数は文字列変数である。本発明の他の例示的な実施形態では、第1のサブプロセスは、文字列置換により特殊テンプレート変数を現在要求されているWikiページのボディで置き換える。
次に、現在要求されているページのWikiページ・オブジェクトのボディ・フィールドは、Wikiレイアウト・ページ・オブジェクトのボディ・フィールドで置き換えられる(プロセス・ブロック5928)。Wikiレイアウト・ページ・オブジェクトのボディ・フィールドは、ヘッダ、メニュー、右マージン、左マージン、フッタ、およびボディなどのページ・コンポーネントを含む。クライアント・ブラウザでページを描画するための処理は、通常通り続行され(プロセス・ブロック5930)、その後、動作は終了する。したがって、クライアント・ブラウザで描画されると、現在要求されているWikiページは、関連Wikiレイアウト・ページに包まれた現在要求されているWikiページの元のコンテンツを含む。
したがって、本発明の例示的な諸実施形態は、Wikiレイアウト・ページのボディにWikiページ・コンテンツを埋め込むことを可能にする。さらに、具体的なレイアウトをWikiページに関連付けることができる。ユーザは、単純に新しいWikiページを作成し、新たに作成したWikiページのコンテンツを編集することにより、新しいWikiレイアウト・ページを作成することができる。新たに作成したWikiページの各セクションのデフォルト・コンテンツは、コマンドがコンテンツを提供するセクションにちなんで命名されたWikiコマンドによって提供される。ユーザは、HTMLページ・フローを使用することにより、ユーザが希望するそのページ上の任意の位置にこれらのWikiコマンドからのコンテンツを含めることができる。ユーザは、ユーザが適合すると見なすように、その他の静的HTMLコンテンツおよびその他の動的Wikiコマンドを新たに作成したWikiページ内に含めることができる。
さらに、本発明の例示的な諸実施形態は、あるWikiページが祖先ページからそのWikiページのレイアウトを継承することを可能にする。各Wikiページは、そのWikiページに関する祖先ページであって、そのWikiページに関連するページのリストを有する。祖先ページのリストは、Wikiオブジェクト内のフィールドに保管される。本発明の例示的な一実施形態では、そのフィールドはパス・フィールドと呼ばれる。Wikiページ・レイアウト修飾子を含む祖先リスト内で逆階層順に第1のWikiページを検出する照会が使用される。継承すべきターゲットWikiページについて、指定のレイアウト・ページが選択される。
図61は、本発明の例示的な一実施形態によりWikiページを描画する動作の流れ図である。図61の動作は、図4のWikiエンジン402などのWikiエンジン、より具体的には、図5のWikiコントローラ500などのWikiコントローラによって実装することができる。動作は、WikiエンジンがWikiページを表示するための要求を受信するときに始まる(プロセス・ブロック6002)。この要求は、典型的には、リモート・クライアント・ブラウザによって発行されたHTTP要求である。Wikiコントローラ・オブジェクトがこの要求を処理する。Wikiコントローラ・オブジェクトは、Wikiレイアウト・ページと結合された要求されたWikiページを描画するプロセスを開始する(プロセス・ブロック6004)。
本発明の例示的な一実施形態では、要求されたWikiページを描画するプロセスは、図5のWikiオブジェクト508などのWikiオブジェクトのshowPageメソッドを呼び出すことによって呼び出される。showPageメソッドは、要求されたWikiページを検索し、要求されたWikiページのHTMLバージョンを描画し、これはクライアント・ブラウザで表示することができる。Wikiオブジェクトは、新たに要求されたWikiページに関するコンテンツを生成するために使用されるオブジェクトおよびフィールドのすべてに関するリポジトリとして動作する。次に、Wikiエンジンは、コンポーネント・フィールドという図5のWikiページ526などの要求されたWikiページのフィールドに保管されたビット・マスクのビット・マスク設定をテストする(プロセス・ブロック6006)。コンポーネント・フィールド・ビット・マスクは、ヘッダ、メニュー、フッタなど、Wikiページ内の各ページ・コンポーネントに対応するビットを含む。所与のページ・コンポーネントに関するビットまたは設定が1という値を有する場合、レイアウト・ページ内の対応するページ・コンポーネントのWikiコマンドは、Wikiコマンドによって生成されたコンテンツをWikiページに付与することができる。所与のページ・コンポーネントに関するビットまたは設定が0という値を有する場合、レイアウト・ページ内の対応するページ・コンポーネントのWikiコマンドは、Wikiコマンドが生成することになっているコンテンツをWikiページに付与することができない。
次に、動作は、要求されたWikiページを関連Wikiレイアウト・ページと結合し(プロセス・ブロック6008)、結合ページを形成する。本発明の例示的な一実施形態では、要求されたWikiページに関連するWikiレイアウト・ページを決定するために、ページ・テーブルをチェックして、要求されたWikiページに関連する特定のWikiレイアウト・ページを決定する。本発明の例示的な一実施形態では、ページ・テーブルはWiki_pageテーブルと呼ばれる。要求されたWikiページがページ・テーブル内のWikiページに関連する特定のWikiレイアウト・ページを備えていない場合、デフォルトWikiレイアウト・ページが要求されたWikiページに関連付けられ、結合される。
したがって、本発明の例示的な諸実施形態は、Wikiページ・レイアウト・セクションをプログラムにより隠したり示したりすることができる。Wikiページ設定は、ユーザがWikiページを設定するときにユーザによって編集可能なチェックボックスとして実装される。チェックボックスにチェックを付け、チェックをはずすことにより、ユーザは、様々なページ・コンポーネント、ならびに、ページ・コメント、添付物、および電子メールの可視性を制御する。
次に図62を参照すると、本発明の例示的な一実施形態によるサーバ側データ・ハブ・オブジェクト・クラスのためのクラス定義の例証が描写されている。図22のサーバ側データ・ハブ・オブジェクト2100などのサーバ側データ・ハブ・オブジェクトは、コード6102内のクラス変数などのWikiデータ・ハブ・クラス定義によって定義された属性およびオブジェクト変数を有する。
この例示的なWikiデータ・ハブ・クラス定義は、Wikiコマンド・オブジェクトのアレイ6104、コンシューマIDのアレイ6106、およびプロデューサIDのアレイ6108を提供する。したがって、所与のページ・インスタンスについてサーバ側データ・ハブがインスタンス化されるたびに、サーバ側データ・ハブ・インスタンスに関するデータ・ハブ属性は、上記に示すWikiデータ・ハブ・クラス定義などのWikiデータ・ハブ・クラス定義によって定義される。
次に図63を参照すると、本発明の例示的な一実施形態によるデータ・ハブ管理メソッドのクラスのための1組のメソッド・インターフェースの例証が描写されている。この1組のデータ・ハブ管理メソッド6200は、図14のデータ・ハブ管理1402などのサーバ側データ・ハブに関連するデータ・ハブ管理メソッド・インターフェースである。コード6202は、図1の記憶装置108など、ファイル・システムまたはその他のデータ記憶装置に保存されたデータ・ハブ・オブジェクトを復元するためのメソッドの一例である。コード6204は、データ・ハブ・オブジェクトのインスタンスをファイル・システムに保存またはキャッシュするためのメソッドの一例である。
次に図64を参照すると、本発明の例示的な一実施形態によるプロデューサおよびコンシューマ・メソッドのクラスのための1組のメソッド・インターフェースの例証が示されている。この1組のプロデューサおよびコンシューマ・メソッド6300は、図22のプロデューサおよびコンシューマなどのサーバ側データ・ハブに関連するデータ・ハブ・メソッド・インターフェースである。この1組のデータ・ハブ管理メソッド6200は、図22のプロデューサおよびコンシューマなどのデータ・ハブ管理メソッド・インターフェースである。
コード6302は、データ・ハブにコマンドを追加するためのメソッドである。コード6304は、データ・ハブのメンバであるコマンドを取得するためのメソッドである。コード6306は、コマンドを取得するためのメソッドである。コード6308は、プロデューサ・コマンドを追加するために呼び出されるメソッドである。コード6310は。編集可能プロデューサ・コマンドを追加するためのメソッドである。編集可能プロデューサ・コマンドは、作成動作、更新動作、および削除動作のために編集できるデータを提供する。
コード6312は、正規または編集可能プロデューサ・コマンドなどのプロデューサ・コマンドを除去するためのメソッドである。コード6314は、すべてのプロデューサのリストを取得するためのメソッドである。コード6316は、特定のトピックに関するリスナとしてのコンシューマ・コマンドを追加するためのメソッドである。コード6318は、特定のトピックに関するリスナとしてのコンシューマ・コマンドを除去するためのメソッドである。コード6320は、特定のトピックを聴取しているコンシューマ・コマンドのリストを取得するためのメソッドである。コード6322は、特定のコマンドに関するリスナとしてのクライアント・コンシューマ・コマンドを追加するためのメソッドである。
コード6324は、クライアントJavaScriptハンドラを追加するためのコマンドである。コード6326は、特定のトピックに関するリスナとしてのコンシューマ・コマンドを除去するためのコードである。コード6328は、特定のトピックを聴取しているコンシューマ・コマンドのリストを取得するためのメソッドである。コード6330は、特定のトピックに関するリスナとしてのクライアント・コンシューマを追加するためのメソッドである。コード6332は、クライアント側データ・ハブに属すコマンドに関するクライアント上のJavaScriptコードを生成するためのメソッドである。
次に図65を参照すると、本発明の例示的な一実施形態によるトピック・メソッドのクラスのための1組のメソッド・インターフェースの例証が示されている。この1組のトピック・メソッド6340は、図22のトピック2106などのサーバ側データ・ハブ上のトピック・メソッドに関するメソッド・インターフェースである。たとえば、コード6342は、イベント・トピックを追加するためのメソッドの一例である。コード6344は、イベント・トピックを除去するためのメソッドである。
次に図66を参照すると、本発明の例示的な一実施形態によるイベント処理メソッドのクラスのための1組のメソッド・インターフェースの例証が示されている。この1組のイベント処理メソッド6400は、図22のイベント処理2108などのサーバ側データ・ハブ上のイベント処理メソッドに関するメソッド・インターフェースである。たとえば、コード6402は、イベントを始動するためのメソッドである。コード6404は、サーバ上のイベントを処理するためのメソッドである。コード6404は、サーバ向けのクライアント・イベントを処理するためのメソッドである。複数のイベントをバッチとしてサーバに送信することができる。
次に図67を参照すると、本発明の例示的な一実施形態によるコマンド管理メソッドのクラスのための1組のメソッド・インターフェースの例証が示されている。この1組のコマンド管理メソッド6500は、図22のコマンド管理2110などのサーバ側データ・ハブ上のコマンド管理メソッドに関するメソッド・インターフェースである。たとえば、コード6502は、コマンドに関する引数を設定するためのメソッドである。これにより、ソース内の引数が変更される。コード6504は、ページ・ソースからコマンドを削除するためのメソッドである。
次に図68を参照すると、本発明の例示的な一実施形態によるクライアント側データ・ハブ・オブジェクト・クラスのためのクラス定義の例証が描写されている。データ・ハブ属性およびオブジェクト変数は、コード6600に示されているように、クライアント側データ・ハブに関するWikiデータ・ハブ・クラス定義によって定義される。コード66−2は、コンシューマIDに関するオブジェクト変数である。コード6604は、トピックに関するオブジェクト変数である。コード6606は、イベントに関するオブジェクト変数である。
次に図69を参照すると、本発明の例示的な一実施形態によるプロデューサおよびコンシューマ・メソッドのクラスのための1組のメソッド・インターフェースの例証が示されている。この1組のプロデューサおよびコンシューマ・メソッド6700は、図23のプロデューサおよびコンシューマ2202などのクライアント側データ・ハブ上のプロデューサおよびコンシューマ・メソッド・インターフェースである。たとえば、コード6702は、コンシューマ・コマンドを追加するためのメソッドである。コード6704は、コンシューマ・コマンドを除去するためのメソッドである。
次に図70を参照すると、本発明の例示的な一実施形態によるトピック・メソッドのクラスのための1組のメソッド・インターフェースの例証が描写されている。この1組のトピック・メソッド6800は、図23のトピック2204などのクライアント側データ・ハブ上のトピック・メソッドに関するメソッド・インターフェースである。たとえば、コード6802は、他のコンシューマ・コマンドに使用可能なトピックを追加するためのメソッドである。コード6804は、使用可能なトピックのリストを取得するためのメソッドである。
次に図71を参照すると、本発明の例示的な一実施形態によるイベント処理メソッドのクラスのための1組のメソッド・インターフェースの例証が示されている。この1組のイベント処理メソッド6900は、図23のイベント処理2206などのクライアント側データ・ハブ上のイベント処理メソッドに関するメソッド・インターフェースである。たとえば、コード6902は、すべての待機(queued up)イベントを始動するためのメソッドである。コード6904は、イベントを始動するためのメソッドである。コード6906は、実行のためにイベントをサーバに送信するためのメソッドである。
次に図72を参照すると、本発明の例示的な一実施形態によるコマンド管理メソッドのクラスのための1組のメソッド・インターフェースの例証が示されている。この1組のコマンド管理メソッド7000は、図23のコマンド管理2208などのクライアント側データ・ハブ上のコマンド管理メソッドに関するメソッド・インターフェースである。たとえば、コード7002は、Wikiコマンドを追加するためのメソッドである。コード7004は、コマンドを削除するためのメソッドである。
データ・ハブ・トピック・オブジェクトは、コンシューマが加入できるトピックならびにプロデューサ・コマンドが公表または始動できるトピックを定義する。たとえば、検索コンポーネントは、ある検索トピックに加入するコンシューマである。ユーザ・インターフェースがユーザから検索語を受信すると、そのユーザ・インターフェースは検索トピックに関するイベントを始動する。換言すれば、ユーザ・インターフェースは、コンシューマ検索コンポーネントによって加入されたトピックを公表するプロデューサである。
次に図73を参照すると、本発明の例示的な一実施形態によるデータ・ハブ・トピック・オブジェクトのクラスのための1組のオブジェクト変数およびメソッド・インターフェースの例証が描写されている。オブジェクト変数7100は、トピック・オブジェクトの属性を定義する。この1組のメソッドは、図22のデータ・ハブ・トピック・オブジェクト2112および図23のデータ・ハブ・トピック・オブジェクト2210などのクライアント側データ・ハブまたはサーバ側データ・ハブ上のデータ・ハブ・トピック・オブジェクトに関するメソッド・インターフェースである。本発明のこの例示的な実施形態では、サーバに関連するデータ・ハブ・トピック・オブジェクトとクライアントに関連するデータ・ハブ・トピック・オブジェクトは同じオブジェクト変数およびメソッドを有する。
次に図74を参照すると、本発明の例示的な一実施形態によるデータ・ハブ・イベント・オブジェクトのクラスのためのクラス定義およびメソッド・インターフェースの例証が描写されている。クラス定義7200は、イベント・オブジェクトの属性を定義する。たとえば、コード7202は、トピックに関するオブジェクト変数を定義する。すべてのイベント・オブジェクトは、トピック・オブジェクト変数でトピック値を有する。コード7204は、値に関するオブジェクト変数を定義する。イベント・オブジェクトは、オブジェクト変数値に保管されたデータを有する可能性がある。しかし、すべてのイベント・オブジェクトがデータを含むわけではない。
本発明のこの例示的な実施形態では、1組のメソッドは、図22のデータ・ハブ・イベント・オブジェクト2114および図23のデータ・ハブ・イベント・オブジェクト2212などのデータ・ハブ・イベント・オブジェクトに関するメソッド・インターフェースである。サーバに関連するデータ・ハブ・イベント・オブジェクトとクライアントに関連するデータ・ハブ・イベント・オブジェクトは同じオブジェクト変数およびメソッドを有する。
データ・ハブ・オブジェクト、データ・ハブ・トピック・オブジェクト、またはデータ・ハブ・イベント・オブジェクト、あるいはこれらの組み合わせは、本発明の例示的な諸実施形態の範囲を逸脱せずに、例示的な諸実施形態に示されていない追加のメソッドを含むことができる。加えて、データ・ハブ・オブジェクト、データ・ハブ・トピック・オブジェクト、またはデータ・ハブ・イベント・オブジェクト、あるいはこれらの組み合わせに関連するメソッドのうちの1つまたは複数は、本発明の例示的な諸実施形態によるデータ・ハブ・オブジェクト、データ・ハブ・トピック・オブジェクト、またはデータ・ハブ・イベント・オブジェクト、あるいはこれらの組み合わせのための1組のメソッドにはない可能性がある。
イベント・ベースのWikiコンポーネント・モデルでは、Wikiコンポーネントによっては、コンポーネントが応答するかまたはイベント・オブジェクトを始動する前に最小十分セットの引数値が存在することを要求する。これらの最小十分引数は、複数の異種ソースからのものである可能性がある。したがって、本発明の例示的な諸実施形態の諸態様は、宣言された/定義されたパラメータ基準を満足するための最小十分引数が存在する場合のみ、「データ/使用可能」イベントが始動されるように、潜在的に複数のソースからの引数データを集約し、宣言されたパラメータ基準に対して引数セットを突き合わせる、最小十分引数検出スキームを提供する。
Wiki引数オブジェクトは、図14のWikiコマンド1404およびWikiコマンド1412などのWikiコマンドに関連するオブジェクトである。Wiki引数オブジェクトは、コマンドが始動するために必要な引数が設定され、有効であるかどうかを示す「効用(avail)」プロパティを有する。
図75は、本発明の例示的な一実施形態によるWiki引数オブジェクトのためのクラス定義の例証である。引数/使用可能イベントを始動すべきかどうかを検出するためのアルゴリズムは、図14のWikiコマンド・オブジェクト1404および1412などのコマンド・オブジェクト上のWiki引数オブジェクトによって実行される。コード7302は、引数オブジェクトが有効であるかどうかを示すオブジェクト変数である。コード7304は、引数が設定され、使用可能であるかどうかを示す引数オブジェクトである。
次に図76を参照すると、本発明の例示的な一実施形態により引数/使用可能イベントを始動すべきかどうかを検出するためのアルゴリズムの擬似コードの例証が示されている。
この例では、コード7400は、データ・ハブ・イベント・オブジェクトを始動するための最小必須引数セット内の各引数が使用可能であるかどうかを判断するアルゴリズムに関するものである。使用可能な変数がヌルであるかどうかを判断するために、各引数がコード7402でチェックされる。セット内の各引数が使用可能であることをアルゴリズムが示す場合、コード7406は、その引数が使用可能であり、設定されている可動化について判断を行う。その引数が使用可能であり、設定されている場合、コード7408は、引数セットに関連する新しいデータ・ハブ・イベント・オブジェクトを始動する。
したがって、例示的な諸実施形態の諸態様は、Wiki環境およびクライアント環境内のコマンド間でイベント・オブジェクトを伝搬または経路指定するためのサーバ側データ・ハブ・オブジェクトおよびそれに対応するクライアント側データ・ハブ・オブジェクトを提供する。データ・ハブ・オブジェクトの使用により、コマンドは、所与のWikiページに関連するイベントの処理中により容易く対話することができる。
上記で詳述した本発明の例示的な諸実施形態はWiki環境内のWikiアプリケーションに関して記載されているが、本発明の上記の例示的な諸実施形態はWiki環境内のWikiアプリケーションに限定されないことに留意されたい。この説明における一例としてのWiki環境内のWikiアプリケーションの使用は、いずれにしても本発明の範囲を制限するためのものではない。本発明の上記の例示的な諸実施形態は、インターフェースを介してユーザ・グループによりアクセス可能な任意の共用環境にも等しく適用されることは、当業者にとって明白になるであろう。さらに、上記の例示的な諸実施形態の特定の態様はJavaScript言語に関して説明されているが、この説明における一例としてのJavaScript言語の使用は、いずれにしても本発明の範囲を制限するためのものではない。当業者であれば、任意のオブジェクト指向スクリプト言語を使用して上記の例示的な諸実施形態を実装可能であることを認識するであろう。
図面内の流れ図およびブロック図は、本発明の様々な諸実施形態による方法、装置、およびコンピュータ・プログラムについて可能な実装例のアーキテクチャ、機能、および動作を例示している。この点に関しては、流れ図またはブロック図内の各ブロックは、指定の論理機能(複数も可)を実装するための1つまたは複数の実行可能命令を含む、コードのモジュール、セグメント、または一部分を表すことができる。また、いくつかの代替実装例では、ブロック内に示された機能は図面内に示された順序から外れて行われる可能性があることに留意されたい。たとえば、連続して示されている2つのブロックは、関係する機能に応じて、実際にはほぼ同時に実行される場合もあれば、ときには逆の順序で実行される場合もある。
本発明は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態、またはハードウェアとソフトウェアの両方の要素を含む実施形態の形を取ることができる。好ましい一実施形態では、本発明は、ファームウェア、常駐ソフトウェア、マイクロコードなどを含むがこれらに限定されないソフトウェアで実装される。
さらに、本発明は、コンピュータまたは任意の命令実行システムによりあるいはそれに関連して使用するためのプログラム・コードを提供するコンピュータ使用可能媒体またはコンピュータ可読媒体からアクセス可能なコンピュータ・プログラムの形を取ることができる。この説明のために、コンピュータ使用可能媒体またはコンピュータ可読媒体は、命令実行システム、装置、またはデバイスによりあるいはそれに関連して使用するためのプログラムを収容、保管、通信、伝搬、または伝送可能な任意の有形装置にすることができる。
この媒体は、電子、磁気、光、電磁、赤外線、または半導体システム(あるいは装置またはデバイス)もしくは伝搬媒体にすることができる。コンピュータ可読媒体の例としては、半導体またはソリッド・ステート・メモリ、磁気テープ、取り外し可能コンピュータ・ディスケット、ランダム・アクセス・メモリ(RAM)、読み取り専用メモリ(ROM)、剛性磁気ディスク、および光ディスクを含む。光ディスクの現在の例としては、コンパクト・ディスク読み取り専用メモリ(CD−ROM)、書き換え可能コンパクト・ディスク(CD−R/W)、およびDVDを含む。
プログラム・コードの保管または実行あるいはその両方に適したデータ処理システムは、システム・バスを介して記憶素子に直接または間接的に結合された少なくとも1つのプロセッサを含むことになる。記憶素子としては、プログラム・コードの実際の実行中に使用されるローカル・メモリと、大容量記憶装置と、実行中に大容量記憶装置からコードを検索しなければならない回数を削減するために少なくとも何らかのプログラム・コードの一時記憶を提供するキャッシュ・メモリとを含むことができる。
入出力またはI/O装置(キーボード、ディスプレイ、ポインティング・デバイスなどを含むがこれらに限定されない)は、直接あるいは介在する入出力コントローラを介してシステムに結合することができる。
また、データ処理システムが介在する私設網または公衆網を介してその他のデータ処理システムあるいはリモート・プリンタまたは記憶装置に結合された状態になれるようにするために、ネットワーク・アダプタもシステムに結合することができる。モデム、ケーブル・モデム、およびイーサネット・カードは、現在使用可能なタイプのネットワーク・アダプタのうちのいくつかに過ぎない。
本発明の説明は、例証および解説のために提示されたものであり、網羅するためまたは開示された形式に本発明を限定するためのものではない。多くの変更および変形は当業者にとって明白なものになるであろう。この実施形態は、本発明の原理、実用的な適用例を最も良く説明するため、ならびにその他の当業者が企図された特定の用途に適した様々な変更を含む様々な実施形態について本発明を理解できるようにするために、選択され記載されたものである。