JP2008544338A - Xmlアプリケーションフレームワーク - Google Patents

Xmlアプリケーションフレームワーク Download PDF

Info

Publication number
JP2008544338A
JP2008544338A JP2008508957A JP2008508957A JP2008544338A JP 2008544338 A JP2008544338 A JP 2008544338A JP 2008508957 A JP2008508957 A JP 2008508957A JP 2008508957 A JP2008508957 A JP 2008508957A JP 2008544338 A JP2008544338 A JP 2008544338A
Authority
JP
Japan
Prior art keywords
data
components
application
graph
phase
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2008508957A
Other languages
English (en)
Other versions
JP5042993B2 (ja
Inventor
エス.ウィリアムズ アンソニー
エー.ジパースキー クレメンス
ウィッテンバーグ クレイグ
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JP2008544338A publication Critical patent/JP2008544338A/ja
Application granted granted Critical
Publication of JP5042993B2 publication Critical patent/JP5042993B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/20Software design
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/451Execution arrangements for user interfaces

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Human Computer Interaction (AREA)
  • Stored Programmes (AREA)

Abstract

本発明は、XMLアプリケーションフレームワーク(XAF)に関する。コンピュータシステムに関するすべての動作がデータに焦点を合わせたものになるように、XAFアプリケーションはデータ駆動型である。さらに、XAFアプリケーションで使用されるコンポーネントは、データがどのように表示されるかと、どの型のデータが使用されるかとに従って、インスタンス化され、接続される。XAF内のアプリケーションは、ユーザインターフェース(UI)コネクタ、アクションモジュール、およびデータコネクタを含む。UIコネクタは、UIイベントを受信し、そのUIイベントをアクションモジュールに接続する。アクションモジュールは、UIイベントから標準フォーマットアクションを生成し、その標準フォーマットアクションをデータコネクタに送信する。データコネクタは、標準フォーマットアクションをデータ固有アクションに変換し、そのデータ固有アクションが、データストア内のデータを変更する。次に、データコネクタは、変更されたデータに対応する標準フォーマットデータ表現をUIコネクタに返送して、変更されたデータをUIに提供する。

Description

(著作権に関する声明)
本特許書類の開示の一部には、著作権保護の対象となる要素が含まれている。著作権所有者は、本特許書類または特許開示が米国特許商標庁の特許ファイルまたは記録の中に表示されている場合、いかなる者がそれらをファクシミリによって複製しても、異議を申し立てないものとするが、その他の場合は、いかなるものであれ著作権関連の権利をすべて留保する。
一般に、ソフトウェアシステムは、コンピュータシステム内のソフトウェアコンポーネントを編成し、相互接続するソフトウェアアーキテクチャを提供する。ソフトウェアコンポーネントは、ソフトウェアアプリケーションにソフトウェアコンポーネントの機能を提供する動作を実行する。一般に、アプリケーションは、それぞれが1つまたは複数のコンポーネントを有する複数の特徴を用いて動作する。コンポーネントは、したがって、特徴は、その動作をより小さくより単純なタスクに分節する1つまたは複数の基礎になるソフトウェアコンポーネントから形成することができる。
ソフトウェアアプリケーションを構成するときに、ソフトウェア開発者は、C#などの開発言語を使用してソフトウェアコンポーネントを作成しなければならない。命令コード(imperative code)すなわちソフトウェアコンポーネントにソフトウェアコードの機能を提供する当該ソフトウェアコードを作成する際に、開発者は、呼び出しまたは他の構造を介して、すべてのコンポーネント間のリンクを作成しなければならない。アプリケーションによって提供されるすべての機能について、ソフトウェア開発者は、一般に、そのアプリケーションに固有の機能を実行するすべての様々なソフトウェアコンポーネントに関するコードを作成し、タスクを完了するために互いに依存しあうソフトウェアコンポーネント間の相互接続を手作業でコーディングする。ソフトウェア開発者は、ユーザインターフェース(UI)、データ構造体、および、ユーザとアプリケーションとの間の対話に関するすべての必要な動作を作成する。
多くのアプリケーションでは、UI、動作、およびデータ構造体が、アプリケーションに固有である。したがって、アプリケーションを作成するために、ソフトウェア開発者は、通常、膨大な量のコードを作成する。さらに、ソフトウェア開発者は、一般に、ソフトウェアの様々な部分間のすべての相互関係を編成して、作成する。アプリケーションを作成するためには、アプリケーションの作成に使用される基礎になる言語が複雑なので、ソフトウェア開発者は、高い技量を有さなければならない。
アプリケーションを生成する現在の方法の複雑さに起因して、また、所与のアプリケーションのコードの特異性およびその不可避の相互接続に起因して、ソフトウェア開発者は、多大な労力なしに、また、既存のアプリケーションに対して悪影響を及ぼす危険性なしに、現在のアプリケーションを容易に修正し、または拡張することはできない。
本発明が行われたのは、上記および他の考慮事項に関してである。
この要約は、以下の詳細な説明でさらに説明される概念のうちから選択したものを単純化した形で紹介するために提供される。この要約は、特許請求される主題の主要な特徴または本質的な特徴を特定することを意図するものではない。
本発明の実施形態は、所与のソフトウェアアプリケーションのランタイム構造を生成し、そのソフトウェアアプリケーションの実行を管理するソフトウェアアプリケーションフレームワークを提供することによって、上記および他の問題を解決する。本発明のアプリケーションフレームワークによって生成されるアプリケーションは、接続されたアプリケーションコンポーネントの集合(collection)またはグラフから構成される。このアプリケーションフレームワークに従って構成されたアプリケーションの機能は、アプリケーションコンポーネントのグループをコンポーネントドメインに動的に構成することによって使用可能にでき、各ドメインは、アプリケーションの所与の機能、例えばワープロ文書内での画像の表示、を可能にするように構成される。
アプリケーションのランタイム構造を生成するために、アプリケーションは、必要なアプリケーション機能ごとのアプリケーション記述(application description)をアプリケーション記述エンジンに渡す。アプリケーション記述は、コンポーネントドメインを構造化して作成する宣言ルールを提供し、アプリケーション記述エンジンは、アプリケーションによって受信されるデータイベントに基づいて、必要に応じてコンポーネントドメインを作成して再構成するために、宣言ルールを解釈するように動作可能である。アプリケーションによって受信されるデータイベントは、ユーザアクションによって、例えば、ユーザインターフェース内の機能ボタン、コントロール、またはデータオブジェクトのユーザ選択に応答して、生成されるものとすることができる。データイベントは、外部変化によって、例えば、外部プロセスの実行の結果として、または別のアプリケーションもしくはサードパーティソースからアプリケーションによって受信されるデータによって生成されるものとすることもできる。一実施形態によれば、アプリケーション記述およびアプリケーション記述エンジンは、拡張マークアップ言語(XML)に従って構造化され、かつ/または動作する。フレームワーク内でのアクションまたは他の事象を記述する標準的で単純な手段を提供するために、XMLをアプリケーションフレームワーク内で使用することができるが、アプリケーションフレームワークは、XMLのみの使用に限定されるものではない。
アプリケーション記述エンジンは、必要な機能ごとにアプリケーション記述を解釈し、その後、必要な機能ごとのコンポーネントドメインを構築するのに必要なアプリケーションコンポーネントを取得する。一実施形態によれば、アプリケーション記述エンジンは、アプリケーションに関連して保持されるコンポーネントライブラリからアプリケーションコンポーネントを取得する。例えば、アプリケーション記述エンジンは、文書内でテキストを表示する第1のドメイン、文書内で画像オブジェクトを表示する第2のドメイン、アプリケーションのフォーマッティング機能のための第3のドメインなどを構成することができる。
実施形態によれば、アプリケーションフレームワークは、アプリケーションと、アプリケーションを含むドメインとの実行を管理する実行管理モデルをさらに含む。データイベント、例えば、データテーブル内のデータ項目の削除がアプリケーションの実行中に発生し、このデータイベントが、所与のアプリケーション機能の呼び出しを必要とし、したがって、その機能を使用可能にする特定のコンポーネントドメインの呼び出しを必要とする場合に、シングル処理スレッドが、データ駆動イベントに従ってドメインのコンポーネントを実行するために、アプリケーションによって対象ドメインにディスパッチされる。
シングル処理スレッドが対象ドメインに入ると、そのドメインのコンポーネントが、実行フェーズモデルに従って、そのスレッドによって実行される。第1のフェーズ、すなわち、読み取り/要求フェーズでは、要求されたデータの読み取り、例えば、テーブルオブジェクトから削除される値の読み取りが実行され、その後、必要な変更に関する要求、例えば、上記テーブルオブジェクトからの要求された値の削除が実行される。第2のフェーズ、すなわち、再検証/再構成フェーズ中に、対象ドメインが、要求された変更に従って、アプリケーション記述エンジンによって再検証されるか、または再構成される。すなわち、アプリケーション記述エンジンは、必要な場合に、データの変化に適用可能な新しい構成に従って、ドメインを再構成する。
再構成フェーズ中に、アプリケーション記述エンジンは、ドメインのいくつかのコンポーネントを破棄し、ドメインの新しいコンポーネントを取得し、あるいはドメインを完全に破壊することができる。したがって、所与のドメインは、初期構成と後続の再構成との間の時間と等しい有効期間サイクルを有するコンポーネントの集合であり、この後続の再構成は、その所与のドメインの次の構成がある場合に、その次の構成の有効期間サイクルを開始する。したがって、アプリケーション記述エンジンによって生成される各コンポーネントドメインは、アプリケーションの所与のデータ駆動機能を実行するのに必要なコンポーネントの集合として動作し、ドメインは、ドメインのサービスに関するアプリケーションの必要性によって決定される有効期間を有する。
本発明および本発明の改善は、添付図面、本発明の例示的な実施形態に関する以下の詳細な説明、および特許請求の範囲を参照することによって、より完全に理解することができる。
以下、本発明の実施形態が示されている添付図面を参照しながら、本発明について、より十分に説明する。しかし、本発明は、多数の異なる形で実施することができ、本明細書に示された実施形態に限定されるものと解釈すべきではない。そうではなく、これらの実施形態は、開示を完全なものにし、本発明の範囲を当業者に十分に伝えるために提供されるものである。
上記にて簡潔に説明したように、本発明の実施形態は、所与のソフトウェアアプリケーションのランタイム構造を生成し、ソフトウェアアプリケーションの実行を管理するソフトウェアアプリケーションフレームワークを提供する。所与のソフトウェアアプリケーションのランタイム構造は、そのソフトウェアアプリケーションの1つまたは複数の各機能を実行するのに必要なアプリケーションコンポーネントの1つまたは複数のドメインから構成される。コンポーネントドメインは、ドメインごとに、アプリケーションから受信されるアプリケーション記述に応答して、アプリケーション記述エンジンによって生成される。アプリケーションの実行中に、各コンポーネントドメインは、アプリケーション実行管理のユニットとして動作し、各ドメインは、アプリケーションの各機能を実行するのに利用される。データ変化が、所与のコンポーネントドメインに関連するアプリケーションによって受信されるときに、コンポーネントドメインは、関連するデータに応答する必要性に応じて、アプリケーション記述エンジンによって再構成される。アプリケーションによって受信されるデータ変化またはデータイベントは、ユーザアクションによって、例えば、ユーザインターフェース内の機能ボタン、コントロール、またはデータオブジェクトのユーザ選択に応答して、生成されるものとすることができる。データイベントは、外部変化によって、例えば、外部プロセスの実行の結果として、または別のアプリケーションもしくはサードパーティソースからアプリケーションによって受信されるデータによって生成されるものとすることもできる。したがって、アプリケーションは、そのアプリケーションによって受信され、かつ/または処理されるデータに基づいて編成され、動的に再構成される接続されたコンポーネントの集合またはグラフである。
本発明を実施できる適切なコンピューティングシステム環境100の例を、図1に示す。コンピューティングシステム環境100は、適切なコンピューティング環境の1つの例に過ぎず、本発明の使用または機能の範囲に関して限定されるものと示唆するよう意図するものではない。コンピューティング環境100を、例示的な動作環境100に示されたコンポーネントのいずれかまたはその組合せに関して、何らかの依存性または要件を有するものと解釈すべきでもない。
本発明は、多数の他の汎用または専用コンピューティングシステム環境またはコンピューティングシステム構成と共に動作可能である。本発明と共に使用するのに適切な周知のコンピューティングシステム、コンピューティング環境、および/またはコンピューティング構成の例には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイス、ラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラム可能な家庭用電子製品、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、上記のシステムまたはデバイスのいずれかを含む分散コンピューティング環境などが含まれるが、これらに限定されるものではない。
本発明は、コンピュータによって実行される、プログラムモジュールなどのコンピュータ実行可能命令の一般的なコンテキストにおいて説明することができる。一般に、プログラムモジュールには、特定のタスクを実行するか、または特定の抽象データ型を実装するルーチン、プログラム、コンポーネント、データ構造体などが含まれる。本発明は、通信ネットワークを介して接続されるリモート処理デバイスによってタスクが実行される分散コンピューティング環境において実施することもできる。分散コンピューティング環境では、プログラムモジュールは、メモリ記憶デバイスを含む、ローカルコンピュータ記憶媒体とリモートコンピュータ記憶媒体との両方に配置することができる。
図1Aを参照すると、本発明を実施する例示的なコンピュータシステム100は、コンピュータ110の形態をとる汎用コンピューティングデバイスを含む。コンピュータ110のコンポーネントには、処理ユニット120と、システムメモリ130と、システムメモリ130を含む様々なシステムコンポーネントを処理ユニット120に結合するシステムバス121とが含まれるが、これらに限定されるものではない。システムバス121は、様々なバスアーキテクチャのいずれかを使用する、メモリバスまたはメモリコントローラ、周辺バス、およびローカルバスを含む複数のタイプのバス構造のいずれかとすることができる。例えば、そのようなアーキテクチャには、ISAバス、MCAバス、EISAバス、VESAローカルバス、およびメザニンバスとも呼ばれるPCIバスが含まれるが、これらに限定されるものではない。
コンピュータ110には通常、様々なコンピュータ読み取り可能な媒体が含まれる。コンピュータ読み取り可能な媒体は、コンピュータ110によってアクセスすることができるすべての入手可能な媒体とすることができ、コンピュータ読み取り可能な媒体には、揮発性媒体および不揮発性媒体と、取外し可能な媒体および取外し不可能な媒体とのいずれもが含まれる。例えば、コンピュータ読み取り可能な媒体には、コンピュータ記憶媒体および通信媒体を含めることができるが、これらに限定されるものではない。コンピュータ記憶媒体には、コンピュータ読み取り可能命令、データ構造体、プログラムモジュール、またはその他のデータなどの情報を記憶する任意の方法または技術で実施される、揮発性媒体、不揮発性媒体、取外し可能な媒体、および取外し不可能な媒体が含まれる。コンピュータ記憶媒体には、RAM、ROM、EEPROM、フラッシュメモリ、もしくはその他のメモリ技術、CD−ROM、デジタル多用途ディスク(DVD)、もしくはその他の光ディスク記憶デバイス、磁気カセット、磁気テープ、磁気ディスク記憶デバイス、もしくはその他の磁気記憶デバイス、または所望の情報を記憶するのに使用することができ、かつコンピュータ110によってアクセスすることができるすべての他の媒体が含まれるが、これらに限定されるものではない。通信媒体は通常、搬送波またはその他の搬送機構などに、コンピュータ読み取り可能命令、データ構造体、プログラムモジュール、またはその他のデータなどの変調されたデータ信号を具現化したものであり、通信媒体には、すべての情報配信媒体が含まれる。用語「変調されたデータ信号」は、信号内で情報を符号化する形でその特性の1つまたは複数を設定または変更された信号を意味する。例えば、通信媒体には、有線ネットワークまたは直接配線接続などの有線媒体と、音響、RF、赤外線、およびその他の無線媒体などの無線媒体とが含まれるが、これらに限定されるものではない。上記のいずれの組合せも、コンピュータ読み取り可能な媒体の範囲に含まれるべきである。
システムメモリ130には、ROM131およびRAM132などの揮発性メモリおよび/または不揮発性メモリの形態をとるコンピュータ記憶媒体が含まれる。起動中などにコンピュータ110内の要素間での情報の転送を助ける基本ルーチンを含む基本入出力システム(BIOS)133は通常、ROM131に記憶される。RAM132には通常、XMLアプリケーションフレームワークの下で構成されるか、または実行されるモジュールなどの、処理ユニット120によって直ちにアクセス可能であり、かつ/または処理ユニット120によって現在操作されているデータおよび/またはプログラムモジュールが含まれる。例えば、図1Aには、オペレーティングシステム134、アプリケーションプログラム135、204(図2B)、304(図3)、その他のプログラムモジュール136、およびプログラムデータ137が示されているが、これらに限定されるものではない。XMLアプリケーションフレームワークは、RAM132に記憶されるか、またはRAM132から実行される、すべてのソフトウェアのアプリケーションを構成して、実行するように動作することができる。
コンピュータ110には、その他の取外し可能/取外し不可能な揮発性/不揮発性コンピュータ記憶媒体を含めることもできる。例えば、図1Aには、ハードドライブなどの取外し不可能な不揮発性磁気媒体141に対して読み書きする、取外し不可能な不揮発性メモリインターフェース140を有するコンピュータ110が示されている。コンピュータ110には、磁気ディスクなどの取外し可能な不揮発性媒体152に対して読み書きする、ディスクドライブなどのデバイス151に対して読み書きする不揮発性メモリインターフェース150も含めることができる。さらに、コンピュータ110には、CD−ROMまたはその他の光媒体などの取外し可能な不揮発性光ディスク156に対して読み書きする光ディスクドライブ155も含めることができる。この例示的な動作環境で使用することができるその他の取外し可能/取外し不可能な揮発性/不揮発性コンピュータ記憶媒体には、磁気テープカセット、フラッシュメモリカード、デジタル多用途ディスク、デジタルビデオテープ、ソリッドステートRAM、ソリッドステートROMなどが含まれるが、これらに限定されるものではない。ハードディスクドライブ141は通常、インターフェース140などの取外し不可能なメモリインターフェースを介してシステムバス121に接続され、磁気ディスクドライブ151および光ディスクドライブ155は通常、インターフェース150などの取外し可能なメモリインターフェースを介してシステムバス121に接続される。
上記で説明し、図1Aに図示したドライブおよびそれに関連するコンピュータ記憶媒体は、コンピュータ読み取り可能命令、データ構造体、プログラムモジュール、およびその他のデータの記憶領域をコンピュータ110に提供する。例えば、ハードディスクドライブ141が、オペレーティングシステム144、アプリケーションプログラム145、その他のプログラムモジュール146、およびプログラムデータ147を記憶するものとして示されている。これらは、オペレーティングシステム134、アプリケーションプログラム135、その他のプログラムモジュール136、およびプログラムデータ137と同一であってもよいし、異なるものであってもよい。オペレーティングシステム144、アプリケーションプログラム145、その他のプログラムモジュール146、およびプログラムデータ147には、少なくともこれらが異なるコピーであることを示すために、本明細書では異なる符号が付与されている。ユーザは、キーボード162、および一般にマウス、トラックボール、またはタッチパッドと呼ばれるポインティングデバイス161などのユーザ入力デバイスに接続されたユーザ入力インターフェース160を介してコンピュータ110にコマンドおよび情報を入力することができる。その他の入力デバイス(図示せず)には、マイクロホン、ジョイスティック、ゲームパッド、衛星放送受信用パラボラアンテナ、スキャナなどを含めることができる。上記およびその他の入力デバイスは、システムバス121に結合されたユーザ入力インターフェース160を介して処理ユニット120に接続されることが多いが、パラレルポート、ゲームポート、またはUSBなどの、その他のインターフェースおよびバス構造を介して接続されてもよい。
モニタ191またはその他のタイプのディスプレイデバイスも、ビデオインターフェース190などのインターフェースを介してシステムバス121に接続される。モニタ191の他に、コンピュータ110には、スピーカ194およびプリンタ193などの、出力周辺インターフェース192を介して接続することができる他の出力周辺デバイスも含めることができる。
コンピュータ110は、リモートコンピュータ180などの1つまたは複数のリモートコンピュータへの論理接続を使用して、ネットワーク環境で動作することができる。リモートコンピュータ180は、パーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ピアデバイス、または他の一般的なネットワークノードとすることができ、通常は、コンピュータ110に関して上述した要素の多数またはすべてを含むが、図1Aにはメモリ記憶デバイス181だけが示されている。図1Aに示された論理接続には、ローカルエリアネットワーク(LAN)171およびワイドエリアネットワーク(WAN)173が含まれるが、無線ネットワークなどの他のネットワークを含めることもできる。そのようなネットワーキング環境は、オフィス、企業規模のコンピュータネットワーク、イントラネット、およびインターネットでは一般的である。
LANネットワーキング環境で使用される場合、コンピュータ110は、ネットワークインターフェースまたはネットワークアダプタ170を介してLAN171に接続される。WANネットワーキング環境で使用される場合、コンピュータ110には通常、インターネットなどのWAN173を介した通信を確立するモデム172またはその他の手段が含まれる。モデム172は、内蔵型または外付け型とすることができるが、ユーザ入力インターフェース160またはその他の適切な機構を介してシステムバス121に接続することができる。ネットワーク環境では、コンピュータ110に関して示されたプログラムモジュールまたはそのプログラムモジュールの一部を、リモートメモリ記憶デバイス181に記憶することができる。例えば、リモートアプリケーションプログラム185は、メモリデバイス181に存在するものとして示されているが、これに限定されるものではない。図示されたネットワーク接続は、例示的なものであり、コンピュータ間で通信リンクを確立するその他の手段を使用できることを理解されたい。
理解および例示の目的上、例示的なデータオブジェクトが表示される例示的なアプリケーションユーザインターフェースに関して、本発明の実施形態を説明することが有効である。図1Bに、1つまたは複数の表示されたデータオブジェクトを示す、例示的なワープロアプリケーションによって表示されている例示的なワープロ文書を示すコンピュータスクリーンディスプレイを示す。この例示的なユーザインターフェース195は、通常のソフトウェアアプリケーションユーザインターフェースを示している。ユーザは、この例示的なユーザインターフェース195に対し、関連するソフトウェアアプリケーションの機能に従って、1つまたは複数のデータオブジェクトを入力し、編集し、または他の形で操作することができる。例えば、ユーザインターフェース195は、「ファイル」コントロール(control)、「編集」コントロール、「表示」コントロール、および「その他」コントロールを含む、最上部の1つまたは複数の機能コントロールを有する例示的なワープロアプリケーションを示している。図1Bに示された機能コントロールは、例示のみを目的とし、本発明に適用可能なソフトウェアアプリケーションにおいて使用可能な膨大な数のユーザインターフェースタイプ、レイアウト、および関連する機能に関して限定的ではないことが理解されよう。
ユーザインターフェース195は、ユーザが望むようにユーザインターフェースワークエリア内に含まれるデータを上下にスクロールさせるスクロールバー199を含む。例示的なワープロ文書が、ユーザインターフェース195のワークエリア内に示されている。例示的な文書、例えば、手紙、メモ、レポートなどは、テキストオブジェクト196、埋め込み画像オブジェクト197、および埋め込みテーブルオブジェクト198を含む。図1Bを参照すると、ユーザインターフェース195に表示された文書は、テキストオブジェクト196がページの最上部になり、埋め込み画像オブジェクト197が2つのテキストオブジェクトの間に表示され、テーブルオブジェクト198がページの最下部に部分的に表示されるように、ユーザによってスクロールされたものである。すなわち、テーブルオブジェクト198は、視野に入りつつあるが、ユーザインターフェース195のワークエリア内に完全には表示されていない。
以下で詳細に説明するように、本発明の実施形態によれば、例示的なユーザインターフェース195および例示的なデータオブジェクト196、197、198を表示する役割を担うソフトウェアアプリケーションは、このアプリケーションによって要求される機能を提供するために、論理グループすなわちドメインに一緒にグループ化された関連するコンポーネントの集合またはグラフである。任意の所与のインスタンス(instance)において、アプリケーションには、そのインスタンスにそのアプリケーションの機能を提供するのに必要な関連するコンポーネントの論理グループ(本明細書ではドメインと呼んでいる)から構成されるランタイム構造が含まれる。アプリケーションが実行されるとき、コンポーネントドメインは、そのアプリケーションによって受信されるデータの変化と、データのその変化を処理するためにそのアプリケーションが要求する関連する機能とに基づいて、動的に再構成される。例えば、図1Bを参照すると、ユーザインターフェース195に現在表示されている文書の例示的なランタイム構造には、テキストオブジェクト196を表示して処理するのに必要なアプリケーションコンポーネントを有するテキストドメインが含まれることになる。上記の例示的なランタイム構造には、画像オブジェクト197を表示して処理するのに必要なアプリケーションコンポーネントを有する画像ドメインが含まれることになり、画像オブジェクト197の下に表示される第2のテキストオブジェクトを表示して処理するのに必要なアプリケーションコンポーネントを有する第2のテキストドメインが含まれることになり、入ってくる(incoming)テーブルオブジェクト198を表示するのに必要なアプリケーションコンポーネントを有するテーブルドメインが含まれることになる。当該ランタイム構造に関連するその他のコンポーネントドメインには、スクロールバー199の位置および移動、ユーザインターフェース内の機能コントロールの位置および表示プロパティ、ならびに現在必要な機能を提供するのに必要なアプリケーションの任意の他の態様を含む、他の機能のためのアプリケーションコンポーネントが含まれることになる。
以下で詳細に説明するように、データイベントがアプリケーションによって受信される当該アプリケーションの実行中に、コンポーネントドメインのランタイム構造は、データ駆動イベントに応答して、必要に応じて動的に再検証され、かつ/または再構成される。例えば、ユーザが、削除または他の変更のために画像オブジェクト197を選択する場合、アプリケーションは、このデータの変化をアプリケーション記述エンジンに渡し、アプリケーション記述エンジンは、画像オブジェクト197を表示する役割を担うコンポーネントドメインを動的に再構成する。その結果、そのコンポーネントドメインには、受信されたデータイベント、例えば画像オブジェクト197の削除または他の変更に基づいて、画像オブジェクト197を表示するのに適切なアプリケーションコンポーネントが含まれるようになる。新しい機能がアプリケーションによって要求される場合、例えば、テーブルオブジェクト198などの新しいデータオブジェクトがユーザインターフェース195内で視野に入る場合に、アプリケーションは、入ってくるデータオブジェクトを表示するのに必要な1つまたは複数のアプリケーションコンポーネントから構成される新しいコンポーネントドメインを生成するように、アプリケーション記述エンジンに要求する。
図2Aは、アプリケーションとアプリケーション記述エンジンと1つまたは複数のコンポーネントドメインとの間の相互作用を示す機能図である。本発明の実施形態によれば、アプリケーションの1つまたは複数の機能を実行する、接続されたコンポーネントのグラフとしてアプリケーションを構成するアプリケーションフレームワークが提供される。図2Aを参照すると、アプリケーション204、304は、それぞれのアプリケーションのプログラミングに従って1つまたは複数の有用な機能を提供する任意のソフトウェアアプリケーションを表していて、例えば、ワープロアプリケーション、スプレッドシートアプリケーション、スライドプレゼンテーションアプリケーション、データベースアプリケーション、デスクトップパブリッシングアプリケーション、電子メールおよびカレンダアプリケーションなどを表している。実際、本発明の実施形態は、以下の説明から理解されるように、特定のソフトウェアアプリケーションに限定されるものではない。
本発明の実施形態によれば、アプリケーション204、304は、複数のアプリケーションコンポーネントから構成され、各アプリケーションコンポーネントは、他のコンポーネントと独立に、または他のコンポーネントと関連して所与の機能を提供するために、ソフトウェア開発者によって作成されたものである。例えば、所与のアプリケーションコンポーネントは、関連するアプリケーションの印刷機能を提供するために、アプリケーション204、304に含めることができる。別のアプリケーションコンポーネントは、関連するアプリケーションの特定のフォーマッティング機能を提供するために、アプリケーション204、304に含めることができる。通常、アプリケーション204、304の所与の機能、例えば、フォーマッティング、印刷、編集、データ表示などは、一緒に動作するときに所望の機能を使用可能にして提供するアプリケーションコンポーネントの集合によって使用可能にされる。例えば、上記にて図1Bに示したテキストオブジェクト196または画像オブジェクト197を表示する所与のソフトウェアアプリケーションの機能には、要求された機能を提供するために特定の順序に従って実行されなければならない複数のアプリケーションコンポーネントが含まれる場合がある。上述したように、アプリケーション204、304は、いつでも、ランタイム構造の所与のインスタンスまたは所与の実行中のいずれであれ、接続されたアプリケーションコンポーネントの集合またはグラフである。様々なアプリケーションコンポーネントと、様々なアプリケーションコンポーネント間の相互作用との詳細な説明を、以下で図2B、図3、図4、図5を参照して説明する。
上記にて簡潔に説明したように、任意の所与のときに、アプリケーション204、304は、ランタイム構造を含み、このランタイム構造は、そのときにそのアプリケーションによって要求される接続されたアプリケーションコンポーネントのインスタンス化(instantiation)である。以下で説明するように、アプリケーションの実行中に、アプリケーションコンポーネントのインスタンス化は、そのアプリケーションによって受信されるデータに基づいて、アプリケーションの変更の必要性に応じて、動的に再構成される。アプリケーションコンポーネントの所与のランタイム構造を生成するために、アプリケーション204、304は、必要な各機能のアプリケーション記述をアプリケーション記述318からアプリケーション記述エンジン320に渡す。アプリケーション記述318と、アプリケーション記述エンジンの動作との詳細な説明を以下に示す。例えば、再度図1Bを参照すると、ユーザインターフェース195および関連するデータのランタイム構造のインスタンス化には、ユーザインターフェース195およびそれに関連する機能コントロールと、テキストオブジェクト196と、画像オブジェクト197と、入ってくるテーブルオブジェクト198とを表示するアプリケーションコンポーネント、およびスクロールバー199の現在位置を表示するアプリケーションコンポーネントを必要とする。
アプリケーション204、304は、アプリケーションによって現在要求されている機能のアプリケーション記述を、これらの機能のそれぞれを提供するのに必要なアプリケーションコンポーネントのグループ化を生成して構成するために、アプリケーション構成エンジンまたはアプリケーション記述エンジン320に渡す。本発明の一実施形態によれば、アプリケーションからアプリケーション記述エンジンに渡されるアプリケーション記述は、以下で図2Bおよび図3を参照して説明するように、拡張マークアップ言語(XML)に従って構成されフォーマットされた宣言ルールを含む。アプリケーション記述エンジン320は、アプリケーション204、304から受信された必要な各機能のアプリケーション記述を解釈するための十分なコンピュータ実行可能命令であって、必要な機能をアプリケーション204、304に提供するために、本明細書ではコンポーネントドメインまたはコンカレンシドメイン(concurrency domains)と呼ぶアプリケーションコンポーネントのグループをビルドして構成する、十分なコンピュータ実行可能命令を含むソフトウェアモジュールである。一実施形態によれば、アプリケーション記述エンジン320は、以下で図2B、図3、図4、図5を参照して説明するように、拡張マークアップ言語に従って動作する。アプリケーション記述エンジンの機能および動作は、以下で図3を参照しながら、見出し「アプリケーション記述言語」の下で詳細に説明する。
アプリケーション記述エンジン320が、アプリケーション204、304から、そのアプリケーションが必要とする機能に関連するアプリケーション記述を受信すると、アプリケーション記述エンジンは、記述された各機能、例えば、図1Bに示された画像オブジェクト197の表示を満たすのに必要なアプリケーションコンポーネントに関して、アプリケーション記述を解釈する。アプリケーション記述エンジンが、必要なコンポーネントと、必要なコンポーネント間の関係とを決定すると、アプリケーション記述エンジン320は、必要なコンポーネントインターフェースを含む必要なアプリケーションコンポーネントをコンポーネントライブラリ322から取得する。本発明の実施形態によれば、コンポーネントライブラリ322は、特定のアプリケーション、例えばワープロアプリケーションに関連するアプリケーションコンポーネントの集合またはライブラリとすることもできるし、アプリケーション記述エンジン320が、複数の様々なタイプのアプリケーション、例えば、ワープロアプリケーション、スプレッドシートアプリケーション、スライドプレゼンテーションアプリケーション、データベースアプリケーションなどに機能を提供するためのコンポーネントを取得できるコンポーネントの集合とすることができる。
アプリケーション記述エンジンが、必要なアプリケーションコンポーネント(例えば、ソフトウェアプログラムの個々のモジュール)を取得すると、アプリケーション記述エンジンは、アプリケーション204、304が現在要求している機能の各コンポーネントドメインを作成する。図2Aに示されているように、図1Bに示されたデータに関するアプリケーション204、304の現在のデータ表示の必要性に応答して、アプリケーション記述エンジン320は、テキストオブジェクト196用の第1のコンポーネントドメイン250、画像オブジェクト197用の第2のコンポーネントドメイン255、およびテーブルオブジェクト198用の第3のコンポーネントドメイン260を作成する。すなわち、これらコンポーネントドメインの各々は、アプリケーションが現在必要とする機能を提供するのに必要なアプリケーションコンポーネントを各ドメインが含むように、アプリケーション記述エンジン320によって作成される。例えば、画像ドメイン255は、現在のディスプレイ特性およびプロパティを有する画像オブジェクト197を表示するためにアプリケーション204、304が必要とするアプリケーションコンポーネントを含むように、アプリケーション記述エンジン320によって生成される。図2Aに示されたドメインは、図1Bに示されたデータオブジェクトについて生成され得るドメインを示すが、様々なデータオブジェクトが表示され、様々なユーザインターフェース機能が表示されるか、位置決めされるか、または他の形で構成されるアプリケーション204、304のランタイム構造の任意の他のインスタンスについて、ドメイン250、255、260の異なるセットが、必要に応じてアプリケーション記述エンジン320によって生成されることが理解されよう。
実施形態によれば、各コンポーネントドメインがアプリケーション204、304の実行管理のユニットとして動作する実行管理モデルが提供される。データイベントがアプリケーション204、304によって受信されるとき、以下で図2B、図3、図4、図5を参照して詳細に説明するように、アプリケーション204、304は、1つまたは複数の現在構成されているドメイン250、255、260を動的に再構成するために、または必要に応じて新しいドメインを作成するために、アプリケーション記述318をアプリケーション記述エンジン320に渡す。例えば、再度図1Bを参照すると、文書が上にスクロールされるときには、新しいデータがページの最下部に表示される。新しいデータが表示されるときに、アプリケーション204、304は、新しいデータオブジェクトを表示するために、アプリケーション記述エンジン320にコンポーネントドメインを要求する。例えば、テーブルオブジェクト198がスクロールされて見えるようになる前には、アプリケーション204、304は、図2Aに示されたテーブルオブジェクトドメイン260を必要としない。というのは、現在は、アプリケーション204、304が、テーブルオブジェクト198を表示する機能を必要としないからである。しかし、アプリケーション204、304を動作させるオペレーティングシステム134が、テーブルオブジェクトがスクロールされて見えるようになりつつあることを検出すると、アプリケーション204、304には、オペレーティングシステムによって、テーブルオブジェクト198およびテーブルオブジェクト198に関連するデータが表示されなければならないことが通知される。その通知に応答して、アプリケーション204、304は、上述したように、入ってくるテーブルオブジェクト198に関するアプリケーション記述318をアプリケーション記述エンジン320に渡す。アプリケーション記述エンジン320は、このアプリケーション記述を解釈し、必要なアプリケーションコンポーネントを取得し、テーブルオブジェクトドメイン260を動的に作成する。このテーブルオブジェクトドメイン260には、入ってくるテーブルオブジェクト198を表示するのに必要なアプリケーションコンポーネントが含まれる。
同様に、図1Bに示された文書が上にスクロールされ、その結果、テーブルオブジェクト198がページの最下部から消えるようにスクロールする場合、アプリケーション204、304には、オペレーティングシステムによって、テーブルオブジェクト198の表示がもはや必要でないことが通知される。アプリケーション記述エンジンは、アプリケーション204、304から受信したアプリケーション記述318に応答して、アプリケーション204、304によるテーブルオブジェクト198の表示のために作成されたテーブルオブジェクトドメイン260を破棄する。というのは、テーブルオブジェクトを表示するために以前に必要であったこのコンポーネントドメインは、もはや必要ないからである。したがって、アプリケーション記述エンジンは、実行中のアプリケーション204、304の要件に基づいて、所与のコンポーネントドメインを動的に作成することもできるし、破棄することもできる。
アプリケーション204、304の実行中に、実行管理は、各コンポーネントドメインの動作およびコンポーネント構造を管理することによって達成される。図2Aを参照すると、アプリケーション204、304の実行中に、所与のドメイン250、255、260の機能を呼び出すデータイベントがアプリケーション204、304によって受信されると、アプリケーション204は、それぞれのドメインを介してそのデータイベントを処理する。例えば、ユーザが、テーブルオブジェクト198内のデータ項目を選択し、その後、選択したデータ項目を削除するためにアプリケーション204、304の削除コントロールを選択した場合、選択したデータ項目および選択した削除コントロールに関連するデータイベントが、アプリケーション204、304によって受信される。当業者であれば、データ項目の選択および削除コントロールの選択は、アプリケーション204、304を動作させる役割を担うオペレーティングシステムによって検出され、そのデータイベントについての適切な通知が、アプリケーション204、304に対して行われることが理解されよう。
データイベントに応答して、アプリケーション204、304は、テーブルオブジェクト198に関連するデータイベントを処理する役割を担う適切なドメイン260にシングル処理スレッド275をディスパッチする。本明細書でコンカレンシドメインとも呼ぶ対象ドメインでは、シングル処理スレッド275は、コンポーネントのドメインに入り、一連のフェーズを経てデータイベントを処理する。ドメインのコンポーネントを介したデータ駆動イベントを処理するための対象ドメインへのシングル処理スレッドのディスパッチの詳細な説明については、以下で見出し「コンカレンシドメインを伴うマルチスレッディング」の下で示される説明を参照されたい。
現在の例について、削除コントロールが、選択したデータ項目をテーブルオブジェクト198から削除するために選択されると、シングル処理スレッドが、テーブル項目削除というアクションデータに応答して、ドメイン260にディスパッチされる。この処理スレッドがこのドメインに入ると、第1の処理フェーズ、すなわち、データ読み取り/データ要求フェーズが開始される。例えば、第1のフェーズ中に、データイベントが、コンポーネントドメイン260によって読み取られて、このデータ駆動イベントによって影響が及ぼされることになるテーブルオブジェクト198内のデータ項目またはデータ値が判定される。次に、第1の処理フェーズの一部として、データに対する変更、例えば、選択したデータ項目をテーブルオブジェクト198から削除する要求が、要求される。その要求に応答して、テーブルオブジェクトドメイン内のデータコネクタコンポーネントが、選択したデータ項目をテーブルオブジェクト198から削除する要求をセットアップする。データコネクタコンポーネントを含むアプリケーション204、205のコンポーネントの詳細な説明は、以下で図2B、図3、図4、図5を参照して提供する。データ読み取り/データ要求フェーズが完了すると、処理スレッドは、次の処理フェーズを開始できることを、ディスパッチャオブジェクト(以下で詳細に説明する)に通知する。
次の処理フェーズには、そのデータイベントに対応するコンポーネントドメインに対する変更がアプリケーション記述エンジンによって行われる、再検証/再構成フェーズが含まれる。再検証/再構成フェーズ中には、影響が及ぼされるデータに関連するすべてのデータコネクタコンポーネント、例えば、テーブルオブジェクト198から削除されるデータ項目に関連するデータコネクタコンポーネントに対して、再検証/再構成のために、これらのデータ項目をマークするよう通知される。一実施形態によれば、影響が及ぼされるデータのマーキングは、データ読み取り/データ要求フェーズのサブフェーズ中に行われる。
影響が及ぼされるすべてのデータアイテムがマークされると、再検証/再構成フェーズが進行し、マークされた各データ項目が、必要に応じて処理される。例えば、テーブルオブジェクト198から削除されるべきデータ項目が削除され、すべての関連するドメインコンポーネントが、必要に応じて削除されるか、または追加される。例えば、選択したデータ項目の削除の結果として、影響が及ぼされるドメイン260を構成する1つまたは複数のアプリケーションコンポーネントを除去する必要性が生じる場合、アプリケーション記述エンジンは、データイベントに応答して再検証フェーズ中にアプリケーション記述エンジンに渡されたアプリケーション記述318に応答して、これらのコンポーネントを除去するためにドメインを再構成する。その一方で、新しいアプリケーションコンポーネントが、影響が及ぼされるドメインに必要である場合、アプリケーション記述エンジンは、同様に、影響が及ぼされるドメインへの統合および影響が及ぼされるドメインの再構成のために、新しいアプリケーションコンポーネントを取得する。したがって、影響が及ぼされるコンポーネントドメインは、そのドメインに関連するデータイベントに基づいて、アプリケーションの実行中に動的に再構成される。コンポーネントドメイン250、255、260におけるデータイベントの処理に関して本明細書で説明する実行フェーズモデルの詳細な説明は、以下で見出し「アプリケーションフレームワークフェーズ化モデル」の下で提供する。
上述したように、各コンポーネントドメインは、アプリケーション204、304によるコンポーネントドメインに関する現在の必要性に基づいて、アプリケーション記述エンジン320によって構成される。また、上述したように、アプリケーション204、304の必要性が、データイベント、例えばデータオブジェクトの削除、データオブジェクトの追加、またはデータオブジェクトの変更に応答して変化するときに、必要に応じて、新しいコンポーネントドメインが作成されるか、既存のコンポーネントドメインが再構成される。所与のコンポーネントドメイン内の新しい各コンポーネントは、そのコンポーネントドメイン内の他のコンポーネントと等しい有効期間を有する。というのは、所与のコンポーネントドメインの有効期間は、アプリケーション記述エンジンによるそのドメインのインスタンス化またはアプリケーション記述エンジンによる再構成の際に始まり、そのコンポーネントドメインがアプリケーション記述エンジンによって破棄されるか、またはその後に再構成されるときに終わるからである。したがって、所与のコンポーネントドメインは、そのコンポーネントドメインが特定の構成で存在する時間の間に生存し、そのコンポーネントドメインが後続の再構成の際に終了する、すなわち死ぬ、アプリケーション機能および管理のユニットであり、そのコンポーネントドメインの後続の再構成されたバージョンは、アプリケーション実行管理の目的上、新しいコンポーネントドメインとみなされる。
上記にて、接続されたコンポーネントの集合またはグラフとしてソフトウェアアプリケーションを構成し、1つまたは複数のコンポーネントドメインを介してアプリケーションの構造および実行を管理するアプリケーションフレームワークを説明したので、以下では、所与のアプリケーションを構成するコンポーネントと、コンポーネント間の通信との詳細な説明を、図2B、図3、図4、図5を参照しながら提供する。さらに、図2B、図3、図4、および図5の次の説明は、上述したアプリケーションフレームワークの例示的な実施形態の説明を提供する。このアプリケーションフレームワークは、拡張マークアップ言語(XML)に基づくものである。XMLアプリケーションフレームワーク(XAF)は、上述したように、ソフトウェアアプリケーションを実行して、作成する方法およびシステムを提供する。XAFは、データ変更、データイベント、UIイベント、またはソフトウェアシステム内におけるその他のすべての事象を、標準フォーマットで表す標準言語に基づいて構築される。
例示的な実施形態において、XAFは、XML(拡張マークアップ言語)を使用して、XMLデータとしてデータを表し、XMLアプリケーションとしてアプリケーションを表す。以下の説明において、XMLは、標準言語を表すのに使用される。しかし、当業者であれば、本発明は、XMLを使用することだけに限定されないことが理解されよう。
XAFソフトウェアシステムは、データに焦点を合わせたものであり、データ駆動型であり、強力なデータ変換機能を提供する。このデータ変換機能には、相互に知らないソースからの異種データとの相互作用が含まれるが、これに限定されるものではない。XAFのすべての部分を、アプリケーションの挙動およびアプリケーションのユーザインターフェースを含めて、データを対象とするイベントまたはデータを伴うイベントとして説明することができる。XAFは、アプリケーションがデータ作成側であり、データが作成物であるというパラダイムを放棄する。そうではなく、XAFは、データに基づいてアプリケーションをビルドする。本発明の実施形態では、XAFアプリケーションコンポーネントは、データがどのように表示され、データが何であり、データがどのように記憶されるかに基づいて、実際にインスタンス化され相互接続される。したがって、XAFは、特定のデータを正しい形で処理するために、ランタイムに「正しい」コンポーネントを作成して、結合することができる。
アプリケーションをビルドする際、XAFにより、アプリケーション「作成者」は、データ型およびユーザインターフェース(UI)に基づいて、コンポーネントをどのように作成して、接続するかに関するルールを提供することができる。これらのルールおよびコンポーネントは、XMLで記述することができる。XMLは、現在のコンテキストに高感度である、リッチかつ構成可能なUIを可能にし、ソフトウェア開発者が構成的手法でアプリケーションをビルドすることを可能にする。ソフトウェア作成者は、ハードコーディングされたアプリケーションロジックの必要性を減らす宣言モデルにおいてエンドツーエンドに特徴またはアプリケーションをビルドすることができる。例えば、ソフトウェア作成者は、単純に、あるUIコネクタが、あるUIおよびあるアクションと組になることを宣言する。次に、XAFが、そのUIコネクタを、そのUIおよびそのアクションと一緒に接続する。
さらに、XMLアプリケーションフレームワークは、予めビルドされたコンポーネント、アプリケーション特徴、および例示的なアプリケーションのリッチライブラリ(rich library)を提供する。一部の命令コードがまだ必要ではあるが、XAFは、コンポーネントをライブラリに配置する。このライブラリにより、その他のソフトウェア作成者は、宣言モデルにおいて、これらのコンポーネントを使用または利用することができる。したがって、ソフトウェア開発者は、コンポーネントの新しい命令コードを生成することによって、ソフトウェア開発者自身のコンポーネントを作成することができるが、ソフトウェア作成者は、新しい命令コードを生成することなく、予めビルドされたコンポーネントを使用して、新しいアプリケーションまたは変更されたアプリケーションを構成することもできる。
例示的なXMLアプリケーションフレームワーク202を、図2Bに示す。XAF202は、アプリケーション204などのアプリケーションを構成し、その実行を管理するように動作する。XAF202内で実行されるアプリケーション204は、1つまたは複数のUIコネクタ206、1つまたは複数のアクション208、および1つまたは複数のデータコネクタ210を含む。いくつかの実施形態では、アプリケーション204は、1つまたは複数のアクセッサ212、あるいは1つまたは複数のトランスフォーマ214および/または216も含む。アプリケーション204内のコンポーネントは、UIイベントをデータ変化に変換し、データ変化をUIイベントに変換するように動作する。したがって、UIコネクタ206は、1つまたは複数のUI218および/または220に結合される。さらに、データコネクタ210は、1つまたは複数のデータストア222および/または224に結合される。XAF202内では、アプリケーション204におけるデータイベントまたはデータ表現は標準フォーマットである。例えば、データイベントおよびデータ表現はXMLである。
UIコネクタ206は、アプリケーション204と、1つまたは複数のUI218および/または220との間の接続をもたらす。一実施形態において、UI218および/または220は、情報をユーザに表示するグラフィカルユーザインターフェース(GUI)である。UIコネクタ206は、アプリケーションユーザがXAF202内でデータを編集する機能を提供し、サポートする。UIコネクタ206は、(データコネクタ210と、データストア222および/または224とによって表される)XAFデータレイヤと、特定のUI218および/または220との間でデータをマッピングする。さらに、UIコネクタ206は、UI218および/または220からのUIイベントを、データストア222および/または224内のデータ編集動作にマッピングする。
UIコネクタ206は、UI218および/または220内のUI要素のタイプに固有である。したがって、UI218および/または220内のデータ項目のUI表現ごとに、対応するUIコネクタ206が存在する。一例では、UI218および/または220内に表示される、スプレッドシート内のセル値などのデータ要素は、そのデータ要素に結合された特定のUIコネクタ206を有し、このUIコネクタ206は、そのデータ要素に対するユーザ変更をUIイベントに変換して、XAFデータに対するアクション208に接続する。したがって、UIコネクタ206は、特定のUIイベントをXAFアクション208に変換し、このXAFアクション208は、包括的にXAFアプリケーション204内で表される。一実施形態においては、アプリケーション204内のすべてのデータ変化が、XMLデータ変化として表される。別の例では、ユーザが、スクロールバーなどのユーザインターフェースコントロールを操作することができる。スクロールバーの変化により、UI218および/または220の状態変化が生成される。UI状態変化も、データ変化として表すことができる。したがって、UIコネクタ206は、スクロールバー操作などのUIイベントを受信し、そのUIイベントをXAFデータレイヤのXMLデータ変化イベントに変換することができる。
UIコネクタ206は、UIイベントをアクション208に接続する。アクション208は、XAFデータレイヤ内のデータ変化に関する宣言ステートメントである。例えば、スクロールバーのユーザ操作により、「スクロールバー上でのクリック」イベントが生成される。UIコネクタ206は、このUIイベントを、「スクロールバーを下に1ポジション分だけ増分する」といったアクション208に接続する。一実施形態において、データ変化アクションは、XMLで表される。例えば、あるデータ変化が、以下のXMLステートメントとして現れる場合がある:
<Dropdown data = $taskpanelist>
<copy Deltaaction perform = "on selected change"
data = "selected value"
target = "current taskPane" />
データコネクタ210は、外部データストア222および/または224との間でデータをマーシャリングする(marshal)。UIコネクタ206と同様に、データコネクタ210は、内部XAFデータ表現と、異なるデータストア222および/または224内の外部データ型との間で変換する。したがって、外部データの型ごとにデータ固有のデータコネクタ210が存在する。データコネクタ210は、アクション208を受信し、標準フォーマットのXAFデータアクション208を、データストア222および/または224内のデータに影響を及ぼすデータ固有アクションに変換する。一実施形態において、データコネクタ210は、XMLデータアクションをデータ固有アクションに変換する。例えば、標準フォーマットXMLステートメントによって表されるスクロールバー操作は、インターフェース状態固有データ変化に変換され、特定のインターフェース状態データを記憶するデータストア222または224に送信される。
さらに、データコネクタ210は、データストア222および/または224内の変化を標準フォーマットXAFデータ表現に変換し、この標準フォーマットXAFデータ表現がUIコネクタ206に送信される。UIコネクタ206は、標準フォーマットXAFデータ表現をUIイベントに変換し、このUIイベントがUI218および/または220に送信される。したがって、UI218および/または220内のすべての変化について、UIコネクタ206は、ユーザインターフェースイベントをアクション208に接続する。このアクション208は、データコネクタ210に送信され、データコネクタ210は、アクション208をデータストア222および/または224内のデータ固有変化に変換する。データが変更されると、データコネクタ210は、データストア222および/または224内の変更されたデータを標準フォーマットXAFデータ表現に変換する。データコネクタ210は、このXAFデータ表現をUIコネクタ206に返信し、UIコネクタ206は、このXAFデータ表現をUI固有ディスプレイイベントに変換する。UIコネクタ206は、表示のために、このUI固有ディスプレイイベントをUI218および/または220に送信し、UI218および/または220は、UIイベントから生成された変更されたデータを表示する。
アプリケーション204は、アプリケーション204内で発生するすべてのアクションについて、データとUIイベントとの間のこれらのサイクルする変化の処理を継続することができる。いくつかの実施形態においては、データストア222および/または224でのデータの変化も、ユーザの制御外にある別の動作から強制される変更されたデータなど、ユーザイベントの発生なしでUI218および/または220内の変化を強制する。
アプリケーション204内のいくつかのオプションのコンポーネントには、アクセッサ212と、トランスフォーマ214および/または216とが含まれる。アクセッサ212は、アクション208とデータコネクタ210との間で調節する。あるデータストア222および/または224内のある型のデータにアクセスするために、アクション208は、そのデータについて使用されるアクセッサ212または「アクセスモデル」を指定することができる。アクセッサ212は、アプリケーション204が、JPEG、MPEGなど、同種でない特定のデータの型にアクセスすることを可能にする。したがって、データストア222および/または224内のデータの型にかかわらず、アプリケーション204は、そのデータとインターフェースをとり、そのデータを変更する。アクセッサ212は、データコネクタ210が、まだ考案も開発もされていないデータ型を含む任意のデータ型を管理することを確実にする。アクセッサ212は、標準フォーマットアクションを、標準フォーマットであり、かつデータ用にカスタマイズされたアクションに変換する。
他の実施形態では、1つまたは複数のトランスフォーマ214および/または216が、データコネクタ210とUIコネクタ206との間で調節する。トランスフォーマ214および/または216は、表示のために、データコネクタ210から出力されるデータを、UIコネクタ206が必要とするUI用にカスタマイズされたフォーマットに変更する。例えば、UIコネクタ206が、データをリストとして必要とする場合、トランスフォーマ214および/または216は、1つまたは複数の単純な変更を介して、表形式データをデータのリストに変更することができる。この単純な各変更は、単一のトランスフォーマ214および/または216によって実行される。したがって、データコネクタ210によって出力される任意の形のデータは、1つまたは複数のカノニカルな(canonical)トランスフォーマ214および/または216を介して、UIコネクタ206によって受入れ可能であり、かつ使用可能である形に変換することができる。トランスフォーマ214、216などのトランザクション変換のオペレーションに関する詳細な説明については、以下の見出し「トランザクション変換」の下の説明を参照されたい。
本発明の実施形態に従う他のタイプの変換を利用することができる。例えば、関数変換(functional transform)を、XQueryなどの関数言語(functional language)を使用して記述することができる。プロキシ変換は、位置のリストの形をとり、これらの位置で見つかるデータをエイリアス化されたデータのシーケンスの形でプロキシする。ソルバ変換は、専用ソルバ技術を具現化し、効率性のため、キャッシングをサポートする。例えば、あるソルバ変換は、代数方程式系を数値的に解き、別のソルバは、これら代数方程式系を記号的に解く。キャッシングおよびインデクシング変換は、データレベルでのパススルー(pass-through)変換であり(すなわち、出力データは入力データと等しい)、キャッシングおよびインデックス変換は、ダウンストリームのインデクシングされたアクセスを加速するために、指定された次元でキャッシングおよびインデクシングを追加する。
本発明の実施形態によれば、アプリケーションフレームワークは、本明細書で説明する、アプリケーションのコンポーネント間で共通インターフェースを使用する。このフレームワークは、本明細書で説明する様々なコンポーネント間のデータ通信に依存するので、XMLなどの均一なデータ構造体、およびコンポーネント間の共通インターフェースは、アプリケーションの構成および管理のために、効率的なデータ交換を可能にする。
次に図3を参照すると、本発明の実施形態では、XAF300は、図3に示されているように、複数のアプリケーション302および/または304を含む。より大きいアプリケーション302には、サブモジュールまたはサブコンポーネントとして機能する1つまたは複数のアプリケーション306および/または308を含めることができる。すべてのアプリケーション302および/または304は、より大きいアプリケーションであれサブコンポーネントであれ、UIコネクタ206などのUIコネクタと、アクション208などのアクションと、データコネクタ210などのデータコネクタとを有する。したがって、アプリケーション306および/または308は、あるデータ要素314および/または316と、あるUI要素310および/または312との間で動作するソフトウェアモジュールである。アプリケーション302および/または304は、複数の他のアプリケーション302および/または304と共に動作できるという点でマルチスレッド式とすることができる。さらに、以下で詳細に説明するように、アプリケーション302および/または304、あるいはアプリケーションコンポーネント306および/または308を、あるフェーズまたはドメインに制約することができる。
本発明の実施形態では、XAF300は、XMLアプリケーション記述(XAD)318およびXMLアプリケーション記述(XAD)エンジン320を含む。XAD318は、アプリケーション304など、XAF300内に含まれるすべてのアプリケーションの宣言ルールおよび記述を含む。ソフトウェア作成者は、そのソフトウェア作成者が望むアプリケーションのXAD318を作成する。XAD318は、あるソフトウェアコンポーネントをプルする(pull)かインスタンス化してこれらのコンポーネントを一緒にバインドするための、スキーマおよびタグを含む。本発明の実施形態では、スキーマおよびタグは、コンポーネント群がどのように相互作用するかに関する。コンポーネントは、UIコネクタ、アクション、アクセッサ、データコネクタ、トランスフォーマ、またはその他のソフトウェアコンポーネントとすることができる。いくつかの実施形態では、コンポーネントは、命令コードを用いて記述され、ポイント別の(point-wise)機能をアプリケーションに提供する。したがって、コンポーネントは、UIコネクタ、アクション、データコネクタなど、XAFコンポーネントにオペラビリティを提供する、基礎になるソフトウェアとすることができる。
アプリケーション記述318は、他のフォーマットを使用して表現することができるが、一実施形態では、XAD318はXMLで表現される。タグはXMLタグである。スキーマおよびタグは、ルールを宣言するための構文的かつ意味論的(syntactic and semantic)フレームワークを提供する。XADは、アプリケーション作成者がアプリケーション全体のリソースおよびコマンドを宣言することを可能にする。コマンドは、マウスクリック、キーボード選択、音声コマンドなどのイベントに基づいて実行されるコードの一部分である。実施形態では、ユーザが、ユーザインターフェース内でイベントを作成するが、他の実施形態では、何らかのプロセスによる別のアクションが、イベントを作成することもある。コマンドは、図17と関連させて以下で説明するように、例えば、選択範囲変更アクション、ビュー編集アクション、データ取り出しアクション、および入力編集アクションなど、名前付きアクションの形とすることができる。これらの名前付きアクションは、例示のためのものであり、本発明の実施形態に適用可能なコマンドおよび/または名前付きアクションに関して限定的なものではない。
XAD318は、XADエンジン320によって解析される。最初に、XADエンジン320は、アプリケーションが起動されるときにXAD318を解析する。その後、XADエンジン320は、必要なときにXAD318を解析する。例えば、一実施形態によれば、XAD318は、プラグインコンポーネントをインスタンス化し、接続するときなど、アプリケーションを再構成するために、XADエンジン320によってランタイムに解析される。別の実施形態によれば、XADがコンパイル時に解析され、トークンのシーケンスに変換され、このシーケンスがランタイムにXADエンジンによって解釈される、コンパイルモデルが提供される。コンパイルしないときには、XADがメモリにロードされるときに、テキスト解析が実行され、データ構造体として記憶される。
XADエンジン320は、ルールを処理し、リソースを識別し、コンポーネントをインスタンス化し、コンポーネント、コンポジット(composite)、およびコマンドを接続する。コンポーネントおよびリソースは、C#で記述された実行可能コードなどの命令コードとすることができる。命令コードは、UIコネクタ、アクション、データコネクタ、およびその他のXAFコンポーネントの基礎となる実際のソフトウェアコンポーネントおよびソフトウェアクラスを特徴付ける。コンポーネントは、コンポーネントライブラリ322などのコンポーネントライブラリからプルされる。コンポーネントライブラリ322は、XAF300内のすべてのアプリケーションにおいて使用されるすべてのコンポーネントを保持する。
コンポーネントライブラリ322内のコンポーネントの集合全体が、どのアプリケーションからも使用可能である。したがって、XAF300は、アプリケーションコンポーネントと、これらのコンポーネントを作成するコードとの豊富な共有を可能にする。さらに、ソフトウェア開発者が新しいコンポーネントを作成でき、その新しいコンポーネントをコンポーネントライブラリ322に記憶できるので、XAFは非常に拡張可能である。XADエンジン320は、XAD318内でソフトウェア作成者が作成する新しいルールを読み取ることによって、新しいコンポーネントを呼び出し、インスタンス化し、接続することができる。新しいルールおよび新しいコンポーネントは、新しいXAFコンポーネント、新しいデータ型、新しいデータストア、新しいUI、あるいは新しいアプリケーションさえも形成することができる。XADおよびXADエンジンについては、以下でさらに詳細に説明する。
ユーザイベントを実行する方法400の実施形態を、図4に示す。この実施形態では、ユーザイベント動作402がまず発生する。しかし、当業者であれば、方法400を使用して、ユーザイベントに対応しないデータ変化を実行できることが理解されよう。説明したように、アプリケーションによって受信されるデータ変化またはデータイベントは、ユーザアクションによって、例えばユーザインターフェース内の機能ボタン、機能コントロール、またはデータオブジェクトのユーザ選択に応答して、生成されるものとすることができる。データイベントは、外部変化によって、例えば、外部プロセスの実行の結果として、または別のアプリケーションもしくはサードパーティソースからアプリケーションによって受信されるデータによって生成されるものとすることもできる。さらに、図2Bと関連させて上述したように、ユーザイベントは、UI218などのUI内でユーザが実行する任意の変化または対話とすることができる。接続動作404において、UIコネクタ206などのUIコネクタにてユーザイベントを受信し、そのユーザイベントを、アクション208などの対応するアクションに接続する。
提供動作406において、アクションにおいて表されるデータ変更の標準フォーマットアクションが提供される。一実施形態では、XMLステートメントが、データ変更に関するアクションを表す。一実施形態では、オプションの支援動作408において、アクションをアクセッサ212などのアクセッサに接続して、変更される特定のデータに関するアクションを構成するのを支援する。アクセッサは、データ固有アクションをデータコネクタ210などのデータコネクタに送信する。変換動作410において、データ固有アクションを受信し、XMLステートメントとすることができるこの標準フォーマットアクションを、データストア222などの特定のデータストア用のコードおよびデータ固有動作に変換する。
データ変更は、データストア内で行われる。次に、データコネクタが、変更されたデータをデータストアから読み取る。変更されたデータは、XMLデータ表現などの標準フォーマットデータ表現に変換される。オプションで、その後、標準フォーマットデータ表現が、トランスフォーマ214などのトランスフォーマに送信される。オプションの変更動作412において、トランスフォーマが受信したデータレコードをUI固有データステートメントに変更する。例えば、データ変化が、そのデータをソートされたリストとして表示することを必要とする場合がある。1つまたは複数のトランスフォーマは、取り出されたデータをソートし、そのデータをソートされたリストとして提示させる最終的なデータステートメントを作成することができる。次に、トランスフォーマは、変更され変換されたデータをUIコネクタ206などのUIコネクタに提供する。
次に、接続動作414において、変更されたデータを受信し、UIコンポーネントに接続して、変更されたデータを表示し、提供する。したがって、その時には、UIは、変更されたデータのビューを提供する。一実施形態において、データ変化は、ユーザインターフェース状態とすることができ、変更されたデータの表示は、変更されたユーザインターフェースの表示である。ユーザイベント動作402に戻って継続するフローによって表されるように、イベントを受信し、データの変化に影響を及ぼし、変更されたデータを表示するというプロセス400は、反復的であり、ユーザイベントごと、またはデータ変化ごとに繰り返して実現することができる。データ変化またはデータイベントが、アプリケーションの再構成を引き起こすか、または必要とする場合、図5と関連させて以下で説明するように、新しいコンポーネントを作成し、接続し、かつ/または再構成することができる。
アプリケーションを作成して構成する方法500の実施形態を、図5に示す。起動動作502において、アプリケーション204などのアプリケーションを起動する。一実施形態では、ユーザが、アプリケーションアイコンをクリックすることによるなどして、ユーザイベントを介してアプリケーションを起動する。解析動作504において、XAD318などのXADを解析する。一実施形態において、この解析は、XAD内のスキーマおよび/またはルールを識別して、処理する。
識別動作506において、アプリケーションに必要なリソースおよび/またはコンポーネントを識別する。一実施形態において、コンポーネントおよびリソースは、コンポーネントライブラリ322などのコンポーネントライブラリ内で見つけられる。インスタンス化動作508において、コンポーネントをインスタンス化する。一実施形態では、XADエンジン320などのXADエンジン内のヘルパコード(helper code)が、コンポーネントライブラリ内で識別されたコンポーネントを形式的にインスタンス化する。さらなる実施形態では、一時的なクリエータコンポーネント(creator components)のセットが、インスタンス化される。次に、クリエータコンポーネントが、入力データと、XAD内のタグに関連するルールとに関して、処理コンポーネントをインスタンス化する。
接続動作510において、インスタンス化されたコンポーネントを接続する。一実施形態では、XADエンジンが、使用されるデータまたは処理されるユーザイベントに従ってコンポーネントを接続する。アプリケーションコンポーネントがインスタンス化されて接続されると、待機動作512において、ユーザイベントを待つ。したがって、XADエンジンは、アプリケーションとの受動的プレゼンス(passive presence)を維持する。XADエンジンは、データ変化を継続的に監視し、データコネクタ210などのデータコネクタによって提供されるデータの変化に応答する。データが変化するときに、判定動作514において、データ変化が、プラグインコンポーネントの挿入など、アプリケーションの再構成を必要とするかどうかを判定する。再構成が必要である場合、フローは、Yesから解析動作504に継続する。再構成が不要である場合、フローは、Noから待機動作512に継続する。
本明細書で説明するように、所与のソフトウェアアプリケーションのランタイム構造を生成し、ソフトウェアアプリケーションの実行を管理するアプリケーションフレームワークが提供される。次の記載は、トランザクション変換の動作および機能と、フェーズモデリングおよびスレッディングを介したコンポーネントドメイン処理と、アプリケーションコンポーネントの生成および再構成に関するアプリケーション記述エンジンの動作とを含む、上述した本発明の実施形態の様々な態様の詳細な説明である。
(トランザクション変換)
上述したように、1つまたは複数のデータストアが、1つまたは複数のコネクタを介してデータを受信して記憶するために設けられる。本発明の実施形態によれば、データは、1つまたは複数の「トランザクション変換」の使用により、データストアから選択的に分離することができる。図6に、データレイヤの編成を示し、データレイヤと、データストアおよびデータクライアントを含むその他のコンポーネントとの間の接続を示す。トランザクション変換614は、バッファリングモジュール616および制御モジュール618を含む。バッファリングモジュール616は、分離されたデータと、そのデータに関するステータス情報とを記憶する。制御モジュール618は、失敗したコミットがデータ消失をもたらさないように、バッファリングモジュール616と共に2フェーズコミットプロトコルを使用する。バッファリングモジュール616および制御モジュール618については、以下でより詳細に説明する。
データストア602および604は、データベースサーバ上のデータまたはコンピュータ読み取り可能な媒体上のデータを含む。データは、上述したように、データストアから読み取り、データストアに書き込むことができる。所与のデータストアに接続されたエージェントにより、チェックまたは何らかのその他の要求を送信して、データストアへのデータの書き込みが可能であるかどうかを調べることができる。データの書き込みが可能である場合、肯定指示がエージェントに戻して渡される。同様に、データの書き込みが不可能であるか、または可能であるかがわからない場合、否定指示がエージェントに戻して渡される。
データコネクタ606および608は、データ変換610、612、および614をデータストア602および604に接続する。一実施形態では、1つまたは複数のタイプのデータストアを扱うために、プロトコルがデータコネクタ606および608内で実装される。各プロトコルは、特定のフォーマットを使用してエンコードされたデータベースファイルなどの、1つまたは複数のタイプのデータストアを扱う。データコネクタプロトコルは、データクライアント622および624から受信したデータ変更またはデータ変化をアトミックにコミットする。図2Bを参照して上述したUIコネクタ206が、データクライアント622、624の例である。
一実施形態において、データコネクタ606および608は、ペシミスティックコンカレンシ(pessimistic concurrency)によってアトミシティ(atomicity)を実現する。ペシミスティックコンカレンシは、クライアントが他のクライアントに影響を及ぼすようにデータを変更するのを防ぐために、データストアにてデータ(例えば、1つまたは複数のレコード)のサブセットをロックすることを含む。ペシミスティックコンカレンシモデルでは、クライアントが、ロックの適用を引き起こすアクションを実行するときに、他のクライアントは、ロックを所有するクライアントがそのロックを解放するまで、ロックを競合するアクションを実行することができない。データに関する激しい競合があり得る環境、および/または、ロックを用いてデータを保護するコストが、コンカレンシ競合が発生する場合にトランザクションをロールバックするコストより低い環境において、このモデルは有用である。ペシミスティックコンカレンシは、レコードのプログラム的処理など、ロック時間が短くなるときに、最もよく使用される。
別の実施形態において、データコネクタ606および608は、補償アクション(compnesation action)と共にオプティミスティックコンカレンシ(optimistic concurrency)を使用してアトミシティを実現する。オプティミスティックコンカレンシは、ロックを利用しない。第1のクライアントがレコードを更新する必要があるときに、このプロトコルは、別のクライアントが、第1のクライアントによる最後の読み取り以降にそのレコードを変更したかどうかを判定する。オプティミスティックコンカレンシは、データ競合がほとんどない環境において有用である。補償アクションは、トランザクションの影響を補償するアクションである。例えば、口座Aから口座Bへの資金の銀行転送に関する補償効果は、口座Bから口座Aに戻す同一金額の資金の転送である。同様に、ホテルルームの予約の補償アクションは、予約の取り消しになる。補償アクションは、トランザクションを「ロールバック」すること、または後に残る副作用も他の否定的な結果もなしに取り消すことを可能にする。補償アクションは、2つのクライアント間で競合が生じる(例えば、第1のクライアントがデータ値を読み取り、その後、第2のクライアントが、第1のクライアントがその値の変更を試みる前にそのデータ値を変更する)ときに、トランザクションをロールバックするのに使用することができる。一実施形態において、データコネクタ606および608は、それぞれデータストア602および604からのデータをキャッシュする。データクライアントによって要求されたデータが、データコネクタによってキャッシュされている場合、要求されたデータについて対応するデータストアに照会する必要はない。データコネクタについては、以下でより詳細に説明する。
データ変換610、612、614、および620は、予め定義されたルールに従ってデータをエンコードし、かつ/またはデコードする。データ変換610、612、614、および620は、任意に複雑な処理を実行できる機能を実施する。データ変換612および620は、互いに直列である。このため、データ変換612によって実施される機能の結果は、データ変換620によって実施される機能への入力として使用され、逆も同様である。一実施形態において、データ変換を直列に接続して、前の変換の結果をバッファリングすることができ、複雑な機能をより簡単にモジュール式として実施することが可能になる。同様に、ビュー内のデータのサブセットを、そのビュー内の残りのデータに影響を及ぼすことなくコミットするか、またはリフレッシュすることができる(以下を参照されたい)。
データ変換614は、トランザクション変換として知られる特別な種類のデータ変換であり、バッファリングモジュール616および制御モジュール618を含む。一実施形態において、トランザクション変換は、データがデータストア間で一貫するように、分離されたデータをアトミックにコミットすることを可能にする。バッファリングモジュール616は、データクライアント622および624からの分離されたデータを保持する。一例では、データクライアント622および624は、データストア604内のデータを編集するダイアログボックスである。データに対して行われる編集を、実質的に編集が行われるときにバッファリングモジュール616に記憶することができる。別の実施形態では、トランザクション変換は、そのトランザクション変換の出力に対する編集要求を、そのトランザクション変換の入力に対する編集要求に戻ってマッピングする。その結果、編集が行われるときに、入力/要求するエンティティは、そのような編集を完了したものとして認識する。さらに、これらのトランザクション変換は、そのバッファリングモジュール616を使用して、以下で説明するように、そのような編集における遅延され、かつ制御されたマッピングを可能にする。
複数のタイプの制御動作を、トランザクション変換によって実行することができる。ユーザが、データクライアント622またはデータクライアント624内のデータをコミットすることを望むとき(例えば、データクライアントに関連付けられた「適用」ボタンがアクティブ化されるとき)に、制御モジュール618は、そのデータクライアントからコミット制御動作を受信し、図6を参照して以下で説明する2フェーズコンカレンシプロトコルを使用して、そのデータをコミットすることを試みる。一実施形態において、バッファリングモジュール616にバッファリングされたデータは、成功してコミットされると削除することができる。ユーザが、バッファ内のデータ(したがって、対応するデータクライアントに表示されるデータ)をリフレッシュすることを望むときに、制御モジュール618は、そのデータクライアントからリフレッシュ制御動作を受信し、バッファリングモジュール616内のデータをリフレッシュする。リフレッシュされたデータは、そのデータクライアントに伝送され、その結果、ユーザは、更新されたデータにアクセスできるようになる。分離されたデータをリフレッシュする機能は、以下で図6を参照して説明するように、従来の2フェーズコンカレンシモデルにおけるコミットの中止の代わりに使用することができる。
状況によっては、1人または複数人のユーザが1つまたは複数のデータクライアントを使用して行ったコミットされていない変更を無効にすることなく、バッファ内のデータを更新することが有効である。そのような場合に、同期化制御動作を、データクライアントによって発行することができる。制御モジュール618が、同期化制御動作をデータクライアントから受信するときに、バッファリングモジュール616内の分離されたデータは、(1つまたは複数の)データストア内の最新バージョンに基づいて更新され、分離されたデータに対するコミットされていない変更は、更新されたデータにマージされる。データに対する変更の複数セットの同期化プロセスは、当技術分野では十分に理解されており、同期化は、様々な状況で使用することができる。所与のコンテキストにおいて同期化をどのように実施できるかについての詳細は、そのコンテキストに非常に固有である。例えば、製品データベースのコンテキストでは、製品の一系列をデータベースにマージすることが許容できる可能性があるが、製品名に対する変更の2つのバージョンをマージすることは許容可能でない可能性がある。その他のコンテキストは、同期化に関するその他のルールを有する可能性があり、そのすべてを、本発明と共に使用することができる。競合の解決法も周知である。競合する場合にどの更新が基準にならなければならないかに関して、予め定められたルールを提供し、そのルールに従わせることができる。他の実施形態では、そのような競合を解決するために、ユーザ(ら)に警告することができる。
バッファリングモジュール616は、現在進行中の動作のタイプに基づいて変わり得るステータス情報を保持する。例えば、コミットが進行中である場合、ステータス情報には、コミットが保留中であるか、成功したか、または失敗したかのうちのどれであるかを含めることができる。また、リフレッシュが進行中である場合、ステータス情報には、リフレッシュが保留中であるか、または完了したかのどちらであるかを含めることができる。同期化動作が進行中である場合、ステータス情報には、同期化が保留中であるか、成功したか、または失敗したかのうちのどれであるかを含めることができる。特定の制御動作については、以下でより詳細に説明する。
データクライアントからアクセス可能な何らかのデータには、分離を必要としない場合がある。例えば、金融データベース(銀行口座の追跡に使用されるものなど)に対する変更は通常、即座にコミットされる。一実施形態では、所与のデータビューに、分離されたデータと分離されないデータとの両方を含めることができる。別の実施形態では、所与のデータクライアントに、そのデータクライアント内では編集できない読み取り専用データを含めることができる。
アプリケーション開発者からのアプリケーション仕様の受信に応答して、本発明の実施形態は、アプリケーションのどの部分が分離されたデータを必要とするかを識別し、必要に応じてトランザクション変換を実施する。図7に、トランザクション変換動作の動作フローを示す。受信動作702において、アプリケーション仕様を受信する。一実施形態において、アプリケーション仕様は、どのデータを分離しなければならないかを含めてXAFアプリケーションを識別し、識別動作704において、そのアプリケーション内の、分離されるべき対応するデータエンティティを識別してマークする。
実施動作706において、分離されるべきデータエンティティとしてマークされた各データエンティティに対応する1つまたは複数のトランザクション変換を実施する。その後、トランザクション変換は、データ変換と実質的に同一の方法で接続され、アクティブ化される。
図8に、トランザクション変換動作に従って実行される制御動作を示す。受信動作802において、データクライアントから制御動作要求を受信する。一実施形態において、この要求は、データクライアントに関連付けられたUIコントロールをユーザがクリックすることによってトリガされる。判定動作804において、制御動作要求がコミット動作を要求しているかどうかを判定する。制御動作要求がコミット動作に関するものである場合、フローは、YESから発行動作908(図9)に分岐する。制御動作要求がコミット動作に関するものではない場合、フローは、NOから判定動作806に分岐する。
判定動作806において、制御動作要求が同期化動作を要求しているかどうかを判定する。制御動作要求が同期化動作に関するものである場合、フローは、YESから保存動作808に分岐する。制御動作要求が同期化動作に関するものではない場合、フローは、NOからリフレッシュ動作810に分岐する。
同期化動作が要求された場合、保存動作808において、すべてのコミットされていない変更を、バッファリングされたデータに保存する。コミットされていない変更は、コンピュータ読み取り可能な媒体上のファイル、揮発性メモリもしくは不揮発性メモリ、または他の形態のコンピュータ記憶デバイスに保存することができ、あるいは、外部データベースまたは類似するサービスにコミットすることができる。その後、フローは、リフレッシュ動作810に進む。
リフレッシュ動作810において、データストアに存在するバッファリングされたデータの最新のコピーを取り出し、そのコピーをトランザクション変換に関連付けられたバッファに配置する。リフレッシュ動作810では、どのデータストアがデータの最新のコピーを含むかを判定するために、複数のデータストアに照会する必要がある場合がある。別の実施形態では、リフレッシュ動作810において、その代わりに、またはそれに加えて、データコネクタがバッファリングされたデータのキャッシュされたコピーを含むかどうかを調べるために、各データストアに関連付けられたデータコネクタをチェックすることができる。
判定動作812において、制御動作要求が同期化動作を要求しているかどうかを判定する。一実施形態において、判定動作812では、単純に判定動作806の結果をチェックするだけである。制御動作要求が同期化動作に関するものである場合、フローは、YESからマージ動作814に分岐する。制御動作要求が同期化動作に関するものではない場合、フローは、NOからこの動作フローの終了に分岐する。
同期化動作が要求された場合、マージ動作814において、保存動作808において保存されたバッファリングされたデータに対する変更を、リフレッシュ動作810においてリフレッシュされたバッファリングされたデータとマージする。データ本体の2つのバージョンをマージするルールは、アプリケーションのコンテキストに基づいて変化する。いくつかの例示的なルールを、図6に提示した。一実施形態では、様々なデータクライアントからの複数の変更を一緒にマージして、各データクライアントにおける同期化を実現することができる。
図9に、本発明の一実施形態に従って、コミット要求がどのように処理されるかを示す。受信動作902において、データクライアントからデータを受信する。一実施形態において、データクライアントは、ダイアログボックスであり、アプリケーションユーザは、そのダイアログボックスを介してデータを入力する。データは、そのダイアログボックスに関連付けられたUIコントロールがアクティブ化されるときに送信される。次に、バッファリング動作904において、1つまたは複数のトランザクション変換内、あるいは1つまたは複数のトランザクション変換に関連付けられたメモリ内のデータをバッファリングする。
受信動作906において、コミット動作の要求を受信すると、変更された2フェーズコミットプロトコルが呼び出される。第1に、発行動作908において、データストアに関連付けられた複数のデータコネクタにコミット要求を発行する。一実施形態において、コミット要求は、コミットされるデータを含む。コミット要求は、データをキャッシュしている1つまたは複数のデータコネクタと、データを保持する1つまたは複数のデータストアとのうちの少なくとも一方によって受信され、データをアトミックにコミットできるという保証の要求として扱われる。受信動作910において、データを保持するデータコネクタおよび/またはデータストアから応答を受信する。すべての応答が受信されると、判定動作912において、コミット要求のすべての受信側がコミットに合意したかどうかを判定する。すべての受信側が合意した場合、フローは、YESから送信動作914に分岐する。少なくとも1つの受信側が合意していない場合、フローは、NOから送信動作916に分岐する。
すべての受信側がデータのコミットに合意した場合、送信動作914において、発行動作908において発行されたコミット要求のすべての受信側に、コミットコマンドを送信する。受信側は、データをコミットする(すなわち、受信側自体の変更されたデータを更新する)。
少なくとも1つの受信側が合意していない場合、送信動作916において、アボートコマンドを受信側に送信する。したがって、受信側は、指示されたコミットが行われないことと、そのコミットに関連するすべてのデータを破棄できることとを認識することになる。一実施形態では、送信動作916において、データのコミットに合意した受信側だけにアボートコマンドを送信し、データのコミットに合意しなかった受信側は、明示的に指示されずに自動的にデータを破棄する。次に、リフレッシュ動作918において、バッファリングされたデータをリフレッシュするために、リフレッシュ制御動作を実行する。一実施形態では、リフレッシュ動作918において、その代わりに、バッファリングされたデータを同期化するために、同期化制御動作を実行する。
本発明の他の実施形態も想定されている。一実施形態において、各トランザクション変換には、同期化ルールを実施するポリシモジュールを含めることができる。別の実施形態では、ポリシモジュールは、リフレッシュおよび同期化に関するコンカレンシポリシを設定する。例示的なコンカレンシポリシには、コンサバティブコンカレンシ(conservative concurrency)(すべてのバッファリングされたデータの完全なコピーが必ず作成される)と、オプティミスティックコンカレンシ(データは、必要に応じてバッファにコピーされるだけである)とが含まれる。ポリシモジュールは、本明細書では説明しないその他のタイプの制御動作を処理するための、モジュール式のポリシの追加を可能にすることもできる。
別の実施形態では、クエリ言語と共にトランザクション変換を使用して、データにアクセスし、そのデータを操作することができる。SQLが、広く使用されているそのようなクエリ言語の1つである。XQueryが、別のそのようなクエリ言語である。本発明と共に他のクエリ言語を使用することも想定されている。
さらに別の実施形態では、データコネクタ610が、例えば図6のバッファおよびロジック616などのバッファに関連し、ある程度、そのバッファを管理することができる。そのような場合、コネクタは、データのリフレッシュコンポーネントおよび/または同期化コンポーネントを制御するために、バッファリングされたデータにアクセスし、かつ/または操作するロジックを有する。
(アプリケーションフレームワークフェーズ化モデル)
上記にて簡潔に説明したように、アプリケーションおよび/またはアプリケーションコンポーネントは、あるフェーズに制約することができる。一般に、フェーズ化は、ソフトウェアコンポーネントをマルチティア型フェーズ化モデルに従わせることによって、コンピュータシステム内のソフトウェアメソッドの実行を制約する。ソフトウェアコンポーネントは、クラス、オブジェクト、メソッド、またはコンピュータシステム内のその他のソフトウェアコード構造とすることができる。フェーズは、ソフトウェアコンポーネントのセットによって同時かつ集合的に共有される動作状態である。コンピュータシステムは、マスタフェーズ化モデルとも呼ばれるトップレベルフェーズ化モデルを実行し、1つまたは複数のサブフェーズが、マスタフェーズ化モデルの1つまたは複数のフェーズの間に発生する。コンピュータシステム内の動作は、フェーズのセットまたはサブフェーズのセットに制約される。
マルチティア型フェーズ化モデル1000の例示的な実施形態を、図10に示す。マルチティア型フェーズ化モデルは、3つのフェーズ1002、1004、および1006を含む第1のフェーズモデルすなわちマスタフェーズモデルを有する。マスタフェーズは、矢印1016によって表される順序で発生する。2つのサブフェーズ、すなわち、サブフェーズ1 1008およびサブフェーズ2 1010が、フェーズ1 1002中に発生する。さらに、2つのさらなるサブフェーズ、すなわち、サブフェーズ2aおよびサブフェーズ2bが、サブフェーズ2中に発生する。したがって、フェーズ化モデル1000は、サブフェーズが他のフェーズまたはサブフェーズ中に発生する、マルチティア型のフェーズのセットを表す。以下では、フェーズのすべての説明を、サブフェーズにも適用することができる。
各ソフトウェアコンポーネントは、あるフェーズ内で動作するように制約される。制約は、ソフトウェアメソッドが制約されるフェーズ中にのみ実行されるか、または呼び出されるように、ソフトウェアメソッドのそれぞれに課される。競合または矛盾した結果をもたらし得るソフトウェアメソッドは、異なるフェーズに制約され、これらのソフトウェアメソッドは、現在のフェーズから正当に呼び出すことはできない。したがって、各ソフトウェアメソッドは、矛盾するタスクを達成するメソッド間で競合することなく、既知の形で実行される。すべてのメソッドは、ソフトウェアシステムが現在のフェーズ制約と互換状態になることがわかるように、特定のフェーズ制約の下で実行される。
再度図10を参照すると、フェーズ1 1002は、サブフェーズ1 1008およびサブフェーズ2 1010に対する上位フェーズである。2つのさらなるサブフェーズ、すなわち、サブフェーズ2a 1012およびサブフェーズ2b 1014は、サブフェーズ2 1010中に発生する。同様に、サブフェーズ2 1010は、サブフェーズ2a 1012およびサブフェーズ2b 1014に対する上位フェーズである。どのフェーズまたはサブフェーズであっても、サブフェーズを有することができる。マルチティア型フェーズ化モデルにおけるサブフェーズのレベルの数には制限がない。さらに、任意のフェーズスペース内には、少なくとも2つのフェーズが存在しなければならないが、2つを超えるフェーズの数に対する制限はない。さらに、上位フェーズ内にサブフェーズが存在する場合には、少なくとも2つのサブフェーズが存在しなければならないが、上位フェーズ中に発生するサブフェーズについて、2つを超えるサブフェーズの数に対する制限はない。上位フェーズ中に、任意のサブフェーズのセットを1回または複数回サイクルすることができる。
フェーズ化モデル1000は、フェーズスペースを示す。フェーズスペースは、有効なフェーズ(グラフの節点(graph node))および有効なフェーズ遷移(グラフの辺(graph edge))を決定する有限有向グラフである。したがって、フェーズスペースは、有効なフェーズのシーケンスを決定する。フェーズスペース1000は、フェーズセット、すなわち、フェーズ1 1002、フェーズ2 1004、およびフェーズ3 1006にわたって定義される。フェーズスペース1000は、3つのフェーズ遷移1018a、1018b、および1018cも有する。フェーズ遷移は、遷移前フェーズを共有するすべてのソフトウェアコンポーネントによるフェーズの同時変化が発生するときを表す。
ソフトウェアコンポーネントがフェーズスペースを共有するとき、このソフトウェアコンポーネントは、1つのフェーズドメインの一部である。フェーズドメインは、特定のフェーズスペースによって定義される共通のフェーズ化モデルに合意するソフトウェアコンポーネントのセットである。例えば、マスタフェーズ1002、1004、および1006を有するマスタフェーズスペースによって制約されることに合意するすべてのソフトウェアコンポーネントは、このマスタフェーズドメインの一部である。したがって、このマスタフェーズドメイン内のソフトウェアコンポーネントに関連するすべてのソフトウェアコンポーネントは、マスタフェーズ1002、1004、および1006のうちの少なくとも1つに関連するフェーズ制約を含む。
フェーズ制約は、あるプログラムコンテキストにおいて有効なフェーズを制限する静的な制約である。具体的に言うと、制約をプログラムセクションに適用して、そのプログラムセクションがその制約に従うフェーズ中にのみ実行されることを確実にすることができる。一実施形態において、フェーズ制約は、[Phase 1]など、大括弧内の属性として記述される。このデータ構造については、以下でより詳細に説明する。
1つまたは複数のフェーズドメインを占める1つまたは複数のコンポーネントを有するコンピュータ環境1100を、図11に示す。マスタディレクタ1102は、マスタフェーズスペースの遷移および確立を制御する。このコンピュータ環境内のすべてのコンポーネントが、マスタフェーズドメイン1100の一部であるが、1つまたは複数のサブフェーズドメインを占めることもできる。フェーズドメイン1100の作成を可能にするために、プログラム作成者は、フェーズスペースと、そのフェーズスペースにおけるフェーズ遷移を実行するポリシと、フェーズドメインの境界をまたぐメッセージを処理するポリシとを選択する必要がある。
フェーズドメイン1100は、マルチティア型フェーズスペースによって特徴付けることができる。本発明の実施形態では、コンポーネント1 1104などの1つまたは複数のコンポーネントが、マスタディレクタ1102に登録される。コンポーネント1 1104は、ソフトウェアコンポーネントまたはメソッドを含む、任意のタイプのソフトウェアコンポーネントを表す。ソフトウェアコンポーネント1104は、マスタフェーズスペースにおけるフェーズのうちの1つのフェーズに制約される。
他の実施形態では、サブディレクタ1 1106およびサブディレクタ2 1108などの1つまたは複数のサブディレクタが、マスタディレクタ1102に登録される。サブディレクタは、1つまたは複数の様々なフェーズスペースを用いて1つまたは複数の他のフェーズドメインを制御する。したがって、フェーズドメイン1100は、1つまたは複数のネストされたフェーズドメインを有する。サブディレクタ1 1106に登録されたコンポーネント2 1110などのすべてのコンポーネントは、サブフェーズスペース内で、マスタフェーズスペースにおける1つまたは複数のマスタフェーズ中の1つまたは複数のサブフェーズに制約される。一実施形態において、サブディレクタによって制御されるサブフェーズドメインは、単一のマスタフェーズ内で動作する。サブフェーズの動作は、単一のマスタフェーズ中に繰り返して発生し得る。
本発明の実施形態では、サブディレクタ2などのサブディレクタは、さらなるネストされたサブフェーズドメインを作成するために、サブディレクタ3などのその他のサブディレクタを登録する。いくつかの実施形態において、サブディレクタ2 1108は、コンポーネント3 1112およびサブディレクタ3 1114の動作を制御する。さらなる実施形態では、サブディレクタ3 1114などのディレクタが、コンポーネント4 1116およびコンポーネント5 1118などの複数のコンポーネントを制御する。各サブディレクタは、独自のフェーズを有するフェーズスペースを制御することができる。したがって、サブディレクタ1 1106は、第1のサブフェーズスペースを動作させ、サブディレクタ3 1114は、第2のサブフェーズスペースを動作させる。2つのフェーズスペースが相互作用しない場合、それらのフェーズスペースを直交スペースと呼ぶ。直交フェーズスペースの組合せは、デカルトフェーズスペースを形成することができ、このデカルトフェーズスペースは、単一の積(product)に関するフェーズドメインを形成するのに使用することができる。基礎になるフェーズセットは、直交フェーズセットのデカルト積であり、有効なフェーズ遷移も、直交フェーズセットの有効な遷移のデカルト積である。
本発明の実施形態では、ディレクタは、論理クロックである。ディレクタは、ハードウェアシステム内のクロックと同様に、フェーズを通ってサイクルする。各フェーズ遷移にて、ディレクタは、フェーズドメイン内のすべてのソフトウェアコンポーネントについて、フェーズを同時に変更する。一実施形態において、すべてのサブディレクタは、サブフェーズドメイン内のサブフェーズを同時に変更することができる。論理クロックは、フェーズに制約された動作、またはフェーズに制約されたサブフェーズ内で実行される動作に制約された動作の完了を待つ。
マスタフェーズドメインに使用することができるフェーズスペース1200の例示的な実施形態を、図12に示す。フェーズスペース1200は、3つのフェーズを有する。読み取り要求フェーズ1202中には、データを読み書きする要求、またはソフトウェアシステム内のその他のソフトウェアコマンドもしくは要求が、次のフェーズに入るまでキューされる。一実施形態では、要求された競合しないメソッドだけが、次のフェーズにおいて実行され、他のメソッドは、別のフェーズ、またはそのフェーズの次のサイクルまで待つ。
更新フェーズ1204は、コマンドおよび要求を適切なソフトウェアコンポーネントに向ける。本発明の実施形態では、更新フェーズ1204中に、ソフトウェアコンポーネントが、コマンドまたは要求を満たす。一実施形態において、更新フェーズ1204は、更新フェーズ1204中に発生するサブフェーズスペース500を有する。例示的なサブフェーズスペース500は図5に示されており、サブフェーズスペース500については、以下で説明する。一実施形態において、更新フェーズ1204は、データレイヤのサブフェーズをトリガする。すなわち、データに書き込むすべての要求は、更新フェーズ1204のサブフェーズにおいて達成される。
第3のフェーズすなわち再検証フェーズ1206は、更新フェーズ1204中に処理されなかった他のメソッドを指揮し、実行する。一実施形態では、データを取り出すすべての要求が、再検証フェーズ1206中に完了する。例えば、データが更新フェーズ1204において更新された後に、すべてのソフトウェアコンポーネントに、データ変更が発生したことが通知され、通知されたソフトウェアコンポーネントは、更新されたデータを取り出す。一実施形態において、再検証フェーズ1206は、サブフェーズスペース600を動作させる。サブフェーズスペース1300の例示的な実施形態を、図13に示し、以下で説明する。
フェーズを変更するために、フェーズスペース1200は、フェーズ遷移を介して進行する。例示的な実施形態では、3つのフェーズ1202、1204、および1206の間の遷移を表す3つのフェーズ遷移1208a、1208b、および1208cが存在する。上述したように、フェーズ遷移は、ディレクタ1102などのディレクタが、フェーズクロックを変更する時点であり、フェーズドメイン内のすべてのソフトウェアコンポーネントのフェーズは、同時に変化する。
現在のフェーズについて、または新しいフェーズへの遷移について警告するか通知するフェーズドメイン内のソフトウェアコンポーネントが、発生し得る。一実施形態では、ディレクタが、フェーズについてすべてのソフトウェアコンポーネントに通知する。他の実施形態では、要求するメソッドが、フェーズについてディレクタに要求する。本発明の実施形態では、遷移通知は、フェーズドメイン内の1つまたは複数のソフトウェアコンポーネントに送信される。一実施形態において、遷移通知は、現在のフェーズ中か、または次のフェーズの開始時のいずれかに発生する。他の実施形態では、別々のフェーズが、通知プロセス用に使用される。例えば、フェーズスペース1200は、フェーズドメイン内のソフトウェアコンポーネントに通知するための、遷移1208a、1208b、および1208cに位置付けられた3つの通知フェーズを有する。
更新フェーズ1204の例示的なサブフェーズスペース1300を、図13に示す。サブフェーズ1300は、いくつかの実施形態において、データレイヤに対して使用される。すなわち、共有データ構造体にデータを書き込むメソッドは、データサブフェーズスペース1300のサブフェーズの1つに制約される。一実施形態において、データを共有するすべてのソフトウェアコンポーネントは、合意フェーズ1302で、データをコミットするか、あるいは変更をアボートするかのいずれかに合意する。変更は、コミットまたはアボートフェーズ1304で、コミットされるか、あるいはアボートされるかのいずれかになる。
別の実施形態では、合意フェーズと、コミットまたはアボートフェーズとの両方が、「コミットまたはアボート」サブフェーズ1304のサブフェーズであり、サブフェーズスペース1300は、合意フェーズ1302の代わりにマークフェーズ1302を有する。この場合、データ変更は、コミットまたはアボートフェーズ1304で行われ、そのデータを使用するすべてのソフトウェアコンポーネントは、マークフェーズ1302で更新に対してマークされる。ソフトウェアコンポーネントをマークすることは、適切な後のフェーズで更新されたデータを取り出すようソフトウェアコンポーネントにシグナリングする、ソフトウェアコンポーネント内のフラグを設定することである。一実施形態において、マークされたソフトウェアコンポーネントは、再検証フェーズ1206でデータを取り出す。別の実施形態では、マークフェーズ1302は、2つのサブフェーズ、すなわち、マークサブフェーズおよび最終マークサブフェーズを有する。この場合、データを使用するソフトウェアコンポーネントは、マークサブフェーズでマークされ、最終マークサブフェーズでデータを取り出す。
再検証フェーズ1206中に発生する別の例示的なサブフェーズスペース1400を、図14Aに示す。サブフェーズスペース1400に制約されるソフトウェア構造内の例示的な変化を、図14Bに示す。サブフェーズスペース1400は、プラグアンドプレイ動作のためにサブフェーズを提供する。プラグアンドプレイサブフェーズスペース1400は、2つのフェーズ、すなわち、プレイサブフェーズ1404およびプラグサブフェーズ1402を有する。一般に、プラグサブフェーズ1402では、ソフトウェアコンポーネントのコンポジション(composition)および構成が、確立されるか、変更されるか、または削除されるが、プレイ時機能(playtime functionality)は実行されない。同様に、プレイサブフェーズ1404では、ソフトウェアコンポーネントの確立されたコンポジションまたは構成が、通常の機能のために使用されるが、コンポジションまたは構成の諸態様は、確立されず、変更されず、削除されない。
モジュール再構成の例示的な実施形態を、図14Bに示す。この実施形態では、ソフトウェアモジュールが、第1の構成1406を有する。ユーザ入力要求などの、何らかのアクションの際に、ソフトウェアモジュールは、第2の構成1408に変化する。当業者であれば、ソフトウェアモジュールは、第2の構成1408と比較して、第1の構成1406では異なって動作することが理解されよう。したがって、再構成は、ソフトウェアモジュールと相互作用するプレイフェーズ中にメソッドが実行されることなく、行われる必要がある。本発明の実施形態では、プラグサブフェーズ1402中に、ソフトウェアインスタンスが、初期化され、接続または切断され、プロパティが設定される。いくつかの実施形態では、さらなるサブフェーズが、プラグサブフェーズ1402中に実行される動作を順序付けることを助ける。
一実施形態において、プラグサブフェーズ1402は、さらなるサブフェーズを有する。構築サブフェーズ1410は、既知のクラスをインスタンス化することによって、ソフトウェアコンポーネントを呼び出すことによって、またはクローンもしくは特殊化された導出されたインスタンスを取得するために既存のインスタンスにおけるインターフェースを使用することによって、新しいソフトウェアインスタンスを作成する。構成サブフェーズ1412は、インスタンス間の接続を追加するか、または除去する。最後に、初期化サブフェーズ1414は、プロパティを設定し、正しく接続されたインスタンス間のネゴシエーションを要求する。プラグサブフェーズ1402内のサブフェーズは、本明細書で提示されるサブフェーズから派生され得る。さらに、プレイサブフェーズ1404にも、サブフェーズを含めることができる。
他のフェーズ化スペースも企図されている。例えば、ユーザインターフェース変更用のサブフェーズスペースが企図されている。ユーザインターフェースサブフェーズスペースでは、無効化サブフェーズ(invalidate sub-phase)が、構造体をビルドするメソッドの実行を可能にすることができる。次に、描画サブフェーズ(draw sub-phase)が、ビルドされた構造体を描画する。当業者であれば、他のフェーズスペースを、他のタイプの動作用に使用することができることが認識されよう。さらに、当業者であれば、上記にて提示した例示的なフェーズスペースは、フェーズまたはサブフェーズの数に関して、ティアまたはレイヤの数に関して、およびフェーズまたはサブフェーズのタイプに関して、変更できることが認識されよう。したがって、本発明は拡張可能である。一実施形態では、新しい上位フェーズが、既存のフェーズスペースにオーバーレイされる。別の実施形態では、新しいフェーズが、既存のフェーズスペースに追加される。さらに別の実施形態では、より多くのサブフェーズ、またはサブフェーズスペースの新しいティアが、既存のフェーズスペースに追加される。
コードの項目の実行を制約するフェーズ制約を有するデータ構造体1500の例示的な実施形態を、図15に示す。データ構造体1500はコード要素である。任意のタイプのコードが、フェーズ制約を有することができる。フェーズ制約1502が、メソッド1504の上に示されている。フェーズ制約1502は、メソッド1504の動作を、フェーズ制約において指定されたフェーズ、この実施形態ではフェーズ「Perform」に制約する。したがって、メソッド1504は、「Perform」フェーズまたは「Perform」サブフェーズ中にのみ実行される。
本発明の実施形態では、データ構造体は、ソフトウェアコンポーネントと、実行される動作のタイプとに依存する、ある形の制約を含む。一実施形態において、制約は呼び出し制約である。呼び出し制約は、メソッドの呼び出しを、指定されたフェーズに制約する。したがって、他のソフトウェアコンポーネントまたは同一のソフトウェアコンポーネント内のメソッドの実行は、このメソッドの開始を指定されたフェーズ中だけに制限することによって制約される。別の実施形態では、制約はコンストラクタ制約である。コンストラクタは、ソフトウェアコンポーネントをインスタンス化する、特殊な形のメソッドである。したがって、ソフトウェアコンポーネントのインスタンス化は、図14Aの構築サブフェーズ1410を用いて説明したフェーズなどの、指定されたフェーズに制約される。さらに別の実施形態では、制約は参照制約である。参照制約は、ソフトウェアコンポーネントの1つのクラス全体と、そのクラスのすべてのプリミティブ動作とを制約する。例えば、インターフェースに対して設けられた参照制約は、図14Aの接続サブフェーズ1412を用いて説明したものなど、ソフトウェアモジュール間の接続を制限する。
制約は、任意のターゲットソフトウェアコンポーネントに割り当てることができる、ソフトウェアコード内のフェーズ制約属性によって表される。本発明の実施形態では、フェーズ制約属性は、クラス全体に割り当てられ、継承可能である。したがって、子コンポーネントは、その親コンポーネントから制約を継承する。いくつかの実施形態において、フェーズ化方式は、同一のターゲットに複数のフェーズ制約属性を設ける。したがって、ソフトウェアターゲットは、複数のフェーズ制約の結合によって制約される。
各制約は、指定されたフェーズのレベルに関連付けられた「タイプ」に対する制約である。したがって、上位フェーズを指定する制約は、「上位フェーズ」に対する制約である。サブフェーズを指定する制約は、「サブフェーズ」に対する制約である。サブフェーズであるタイプに対する制約は、「上位タイプ」に対するすべての制約の結合に対する制約である。タイプに対する制約間の関係は、様々なソフトウェアコンポーネント間の制約関係の妥当性をチェックするために、コンパイラによって使用されるか、あるいは、ランタイムに使用される。
制約の実施は、ランタイムに、またはコンパイル時に行うことができる。コンパイル時には、タイプに対する制約をチェックすることができる。コンパイラは、サブタイプに対する制約を有するメソッドを呼び出すタイプに対する制約を有するメソッドの正常性ルール(soundness rules)のセットに対して、タイプに対する制約およびサブタイプに対する制約をチェックすることができる。制約方式は、サブタイプに対する制約がタイプに対する制約と同一か、またはタイプに対する制約より弱い場合に、例えば、タイプに対する制約がプラグフェーズ1402を指定し、サブタイプに対する制約が初期化サブフェーズ1414を指定する場合に、有効である。この実施形態では、初期化サブフェーズ制約1414は、プラグサブフェーズ1402内で実行され、したがって、より弱い制約である。制約方式は、サブタイプに対する制約が、タイプに対する制約と相互に素である場合に、例えば、タイプに対する制約がプレイサブフェーズ1404を指定し、サブタイプに対する制約が反対のプラグサブフェーズ1402を指定する場合に、無効である。制約方式は、サブタイプに対する制約がタイプに対する制約より強いか、またはタイプに対する制約とオーバーラップしている場合に、例えば、タイプに対する制約がプラグサブフェーズ1402を指定し、サブタイプに対する制約が初期化サブフェーズ1414を指定する場合に、有効であるが、ある動的チェックを受けなければならない。この実施形態では、フェーズドメインが、現在、プラグサブフェーズ1402と初期化サブフェーズ1414との両方で動作する場合に、呼び出し方式が有効である。しかし、ドメインが、この2つのフェーズの一方に含まれない場合、その方式は無効である。他の正常性ルールも企図されており、本発明に組み込まれている。
マルチティア型フェーズ化ドメイン内でコンピュータ環境を動作させる方法1600の例示的な実施形態を、図16Aおよび図16Bに示す。起動後に、遷移動作1602において、要求フェーズ1202などの第1のフェーズに遷移する。一実施形態では、マスタディレクタ1102などのマスタディレクタが開始される。一実施形態では、マスタフェーズのうちの1つに制約された、コンポーネント1104などのコンポーネントが、マスタディレクタに登録される。マスタディレクタは、フェーズクロックを開始して、フェーズスペース1200などのフェーズスペース内のフェーズを通って論理時間をサイクルする。
判定動作1604において、コンポーネント1104などのいずれかのソフトウェアコンポーネントが、マスタフェーズの第1のフェーズに制約されるかどうかを判定する。ソフトウェアコンポーネントが第1のフェーズに制約されている場合、実行動作1606において、第1のフェーズ中に、そのソフトウェアコンポーネントを実行する。実行すべきソフトウェアコンポーネントがない場合、またはソフトウェアコンポーネントの実行中に、判定動作1608において、第1のフェーズ中に発生する、サブフェーズスペース1300などのサブフェーズスペースがあるかどうかを判定する。第1のフェーズ中に発生するサブフェーズスペースがない場合、このプロセスは、接続子1から、図16Bに示された遷移動作1622に進む。
第1のフェーズ中に発生するサブフェーズスペースがある場合、識別動作1610において、そのサブフェーズスペースおよび適用可能なサブフェーズを識別する。一実施形態では、サブディレクタ1106などのサブディレクタが、開始され、マスタフェーズスペースを制御するマスタディレクタに登録される。サブディレクタは、サブフェーズ論理クロックを開始して、サブフェーズスペース内のサブフェーズを通ってサイクルする。判定動作1612において、現在のサブフェーズに制約された、コンポーネント1112などのソフトウェアコンポーネントがあるかどうかを判定する。一実施形態において、サブフェーズスペースに制約されたソフトウェアコンポーネントは、サブディレクタに登録される。したがって、ネストされたサブフェーズドメインが、マスタフェーズドメインの下で作成される。現在のサブフェーズに制約されたサブフェーズドメイン内のソフトウェアコンポーネントがある場合、実行動作1614において、現在のサブフェーズ中に、それらのソフトウェアコンポーネントを実行する。判定動作1616において、現在のサブフェーズ内に発生する、サブフェーズ1410、1412、および1414などのさらなるサブフェーズスペースがあるかどうかを判定する。さらなるサブフェーズがある場合、このプロセスは、識別動作1610に戻って、さらなるサブフェーズを識別する。
識別すべきさらなるサブフェーズスペースがない場合、判定動作1618において、現在のサブフェーズスペース内で発生する他のサブフェーズが残っているかどうかを判定する。現在のサブフェーズスペース内で発生する別のサブフェーズがある場合、遷移動作1620において、サブフェーズスペース内の次のサブフェーズに遷移する。一実施形態において、サブディレクタは、現在のサブフェーズ内のすべてのスレッドが実行されるまで待ち、その後、次のサブフェーズに遷移する。次に、このプロセスは、もう一度判定動作1612に進む。現在のサブフェーズスペース内にサブフェーズが残っていない場合、判定動作1618において、いずれかの上位フェーズスペースに、遷移すべき別の上位フェーズがあるかどうかを判定する。別の上位フェーズがある場合、遷移動作1620において、次の上位フェーズに遷移する。このプロセス(上位フェーズ内のサブフェーズの判定、サブフェーズ内のソフトウェアコンポーネントの実行、すべてのサブフェーズが完了するまでの次のサブフェーズへの遷移、および次の上位フェーズへの遷移)は、すべてのサブフェーズスペースを通ってサイクルし、次のマスタフェーズへの遷移が必要になるまで、繰り返される。サブフェーズループが、第1のマスタフェーズについて終了すると、このプロセスは、接続子1から、図16Bに示された遷移動作1622に進む。
遷移動作1622において、更新フェーズ1204などの次のマスタフェーズに遷移する。一実施形態において、マスタディレクタは、第1のフェーズ内で実行されるすべてのスレッドが終了するのを待つ。その後、マスタディレクタは、論理フェーズクロックを次のフェーズに変更する。いくつかの実施形態において、マスタディレクタは、図11を参照して上記にて概要を示した遷移ルールに従う。その後、このプロセスは、サブフェーズ識別について第1のフェーズが発生するのに類似した動作に従う。したがって、サブフェーズプロセスに関する一部の詳細について、繰り返し説明はしないが、当業者であれば、第1のフェーズに関して説明した詳細を、次のフェーズに制約された任意の後続するプロセスにどのように実施すべきかが理解されよう。
判定動作1624において、いずれかのソフトウェアコンポーネントが現在のマスタフェーズに制約されるかどうかを判定する。次のマスタフェーズに制約されたソフトウェアコンポーネントがある場合、実行動作1626において、そのソフトウェアコンポーネントを実行する。実施形態において、ソフトウェアコンポーネントは、既にマスタディレクタに登録されている。ソフトウェアコンポーネントは、現在のフェーズについて、マスタディレクタに関してチェックをし続ける。フェーズが遷移し、マスタディレクタが、ドメインが今や次のマスタフェーズにあることをレポートするときに、次のマスタフェーズに制約されたソフトウェアコンポーネントが、実行を開始する。
次のマスタフェーズに制約されたソフトウェアコンポーネントがない場合、または制約されたソフトウェアコンポーネントの実行中に、判定動作1628において、現在のマスタフェーズ内にサブフェーズスペースがあるかどうかを判定する。サブフェーズスペースがある場合、識別動作1630において、サブフェーズスペースを識別し、第1のサブフェーズに遷移する。判定動作1632では、いずれかのソフトウェアコンポーネントが現在のサブフェーズに制約されるかどうかを判定する。現在のサブフェーズに制約されたソフトウェアコンポーネントがある場合、実行動作1634において、そのソフトウェアコンポーネントを実行する。
現在のサブフェーズに制約されたソフトウェアコンポーネントがない場合、またはこれらのソフトウェアコンポーネントの実行中に、判定動作1636において、現在のサブフェーズ内にさらなるサブフェーズスペースがあるかどうかを判定する。さらなるサブフェーズスペースがある場合、このプロセスは、識別動作1630に戻る。さらなるサブフェーズスペースが現在のサブフェーズ内にない場合、判定動作1638において、現在のサブフェーズスペース内の次のサブフェーズまたは上位フェーズスペース内の次の上位フェーズがあるかどうかを判定する。次のサブフェーズまたは上位フェーズがある場合、遷移動作1640において、次のサブフェーズまたは上位フェーズに遷移する。現在のマスタフェーズの下に次のサブフェーズまたは上位フェーズがない場合、判定動作1642において、再検証フェーズ1206などの次のマスタフェーズがあるかどうかを判定する。次のマスタフェーズがある場合、このプロセスは、遷移動作1622に戻る。マスタフェーズスペース内に別のマスタフェーズがない場合、このプロセスは、接続子2から、遷移動作1602に戻り、第1のフェーズへの遷移によって、フェーズサイクルを最初からやり直す。
本発明をさらに説明するために、マルチティア型フェーズ化ドメイン内で動作する例示的なコンピュータシステムを、図17を参照して以下で説明する。この例示的なコンピュータシステムは、Microsoft(登録商標) Outlook(登録商標)メッセージングおよびコラボレーションクライアントプログラムなどの個人用連絡帳アプリケーション(personal contacts application)を動作させる。ここで、ユーザインターフェースは、アドレス帳に含まれる1つまたは複数の連絡先を表示する。このユーザインターフェースは、マスタビューウィンドウ1702を有する。マスタビュー1702は、すべての連絡先を表示し、ユーザが連絡先に関するより詳細な情報を見るために、連絡先を選択することを可能にする。
コンピュータ環境1700は、フェーズスペースの下で動作する。限定する目的ではなく説明のために、システム1700全体が、図12に示されたフェーズスペース1200の下で動作するものとする。さらに、説明のために、コンピュータシステム1700は、現在、要求フェーズ1202にあるものとする。したがって、コンピュータシステム1700は、要求またはコマンドが受信されるすべての動作を可能にする。したがって、連絡先の詳細ビュー1704を見るためのユーザコマンド1716が、受信され、キュー内に配置される。さらに、コマンド1718が、要求された詳細情報を取り出すために、アドレス帳モジュール1708に送信される。データ要求1718もキューされる。
マスタディレクタ1102は、コンピュータシステムドメイン1700内のフェーズを更新フェーズ1204に変更する。ここで、コマンド1716および1718がそれぞれ、選択状態モジュール1706およびアドレス帳モジュール1708に送信される。図14を参照して上述したユーザインターフェースに対する変更に関するユーザインターフェースサブフェーズスペースは、更新フェーズ1204中へ遷移される。無効化サブフェーズが開始する。詳細ビュー1704に関するコマンド1716が、処理を開始する。マスタビュー1702内のビューが、無効化される。例えば、詳細ビュー1704の選択が、非アクティブに設定される。さらに、マスタビュー1702は、非アクティブウィンドウに設定される。詳細ビュー1704が、適切なフィールドおよびユーザインターフェース項目を用いて作成される。次に、ユーザインターフェースサブディレクタが、描画サブフェーズに遷移する。連絡先に関するマスタビュー1702内の選択が、非アクティブに見えるように描画され、例えば、強調表示された選択が、色を変更する。マスタビュー1702が、非アクティブとして描画される。例えば、マスタビュー1702のウィンドウペインは、そのウィンドウペインが非アクティブであることを示すために、色を変更する。詳細ビュー1704が、ユーザインターフェース要素と共に描画される。フィールドは、アドレス帳モジュール1708からデータを受信するために、開かれたままにされる。
マスタディレクタ1102は、すべての無効化および描画の制約された動作がユーザインターフェースサブフェーズスペースで完了した後に、再検証フェーズ1206に遷移する。データ取り出し動作が、再検証フェーズ1206中に実行される。データ取り出し動作は、一実施形態では、データ取り出しサブフェーズスペースに制約される。データ取り出しサブフェーズスペースは、図13を参照して説明したように、2つのサブフェーズ、すなわち、マークサブフェーズおよび最終マークサブフェーズを有する。マークサブフェーズが開始される。アドレス帳が、データの更新を必要とするソフトウェアモジュールを検索する。詳細ビュー1704がマークされる。データ取り出しサブフェーズスペースのサブディレクタが、最終マークサブフェーズに遷移する。最終マークサブフェーズでは、アドレス帳1708が、3つのデータストア、すなわち、エクスチェンジサーバアドレス帳1710、クライアントアドレス帳1712、およびMSNアドレス帳のうちの1つから、要求された連絡先情報を取り出す。連絡先情報を取り出すと、アドレス帳1708は、その連絡先情報を詳細ビュー1704に書き込む。
再検証フェーズ1206に制約されたすべての動作を完了すると、マスタディレクタ1102は、要求フェーズ1202に戻って遷移する。ここで、ユーザインターフェースは、再度ユーザ入力デバイスからコマンドおよび要求を受け入れる。ユーザが、詳細ビュー1704内の連絡先情報に対する変更を入力する。例えば、ユーザは、連絡先の住所を変更する。データを変更するため、コマンド1720が、詳細ビュー1704からアドレス帳1704に送信される。さらに、マスタビュー1702およびアドレス帳1704のビューを更新するために、コマンド1722が、選択状態1706に送信される。この実施形態では、コマンドがキューされ、マスタディレクタ1102が更新フェーズ1204に遷移する。更新フェーズ1204は、サブフェーズスペース1300などのデータ書き込みサブフェーズスペースを開始する。
合意サブフェーズ1302において、アドレス帳が、データ変更要求を複数のデータストア1710、1712、および1714に送信する。データストアのうちの1つまたは複数には、詳細ビュー1704で変更されたデータのコピーが含まれる場合がある。したがって、そのデータを有する各データストアは、データを変更することに合意しなければならない。したがって、合意サブフェーズ1302中に、投票プロシージャ(voting procedure)が発生する。すべてのデータストアが、変更をコミットすることに合意する場合に、その合意が、アドレス帳1708に返送される。サブディレクタは、コミットまたはアボートフェーズ1304に、フェーズを変更する。ここで、データ変更が、データストアに送信され、データを更新するために使用される。
その一方で、更新フェーズ1204中に、ユーザインターフェースサブフェーズスペースが発生する。選択状態1706は、無効化サブフェーズ中に、マスタビュー1702および詳細ビュー1704における、古いデータを含むセクションを無効化する。描画サブフェーズでは、マスタビュー1702および詳細ビュー1704が、変更されたデータのスペースを保持しながら、再描画される。すべてのサブフェーズが更新フェーズ1204で完了すると、フェーズドメイン1700は、再検証フェーズ1206に遷移する。
再検証フェーズ1206では、さらなるサブフェーズスペースが、マークサブフェーズおよび最終マークサブフェーズを含む。マークフェーズに遷移して、アドレス帳1708は、変更されたデータを必要とするものとして、マスタビュー1702および詳細ビュー1704をマークする。最終マークサブフェーズでは、変更されたデータが、マスタビュー1702および詳細ビュー1704に書き込まれる。これらの変更は、非常に短い時間で、微細な粒度で発生し得る。例えば、フェーズは、ユーザによって入力されるすべての文字の後、1秒も要さないほどのわずかな時間のうちにサイクルされる。したがって、変更は、瞬間的に発生するように見える。
この例は、マルチティア型フェーズ化が、システム内のメソッドの実行に対してどのように制約するかを示すものである。コマンドおよび変更がフェーズ化なしで発生する場合には、マスタビュー1702および詳細ビュー1704は、すべてのデータストアがデータを変更する前に、更新される可能性がある。したがって、データの変更を試みるメソッドおよびユーザインターフェースビューの更新を試みるメソッドの順序に応じて、ユーザは、詳細ビュー1704またはマスタビュー1702内で混合された結果を見る可能性がある。
(コンカレンシドメインを伴うマルチスレッディング)
上記にて簡潔に説明したように、アプリケーションおよび/またはアプリケーションコンポーネントは、あるフェーズまたはあるフェーズドメインに制約することができる。本発明の実施形態によれば、コンポーネントのパーティション内の同期化およびスレッド分離を提供し、かつコンポーネントのパーティション間の改善された並行動作を提供するために、ソフトウェアアプリケーションのコンポーネントを別々のドメインに区分することができる。図18に、本発明の一実施形態による、複数のオブジェクトを同時に実行するように構成された例示的なシステムを示す。例示的なシステム1800は、コンカレンシドメイン1801を含み、このコンカレンシドメイン1801は、すべてのシングルスレッドオブジェクト1803が単一のスレッド1802で実行される1つまたは複数の当該シングルスレッドオブジェクト1803の集合(またはパーティション)であり、外部オブジェクト1810と直接的に(例えば、または同期式に)は通信しない。内部スレッド1802は、コンカレンシドメイン1801によって課せられるロジックに従ってオブジェクト1803を実行する。内部スレッド1802は、コンカレンシドメイン1801内でシングルスレッドオブジェクト1803だけを実行する。内部スレッド1802は、外部オブジェクト1810をまったく実行しない。
一実施形態によれば、コンカレンシドメイン1801の寿命全体を通じて内部スレッド1802として、同一のスレッドを使用する必要はない。そうではなく、内部スレッド1802でオブジェクトを実行する必要がないときには、内部スレッド1802として動作するスレッドを、スレッドプール(図示せず)に返すことができる。スレッドがもう一度必要になったときには、新しいスレッドをスレッドプールからプルして、内部スレッド1802として動作させることができる。別の実施形態によれば、シングルスレッドオブジェクト1803のうちの1つが、スレッドアフィニティを有し、これは、シングルスレッドオブジェクト1803が同一のスレッドで実行されることを必要とすることを意味する。この実施形態では、同一のスレッドが、コンカレンシドメイン1801の寿命全体を通じて内部スレッド1802として動作する。一実施形態によれば、本明細書でより詳細に説明する、セカンダリスレッド1804も、スレッドプールから割り当てられる。
図18をさらに参照すると、システム1800は、少なくとも1つのセカンダリスレッド1804および少なくとも1つの外部オブジェクト1810をさらに含む。外部オブジェクト1810の実施形態には、1つまたは複数のセカンダリスレッド1804で実行される任意のオブジェクトが含まれる。セカンダリスレッド1804には、関連するアプリケーション内で実行される、内部スレッド1802以外の任意のスレッドが含まれる。上述したように、図18に示された例示的なコンカレンシドメイン1801は、内部スレッド1802および複数のシングルスレッドオブジェクト1803を含む。これらのシングルスレッドオブジェクト1803は、内部スレッド1802だけを使用して実行される。
コンカレンシドメイン1801内のオブジェクト1803は、プログラム内で、残りのセカンダリスレッド1804および外部オブジェクト1810から分離される。セカンダリスレッド1804は、コンカレンシドメイン1801内に含まれるシングルスレッドオブジェクト1803をまったく実行しない。各外部オブジェクト1810は、セカンダリスレッド1804のうちの1つまたは複数で実行されるように構成される。外部オブジェクト1810は、コンカレンシドメイン1801内のシングルスレッドオブジェクト1803と非同期に通信する。通信には、オブジェクト間でデータを渡すこと、またはあるオブジェクトによって別のオブジェクトのメソッド(例えば、またはタスク)を呼び出すことが含まれる。
コンカレンシドメイン1801の境界にまたがる非同期通信は、バウンダリオブジェクト1807の使用により実現される。各コンカレンシドメイン1801は、1つまたは複数のバウンダリオブジェクト1807に関連付けられる。これらのバウンダリオブジェクト1807は、コンカレンシドメイン1801を囲む膜または門壁とみなすことができる。バウンダリオブジェクト1807の例には、コンカレンシドメイン1801間、またはコンカレンシドメイン1801と外部オブジェクト1810との間でカスタムプロトコルを実装するデータコネクタおよびオブジェクトが含まれる。
コンカレンシドメイン1801内のシングルスレッドオブジェクト1803は、1つまたは複数のバウンダリオブジェクト1807を使用して、外部オブジェクト1810と非同期に通信する。シングルスレッドオブジェクト1803は、内部スレッド1802を使用して、バウンダリオブジェクト1807と通信する。次に、バウンダリオブジェクト1807は、1つまたは複数のセカンダリスレッド1804を使用して、外部オブジェクト1810と通信する。これによって、バウンダリオブジェクト1807は、コンカレンシドメイン1801の境界にまたがって情報および呼び出しを渡す。別の実施形態によれば、あるバウンダリオブジェクト1807は、外部オブジェクト1810に情報を渡す前に、セカンダリスレッド1804を使用して、別のバウンダリオブジェクト1807と通信する。
バウンダリオブジェクト1807は、コンカレンシドメイン1801の内部スレッド1802と、セカンダリスレッド1804の各々との間のインターフェースとして動作する。一実施形態によれば、バウンダリオブジェクト1807は、セカンダリスレッド1804を使用して、外部オブジェクト1810からインバウンド通信を受信し、この通信を適切な内部オブジェクト1803にフィルタリングする。このフィルタリング方法については、本明細書でより詳細に説明する。別の実施形態によれば、バウンダリオブジェクト1807は、内部スレッド1802を使用して、内部オブジェクト1803からアウトバウンド通信を受信し、セカンダリスレッド1804を使用して、この通信を適切な外部オブジェクト1810に送信する。一実施形態によれば、バウンダリオブジェクトは、内部スレッド上で外部オブジェクトを呼び出すことができるが、それを行うバウンダリオブジェクトは、制約の下にある。すなわち、バウンダリオブジェクトが外部オブジェクトを呼び出すことを許容することが、それを行うことによって無制限の遅延またはデッドロックを引き起こしてはならない。別の制約は、外部オブジェクトの制御の下でコンカレンシドメインの直接再入可能性(direct reentrancy)を妨げる内部オブジェクトへの参照を外部オブジェクトが保持することを防ぐことである。
同期通信は、第1のオブジェクトが実行されているスレッドが、第2のオブジェクトのメソッドを実行するために第2のオブジェクトに入るときに発生する。外部オブジェクト1810は、コンカレンシドメイン1801内のシングルスレッドオブジェクト1803と同期通信しない。したがって、外部オブジェクト1810を実行するセカンダリスレッドは、コンカレンシドメイン1801内のシングルスレッドオブジェクト1803を直接呼び出さず、これに入らない。
図19に、コンカレンシドメイン1901が、外部オブジェクト1910とインターフェースをとる別の例示的なシステム1900を示す。非同期通信の1つの例が、外部オブジェクト1910と内部オブジェクト1903との間に示されている。コンカレンシドメイン1901は、内部スレッド1902、内部スレッド1902で実行されるように構成されたシングルスレッドオブジェクト1903、および外部オブジェクト1910と通信するバウンダリオブジェクト1907を含む。このシステム1900の別の実施形態は、複数のバウンダリオブジェクト1907および複数のシングルスレッドオブジェクト1903を含む。
一実施形態によれば、外部オブジェクト1910は、複数のセカンダリスレッド1904で実行されるように構成されたマルチスレッドオブジェクト1905を含む。マルチスレッドオブジェクト1905の1つの部分1905Aは、1つのセカンダリスレッド1904Aで実行されるものとして示され、マルチスレッドオブジェクト1905の別の部分1905Bは、別のセカンダリスレッド1904Bで実行されるものとして示されている。別の実施形態によれば、外部オブジェクト1910は、1つのセカンダリスレッド1904で実行されるように構成された、複数のマルチスレッドオブジェクト1905またはシングルスレッドオブジェクト(図示せず)を含む。
システム1900内のコンカレンシドメイン1901は、作業キュー1908を保持する。作業キュー1908は、タスク(例えば、内部シングルスレッドオブジェクト1903のメソッドの呼び出し、データ更新、および他の実行可能メソッド)がポストされ(例えば、挿入され)、そして、タスクが除去される、複数要素データ構造である。一実施形態によれば、タスクは、ポストされた順序と同一の順序でのみ、すなわち、先入れ先出し制約に従って作業キュー1908から除去される。別の実施形態によれば、作業キュー1908にポストされたタスクには、優先順位が割り当てられ、各タスクは、その優先順位に従って除去される。
着信通信は、バウンダリオブジェクト1907によって作業キュー1908にポストされる。これらのポストされた通信は、作業項目1911を形成し、この作業項目1911は、コンカレンシドメイン1901に関連付けられた内部シングルスレッドオブジェクト1903またはバウンダリオブジェクト1907のタスクの実行に関する要求(例えば、呼び出し)である。外部オブジェクト1910によって、または別のバウンダリオブジェクト1907によって、作業項目1911を形成する要求を、あるバウンダリオブジェクト1907に通信することができる。例えば、図19では、矢印1920によって示されるように、外部オブジェクト1910のマルチスレッドオブジェクト1905が、タスクを実行するようバウンダリオブジェクト1907に要求する。次に、バウンダリオブジェクト1907は、矢印1925によって示されるように、そのタスクを含む作業項目1911を作業キュー1908の終わりにポストする。別の実施形態によれば、複数のバウンダリオブジェクト1907が、コンカレンシドメイン1901に関連付けられ、このバウンダリオブジェクト1907のうちの1つまたは複数が、作業項目1911を作業キュー1908にポストすることができる。さらに別の実施形態によれば、内部シングルスレッドオブジェクト1903が、タスクの実行を後の時間に延期するために、作業項目1911を作業キュー1908にポストするようバウンダリオブジェクト1907に要求する。
一実施形態によれば、新しいタスクを作業キュー1908にポストする準備をするときのリソースを節約するために、バウンダリオブジェクト1907は、作業キュー1908をチェックし、キューされた作業項目1911のいずれかが関連するタスクを含むかどうかを判定する。関連するタスクがある場合、バウンダリオブジェクト1907は、完全に新しい作業項目1911として新しいタスクをポストするのではなく、サブタスクとして、前にキューされた関連するタスクと選択的に新しいタスクをバンドルすることができる。
さらに図19を参照すると、一実施形態によれば、コンカレンシドメイン1901は、処理のために作業キュー1908からシングルスレッドオブジェクト1903に作業項目1911をディスパッチするディスパッチャ1909を含む。ディスパッチャ1909は、内部スレッド1902を使用して、作業キュー1908から作業項目1911を除去し、内部スレッド1902での実行のために各作業項目1911をディスパッチする。ディスパッチャ1909は、作業項目1911に含まれるタスクを呼び出す。例えば、図19では、矢印1930によって示されるように、ディスパッチャ1909が、作業キュー1908から作業項目1911をディスパッチする。次に、作業項目1911が、矢印1935によって示されるように、内部スレッド1902で実行される。
一実施形態によれば、作業キュー1908への作業項目1911のポストは、ディスパッチャ1909に動作させることを強制しない。そうではなく、作業項目1911の実行は、コンカレンシドメイン1901のトップレベルサイクルロジックによって規定される時点まで延期される。作業項目1911が作業キュー1908にポストされると、内部スレッド1902は、ディスパッチャ1909による決定に従って、コンカレンシドメイン1901の次の適切なサイクルに、要求されたタスクを実行する。したがって、外部オブジェクト1910は、作業項目1911がいつ除去されるかを決定せず、したがって、内部シングルスレッドオブジェクト1903のタスクがいつ呼び出されて実行されるかを決定しない。外部オブジェクト1910は、バウンダリオブジェクト1907がコンカレンシドメイン1901の内部スレッド1902のタスクをいつ実行するかについても決定しない。
タスクがディスパッチされ、完了すると、出力結果が、コールバックとしてバウンダリオブジェクト1907に渡される。次に、バウンダリオブジェクト1907は、その結果を達成したタスクを呼び出した作業項目1911を最初にポストした外部オブジェクト1910に、そのコールバックを通信する。コールバックの例には、タスクが完了したことを示すデータフラグやメソッド呼び出しなどが含まれる。
図20に、内部シングルスレッドオブジェクトと外部オブジェクトとの間の非同期通信を示す。本発明の実施形態による、外部オブジェクト2001と内部シングルスレッドオブジェクト2009との間の非同期通信中に発生する通信のチェーン2000が示されている。外部オブジェクト2001は、まず、バウンダリオブジェクト2003と通信する(2002)。この通信2002は、一般に、呼び出し、またはコンカレンシドメイン(図示せず)に関連するタスクのうちの1つまたは複数を呼び出す要求の形をとる。要求されたタスクは、実際にはシングルスレッドオブジェクト2009のタスクであるが、外部オブジェクト2001は、そのタスクをコンカレンシドメインまたはバウンダリオブジェクト2003に関連付けるだけである。
次に、バウンダリオブジェクト2003は、作業キュー2005と通信する(2004)。この通信2004は、一般に、作業キュー2005に作業項目(図示せず)をポストすることを含む。次に、作業キュー2005は、ディスパッチャ2007と通信する(2006)。この通信2006は、一般に、ディスパッチャ2007が作業キュー2005にポストされた各作業項目を順次ディスパッチすることを含む。最後に、ディスパッチャ2007は、内部シングルスレッドオブジェクト2009のタスクが呼び出されようとしている当該内部シングルスレッドオブジェクト2009と通信する(2008)。この通信2008は、一般に、内部シングルスレッドオブジェクト2009のタスクの呼び出しを含む。別の実施形態では、外部オブジェクト2001は、コンカレンシドメインの別のバウンダリオブジェクト(図示せず)と通信している。
図18〜図20を参照して上述した、コンカレンシドメインの境界にまたがる非同期通信は、再入可能性問題から内部シングルスレッドオブジェクトを保護する。内部的に制御される再入可能性は、コンカレンシドメインのトップレベルロジックの制御の下にあるオブジェクト(例えば、内部シングルスレッドオブジェクトまたはバウンダリオブジェクト)が、やはりトップレベルロジックの制御の下にある別のオブジェクトに再入するよう内部スレッドに指示するときに生じることが理解されよう。外部的に制御される再入可能性は、コンカレンシドメインのトップレベルロジックの制御の下にはないオブジェクト(例えば、外部オブジェクト)が、トップレベルロジックの制御の下にある別のオブジェクトに再入するよう内部スレッドに指示するときに生じる。内部的に引き起こされる再入可能性は、内部オブジェクトがそれ自体または同一のコンカレンシドメイン内の別のオブジェクトに再入するときに生じる。外部的に引き起こされる再入可能性は、外部オブジェクトによって引き起こされたイベントが再入可能性に影響を及ぼし、効果的にコンカレンシドメインの内部オブジェクトにおいて集合的に実施されるロジックからの再入可能性に対する制御を除去するときに生じる。その結果は、非決定的再入可能性である(non-deterministic reentrancy)。
再度図19を参照すると、コンカレンシドメイン1901の境界にまたがる非同期通信だけを可能にすることによって、内部シングルスレッドオブジェクト1903が、外部的に制御される再入可能性から保護される。例えば、内部シングルスレッドオブジェクト1903の実行が、外部オブジェクト1910のタスクの呼び出しを含む場合、内部スレッド1902は、コンカレンシドメイン1901に関連付けられたバウンダリオブジェクト1907のうちの1つに入り、外部オブジェクト1910のタスクの実行を要求する役割を担うタスクを呼び出すことになる。その後、内部スレッド1902は、内部シングルスレッドオブジェクト1903のタスクの実行、または作業キュー1908からディスパッチされた作業項目1911の実行に戻る。内部スレッド1902は、外部オブジェクト1910に入るためにコンカレンシドメイン1901から出ることはないので、外部オブジェクト1910の制御の下には入らない。
さらに、内部スレッド1902が、外部オブジェクト1910のタスクを実行することを許可され、かつそのタスクの実行が、内部シングルスレッドオブジェクト1903の別のタスクの呼び出しを含んでいる場合、内部スレッド1902は、コンカレンシドメイン1901に再入することを許可されない。そうではなく、内部スレッド1902は、コンカレンシドメイン1901のバウンダリオブジェクト1907に入って、作業項目1911をポストする役割を担うタスクを呼び出す。代替として、上述したように、ある制約の下で、バウンダリオブジェクトは、タスクの呼び出しのために、内部スレッドで外部オブジェクトを呼び出すことができる。タスクの呼び出しの後に、内部スレッド1902は、外部オブジェクト1910のタスクの実行に戻り、その後、内部シングルスレッドオブジェクト1903の第1の元々のタスクの実行に戻る。すなわち、内部スレッド1902は、第1のタスクの実行が完了し、かつコンカレンシドメイン1901のディスパッチャ1909によってそうするように指示されるまで、外部オブジェクト1910による第2のタスクの呼び出しを実行しない。
次に、図21および図22を参照して、データソースを含む例示的な外部オブジェクトに関して本発明の実施形態について説明する。図21に、コンカレンシドメイン2101およびデータソース2112を含むシステム2100を示し、図22に、コンカレンシドメイン2101の内部スレッド2102と、データソース2112のセカンダリスレッド2104との間のインターフェースを示す動作フローチャート2200を示す。一実施形態において、セカンダリスレッド2104は、複数のセカンダリスレッド2104を含む。コンカレンシドメイン2101は、シングルスレッドオブジェクト2103およびディスパッチャ2109を含み、バウンダリオブジェクト2107に関連付けられる。コンカレンシドメイン2101は、コンカレンシドメイン2101の内部スレッド2102で実行される保留中のタスクを表す作業キュー2108を保持する。一実施形態において、データソース2112はデータベースである。別の実施形態において、データソース2112はネットワークである。
内部スレッド2102およびセカンダリスレッド2104の実行の経路が、両方の図に示されている。図21では、破線の矢印が、内部スレッド2102で発生するタスクの実行を示し、実線の矢印が、セカンダリスレッド2104のうちの1つまたは複数で発生するタスクの実行を示す。破線の矢印および実線の矢印の参照番号は、図22に関して実行される動作またはタスクに対応し、図22では、各タスクは、各タスクがスレッドで実行される当該スレッドに沿って配置されて示されている。
さらに図21および図22を参照すると、この方法は、開始ブロック2201で開始され、動作2202に進み、動作2202において、シングルスレッドオブジェクト2103が、データソース2112に関連付けられたタスクを呼び出すようバウンダリオブジェクト2107に要求する。この要求は、コンカレンシドメイン2101の内部スレッド2102で実行される。動作2203において、ディスパッチャ2109が、作業キュー2108を順序付け、各作業項目2111をディスパッチする。一実施形態によれば、作業項目2111は、作業項目2111が作業キュー2108にポストされた順序で、内部スレッド2102を使用してディスパッチされる。例えば、ディスパッチャ2109は、間に新しい作業項目2111が追加されないと仮定すると、作業項目1から順番を開始し、作業項目7で順番を終了する。すべての新しい作業項目2111は、作業項目7の後に追加される。別の実施形態によれば、作業項目2111は、割り当てられた優先順位値に従ってディスパッチされる。
メソッド2202は、メソッド2211にもつながっていて、メソッド2211は、動作2202と同時に実行される。メソッド2211では、バウンダリオブジェクト2107が、データソース2112に関連付けられたタスクを呼び出す。この呼び出しは、セカンダリスレッド2104のうちの1つで実行される。次に、この方法は、動作2212に進み、動作2212において、データソース2112のタスクが、セカンダリスレッド2104のうちの1つまたは複数で実行される。次に、動作2213は、データベース2112が、実行の結果をコールバックとしてバウンダリオブジェクト2107に返送することを含む。結果の送信は、セカンダリスレッド2104のうちの1つまたは複数で行われる。その後、動作2214において、バウンダリオブジェクト2107が、このコールバックを作業項目2111として作業キュー2108にポストする。このポストは、セカンダリスレッド2104のうちの1つまたは複数で実行される。
この方法は、動作2214から動作2204に進む。動作2203も、動作2204につながっている。動作2204は、動作2203において作業キュー2108内の作業項目2111を順次実行していたディスパッチャ2109が、動作2214においてバウンダリオブジェクト2107によって追加されたコールバック作業項目2111に達したときに発生する。ディスパッチャ2109は、内部スレッド2102を使用してこのコールバックをディスパッチする。コールバックがディスパッチされると、ディスパッチャ2109は、動作2205において、作業キュー2108内の各作業項目2111の順次ディスパッチを継続する。この方法は、2206で終了する。
次に、図23および図24を参照して、第2のコンカレンシドメインを含む例示的な外部オブジェクトに関して本発明の実施形態について説明する。図23に、第1のコンカレンシドメイン2301および第2のコンカレンシドメイン2321を含むシステム2300を示し、図24に、第1のコンカレンシドメイン2301が第2のコンカレンシドメイン2321とインターフェースをとる動作フローチャート2400を示す。各コンカレンシドメイン2301および2321はそれぞれ、内部スレッド2302および2322と、シングルスレッドオブジェクト2303および2323と、ディスパッチャ2309および2329とを含む。各コンカレンシドメイン2301および2321はそれぞれ、バウンダリオブジェクト2307および2327に関連付けられ、内部スレッド2302および2322で実行される保留中の作業項目2311および2331を表す作業キュー2308および2328を保持する。図23では、第1の破線の矢印のセットが、内部スレッド2302で発生するタスクの実行を示し、実線のセットが、セカンダリスレッド2304のうちの1つまたは複数で発生するタスクの実行を示し、第2の破線の矢印のセットが、第2の内部スレッド2322で発生するタスクの実行を示す。これらの破線および実線の矢印は、第1のコンカレンシドメイン2301と第2のコンカレンシドメイン2321との間における通信に伴う様々な動作を実行するものとして示されている。これらの矢印の参照番号は、図24に関して実行される動作またはタスクに対応する。
さらに図23および図24を参照すると、この方法は、開始ブロック2401で開始され、動作2402と2422との両方に進む。動作2422は、第2のコンカレンシドメイン2321のディスパッチャ2329が、内部スレッド2322を使用して作業キュー2328における各作業項目2331を順次ディスパッチすることを含む。動作2402は、動作2422と同時に実行される。動作2402において、第1のコンカレンシドメイン2301のシングルスレッドオブジェクト2303が、第2のコンカレンシドメイン2321のオブジェクトのうちの1つからのタスクを呼び出すようバウンダリオブジェクト2307に要求する。一実施形態において、要求されるタスクは、第2のコンカレンシドメイン2321のシングルスレッドオブジェクト2323のうちの1つにおけるタスクである。別の実施形態においては、要求されるタスクは、第2のコンカレンシドメイン2321に関連付けられたバウンダリオブジェクト2327のうちの1つにおけるタスクである。
この方法は、動作2402から、動作2403と2412との両方に進む。動作2403において、第1のコンカレンシドメイン2301のディスパッチャ2309が、作業キュー2308における各作業項目2311を順次ディスパッチする。動作2412において、第1のコンカレンシドメイン2301のバウンダリオブジェクト2307が、第2のコンカレンシドメイン2321のバウンダリオブジェクト2327と通信するために、セカンダリスレッド2304のうちの1つまたは複数を使用する。この通信は、タスクを呼び出す要求を含む。その後、動作2413において、第2のバウンダリオブジェクト2327が、要求されたタスクを作業項目2331として作業キュー2328にポストする。このポストは、セカンダリスレッド2304のうちの1つまたは複数を使用して実行される。
動作2413と動作2422との両方が、動作2423につながっている。動作2423において、ディスパッチャ2329が、要求されたタスクを含む作業項目2331に達し、この作業項目2311をディスパッチする。このディスパッチは、第2のコンカレンシドメイン2321の内部スレッド2322で実行される。その後、動作2424において、このタスクが、第1のコンカレンシドメイン2301内のシングルスレッドオブジェクト2303へのコールバックとして実行される。この時点で、この方法は、再度分岐して、動作2425と2414との両方に進む。動作2425において、ディスパッチャ2329が、作業キュー2328における各作業項目2331の順次ディスパッチを継続する。
動作2414は、動作2425と同時に発生する。動作2414において、第2のコンカレンシドメイン2321のバウンダリオブジェクト2327が、1つまたは複数のセカンダリスレッド2304を使用して、コールバックを作業項目2311として作業キュー2308にポストするよう、第1のコンカレンシドメイン2301のバウンダリオブジェクト2307に要求する。次に、動作2415において、バウンダリオブジェクト2307が、このコールバックを作業キュー2308にポストする。このポストは、セカンダリスレッド2304のうちの1つまたは複数で実行される。
動作2404は、第1のコンカレンシドメイン2301のディスパッチャ2309が、作業キュー2308にポストされたコールバックに達したときに発生する。ディスパッチャ2309は、第1のコンカレンシドメイン2301の内部スレッド2302を使用して、コールバックをディスパッチする。動作2405において、コールバックが実行される。次に、この方法は、動作2406に進み、動作2406において、ディスパッチャ2309が、作業キュー2308の順序付けを継続し、順番に各作業項目2311をディスパッチする。この方法は、2406で終了する。
システムの別の例(図示せず)は、相互に、および他の外部オブジェクトとインターフェースをとる3つ以上のコンカレンシドメインを含む。そのようなシステムは、実質的に本明細書で説明するものと同一の動作に従って機能する。そのシステム内の各コンカレンシドメインは、内部スレッド、1つまたは複数のシングルスレッドオブジェクト、およびディスパッチャを含む。各コンカレンシドメインは、少なくとも1つのバウンダリオブジェクトに関連付けられ、作業キューを保持する。コンカレンシドメインの境界にまたがるすべての通信は、非同期である(例えば、それぞれのバウンダリオブジェクト、作業キュー、およびディスパッチャを介してフィルタリングされる)。
(アプリケーション記述言語)
上記にて簡潔に説明したように、本発明の実施形態は、図3を参照して上述したアプリケーション304など、アプリケーションフレームワーク内に含まれるすべてのアプリケーションおよびコンポーネントの宣言ルールおよび記述を提供する、アプリケーション記述(XAD)およびアプリケーション記述(XAD)エンジンを含む。ある実施形態の諸態様は、アプリケーションを特徴付けるデータフロー、データバインディング、およびルールを作成するための宣言言語または記述言語に関連する。他の態様は、ランタイムエンジンに関連し、このランタイムエンジンは、ランタイムに、宣言アプリケーションすなわち「アプリケーション記述」を処理するか、または実行して、データを表示し、かつ/または処理するオブジェクトを(ビルダを介して)作成する。その結果、開発者は、データ処理を行うオブジェクトの実際のコードを記述する必要はなく、最終的にコンパイルされて実行される宣言アプリケーションファイルを記述するだけでよい。以下で詳細に説明するように、そのようなシステムは、アプリケーションをプログラミングする従来技術の方法よりも多数の利点を提供する。
そのような宣言言語の使用は、アプリケーションのデータ、データの処理、データの変換、ユーザインターフェース(UI)、およびUIがデータと相互作用する方法を宣言的にモデル化することによる命令言語の使用とは異なる。本発明の実施形態は、XMLアプリケーションフレームワーク(XAF)アプリケーションを特徴付けるために使用される特定の宣言言語に関連する。本明細書では、この宣言言語を、しばしばXAFアプリケーション定義(XAD)と呼ぶ。本明細書で説明する多数の実施形態の詳細において、XMLの使用について言及するが、当業者であれば、他の構文を使用して本発明の諸態様を実施できることが認識されよう。
宣言アプリケーションファイルと、データ処理を実行するインスタンス化されるオブジェクトの構成との間のそのような分離をもたらすために、一実施形態では、アプリケーションをビルドして実行するプラットフォームなどのプラットフォームを使用することができる。本発明の諸態様によれば、本明細書では、使用されるプラットフォームをXAFプラットフォームと呼び、このXAFプラットフォームは、そのようなソフトウェアアプリケーションをビルドして実行するプラットフォームである。具体的に言うと、XAFは、データを均一に表すためにXMLも使用し、各アプリケーションのビルドに対する非常にコンポーネント化された手法を利用する。一実施形態において、XAFは、XMLを利用して、強力なデータ変換機能およびリッチデータを提供する。XMLの機能を使用して、外部データとアプリケーション状態との両方にアクセスし、操作することができる。ユーザインターフェースおよび複雑なデータフローは、XADを用いて定義することができる。
上述したように、XADは、XAFアプリケーションの作成に使用される宣言言語である。図25は、実行可能アプリケーションを形成するために作成されるデータおよびオブジェクトと関連する高水準のアプリケーション記述を示す図である。ランタイムにコンポーネント2510、2512、および2514を作成して、データを処理し、表示し、かつ/または編集し、実行中のアプリケーションを構成するオブジェクトの構成を本質的に構成するように、XADを使用して、データセットまたはデータストア2504、2506、および2508などのデータを宣言するか、または記述するアプリケーション記述2502を作成する。
本明細書における例示的な実施形態では、アプリケーション記述2502は、明確に形成されたXMLなどの宣言構造のセットとして表現される。したがって、アプリケーション記述2502は、1つまたは複数のオブジェクト2510、2512、および2514を実行中のアプリケーション内でどのように構成しなければならないかを記述する。本質的に、アプリケーション記述2502は、アプリケーションの結果ではなくアプリケーションの構成を計算するのに使用され、アプリケーションの結果の計算は、オブジェクト2510、2512、および2514によって行われる。オブジェクト2510、2512、および2514は、非宣言言語で記述された他のアプリケーションによって使用することもできるので、XADは、そのようなオブジェクトの再利用によってアプリケーション開発を改善する。さらに、XADは、以下でより詳細に説明するように、従来の静的な宣言アプリケーション定義を使用することによっては不可能な方法で、アプリケーションの動的な作成および変更を可能にする。
図25に示されたデータ2504、2506、および2508に関して、これらのソースは、テキストデータストア、SQLデータベースストア、XMLソース、ウェブサービスソースなどに関連するものとすることができる。実際に、アプリケーション記述2502は、データを中心とした、データ中心型(data centric)になっていると考えられる。アプリケーション状態は、「データ」の別のソースと考えることができ、オブジェクト2510、2512、および2514の構成が操作している、より標準的なデータに類似する形で扱うことができる。したがって、開発者は、主に、データがアプリケーションを通る形と、アプリケーションがそのデータにどのように応答するかを制御するルールとの指定に関心をもてばよい。XADは、アプリケーションをビルドして変更する単純で安価な方法を提供し、これにより、別個のソフトウェアアプリケーションニッチ(software application niche)をターゲットにすることと、新しい開発者に対する複雑さのバーを下げることとを可能にする。特許請求される発明を使用してビルドされたアプリケーションは、そのアプリケーションに流れ込むデータを集約して変換する能力だけではなく、データ型に最も適切な1つまたは複数のユーザインターフェースを選択する能力も有する。
オブジェクト2510、2512、および2514は、ビューワ、エディタ、トランスフォーマなど、明確に要素化されたコンポーネントを表す。アプリケーション記述は、「予めプログラムされた」コンポーネントを呼び出すことができ、かつ/またはセットに新しいコンポーネントを追加することができる。
オブジェクトは、明確に定義された型を有し、したがって、対応するXADタグおよびパラメータは、XAD言語における対応する型を有する。XADは、強く型付けされており、XADコンパイラは、エラーを静的に検出する。タグおよびパラメータは、戻り型およびカーディナリティ制約(cardinality constraint)を有する。さらに、データ型は、追加の制約、すなわち、スキーマ、変換要件、およびアクセッサアベイラビリティ(アクセッサは、XMLデータ用に強く型付けされたオブジェクトファサード(object facade)である)をサポートする。
XADは、単純に1つまたは複数のテキストファイルを変更することによって既存のアプリケーションを変更するか、または補強することを可能にするだけではなく、以下でより詳細に説明するように、開発者がセキュリティを保つために変更およびアドイン(既存のアプリケーションに追加できるモジュールであって、おおむねブラウザプラグインに類似するもの)を制約することと、ユーザモデルの整合性とも可能にする。
(XADアプリケーション例)
XAD、具体的にはアプリケーション記述2502などのXADアプリケーション記述のニュアンスの多くを理解してもらうために、記述例について説明する。表1に、本発明の一実施形態によるXADアプリケーション例のソースコードを示す。表1のXADアプリケーション例は、比較的単純であり、多数の他の複雑なXADアプリケーションが企図されている。実際に、表1に示された例は、「Hello World」メッセージを表示するという唯一の機能を有する。
Figure 2008544338
表1に示された例は、データを処理する、結果として生じるオブジェクトを記述するために、複数のXMLタグを含む。行1は、XMLのバージョンを識別し、行2は、以下でより詳細に説明する、XADアプリケーション記述のシステムタグを識別する。行3〜4は、XAFで使用可能なタグのいくつかのネームスペースを識別する。この説明における表1の例の主要な部分は、行8に示された「Application」タグである。アプリケーションタグは、アプリケーションを調整するアプリケーションオブジェクトのランタイムでの作成を生じさせ、最高レベルのアプリケーション機能を制御するエンティティタグの例である。同様に、行9の「Window」タグ(エンティティタグの別の例)は、ウィンドウオブジェクト、すなわち、アプリケーションのフレームを表示する役割を担うユーザインターフェースエンティティの作成を生じさせる。このケースでは、「Window」は、「Application」のパラメータである。最後に、「TextBlock」エンティティ、すなわち、行10におけるテキストタグの結果として作成される結果として生じるテキストオブジェクトは、テキスト(このケースでは「Hello World」)を表示する役割を担う、ランタイムに作成されるユーザインターフェースエンティティである。(ビルダを介して)オブジェクトを作成するためのタグの使用は、以下でより詳細に説明する。前述の例は、単に、より単純なXADアプリケーション例を示すために提供したものである。
動作中、表1に示されたXADアプリケーションは、コンパイルされて実行され、図26に全般的に示されているように、アプリケーション、ウィンドウ、およびテキストオブジェクトを作成する。すなわち、図26は、アプリケーション記述2602を示し、このアプリケーション記述2602は、本発明の特定の実施形態に従ってデータを処理するために実行されるときの、図25に示された記述2502および/または表1に示されたXADアプリケーションに類似するものである。
最初に、開発者は、アプリケーション記述2602を作成する。一実施形態において、XADファイル2602の最初のタグは、「<sys:XAD>」である。また、正しく動作させるために、コンピュータシステムは、例えばXAF SDKをインストールすることによるなど、XAFまたは任意の適切な均等物にアクセスすることができる。アプリケーション起動コマンドを発行すると、XAD2602が、自動的に検証され、一実施形態では、より効率的な形にコンパイルされる。コンパイラまたはXAFエンジン2604は、XAD2602を解析し、コンパイルされた形を実行し、これによって、必要なオブジェクトがインスタンス化される。また、エンジン2604は、オブジェクトコンポーネント(エンティティとも呼ぶ)2612、2614、2616、および2618のグラフを作成して、一緒に接続し、最終的にデータを処理するアプリケーション2606を作成する。その一方で、エンジン2604は、様々なオブジェクトを必要なデータ2608に接続する(すなわち、バインドする)。エンジン2604は、オブジェクトをインスタンス化し、オブジェクトを一緒に接続してアプリケーション2606を作成するという点で、構成サービスと考えることもできる。
アプリケーション2606は、接続されたコンポーネント2612、2614、2616、および2618のグラフである。例えば、アプリケーション2606は、1つまたは複数のデータコネクタエンティティ2612を有することができる。データコネクタエンティティ2612は、データをシステムに接続し、かつ使用可能な様々なデータストアと通信するオブジェクトを表す。別のタイプのエンティティは、UIコネクタ2614に関する。UIコネクタ2614は、ユーザインターフェースのフィーチャ(feature)を実際に処理し、かつユーザインターフェース2620と実際に通信するオブジェクトを表す。アプリケーション2606には、情報をUIコネクタに中継する前に、通常はデータの何らかの変換を提供する変換2616と、データの変更など、何らかのタイプのアクションを実行するためにデータを処理するアクション2618とがさらに含まれる。必要なコンポーネントを作成するプロセスおよびオブジェクトをデータにバインドするプロセスのさらなる詳細については、以下で説明する。
この説明から理解できるように、XAD2602で使用されるタグは、特定のオブジェクトを参照するのに使用されるのではなく、XADタグは、オブジェクトファクトリ(object factory)を参照する。オブジェクトファクトリとは、タグで指定されたパラメータを使用して1つまたは複数のエンティティをビルドするために、XADがタグビルダクラスと共に使用する記述である。エンジン2604が、そのようなオブジェクトの実際の作成を提供する。一実施形態において、エンジンは、既存の、かつ/または再利用可能なタグおよびオブジェクトの詳細を提供するコンポーネントライブラリ2622にアクセスすることができる。
その結果、アプリケーション2602は、タグを使用して定義され、アプリケーションのモジュラ式構築が可能になる。図27に、この概念によるコンポーネント間の構造的な相互関係を示す。エンティティタグ2702(表1の行8、9、および10に示されたエンティティタグなど)は、エンティティ2706に関連付けられる。ビルダ2704が、エンティティタグ2702を読み取り、マッピングする。ビルダ2704は、エンティティタグに関連付けられた1つまたは複数のオブジェクト(図示せず)をインスタンス化して接続し、エンティティタグ2702をエンティティ2706に接続する。開発者にとって、エンティティタグ2702は、エンティティタグ2702に関連するエンティティ2706に暗黙的にマッピングされるように見える。というのは、マッピング、インスタンス化、接続、および初期化をバックグラウンドで行うことができるからである。
これらの一般的な原理を念頭において、XADの詳細の一部について説明する。この言語のさらなる詳細について、本明細書に明示的に組み込まれている仕様書を、付録Aとして添付する。
(オブジェクトおよびファクトリ)
オブジェクトは、ビルダコンポーネントとすることができるファクトリを介して、またはXADのフラグメントを用いてカスタマイズされたXADエンジンを介して、インスタンス化される。ファクトリは、遅延評価または仮想化などのために、遅延インスタンス化を可能にする(即座にインスタンス化される必要がないオブジェクトのコストを節約する)。これは、「NewScope=“True”」属性を有するパラメータを介して達成される。sys:Switch構造を介する条件付きインスタンス化と共に、ファクトリは、動的なデータ依存アプリケーション構成を可能にする。XAFプラットフォームにおける依存関係管理および再検証の使用により、XADエンジンは、データが変化するときに、必要に応じてアプリケーションを自動的に再構成することが可能となる。これは、普通に記述されたアプリケーションにおいて一般的であり、かつコストが高くエラーを被りがちな、命令再構成コードの必要性をなくす。XADエンジンは、ファクトリをXAD言語で定義することを可能にし、対応するファクトリ実装を自動的に構築する。
XAD内のフレームワークタグを使用して、図25に示されたオブジェクト2510、2512、および2514など、様々なオブジェクトタイプをインスタンス化することができる。そのようなオブジェクトの1つは、データコネクタとも呼ばれる「データプロバイダ」オブジェクトに関し、データプロバイダオブジェクトは、アプリケーションが使用できるデータのソースおよび操作を表す。データプロバイダオブジェクトは、データソース(これによってアプリケーションは外部データを受信することができる)およびデータ変換(着信データに対して実行される論理演算または算術演算)に接続される。
XAD内のフレームワークタグを使用してインスタンス化することができるオブジェクトの別のタイプは、ユーザインターフェースオブジェクトである。ユーザインターフェースオブジェクトは、コントロール表示および入力処理に関連する機能を提供する。ユーザインターフェースオブジェクトは、アクションをトリガするために使用することができる(以下で説明するアクションを参照されたい)。
XAD内のフレームワークタグを使用してインスタンス化することができるオブジェクトのさらに別のタイプは、アクションである。アクションは、ユーザイベントに関するハンドルに「フック」(ユーザインターフェース要素にアタッチされる関数)を提供する。例えば、ユーザインターフェースにおけるボタンのクリックは、そのボタンに関連付けられたアクションオブジェクトをアクティブ化する。
ユーザイベントが発生するときに、対応するアクションを使用して、イベントの詳細を記憶し、渡すことができる。イベントの詳細は、メインメモリ内に、ハードドライブ上に、または他のメモリ媒体上に記憶することができる。イベントの詳細は、以下で説明する「スコープ」変数を使用して渡される。例えば、ユーザイベントがマウスクリックである場合、そのイベント時のマウスのx位置およびy位置を記憶することが意味をなす可能性がある。ユーザイベントが発生したときに記憶できる他の詳細には、どのキーが押下されたか、データ要素のリストのどのインデックスがイベント時に選択されていたか、テーブルのどの行および/または列がイベント時に選択されていたか、テーブルのどの行および/または列がイベント時にユーザに見えていたか、などが含まれるが、これらに限定されるものではない。これらのイベントの使用を介して、アプリケーション機能が実現される。
(エンティティタグ)
上記の表1に示された例から理解できるように、XADアプリケーションは、タグの使用を含む。一実施形態では、タグの1つの種類は、「エンティティタグ」である。グループ化タグまたはセレクタタグなどの他のタグについては、以下でより詳細に説明する。エンティティタグは、ランタイムに共通言語ランタイム(CLR)オブジェクトにマッピングされる。CLRオブジェクトに関する唯一の制限は、(一実施形態において、)CLRオブジェクトがXAFエンティティでなければならないことである。XAFエンティティにするために、CLRオブジェクトは、2つのベースクラス、例えば「Microsoft.Xaf.Core.BaseTypes.EntityElement」または「Microsoft.Xaf.Core.BaseTypes.EntityComposite」から派生し、XAFによって定義されるある種のプロトコルおよび契約を厳守する。
ビルダ2704(図27)は、エンティティを実際にインスタンス化する役割を担い、しばしば、「タグビルダ」または「エンティティビルダ」と呼ばれる。一実施形態において、エンティティビルダは、エンティティを作成し、かつ/またはエンティティを互いに接続する、ユーザ定義の.NETクラスである。エンティティビルダは、プリミティブXADタグを実装するのに使用される。さらに、エンティティビルダは、エンジン2604と、言語のカスタム拡張との間の相互作用のポイントであり、その結果、一実施形態では、XAD言語が、エンティティビルダを記述する要件を具体的に定義する。タグビルダまたはエンティティビルダのさらなる詳細については、本明細書に明示的に組み込まれている添付された付録Aのセクション3.5で提供されている。
例示的なエンティティタグが、上記の表1の行8、9、および10に示されている。例えば、行8には、アプリケーションエンティティタグが示されている。上述したように、このタグは、アプリケーションを調整するエンティティのインスタンス化を生じさせ、最高レベルのアプリケーション機能を制御する。ウィンドウエンティティタグ(表1の行9)は、アプリケーションのフレームを表示する役割を担うユーザインターフェースエンティティの作成を生じさせる。最後に、テキストエンティティタグ(表1の行10)は、テキスト(このケースでは「Hello World」)を表示する役割を担うユーザインターフェースエンティティの作成を生じさせる。当業者であれば、多数の他のエンティティ型を定義し、使用することができることが理解されよう。
表1に示されたアプリケーションエンティティタグ、ウィンドウエンティティタグ、またはテキストエンティティタグなどのエンティティタグを使用する前に、各エンティティタグは、例えばXAFプラットフォーム内で定義される。実際に、すべてのエンティティタグは、対応するタグ定義を有する。すべてのタグ定義は、すべてのエンティティタグをエンティティに最終的にマッピングするのに十分な情報を含む。エンティティタグは、フォームの宣言によって定義され、例えば、「Text」タグ定義は、「<sys:TagDefinition Name=“Text” ... > ...」から始まり、「</sys:TagDefinition>」で終わる。
この定義に含まれるのは、新しいタグの「名前」、例えば「Text」と、特定のエンティティタグの「型」である。エンティティタグを、様々な型に分類することができ、すべてのエンティティタグは、1つの型を有する。これらの型は、拡張可能なセットであり、実際に、タグに関連付けられたエンティティのCLR型に対応する。XAFフレームワークによって使用されるいくつかの型には、「sys:Data」、「sys:EventHandler」、「fwk:UIElement」、および「sys:Selector」が含まれる。タグがフレームワークまたはシステムのどちらに追加されるかは通常、タグが、コア言語と同一のレートで内部エンジンインターフェースおよび/またはバージョンを要するかどうかに依存する。そうである場合には、そのタグは、システムに追加されなければならず、そうでない場合にはフレームワークに追加される。型は、その定義で宣言される。上記にて示したText定義を続けると、このタグ定義は、以下の表2に示されるように拡張することができる。
Figure 2008544338
表2では、タグ定義は、Textという名前で型fwk:UIElement(エンティティのUI Element型を示すフレームワークタグ)の新しいエンティティタグを作成しなければならないことを示している。このTextタグは、その後、fwk:UIElementエンティティを呼び出せる場所であればどこでも使用することができる。Textエンティティタグの例は、表1に示されたHelloWorld.xadの例において見ることができる。
(パラメータ化)
通常、XADアプリケーション記述内の各エンティティタグは、結果として生じるオブジェクトまたはエンティティをどのように作成し、接続し、または構成するかを記述するために、いくつかのパラメータを有する。パラメータは、データへの参照、またはファクトリもしくはオブジェクトへの参照とすることができる。例えば、スコープ属性をパラメータに関連付けて、そのパラメータが、ファクトリまたはオブジェクトのどちらを参照するかを示すことができる。パラメータが、ある型のオブジェクトが適用可能であることを必要とする場合、パラメータを、型一貫性チェックのために、その型を用いてマークすることができる。そのような型チェックは、アプリケーションの実行が型不一致をもたらさないことを確実にする。この型不一致は、不正な計算を引き起こす可能性がある。
XADは、エンティティのパラメータを宣言する多数の異なる形を許容する。一般的な形を、以下の表3に示す。
Figure 2008544338
まず、「Param」は、XADの実施形態内で予約済みの名前であり、パラメータを定義するのに使用される。また、表3で省略記号によって示されているように、1つまたは複数の他のパラメータを、Textタグ定義に追加することもできる。この例では、型UI elementでTextという名前の新しいエンティティを作成しなければならない。さらに、型「Data」(より具体的には「String Data」)の「FontFamily」という名前の単一のパラメータを作成しなければならない。結果として生じるTextタグは、静的な内容の文字列、例えば、「<sys:Text FontFamily=“Arial” .../>と共に使用することができ、であり、「<sys:Text FontFamily=“Arial” .../>は、テキストをArialフォントにするものである。重要なことに、タグ定義パラメータは、そのパラメータと同一の名前を有するタグの実際のインスタンス内の属性に対応する。
代替として、タグを、他のエンティティであるパラメータをとるように定義することができ、例えば「<Text FontSize=“25”> <foo:RandomWordGenerator Param=“Text” /> </Text>」とすることができる。一実施形態において、上記の定義は、TextタグのText属性に、foo:RandomWordGenerator関数オブジェクトによって返される値を使用させ、結果として生じる値を25ポイントフォントでスクリーンにレンダリングさせる。別の実施形態では、この定義を、「<Text FontSize=“25”> <Text.Text> <foo:RandomWordGenerator /> </Text.Text> </Text>」と書くことができる。後者の定義は、Textエンティティをインスタンス化し、そのText属性をfoo:RandomWordGeneratorの値として定義する。
一実施形態では、パラメータ自体に、複数のそれ自体のエンティティを含めることができる。表4に、パラメータを設定するコード部分例を示す。
Figure 2008544338
表4に示されたコード(行1)は、FlowPanelという名前のUI Elementを定義し、複数のパラメータを有し、したがって、UI要素のフローの表示を生じさせる。表示されるUI要素のセットは、表4(行2)で定義される「Children」という名前の単一のパラメータを介して指定することができる。すなわち、行2は、行1で定義されたフローパネルを呼び出す/記述するアプリケーション記述を示す。
1つのデフォルトパラメータを、XAD内のエンティティごとに指定することができる。表5に、名前が「Children」であるデフォルトパラメータを定義するコードの行の例を示す。パラメータ名が子タグで指定されない場合、子は、DefaultParam属性に「true」が設定されたパラメータに関連付けられる。
Figure 2008544338
(データバインディング)
一実施形態において、XADは、データバインディング(XMLデータの、特にそのデータ用に設計されたオブジェクトへのバインディング)を利用する。したがって、オブジェクトの名前を、データを参照するのに、より具体的にはパラメータを指定するときに、使用することができる。静的な値(定義により、アプリケーションの有効期間の間は一定のままである)と異なって、データバインドされた値を、そのデータバインドされた値の関連するデータの変更を介して更新することができる。一実施形態では、アプリケーションによって、この変更を実行することができる。別の実施形態では、ユーザまたは外部プロセスによって、この変更を実行することができる。例示的な実施形態では、行「<Text Text=“$TextValue” FontSize=“25” />」が、Textパラメータに「$TextValue」の値を割り当てさせる。この実施形態では、「$」が、予約済みの文字であり、この形でのこの文字の使用は、コンポーネントの作成中および接続中に、データバインディングを呼び出す。そのようなデータバインディングは、別のソースまたはオブジェクトからのデータの間接ポインティングまたは間接関連付けを、このエンティティタグにバインドさせる。
データバインディングを使用して、リテラルデータを参照することができる。すなわち、sys:InlineDataタグを使用して、リテラルデータを指定することができる。例えば、「<sys:InlineData Name=“TextValue”>Hello World</sys:InlineData>」は、インラインデータ、すなわち、文字列「Hello World」を定義する。この例示的なリテラルデータタグには、名前TextValueが与えられる。その結果、XAD記述で名前$TextValueを使用することによって、XADコードは、リテラルデータタグ内のデータにバインドすることができ、これを型sys:Dataの任意のパラメータの値に使用することができる。
データバインディングを使用して、相対的なデータ位置を参照することもできる。例えば、<Text Text=“$SomeLocation/myd:Employees/myd:Employee/myd:Name” />は、動的なプレフィックス、すなわち、「$SomeLocation」と、これに続くデータ参照、すなわち「$」文字を使用しない「myd:Employees」、「myd:Employee」、および「myd:Name」を使用する。その結果は、所与の相対的な位置が追加された$SomeLocationの値から形成される絶対的な位置へのデータバインディングである。
さらに、データバインディングをグループ化タグと共に使用することができる。例えば、表6のコード例(行1)は、MergeTreesTransformエンティティをResourcesグループ化タグの下にあるエンティティのセットにバインドする。
Figure 2008544338
表6(行2)は、XADがデータ値へのバインディングを可能にすることを示している。例えば、次の定義は、アクションを$ScratchDataの値にバインドする。この定義の下では、$ScratchDataの初期値は「Bye」である。「MouseLeftButtonDown」は、型「sys:EventHandler」のパラメータである。「MouseLeftButtonDown」パラメータに対応するアクションは、Textエンティティが左マウスボタンダウンイベントに出会うときに必ず呼び出される。このイベントは、SetTextValueActionを呼び出させ、これによって、<Greeting>要素のテキスト値が「Caio」に変更される。同様に、右マウスボタンダウンイベントは、$ScratchDataの値が「Au Revoir」に変化することをもたらす。
さらに別の例では、データバインディングは、アプリケーションがコマンドラインパラメータを受け取ることを可能にする。例えば、表7のコード例は、コマンドラインパラメータの指定を可能にする。sys:Mainタグは、アプリケーションのエントリポイントである。
Figure 2008544338
表7において定義されたアプリケーションは、「xad CommandLine.xad /TextData=Testing」などのコマンドラインパラメータを受け入れる。ここで、CommandLine.xadはアプリケーションの名前であり、TextDataはパラメータ名であり、Testingは値である。一実施形態では、「xad ApplicationName /ParamName1=Value1 /ParamName2=Value2 ... /ParamNamen=Valuen」の形で、複数のパラメータをXADに渡すことができる。当業者であれば、上記の例示的な実施形態では、入力値として文字列を使用するが、コマンドラインパラメータには、その代わりに、またはそれに加えて、英数字値、ファイルの名前、画像または他のリソース位置などを含めることができることが理解されよう。また、パラメータについてコマンドラインパラメータ値が指定されない場合に使用されるデフォルト値を、コマンドラインパラメータに与えることができる。
(データソースタグ)
一実施形態において、外部データが、DataSourceタグによってXADアプリケーションに公開される。さらに、XmlFileDataSourceタグを使用して、アプリケーションとXMLファイルとの間で接続を確立することができ、その結果、アプリケーションによって、XMLファイルをデータソースとして使用できるようになる。外部データソースは、sys:InlineDataタグによって提供されるインラインデータに類似した形で使用することができる。しかし、外部データソースは、XADアクションを使用してディスクに保存することができ、したがって、必要に応じて、アプリケーションは、他のユーザによるデータに対する変更を使用することができる。
(派生タグ定義)
XADは、抽象化および定義の再利用を利用するための派生タグ定義の使用を可能にする。例えば、一連の12ポイントVerdanaフォント見出しを必要とするアプリケーションにおいて、ユーザは、見出しが望まれる各位置に、「<Text FontFamily=“Verdana” FontSize=“12” Text=“heading text here” />」などの定義を配置することができる。しかし、それぞれが異なる可能性がある数百個または数千個の見出しが必要な場合には、派生タグ定義が、指定による、より高い効率を可能にする。より具体的には、派生タグ定義を定義することができ、派生タグ定義の例を、表8に示す。
Figure 2008544338
表8に示された定義は、XADに、型fwk:UIElementのTitleTextという名前の新しいタグを作成させる。このタグ内のTextパラメータは、$Textについて渡される値にバインドされ、これは、見出しのインスタンス化ごとに異なるように渡すことができる。
別の例として、表9に示された以下の例を検討する。この例では、第1行は、XADのスニペット例であり、第2行は、XADのスニペットを置換する派生タグ定義例を示し、第3行は、派生タグ定義を使用するインスタンス化呼び出しを示す。
Figure 2008544338
表9に示されているように、派生タグは、同一項目を複数回呼び出すか、またはインスタンス化する際の機能性および単純さを向上させることができる。
(スコープパラメータおよびニュースコープパラメータ)
スコープパラメータは、特にエンティティの遅延インスタンス化および/または繰り返されるインスタンス化のための、変化する有効期間のオブジェクトのサブグラフに関する定義された境界を提供する。ファクトリは、インスタンス化を遅延させ、後に呼び出す手段である。スコープ変数は、インスタンス化を呼び出すエンティティによって提供されるパラメータである値を提供する。スコープ変数の使用の1つの例は、マウスボタンダウンイベントなどの様々なイベントプロパティの受信を可能にすることである。
XADは、ニュースコープパラメータを使用して、アプリケーションコンポーネント間、オブジェクト間、および/またはその組合せの間でデータを渡す。一実施形態において、親コンポーネントがニュースコープパラメータを使用して、新たに作成される子コンポーネントにパラメータを渡すことができる。したがって、XADは、ユーザがコード再利用を活用することを可能にする。一実施形態において、各リストエントリ内のデータへの参照を含むリストエンティティが構築される。単一のリストエンティティについて何を行うべきかを定義する同一のパラメータが、新しい各リストエンティティに適用され、単一のパラメータまたはパラメータのセットを使用して、任意に大きいエントリリストを作成することが可能になる。さらに、親オブジェクトと子オブジェクトとの間におけるパラメータの受け渡しを、同様に最適化することができる。例えば、親オブジェクトは、ニュースコープパラメータを介して、リストインデックスを子オブジェクトに渡すことができ、このリストインデックスは、子に渡されたリスト要素に対応する。
ニュースコープを導入するパラメータは、「NewScope」属性にtrueが設定される。例えば、行「<sys:Param Name=“...” NewScope=“true” .../>」は通常、新しい属性にtrueを設定するのに使用される。ニュースコープパラメータは、スコープ内の1つまたは複数の変数を導入するのに使用することができる。変数は、暗黙的に宣言されるパラメータである。変数は、表10(行1)において提供される例で見ることができるように、ニュースコープパラメータの宣言と共に宣言される。上述したように、ニュースコープは、複数回インスタンス化されなければならないすべてのエンティティについて導入される。表10(行2)に、そのようなファクトリの定義を示す。
Figure 2008544338
上記の例(表10、行2)では、RepeatedChildパラメータによって導入されるスコープが、DataContextという名前のスコープ変数を有する。この変数には、インスタンス化されるサブビューに対応する項目が設定される。上記の定義は、List.xmlが表11(行2)に示されたXMLを含むものと仮定して、表11(行1)に示されるように適用される。
Figure 2008544338
表11に示された例では、リスト項目ごとに、FlowPanelエンティティが、対応するTextエンティティを作成する。結果として生じるFlowpanelエンティティは、EmployeeA〜Hのリストをモニタに表示する。当業者であれば、各行が1つのTextエンティティのインスタンス化に対応することが理解されよう。あるインスタンス化と次のインスタンス化との間で変化するものは、「DataContext」スコープ変数の値である。結果として生じるパターンは、リピータパターンと呼ばれる。これは、XADにおけるデータセットに対する反復の基礎である。一実施形態では、多次元反復のために、リピータパターンをネストすることができる。
(アタッチドパラメータ)
アタッチドパラメータ(attached parameter)は、親オブジェクトによって子に関連付けられるパラメータであって、子が処理する方法を知らない可能性があるパラメータである。例えば、親「drawing」オブジェクトの子である「triangle」オブジェクトは、「位置」座標をどのように扱うべきかを具体的に知らない場合がある。というのは、位置座標は、図面内の全般的な位置に関連するもので、三角形などの形状に具体的には関連しないからである。アタッチドパラメータは、親オブジェクトが、子オブジェクトに関連付けられたデータおよび/または機能にアクセスすることを可能にする。XADは、親オブジェクトにおけるこのパラメータの定義に基づいて、正しい使用法についてアタッチドパラメータをチェックする。表12(行1)に、例示的なタグ定義を示す。
Figure 2008544338
表12(行1)のXADコード定義は、DockPanelと呼ばれるエンティティを定義し、このDockPanelは、「DockPanel.Dock」として参照できる、「Dock」と呼ばれるアタッチドパラメータを含む。表12(行2)に、DockPanelエンティティを使用する例示的なXADコードを示す。
表12に示されているように、DockPanel.Dockは、必ずしもTextエンティティのタグ定義で指定されるパラメータのうちの1つではないが、DockPanel.Dockは、Textエンティティの各々に対する属性として指定される。DockPanel.Dockは、アタッチドパラメータであるので、Textエンティティと共に使用されるが、実際には、表12(行1)に示されたDockPanelエンティティの宣言において定義される。
(リソースパラメータ)
別のタイプのパラメータは、リソースパラメータである。リソースパラメータは、オブジェクト階層内に論理位置を有さないオブジェクトを記憶する場所を提供する。リソースパラメータは、所与のエンティティの下で、任意のエンティティのセットをアンカリングするのに使用することができる。リソースパラメータに関連付けられたアクションおよび状態は、アプリケーション全体を通じて使用することができる。例示的なリソースパラメータの定義を、表13に示す。
Figure 2008544338
上述したように、XADのデータバインディング機能を介して、UI要素を、状態および/またはアクションにバインドすることができる。
(構造体)
XADでは、「構造体」は、1つの名前として渡すことができるエンティティのグループである。XADの構造体はネストすることもできる。構造体およびネストされた構造体の例を、表14に示す。
Figure 2008544338
この例では、$ActionsAndData.Actions.Printバインディングおよび$ActionsAndData.Actions.Saveバインディングは、型sys:EventHandlerのすべてのパラメータについて有効である。同様に、$ActionsAndData.RecentDocuments、$ActionsAndData.Preferences.User、および$ActionsAndData.Preferences.Enterpriseは、型sys:Dataのすべてのパラメータについて有効である。$ActionsAndDataは、Signature app:ActionsAndDataSignatureのすべてのパラメータについて有効である。$ActionsAndData.Actionsは、Signature app:ActionsSignatureのすべてのパラメータについて有効である。最後に、$ActionsAndData.Preferencesは、Signature app:PreferencesSignaturesのすべてのパラメータについて有効である。
(マニフェスト)
一実施形態において、XADは、「Manifest」を使用して、アプリケーション記述など、アプリケーションの諸部分を一緒にまとめる。マニフェストは、アプリケーションの諸態様、例えば、どのファイルがアプリケーションによって必要とされるか、どの依存関係がオブジェクト間に存在するか、およびどのユーザ環境固有データがアプリケーションの一部であるか(アプリケーションが操作するデータではなく、ユーザのネイティブ言語でのユーザインターフェース要素テキスト、アイコンなど)を記述する、コンピュータによって処理できる仕様である。
(ビルトインタグ)
ビルトインタグ(built-in tag)とは、予め定義され、重要な機能をXAD開発者に提供するタグである。通常、ビルトインタグには、「sys:」プレフィックスが付けられる。例えば、これらのビルトインタグは、条件付き動作、繰り返し動作、およびオブジェクトの作成を可能にする。そのようなタイプのビルトインタグの1つは、「ダイナミックエンティティ」タグと呼ばれ、このタグは、データ記述内で、使用されるオブジェクトの型を変更するのに使用することができる。これは、スクリーンにおけるオブジェクトの構成のリアルタイム変更を可能にする。例えば、ユーザが所与のユーザインターフェース要素を選択することに応答して、要素の機能および/または目的をリアルタイムで変更することができる。例えば、ある出力ウィンドウは、「次のアプリケーションビューへのサイクル」というユーザコマンドの受信に基づいて任意に多数の異なるアプリケーションビューからの出力を表示するのに使用することができる。一実施形態において、ダイナミックエンティティタグは、次の表15に示されているように、タグ名による動的なエンティティのインスタンス化を提供する。
Figure 2008544338
表15に示された例では、ビルトインエンティティ「Dynamic Entity」が、エンティティを動的に定義する能力を開発者に提供する。このケースでは、$DateTagがローカル名を解決する。
「スイッチエンティティ」タグと呼ばれる別のタイプのビルトインタグは、オブジェクトまたは複数の関連するオブジェクトの条件付き構築によって、アプリケーションを動的に再構成することを可能にする。XADは、宣言言語ではあるが、エンティティの条件付き構築を可能にするのに十分な表現力がある。単一の構造すなわちSwitchが、条件付き構築を可能にするために提供される。スイッチエンティティタグは、「cases」タグまたは「conditions」タグによってパラメータ化することができる。Caseは、C#のswitchに類似するものと考えることができ、Conditionsは、C#のif−else節のセットに類似する。一実施形態では、CasesおよびConditionsの使用が、相互に排他的であり、これは、Switchが、その本体内でCasesおよびConditionsを混合できないことを意味する。さらに、この実施形態では、Casesは、SwitchがそのDataパラメータの値を指定する場合に限り使用することができ、そうでない場合にはConditionsを使用しなければならない。
Switchを使用することによって、作成者は、スイッチを評価した結果として、1つまたは多数のエンティティを条件付きで返せるようになる。表16に、いくつかのXADデータ例(行1)と、条件付きスイッチの使用例(行2および3)とを示す。
Figure 2008544338
表16の行2は、50.00ドルを超える値に基づいてエンティティを作成する、一実施形態での構文を示すことが理解されよう。表16の行3は、この例を進めて、他の条件付きテストについてテキストブロックエンティティを示している。結果として生じるビューは、行1のすべての要素項目、すなわち、「Toaster」、「VCR」、「DVD Player」、「Receiver」、および「Sub−woofer」を表示する。しかし、「Toaster」は、Georgia太字フォントであり、緑色であるが、「Receiver」は、Arial太字フォントであり、赤色である。
スイッチは、依存関係追跡および再検証と共に、動的な再構成の自動実施を可能にする。動的な再構成については、以下でより詳細に説明する。
(フレームワークタグ)
XADおよびXAFは、フレームワークタグ(「fwk」と省略する)と呼ばれる別のタイプのタグを可能にする。フレームワークタグは、アプリケーションの一部であるオブジェクトを作成するのに使用することができる。フレームワークタグは、アクション、データソース、変換、および関連付けマネージャ(それぞれについて以下で説明する)を参照するのに使用することができる。一実施形態では、アプリケーションデバッギングも、フレームワークタグを介して実行することができる。
最も単純なレベルで、UIコネクタは、XAFデータを可視化し、かつそのデータを変更するイベントに応答する能力を提供する。任意の1つの特定のUIコネクタは、実際には、「要素ツリー」、すなわち、表示でき、かつそのUIコネクタが提示しているビジュアル要素のセットを有する。各UIコネクタには、データをビジュアル要素に変換するコードと、イベントを編集動作に変換するコードとが関連付けられる。
一実施形態において、UIコネクタは、Windows(登録商標) Presentation Foundation(WPF)要素などのクライアントプラットフォームのプロパティおよびイベントを単純に公開する。さらに、UIコネクタは、XAFデータレイヤからのデータをWPF要素にバインドする特定の形のデータバインディングを提供する。様々な要素が、様々な型のデータを可視化するために設計される。例えば、Image要素は、ビットマップ表示データを可視化し、Text要素は、文字列データを可視化し、ListBoxは、おそらくは異種であるデータの順序付きリストを可視化する。ListBoxおよびTextBoxなど、いくつかの要素は、データに対する「選択」も可視化することができる。選択という概念は、基本的に、別のデータ入力である。
一般に、特定のUIコネクタは、可視化される特定の型のデータを処理するように設計される。2つの要素が、それらが可視化するものに関する入力(またはパラメータ)を受け入れるのに正確に同一の機構を使用する場合、開発者は、その両方を処理するために単一のUIコネクタを記述することができる。パラメータは、UIコネクタにファクトリオブジェクトを提供するのに使用され、このファクトリオブジェクトは、必要に応じて子を作成するのに使用される。UIコネクタは通常、データコンテキストをファクトリに提供する。ファクトリは通常、XADエンジンによってオブジェクト内にラップされる、XADのフラグメントである。表17に、提供され得るUIコネクタのセットを示す。
Figure 2008544338
フレームワークタグの1つのタイプである関連付けマネージャは、オブジェクトをデータ構造体またはデータ構造体の要素に関連付けるのに使用することができる。例えば、リスト関連付けマネージャを使用して、オブジェクトをリスト内の項目に関連付けることができる。結果として生じるリスト項目は、静的な値ではなく、オブジェクトへの参照と、それに関連するデータとを含むという点で、動的である。
(動作時)
図28に、オブジェクトが使用のために作成されセットアップされる、本発明の一実施形態によるビルダによって実行される動作の動作フローを示す。インスタンス化プロセス2800は、作成動作2802から始まり、初期化動作2806で終わる動作フローを使用して実行される。一般に、フロー2800は、単一の構成サービスによって、または複数のサービスによって実行することができる。
作成動作2802において、オブジェクトを作成する。一実施形態では、作成動作2802において、オブジェクトに必要なデータ構造体を作成する。別の実施形態では、作成動作2802において、データ構造体に必要なメモリも割り当てる。
作成動作2802においてオブジェクトを作成すると、接続動作2804において、他のオブジェクトに対するそのオブジェクトの関係性に従って、そのオブジェクトを他のオブジェクトに接続する。一実施形態では、作成されたオブジェクトと、1つまたは複数の先在するオブジェクトとの間の接続のグラフを構築する。作成−接続−初期化シーケンスは、XADエンジンが、オブジェクトのグループ間のサイクル接続(cyclic connection)をサポートすることを可能にする。データおよび変換の場合に、そのようなサイクルは禁止され、XADコンパイラは、そのようなサイクルを防ぐために、何らかのチェックを実行する。
接続動作2804において作成された接続グラフは、オブジェクト間の相互接続および相互関係を定義する。一実施形態において、これらの接続は、動的な再構成(以下で説明する)によって変更されるまで、またはオブジェクトが消去されるまで、そのままの状態にある。どの接続が必要であるかは、エンジンによって、そのエンジンがアプリケーションマークアップコードを実行するときに判定される。一実施形態では、接続動作2804において、データプロバイダオブジェクトをアプリケーションに接続する。
初期化動作2806において、作成されたオブジェクトを初期化する。一実施形態において、初期化は、1つまたは複数の非決定値に、0または他の予め定義された値を設定することを含む。別の実施形態では、初期化動作2806において、オブジェクトに関連付けられたコンストラクタを呼び出す。さらに別の実施形態では、初期化動作2806において、作成されたオブジェクトに、それ自体を初期化するよう指示する。当業者であれば、本発明の範囲から逸脱することなく、初期化動作2806において、通常はオブジェクト初期化に関連する他の動作を実行することもできることが理解されよう。一実施形態において、初期化動作2806は、所与のオブジェクトが初期化されなければならないデータを含むかどうかに基づいて、条件付きで行われる。一実施形態では、条件に応じて様々な値を用いて、オブジェクトを初期化することができる。例えば、表18に示された次の定義は、XADに、500ドルを超える価格が設定されている場合には赤でリスト内の項目を表示させ、100ドル未満の価格が設定されている場合には緑で項目を表示させる。
Figure 2008544338
一実施形態において、エンジンは、ジャストインタイムコンパイルを使用して、動作2802、2804、および2806を実行する。別の実施形態では、アプリケーションは、予めコンパイルされている。さらに別の実施形態では、事前コンパイルおよびジャストインタイムコンパイルの組合せを使用して、性能と柔軟性とのバランスを実現する。
XADは、アプリケーションを動的に再構成することを可能にする。動的な再構成は、アプリケーションに流れ込むデータの変化によって、またはアプリケーションを用いる既存のデータの変更によって、トリガすることができる。図29に、XADの一実施形態において、アプリケーションをどのように動的に再構成できるかを示す。
リスナ(listener)は、ある種のイベントについてアプリケーションまたはアプリケーションのグループを監視するコンピュータエージェントである。XADリスナは、値の変化についてXADアプリケーション内のある種の登録されたオブジェクトのデータを監視する。登録動作2902において、オブジェクトおよびそのデータをそのようなリスナに登録する。
登録されたオブジェクト内でデータ値の変化が発生するときに、受信動作2904において、変更通知がリスナから受信される。次に、マーク動作2906において、変化した値に依拠する1つまたは複数のデータ値を識別し、その変化によって影響が及ぼされるものとして、これらをマークする。分析動作2908において、マークされたデータ値の各々に対する変化した値の影響を分析する。この分析の結果に基づいて、判定動作2910において、変化した値によってオブジェクトが無効にされたかどうかを判定する。
1つまたは複数のオブジェクトが、変化によって無効にされた場合、フローは、YESから除去動作2912に分岐し、除去動作2912において、1つまたは複数の現在は無効なオブジェクトを除去する。次いで、フローは、判定動作2914に分岐する。判定動作2910において、どのオブジェクトも変化によって無効にされなかったと判定された場合、フローは、NOから判定動作2914に分岐する。
判定動作2914において、変化した値の結果として、新しいオブジェクトが必要であるかどうかを判定する。1つまたは複数の新しいオブジェクトが必要である場合、フローは、YESから作成動作2802(図28)に分岐し、図28を参照して上述したように、オブジェクトの作成、接続、および初期化が進行する。判定動作2914において、新しいオブジェクトが必要ではないと判定された場合、フローは、NOからこの例示的なフローの終わりに分岐する。
新しいオブジェクトの作成および無効なオブジェクトの削除を単純にするために、XADは、オブジェクトの有効期間を管理することができる。有効期間ドメインは、XADアプリケーション内の再構成のユニットである。有効期間が互いに結び付けられているオブジェクト(例えば、第1のオブジェクトは、第2のオブジェクトが存在しなければ意味がない場合があり、第2のオブジェクトは、第1のオブジェクトが存在しなければ意味がない場合がある)は、同一の有効期間ドメインに配置される。所与の有効期間ドメインに多数のオブジェクトを配置することができる。オブジェクトがもはや必要なくなったときには、(おそらくは、削除のために有効期間ドメイン内の何千個もの別々のオブジェクトを参照するのではなく、)削除のために有効期間ドメインを参照することによって、有効期間ドメイン内のすべてのオブジェクトを簡単に削除することができる。当業者であれば、所与の有効期間ドメイン内のオブジェクトは、機能的に関連する必要はなく、同時に削除できるように、作成時刻および共通の依存関係を共有することだけが必要であることが理解されよう。
一実施形態において、XADは、アプリケーションの動的な再構成と共に、条件付きで作成されるオブジェクトを利用することができる。したがって、データ値変化の特性に応じて、様々な型のオブジェクトを作成することができる。図30に、本発明の一実施形態による、作成動作2802(図28)によって実行される動作の動作フローを示す。まず、判定動作3002において、インスタンス化すべきタグがあるかどうかを判定する。インスタンス化すべきタグがある場合、フローは、YESから判定動作3004に分岐する。インスタンス化すべきタグがない場合、またはすべてのタグが既にインスタンス化されている場合、フローは、NOから接続動作2804(図28)に分岐する。
判定動作3004において、インスタンス化する必要があるパラメータがタグに含まれるかどうかを判定する。パラメータタグが存在しない場合、フローは、NOから動作3008に分岐する。パラメータタグが存在する場合、フローは、YESからインスタンス化動作3006に分岐する。
インスタンス化動作3006において、判定動作3004において見つけられたパラメータをインスタンス化する。上述したように、パラメータは、ファクトリまたはオブジェクトをどのように作成し、接続し、または構成するかを記述するのに使用される。前述したように、パラメータには、ファクトリもしくはオブジェクトの1つまたは複数のプロパティ、データへの参照、あるいは別のファクトリもしくはオブジェクトへの参照を含めることができる。プロパティは、静的なものであっても、動的なものであってもよい。
処理動作3010において、データ型に従ってタグを処理する。複数の異なる種類のタグが存在し、したがって、複数の可能な手法が、処理動作3010において実装される。プリミティブタグ(オブジェクトに実際に対応するタグ)は、新しいオブジェクトを作成することによって処理される。一実施形態では、作成されるすべてのオブジェクトが、エンティティに対応する。
一部のタグは、スコープ境界を定義する。そのようなタグは、処理動作3010に「ファクトリ」を作成させ、このファクトリは、エンティティのオンデマンドインスタンス化のために、後で呼び出すことができる。ファクトリが処理されるときには、新しいスコープドメインが作成される。依存関係情報のために、エンティティによって、ファクトリをチェックすることができる。これは、動的な再構成中に有用である可能性がある。
処理動作3010は、スイッチファクトリを作成することによって、スイッチタグを処理する。これは、様々なユーザ指定条件に基づくアプリケーション制御の分岐をサポートするファクトリである。このファクトリは、様々な条件を監視するのに使用することができ、それらの条件が満たされたときに、アプリケーションフロー内の分岐がトリガされる。一実施形態では、ジャストインタイムコンパイルを使用して、動的な再構成の一部としてタグが再処理されることによって必要になったときに、オブジェクトを変更する。
処理動作3010では、他のタイプのタグを処理することもできる。例えば、バインディングタグは、処理動作3010をトリガして、ある種のパラメータ値が実際には何らかの他のエンティティへの参照であることを示すために、ファクトリを作成する。これは、おおむね、手続き型言語のポインタに類似している。ダイナミックエンティティタグは、作成されるエンティティを遅れてバインドすることを可能にする。一実施形態において、遅れてバインドすることは、アプリケーションのランタイムまで遅延される。
処理動作3010においてタグを処理した後に、フローは、判定動作3002に戻る。
一実施形態では、アドインを、XADアプリケーションに追加することができる。アドインは、アプリケーションのアップグレードを必要とせずに、所与のアプリケーションの基本機能セットを拡張できる、内蔵型の(self-contained)ソフトウェアパッケージである。アドインは、ユーザが高価と考えられるアップグレードサイクルを全部行うことを必要とせずに、新しい機能またはサードパーティの拡張機能が使用可能になったときに、これらの機能を増分的に追加することを可能にする。
XADアドインは、アセンブリとしてパッケージ化される。一実施形態において、アセンブリは、(上述した)マニフェストにおいて指定される静的な依存関係を介してロードされる。一実施形態において、XADアプリケーションは、拡張性プロトコル(extensibility protocol)を介してアドインと通信する。拡張性プロトコルは、別々のアセンブリ内で定義することができ、その結果、このプロトコルは、公開することができ、アプリケーションと、拡張機能を開発するサードパーティとの両方によって参照できるようになる。
拡張性プロトコルは、2つの部分を有する。第1の部分は、メタデータスキーマである。メタデータとは、データを記述するデータである。XADのコンテキストでは、メタデータを使用して、アドインによって実装される機能を記述することができる。メタデータには、タグ名、渡されるパラメータ、UIで人間が読み取り可能なテキストなどを含めることができる。拡張可能アプリケーションは、メタデータスキーマ(アドインに何を期待するか)を定義し、アドインは、そのコンテンツを提供する。拡張性プロトコルの第2の部分は、(上述した)タグシグネチャである。アドインは、タグを定義することによってその機能を実装する。アプリケーションは、これらのタグを使用して、アドイン機能にアクセスする。アプリケーションは、タグシグネチャ(タグがどのタイプのエンティティをもたらさなければならないか、タグがどのパラメータをとらなければならないか、など)を定義し、アドインは、タグ定義(タグ名および実際の実装)を提供する。したがって、タグシグネチャは、おおむね、インターフェースに類似するものであり、タグ定義は、おおむね、インターフェース実装に類似するものである。
一実施形態において、XADは、Metadataタグを介してアクセス可能なグローバルメタデータツリーをサポートする。メタデータツリーは、すべての動的にロードされるアセンブリからのすべてのメタデータ構成要素ファイルの結合である。メタデータツリーは、メタデータ構成要素ファイルを伴うアセンブリがロードされるか、またはアンロードされるときに、ランタイムに、必ず自動的に更新される。正しい変更通知が送信されるので、(図29を参照して前述したように、)アプリケーションは、それ自体を動的に更新することができる。メタデータツリーは、アプリケーションが、どのアドインがロードされているかを発見し、アドインが提供する機能を利用することを可能にする。
一実施形態において、アドインは、そのアドインが実装する機能にアクセスするためのタグを定義する。アドインは、アプリケーションが記述されるときには使用可能でない場合があるので、アプリケーション作成者がアドインによって定義されたタグを認識して使用することが可能でない場合がある。作成者は、タグシグネチャを認識することだけができ、したがって、タグシグネチャを静的に定義することだけができる。実際のタグ名および最終的なパラメータ値は、アドインによって、メタデータを使用して提供することができる。メタデータ方式は、アプリケーション定義の拡張性プロトコルの一部であるので、メタデータ方式情報は、アプリケーションからアクセス可能である。したがって、アプリケーションは、メタデータを読み取ることができ、タグ名によってエンティティを動的にインスタンス化することができる。XADは、この目的のためにDynamicEntityタグをサポートする。
本発明について、構造的特徴、方法論的動作、およびそのような動作を含むコンピュータ読み取り可能な媒体に固有の言葉で説明したが、特許請求の範囲で定義される本発明は、説明した特定の構造、動作、または媒体に必ずしも限定されないことを理解されたい。当業者であれば、本発明の趣旨および範囲に含まれる他の実施形態および改善が認識されよう。したがって、特定の構造、動作、または媒体は、特許請求される発明を実施する例示的な実施形態として開示されたものである。本発明は、特許請求の範囲によって定義されるものである。






付録A
目次
概要 エラー!ブックマーク未定義
目次
1. 序論
1.1 XAFの原理
1.2 XADの目標
1.3 XAFアプリケーションの構造およびXADの役割
1.4 仕様書の構成
1.5 仕様の規約
2. 言語の概念
2.1 Hello Worldの例
2.2 大文字小文字の区別
2.3 エンティティタグ
2.4 エンティティの基本的なパラメータ化
2.4.1 静的文字列を用いるパラメータ化
2.4.2 単一のエンティティを用いるパラメータ化
2.4.3 エンティティのセットを用いるパラメータ化
2.4.4 Resources
2.4.5 デフォルトパラメータ
2.4.6 アタッチドパラメータ
2.4.7 インラインデータ
2.5 バインディングを介するパラメータ化
2.5.1 タグの命名
2.5.2 エンティティへのバインディング
2.5.3 グループ化タグへのバインディング
2.5.4 タグ定義の仮パラメータへのバインディング
2.5.5 編集を可能にするためのバインディングの使用
2.6 Mainタグ
2.6.1 自動投入されるParam値
2.6.2 コマンドラインパラメータ化
2.7 無視されるブロック
2.8 アウトパラメータ
2.9 ホワイトスペース
2.10 構造体
2.10.1 単一レベルの構造体
2.10.2 ネストされた構造体
2.11 スタイル
2.11.1 デフォルト指定のためのスタイル
2.11.2 Avalonのビジュアルツリーのスタイル指定
2.11.3 スタイル指定およびビジュアルトリガ
2.12 スコープ付きパラメータ
2.12.1 スコープ変数
2.12.2 リピータパターン
2.12.3 スコープに関連するバインディングの制限
2.12.4 ネストされたリピータパターン
2.13 パラメータ継承
2.13.1 制限
2.14 条件付きパラメータ化
2.14.1 Cases
2.14.2 Conditions
2.14.3 SwitchEntity
2.14.4 SwitchEntities
2.14.5 全般
2.14.6 セレクタおよびタグ定義
2.15 関連付け
2.16 タグドキュメンテーション
3. 形式的言語仕様
3.1 ブール属性
3.2 修飾名
3.3 キーワード
3.3.1 <Xad>
3.3.2 <Doc>
3.3.3 <Description>
3.3.4 <Type>
3.3.5 <TagDefinition>
3.3.6 <Signature>
3.3.7 <ParamGroup>(<Xad>の下の)
3.3.8 <Const>
3.3.9 <Param>
3.3.10 <OutParam>
3.3.11 <ParamGroup>(<Choice>の下の)
3.3.12 <ParamGroupRef>
3.3.13 <Choice>
3.3.14 <ParamDefaultValue>
3.3.15 <ConstDefaultValue>
3.3.16 <Entity>
3.3.17 <Function>
3.3.18 <Body>
3.3.19 <ScopeVariable>
3.3.20 <AttachedParam>
3.4 ビルトインエンティティ
3.4.1 <InlineData>
3.4.2 <Binding>
3.4.3 <XPath>
3.4.4 <Mapping>
3.4.5 <DynamicEntity>
3.4.6 <AssociatedEntity>
3.4.7 <AssociatedDataEntities>
3.4.8 <SwitchEntity>
3.4.9 <SwitchEntities>
3.4.10 <Case>
3.4.11 <Condition>
3.5 エンティティビルダ
3.6 アクション
4. 共通のフレームワークエンティティ
5. デプロイメントモデル
5.1 XADアプリケーション
5.2 XADアセンブリ
5.3 アセンブリマニフェスト
5.3.1 マニフェストタグ
5.3.7 マニフェストの例
5.4 アセンブリの依存関係
5.5 アセンブリのバインディング、ロードおよびアンロード
5.6 パッケージングのシナリオ
5.6.1 1ファイルアプリケーション
5.6.2 派生タグのライブラリ
5.6.3 プリミティブタグのライブラリ
6. アドインモデル
6.1 アドインモデルとは何か?
6.2 XADアドインモデル
6.2.1 アセンブリの動的ロード
6.2.3 メタデータ駆動型の拡張性プロトコル
6.2.4 動的なエンティティのインスタンス化
6.3 アドインのシナリオ
6.3.1 FileExtensionProtocolアセンブリ
6.3.2 Fileアセンブリ
6.3.3 SmartFilesAddInアセンブリ
7. 付録A:コーディング規約
7.1 Systemネームスペースの「sys」プレフィックス
7.2 名前のPascal式大文字小文字の区別
7.3 シグネチャ名は「Signature」で終わらなければならない
7.4 「Set」パラメータの名前は「s」で終わらなければならない
7.5 「単一の」エンティティタグの名前は「s」で終わってはならない
7.6 セレクタタグの名前は「Selector」で終わらなければ
ならない
7.7 パラメータ(指定される場合)はエンティティの最初の属性で
なければならない
7.8 名前(指定される場合)はパラメータ(指定される場合)の後の
エンティティの最初の属性でなければならない


















(序論)
XAD(XAFアプリケーション定義)は、XAFアプリケーションを作成するのに使用される宣言言語である。XADのUIコンポジション態様は、可能な場合には必ずXAMLと同一である。XADによってサポートされる追加の機能は、ほとんどが、XAFプラットフォームのデータバインディング機能を指向するものである。XADは、複数のフォーマットを使用して表現することができるが、その主要な表現は、Xmlである。これにより、XAMLとの強い調和が可能となる。Xmlを使用することの別の利点は、XADパーサならびにXAD開発ツールが、XAFのネイティブデータ表現(Xml)を直接的に扱えることである。XADは、XAD開発者が明示的なコンパイルステップを実行する必要がまったくないという意味で、「解釈される」ものである。これは、性能上の理由で、ある量の、バックグラウンドにある「JITコンパイル」を排除するものではない。
(XAFの原理)
XAFは、マーケットに対して時間を大幅に低減する「Officeクラス」アプリケーションをビルドするプラットフォームである。XAFの核になる原理は、以下の通りである:
・均一なデータ表現としてのXmlの使用;
・アプリケーションのビルドに対する非常にコンポーネント化された手法;
・強力なデータ変換機能;
・基礎になるプレゼンテーションレイヤとしてAvalonを使用する、リッチでコンポーズ可能なビュー。
(XADの目標)
XADはXAFアプリケーションの作成に使用されるので、XADの目標は、核になるXAFの原理に基づいて構築される:
・外部データとアプリケーション状態との両方に関する均一なデータ表現としてのXmlの使用;
・Xmlデータソースと非Xmlデータソースとの両方へのシームレスで動的なデータバインディング(非XmlデータソースのXml表現を介する);
・複雑なデータフローの宣言定義;
・1)追加のデータバインディング構造を伴うXAMLに似た構文、または2)XAML自体のいずれかを使用するUIの宣言定義;
・データをどのように変換し、表示し、相互作用するかのルールベースの宣言定義;
・強い型付け、および高い度合の静的チェック;
・「ビルトイン」キーワードの最小限のセットを用いる高い度合の拡張性;
・抽象化のプログレッシブなレベル;
・○広さおよび深さ
○性能
○品質
に関する「Officeクラス」アプリケーションの仕様に十分にリッチである。
(XAFアプリケーションの構造およびXADの役割)
XAFアプリケーションは、従来のWindows(登録商標)アプリケーションプログラミング技法とは異なる技法を使用して構築される。ほとんどの既存のWindows(登録商標)アプリケーション開発技法は、開発者がアプリケーションの実行フローを制御するコードを記述することに依存する。開発ツールには、ビジュアルデザイナを用いてダイアログおよびUIプリミティブが宣言的に設計される当該ビジュアルデザイナを含めることができるが、開発者は、最終的に実行フローの役割を担う。開発者は、アプリケーション状態を処理するために、イベントハンドラおよびデータ構造体を記述しなければならない。開発者は、データ構造体と、当該構造体を表すビジュアル要素との間のマッピングを管理する役割も担う。このすべてが、アプリケーションごとに異なる(類似する基礎になるパターンにもかかわらず、)大量の命令アプリケーションコードを伴う。XAFは、アプリケーション作成に対する異なる手法を採用する。XAFは、アプリケーションのデータ、ユーザインターフェース、およびUIがデータと相互作用する形を宣言的にモデル化する。核になる設計原理は、ビュー−データ分離である。XAFアプリケーションは、必要に応じて命令コードのバブル(bubble)が挿入されるが、大部分は宣言的と考えることができる。XAFアプリケーションは、データ中心型であると言われ、アプリケーションがデータを中心とすることに加えて、すべてのアプリケーション状態も、データとして扱われる。開発者の主な関心事は、データがアプリケーションを通って流れる形と、アプリケーションがそのデータにどのように応答するかを制御するルールとである。動的データバインディングの実際のインフラストラクチャは、開発者の関心事ではなく、追加機能なしでXAFによって提供される。
Figure 2008544338
重要:XADは、XAFアプリケーションを特徴付けるデータフロー、バインディング、およびルールの宣言作成を可能にするために存在する。
(仕様書の構成)
この仕様書の後のセクションの一部は、経験を積んだXAD作成者にとって独立したリファレンスとして機能し得るが、一般的に言って、セクションは、互いに基づいて構築されている。
2.言語の概念:簡単なコード例を介する、核になる言語の概念および構造の例示。言語キーワードおよび共通のフレームワークタグが、例において多用されているが、これらは、後のセクションでのみ形式的に定義される。
3.形式的言語仕様:すべての言語キーワードの形式的定義(言語キーワードは、言語に「組み込まれた」タグと考えることができる)。このセクションには、XADの拡張性機構、すなわち、サードパーティが自身のタグをどのようにして定義できるかの形式的定義も含まれる。
4.共通のフレームワークエンティティ:標準XADフレームワークによって提供される最も一般的なタグの説明。XADの拡張性機構を使用してサードパーティがビルドすることのできるタグが存在する。このフレームワークタグは、推奨される設計パターンおよびベストプラクティスを使用してアプリケーションを構築するのを支援する。
5.デプロイメントモデル:XADのアセンブリベースのデプロイメントモデルにおける形式的定義および例示的な説明。
6.アドインモデル:アドインを指定するための宣言モデルとしてXADデプロイメントモデルをどのように利用できるかの例示的な説明。
付録A:コーディング規約:推奨されるXADコーディング規約のリスト。標準XADフレームワークは、これらの規約に従う。サードパーティは、これらの規約の一部またはすべてを採用することを選択することができる。
(仕様の規約)
XAD内のネームスペースの使用は、W3CのXmlネームスペース仕様(http://www.w3.org/TR/REC-xml-names/)に完全に準拠する。この仕様書では、すべてのコード例において、所定の均一なネームスペース規約を使用する。
Figure 2008544338
「sys」プレフィックスを有するすべてのタグは、「XAD System」ネームスペース内に存在するタグである。このシステムネームスペース内のタグは、言語に組み込まれており、言語の予約済みキーワードと考えることができる。
Figure 2008544338
すべてのコード例のデフォルトネームスペースは、「XAD標準フレームワーク」である。この仕様書内では、ネームスペースプレフィックスを有さないすべてのタグは、この標準フレームワークに属するものとして識別することができる。他の場合には、fwkネームスペースが、提供され、XAD標準フレームワークに属するタグに関連付けられなければならない。すべてのコード例は、付録Aのコーディング規約に準拠する。
(言語の概念)
このセクションでは、核になるXAD言語の概念および構造を、簡単なコード例を用いて例示する。より一体化されたシナリオを伴うより大きいコード例を、後のセクションで提供する。言語キーワードおよび共通のフレームワークタグが、例において多用されているが、これらは、後のセクションでのみ形式的に定義される。
(Hello Worldの例)
XADコードは、必ず、明確に形成されたXmlでなければならない。XADファイルの最初のタグは、<sys:Xad>である必要がある。ファイルは通常(必ずではないが)、.xad拡張子を有する。
重要:Xadは、必ず、明確に形成されたXmlでなければならない。
HelloWorld.xad:
Figure 2008544338
XAF SDKをインストールした後には、「xad.exe HelloWorld.xad」が、この単純なアプリケーションの実行をもたらす。XADコードの明示的なコンパイルステップは存在しない。XADは、XADコードの最初の実行時に自動的に検証される(コンパイルされる場合もあるが、これは、現在は行われない)。検証ステップに合格しないXADは、必要なコーディングエラーが修正されるまで、実行できない。
以下は、HelloWorld.xadアプリケーションがどのように見えるかのスクリーンショットである。
Figure 2008544338
様々な言語の概念の説明は、対象とする概念の要求を満たす小さいXAD例を使用して行われる。Hello Worldの例をリストしたことの主な目的は、XADがどのように見えるかに関する、ある種の基本的なコンテキストを提供することであった。
(大文字小文字の区別)
以下のように記述することは、
Figure 2008544338
以下のように記述することと「同一ではない」:
Figure 2008544338
重要:XADは、大文字と小文字とを区別する。
(エンティティタグ)
XADのすべてのタグがエンティティタグであるわけではない(「グループ化タグ」および「セレクタタグ」として知られる2つの他の種類のタグがあり、これらは、エンティティタグの些細な変形であり、後の説明において定義される)。しかし、エンティティタグは、最も一般的であり、かつ重要な種類のXADタグである。
Figure 2008544338
重要:XADエンティティタグは、非常に単純に、ランタイムにCLRオブジェクトにマッピングする。CLRオブジェクトに関する唯一の制限は、それがXAFエンティティであることである。
Figure 2008544338
XAFエンティティであるために、CLRオブジェクトは、以下のことを行わなければならない:
・2つのベースクラス、すなわち、
○Microsoft.Xaf.Core.BaseTypes.EntityElement
○Microsoft.Xaf.Core.BaseTypes.EntityComposite
の1つから派生し、
・http://xafteam/xafenv/doc/Platform/Core Components/_Dev/DevIntroToEntityDomains.docにおいて定義されたある種のプロトコルおよび契約を厳守する。
タグビルダクラスは、エンティティの実際のインスタンス化(ファクトリパターン)ならびにエンティティのパラメータ化の役割を担うクラスである。タグビルダは、実際には、フレームワークエクステンダ(framework extender)だけに重要な実装詳細である。
以下のHello Worldの例には、3つのエンティティタグ(Application、Window、およびText)が存在する。
Figure 2008544338
この3つのエンティティタグの各々は、アプリケーションの実行時にエンティティの作成をもたらす:
・Applicationエンティティは、アプリケーションを「調整し」、最高レベルのアプリケーション機能を制御する、ルートレベルエンティティである;
・Windowエンティティは、アプリケーションのフレームを表示する役割を担うUIエンティティである;
・Textエンティティは、テキスト(このケースでは「Hello World」)を表示する役割を担うUIエンティティである。
エンティティタグは、フォームの宣言によって定義され、例えば、Textタグ定義は、以下のように始まる。
Figure 2008544338
重要:すべてのタグ定義は、すべてのエンティティタグをエンティティに最終的にマッピングするのに十分な情報を含む。
重要:すべてのエンティティタグは、対応するタグ定義を有する。
エンティティタグを、様々な型に分類することができる。これらの型は、拡張可能なセットであり、実際に、タグに関連付けられたエンティティのCLR型に対応する。標準フレームワークによって多用される型のいくつかの例が、sys:Data sys:EventHandler、fwk:UIElement、およびsys:Selectorである。
一般に、FrameworkネームスペースまたはSystemネームスペースにタグを追加することの区別は、以下の基準に基づく:
1.
a.タグが内部エンジンインターフェースに依存する
b.コア言語と同一のレートのバージョンである
場合には、Systemに追加し、
2.
a.内部エンジンインターフェースに依存しない
b.コア言語と同一のレートのバージョンではない
場合には、Frameworkに追加する。
$TODO − 内部エンジンインターフェースの例を提供する。Xadファイルおよび行番号などの情報の取得が、内部Xadインターフェースにアクセスすることによって行われることはわかっているが、重要なものはどれであるか?
エンティティの型は、エンティティの定義において宣言され、Textタグに関して検討すると、そのTypeは、そのタグ定義において以下のように指定されている。
Figure 2008544338
重要:すべてのエンティティタグは、型を有する。
(エンティティの基本的なパラメータ化)
前のセクションでは、エンティティタグが、ランタイムでのオブジェクト(より具体的にはXAFエンティティ)の作成をもたらすことを確立した。しかし、オブジェクトが有用になるためには、オブジェクトは、ある種の意味のあるパラメータ化を必要とする。このセクションでは、XADエンティティのパラメータ化に関する最も基本的な形を扱う。
(静的文字列を用いるパラメータ化)
XADは、エンティティのパラメータを宣言する多数の異なる形を可能にする。一般的な形は、以下の通りである。
Figure 2008544338
この宣言は、Textエンティティが、「Text」という名前で型「Data」、より具体的には「String Data」のパラメータを有することを示している。
Textエンティティの実際のインスタンスは、以下のようになる:
Figure 2008544338
重要:タグ定義パラメータは、そのパラメータと同一の名前を有する、タグの実際のインスタンス内の属性に対応する。
定義:「静的な値」は、文字列の値が、アプリケーションの有効期間の間、固定されていることを意味する。
定義:「Stringパラメータ」は、パラメータ宣言において、Typeが「Data」であり、Schemaが、何らかのXSD Simple Typeであることを意味する。
重要:静的な値を有するStringパラメータは、「./」または「$」から始めることができない。さらに、Stringパラメータは、「.」(単一のドット)にすることができない。この3つの表現は、XADバインディング用に予約済みである。
後のセクションで、<sys:InlineData>タグを紹介し、「./」または「$」から始まる静的文字列、もしくは「.」だけの静的文字列をどのように表すことができるかを説明する。
(単一のエンティティを用いるパラメータ化)
前の例では、ハードコーディングされた文字列すなわち静的文字列を使用して、Text UI要素のテキストを指定することを選択した。その代わりに、文字列を作成するエンティティを用いて、Text要素をパラメータ化することが可能である。ランダムな文字列を作成するRandom Word Connectorエンティティについて検討する。
Figure 2008544338
(Random Font Familyの宣言は、主に、Type属性が、TextのFontFamilyパラメータの対応するType属性と一致するという事実を強調するためにリストされたものである)。
別のエンティティを用いてパラメータ化されたFontFamilyは、以下のようになる:
Figure 2008544338
これは、「TextエンティティのFontFamilyパラメータについて有効としてRandom Font Familyを使用せよ」と解釈することができる。
重要:「Param」属性は、所与のエンティティがどの単一のパラメータに対応するのかを示すのに使用される。
定義:単一のパラメータは、そのパラメータが多くとも1つのエンティティ(エンティティのセットではない)をとることを意味する。エンティティのセットのパラメータ化については、次のセクションで扱う。
重要:「Param」は、予約済みパラメータ名である。
これは、単純に、ユーザ定義パラメータに「Param」と命名することができないことを意味する。以下のことを記述することは、不正である。
Figure 2008544338
他のエンティティを用いるエンティティのパラメータ化をよりよく理解してもらうために、エンティティ階層内に余分のレベルを有する次の例を検討する。
Figure 2008544338
Xml File Data Sourceエンティティは、数のリストを含むXmlファイルの名前を用いてパラメータ化される。File Connectorエンティティは、数のリストを作成するものと考えることができる。Highest Value Transformは、(このケースでは、Xml File Data Sourceによって提供される)リストを用いてパラメータ化される。
Highest Value Transformは、最大値を有するリスト項目を作成する。次に、Text要素が、Highest Value Transformによって作成されたリスト項目を用いてパラメータ化される(リスト項目がType sys:Dataであり、かつTargetType fwk:Stringである限り、そのリスト項目をTextによって使用することができる)。
次の図は、ここで発生しているネストされたデータフローを例示するのを助けるものである。
Figure 2008544338
これを記述する別の形は、Param属性を使用しない。こちらの方が理解されやすいことが多い。
Figure 2008544338
上のXadからわかるように、Param構文を使用することによって、Xadアプリケーションをより簡潔にすることができる。しかし、この構文の使用は、機能的ではなく、スタイルの問題である。
(エンティティのセットを用いるパラメータ化)
ここまでは、単一のパラメータ化に焦点を合わせた。単一のパラメータとは、多くとも1つのエンティティをとるパラメータである。しかし、複数のエンティティをとるパラメータを宣言することが可能である。以下について検討する。
Figure 2008544338
その名が示す通り、FlowPanel要素は、UI Elementのフローを表示する。「フロー」される明示的なUI Elementのセットは、「Children」という名前のパラメータを介して指定することができる。
FlowPanelインスタンスは、以下のように指定することができる:
Figure 2008544338
FlowPanel.Childrenグループ化タグの下で指定されるエンティティのセットは、FlowPanelの「Children」パラメータに対応する。
結果として生じるビューは、以下のようになる:
Chris Hackmann
Vlado Hristov
William Aitken
重要:エンティティのセットをサポートするすべてのパラメータについて、そのパラメータと同一の名前を有する暗黙的なグループ化タグが存在する。
重要:グループ化タグは、そのグループ化タグに対応するパラメータを指定するエンティティと同一のネームスペース内に存在する。
1つのサブUI ElementだけがFlowPanelに関して指定された場合、以下のように記述することは、それでも有効である。
Figure 2008544338
重要:1つのエンティティだけが使用される場合であっても、グループ化タグは、エンティティのセットをサポートするパラメータに対して使用することができる。
(1つのエンティティだけが指定される限り、)セットをとるパラメータに「Param」を使用することが有効であることに留意されたい。
Figure 2008544338
以下の記述も有効である。
Figure 2008544338
以下のように記述することも可能である。
Figure 2008544338
XQueryの使用が有効なのは、これがFlowPanelのFlowOrientationパラメータの値として使用されているからである(Param=“FlowOrientation”によって表される)。Param=“...”が省略された場合には、これは無効なXadとなる。
重要:エンティティのセットの指定は、複数のグループ化タグに分割することができる。
(Resources)
重要:すべてのエンティティ(sys:InlineDataを除く)は、任意のエンティティの無制限のセットをとる、Resourcesと呼ばれる暗黙的なパラメータを有する。
すべてのエンティティに対して暗黙的にサポートされる、「Resources」という名前の特殊なパラメータが存在する。唯一の例外は、sys:InlineDataであり、これはResourcesをサポートしない。Resourcesパラメータは、所与のエンティティの下で任意のエンティティのセットをアンカリングするのに使用される。
Resourcesパラメータは、Actionおよび状態の「グラブバッグ(grab-bag)」として、アプリケーションの最上位レベルで使用されることが多い。次に、それらのActionおよび状態が、例えば、以下のように、アプリケーション全体を通じて使用される。
Figure 2008544338
UI要素が状態および/またはActionにバインドされる形は、XADバインディング構造を説明するときに明白になる。データコネクタの「Name」属性およびActionは、バインディングのコンテキストでも説明する。
(デフォルトパラメータ)
ここまでで、XAD内でパラメータを指定する2つの形、すなわち、「Param」属性の使用およびグループ化タグの使用を扱った。しかし、以下のHello Worldの例では、この両方が使用されない。
Figure 2008544338
その理由は、このHello Worldの例が、「デフォルトパラメータ」に依拠しているからである。この例を、以下のように書き直すことができる。
Figure 2008544338
Applicationのタグ定義は、以下のことに類似した行を含む。
Figure 2008544338
Figure 2008544338
重要:すべてのエンティティは、そのパラメータのうちの1つをデフォルトパラメータとして定義することができる。その結果、デフォルトパラメータに対応するエンティティは、「Param」属性またはグループ化タグのいずれかを使用して修飾される必要がない。
上記のFlowPanelの例を想起されたい。
Figure 2008544338
これを、グループ化タグ(すなわち、FlowPanel.Children)なしで書き直すことができる。というのは、「Children」が、FlowPanelエンティティのデフォルトパラメータとして指定されるからである。
Figure 2008544338
重要:あるエンティティの所与のインスタンスを、デフォルトパラメータと非デフォルトパラメータとの両方を用いてパラメータ化することができる。
(アタッチドパラメータ)
ここまでで、エンティティが閉じられたパラメータのセットをどのように宣言できるかを確立した。次に、以下のXADスニペットを検討する。
Figure 2008544338
結果のビューは、多少は以下のように見えることになる。
Figure 2008544338
これらのTextエンティティは、DockPanelエンティティの「Children」パラメータとして指定される。
想起されたいこと:ChildrenはDockPanelエンティティのデフォルトパラメータなので、グループ化タグの必要性はない。
注記すべき興味深い点は、「DockPanel.Dock」が、Textエンティティの各々に対する属性として指定されていることである。しかし、「DockPanel.Dock」は、Textエンティティのタグ定義において指定されたパラメータの「1つではない」。
想起されたいこと:今までは、タグのインスタンスは、それに対応するタグ定義においてパラメータとして定義された属性だけを使用することができた。
「DockPanel.Dock」は、アタッチドパラメータの一例である。これは、実際にはDockPanelエンティティの宣言において定義される。
Figure 2008544338
これは、Childrenパラメータの一部として指定されるUI Elementごとに、DockPanel.Dockという名前のアタッチドパラメータを指定することが可能であることを示している。
アタッチドパラメータ(既知のV1シナリオのいずれにも違反しない)の(Xadエンジンによる)技術的制限は、単一ではないアタッチドパラメータを指定することができないことである。例えば、以下のように記述することは、不正である。
Figure 2008544338
重要:Xadエンジンは、単一ではないアタッチドパラメータをサポートしない。
重要:AttachedParamのTypeは、必ずsys:Dataでなければならない。
(TargetTypeは、基礎になるManaged Avalon型を定義し、この型は、「Dock」アタッチドパラメータのAvalon型を定義する。)
用語アタッチドパラメータは、このパラメータがエンティティの親(このエンティティ自体ではなく)によって「提供される(sponsored)」か、または「アタッチされる」という事実に由来する。
さらに、DockPanel.Dock構文は、アタッチドパラメータとしてパラメータの特性を呼び出すのに使用される。第1の態様すなわちDockPanelは、パラメータを提供するエンティティを定義する。一方、第2の態様すなわちDockは、DockPanelタグ定義内で定義されるアタッチドパラメータのNameを定義する。
重要:あるエンティティのアタッチドパラメータは、通常のパラメータと同一の形で指定されるが、そのエンティティの親/そのエンティティを含むエンティティによって「オーソライズされ」、管理される。
重要:アタッチドパラメータのデフォルト値は、XADが公開している対応するXAML要素によって決定される。その結果、ユーザは、上記で指定されたデフォルト値を見ない。
(インラインデータ)
ここまでの例では、属性を介して単純な静的文字列を指定するか、より複雑なデータをXADに持ち込むためにデータソースに依拠するかのいずれかであった。
Inline Dataエンティティは、単純なデータと複雑なデータとの両方をXADに直接的に埋め込むのに使用できる、型「sys:Data」のSystemエンティティである。
以下のXADを記述する代わりに、
Figure 2008544338
以下のように、Data.xmlからXADに直接的にデータを埋め込むことが可能である。
Figure 2008544338
(属性構文ははるかに簡潔であるにもかかわらず、)Inline Dataエンティティを使用して、単純なテキスト値を指定することも可能である。「$」または「.」から始まる文字列など、ある種のエッジ制約(edge condition)のために、Inline Dataエンティティは、XAD内で直接的に文字列を指定する唯一の形である。
Figure 2008544338
結果として生じるビューは、 $500 と表示する。
1)(TonyWによる追加)単純な文字、すなわち、「$」および「.」を簡単にエスケープするというアイデアを探る必要がある。「$」の場合には、「$$」を使用できると思われる。「.」をエスケープする簡単な形はないと思われる。
定義:<sys:InlineData>は、型「sys:Data」のエンティティタグであり、その下で直接的に書き込まれる単純なコンテンツまたは複雑なコンテンツを作成する。
(バインディングを介するパラメータ化)
(タグの命名)
重要:Nameは予約済みパラメータ名である。
これは、単純に、ユーザ定義パラメータにNameという名前を付けられないことを意味する。以下のように記述することは、不正である。
Figure 2008544338
重要:Name属性は、任意のエンティティタグ、グループ化タグ、またはセレクタタグに書き込むことができる。
セレクタタグについてはまだ説明していないが、さしあたって、この文は、すべてのエンティティタグおよびグループ化タグに名前を付けることができることを意味する。この命名は、純粋に、バインディング(別名エンティティの共有)を可能にするためである。例えば、
Figure 2008544338
重要:Nameは、スコープ内で一意でなければならない。タグ定義の本体内のエンティティのいずれもがスコープを導入しない場合には、名前は、そのタグ定義の本体内で一意でなければならない。
スコープの概念についてはまだ紹介していないが、この説明のためには、ある種のパラメータを、新しいスコープを導入するものとして考えることで十分である。この文は、タグ定義の本体内にそのような「スコープを導入する」パラメータがない場合に、名前がそのタグ定義の本体内で一意でなければならないことを示している。
タグ定義内に複数のスコープが存在する場合には、名前の一意性制限が緩和される。名前は、所与のスコープ内で一意であるだけでよい。これは、スコープ付きパラメータを説明するときにより明瞭になるはずである。
(エンティティへのバインディング)
共通のデータソースに対する2つのビューを検討する。XAD用語では、これは、3つのエンティティ、すなわち、2つのUI Elementエンティティおよび共有されるData Sourceエンティティを伴う。
Figure 2008544338
ここまでの説明では、必ず、エンティティと、そのエンティティが当該エンティティを用いてパラメータ化されるエンティティとの間に1対1マッピングが存在した。しかし、エンティティの共有は、明らかに一般的なシナリオである。XADは、このことを達成するのに必要な構造を有する。
Figure 2008544338
重要:SomeParam=“$SomeName”という形の属性は、SomeParamパラメータがSomeNameという名前のエンティティにバインドされることを意味する。
重要:パラメータの型およびパラメータがバインドされるエンティティの型は、一致しなければならない。
これは、以下のことが不正であることを意味する。
Figure 2008544338
Beep Commandエンティティは、型「sys:EventHandler」であるが、Textパラメータは、型「sys:Data」である。
TableおよびTreeを伴う上記の例では、MyTable.xmlが以下の形を有する。
Figure 2008544338
Treeは、任意のツリーを使用することができるが、Tableは、表形状を有するデータ(上記のデータについてはそうである)を必要とする。
次に、Table.xmlが、その代わりに以下を含む場合にどうなるかを検討する。
Figure 2008544338
Tableは、表形式でないデータ(<SearchResults>タグ)にバインドされることになる。
この不一致を解決するためには、Tableパラメータに関するTableのバインディングを、以下のように書き直さなければならない。
Figure 2008544338
このバインディングは、「TableのTableパラメータを、SharedDataSourceという名前のエンティティによって返されるXmlツリー内のmyd:TableData要素にバインドせよ」と解釈される。
$SharedDataSourceが、Xmlファイルのルートにバインドされる、すなわち、$SharedDataSourceが<SearchResults ...>のエイリアスになることに留意することが重要である。したがって、位置$ShareDataSource/myd:TableDataは、myd:SearchResults/myd:TableDataを指定することに類似する。
さらに、位置に対するネームスペースプレフィックスの使用に留意されたい。これは、非常に重要である。
Xmlファイルは、xmlns=“MyData”というデフォルトネームスペースを指定するので、Xad内のバインディング位置は、データへのアクセスを試みるときに同一のネームスペースを使用しなければならない。ほとんどの場合、Xadアプリケーションは、デフォルトネームスペースとして、Xad Frameworkネームスペースを使用する。
したがって、バインディングが以下のように指定され、
Figure 2008544338
かつ、FrameworkネームスペースがXadアプリケーションにおけるデフォルトネームスペースである場合に、バインディングは、以下のように解釈される。
Figure 2008544338
明らかに、これは、Xmlファイルから所望のデータを提供することにはならない。したがって、xmlns:myd=“MyData”ネームスペースの宣言は、非常に重要である。これを行わないことが、しばしば、多数のいらいらさせるアプリケーションバグの原因となる。
重要:$SomeName/SomeXPathの形のバインディングは、SomeNameという名前のデータエンティティによって公開されたツリー内の位置へのバインディングを意味する。この位置は、SomeXPathによって指定され、SomeXPathは、有効な相対位置でなければならない。
定義:データエンティティは、型「sys:Data」の任意のエンティティである。
所与のタグ定義の本体内で実際にバインドできるエンティティは、スコープの概念によって制限される。これは、スコープ付きパラメータの概念を以下で紹介するときに、より詳細に扱うことにする。
(有効な相対位置)
次のXmlファイル(RelLocData.xml)は、以下の相対位置の例において使用される。
Figure 2008544338
Figure 2008544338
Figure 2008544338
(Text Elementの指定)
Figure 2008544338
これは、値Stephen Dantonを作成する。
Figure 2008544338
(認識しておくべきいくつかの詳細)
留意すべき主要な態様は、相対位置が基礎になるデータソースにどのようにマッピングされるかである。$RelLocDataが、Xml文書全般にはマッピングされないことに留意されたい。そうではなく、$RelLocDataは、文書のルート、すなわち、<TableData ...>にマッピングされる。これについて考える別の形は、$SomeBindingが、それがバインドされるデータのXmlルートのエイリアスになるというものである。この理由から、以下のように記述することができる。
Figure 2008544338
というのは、これが、myd:TableData/myd:Employees...と記述することと本質的に同一であるからである。
バインディングを使用するときに認識しておくべきいくつかの他の態様。データソースが、データのテキスト要素への直接的なルート$SomeBindingバインディングを有しておらず、その値として、例えば、以下を公開する場合。
Figure 2008544338
この場合に、Text=“$UnrootedData”を指定すると、$UnrootedDataが文字列“Where is my root?”に直接的にマッピングされるのが認識されよう。
既に理解されていると思われるが、明示的に呼び出すことがよい最後のシナリオは、例えば、以下のルート専用データソースである。
Figure 2008544338
この場合に、$RootOnlyDataは、タグ<Root>にマッピングされ、デフォルトで、そのタグの下の最初のテキスト要素、すなわち、文字列“I Root therefore I am”を返す。
以下のように属性値を指定すると、
Figure 2008544338
値1が作成される。
Figure 2008544338
Figure 2008544338
以下のように特定の子を指定すると、
Figure 2008544338
値Andy Wassyngが作成される(すなわち、Employeesの2番目の子)。
$TODO − 時間が許す限りこのリストに追加すること
(グループ化タグへのバインディング)
エンティティタグにバインドできることに加えて、グループタグにバインドすることが可能である。例えば、
Figure 2008544338
Merge Trees Transformエンティティは、型「sys:Data」のエンティティのセットをとる、「Trees」と呼ばれるパラメータを有する。Resourcesグループ化タグにバインドすることによって、Merge Trees Transformは、Resourcesグループ化タグの下のエンティティのセットに「バインド」されることになる。
重要:グループ化タグへのバインディングは、そのグループ化タグの下で指定されるエンティティのセットへのバインディングをもたらす。
(タグ定義の仮パラメータへのバインディング)
このトピックを、バインディングのコンテキストにおいて説明しているが、このトピックは、実際には、単なるパラメータのバインディングを超えたものに関する。ここでは、抽象化のプログレッシブなレベルを有するタグ(従来の言語における関数によく似ている)を簡単に作成するのに、XADをどのように使用できるかを示す。
以下のXADスニペットを検討する。
Figure 2008544338
このXADスニペットを「TableWithCaption」という名前の抽象化として作り直したいと仮定することが現実的である。関数によく似て、抽象化のユーザは、何らかの挙動を再パラメータ化することを望む場合がある。これは、「TableWithCaption」という名前の新しいエンティティタグを作成することによって達成することができる。このタグは、2つのパラメータ、すなわち、「Caption」および「TableFile」をとる。XAD作成者は、以下の純粋な宣言定義を介して、これを達成することができる。
Figure 2008544338
仮パラメータが、タグ定義の本体内のエンティティが参照されるのと正確に同一の形で、どのように参照されるかに留意されたい。
重要:タグ定義の本体内で、タグ定義に対する仮パラメータを、SomeParam=“$FormalParamName”という形のバインディング構造によって参照することができる。
重要:型「sys:Data」の仮パラメータについて、SomeParam=“$FormalDataParamName/SomeXPath”という形のバインディング構造を記述することが可能である。SomeXPathは、有効な相対位置でなければならない。
重要:パラメータの型およびパラメータがバインドされる仮パラメータの型は、一致しなければならない。
重要:タグ定義の本体内のエンティティの名前およびタグ定義への仮パラメータの名前は、同一であってはならない。
これは、ローカル変数による仮パラメータのシャドウイング(shadowing)を許容しないことと同等である。以下のように記述することは、不正である。
Figure 2008544338
TableWithCaptionタグの実際のインスタンス化は、以下のようなものとすることができる。
Figure 2008544338
TableWithCaptionなどの抽象化を作成するときの一般的なシナリオは、いくつかのパラメータについてデフォルト値を設けることである。タグ定義は、そのようなデフォルト値を指定するための備えを有する。このケースでは、Captionパラメータが、オプションとして指定され、文字列「Results」をデフォルトとする。
Figure 2008544338
「TableWithCaption」のインスタンス化は、もはやCaptionを必要としない。
Figure 2008544338
デフォルトが文字列ではない場合、デフォルトの宣言には、インラインエンティティタグが含まれることになる。例えば、
Figure 2008544338
(編集を可能にするためのバインディングの使用)
<sys:InlineData>でWritable属性を設定することによって、Inline Dataエンティティが書き込み可能になる。
重要:Writableは、実際には定数パラメータであり、したがって、データバインドすることができず、静的な値を使用して表されなければならない。
以下の例に、XAD内の「スクラッチパッド」として書き込み可能なInline Dataエンティティの簡単な使用を示す。
Figure 2008544338
Textが最初に表示されるとき、表示されるテキストは、Inline Dataエンティティの初期値、すなわち、
Bye
である。
「MouseLeftButtonDown」は、型「sys:EventHandler」のパラメータである。「MouseLeftButtonDown」パラメータに対応するアクション(Param=“MouseLeftButtonDown”によって表される)は、このTextエンティティが左マウスダウンイベントに出会うときに必ず呼び出される。このケースでは、SetTextValueActionが、呼び出され、Inline Dataエンティティの<Greeting>要素のテキスト値を変更する。これは、SetTextValueActionが、Data(Data=“$ScratchPad”によって表される)パラメータを介してInline Dataエンティティにバインドされているからである。要約すると、Textによって受け取られた左マウスダウンイベントは、Textが
Ciao
を表示することをもたらす。
同様に、右マウスダウンイベントは、Textが
Au Revoir
を表示することをもたらす。
書き込み可能データへのアクションのバインディングは、XADにおいて編集可能性を達成する一般的な方法である。
テーブルへの新しい行の挿入を伴う、わずかに異なる以下のシナリオを検討する。
Figure 2008544338
CDs.xmlが、
Figure 2008544338
を含む場合には、当初に表示されるテーブルは、次のように見える:
Achtung Baby U2 19.99
Firestarter Prodigy 21.99
Tableが右マウスダウンイベントを受け取るときに、AppendSiblingTreeActionが、呼び出され、そのTree属性について指定された値を、そのSiblingパラメータによって提供されるノードに追加する。これが発生した後に、ツリーは、以下のようになる:
Figure 2008544338
ツリーへの更新のために、テーブル表示が自動的に更新され、その結果、テーブル表示は、以下のように見えるようになる:
Achtung Baby U2 19.99
Firestarter Prodigy 21.99
? ? 0.00
(Mainタグ)
上記のカノニカルなHello Worldの例で見られるように、Xadアプリケーションのエントリポイントは、CアプリケーションまたはC#アプリケーションのMain関数に似ている。Xad設計時シェルすなわちXad.exeが動作するときに、Xad.exeは、「Main」TagDefinition、すなわち、Name=“sys:Main”を有するタグを探し、これをアプリケーションのエントリポイントとして使用する。
一般的な命令言語との類似性について続けると、sys:Mainタグ定義を、コマンドライン値を用いてパラメータ化することができる。さらに、sys:Mainタグ定義は、アプリケーションの実行時に値を自動的に提供される3つの予め定義された値を公開する。
(自動投入されるParam)
3つの名前がsys:Mainパラメータタグのために予約されており、その名前は、XadBaseDirectory、InitialWorkingDirectory、およびMetadataである。これらの各々が、公開され、同一の形でバインドされる。さらに、これらの各々は、読み取り専用である。以下では、XadBaseDirectoryパラメータを使用する例を提示する。
XadBaseDirectoryは、そのBaseUriパラメータの値として、XmlFileDataSourceと関連させて一般的に使用される。以下のXadを検討する。
Figure 2008544338
BaseUriの値として$XadBaseDirectoryを使用することは、DataSourceに関連付けられたファイルが、Xad.exeすなわちXadアプリケーション用の設計時シェルに渡されるファイルの位置で探されることを示すものである。したがって、foo.xadが、アプリケーションであり、C:\xaf\demos\personal\にある場合には、XadBaseDirectoryは、C:\xaf\demos\personalと等しくなり、Fileによって定義されるファイルは、そのディレクトリパス内で検索されることになる。
以下では、3つの予約済みパラメータの自動投入される値を定義する:
・XadBaseDirectory − Xad.exeが起動された位置ではなく、アプリケーションのXadベースディレクトリ、すなわち、アプリケーションがあるディレクトリから起動された当該ディレクトリを示した文字列;
・InitialWorkingDirectory − Xad.exeが起動された位置ではなく、アプリケーションの初期作業ディレクトリ、すなわち、アプリケーションがあるディレクトリから起動された当該ディレクトリを示した文字列;
・Metadata − アプリケーションに現在関連付けられているすべてのロードされたアセンブリのマージされたメタデータのツリー。
以下のXadアプリケーションは、3つすべてのパラメータの使用を示す。
Figure 2008544338
重要:自動投入されるmainパラメータの各々は、読み取り専用であり、したがって、アプリケーションによってランタイムに変更することはできない。
(コマンドラインパラメータ化)
予約済みの自動投入されるsys:Mainに加えて、アプリケーションは、sys:Mainのパラメータと異なる名前を有する任意の数のパラメータを指定することができる。これらのパラメータは、コマンドラインに基づいてパラメータ化され、すべての形のアプリケーション構成について使用することができる。以下のXadは、sys:Mainパラメータの指定と、その後その値を提供するコマンドラインの指定との例を提供する。
Figure 2008544338
...コマンドライン...
xad CommandLine.xad /TextData=Testing
...より一般的には...
xad <AppFile> [/<ParamName1>=<Value1>[/<ParamName2>=<Value2>[ ...]]] [Switches]
...これは、以下のアプリケーションをもたらす...
Figure 2008544338
(コマンドラインパラメータに渡される値は、単純なテキストである必要はなく、ファイル名、イメージ位置などとすることができる)。
(無視されるブロック)
XadがXmlベースの言語であることを想起されたい。より具体的には、Xadコードは、「有効なXmlでなければならない」。これは、Xadアプリケーションの開発を試みるときの興味深い制限、すなわち、「コメントアウトし、コーディングする(comment-out and code)」という手法を作り出す。明瞭にするために、Xmlは、コメントのネストをサポートせず、例えば、以下のXmlは不正である。
Figure 2008544338
したがって、C++またはC#などの命令言語と異なって、コメントにコメントすることは、そのような動作をサポートする特殊な構文がなければXadでは不可能であり、この機能は、sys:IgnoredBlockという名前のタグの形で現れ、以下のように定義される。
IgnoredBlockタグは、残りのXadが有効である限り、<sys:Xad>スコープの下のどこにでも存在することができる。以下のことを検討する。
Figure 2008544338
Xadコメントタグは、これらの要素のいずれの回りにもラップすることができない。というのは、これらのすべてが、有効なXadアプリケーションに必須であるからである。
IgnoredBlockの最初の出現は、それ自体およびその子をXadチェッカによって無視させる。以下の有効なXadを検討する。
Figure 2008544338
以下のIgnoredBlockタグを追加すると、
Figure 2008544338
これが無効なXmlになり、このケースでは無効なXadになる。したがって、Xadチェッカは、無効なXmlに関するエラーをレポートする。というのは、さらなるチェックが実行される前に、Xadは有効なXmlでなければならないからである。
<sys:IgnoredBlock>のネストは、ネストがXmlの妥当性を保つ限り、許容される。
Figure 2008544338
<sys:IgnoredBlock>の外側のXmlコメントを示す以下のXadを検討する。
Figure 2008544338
これは、1つの大きいXmlコメントとして扱われる、すなわち、IgnoredBlockは、ここでは特別な機能を持たず、Xmlコメントの内側の単なる文字列である。
Xmlコメントをラップする<sys:IgnoredBlock>の外側のXmlコメントを検討する。
Figure 2008544338
これは不正である。上記にて注記したように、Xadは、必ず有効なXmlでなければならない。定義により、Xmlコメントをコメント内にラップすることができないことを想起されたい。
Xmlコメントと異なって、<sys:IgnoredBlock>は、無効なXmlをエスケープするのに使用することはできない。
Figure 2008544338
上記のXadは、無効なXmlに関するチェッキングエラーを返すはずである。<FP>、<A>、および<B>には、クロージングタグがない。
しかし、Xmlコメントを追加する場合には、これは問題がない。
Figure 2008544338
重要:「内側のIgnore」すなわち属性を無視する機能は、サポートされない。
IgnoredBlockタグは、sys:InlineDataの内部をコメントアウトするのに使用することはできない。以下のXadを検討する。
Figure 2008544338
上記のコードは、「インラインデータ」と解釈され、<EFG></EFG>は無視されず、実際に、<sys:IgnoredBlock>は、<EFG>の親になる。したがって、このインラインデータは、実際に、以下のように考えることで、より簡単なデータを定義している。
Figure 2008544338
(アウトパラメータ)
$TODO − これはM3で詳細に説明される。
(ホワイトスペース)
Xadアプリケーションに入ってくるすべてのデータは、データバインディングによって指定されるものであれ、Xad作成者によって静的に定義されるものであれ、「そのままで」扱われる。したがって、Xadは、ホワイトスペースを制御するためのUIコンポーネント固有コントロールを一切公開しない。これは、Xamlと異なって、我々がUI要素レベルでxml:space=“Preserve|Default”を公開しないことを意味する。これは、XadおよびXamlの不一致の領域である。
各UI要素、Data Source、Transformなどで「ホワイトスペースを保存する」というパラメータをサポートしないことを選択することによって、Officeクラスアプリケーションにアピールすることが可能になる。このタイプのホワイトスペース管理は、単純にOfficeクラスアプリケーションには非現実的である。その代わりに、我々は、ホワイトスペースがどのように扱われるかをXad作成者がよりグローバル/データ駆動の形で定義することを可能にするWhitespaceTransfrom(一時的な名前、MM3機能)を公開する。
以下のシナリオを検討する。
すべてのホワイトスペースを、そのままで扱う。これは、以下のXadがある場合に、
Figure 2008544338
これが
「Steve 」
として現れることを意味する。
同様に、
Figure 2008544338
これは、
「 Steve」
として現れる。
同様に、
Figure 2008544338
これは、
「 S t e v e 」
として現れる。
また
<Text Text=“$foo” />
ただし、$foo=“ Steve ”である。
($fooの値のすべての導出について繰り返す)。
重要:我々は、DataConnectorに読み込まれるXmlデータ、および一般にSystem.Xml規約に従って読み込まれるすべてのXmlデータに対するxml:space=“Preserve|Default”を、(System.Xmlに従って)認識し/サポートする。
重要:MM3では、WhitespaceTransformのサポートを追加する。
(構造体)
XAD内の構造体の不存在によって、アプリケーション機能をまったく排除されない。しかし、構造体は、大きいXADアプリケーションに関する複数の作成ワークフローを単純化する。トップレベルで定義された1つのアクション(Save)および3つの状態(Recent Documents、User Preferences、およびEnterprise Preferences)を有するアプリケーションを検討する。このアプリケーションが、複数のペイン(型「fwk:UIElement」の派生タグとしてモデル化される)を有する場合、問題は、以下の通りである:
1.各パラメータを、各ペインに明示的に渡さなければならない(XQueryを介するデータパラメータの集約は、データパラメータの数を減らすのに使用することはできるが、非データパラメータについては助けにならない);
2.余分なアクション(例えば、Print)の追加は、各ペインへの新しいパラメータの追加を必要とする(ペインがパラメータグループを共有するように設計されている場合に、各ペインのタグ定義の変更を回避できることに留意されたい。しかし、それでも、すべてのペインインスタンスを更新する必要がある);
3.ネストされたカテゴリによってパラメータをグループ化する機構がない(古典的OOでは、プロパティが他のクラスであるクラスによって達成される。XAFではコネクタインターフェースを介して達成される)。
このシナリオを、さらに明瞭にするために、以下に図に示す。
Figure 2008544338
例示のために、まず、(最初の2つの問題に対処するため、)「単一レベルの構造体」を説明し、次に、(3番目の問題に対処するため、)「ネストされた構造体」に一般化する。実際には、「構造体」である1つの集合的特徴だけが存在する。
(単一レベルの構造体)
以下のXADは、構造体のシグネチャを記述するために記述される。
Figure 2008544338
重要:構造体に適切なシグネチャは、(1)sys:Objectと等しい型を有さなければならず、(2)アウトパラメータだけを含まなければならず、(3)チョイスすなわち<sys:Choice>を含むことができず、(4)Signatureという名前のOutParamを有することができない。
「app:ActionsAndDataSignature」シグネチャを使用する構造体の例は、以下のようになる。
Figure 2008544338
重要:構造体パラメータは、すべてインライン、すべてバインドされる、またはインラインおよびバインドされる組合せとして指定されなければならない。
重要:シグネチャを伴うパラメータは、同一のシグネチャを伴う値だけをとることができる。同一の型では不十分である。同一のことが、これらのパラメータのデフォルト値にもあてはまる。
重要:すべての構造体パラメータには、値が割り当てられなければならない。
構造体をタグ定義内で使用することができ、その例を以下に示す。
Figure 2008544338
ペインのインスタンスは、以下のようになる。
Figure 2008544338
本体内では、以下のバインディングが、型「sys:EventHandler」のすべてのパラメータについて有効になる:
・「$ActionsAndData.PrintAction」;
・「$ActionsAndData.SaveAction」。
本体内では、以下のバインディングが、型「sys:Data」のすべてのパラメータについて有効になる:
・「$ActionsAndData.RecentDocuments」;
・「$ActionsAndData.UserPreferences」;
・「$ActionsAndData.EnterprisePreferences」。
例えば、ユーザプリファレンスが、以下の形のデータツリーによってモデル化される場合、
Figure 2008544338
「$ActionsAndData.UserPreferences/AutoSaveFrequency」を介してAuto Save Frequency設定にバインドすることが可能となることに留意されたい。
本体内で、以下のバインディングは、シグネチャ「app:ActionsAndDataSignature」のすべてのパラメータ(通常は、アプリケーションのアクションおよびプリファレンスにアクセスする必要がある他の派生タグへのパラメータ)について有効になる:
・「$ActionsAndData」。
(ネストされた構造体)
ネストされた構造体(単純に、単一レベルの構造体の一般化)を使用して、同一のシナリオを解決することができる。
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
本体内では、以下のバインディングが、型sys:EventHandlerのすべてのパラメータについて有効になる:
・「$ActionsAndData.Actions.Print」;
・「$ActionsAndData.Actions.Save」。
本体内では、以下のバインディングが、型sys:Dataのすべてのパラメータについて有効になる:
・「$ActionsAndData.RecentDocuments」;
・「$ActionsAndData.Preferences.User」;
・「$ActionsAndData.Preferences.Enterprise」。
本体内では、以下のバインディングが、Signature app:ActionsAndDataSignatureのすべてのパラメータ(通常は、アプリケーションのアクションおよびプリファレンスにアクセスする必要がある他の派生タグへのパラメータ)について有効になる:
・「$ActionsAndData」。
本体内では、以下のバインディングが、Signature app:ActionsSignatureのすべてのパラメータ(通常は、アプリケーションのアクションだけにアクセスする必要がある他の派生タグへのパラメータ)について有効になる:
・「$ActionsAndData.Actions」。
本体内では、以下のバインディングが、Signature app:PreferencesSignatureのすべてのパラメータ(通常は、アプリケーションのプリファレンスだけにアクセスする必要がある他の派生タグへのパラメータ)について有効になる:
・「$ActionsAndData.Preferences」。
(スタイル)
Avalonスタイルの主な用途は、
・特定の要素のプロパティ値のデフォルトを指定すること;
・特定の要素の下のビジュアルツリーの外見のデフォルトを指定すること;
・特定の要素に関する入力応答(ビジュアルトリガ)のデフォルトを指定すること;
・コントロールの繰り返される子をどのように表示するかを指定すること
である。
これらは、以下の3つのカテゴリに分類される:
1.我々がSDK1に包含するスタイルの諸態様。我々は、さらに、XAMLモデルを一般化し、XAD固有の概念(例えば、派生タグ)に適用可能にすることによって価値を追加する。構文は、必ずしも同一ではなくなるが、一致の領域としての資格を有するのに十分に近い。例えば、プロパティ値のデフォルト指定;
2.実質的な設計なしで一般化された形に包含することが困難なスタイルの諸態様。これらは、価値があり、我々がなんとかしてSDK1の後に包含する必要がある態様である。例えば、ビジュアルツリーおよびビジュアルトリガ;
3.現在設計されているままでは脆弱であり、「Officeグレードアプリケーション」の作成のためにスケーリングされる可能性が低いスタイルの諸態様。これらは、好ましいXAD手法によって対処される。例えば、繰り返される子の表示。さらに、我々は、互換性のためにXAML手法をサポートする可能性があるが、これらの判断は、SDK1の後で行われる。
この文書では、我々がSDK1に包含する領域、すなわち、プロパティ値のデフォルト指定に焦点を合わせる。
(デフォルト指定のためのスタイル)
XADエンジンは、リソースとして指定される、<sys:Style>という名前の特殊なタグを処理する。このタグは、デフォルトパラメータ値の指定を可能にし、UIエンティティに制限されない。以下は、デフォルト指定の例である。
Figure 2008544338
これは、別のデフォルトスタイルがTextBoxに関して指定されない限り、XADエンジンが、TextBoxを作成するときに以下のことを行うことを意味する:
・明示的なWidthが指定されない場合に限り、Widthに100%を設定し、
・明示的なHeightが指定されない場合に限り、Heightに100%を設定し、
・明示的なBackgroundが指定されない場合に限り、Backgroundにべた塗り赤ブラシ(solid red brush)を設定する。
重要:スタイルの影響の範囲は、厳密に階層的である、すなわち、上のスタイルは、エンティティツリー内でDockPanelの下に存在するエンティティだけに適用可能である。
「スタイル情報」は、XADエンジンが既にリンクのために保存している階層環境と共に単純に記憶される。スタイルのルックアップは、ハッシュルックアップになり、ツリーのウォークアップを必要としない。我々は、XADに対するランタイムアーティファクトがある(遅延処理スコープ)という事実を利用しているので、Avalonとは異なる。さらに、ビジュアルツリーのウォークを用いる手法は、デフォルト指定を厳密にUIエンティティに制限する。
スタイルをオフに切り替えることは、スタイル指定されるエンティティにおいてパラメータを指定しないようにすることによって達成することができる。以下は、TextBoxに関する以前のスタイル指定をすべて無効にする。
Figure 2008544338
デフォルト指定は、派生タグに同等に適用可能である。
Figure 2008544338
非UIエンティティに適用されるデフォルト指定の例が、以下である。
Figure 2008544338
これは、XmlFileDataSourceのAccessModeパラメータが明示的に指定されない場合に、このパラメータにReadOnlyが設定されることを意味する。
必要なパラメータが、XAD内で指定されなければならないことに留意されたい。例えばXmlFileDataSourceのPathパラメータなど、必要なパラメータがスタイルによって設定されることに依存することは、可能ではない。この制限は、コンポジションを可能にするために存在する。スタイルの存在に依存することは、脆弱である。
Figure 2008544338
さらに、型のレベルでデフォルトを指定することが可能になる。
Figure 2008544338
これは、別のデフォルトスタイルがUIElementについて指定されない限り、XADエンジンが、すべてのUI Connectorを作成するときに以下のことを行うことを意味する:
・1.Widthパラメータがサポートされ、
2.Widthパラメータが明示的に指定されず、
3.対象とするUI Elementに固有のスタイル(例えば、TextBox固有スタイル)が指定されない場合に、
Widthに100%が設定される;
・Heightについても同様;
・Backgroundについても同様。
2)我々は、正確な型の一致を要求すべきか、あるいは、我々は、さらに「最も近いIsAssignableFrom」一致についてチェックすべきか?
スタイルに関する型チェックは、通常のXADに関するものより緩いものにする必要がある。具体的には、
・「型−スタイル」に対するパラメータ(例えば、上記の「UIElement」の例)は、各UIElementがそれ自体のパラメータを導入できるので、チェックされない。型がシグネチャであり、したがって型がある種のパラメータを規定する場合には、これらのパラメータは、型チェックされる(これが可能であるのは、我々がXADにおいてパラメータのオーバーライドを許容しないからである);
・スタイル内のアタッチドパラメータの値は、チェックされる、すなわち、DockPanel.Dock=“Garbage”は、許容されない。しかし、スタイル上で宣言されるアタッチドパラメータを記述することは可能である。例えば、スタイルが、DockPanelの子ではないTextBoxボックスに適用される可能性がある場合であっても、以下のことを記述することが可能である。
Figure 2008544338
3)我々は、アタッチドパラメータの概念をグローバルにしなければならない。これは、任意の場合のバブル化されたイベントのために、SDK1後に必要になる。
XAMLと同様に、我々は、「Style」と呼ばれるすべてのエンティティ上の暗黙的なシステムレベルパラメータを介する特定のスタイルへのバインディングをサポートする。
Figure 2008544338
しかし、このスタイルは、スコープ内にある必要がある。スコープ制限が、実際にはスタイルに固有であるのではなく、我々のスコープ付きバインディングモデルの結果であることに留意されたい。我々は、必要が生じた場合にStylesなどのエンティティの特定の型へのグローバルバインディングをサポートすることができるが、とりあえず、我々は、スコープ付きモデルにどこまで取り組めるかを調べたい。実用的な応用例はないが、一貫性のために、以下のことを記述することが可能であることに留意されたい。
Figure 2008544338
スタイルへのバインディングは、タイプセーフになる。その結果、以下の記述は、エラーをもたらす。
Figure 2008544338
要約すると、我々は、スタイルを使用するデフォルト指定に関して、Avalonのモデルをサポートし、少数の領域で価値を追加する:
・デフォルト指定は、(UIエンティティだけではなく、)すべてのエンティティに適用される;
・デフォルト指定は、(プリミティブタグだけではなく、)派生タグに適用される;
・デフォルト指定は、型のレベル、例えば、すべてのUIElementで行うことができる(Avalonは、これを最終的にサポートする可能性が非常に高い)。
型のレベルでのデフォルト指定は、SDK1については実装されない。
(Avalonのビジュアルツリーのスタイル指定)
この領域に関するXAD設計は、対応するUI Connector設計と共に、SDK1後に行われる。
(スタイル指定およびビジュアルトリガ)
この領域に関するXAD設計は、対応するUI Connector設計と共に、SDK1後に行われる。
(スコープ付きパラメータ)
一部のパラメータは、新しいスコープを導入する。新しいスコープを導入するパラメータでは、「NewScope」属性にtrueが設定される。
Figure 2008544338
パラメータは、以下の様々な理由のためにスコープを導入することを選択することができる:
・スコープ変数を導入するため;
・遅延される作業および/または繰り返される作業のユニットを導入するため;
・上記のすべて。
スコープ付き変数、ならびに遅延される作業および/または繰り返される作業の概念は、このセクションにおいて定義される。
スコープ付きパラメータに関連付けられたエンティティは、スコープ境界に存在する。パラメータによって、これらのエンティティは、スコープ境界に関連付けられ、スコープ境界を導入する。以下の図に、ネストされたスコープを導入するエンティティおよびグループ化タグが、スコープのツリーをどのようにもたらすかを示す。
Figure 2008544338
(スコープ変数)
パラメータが新しいスコープを導入する理由の1つは、スコープ内の変数のセットを導入するためである。これらの変数は、暗黙的に宣言されることを除いて、仮パラメータに非常に似ている。スコープ付き変数へのバインディングは、仮パラメータにバインドするのと同一の形で行われる。
スコープ付き変数は、パラメータを導入するスコープの宣言と共に宣言される。例えば、以下のTextのタグ定義を検討する。
Figure 2008544338
sys:ParamGroupRefは、sys:ParamGroupタグへの参照を定義し、これは、以下のようになる。
Figure 2008544338
MouseLeftButtonDownという名前のsys:Paramの定義に留意されたい。これは、NewScopeと、Position_Xという名前のsys:ScopeVariableとを指定する。
これは、MouseLeftButtonDownパラメータが使用されるときに、必ず、MouseLeftButtonDownが以下のことを行うことを示す:
1.新しいスコープを導入する、
2.Position_Xという名前のsys:ScopeVariableを公開する。
スコープ付き変数のポイントは、以下のようなシナリオを可能にすることである。
Figure 2008544338
このアプリケーションのXadは、以下の通りである。
Figure 2008544338
Figure 2008544338
すべての例と同様に、このアプリケーションの機能の雰囲気をつかむために、ユーザがこのXadを実行することが奨励される。
MouseLeftButtonDownに関連付けられたスコープ変数の使用を介して、我々は、左マウスダウンイベントが発生するたびに、オレンジ色の長方形の位置を更新することができる。さらに、以下のイベントコードを調べると、
Figure 2008544338
MouseLeftButtonDownパラメータが、2つのスコープ変数、すなわち、Position_XおよびPosition_Yを公開することがわかる。これらのスコープパラメータの値へのバインディングは、すべてのXadバインディングと同一の形で行われる。
重要:スコープ内のエンティティは、スコープ変数と同一の名前を有することができない。
例えば、以下の記述は不正である。
Figure 2008544338
というのは、Position_XがMouseLeftButtonDownによって公開されているからである。
(リピータパターン)
リピータパターンは、様々なエンティティ型によって使用されるが、その使用法は、XAD標準フレームワークに含まれるCompoundエンティティによって最もよく示される。データ駆動型複合エンティティは、データセットにバインドされ、そのデータセット内のデータ項目ごとに、サブ要素を表示する。ここまでで、我々は、複数の例においてFlowPanelエンティティを使用してきた。FlowPanelエンティティは、実際には以下の2つのモードを有する:
・規定的(表示すべきサブエンティティは、Childrenパラメータとして明示的に指定される);
・データ駆動型(このセクションにおいて定義されるリピータパターンを使用する)。
FlowPanelエンティティの定義は、(ここまでの例で提案したように)Childrenパラメータだけを中心にしてはいない。そのタグ定義は、以下のように見える。
Figure 2008544338
サブエンティティを規定的に指定するのではなく、DataパラメータならびにRepeatedChildパラメータを指定することが可能である。これによって、FlowPanelエンティティが「データ駆動型」モードにされる。
FlowPanelタグ定義が、<sys:Choice>タグを使用し、これらのタグが、Childrenパラメータ(これによって、規定的レイアウトを定義する)、または、DataおよびRepeatedChildの<sys:ParamGroup>を使用する間で選択するためのタグの何らかの実装を必要とすることに留意されたい。
重要:ParamGroupは、すべてか無か(all-or-nothing)の形で使用されなければならないパラメータのセットを定義する。FlowPanelを調べると、作成者がDataの値を提供する場合、RepeatedChildの値も提供しなければならない。
RepeatedChildパラメータは、Data内の項目ごとに複数回インスタンス化されるエンティティである。
重要:複数回インスタンス化されるすべてのエンティティは、新しいスコープ内に存在しなければならない。
RepeatedChildパラメータによって導入されるスコープは、DataContextという名前のスコープ変数を有する。この変数には、インスタンス化されるサブビューに対応する項目が設定される。
以下のスニペットに、データ駆動型の形でのFlowPanelエンティティの使用法を示す。
Figure 2008544338
List.xmlが、以下のXmlを含むと仮定する。
Figure 2008544338
リスト項目ごとに、FlowPanelエンティティはTextエンティティを作成する。最初のTextエンティティについて、DataContextスコープ変数の値は、以下のようになる。
Figure 2008544338
$DataContext/@Nameバインディングは、Name属性を作成する。Textは、属性にバインドされるときに、その属性の値を表示し、この値は、このケースでは「Chris Hackmann」である。
同一のことが、各リスト項目に適用可能である。ビューポートが十分に大きい場合に、FlowPanelエンティティは、スクリーンに以下を表示する。
Figure 2008544338
各行は、1つのTextエンティティのインスタンス化に対応する。インスタンス化ごとに変化するのは、「DataContext」スコープ変数の値である。このパターンは、「リピータパターン」と呼ばれる。これは、XADにおけるデータセットに対する反復の基礎となる。
$DataContext/@Nameバインディングは、DataContextスコープ変数だけのために予約された特殊なショートハンド表記「.」(単一のドットまたはピリオド)のために、./@Nameと書き直すことができる。
重要:名前DataContextは、スコープ変数のために予約済みである。
重要:スコープ変数がDataContextと命名される場合に、その変数は型sys:Dataでなければならない。
重要:文字列をバインドする際の“$DataContext”の出現は、ショートハンド「.」を使用して書き直すことができる。
(スコープに関連するバインディングの制限)
スコープは、ある種のバインディング制限を導入する。外部スコープから内部スコープへのバインディングは、「許可されない」。しかし、以下の図に示されているように、内部スコープから外部スコープへのバインディングは、「許可される」。
Figure 2008544338
(ネストされたリピータパターン)
「リピータパターン」に関するセクションにおいて、データベースに対する単純な反復をどのように実現するかを示した。このセクションでは、より複雑なシナリオを検討する。
まず、以下の単純なデータセットを検討する。
Figure 2008544338
この単純なデータセットの以下のビューを検討する:
Customer Description Price
Luis Figo Toaster 49.99
Luis Figo VCR 199.99
このビューは、Tableエンティティを用いて簡単に達成できるが、例示のために、FlowPanelエンティティおよびTextエンティティだけにとどめる。
Figure 2008544338
命令言語に満足している人にとって、反復態様だけを、おおむね以下のようにモデル化することができる。
Figure 2008544338
ここで、以下のわずかにより複雑なデータセットを検討する。
Figure 2008544338
このより複雑なデータセットの以下のビューを検討する:
Customer Description Price
Luis Figo Toaster 49.99
Luis Figo VCR 199.99
Lilian Thuram DVD Player 279.79
Lilian Thuram Receiver 549.99
Lilian Thuram Sub−woofer 350.00
このケースにおける唯一の実際の相違は、反復の1つの余分なレベルが存在することである。単一のPurchase Orderに対して反復するのではなく、まずPurchase Orderのセットに対して反復しなければならない。各Purchase Orderについては、おおむね同一のことを行う。主要な相違は、customer列が「外部の」反復の関数になることである。
やはり、命令コードに満足している人にとって、この反復モデルは、おおむね以下の通りである。
Figure 2008544338
命令コードが反復の余分なレベルを単純に追加するのと同一の形で、XADは、以下のように同一のことを行う。
Figure 2008544338
反復の余分なレベルに加えて、この例における他の興味深い例示は、外部スコープからスコープ変数を参照するための、<sys:Binding Name=“OrderDataContext” ...>エンティティの使用である。現実には、そのような機構は、
・外部スコープにあり、
・現在のスコープまたはそれを囲むスコープのスコープ変数と同一の名前を有する
スコープ変数を参照するという比較的まれな場合に限り、有用である。
(パラメータ継承)
派生タグ定義を作成するときに、既存エンティティのパラメータを、BaseTag属性によって使用可能にすることができる。例えば、
Figure 2008544338
は、Xad作成者が、以下のことを指定することを可能にする。
Figure 2008544338
TextおよびFontFamilyが、タグ定義内のParam値として呼び出されていないことに留意されたい。これは、これらのパラメータが、fwk:Textタグ定義で指定されており、BaseName=“fwk:Text”を指定した結果として、SimpleTextタグ定義に自動的に渡されるからである。
重要:BaseTagパラメータに値を割り当てると、BaseTag値のパラメータ(例えば、fwk:Text)がタグ定義に渡されるようになる。
さらに、ベースタグのタグ定義内で定義された値は、SimpleTextタグ定義に自動的に割り当てられる。例えば、FontFamilyに、Arialというデフォルト値が与えられる場合には、その値が、SimpleTextタグ定義に渡される。
インスタンス対定義 − パラメータ値の優先。タグを定義するときに、その定義内の属性について静的に値を提供することができる。
Figure 2008544338
これらの値がタグインスタンス内で指定されない場合には、これらの値は「そのまま」になるが、指定される場合には、インスタンス値が優先される。以下のことを検討する。
Figure 2008544338
これは、サイズ25の緑色のフォントを有するSimpleTextをインスタンス化する。タグインスタンス内のFontSizeの値が、タグ定義内のFontSize=“50”という宣言をオーバーライドする(すなわち、それより優先される)。
特定のパラメータを、無効にする、すなわち、何によっても「オーバーライド可能」でないものとして定義することができる。以下のことを検討する。
Figure 2008544338
以下のインスタンス
Figure 2008544338
を用いてタグインスタンス内でFontFamilyを定義すると、上記の定義でこのパラメータが0のminを有し、0のmaxも有するように定義されているので、(警告ではなく、)チェッキングエラーがもたらされる。
それでも、上記にて示されているように、タグ定義内で静的にFontFamilyパラメータを設定することができることに留意されたい。
最上位タグの型と一致しないBaseTagを指定することは、不正である。例えば、
Figure 2008544338
は、そのBaseTagパラメータについてfwk:Borderの値を指定するが、最上位タグとして(型fwk:Textを有する)Textを定義している。
(制限)
パラメータは、最上位タグによってのみ継承することができる。例えば、以下のことを記述する場合に、
Figure 2008544338
以下のインスタンスを用いると、
Figure 2008544338
最上位タグはBorderであり、したがって、そのパラメータのすべてが、新しいBorderTextタグによって自動的に公開され、このタグ定義内のBorderタグに属する。
共有パラメータは、最上位タグによって使用される。例えば、
Figure 2008544338
BorderおよびTextの両方が、Marginパラメータを有するが、上記のインスタンスでMarginを設定すると、TextのマージンではなくBorderのマージンだけが設定される。
Textタグの値を設定するためには、その値を、sys:Param構文を介して公開し、Textタグの内部にバインドする必要がある。以下のコードにこれを示す。
Figure 2008544338
ここでは、以下のように見えるタグのインスタンスを用いる。
Figure 2008544338
最後に、多重継承はサポートされない。例えば、タグ定義を定義し、そのタグ定義を別のタグ定義のBaseTagとして使用することはできない。例えば、以下のことは不正である。
Figure 2008544338
(条件付きパラメータ化)
XADは、宣言言語ではあるが、エンティティの条件付き構築を可能にするのに十分な表現力がある。
条件付き構築の2つの形、すなわち、SwtichEntityまたはSwitchEntitiesが可能である。これらの各々は、CasesタグまたはConditionsタグのいずれかによってパラメータ化することができるが、この両方によってはパラメータ化することはできない。Casesは、C#のswitchと事実上、同等と考えることができ、Conditionsは、C#のif−else節のセットに似ている。
CasesおよびConditionsの使用は、相互に排他的であり、これは、Switchが、その本体内でCasesおよびConditionsを混合できないことを意味する。さらに、Casesは、SwitchがそのDataパラメータの値を指定する場合に限り使用でき、それ以外の場合にはConditionsを使用しなければならない。
SwitchEntity、SwitchEntities、Cases、およびConditionsのすべてが、システムネームスペース内に存在する。規約によって、これらには、sys:ネームスペース、すなわち、sys:Case、sys:SwitchEntityなどのプレフィックスが付けられる。
以下の例のための次のデータセットを検討する。
Figure 2008544338
(Cases)
Casesは、これらの2つのオプションのうちの単純な方である。これらは、単一のパラメータすなわちValueを有する。Valueの値は、IStringに評価されなければならない。Dataの値を伴うSwitchを指定せずにCasesを使用すると、設計時チェッキングエラーがもたらされる。以下の不正なXadを検討する。
Figure 2008544338
以下のXadに、Casesの正しい使用法を示す。
Figure 2008544338
(Conditions)
Conditionsは、Switchの結果に関する高い度合の制御を、Xad作成者に提供する。Conditionsは、単一のパラメータすなわちTestを公開する。Testの値は、ロケーションテンプレートであり、これは、その値が有効なxQueryになることができることを意味する。Conditionsは、SwitchがそのDataパラメータの値を指定しない場合に限り、使用することができる。
Dataの値を指定したSwitchと共にConditionsを使用すると、設計時チェッキングエラーがもたらされる。以下の不正なXadを検討する。
Figure 2008544338
以下のXadに、Conditionsの正しい使用法を示す。
Figure 2008544338
(SwitchEntity)
SwitchEntityを使用すると、作成者は、スイッチの評価の結果として単一の項目を条件付きで返せるようになる。
データセットの項目の各々を表示することを可能にする、以下のXadを検討する。
Figure 2008544338
結果として生じるビューは、以下のようになる。
Figure 2008544338
ここで、500を超える価格を赤のGeorgiaフォントで表示し、100未満の価格を緑のArialフォントで表示することが望まれるシナリオを検討する。XADは、以下のようになる。
Figure 2008544338
結果として生じるビューは、以下のものに似たものになる(「Toaster」は、緑で太字のArialとして表示され、「Receiver」は、赤で太字のGeorgiaとして表示される)。
Figure 2008544338
重要:<sys:SwitchEntity>は、Caseインスタンスの場合にはDataの値と一致する最初のCaseタグまたはConditionタグの下のエンティティを作成し、conditionインスタンスの場合にはtrueと評価される。それ以外の場合には、「DefaultEntity」パラメータとして指定されたエンティティを作成する。
(SwitchEntities)
SwitchEntitiesタグは、複数の値を返すのに使用することができる。これは、複数のCasesまたはConditionsと一致すること、または複数の値を返す単一の条件を有することを意味する。SwitchEntityによって公開されるパラメータに加えて、SwitchEntitiesは、MatchFirstパラメータを公開する。デフォルトで、MatchFirstはfalseであり、これは、SwitchEntitiesが、すべての一致するCasesまたはConditionsの値と一致する、すなわち、それらの値を返すことを意味する。
MatchFirstにtrueが設定されている場合には、SwitchEntitiesは、最初に一致するCaseまたはConditionの値だけを返す。falseと等しいMatchFirstを指定する以下のXadを検討する。
Figure 2008544338
テキストボックスに入力される値に応じて、このXadは、Conditionsのうちの1つまたは複数と照合し、相応にUIを表示する。しかし、MatchFirstにtrueが設定されている場合には、trueと評価される最初のConditionだけが、その値を返させる。
重要:<sys:SwitchEntities>は、スコープパラメータの下で使用されなければならず、SwitchEntityのように非スコープコンテキストで使用することはできない。スコープパラメータが、NewScope属性にtrueが設定される(すなわち、NewScope=“true”)と共に宣言されるパラメータであることを想起されたい。スコープパラメータの例が、DockingPanelのRepeatedChildパラメータである。
重要:<sys:SwitchEntities>は、一致するすべてのセレクタタグの下のエンティティのセットを作成する。そうでない場合には、「DefaultEntities」パラメータとして指定されたエンティティを作成する。
重要:<sys:SwitchEntities>の「MatchFirst」属性にtrueが設定されている場合、<sys:SwitchEntities>は、一致する最初のCase/Conditionタグの下のエンティティのセットだけを作成する。そうでない場合には、「DefaultEntities」パラメータによって指定された1つまたは複数のエンティティを作成する。
(全般)
重要:<sys:SwitchEntity/ies>は、その下にCaseタグまたはConditionタグを配置させることしかできない。<sys:SwitchEntity/ies>の直下に配置できる唯一のエンティティタグは、「DefaultEntity/ies」パラメータである。
重要:<sys:SwitchEntity/ies>が、型Tのパラメータのエンティティとして指定される場合、<sys:SwitchEntity/ies>の下のCase/Conditionは、その下に型Tのエンティティを有さなければならない。「DefaultEntity/ies」パラメータが指定される場合、このパラメータも型Tでなければならない。
重要:<sys:SwitchEntity/ies>が、非オプションパラメータのエンティティとして指定される場合、<sys:SwitchEntity/ies>は、「DefaultEntity」パラメータを指定しなければならない。
(スコープ付きでないコンテキストにおける「Switch」の使用)
プロキシなしで、スコープ付きでないコンテキストにおいて、例えばResourcesの下で使用される場合、sys:SwitchEntityは、そのTypeパラメータの値を指定しなければならない。以下を検討する。
Figure 2008544338
sys:DataのTypeを定義しなければならない。スコープ付きでないコンテキストに含まれるSwitchEntityタグでTypeを定義しないと、設計時チェッキングエラーがもたらされる。
(「Switch」のネスト)
SwitchEntity/iesは、以下のようにネストすることができる。
Figure 2008544338
これは、「$AppState=‘Blork’の場合に、$AppState/Foo=‘Bar’であるかどうかを調べるためにテストし、そうである場合には、$AppState/Fooの値を有するText要素を表示せよ」と解釈すべきである。
(競合するネストされたアタッチドパラメータ)
以下のXadを検討する。
Figure 2008544338
アタッチドパラメータ(黄色で強調表示されている)は、競合している。最も外側のパラメータ(sys:SwitchEntitiesタグで指定される)は、このスイッチの戻り値が親になるDockPanelのTopにドッキングされなければならないことを示している。逆に、一致する内側のCaseタグ(シアンで強調表示されている)は、Textを親になるDockPanelのBottomにドッキングしなければならないと指定するText要素を返す。
そのような競合の結果は、以下の通りである:
・Switchが、可能な戻り値で指定されたアタッチドパラメータをシャドウイングするアタッチドパラメータを定義していることを示す設計時チェッキング警告;
・ランタイムには、最も内側の定義が「勝つ」。これは、内側のCaseが一致する場合に、TextがDockPanelのBottomにドッキングされることを意味する;
・最後に、明瞭さを保証するために、上記にて見られるデフォルトケースとの一致は、Switchのアタッチドパラメータによって指定されるように、DockPanelのTopにドッキングされたText要素をもたらす。
(セレクタおよびタグ定義)
場合によっては、セレクタまたはセレクタの集合を1つのタグ定義に抽象化し、これによって、セレクタを様々な領域で再利用できるようにすることが望ましい。以下のXadを検討する。
Figure 2008544338
これは、以下のアプリケーションを作成する。
Figure 2008544338
しかし、以下のパターンは不正である。
Figure 2008544338
重要:Xadは、作成者がタグ定義の<sys:Body>の直下でConditionまたはCaseをネストすることを許容しない。そうではなく、CaseまたはConditionは、最低でも<sys:SelectedEntit(y|ies)>タグを親にしなければならない。
(関連付け)
XADは、任意のエンティティとデータとの関連付けを可能にする。アプリケーションのワークスペース設定をモデル化する以下のXml状態を検討する。
Figure 2008544338
「LayoutScheme」および「ActiveDocumentIndex」が、この例では使用されていないことに留意されたい。これらは、単に、状態の構造を、アプリケーションにおいてしばしば使用されるパターンに似たものにするためにそこに存在するものである。
MDIアプリケーションは、そのような状態をアプリケーション内の様々なサブシステムに渡す。サブシステムの例は、以下のようなものがある:
・開かれている各文書の内容を別々のMDI子ウィンドウに表示する実際のMDIワークスペース;
・すべての開かれている文書のサムネイルビューを有するサイドバー;
・「すべての文書を保存」などのコマンドを有するメニュー。
これらの「サブシステム」の各々は、文書のリストだけではなく、文書に関連付けられたData Sourceも操作することを必要とする。理想的には、様々なサブシステムは、同一のData Sourceインスタンスを共有する。実際、共有は、依存ビューなどのシナリオに必須である。この共有は、Association Managerと呼ばれるエンティティのクラスを介して実現することができる。
Association Managerは、データに関連付けられたエンティティを作成して管理するエンティティである。例えば、List Association Managerは、リスト内のリスト項目の各々について関連付けを作成して管理する。
Figure 2008544338
このXADは、以下のことを意味する:
・このList Association Managerは、<OpenDocuments>リストの関連付けを管理している;
・リスト内の項目ごとに(すなわち、<Document>ごとに)、File Data Sourceが、「関連付けられたエンティティ」として作成される;
・各File Data Sourceは、そのFileパラメータに、対応する<Document>のFilenameを設定させる。データコンテキスト(「.」)は、必ず、対応するリスト項目(すなわち、<Document>)である;
・リスト項目(すなわち、各<Document>)が、リストに追加されるか、またはリストから除去されるときに、対応する関連付けられたエンティティ(すなわち、File Data Source)が追加され、除去される。エンティティの実際の作成は、オンデマンドで行われることに留意されたい。
クライアントは、<sys:AssociatedEntity>を介して関連付けを参照する。
Figure 2008544338
このXADは以下のことを意味する:
・<OpenDocuments>リスト内のすべての<Document>について、Dock Panelは、Outline Viewを表示する(Outline Viewは、そのTreeパラメータをアウトラインフォーマットで表示する仮定のUI Elementである);
・各Outline ViewのTreeパラメータは、関連付けられるエンティティである;
・関連付けられるエンティティは、我々がリスト項目(すなわち、各<Document>)に関連付けたFile Data Sourceである。
Association Managerは、以下のように、ダイナミックディクショナリとしてモデル化することができる。
Figure 2008544338
<sys:AssociatedEntity>は、Association Manager内の値をプロキシするエンティティと考えることができ、プロキシされる値は、<sys:AssociatedEntity>のDataパラメータによって駆動される。
この例では、関連付けられるエンティティがData Sourceであったが、関連付けられるエンティティの型は、任意とすることができ、例えば、Event Handlerとすることができることに留意されたい。
重要:<sys:AssociatedEntity>が、あるデータDおよび関連付けマネージャAMを与えられてエンティティEを作成すると仮定する。Eは、「AM.LookupAssociation(D)」の結果である。
重要:関連付けられたエンティティのルックアップに失敗すると、ランタイムエラーがもたらされる。
重要:<sys:AssociatedEntity>は、エンティティの型がプロキシ可能である当該エンティティを参照することだけに使用することができる。
(タグドキュメンテーション)
概要の形において、XADタグドキュメンテーションに対するXAFの手法は、マネージドAPI(maganed API)のリファレンスドキュメンテーションに関してC#によって使用される手法を模倣することである。リファレンスコメンタリは、XAD Tagの.xadコードに組み込まれ、そのコメンタリは、マネージドAPI参考資料のMS内部作成で使用されるツールに概念および設計において類似するツールによって抽出され、後処理される。これらの追加の仕様は、以下のXADリファレンスドキュメンテーションを扱う:
・XAD Tags: Doc content and post processing scenarios
・XAD Tags: Doc markup and presentation
・XAD Tags: Doc production tools
これらの仕様の内容は、その名前に基づいて簡単に識別されるに違いない。次の形式的言語仕様セクションには、リファレンスドキュメンテーションの構造を制御するリファレンスドキュメンテーションマークアップタグの言及しか含まれない。ドキュメンテーション関連タグのすべてに関する完全な詳細については、「Doc markup and presentation」の仕様を参照されたい。
(形式的言語仕様)
このセクションでは、前のセクションでより非形式的に紹介した言語構造の多くの形式的宣言を提供する。「言語構造」とは、Systemネームスペース(http://schemas.microsoft.com/2005/xad/system)に存在するタグを意味する。
前述したように、XADコードは、明確に形成されたXmlとして記述される。XADファイルの最初のタグは、<sys:Xad>である必要がある。このファイルは通常(必ずではないが).xad拡張子を有する。パッケージング構造およびデプロイメント構造は、言語にとって基礎であるが、形式的にはセクション5でのみ定義される。XAD言語の部分的XSD仕様は、http://xafteam/xafenv/doc/Platform/Application%20Components/xad.xsdにおいて入手可能である。この仕様は、主にXSDが多数の構造的制約を取り込むのに十分な表現力を有さないので、「部分的」と言われる。
(ブール属性)
XADシステムタグのすべてのブール属性は、オプションである。デフォルト値は、必ずfalseである。これが実際に意味するものは、ブール属性が、当該ブール属性の値をtrueにする必要がない限り、指定される必要がないということである。すなわち、属性の不存在は、必ず、その値がfalseであることを意味し、属性の存在は、その値がtrueであることを意味しなければならない。一貫性および可読性の理由から、フレームワークエクステンダは、フレームワークエクステンダ自身のブールパラメータを定義するときに、この規約に従うことが推奨される。
(修飾名)
XADは、Xmlベースの言語であり、Xml修飾名を多用する。修飾名は、一意性を保証し、かつ競合を回避するために特定のネームスペースに属する(詳細については、http://www.w3.org/TR/REC-xml-names/を参照されたい)。修飾名を使用するXAD言語構造は、以下の通りである:
・型
・タグ定義
・シグネチャ
・パブリックパラメータグループ
所与のXADアプリケーションについて、上記にてリストした構造の各バケット(bucket)内のすべてのインスタンスは、そのバケット全体にまたがって一意な修飾名を有さなければならない。例えば、同一の名前の2つの型または同一の名前の2つのシグネチャが存在することはできない。しかし、異なるバケットからの項目は、同一の名前を有することができる。例えば、タグおよびシグネチャは、同一の名前を有することができるし、あるいは、パラメータグループおよび型は、同一の名前を有することができる。
(キーワード)
Figure 2008544338
Figure 2008544338
例:
Figure 2008544338
Figure 2008544338
<description>タグの単純な使用については、前の例を参照されたい。<description>タグの使用のより完全な扱いについては、「XAD Tags: Doc markup and presentation」の仕様を参照されたい。
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
(ビルトインエンティティ)
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Namespaceが指定される場合に、Tagの値がローカル名でなければならない、すなわち、Tagの値を「xcal:DatePicker」にすることはできず、「DatePicker」にしなければならないことに留意されたい。以下のXadを検討する。
Figure 2008544338
重要:$DateTagは、DatePickerなどのローカル名に解決されなければならない。
(エラーケース)
TODO::これが正しいことを確実にすること。
エラー1:DyanmicEntityに関連するチェッキングエラー
シナリオ:ダイナミックエンティティのロードを試みるときに、一連のチェッキングエラーが発生し、これらのチェッキングエラーは、DynamicEntityに関連付けられたステータスボードにポストされる。
Figure 2008544338
(エラーケース)
エラー1:無効な関連付け
シナリオ:リスト関連付けマネージャを使用して、作成者が、そのマネージャに関する関連付けに解決されないデータノードを渡す。
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
(エンティティビルダ)
エンティティビルダは、エンティティを作成し、かつ/またはワイヤリングするためのユーザ定義の.NETクラスである。エンティティビルダは、プリミティブXADタグを実装するのに使用される。XAD言語は、エンティティビルダを記述する要件を定義する。というのは、エンティティビルダが、XADランタイムと、この言語のカスタムエクステンションとの間の相互作用の点であるからである。エンティティの構築およびワイヤリングに応じて、新しいエンティティを定義するプリミティブタグを実装する、以下の4つの形が存在する。
Figure 2008544338
4つのケースのうちの3つにおいて、エンティティビルダクラスを指定しなければならないことに留意されたい。XADは、エンティティビルダ用の以下の2つのインターフェースを定義する。
Figure 2008544338
エンティティの構築およびワイヤリングに応じて、エンティティビルダは、このインターフェースの一方または両方を実装することができる。
Figure 2008544338
エンティティビルダの要件:
・ステートレス。エンティティビルダは、Createメソッドおよび/またはWireメソッドへの2つの呼び出しの間にローカル状態を保つことを、許可されない。XADランタイムは、効率性の理由から、エンティティビルダのオブジェクトプールを作成する場合がある。したがって、ビルダメソッドへの呼び出しの順序および回数の保証はない;
・プレイ時挙動なし(no play-time behavior)。エンティティビルダは、2つのこと、すなわち、エンティティの作成およびワイヤリングを行うことができる。それ以外は許可されない。エンティティビルダは、そのエンティティビルダが作成またはワイヤリングするエンティティの他のインターフェースを使用することを、許可されない。
以下の例に、プリミティブタグのタグ定義と、対応するエンティティビルダの実装とを示す。
Figure 2008544338
Figure 2008544338
以下は、同一のタグの単純化されたバージョンの例である。このエンティティは、定数パラメータへのアクセスを必要とせず、特別なコンストラクタパラメータを有さないので、エンティティビルダは、エンティティ構築を実装する必要はなく、ワイヤリングだけを実装する。
Figure 2008544338
Figure 2008544338
(アクション)
一般に、アクションは、エンティティ型「fwk:EventHandler」を実装するエンティティである。
Figure 2008544338
Figure 2008544338
コマンドは、他のエンティティと同様に、エンティティクラスを実装し、タグ定義を記述することによって実装することができる。しかし、アクションは、最も一般的なエンティティの1つとして認識され、XADは、アクションを実装する代替のより単純な形をサポートする。XADは、エンティティではなく関数としてアクションを実装することを可能にする。バックグラウンドでは、XADランタイムが、XADパラメータをC#パラメータにマッピングし、その関数を呼び出す。
コマンド実装として使用される関数は、以下の要件を満たさなければならない:
・エンティティクラスのメソッドとして定義される。エンティティクラスは、エンティティドメインサービスへのアクセスを提供する。複数のコマンド関数を、同一のエンティティクラスで実装することができる。しかし、これは、単にパッケージングの便宜のためであり、アクション間の相互作用を意味するものではない;
・ステートレス。XADランタイムは、ランタイムに、コマンドエンティティのインスタンスをどのように管理するかを決定する。例えば、エンティティクラスの新しいインスタンスを、コマンド呼び出しごとに作成することが可能である。アクションは、ある呼び出しから別の呼び出しまで状態を保つことを、許可されない。アクションがアプリケーションに関して知る必要があるすべての情報は、パラメータとして渡されなければならない;
・参照パラメータおよびアウトパラメータがない。関数として実装されるアクションは、出力パラメータを有することができない。参照パラメータは、一般にXADによってサポートされず、したがって、コマンド関数は、このどちらも使用することができない。アクションは、インパラメータとして渡される書き込み可能なデータに書き込むことによって、アプリケーション状態に対する変更を行う。
コマンド関数は、パラメータとしてエンティティをとる。しばしば、これらのパラメータはデータエンティティである。XADは、強く型付けされたアクセスを可能にすることによって、データエンティティへのアクセスを容易にする。汎用データエンティティ型ICRangeを使用することに加えて、コマンド作成者は、パラメータ型として強く型付けされたアクセッサを使用するというオプションを有する。
Figure 2008544338
ファイル名に関してアウトパラメータまたは参照パラメータを使用するのではなく、更新アクセッサが使用されていることに留意されたい。
データエンティティによってサポートされないアクセッサを指定することは、エラーである。
コマンド関数に加えて、対応するタグ定義を記述しなければならない。タグ定義内のパラメータ名は、コマンド関数内のパラメータ名と正確に一致しなければならない。XADランタイムは、名前によってパラメータを照合するので、一致しないパラメータ名を有することはエラーである。パラメータの順序は関係ない。
Figure 2008544338
オプションパラメータ(Min=“0”)は許容される。オプションパラメータのデフォルト値を、タグ定義内で指定することができる。デフォルト値が指定されない場合、XADランタイムは、nullを渡し、クライアントコードは、nullを処理する準備をしておかなければならない。デフォルト値なしの値型オプションパラメータを定義することは、エラーである。
設定パラメータ(Max=“ubounded”)は許容される。設定パラメータは、関数において、ICollectionとして型指定されなければならない。汎用型は、項目の型を有する集合を特殊化するために、将来的に使用できるようになる。
4)カスタムチェッカはどのインターフェースを実装しなければならないのか?
5)パラメータ名とアタッチドパラメータ名との間の競合をどのように扱うべきか?
6)我々は動的にインスタンス化されるエンティティでアウトパラメータをサポートしたいのか?
7)我々は、Wireに渡されるエンティティが強く型付けされるように何らかの形で汎用型を使用しようとしているのか?パラメータ値についてはどうか?
(共通のフレームワークエンティティ)
Figure 2008544338
(デプロイメントモデル)
(XADアプリケーション)
XADアプリケーションは、様々な関連する断片から構成される。XADパッケージングおよびデプロイメントモデルは、これらの断片を一緒にグループ化し、以下の目的のために、それら断片間の関係を定義するルールを定義する:
・アプリケーションのすべての部分(アプリケーションの構成要素)の識別;
・アプリケーションの整合性の検証;
・インタープリタモードとコンパイルモードとの両方でのアプリケーションの実行;
・アプリケーションのデプロイメント;
・バージョニング(versioning)。
XADは、アセンブリベースのパッケージングおよびデプロイメントモデルを使用し、このモデルは、Microsoftデプロイメント戦略に従う(詳細については、Fusionのhttp://fusionを参照されたい)。Fusionは、バージョニング、サイドバイサイドインストール、「DLLヘル(DLL hell)」、管理、ポリシなどの問題を扱い、したがって、そのデプロイメントモデルおよびサービスを利用することは有益である。
様々なアプリケーション断片は、アセンブリと呼ばれるより大きいパッケージにグループ化される。アセンブリは、アプリケーションを形成するために結合される。
Figure 2008544338
すべてのXADアプリケーションは、1つのエントリポイント、すなわち、そのエントリポイントからアプリケーション処理が開始されるタグを有する。アプリケーションエントリポイントの要件は、以下の通りである:
・タグは、ルートアセンブリ内で定義されなければならない;
・タグのローカル名は、Mainでなければならない。ネームスペースは、http://schemas.microsoft.com/2005/xad/systemに存在するものでなければならない;
・タグがパラメータをとる場合、そのパラメータは、コマンドラインから渡すことができるように、単純なデータ型(string、Integer、Booleanなど)でなければならない。
(XADアセンブリ)
XADアセンブリは、デプロイメントの最小単位である。XADアセンブリは、XADセマンティクスを有するfusionアセンブリである。
XADアセンブリは、以下の2つの部分からなる:
・マニフェスト(5.3を参照されたい);
・構成要素ファイル。
Figure 2008544338
(マニフェスト内にリストされる)アセンブリ構成要素ファイルは、実際のXADコード(タグ定義、エンティティ型、シグネチャなど)と、アプリケーションの一部である、すべての他の情報(データスキーマ、メタデータ、リソースなど)とを含む。XADまたはスキーマファイルが、マニフェスト内に構成要素としてリストされると、その内容は、以下のために使用可能になる:
・アセンブリ内のすべてのXADファイル;
・依存XADアセンブリ内のすべてのXADファイル。
型、シグネチャ、パラメータグループ、およびタグ定義は、「内部」として定義することができ、その場合、これらは、そのアセンブリの外部からは不可視である。XADファイルは、他のXADファイルまたはスキーマファイルを参照しない。依存関係(他のファイルからのタグ、型などの使用)は、ファイルレベルではなくアセンブリレベルで処理される。しかし、XADアプリケーション内で使用される他の言語が、ファイル参照をサポートする場合がある。例えば、XSDは、インクルードディレクティブ(include directive)およびインポートディレクティブ(import directive)をサポートする。インクルードまたはインポートされるファイルは、自動的にアセンブリの一部になるのではない。これらのファイルは、構成要素ファイルとして明示的にリストされなければならない。
8)知的財産権(IP)保護に関して我々は何を行うのか?コンパイルされたアセンブリが回答になるかもしれない。
すべての構成要素ファイルは、マニフェストが配置されるのと同一のフォルダまたはサブフォルダ(任意に深いネストレベルのサブフォルダがサポートされる)に配置されなければならない。XADアセンブリ用の、以下の2つのフォーマットが存在する:
・非PEマルチファイルアセンブリ
PEは、「Portable Executable(ポータブル実行可能ファイル)」を表す。このフォーマットは、開発中に便利である。アセンブリ全体を含む単一のファイルは存在しない。構成要素ファイルは、XAD作成者によって作成されながら使用され、ディスクに保存される。XADランタイムは、マニフェストを読み取ることによって、それらのファイルを発見する。構成要素ファイルに対する変更はすべて、ファイルが保存されるときにアセンブリ上で直ちに反映される。XADアプリケーション内でアセンブリを使用するために、コンパイルステップは必要ではない;
・.NETアセンブリ
これは、デプロイメントに便利な、コンパイルされた形のXADアセンブリである。コンパイルは、よりよい性能をもたらす。XADアセンブリは、バイナリフォーマットで記憶され、他の.NETアセンブリと同様に、GAC(グローバルアセンブリキャッシュ)内で展開できるように、強い名前を用いて署名することができる。コンパイルされたXADアセンブリの正確なフォーマットが何になるかは、まだ決定されていない(SDK1後TBD)。しかし、コンパイルされたXADアセンブリが、エラー処理および意味のあるWatsonダンプ生成のために、エラーをオリジナルのXADソースに戻って相関させることを可能にすることが必要である。
(アセンブリマニフェスト)
XADアセンブリマニフェストは、Fusionマニフェストであり、Fusionによって使用することができる。XADアセンブリマニフェストは、XADアセンブリを完全に記述する。このマニフェストは、「.manifest」拡張子を有するXmlファイルである。最新のFusionマニフェストスキーマは、http://teamweb/manifest/Shared%20Documents/Latest%20Manifest%20schema.htmで見つけることができる。マニフェストは、テキストエディタを使用して手作業で作成するか、開発ツールによって作成することができる。開発時に、マニフェストは、プロジェクトファイルの役割を担い、アセンブリのすべての部分およびその依存関係を記録する。ランタイムに、マニフェストは、アプリケーションのすべての部分を見つけてロードするために、XADランタイムによって使用されるカタログの役割を担う。XADランタイムは、Fusionマニフェストスキーマ全体を理解するのではなく、Fusionマニフェストスキーマのあるセクションを認識して、残りのセクションは無視する。
XADによって認識されるマニフェストセクションは、以下の通りである:
・アセンブリID;
・説明;
・他のアセンブリとの依存関係;
・構成要素ファイルのリスト。
Fusionマニフェストスキーマのターゲットネームスペースは、「urn:schemas−microsoft−com:asm.v2」である。このスキーマは、拡張可能であり、他のネームスペースからの要素および属性を追加することができる。XADは、http://schemas.microsoft.com/2005/xad/assemblyのネームスペースで定義された拡張として、少数の属性を追加するに過ぎない。XADは、要素に関してはマニフェストスキーマを拡張しない。
以下のリファレンスは、XADによって認識されるFusionマニフェストXmlの要素および属性、ならびにXADによって追加される属性を説明するものである。
Figure 2008544338
Figure 2008544338
9)「カルチャ」属性の我々の使用法は何か?.NETでは、「カルチャ」属性は、サテライトアセンブリのみのために意図されている。我々は、ローカライズされたリソースをどのように扱うのか?
10)type属性の我々の現在の使用法に関する問題:
−これは、「後方互換性のため」として文書化され、将来的に除去することができる;
−値「xad」をグローバルに予約する方法はない;
−typeは、依存関係において指定されたときに限り意味を持つ;
我々は、その代わりにdependentAssembly要素で我々自身の拡張属性を定義すべきか?
Figure 2008544338
Figure 2008544338
Figure 2008544338
11)挙動マップファイルの将来はどうなるか?
(マニフェストの例)
Figure 2008544338
このマニフェストの例は、名前「Demo」およびバージョン「1.0.0.0」を有するアセンブリを記述している。
「Demo」アセンブリは、以下の2つの他のアセンブリに依存する:
・「Microsoft.XAF.XAD.Framework」、すなわち、XADアセンブリ(type=“xad”);
・「DemoEntityBuidlers」、すなわち、.NETアセンブリ(typeは指定されない)。
「Demo」アセンブリは、以下の2つの構成要素ファイルを有する:
・DemoTags.xad、すなわち、最終的にタグ定義、シグネチャ、エンティティ型、およびパブリックパラメータグループを含めることができるXADファイル;
・DemoDataSchema.xsd、すなわち、スキーマファイル。
(アセンブリの依存関係)
別のアセンブリとの依存関係を確立することによって、XADアセンブリは、その内部にはない
・エンティティ型
・シグネチャ
・タグ定義
・パラメータグループ
・スキーマ
を使用することができる。
別のXADアセンブリとの依存関係は、マニフェストの依存アセンブリのリストにそのIDを含め、属性type=“xad”を指定することによって確立される。ファイルまたはパス情報を指定する必要はない。アセンブリIDは、ランタイムに解決され、対応するアセンブリがロードされる(「アセンブリのバインディング、ロード、およびアンロード」を参照されたい)。
XADアセンブリは、.NETアセンブリに依存することもできる。.NETアセンブリとの依存関係は、type属性が指定されないか、異なる値を有することを除いて、XADアセンブリとの依存関係と正確に同一の形で確立される。.NETアセンブリとの依存関係は、
・エンティティ型定義
・プリミティブタグ定義におけるエンティティ参照
・プリミティブタグ定義におけるエンティティビルダ参照
・プリミティブタグ定義におけるコマンドクラス参照
・メタデータ
において.NET型がXADアセンブリによって参照されるたびに確立されなければならない。
Figure 2008544338
以下は、XADアセンブリの依存関係に適用されるルールである:
・1つのアセンブリが、複数のアセンブリに依存することができる(Aが、B、C、Dなどに依存することができる);
・多数のアセンブリが、同一のアセンブリに依存することができる(B、C、Dなどが、Aに依存することができる);
・アセンブリの依存関係は、推移的ではない(AがBに依存し、BがCに依存する場合に、AはCに依存しない。Aは、必要に応じて、明示的にCを参照しなければならない);
・環状依存関係は、サポートされない(AがBに依存し、BがCに依存する場合、CはAに依存することができない)。
(アセンブリのバインディング、ロード、およびアンロード)
バインディングは、アセンブリIDをその物理的位置に解決するプロセスである。アセンブリIDは、パスおよびファイルなどの位置情報を含まない。Fusionは、.NETランタイムによって使用されるアセンブリバインディングアルゴリズムを定義する。長期XAD(long-term XAD)は、Fusionによって提供されるサービスとして、バインディングアルゴリズムを使用する。短期には、XADは、そのChildrenetを実装する。
すべての強く命名されてはいないアセンブリ(公開鍵トークンなし)が、アプリケーションフォルダの下に存在しなければならないことが要求される。アプリケーションフォルダは、ルート/メインアセンブリのマニフェストを含むフォルダである。
アセンブリIDが与えられると、XADランタイムは、以下のアルゴリズムを使用して、アセンブリを見つける:
1.アセンブリがタイプ「XAD」ではない場合には、アセンブリが.NETアセンブリであると仮定し、ロードを.NETフレームワークに委任する;
2.XADアセンブリの場合には、アセンブリ名を有するマニフェストについてアプリケーションフォルダをチェックし、それをロードする;
3.見つからない場合には、アセンブリ名を有するサブフォルダについてアセンブリフォルダをチェックする。見つかった場合には、アセンブリ名を有するマニフェストファイルについてチェックし、それをロードする;
4.見つからず、これがデバッグビルドである場合には、環境変数XADPATHで指定される各フォルダについてステップ2およびステップ3を繰り返す。これは開発時ファシリティのみである。XADPATHにおけるパスは、セミコロンで区切られる。
見つかったならば、アセンブリおよびそのすべての依存関係が、XADランタイムによってロードされる。このプロセスは、再帰的であり、依存関係について繰り返される。各依存関係の内容は、依存アセンブリのために使用可能にされる。アセンブリの内容が、すべてのアセンブリについてグローバルに使用可能にされるのではなく、それに直接的に依存するもののみについてであることに留意することが重要である。
スキーマは、このルールの例外である。スキーマ構成要素ファイルを伴うアセンブリをロードすると、スキーマが、ロードされ、グローバルスキーマコレクションに追加され、すべてのアセンブリのために使用可能にされる。しかし、これは、現在の実装の制限であり、要件と考えてはならない。これは、将来的に変更される可能性が非常に高い。
アセンブリをロードする以下の2つの形が存在する:
・別のアセンブリのマニフェスト内の静的な依存関係を介する;
・プログラム的に、
LoadAssemblyCommandを介して;
低水準パブリックAPIを介して。
ルートアセンブリ(アプリケーションアセンブリ)から開始し、その依存関係、当該依存関係の依存関係などに進むことによって、静的に依存するアセンブリの任意に深いグラフが形成される。XADランタイムは、アプリケーション起動時に、これらのすべてのアセンブリをロードする。開発者は、静的な依存関係として指定されていないアセンブリをロードすることもできる。プログラム的にロードされるアセンブリという特徴がターゲットとする主なシナリオは、アドインのサポートである(さらなる詳細については、「アドインモデル」を参照されたい)。
アプリケーションアセンブリ(ルート)およびすべてのプログラム的にロードされるアセンブリは、トップレベルアセンブリのセットを形成する。トップレベルアセンブリだけが、アプリケーションメタデータに寄与する。ルートアセンブリを除くトップレベルアセンブリだけを、プログラム的にアンロードすることができる。アセンブリは、トップレベルアセンブリとして後にプログラム的にロードされた場合であっても、静的な依存関係としてロードされる場合にはアンロードすることができない。そのようなアセンブリのアンロードは、静的にロードされるアセンブリからではなく、トップレベルアセンブリからそのアセンブリを除去することだけをもたらす。
(パッケージングのシナリオ)
(1ファイルアプリケーション)
「Hello world」は、単純な1ファイルアプリケーションの例である。1ファイルアプリケーションは、アプリケーション実行に必要なすべての情報を含む単一のXADファイルを有する。最小限でも、このファイルは、メインタグすなわちアプリケーションエントリポイントのタグ定義を含まなければならない。アセンブリまたはアセンブリマニフェストを作成する必要はない。
Figure 2008544338
1ファイルアプリケーションの要件は、以下の通りである:
・標準フレームワークだけに依存する。標準フレームワークは、デフォルトで使用可能であり、アセンブリマニフェストにおいて依存関係として指定される必要はない。アプリケーションが、標準フレームワークからのタグ、型、およびシグネチャだけを使用している場合に、そのアプリケーションは、そのマニフェストにおいて依存関係を指定する必要がない(マニフェストにおいて依存関係セクションがない);
・すべてのタグを単一ファイル内に有する。1つのファイルだけがある場合に、アプリケーションは、マニフェストの構成要素ファイルセクションを必要としない。そのタイプにかかわりなく、複数のファイルが生じるとすぐに、アプリケーションは、マニフェストにおいて構成要素ファイルを記述することを必要とする。
これらの要件が満たされる場合に、そのアプリケーションは、すべての重要なセクションが空になるので、アセンブリマニフェストを必要としない。これが1ファイルアプリケーションである。
(派生タグのライブラリ)
XADは、XAD作成者がXAD作成者自身のタグを定義することによって、この言語を拡張することを可能にする。それを行う最も簡単な方法は、派生タグを定義することである。というのは、派生タグが、XADによって実装され、低水準プログラミングのスキルを必要としないからである。XAD作成者は、最終的に再利用可能なカスタムタグのセットを用意し、多数のアセンブリおよびアプリケーションにまたがってそれらのタグを共有したいと思うであろう。これは、その後に他のアセンブリによって参照できる別々のアセンブリにタグをパッケージングすることによって、行うことができる。
以下の例には、MyTags.xadファイルにおいて定義され、MyLibraryアセンブリにパッケージングされる2つの再利用可能な派生タグが存在する。MyLibraryアセンブリは、MyApplicationアセンブリによって参照され、MyApplicationアセンブリは、このライブラリによって提供されるタグを使用している。
Figure 2008544338
Figure 2008544338
Figure 2008544338
Figure 2008544338
次に、これがどのように動作するかを示す:
・MyTags.xadファイルは、2つのタグ、すなわち、TextWithLabelおよびHyperlinkを定義する;
・MyTags.xadファイルは、MyLibraryマニフェストにおいて、構成要素ファイルとしてリストされている。これによって、このファイル内のすべてのタグが、MyLibraryアセンブリクライアントのために使用可能にされる;
・MyApplicationアセンブリは、MyLibraryアセンブリを参照し、したがって、MyLibraryにおいて定義されたすべてのタグへのアクセスを有する;
・MyApplicationファイルは、MyLibraryアセンブリにおいて定義されたHyperlinkタグを使用する。
(プリミティブタグのライブラリ)
XADは、カスタムプリミティブタグまたは派生タグを定義することによって、拡張することができる。派生タグは、XADを使用して実装されるので定義がより簡単であるが、プリミティブタグは、VBおよびC#などの低水準プログラミング言語を使用して実装されるので、より豊かな機能を提供することができる。これらの言語は、OSおよびマシンリソースへのフルアクセスを提供する。コンポーネント開発者、ツール開発者、およびプラットフォーム開発者は、多数のXADアプリケーションにおいてXAD作成者が再利用できるプリミティブタグを定義することができる。プリミティブタグのパッケージングは、派生タグのパッケージングとほとんど同一である(上記の例を参照されたい)。以下の2つの主要な相違が存在する:
・タグ定義は、XAD本体ではなく、エンティティビルダクラスへの参照を含む;
・プリミティブタグを含むアセンブリのマニフェストは、エンティティビルダを含む.NETアセンブリとの追加の依存関係を指定しなければならない。
エンティティビルダは、プリミティブタグに対応するエンティティをどのように作成して、ワイヤリングするかを知っている.NETコンポーネントである(エンティティビルダのさらなる詳細については、言語の概念を参照されたい)。
以下の例では、プリミティブタグとしてHyperlinkを実装している。
Figure 2008544338
クライアントコードは、派生タグとしてのHyperlinkを使用するコードと同一である。クライアントアセンブリは、他のアセンブリからのタグの実装詳細にも、その依存関係にも公開されない。
Figure 2008544338
Figure 2008544338
(アドインモデル)
(アドインモデルとは何か?)
アドイン(アドオンまたはプラグインとも呼ばれる)は、アプリケーションのアップグレードを必要とせずに、所与のソフトウェアアプリケーションの基本機能セットを拡張する、内蔵型のソフトウェアパッケージである。アドインは、ユーザが高価と考えられるアップグレードサイクルを全部行うことを必要とせずに、新しい機能またはサードパーティの拡張機能が使用可能になったときに、これらの機能を増分的に追加することを可能にする。
Figure 2008544338
アドインアーキテクチャが動作するための、以下の4つの重要な要件が存在する:
・拡張性プロトコルが、定義され、公開されなければならない;
・拡張されるアプリケーションが、拡張性プロトコルを正しく実装しなければならない;
・アドインが、拡張性プロトコルを正しく実装しなければならない;
・アプリケーションが、アドインの発見(discovery)およびロードをサポートしなければならない。
(XADアドインモデル)
XADアドインモデルは、以下の主要な概念に基づく:
・アセンブリの動的ロード;
・メタデータ駆動型の拡張性プロトコル;
・動的なエンティティのインスタンス化。
Figure 2008544338
(アセンブリの動的ロード)
アドインは、アセンブリ内にパッケージングされる。これは驚くべきことではない。というのは、XADアプリケーションのすべての部分が、アセンブリ内にパッケージングされるからである。アセンブリは通常、アセンブリマニフェストにおいて指定された静的な依存関係を介してロードされる(「アセンブリの依存関係」を参照されたい)。XADランタイムは、すべての静的な依存関係を自動的にロードする。
アセンブリは、動的にロードすることもできる。この場合、アセンブリは、どのマニフェストにおいても静的な依存関係としてリストされない。その代わりに、アプリケーションは、システム定義コマンド<loadAssembly>を使用して、そのマニフェストパスを指定することによって、アセンブリをロードすることができる。このパスは、単に1つのデータに過ぎず、ユーザ入力、アプリケーション状態、構成ファイルなどから取得することができる。アセンブリがロードされると、メタデータが更新され、そのエンティティが、動的インスタンス化に使用可能になる。
Figure 2008544338
(メタデータ駆動型の拡張性プロトコル)
拡張可能なXADアプリケーションは、その拡張性プロトコルを別々のアセンブリ内で定義し、その結果、このプロトコルを、公開して、そのアプリケーションと、拡張機能を記述するサードパーティとの両方によって参照できるようになる。
拡張性プロトコルは以下の2つの部分を有する:
・メタデータスキーマ:用語「メタデータ」は一般に、「データに関するデータ」を意味する。本仕様書の文脈では、メタデータは、アドインによって実装される機能の記述として使用される。メタデータには、タグ名、渡されるパラメータ、UIで人間が読み取り可能なテキストなどを含めることができる。拡張可能なアプリケーションは、メタデータスキーマ(アドインに何を期待するか)を定義する。アドインは、そのコンテンツを提供する;
・タグシグネチャ:アドインは、XADタグを定義することによってその機能を実装する。アプリケーションは、これらのタグを使用して、アドイン機能にアクセスする。アプリケーションは、タグシグネチャ(タグがどの型のエンティティをもたらさなければならないか、およびタグがどのパラメータをとるか)を定義し、アドインは、タグ定義(タグ名および実際の実装)を提供する。シグネチャをインターフェースになぞらえることができ、タグ定義をインターフェース実装になぞらえることができる。
XADは、システム定義タグ<Metadata>を介してアクセス可能なグローバルメタデータツリーをサポートする。メタデータツリーは、すべての動的にロードされたアセンブリからのすべてのメタデータ構成要素ファイルの結合である(構成要素に関する詳細については「ファイルタイプ」を参照されたい)。メタデータツリーは、ランタイムに、メタデータ構成要素ファイルを伴うアセンブリがロードされるかアンロードされるたびに、自動的に更新される。アプリケーションがそれ自体を動的に更新できるようにするために、正しい変更通知が送信される。メタデータツリーを使用して、アプリケーションは、どのアドインがロードされているかを発見し、そのアドインが提供する機能を使用することができる。
(動的なエンティティのインスタンス化)
XAD作成者は通常、XADコード内に直接的にXADタグを記述する。XADタグを使用することによって、作成者は、XADランタイムによってどのエンティティが作成されなければならないかを静的に宣言する。
アドインは、そのアドインが実装する機能にアクセスするためのタグを定義する。アドインは、アプリケーションが記述される時点では使用できないので、XAD作成者が、アドインによって定義されるタグを認識して使用することは、不可能である。作成者は、タグシグネチャを認識して、静的に定義するだけである。実際のタグ名、したがって最終的にパラメータ値は、アドインによってメタデータを介して提供される。アプリケーションは、メタデータスキーマがどのようなものであるかを正確に認識している。というのは、メタデータスキーマが、アプリケーション定義の拡張性プロトコルの一部であるからである。アプリケーションは、メタデータを読み取り、タグ名によってエンティティを動的にインスタンス化する。XADは、タグ名による動的エンティティインスタンス化用のシステム定義タグ<DynamicEntity>をサポートする。プロキシを有するタイプのエンティティだけを、動的にインスタンス化することができる。エンティティが、
・動的にロードされるアセンブリ内、
・DynamicEntityタグを使用しているアセンブリの静的な依存アセンブリ内
で定義される場合に限り、そのエンティティを動的にインスタンス化することができる。
(アドインのシナリオ)
以下のシナリオでは、新しいタイプのファイルをサポートするためにアドインを介して拡張できるファイルアプリケーションを説明する。このアプリケーションのアイデアは、ファイルタイプをサポートするアドインを有する限り、任意のタイプのファイルを開いて、示すことができるというものである。この例は、以下の3つの部分を有する:
・FileExtensionProtocolアセンブリ
Fileアプリケーションの拡張プロトコルを定義する。この拡張プロトコルは、メタデータスキーマおよび個々のファイルタグのシグネチャから構成される。この拡張プロトコルは、このアプリケーションと、様々なアドインとの両方がこの拡張プロトコルを参照できるようにするために、別々のアセンブリ内で定義される;
・Fileアセンブリ
Fileアプリケーションコード用のアセンブリ;
・SmartFilesAddInアセンブリ
架空の会社Smarts.comによって提供されるアドインアセンブリ。
(FileExtensionProtocolアセンブリ)
Figure 2008544338
Figure 2008544338
Figure 2008544338
(Fileアセンブリ)
Figure 2008544338
Figure 2008544338
(SmartFilesAddInアセンブリ)
Figure 2008544338
Figure 2008544338
Figure 2008544338
(付録A:コーディング規約)
以下は、推奨されるXADコーディング規約のリストである。標準XADフレームワークは、これらの規約のすべてに従う。サードパーティは、これらの規約の一部またはすべてを採用することを選択することができる。
これらの規約は、XADCopによって実施される。XADCopは、趣旨において、.Net FrameworkにおけるFxCopに似たXAD固有チェッカである。
12)$TODO: XADCopドキュメンテーションが利用可能になったならば、それにリンクする
Systemネームスペースの「sys」プレフィックス
13)$TODO
名前のPascal式大文字小文字の区別
14)$TODO
シグネチャ名は「Signature」で終わらなければならない
15)$TODO
「Set」パラメータの名前は「s」で終わらなければならない
16)$TODO
「単一の」エンティティタグの名前は「s」で終わってはならない
17)$TODO
セレクタタグの名前は「Selector」で終わらなければならない
18)$TODO
パラメータ(指定される場合)はエンティティの最初の属性でなければならない
19)$TODO
名前(指定される場合)はパラメータ(指定される場合)の後のエンティティの最初の属性でなければならない
20)$TODO
本発明によるアプリケーションフレームワークを用いてアプリケーションを構成でき、本発明によるアプリケーションフレームワークの下でアプリケーションを実行できる、コンピューティング環境および基本的なコンピューティングデバイスを示す機能図である。 1つまたは複数の表示されたデータオブジェクトを示す、例示的なワープロアプリケーションによって表示された例示的なワープロ文書を示すコンピュータスクリーンディスプレイを示す図である。 本発明の実施形態による、アプリケーションとアプリケーション記述エンジンと1つまたは複数のコンポーネントドメインとの間の相互作用を示す機能図である。 本発明による、アプリケーションコンポーネントが1つまたは複数のUIおよび1つまたは複数のデータストアに接続された、アプリケーションフレームワークアプリケーションの例示的な実施形態を示す機能図である。 本発明による、UIとデータストアとの間に接続された複数のアプリケーションを有し、かつ例示的なアプリケーション記述および例示的なXADエンジンによって構成されるか、または再構成されるXMLアプリケーションフレームワークの別の例示的な実施形態を示す機能図である。 本発明による、XAFアプリケーション内でイベントを実行する方法の実施形態を示すフロー図である。 本発明による、XAFアプリケーションを作成し、構成または再構成する方法の実施形態を示すフロー図である。 データレイヤの編成を示し、データレイヤと、データストアおよびデータクライアントを含む他のコンポーネントとの間の接続を示す図である。 トランザクション変換動作の動作フローを示す図である。 トランザクション変換動作に従って実行される制御動作を示す図である。 本発明の一実施形態において実行される動作の動作フローを示す図である。 本発明による、ソフトウェアメソッドの実行を順序付けるための、コンピュータ環境内で動作可能なマルチティア型フェーズ化モデルの実施形態を示す図である。 本発明による、フェーズ化されたモデル内でソフトウェアメソッドの実行を順序付けるための、ソフトウェアコンポーネントを有するモジュラ式ソフトウェアシステムの実施形態を示す図である。 本発明による、システム内の任意のソフトウェアメソッドの実行を順序付けるための、コンピュータシステム全体にまたがって動作する第1の、またはトップレベルのフェーズモデルまたはフェーズスペースの実施形態を示す図である。 本発明による、データの取り出しおよび書き込みを順序付ける、マスタフェーズスペースのフェーズの1つまたは複数の間に動作可能なサブフェーズスペースの実施形態を示す図である。 本発明による、プラグアンドプレイシステムの構成および動作を順序付ける、マスタフェーズスペースのフェーズの1つまたは複数の間に動作可能なサブフェーズスペースの実施形態を示す図である。 本発明による、プラグアンドプレイシステムの構成および動作を順序付ける、マスタフェーズスペースのフェーズの1つまたは複数の間に動作可能なサブフェーズスペースの実施形態を示す図である。 本発明による、あるフェーズへのソフトウェアメソッドの実行の制約を宣言するフェーズ制約属性を含むデータ構造体または言語属性の実施形態を示す図である。 本発明による、コンピュータシステムの動作をフェーズ化する方法の実施形態を示す図である。 本発明による、コンピュータシステムの動作をフェーズ化する方法の実施形態を示す図である。 本発明による、フェーズ化されたドメイン内で動作する、ユーザ連絡先情報を提供し、記憶するように動作する例示的なコンピュータシステムを示す図である。 本発明の一実施形態による、複数のオブジェクトを同時に実行するように構成された例示的なシステムを示す図である。 本発明の一実施形態による、複数のオブジェクトを同時に実行するように構成された別の例示的なシステムを示す図である。 内部シングルスレッドオブジェクトと外部オブジェクトとの間の非同期通信を示す図である。 コンカレンシドメインがデータベースとインターフェースをとる際の例示的な実行の経路を示す図である。 第1のコンカレンシドメインがデータベースとインターフェースをとる動作フローチャートである。 第1のコンカレンシドメインが第2のコンカレンシドメインとインターフェースをとる際の例示的な実行の経路を示す図である。 第1のコンカレンシドメインが第2のコンカレンシドメインとインターフェースをとる動作フローチャートである。 実行可能アプリケーションを形成するために作成されるデータおよびオブジェクトと関連する高水準のアプリケーション記述を示す図である アプリケーションコンポーネントのグラフを作成して、接続するために実行されるときの、図25に示されたアプリケーション記述を示す図である。 図25および図26のアプリケーション記述の内部コンポーネントと、データを処理し、かつ/または表示するのに使用される結果として生じるオブジェクトとの間の相互関係を示す図である。 マークアップ言語が実行される、本発明の一実施形態の動作特性を示すフロー図である。 アプリケーションが動的に再構成される、本発明の一実施形態の動作特性を示すフロー図である。 本発明の実施形態において、作成動作によって実行される動作の動作フローを示す図である。

Claims (20)

  1. ソフトウェアアプリケーションの1つまたは複数の機能を実行するために、前記ソフトウェアアプリケーションを構成する方法を実行するコンピュータ実行可能命令が記憶されたコンピュータ読み取り可能な媒体であって、前記コンピュータ実行可能命令がコンピュータによって実行されたときに、前記方法は、
    複数のアプリケーションコンポーネントを提供することと、
    前記アプリケーションによって受信される1つまたは複数のデータイベントに基づいて、接続されたコンポーネントのグラフを形成するために、接続されたコンポーネントの前記グラフの構造と、前記複数のコンポーネントのうちのどれが前記複数のコンポーネントのうちの他のコンポーネントに接続されるかとを判定することと、
    前記アプリケーションの第1の機能を提供するために、接続されたコンポーネントの前記グラフとして、前記複数のコンポーネントの一部を構成することと、
    前記複数のコンポーネントのうちの1つによるデータイベントの受信に応答して、前記複数のコンポーネントのうちの1つまたは複数の他のコンポーネントによる処理を呼び出すことと、
    前記複数のコンポーネントのうちの1つまたは複数の他のコンポーネントによる処理の呼び出しに応答して、前記アプリケーションの第2の機能を実行するために、接続されたコンポーネントの前記グラフを再構成することと
    を備えることを特徴とするコンピュータ読み取り可能な媒体。
  2. 接続されたコンポーネントの前記グラフとして、前記複数のコンポーネントの一部を前記構成することは、
    共通インターフェースを介して異なるタイプのコンポーネント間でデータを渡すことを可能にするために、アプリケーション記述エンジンによって、前記共通インターフェースを介して前記複数のコンポーネントの各々を前記複数のコンポーネントのうちの1つまたは複数の他のコンポーネントに接続することと、
    接続されたコンポーネントの前記グラフが実行されるときに、接続されたコンポーネントの前記グラフが、前記アプリケーションの前記第1の機能を実行するように、接続されたコンポーネントの前記グラフ内の接続されたコンポーネント間のすべての接続を含む、接続されたコンポーネントの前記グラフを前記アプリケーション記述エンジンによってインスタンス化することと
    をさらに含むことを特徴とする請求項1に記載のコンピュータ読み取り可能な媒体。
  3. 前記アプリケーションによって受信される1つまたは複数のデータイベントに基づいて、接続されたコンポーネントのグラフを形成するために、接続されたコンポーネントの前記グラフの構造と、前記複数のコンポーネントのうちのどれが前記複数のコンポーネントのうちの他のコンポーネントに接続されるかとを前記判定することは、
    前記複数のコンポーネントのうちのどれが、接続されたコンポーネントの前記グラフ内の接続されたコンポーネントのユニットとして一緒にグループ化されなければならないかを判定することであって、接続されたコンポーネントの前記ユニットは、前記アプリケーションによって受信される前記1つまたは複数のデータイベントに応答して、前記アプリケーションの機能を実行するために必要である、判定すること
    を含み、
    前記アプリケーションの第1の機能を提供するために、接続されたコンポーネントの前記グラフとして、前記複数のコンポーネントの一部を前記構成することは、
    前記アプリケーションによって受信される前記1つまたは複数のデータイベントに応答して、前記アプリケーションの機能を実行するために、接続されたコンポーネントのユニットとして一緒にグループ化されなければならない前記複数のコンポーネントを、コンポーネントドメインとして構成すること
    を含むことを特徴とする請求項1に記載のコンピュータ読み取り可能な媒体。
  4. 前記複数のコンポーネントのうちの1つまたは複数の他のコンポーネントによる処理を前記呼び出すことは、
    第1の処理フェーズにおいて、前記処理を呼び出す役割を担う前記データイベントに関連するデータを読み取って、接続されたコンポーネントの前記グラフに必要なすべての再構成を表すすべてのデータを要求することと、
    第2の処理フェーズにおいて、前記アプリケーションの第2の機能を実行するために、接続されたコンポーネントの前記グラフを再構成することと
    を含むことを特徴とする請求項1に記載のコンピュータ読み取り可能な媒体。
  5. 前記複数のコンポーネントのうちの1つまたは複数の他のコンポーネントによる処理を前記呼び出すことは、
    前記データイベントに関連するコンポーネントドメインによる処理を呼び出すことと、
    第1の処理フェーズにおいて、前記コンポーネントドメイン内で、前記処理を呼び出す役割を担う前記データイベントに関連するデータを読み取って、前記コンポーネントドメインに必要なすべての再構成を表すすべてのデータを要求することと、
    第2の処理フェーズにおいて、前記コンポーネントドメイン内で、前記アプリケーションの第2の機能を実行するために、前記コンポーネントドメインを再構成することと
    をさらに含むことを特徴とする請求項3に記載のコンピュータ読み取り可能な媒体。
  6. 前記アプリケーションによって受信される前記1つまたは複数のデータイベントに応答して、前記アプリケーションの機能を実行するためにコンポーネントドメインとして一緒に構成される前記コンポーネントは、
    前記コンポーネントドメインが構成されるときから、前記コンポーネントドメインが前記コンポーネントドメインの再構成を必要とするデータイベントに応答して再構成されるときまでにまたがる有効期間の間に、アプリケーション実行のユニットとして動作する
    ことを特徴とする請求項3に記載のコンピュータ読み取り可能な媒体。
  7. 接続されたコンポーネントの前記グラフを前記アプリケーション記述エンジンによって前記インスタンス化することは、
    前記アプリケーションから、前記第1の機能を記述する1つまたは複数のアプリケーション記述を受信するように動作可能なアプリケーション記述エンジンによって、接続されたコンポーネントの前記グラフをインスタンス化すること
    を含み、
    前記方法は、
    接続されたコンポーネントの前記グラフを形成するために、前記複数のコンポーネントのうちのどれを接続しなければならないかを判定するために、前記アプリケーション記述エンジンによって前記1つまたは複数のアプリケーション記述を解釈すること
    をさらに備えることを特徴とする請求項2に記載のコンピュータ読み取り可能な媒体。
  8. 前記方法は、
    接続されたコンポーネントの前記グラフを組み立てて構造化するための1つまたは複数の宣言ルールを、前記アプリケーション記述を介して受信することであって、前記アプリケーション記述エンジンは、前記アプリケーション記述を介して受信される前記宣言ルールに従って、接続されたコンポーネントの前記グラフをインスタンス化するようにさらに動作可能である、受信すること
    をさらに備えることを特徴とする請求項7に記載のコンピュータ読み取り可能な媒体。
  9. 前記アプリケーションから、前記第1の機能を記述する1つまたは複数のアプリケーション記述を受信するように動作可能なアプリケーション記述エンジンによって、接続されたコンポーネントの前記グラフを前記インスタンス化することは、
    前記アプリケーションから、前記第1の機能を記述する拡張マークアップ言語に従って構造化された1つまたは複数のアプリケーション記述を受信するように動作可能なアプリケーション記述エンジンによって、接続されたコンポーネントの前記グラフをインスタンス化すること
    を含み、
    前記アプリケーション記述エンジンは、前記複数のコンポーネントのうちの1つまたは複数に渡されるデータを、前記拡張マークアップ言語に従って構造化するようにさらに動作可能である
    ことを特徴とする請求項7に記載のコンピュータ読み取り可能な媒体。
  10. 接続されたコンポーネントの前記グラフを前記アプリケーション記述エンジンによって前記インスタンス化する前に、
    前記複数のコンポーネントを含むコンポーネントライブラリから、接続されたコンポーネントの前記グラフを含む前記複数のコンポーネントの前記一部を取り出す
    ことを特徴とする請求項2に記載のコンピュータ読み取り可能な媒体。
  11. 前記複数のコンポーネントを含むコンポーネントライブラリから、接続されたコンポーネントの前記グラフを含む前記複数のコンポーネントの前記一部を前記取り出すことは、
    ユーザインターフェースコネクタ、アクションコンポーネント、データコネクタ、アクセッサコンポーネント、トランスフォーマコンポーネント、およびインターフェースコンポーネントからなるコンポーネントのライブラリから、前記複数のコンポーネントの前記一部を取り出すこと
    を含むことを特徴とする請求項10に記載のコンピュータ読み取り可能な媒体。
  12. 前記複数のコンポーネントを含むコンポーネントライブラリから、接続されたコンポーネントの前記グラフを含む前記複数のコンポーネントの前記一部を前記取り出すことは、
    1つまたは複数のユーザインターフェース(UI)イベントを受信し、前記1つまたは複数のUIイベントを前記データイベントに変換し、すべての変更されたデータに対応する標準フォーマットデータ表現を受信し、前記すべての変更されたデータをUIに提供するために前記UIと接続する、少なくとも1つのUIコネクタを取り出すこと
    を含むことを特徴とする請求項10に記載のコンピュータ読み取り可能な媒体。
  13. 前記複数のコンポーネントを含むコンポーネントライブラリから、接続されたコンポーネントの前記グラフを含む前記複数のコンポーネントの前記一部を前記取り出すことは、
    前記データイベントを受信し、該データイベントを標準フォーマットアクションに変換する、前記UIコネクタに接続された少なくとも1つのアクションコンポーネントを取り出すこと
    を含むことを特徴とする請求項12に記載のコンピュータ読み取り可能な媒体。
  14. 前記複数のコンポーネントを含むコンポーネントライブラリから、接続されたコンポーネントの前記グラフを含む前記複数のコンポーネントの前記一部を前記取り出すことは、
    前記標準フォーマットアクションを受信し、前記データに対する前記標準フォーマットアクションを完了するためにデータストアに接続し、前記標準フォーマットデータ表現を前記UIコネクタに送信する、前記アクションコンポーネントと前記UIコネクタとの両方に接続された少なくとも1つのデータコネクタを取り出すこと
    を含むことを特徴とする請求項13に記載のコンピュータ読み取り可能な媒体。
  15. 前記複数のコンポーネントを含むコンポーネントライブラリから、接続されたコンポーネントの前記グラフを含む前記複数のコンポーネントの前記一部を前記取り出すことは、
    前記標準フォーマットデータ表現を、UI用にカスタマイズされたフォーマットに操作する少なくとも1つのトランスフォーマを取り出すこと
    を含むことを特徴とする請求項14に記載のコンピュータ読み取り可能な媒体。
  16. 前記複数のコンポーネントを含むコンポーネントライブラリから、接続されたコンポーネントの前記グラフを含む前記複数のコンポーネントの前記一部を前記取り出すことは、
    前記標準フォーマットアクションを、標準フォーマットデータ用にカスタマイズされたアクションに操作する少なくとも1つのアクセッサコンポーネントを取り出すこと
    を含むことを特徴とする請求項15に記載のコンピュータ読み取り可能な媒体。
  17. 前記複数のコンポーネントを含むコンポーネントライブラリから、接続されたコンポーネントの前記グラフを含む前記複数のコンポーネントの前記一部を前記取り出すことは、
    複数の他のコンポーネント間の通信を可能にするために、該複数の他のコンポーネント間のインターフェースを実装するサードパーティコンポーネントを取り出すこと
    を含むことを特徴とする請求項10に記載のコンピュータ読み取り可能な媒体。
  18. 前記方法は、
    複数の他のコンポーネント間の通信を可能にするために、該複数の他のコンポーネント間のインターフェースを実装すること
    をさらに備え、
    該インターフェースを実装することは、
    前記サードパーティコンポーネントによって、前記アプリケーション記述エンジンに提供される前記インターフェースを実装するための1つまたは複数の宣言ルールに従って、前記インターフェースを実装すること
    を含むことを特徴とする請求項17に記載のコンピュータ読み取り可能な媒体。
  19. ソフトウェアアプリケーションの1つまたは複数の機能を実行するために、前記ソフトウェアアプリケーションを構成する方法であって、
    複数のアプリケーションコンポーネントを提供することと、
    共通インターフェースを介して異なるタイプのコンポーネント間でデータを渡すことを可能にするために、アプリケーション記述エンジンによって、前記共通インターフェースを介して前記複数のコンポーネントの各々を前記複数のコンポーネントのうちの1つまたは複数の他のコンポーネントに接続することと、
    前記複数のコンポーネントからなる接続されたコンポーネントのグラフが実行されるときに、接続されたコンポーネントの前記グラフが前記アプリケーションの第1の機能を実行するように、接続されたコンポーネントの前記グラフ内の接続されたコンポーネント間のすべての接続を含む、接続されたコンポーネントの前記グラフを前記アプリケーション記述エンジンによってインスタンス化することと
    を備えることを特徴とする方法。
  20. ソフトウェアアプリケーションの1つまたは複数の機能を実行するために、前記ソフトウェアアプリケーションを構成する方法であって、
    複数のアプリケーションコンポーネントを提供することと、
    共通インターフェースを介して異なるタイプのコンポーネント間でデータを渡すことを可能にするために、アプリケーション記述エンジンによって、前記共通インターフェースを介して前記複数のコンポーネントの各々を前記複数のコンポーネントのうちの1つまたは複数の他のコンポーネントに接続することと、
    前記複数のコンポーネントからなる接続されたコンポーネントのグラフが実行されるときに、接続されたコンポーネントの前記グラフが前記アプリケーションの第1の機能を実行するように、接続されたコンポーネントの前記グラフ内の接続されたコンポーネント間のすべての接続を含む、接続されたコンポーネントの前記グラフを前記アプリケーション記述エンジンによってインスタンス化することと、
    前記複数のコンポーネントのうちの1つによるデータイベントの受信に応答して、前記複数のコンポーネントのうちの1つまたは複数の他のコンポーネントによる処理を呼び出すことと、
    前記複数のコンポーネントのうちの1つまたは複数の他のコンポーネントによる処理の呼び出しに応答して、前記アプリケーションの第2の機能を実行するために、接続されたコンポーネントの前記グラフを再構成することと
    を備えることを特徴とする方法。
JP2008508957A 2005-04-29 2006-04-20 ソフトウェアアプリケーションを構成する方法 Expired - Fee Related JP5042993B2 (ja)

Applications Claiming Priority (7)

Application Number Priority Date Filing Date Title
US67613705P 2005-04-29 2005-04-29
US60/676,137 2005-04-29
US70322005P 2005-07-28 2005-07-28
US60/703,220 2005-07-28
US11/360,457 US8132148B2 (en) 2005-04-29 2006-02-23 XML application framework
US11/360,457 2006-02-23
PCT/US2006/015161 WO2006118823A2 (en) 2005-04-29 2006-04-20 Xml application framework

Publications (2)

Publication Number Publication Date
JP2008544338A true JP2008544338A (ja) 2008-12-04
JP5042993B2 JP5042993B2 (ja) 2012-10-03

Family

ID=37235885

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008508957A Expired - Fee Related JP5042993B2 (ja) 2005-04-29 2006-04-20 ソフトウェアアプリケーションを構成する方法

Country Status (4)

Country Link
US (2) US8132148B2 (ja)
EP (1) EP1875376A4 (ja)
JP (1) JP5042993B2 (ja)
WO (1) WO2006118823A2 (ja)

Families Citing this family (38)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8275793B2 (en) * 2005-04-29 2012-09-25 Microsoft Corporation Transaction transforms
US8418132B2 (en) * 2005-04-29 2013-04-09 Microsoft Corporation Application description language
US20060245096A1 (en) * 2005-04-29 2006-11-02 Microsoft Corporation Application framework phasing model
US8132148B2 (en) * 2005-04-29 2012-03-06 Microsoft Corporation XML application framework
US8799857B2 (en) * 2005-04-29 2014-08-05 Microsoft Corporation XML application framework
US7581225B2 (en) * 2005-04-29 2009-08-25 Microsoft Corporation Multithreading with concurrency domains
US20080005752A1 (en) * 2006-06-30 2008-01-03 Robert Paul Morris Methods, systems, and computer program products for generating application processes by linking applications
KR100948384B1 (ko) * 2006-11-29 2010-03-22 삼성전자주식회사 권리객체의 이동이 가능한 디바이스와 휴대형 저장 장치 및권리객체의 이동 방법
US8645909B2 (en) * 2007-02-08 2014-02-04 IdentityMine, Inc. EvalBinding extension
US8190987B2 (en) * 2007-10-25 2012-05-29 Microsoft Corporation Private views of data and local calculations during real time collaboration
US20090112570A1 (en) * 2007-10-26 2009-04-30 Microsoft Corporation Declarative model interpretation
US8904276B2 (en) 2008-11-17 2014-12-02 At&T Intellectual Property I, L.P. Partitioning of markup language documents
US8336027B2 (en) 2009-05-27 2012-12-18 Microsoft Corporation Hierarchical view state storage
US20110035732A1 (en) * 2009-08-06 2011-02-10 Wynne Crisman Method and apparatus for defining and compiling or converting language and user interface system agnostic view definitions to runnable code
US8510751B2 (en) 2010-03-18 2013-08-13 International Business Machines Corporation Optimizing workflow engines
US8266126B2 (en) * 2010-03-24 2012-09-11 Matrixx Software, Inc. System with multiple conditional commit databases
US8898628B2 (en) * 2011-09-23 2014-11-25 Ahmad RAZA Method and an apparatus for developing software
WO2013063329A1 (en) * 2011-10-25 2013-05-02 Nicira, Inc. Physical controllers for converting universal flows
US9178833B2 (en) 2011-10-25 2015-11-03 Nicira, Inc. Chassis controller
US9164740B2 (en) * 2013-05-16 2015-10-20 Toshiba Global Commerce Solutions Holdings Corporation System and method for replacing java beans
US9256751B2 (en) * 2013-06-04 2016-02-09 Sap Se Public exposed objects
WO2015024237A1 (en) * 2013-08-22 2015-02-26 Successfactors, Inc. Improved daily task tools that interface with backend systems
US9558014B2 (en) * 2013-08-29 2017-01-31 International Business Machines Corporation System, method and apparatus for transparently enabling software applications with adaptive user interfaces
CN105706060B (zh) 2013-09-04 2018-11-27 惠普发展公司,有限责任合伙企业 数据包的报头部分下载
EP3049920A1 (de) 2013-09-27 2016-08-03 Rudolf Markus Petri Verfahren und einrichtung zur automatisierten erzeugung und bereitstellung wenigstens einer softwareanwendung
US9158658B2 (en) 2013-10-15 2015-10-13 International Business Machines Corporation Detecting merge conflicts and compilation errors in a collaborative integrated development environment
US10133586B2 (en) * 2014-04-01 2018-11-20 Henry Graber Method to configure, control, and display data products from a user interface
US10108931B2 (en) * 2014-09-26 2018-10-23 Oracle International Corporation Lock-based updating of a document
US10147158B2 (en) 2014-12-13 2018-12-04 Microsoft Technology Licensing, Llc Frame invalidation control with causality attribution
US20160232470A1 (en) * 2015-02-05 2016-08-11 Keguo Zhou Automated Generation of Process Flow Charts
SG10201507834SA (en) * 2015-09-21 2017-04-27 Yokogawa Electric Corp Mobile based on collaborative and interactive operations with smart mobile devices
US10204122B2 (en) 2015-09-30 2019-02-12 Nicira, Inc. Implementing an interface between tuple and message-driven control entities
US10768975B2 (en) * 2016-03-04 2020-09-08 Ricoh Company, Ltd. Information processing system, information processing apparatus, and information processing method
US11019167B2 (en) 2016-04-29 2021-05-25 Nicira, Inc. Management of update queues for network controller
US10203940B2 (en) * 2016-12-15 2019-02-12 Microsoft Technology Licensing, Llc Compiler with type inference and target code generation
US10972567B2 (en) * 2019-04-04 2021-04-06 International Business Machines Corporation Multi-dimensional tagging namespace for cloud resource management
EP3748518A1 (en) * 2019-06-06 2020-12-09 Siemens Aktiengesellschaft Designing and building an automation system to perform rule-based transformations on complex technical systems
US20220138206A1 (en) * 2020-10-30 2022-05-05 Snowflake Inc. System for implementing an object tagging framework

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004227359A (ja) * 2003-01-24 2004-08-12 Hitachi Ltd ポリシーに基づいたストレージシステムの運用管理方法
JP2004258809A (ja) * 2003-02-24 2004-09-16 Kansai Electric Power Co Inc:The 情報家電ネットワーク用ミドルウェア
JP2004280821A (ja) * 2003-03-12 2004-10-07 Microsoft Corp ソフトウェアビジネスプロセスモデル
JP2004334896A (ja) * 2000-04-10 2004-11-25 Nec Corp プラグアンドプレイ機能を有するフレームワークおよびその再構成方法
US20060248449A1 (en) * 2005-04-29 2006-11-02 Microsoft Corporation XML application framework

Family Cites Families (135)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4943932A (en) * 1986-11-25 1990-07-24 Cimflex Teknowledge Corporation Architecture for composing computational modules uniformly across diverse developmental frameworks
US5018097A (en) * 1987-08-21 1991-05-21 Siemens Aktiengesellschaft Modularly structured digital communications system for interconnecting terminal equipment and public networks, and having operation and reliability programs
JPH0727505B2 (ja) * 1990-02-12 1995-03-29 インターナショナル・ビジネス・マシーンズ・コーポレイション インターフェース方法及びインターフェース・システム
CA2061117C (en) 1991-12-02 1998-09-29 Neta J. Amit Apparatus and method for distributed program stack
WO1993012488A1 (en) * 1991-12-13 1993-06-24 White Leonard R Measurement analysis software system and method
US5392430A (en) 1992-10-30 1995-02-21 International Business Machines Hierarchical scheduling method for processing tasks having precedence constraints on a parallel processing system
JPH06332711A (ja) 1993-05-25 1994-12-02 Fujitsu Ltd データ処理システムにおけるオブジェクト管理処理方式
US5519866A (en) 1993-06-28 1996-05-21 Taligent, Inc. Method and apparatus of incrementally linking components of a modeled computer program
US6035321A (en) 1994-06-29 2000-03-07 Acis, Inc. Method for enforcing a hierarchical invocation structure in real time asynchronous software applications
US5980096A (en) * 1995-01-17 1999-11-09 Intertech Ventures, Ltd. Computer-based system, methods and graphical interface for information storage, modeling and stimulation of complex systems
US5805889A (en) 1995-10-20 1998-09-08 Sun Microsystems, Inc. System and method for integrating editing and versioning in data repositories
US6721951B1 (en) 1996-04-15 2004-04-13 Microsoft Corporation Data transfer utilizing single functionally independent data transfer mechanism
US6721941B1 (en) * 1996-08-27 2004-04-13 Compuware Corporation Collection of timing and coverage data through a debugging interface
US6760903B1 (en) * 1996-08-27 2004-07-06 Compuware Corporation Coordinated application monitoring in a distributed computing environment
US7054271B2 (en) * 1996-12-06 2006-05-30 Ipco, Llc Wireless network system and method for providing same
US5951653A (en) 1997-01-29 1999-09-14 Microsoft Corporation Method and system for coordinating access to objects of different thread types in a shared memory space
US5790855A (en) * 1997-01-31 1998-08-04 Sun Microsystems, Inc. System, method and article of manufacture for type checking appropriateness of port connection and variable type matching in connection with multiport object-oriented components
US5842020A (en) * 1997-01-31 1998-11-24 Sun Microsystems, Inc. System, method and article of manufacture for providing dynamic user editing of object oriented components used in an object oriented applet or application
GB2329490B (en) * 1997-09-19 2002-06-05 Ibm Remote application design
US6339775B1 (en) 1997-11-07 2002-01-15 Informatica Corporation Apparatus and method for performing data transformations in data warehousing
US5940828A (en) * 1997-11-18 1999-08-17 International Business Machines Corporation Locking contention resolution for shared resources
US6256772B1 (en) * 1997-11-24 2001-07-03 International Business Machines Corporation Multilingual hierarchial scripting environment
US6208336B1 (en) * 1998-03-20 2001-03-27 Sun Microsystems, Inc. Dynamic graphical user interface feature-set configuration
US6083276A (en) 1998-06-11 2000-07-04 Corel, Inc. Creating and configuring component-based applications using a text-based descriptive attribute grammar
US6205465B1 (en) 1998-07-22 2001-03-20 Cisco Technology, Inc. Component extensible parallel execution of multiple threads assembled from program components specified with partial inter-component sequence information
US6256780B1 (en) 1998-09-10 2001-07-03 Microsoft Corp. Method and system for assembling software components
US6272675B1 (en) 1998-10-01 2001-08-07 Unisys Corporation Development system for automatically enabling a server application to execute with an XATMI-compliant transaction manager managing transactions within multiple environments
US6336118B1 (en) * 1998-12-03 2002-01-01 International Business Machines Corporation Framework within a data processing system for manipulating program objects
US6826553B1 (en) 1998-12-18 2004-11-30 Knowmadic, Inc. System for providing database functions for multiple internet sources
US6424948B1 (en) * 1999-02-19 2002-07-23 Guozhu Dong Declarative workflow system supporting side-effects
US6718533B1 (en) 1999-02-26 2004-04-06 Real-Time Innovations, Inc. Method for building a real-time control system with mode and logical rate
US6415434B1 (en) * 1999-06-18 2002-07-02 Hewlett-Packard Company Apparatus and method for a runtime method overloading resolver
JP2001038796A (ja) 1999-07-30 2001-02-13 Nippon Plast Co Ltd ブロー成形品及びブロー成形方法
US6601233B1 (en) 1999-07-30 2003-07-29 Accenture Llp Business components framework
US6601234B1 (en) 1999-08-31 2003-07-29 Accenture Llp Attribute dictionary in a business logic services environment
US6854107B2 (en) 1999-12-29 2005-02-08 Baker Hughes Incorporated Method of and system for designing an N-tier software architecture for use in generating software components
JP4925514B2 (ja) 2000-02-29 2012-04-25 株式会社レーベン販売 内外イベントドリブン方式によるプログラム実行制御方法、プログラム、実行制御装置および記録媒体
US6857008B1 (en) 2000-04-19 2005-02-15 Cisco Technology, Inc. Arrangement for accessing an IP-based messaging server by telephone for management of stored messages
US7287259B2 (en) 2000-04-24 2007-10-23 Microsoft Corporation Isolating assembly versions for binding to application programs
FR2810423A1 (fr) 2000-06-16 2001-12-21 Suntech Systeme informatique modulaire et procede associe
US6670969B1 (en) 2000-06-29 2003-12-30 Curl Corporation Interface frames for threads
US7039920B2 (en) 2000-07-03 2006-05-02 Oculus Technologies Corporation Method and apparatus for providing a search engine for optimizing a decentralized or emergent model on a computer network
US6983464B1 (en) * 2000-07-31 2006-01-03 Microsoft Corporation Dynamic reconfiguration of multimedia stream processing modules
JP2004506262A (ja) * 2000-08-04 2004-02-26 イントリンジック グラフィックス, インコーポレイテッド グラフィックハードウェアおよびソフトウェアの開発
JP3750504B2 (ja) 2000-08-09 2006-03-01 セイコーエプソン株式会社 データ更新方法および情報処理装置
US6795868B1 (en) 2000-08-31 2004-09-21 Data Junction Corp. System and method for event-driven data transformation
US20020065950A1 (en) 2000-09-26 2002-05-30 Katz James S. Device event handler
US9742614B2 (en) 2000-09-28 2017-08-22 Wellogix Technology Licensing, Llc Data-type definition driven dynamic business component instantiation and execution framework
US6823518B1 (en) 2000-10-17 2004-11-23 Microsoft Corporation Threading and communication architecture for a graphical user interface
EP1330709A2 (en) 2000-11-03 2003-07-30 Wilde Technologies Limited A software development process
US20030204503A1 (en) 2000-11-09 2003-10-30 Lars Hammer Connecting entities with general functionality in aspect patterns
US7031968B2 (en) * 2000-12-07 2006-04-18 Prev-U Israel Ltd. Method and apparatus for providing web site preview information
US7200838B2 (en) 2000-12-20 2007-04-03 National Instruments Corporation System and method for automatically generating a graphical program in response to a state diagram
US7085773B2 (en) 2001-01-05 2006-08-01 Symyx Technologies, Inc. Laboratory database system and methods for combinatorial materials research
US20030236925A1 (en) * 2001-05-17 2003-12-25 Dusan Balek Interactive portable object adapters support in an integrated development environment
US7043481B2 (en) 2001-06-01 2006-05-09 Thought, Inc. System, method and software for creating, maintaining, navigating or manipulating complex data objects and their data relationships
US7367028B2 (en) 2001-08-14 2008-04-29 National Instruments Corporation Graphically deploying programs on devices in a system
US7076483B2 (en) * 2001-08-27 2006-07-11 Xyleme Sa Ranking nodes in a graph
US8473922B2 (en) * 2001-09-19 2013-06-25 Hewlett-Packard Development Company, L.P. Runtime monitoring in component-based systems
US20030063120A1 (en) * 2001-09-28 2003-04-03 Wong Hoi Lee Candy Scalable graphical user interface architecture
EP1298527A1 (en) * 2001-09-28 2003-04-02 Sony International (Europe) GmbH A system for automatically creating a context information providing configuration
US7234111B2 (en) * 2001-09-28 2007-06-19 Ntt Docomo, Inc. Dynamic adaptation of GUI presentations to heterogeneous device platforms
US7559032B2 (en) 2001-10-12 2009-07-07 National Instruments Corporation System and method for enabling a graphical program to respond to user interface events
US7032210B2 (en) 2001-11-11 2006-04-18 International Business Machines Corporation Method and system for generating program source code of a computer application from an information model
US6971004B1 (en) * 2001-11-19 2005-11-29 Cypress Semiconductor Corp. System and method of dynamically reconfiguring a programmable integrated circuit
US20030135825A1 (en) * 2001-12-05 2003-07-17 Matthew Gertner Dynamically generated mark-up based graphical user interfaced with an extensible application framework with links to enterprise resources
US6621295B1 (en) * 2002-01-15 2003-09-16 Xilinx, Inc. Reconfigurable priority encoding
US7228326B2 (en) 2002-01-18 2007-06-05 Bea Systems, Inc. Systems and methods for application deployment
US7240243B2 (en) 2002-03-28 2007-07-03 International Business Machines Corporation System and method for facilitating programmable coverage domains for a testcase generator
US20040051739A1 (en) * 2002-06-20 2004-03-18 Schmickley Michael J. Alarm graphic editor with automatic update
AU2003245660A1 (en) 2002-06-24 2004-01-06 National Instruments Corporation Task based polymorphic graphical program function nodes
US7412497B2 (en) * 2002-07-25 2008-08-12 Sun Microsystems, Inc. Generation of Administration framework for server systems
US7206827B2 (en) * 2002-07-25 2007-04-17 Sun Microsystems, Inc. Dynamic administration framework for server systems
US6704656B1 (en) * 2002-10-18 2004-03-09 Schlumberger Technology Corporation Method, apparatus and computer program product to allow automatic product composition
US7222332B2 (en) 2002-10-24 2007-05-22 International Business Machines Corporation Method and apparatus for overlay management within an integrated executable for a heterogeneous architecture
US7181744B2 (en) 2002-10-24 2007-02-20 International Business Machines Corporation System and method for transferring data between virtual machines or other computer entities
US20040083238A1 (en) 2002-10-24 2004-04-29 General Electric Company Method, system, and storage medium for integrating project management tools
US6983456B2 (en) * 2002-10-31 2006-01-03 Src Computers, Inc. Process for converting programs in high-level programming languages to a unified executable for hybrid computing platforms
US7290138B2 (en) * 2003-02-19 2007-10-30 Microsoft Corporation Credentials and digitally signed objects
US7779405B2 (en) 2003-03-14 2010-08-17 At&T Intellectual Property I, L.P. Run-time determination of application delivery
US20040187090A1 (en) 2003-03-21 2004-09-23 Meacham Randal P. Method and system for creating interactive software
US7827524B2 (en) 2003-04-22 2010-11-02 Computer Associates Think, Inc. System and method for integrating object-oriented model profiles and object-oriented programming languages
US7496574B2 (en) 2003-05-01 2009-02-24 International Business Machines Corporation Managing locks and transactions
US7558841B2 (en) 2003-05-14 2009-07-07 Microsoft Corporation Method, system, and computer-readable medium for communicating results to a data query in a computer network
US20040230945A1 (en) 2003-05-15 2004-11-18 Bryant Deborah E. Integration of a configuration tool with a graphical program language
US20040235520A1 (en) 2003-05-20 2004-11-25 Cadiz Jonathan Jay Enhanced telephony computer user interface allowing user interaction and control of a telephone using a personal computer
US7240327B2 (en) * 2003-06-04 2007-07-03 Sap Ag Cross-platform development for devices with heterogeneous capabilities
JP4028444B2 (ja) 2003-06-27 2007-12-26 株式会社東芝 スケジューリング方法およびリアルタイム処理システム
JP2005043962A (ja) 2003-07-22 2005-02-17 Nippon Telegr & Teleph Corp <Ntt> 分散サーバシステム、サーバ、アプリケーションプロセス起動制御方法、及びプログラム
CA2476156A1 (en) * 2003-07-30 2005-01-30 J2X Technologies Inc. System, computer product and method for enabling wireless data synchronization
EP1660994A2 (en) * 2003-08-07 2006-05-31 National Instruments Corporation A graphical program which executes a timed loop
US7650589B2 (en) * 2003-08-15 2010-01-19 National Instruments Corporation Signal analysis function blocks and method of use
US7506307B2 (en) 2003-10-24 2009-03-17 Microsoft Corporation Rules definition language
US7526771B2 (en) 2003-11-12 2009-04-28 Ntt Docomo, Inc. Method and apparatus for configuring an application while the application is running
US7324931B1 (en) * 2003-11-17 2008-01-29 The Mathworks, Inc. Conversion of model components into references
US7194663B2 (en) 2003-11-18 2007-03-20 Honeywell International, Inc. Protective bus interface and method
US7287023B2 (en) * 2003-11-26 2007-10-23 International Business Machines Corporation Index structure for supporting structural XML queries
US7676785B2 (en) 2004-02-13 2010-03-09 Microsoft Corporation Hosted application as a designer in an integrated development environment
US7570267B2 (en) * 2004-05-03 2009-08-04 Microsoft Corporation Systems and methods for providing an enhanced graphics pipeline
US7836426B2 (en) 2004-05-06 2010-11-16 National Instruments Corporation Automatic generation of application domain specific graphical programs
US8063936B2 (en) * 2004-06-01 2011-11-22 L-3 Communications Corporation Modular immersive surveillance processing system and method
US7730482B2 (en) * 2004-06-08 2010-06-01 Covia Labs, Inc. Method and system for customized programmatic dynamic creation of interoperability content
EP1787197A2 (en) * 2004-09-10 2007-05-23 Graphlogic Inc. Object process graph application development system
US7703027B2 (en) 2005-01-13 2010-04-20 National Instruments Corporation Merging graphical programs
US8051148B2 (en) 2005-01-13 2011-11-01 National Instruments Corporation Determining differences between configuration diagrams
US7987445B2 (en) 2005-01-13 2011-07-26 National Instruments Corporation Comparing a configuration diagram to an actual system
JP4348546B2 (ja) * 2005-01-20 2009-10-21 ソニー株式会社 信号処理装置、信号処理プログラムおよび記録媒体
US7383285B1 (en) 2005-03-08 2008-06-03 Unisys Corporation Method for exposing hierarchical table structures and relationships to OLE DB applications
JP4457925B2 (ja) * 2005-03-11 2010-04-28 ヤマハ株式会社 編集装置、音響信号処理システム及びプログラム
US7657868B2 (en) 2005-03-14 2010-02-02 Research In Motion Limited System and method for applying development patterns for component based applications
JP4622611B2 (ja) * 2005-03-24 2011-02-02 ソニー株式会社 信号処理装置
US7653903B2 (en) * 2005-03-25 2010-01-26 Sony Corporation Modular imaging download system
US7559054B2 (en) 2005-04-19 2009-07-07 Microsoft Corporation Abstract interpretation with a congruence abstract domain and/or a heap succession abstract domain
US20060247936A1 (en) * 2005-04-28 2006-11-02 International Business Machines Corporation Business Activity Creation Using Business Context Services for Adaptable Service Oriented Architecture Components
US7739691B2 (en) 2005-04-29 2010-06-15 Microsoft Corporation Framework for declarative expression of data processing
US8418132B2 (en) 2005-04-29 2013-04-09 Microsoft Corporation Application description language
US7581225B2 (en) 2005-04-29 2009-08-25 Microsoft Corporation Multithreading with concurrency domains
US8275793B2 (en) 2005-04-29 2012-09-25 Microsoft Corporation Transaction transforms
US20060245096A1 (en) 2005-04-29 2006-11-02 Microsoft Corporation Application framework phasing model
US8799857B2 (en) 2005-04-29 2014-08-05 Microsoft Corporation XML application framework
US20060253830A1 (en) 2005-05-06 2006-11-09 Rajanala Arun K Guiding application building using business constraint metadata
US8510711B2 (en) 2006-05-30 2013-08-13 Siemens Aktiengesellschaft Central strategy management component for providing semantic-free administration functions for a system of applications
US8863102B2 (en) 2007-04-02 2014-10-14 International Business Machines Corporation Method and system for assembling information processing applications based on declarative semantic specifications
US8166465B2 (en) 2007-04-02 2012-04-24 International Business Machines Corporation Method and system for composing stream processing applications according to a semantic description of a processing goal
US8087010B2 (en) 2007-09-26 2011-12-27 International Business Machines Corporation Selective code generation optimization for an advanced dual-representation polyhedral loop transformation framework
US8087011B2 (en) 2007-09-26 2011-12-27 International Business Machines Corporation Domain stretching for an advanced dual-representation polyhedral loop transformation framework
US8056065B2 (en) 2007-09-26 2011-11-08 International Business Machines Corporation Stable transitions in the presence of conditionals for an advanced dual-representation polyhedral loop transformation framework
US8201147B2 (en) 2008-02-08 2012-06-12 Microsoft Corporation Generic XAD processing model
US20090288069A1 (en) 2008-05-15 2009-11-19 One Microsoft Way Dynamic Declarative Application Description
US8434053B2 (en) 2008-11-26 2013-04-30 Red Hat, Inc. Package review process workflow
US8352914B2 (en) 2008-12-15 2013-01-08 Accenture Global Services Limited Impact analysis of software change requests
US8302077B2 (en) 2009-03-13 2012-10-30 Oracle America, Inc. Method and system for configuring software modules to execute in an execution environment
US8418165B2 (en) 2009-05-27 2013-04-09 Microsoft Corporation Package design and generation
US8531451B2 (en) 2009-06-19 2013-09-10 Microsoft Corporation Data-driven visualization transformation
US8843904B2 (en) 2010-01-26 2014-09-23 International Business Machines Corporation Automated building and retargeting of architecture-dependent assets

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004334896A (ja) * 2000-04-10 2004-11-25 Nec Corp プラグアンドプレイ機能を有するフレームワークおよびその再構成方法
JP2004227359A (ja) * 2003-01-24 2004-08-12 Hitachi Ltd ポリシーに基づいたストレージシステムの運用管理方法
JP2004258809A (ja) * 2003-02-24 2004-09-16 Kansai Electric Power Co Inc:The 情報家電ネットワーク用ミドルウェア
JP2004280821A (ja) * 2003-03-12 2004-10-07 Microsoft Corp ソフトウェアビジネスプロセスモデル
US20060248449A1 (en) * 2005-04-29 2006-11-02 Microsoft Corporation XML application framework

Also Published As

Publication number Publication date
WO2006118823A3 (en) 2009-05-14
WO2006118823A2 (en) 2006-11-09
EP1875376A4 (en) 2011-08-31
US8793649B2 (en) 2014-07-29
EP1875376A2 (en) 2008-01-09
US20120167039A1 (en) 2012-06-28
US20060248449A1 (en) 2006-11-02
JP5042993B2 (ja) 2012-10-03
US8132148B2 (en) 2012-03-06

Similar Documents

Publication Publication Date Title
JP5042993B2 (ja) ソフトウェアアプリケーションを構成する方法
US8046737B2 (en) XML application framework
CN101512503B (zh) Xml应用程序框架
JP5021193B2 (ja) 拡張可能ワークフローモデルの宣言的表現
JP5710852B2 (ja) 設計時および実行時にワークフローを継ぎ目なくオーサリングし編集するためのフレームワーク
JP4806240B2 (ja) コンポーネント化された拡張可能なワークフローモデル
US7793255B1 (en) System and method for maintaining alternate object views
US8375351B2 (en) Extensible rapid application development for disparate data sources
US20050188349A1 (en) Data association
US20050188350A1 (en) Data binding
WO2006118872A2 (en) Application description language
JP2006107479A (ja) ワークフロー領域内の分野横断的動作問題(cross−cuttingbehavioralconcerns)をモデル化するためのフレームワーク
JP2006107480A (ja) フローベースおよび制約ベースのワークフローをオーサリングし、実行するための統一モデル
US20090288069A1 (en) Dynamic Declarative Application Description
US8201147B2 (en) Generic XAD processing model
US20060089941A1 (en) Data source objects for producing collections of data items
MacDonald et al. Pro Asp. net 2.0 in C# 2005
Radjenovic et al. The role of dependency links in ensuring architectural view consistency
Abrams et al. User interface markup language (UIML) specification
Fernandez BPEL with Explicit Data Flow: Model, Editor, and Partitioning Tool
Osenkov Designing, implementing and integrating a structured C# code editor
Helms et al. User Interface Markup Language (UIML) Version 4.0
Solano Exploring How Model Oriented Programming Can Be Extended to the User Interface Level
Narraway An Example of a Synergistic Relationship Between Software Architecture and a Domain-Specific Language
Bukovics Workflow Serialization and Markup

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20090323

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20111116

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20111125

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120227

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120316

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120615

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20120706

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120711

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20150720

Year of fee payment: 3

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees