JP2006252539A - システムデータインターフェース、関連アーキテクチャ、印刷システムデータインターフェース、および関連印刷システムアーキテクチャ - Google Patents

システムデータインターフェース、関連アーキテクチャ、印刷システムデータインターフェース、および関連印刷システムアーキテクチャ Download PDF

Info

Publication number
JP2006252539A
JP2006252539A JP2006032952A JP2006032952A JP2006252539A JP 2006252539 A JP2006252539 A JP 2006252539A JP 2006032952 A JP2006032952 A JP 2006032952A JP 2006032952 A JP2006032952 A JP 2006032952A JP 2006252539 A JP2006252539 A JP 2006252539A
Authority
JP
Japan
Prior art keywords
interface
client
objects
server
collection
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.)
Withdrawn
Application number
JP2006032952A
Other languages
English (en)
Other versions
JP2006252539A5 (ja
Inventor
F Maxa Adrian
エフ.マクサ エイドリアン
Mark A Lawrence
エー.ローレンス マーク
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 JP2006252539A publication Critical patent/JP2006252539A/ja
Publication of JP2006252539A5 publication Critical patent/JP2006252539A5/ja
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61HPHYSICAL THERAPY APPARATUS, e.g. DEVICES FOR LOCATING OR STIMULATING REFLEX POINTS IN THE BODY; ARTIFICIAL RESPIRATION; MASSAGE; BATHING DEVICES FOR SPECIAL THERAPEUTIC OR HYGIENIC PURPOSES OR SPECIFIC PARTS OF THE BODY
    • A61H39/00Devices for locating or stimulating specific reflex points of the body for physical therapy, e.g. acupuncture
    • A61H39/06Devices for heating or cooling such points within cell-life limits
    • 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/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61KPREPARATIONS FOR MEDICAL, DENTAL OR TOILETRY PURPOSES
    • A61K36/00Medicinal preparations of undetermined constitution containing material from algae, lichens, fungi or plants, or derivatives thereof, e.g. traditional herbal medicines
    • A61K36/18Magnoliophyta (angiosperms)
    • A61K36/185Magnoliopsida (dicotyledons)
    • A61K36/28Asteraceae or Compositae (Aster or Sunflower family), e.g. chamomile, feverfew, yarrow or echinacea
    • A61K36/282Artemisia, e.g. wormwood or sagebrush
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61HPHYSICAL THERAPY APPARATUS, e.g. DEVICES FOR LOCATING OR STIMULATING REFLEX POINTS IN THE BODY; ARTIFICIAL RESPIRATION; MASSAGE; BATHING DEVICES FOR SPECIAL THERAPEUTIC OR HYGIENIC PURPOSES OR SPECIFIC PARTS OF THE BODY
    • A61H2201/00Characteristics of apparatus not provided for in the preceding codes
    • A61H2201/01Constructive details
    • A61H2201/0165Damping, vibration related features
    • A61H2201/0169Noise reduction
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61HPHYSICAL THERAPY APPARATUS, e.g. DEVICES FOR LOCATING OR STIMULATING REFLEX POINTS IN THE BODY; ARTIFICIAL RESPIRATION; MASSAGE; BATHING DEVICES FOR SPECIAL THERAPEUTIC OR HYGIENIC PURPOSES OR SPECIFIC PARTS OF THE BODY
    • A61H2201/00Characteristics of apparatus not provided for in the preceding codes
    • A61H2201/02Characteristics of apparatus not provided for in the preceding codes heated or cooled
    • A61H2201/0221Mechanism for heating or cooling
    • A61H2201/025Mechanism for heating or cooling by direct air flow on the patient's body
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61HPHYSICAL THERAPY APPARATUS, e.g. DEVICES FOR LOCATING OR STIMULATING REFLEX POINTS IN THE BODY; ARTIFICIAL RESPIRATION; MASSAGE; BATHING DEVICES FOR SPECIAL THERAPEUTIC OR HYGIENIC PURPOSES OR SPECIFIC PARTS OF THE BODY
    • A61H2201/00Characteristics of apparatus not provided for in the preceding codes
    • A61H2201/02Characteristics of apparatus not provided for in the preceding codes heated or cooled
    • A61H2201/0221Mechanism for heating or cooling
    • A61H2201/0278Mechanism for heating or cooling by chemical reaction
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61HPHYSICAL THERAPY APPARATUS, e.g. DEVICES FOR LOCATING OR STIMULATING REFLEX POINTS IN THE BODY; ARTIFICIAL RESPIRATION; MASSAGE; BATHING DEVICES FOR SPECIAL THERAPEUTIC OR HYGIENIC PURPOSES OR SPECIFIC PARTS OF THE BODY
    • A61H2201/00Characteristics of apparatus not provided for in the preceding codes
    • A61H2201/50Control means thereof
    • A61H2201/5058Sensors or detectors
    • A61H2201/5082Temperature sensors

Landscapes

  • Health & Medical Sciences (AREA)
  • Engineering & Computer Science (AREA)
  • Natural Medicines & Medicinal Plants (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Animal Behavior & Ethology (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Rehabilitation Therapy (AREA)
  • Veterinary Medicine (AREA)
  • Public Health (AREA)
  • Epidemiology (AREA)
  • General Health & Medical Sciences (AREA)
  • Alternative & Traditional Medicine (AREA)
  • Biotechnology (AREA)
  • Mycology (AREA)
  • Microbiology (AREA)
  • Pain & Pain Management (AREA)
  • Physical Education & Sports Medicine (AREA)
  • Pharmacology & Pharmacy (AREA)
  • Botany (AREA)
  • Chemical & Material Sciences (AREA)
  • Medical Informatics (AREA)
  • Medicinal Chemistry (AREA)
  • Computer And Data Communications (AREA)
  • Accessory Devices And Overall Control Thereof (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】システムのデータインターフェースおよび関係するアーキテクチャを提供すること。
【解決手段】さまざまな実施形態は、汎用データモデル、非同期クライアントおよびサーバディスパッチ、キャンセレーション、バッチ処理、トランザクション呼び出し、並列呼び出し、インターセプション、またはリフレクションの機能のうちの1つまたは複数を実現できる。一実施形態では、システムデータインターフェースは、印刷システムとの関連で使用される。
【選択図】図1

Description

本発明は、システムデータインターフェースおよび関係するアーキテクチャに関するものであり、特定の実施形態において、印刷システムデータインターフェースおよび関係するアーキテクチャに関するものである。
いくつかのシステムは、データを処理し、さまざまな種類のクライアントと通信するサーバを備えることができる。特定の種類のシステムとして、さまざまなクライアントからのジョブ、デバイス、論理サーバ、およびフォームデータにアクセスできるようにするプリントサーバを備えることができる印刷システムがある。印刷システムなどの多くの現行システムは、新しいクラスのデータをサポートする必要が生じると必ず修正されなければならない融通のきかない基幹ネットワークインターフェースを備えている。さらに、いくつかのインターフェースは、いたずらに多くの通信を必要とし、サーバ上にコンテキストを生成する場合があるが、この両方とも、印刷システムなど、サーバが使用されるどのようなコンテキストであってもサーバパフォーマンスを制限する可能性がある。
多くのシステムにとって厄介な他の問題では、融通がきかない、拡張が難しい、プロトコル特有である範囲の制限が生じうる。
したがって、本発明は、改善されたデータインターフェースおよび関係するアーキテクチャを含む、改善されたシステムを異次元することに関連する懸案事項から生じた。
システムのデータインターフェースおよび関係するアーキテクチャについて説明する。さまざまな実施形態は、汎用データモデル、非同期クライアントおよびサーバディスパッチ(asynchronous client and server dispatch)、キャンセレーション、バッチ処理、トランザクション呼び出し、並列呼び出し、インターセプション、およびリフレクションの機能のうちの1つまたは複数を実現できる。
一実施形態では、システムデータインターフェースは、印刷システムとの関連で使用される。
概要
後述の説明において、現行システムの欠点の多くを解消する新規性のあるシステムが提示される。一実施形態では、システム、そのデータインターフェース、および関連するアーキテクチャは、印刷システムとの関連で使用される。しかし、本発明の後述の特徴を、請求された主題の精神および範囲から逸脱することなく、印刷システム以外のシステムで使用することができることは理解されるであろう。
説明される印刷システムは、多くのことを実行するが、基本的には説明されている印刷システムは2、3の主要タスクを実行する。第1に、印刷システムは、オブジェクトおよびその特性の集合を含むデータを管理する。第2に、印刷システムは、まずレンダリングのため印刷ジョブをスケジュールし、その後、印刷のため印刷ジョブを適切な印刷デバイスに送信する。ドキュメントをレンダリングするプロセスは、ジョブを処理するために呼び出すコンポーネントを指定するデータインターフェースから構成情報を取り出すことにより実行することができる。そのため、印刷システムがデータを表す方法は、そのオペレーションに対し基本的なものとすることができる。
これらの主要タスクを実行するために、本発明の印刷システムでは、特定のインターフェースおよび関係するコンポーネントを使用する。このインターフェースおよびこのインターフェースが含まれる印刷システムは、現行印刷システムに勝る多数の利点を備えることができる。以下の説明では、印刷システムおよびインターフェースの予備的評価を行うため、さまざまな利点について説明する。この説明の後の、「例示的な実施形態」という表題の節では、印刷システム、および特に、データインターフェースの具体的実装例を説明する。
後述のデータインターフェースは、汎用データモデル、非同期クライアントディスパッチ、非同期サーバディスパッチ、キャンセレーション、バッチ処理、トランザクション呼び出し、並列呼び出し、インターセプション、およびリフレクションの機能をサポートするが、それぞれ、見出しを立てて説明し、示す。
汎用データモデル
説明されるデータインターフェースを、汎用データモデルをサポートし、汎用データモデルとして考えられるものに関連して使用することができる。データモデルは、以下の機能を備えるオブジェクトのクラスをサポートすることができる。
● プロパティ−いかなるオブジェクトも、プロパティの任意の集合を持つことができる。クライアントは、オブジェクトから取り出すプロパティのどのような集合をも指定することができる。クライアント側で興味を持つプロパティのみが取り出される。
● コマンド−どのようなオブジェクトも、パラメータの任意の集合を伴うコマンドの集合をサポートすることができる。
● サーバからクライアントへ利用可能なクラス、コマンド、およびプロパティを任意に拡張するためにワイヤ形式を修正する必要はない。
非同期クライアントディスパッチ
非同期クライアントディスパッチは、当業者であれば理解するように、制御を即座にクライアントスレッドに返すデータ要求をクライアントまたはクライアントアプリケーションが開始できるようにするデータインターフェースアプリケーションプログラムインターフェース(API)の機能を指す。オペレーションの結果が完全な場合、コールバックまたは通知されるシステムイベントを介してクライアントに情報が送られ、クライアントはそのデータの結果を取り出すことができる。例示され、説明されている実施形態では、この機能は、同期ブロックし、クライアントが先へ進めるようにするスレッドをスピンする自明なラッパーとして提供されない。むしろ、非同期ディスパッチは、デバイスレベルにへと下方に伝わる。低レベルでは、呼び出しの結果は、ネットワークカードにより駆動される割り込みである。このモデルを使用することで、サーバからデータを取り出しつつ応答できるクライアントユーザインターフェースを設計することが簡素化される。また、クライアント上で必要なスレッドの個数も減る。これは、クライアントシステムが、他の印刷システムへのブリッジとして動作する印刷システムの場合に特に有利である。
非同期サーバディスパッチ
非同期に要求をサーバにディスパッチするクライアントの機能と併せて、サーバはサービス要求をクライアントから非同期に要求できる。サーバが実行するクライアント要求がIOバインドされた場合(例えば、データをディスクに書き込むか、または他のサーバにデータを要求する必要がある)、プラグインコンポーネントは、他の非同期呼び出しを発行し、制御権をサーバサイドデータインターフェースに返し、その後、IOが完了すると呼び出しを完了することができる。このメカニズムは、サーバ上で動作しているスレッドの数を劇的に減らし、すべてのスレッドがシステムCPUを完全利用するようにできる。
システム上で実行するすべてのスレッドは、システムから大量の「非ページプール」を取り出す(非ページプールは、物理メモリが制限されている場合にはディスクに書き出すことができないメモリである)。システムロックを取得するシステム内で動作しているそれぞれのスレッドも、システム内に大量の「争奪」を発生させる(これは、実行のスレッドを切り替えるために必要な時間およびCPU資源の量である)。したがって、システム内で動作しているスレッド数を減らすことは、システムのパフォーマンスを改善する重要なメカニズムである。
キャンセレーション
後述の実施形態では、サーバ上で進行中の呼び出しを、いつでもクライアント側によりキャンセルすることができる。これにより、クライアントは、対話型ユーザインターフェースを呼び出し側に提供できる。
バッチ処理
バッチ処理は、データインターフェースを使用して、任意のアクションシーケンスを構築し、それらのアクションシーケンスを1単位としてサーバへ送信させるクライアントの機能を指す。その後、このシーケンスは、処理され、1回の転送応答でクライアントに返される。これらのアクションは、プロパティの参照および設定、プロパティの集合のクエリ、サーバオブジェクトに対するコマンドの発行、およびサーバオブジェクトのプロパティ変更に関する通知の登録など、任意の種類のアクションを含むことができる。
トランザクション呼び出し
トランザクション呼び出しは、完全に実行しなければならない、またはサーバの状態を変更しないという意味動作を割り当てられるバッチを指す。
並列呼び出し
並列呼び出しは、バッチ内のすべてのアイテムは並列に実行されなければならないという意味動作を割り当てられるバッチを指す。これにより、サーバは、長い実行アクションを並列に実行することができ、また他のどのようなアクションが失敗するとしてもバッチはすべてのアクションを実行するという意味動作も与える。
インターセプション
システム側でサポートできるオペレーションおよびプロパティは、純粋なデータ転送により表されるため、他のコンポーネントをシステム内に挿入し、システムのビヘイビアを監視し、同期的に応答し、修正することができ、これはインターセプションと呼ばれる。これにより、監視ソフトウェアをシステム内にプラグインすること、およびシステムから削除することを行える。また、独立系ハードウェアベンダ(IHV)もシステムビヘイビアを拡張することができる。例えば、キューが停止された場合、関連するサービスも、停止する必要があるかもしれない。このキュー上の「stop」コマンドは、IHVにより横取りされ、その後、それらにより、停止オペレーションが完了できる前にサービスが必ず停止されるようにできる。インターセプションメカニズムは、さらに、トランザクション意味動作も備えることができる。
リフレクション
リフレクションは、所定のクラスのオブジェクトによりどのようなプロパティがサポートされるかの情報またはそのオブジェクトに関連付けられたその他の情報を取り出すメカニズムをシステムが備えることを指す。このメカニズムを使用して取り出すことができる情報は、限定はしないが、以下を含むことができる。
● それぞれのプロパティの型名、フィールド名、およびデータ型、
● プロパティ使用法の人間が読み取れる記述、
● オブジェクトによりサポートされるコマンド、およびそのコマンドによりサポートされる入力および出力パラメータ。それぞれのコマンドは、コマンドの使用法の人間が読み取れる記述を備える。パラメータ毎に、パラメータの名前と型、およびパラメータの人間が読み取れる記述を取り出すことができる。
例示され、説明されている実施形態では、システムのリフレクション機能は、プロトコルに関係しない。さらに、リフレクション機能は、サーバプラグインのネイティブコードおよびマネージドコードによる両方の実装との間で使用できる。さらに、リフレクション機能は、ネットワークインターフェース経由でリフレクションを実行することができ、サーバサイドオブジェクトの実装がクライアント上に存在している必要はない。
これらの機能および他の機能は、以下の説明から明らかになるであろう。
例示的な実施形態
以下の説明では、本発明のインターフェースの高水準の説明が図1に関連して与えられる。この説明に従って、実装の実施例が与えられ、これは実装特有の情報を含む。実装特有の実施例は、上述の機能を含む印刷システムをどのように実装できるかを示す一例としてのみ与えられていることは評価され、理解されるであろう。したがって、本明細書で請求されている主題の精神および範囲から逸脱することなく、他の実装を利用できる。他の実装は、上述のように、印刷システムとの関連で使用できる場合も使用できない場合もある。
図1は、共通データインターフェース102を含む一般に100で示されるシステム、プラグインテーブル106およびインターセプションテーブル108を含むバッチ処理ルータ104を示す。システム100は、さらに、メッセージプラグイン110、メッセージサービス112、コレクション114、さまざまなオブジェクト116、システム拡張機能118、およびいわゆる「その他のコラボレーション」120も含み、それぞれについて以下で説明する。
共通データインターフェース(CDI)
共通データインターフェース(CDI)は、バッチ処理ルータ104とのインターフェースであり、これにより、メッセージを構築し、バッチ処理ルータにディスパッチすることができる。CDIは、さらに、クライアントに応答を送信する役割も持つ。
バッチ処理ルータ
バッチ処理ルータ104は、CDI 102によりパッケージされシステム内に渡されるメッセージを受信する。それぞれのメッセージは、多数のプラグインを宛先とすることができる多数のオペレーションを含むことができる。これらのメッセージは、非同期にディスパッチされ、それらの結果は、順に、バッチ処理ルータ104により取り出される。メッセージは、メッセージの送り先となるコレクションを識別する曖昧でないパスに基づいてルーティングされる。クライアントの観点からの単一メッセージは、複数の宛先を持つ場合がありうる。
プラグインテーブル
プラグインテーブル106は、所定のオブジェクトのコレクションを受け持つメッセージ処理プラグインのすべてを追跡する。それぞれのコレクションは、グローバル一意識別子(GUID)により識別される。そのオブジェクトへのパスが検査され、プラグインテーブル内で検索されてから、メッセージがそれに渡される。
メッセージプラグイン
適切なコレクションが識別された後、メッセージの集合がメッセージプラグイン110に受け渡される。メッセージプラグイン110は、リモートから有線で他のマシンへそれらのメッセージを単純に送出する可能性がありうる。しかし、通常、メッセージプラグイン110は、それらのメッセージを解釈して、適宜応答する。例示され説明されている実施形態では、サードパーティがメッセージプラグインを提供することができる。しかし、第三者がそうする場合、それらの第三者はメッセージサービスにより提供されるサービスを利用できない。このため、この層でのプラグインはかなり難しくなる。メッセージプラグインがあるという主な利点は、オリジナルのメッセージの形態が利用可能になるという点である。これを使用して、プラグインコレクションによりリモートマシンにメッセージ全体を中継するようにできる。さらに、これは、バッチ処理をサポートするリモートシステムも備え、また受信されたメッセージ形式と自メッセージ形式との間で翻訳できるようにしたい場合に、独立系ハードウェアベンダにとって利点となりうる。
メッセージサービス
メッセージベースのシステムの主要問題の1つは、複数のメッセージ呼び出しにわたって状態を保持することの難しさであるため、メッセージを分解し、それらをコレクションインターフェース上でより単純な呼び出しシーケンスに翻訳するコンポーネント−メッセージサービス112−が用意される。例えば、限定はしないが、例示され、説明される実施形態では、メッセージサービスは、以下のタスクを実行することができる。
● メッセージをスレッドに割り当てる、
● メッセージが複数の遅延呼び出しに応答できるようにする、
● コレクション内のオブジェクトから適切なデータを取り出して、メッセージに埋める、
● オペレーションキャンセレーションを正しく処理する、
● 長時間にわたるオブジェクトインスタンスのキャッシュ、
● オブジェクトの透過的ロック、
● コレクション内に保持されているオブジェクトのリフレクションサービス。
コレクション
コレクション114は、オブジェクトの同質な集合を保持する。システムは、オブジェクトを容易に持続させられるコレクションを備える。コレクションを使用する1つの利点は、これにより独立系ハードウェアベンダが任意のオブジェクトでシステムを容易に拡張できるという点である。例示され、説明されている実施形態では、コレクションは、ダイナミックリンクライブラリ(DLL)から取り出されるCOMインターフェースとして実装される。当業者であれば理解するように、DLLは、グローバルアセンブリキャッシュ内で検索され、DllGetClassObjectへの直接呼び出しが実行され、COM登録を回避できる。
オブジェクト
上述および後述のシステムの1つの目標は、独立系ハードウェアベンダおよびその他の開発者が、大部分、その実装言語の直接的サポートにより、クラスのレベルでコーディングできるようにすることである。この目標は、できる限り多くのコードをコレクションに合併し、独立系ハードウェアベンダおよびその他の開発者が書かなければならないコードの総量を減らすことである。オブジェクト116は、コレクションにより保持される論理構文である。メッセージサービス112は、それらのオブジェクトがC++クラスに直接対応する層を備える。
インターセプションテーブル
インターセプションテーブル108は、一般的な、普遍的な、拡張メカニズムを印刷システムに提供する。ここでの目標は、システム内のオブジェクト、特定のクラスのオブジェクト、または特定のオブジェクトインスタンスをターゲットとするメッセージを横取りし、修正することができる拡張を用意することである。
システム拡張
システム内のほとんどすべてのものは、中央メッセージシステムを発生元とし、メッセージにより表されるため、システム拡張118により、システムを拡張することができ、とりわけ、適していると思われる何らかの方法で、サードパーティにより監視されるようにできる。これらの拡張は、スプーラチーム自体による有用な監視拡張機能も備える。
他のコラボレーション
システムビヘイビアのすべてを、データ駆動型メッセージングシステムとして表せるわけではないことは理解されるであろうしたがって、マシン内の他のサブシステムを作成するオブジェクト間に他のコラボレーション120があり、またこれからもある。これらは、例えば、パイプラインおよびスケジューラを含むことができる。ここでの目標は、他のパーティがシステム内にプラグインできるようにすべてのコラボレーションを可能な限り柔軟にすることである。
これらの他のサブシステムがシステムのCDIビューとの一貫性を維持する方法は、CDIを通じて、オブジェクトを直接作成する、または適切なデータを返してオブジェクトをインスタンス化できるようにするファクトリオブジェクトを呼び出すことである。このパターンを使用すると、システム拡張機能がファクトリオブジェクトへのこれらの呼び出しを横取りし、ファクトリを実装してオリジナルインターフェースをラップすることができるという結果が得られる。これは、システム拡張機能がシステムのどのような側面をも監視または修正できることを意味する。これは、プラガブルな監視コンポーネントをシステム内の任意の位置に挿入できるようにするために有用である。
ここまで本発明のインターフェースの高水準の説明を行ったが、以下の節では、実装特有の情報を含む実装の実施例を説明する。上述のように、実装特有の実施例は、本明細書で説明されている本発明の原理に従って印刷システムをどのように実装できるかを示す一例としてのみ与えられていることは評価され、理解されるであろう。したがって、本明細書で請求されている主題の精神および範囲から逸脱することなく、他の実装を利用できる。
実装の実施例
以下の説明全体にわたって次の用語および頭字語を使用することをあらかじめ述べておく。
● アクション−「バッチ」を参照。
● アクセスアダプタ−「データアクセスアダプタ」を参照。
● アクセッサ−オブジェクトからデータを取り出すために使用される方法。.Netプロパティは、アクセッサの一例である。
● バッチ−溜め込んだ後、ある時点において実行されるアクションのシーケンス。通常、バッチを実行すると、ネットワーク呼び出しが1回行われる。アクションは、取得、設定、クエリ、コマンド、および通知要求とすることができる。
● バッチ処理コレクション−バッチ処理ルータにプラグインされる最高レベルのインターフェース。適切にルーティングされた、実行すべきアクションのバッチを受け取る。
● バッチ処理ルータ−コレクションの集合のうちからバッチ内のアクションを受け渡す先を選択するCDI内の要素。
● 正規名−時間と空間においてオブジェクトインスタンスを一意に識別する名前。CDIでは、これは、コレクションGUIDおよびオブジェクトGUIDである。CDIは、正規名のみに基づいてルーティングする。アプリケーションでは、システムと通信するときに可能であれば正規名を使用すべきである。「フレンドリ名」を参照。
● CDI−「共通データインターフェース」を参照。
● クラス−CDIにおいては、オブジェクトの一種。クラスは、プリンタ、ジョブまたはサーバ、またはその他の論理分割とすることができる。クラスは、型からなる。
● クライアントコレクション−クライアント上に保持されるオブジェクトのコレクション。CDIは、そのタイプマップに基づいてクライアントコレクション内のオブジェクトに書き込む。
● コレクション−1つの論理的コード断片により与えられるオブジェクトの異種の集合。CDIは、正規名に基づいて複数のコレクションに要求をルーティングする。
● コレクションアダプタサービス−バッチ処理ルータにバッチ処理コレクションインターフェースを公開し、少ない労力でオブジェクトの集合を公開できるようにするサービスを実装するサービス。
● コマンド−バッチが最終的にサーバに送信されたときにオブジェクトに対するメソッドを実行させる一種のバッチアクション。
● 共通データインターフェース−正規名を介してオブジェクトにアクセスできるようにするコンポーネント。呼び出しをまとめてバッチ処理すること、およびオブジェクトへの非同期または同期アクセスもサポートする。
● データアクセスアダプタ−データアクセスアダプタは、CDIにプラグインし、何らかの方法でその機能を翻訳する。これは、CDIにより公開されるインターフェースを他(プロセス内アダプタ)に変換することが可能であるか、またはCDIのリモーティングを行うことが可能であり、その場合、それはリモートアクセスがアダプタである。
● 表示名−「フレンドリ名」を参照。
● 埋め込み型−他のコレクション内の他のオブジェクトによりサポートされるプロパティを動的に拡張するために使用されるコレクション内のオブジェクト。
● フィールド−データの名前付き断片。
● フレンドリ名−「表示名」とも呼ばれる。フレンドリ名は、オブジェクトインスタンスを識別するためにシステムにより使用される正規名とは反対に、ユーザがオブジェクト(Fredのプリンタ)に関連付ける名前である。フレンドリ名を正規名に変換できるようにするため、CDIでは、名前解決パイプラインを備える。
● 階層−CDIでは、これは、親オブジェクトと親オブジェクトにリンクのクエリを実行することにより得ることができる子オブジェクトとの任意の関係である。
● プロセス内アダプタ−アプリケーション内で実行されているCDIインスタンスとともにプロセス内で実行されるデータアクセスアダプタの一形態。これらは、通常、何らかの方法でデータを変換するだけである。例えば、データにアクセスするAPIを用意する。
● リンク−オブジェクト間の階層関係のクエリを実行するために使用される特別な予約済みクラス。
● メタデータ−CLR内のリフレクションと混同しないこと。サポートしている型、フィールド、およびコマンドを発見するために任意のオブジェクトからメタデータについてクエリを実行することができる。クライアント上で対応するアセンブリが利用可能かどうかについての情報を取り出すことができる。
● メソッド−そのオブジェクトを呼び出す場合に実行されるオブジェクト上の実際のコード断片。少し異なる概念については「コマンド」を参照。
● 名前解決パイプライン−フレンドリ名を正規名に変換するためにアプリケーション空間内で実行されるリゾルバと呼ばれる要素のシーケンス。
● 最適化タイプマップ−一方のオブジェクトから他方のオブジェクトへ、フィールドの集合を移動するために2つのオブジェクトを突き合わせて実行される取得および設定のシーケンス。これは、クライアントオブジェクトのタイプマップおよびサーバオブジェクトのタイプマップのフィールドを組み合わせることができる。
● 永続的オブジェクトコレクションサービス−オブジェクトをデータベースに対して永続的にできるコレクションをアダプタサービスにプラグインするサービス。
● クエリ−CDIと関連して、オプションのフィルタおよびオプションのクエリベースを持つ与えられたクラスのオブジェクトの集合に対する要求。
● クエリベース−クエリが開始する概念上の位置。例えば、ベースは、ローカルマシンまたは与えられたサーバとすることが可能である。
● リモートアクセスアダプタ−リモートアクセスアダプタを使用すると、CDIにより公開されるインターフェースをマシン間でリモーティングを行うことができる。これは、一方のCDIにはオブジェクトのコレクションとして、リモーティングが行われるCDIにはデータアダプタとして見せることにより行われる。
● リゾルバ−名前解決パイプライン内の一要素。それぞれのリゾルバは、コレクションに関連付けられ、その内部の要素を識別する方法を知っている。
● タイプマップ−オブジェクトからデータを取り出す、またはそれをオブジェクトに適用する方法を記述するフィールドのテーブルおよび相関するアクセッサ。タイプマップは、動的または静的とすることができる。フィールド同士を比較することにより2つのタイプマップを組み合わせて、最適化されたタイプマップを出力する。
● 型−インターフェースに類似する。型は、常に、完全に実装されなければならないフィールドおよびコマンドの論理グループである。
共通データインターフェース
共通データインターフェース(CDI)は、名前(フレンドリ名または好ましくは正規名)でオブジェクトを特定すること、オブジェクトからデータを取得またはデータをオブジェクトに適用すること、オブジェクト変更に関する通知をサポートすること、およびコマンドをオブジェクトに発行することを含む機能を提供する。CDIは、限定はしないが、2、3例を挙げると、同期インターフェースの使用、拡張性の欠如、名前ベースのルーティング、およびバッチ処理の欠如を含む、現行のアーキテクチャの多くの制限に対処し、克服する。
CDIでは、任意の数の一意に識別可能なコレクションをシステム内にプラグインできるようにすることにより、これを実行する。これらのコレクションでは、望ましいどのような種類のオブジェクトをもサポートできる。インターフェース自体は、非同期オペレーションおよびバッチ処理をサポートするために妥当な複雑性を有するが、サービスが提供され、プラグインされるコレクションを比較的簡単に書くことができる。
ルータの再アーキテクチャ
現在のスプーラアーキテクチャにおける多数の基本的な問題は、ルータから生じるものである。これは、同期APIセットの使用、起動時にすべてのプロバイダ(およびモニタ)をロードする必要があること、オブジェクトの名前を変更できないこと、スプーラコンポーネントのアンロードを行えないこと、およびシステムをシャットダウンできないことを含む。この節では、本発明の印刷システムにおけるルータの交換アーキテクチャについて説明する。
以下の説明は、図2に示されている概要図に基づく。この実施例では、ルータは、かなり柔軟なデータアクセスメカニズムである、共通データインターフェース(CDI)で置き換えられる。CDIは、基本的に、アクセスアダプタとコレクションとの間のルーティングおよびサービス層である。これは、複数のプロトコルを介して任意のシステム上の印刷オブジェクトを特定する機能を備え、また、同じ意味動作をすべてのオブジェクトに持たせることができるサービスの集合も提供する。これらの意味動作は、オブジェクトデータの部分集合を取り出し、設定する機能、すべてのオブジェクトに対するそのステータスに関するクエリ機能、コマンドをオブジェクトに発行する機能、およびシステム内のすべてのオブジェクトから一貫して変更通知を送信する機能である。データアクセスアダプタは、複数のプロセス内アダプタとリモートアクセスアダプタに分けられる。
例示され説明されている実施形態では、すべての内部コンポーネントおよびアプリケーション(コレクションプロバイダおよびアクセスアダプタを除く)は、プロセス内アダプタとのみインターフェースする。プロセス境界をまたがる通信およびクライアントサーバ通信については、COM/DCOMリモートアクセスアダプタが使用される。Webサービスベースのシナリオについては、SOAPアダプタが使用される。アダプタは、次に、他のプロセス空間、または他のマシン内にコレクションとして出現する。これにより、共通データインターフェースをフルサポートすることができるアクセスアダプタは、プロセス内アダプタを通じて常にアクセス可能にできる。この接続性スキームの概要は、図3に示されている。
ダウンレベルおよびアップレベルのプロトコルアクセス
アップレベルアダプタは、完全な共通データインターフェースを丸ごとカプセル化することができるアダプタであり、唯一の完全プロセス内アダプタは、属性ベースのマネージドコードアダプタである。システムへのマネージドAPIは、システム機能の有用なアプリケーション部分集合を表すのみである。ローカルマシン上で、クライアントサーバベースのシナリオにおいて、通信に使用されるプロセス外COMアダプタ、およびWebサービスを介してデータへのアクセスを提供するSOAPリモートアクセスアダプタを含む、2種類の完全リモートアクセスアダプタがある。
アダプタの他の候補は、共通データインターフェースのフルパワーを使用できるアダプタであり、それら自身は、限定されたデータ型を公開するだけであるが、その場合、完全にデータ駆動方式によりマッピングすることができる。例えば、MOFファイルのデータ型と共通データインターフェースのデータ型との間のマッピングは、完全データ駆動方式で実行可能である。MOFファイルは、Windows(登録商標)Management Instrumentation(WMI)システムにより、システムオブジェクト記述するために使用される。
他のあまり柔軟でないプロトコルだと、印刷システムコンポーネントと通信するためにプロセス内アダプタを使用する可能性が最も高く、例えば、RPCクライアントは、C++テンプレートライブラリを介して新しい印刷システムと通信する。
ダウンレベルプロバイダのサポートは、メモリ内コレクションを提供し、ユーザがデータをシステムに供給するマネージドクラスおよびオブジェクトアダプタを書くことができるようにすることにより簡素化される。ダウンレベルプロバイダは、システムにより使用可能な限定された型のある部分集合をサポートしなければならない。
共通データインターフェースのオブジェクトモデル
例示され説明される実施形態では、共通データインターフェース(CDI)は、以下のようなプロパティを持つ。CDIは、オブジェクト上の個々のプロパティを取得および設定することをサポートする。また、クエリフィルタおよびそれぞれのオブジェクトから取り出すプロパティの集合に基づいてオブジェクトのグループについてクエリを実行することもサポートする。CDIは、コマンドを実行するようにオブジェクトに依頼すること、パラメータの集合をそれに受け渡すこと、およびそれから戻りパラメータの集合を受け取ることをサポートする。さらに、CDIは、オブジェクト変更の通知を要求することもサポートする。通知は、呼び出し側が通知を望むフィルタおよびプロパティの集合を含む。さらに、CDIは、プロセス内のみであり、インターフェースをリモート操作する機能は、適切なプラグインアダプタにより実現される。CDIは、通知のコールバックを使用し、通知は、クライアントにより保持される接続はサーバ拡張性を劇的に低下させるためある種の難しいトレードオフの関係をもたらす。この問題を解決するために、通知の2つのクラスを使用することができ、第1には、管理通知で非同期インターフェースを使用してサーバへの接続を維持することができる。これらの通知は、管理目的を有する傾向のあるデータ、例えば、論理キュー内のジョブのビューを頻繁に変更することに使用することができ、第2に、ステータス変更通知は、TTLスキームおよびメッセージングシステム(例えば、MSMQ)を使用して、あまり頻繁でない通知を配送保証とともに送信することができる。通知メカニズムではサーバサイドクエリをサポートするので、一般に必要とされるユーザ通知は、サーバサイドクエリを指定し、保証された配送メカニズムを使用することにより、実装される。
さらに、CDIは、アクセッサに基づく。これは、辞書インターフェースを公開しない。むしろ、データを取得するクエリメカニズムが用意され、また辞書インターフェースをエミュレートするためオブジェクトメタデータを取り出す機能が提供される。CDIは、さらに、多数のオブジェクトコレクションを集約してまとめる。アップレベルコレクションは、完全クエリサポートを行うために使用される。ダウンレベルコレクションは、列挙型サポートのために使用されるが、それは、すべての印刷コレクションは似ていなければならないからであり、クエリは、すべてのオブジェクトを列挙し、フィルタをそれらに適用することにより構築される。CPUに束縛されないメソッドは、非同期的と呼ぶことができる。
共通データインターフェースを使用すると、オブジェクトコレクションにアクセスすることができる。すべてのCDIオブジェクトは、コレクションを通じてアクセスされる。すべてのコレクションにおいて、オブジェクトクラスの集合にアクセスすることができる。オブジェクトクラスは、オブジェクトのクラス、例えば、論理デバイス、プロトコルアダプタ、論理サーバを識別する。オブジェクトクラスは、プログラム名で識別される。プログラム名は、<会社>.<クラス>[.<バージョン>]の形式でなければならない。この名前を、オブジェクトを識別するためにロケール内で使用できる。この文字列は、ユニコード文字列として実装できるが、他の実装では、英語識別子を含むことができる。
例示され説明されている実施形態では、オブジェクトの特定のクラスは、常に、サーバの前のバージョン、またはダウンレベルサーバを表すコレクションを含めて、システムの存続期間全体にわたって同じプログラム名により識別される。
与えられたオブジェクトクラスは、多数の型からなる。型は、オブジェクトクラスと同じ方法でプログラム名により識別される。型は、多数のフィールドからなり、それぞれのフィールドは、プログラムフィールド名およびフィールド型により識別される。ある型のフィールドは、オペレーティングシステムのすべてのバージョンにまたがって、またどのようなプラットフォーム上でも不変でなければならない。型は、さらに、フィールドとともにコマンドもカプセル化する。コマンドは、文字列により識別され、多数の順序付けられた入力および出力引数を受け取る。
CDIを使用すると、サードパーティによりCDIを通じて送信されるメッセージのインターセプションおよび拡張が可能になる。このため、これらのパーティはオブジェクト機能を監視し、拡張することができる。オブジェクトも、いくつかの呼び出しを、含まれているオブジェクトにリダイレクトするようにできる。
オブジェクト命名
例示され説明されている実施形態では、オブジェクトは、常に、オブジェクトのそのインスタンスを正確に識別する一意の正規名を有するが、このルールの唯一の例外は、ダウンレベルサーバ上のオブジェクトを表すコレクションである。
オブジェクトは、オブジェクトパスにより示される。オブジェクトパスは、常に、それが含まれるコレクションインスタンスのGUIDから始まり、したがって、{XXXXXXX}\{YYYYYY}は、コレクション{XXXXX}内にGUID{YYYYY}を持つオブジェクトを指す。アップレベルサーバ上のオブジェクトについては、パスは、{WWWWW}\<server>\{XXXXX}\{YYYYY}となるが、ただし、{WWWW}はリモートコレクションGUIDであり、{XXXXX}はオブジェクト{YYYYY}が配置されているリモートコレクションである。
すべてのCDIインスタンスは、ファイルシステム内の現在のパスに類似したデフォルトのコレクションの概念をサポートする。したがって、アプリケーション空間内でホスティングされているCDIは、サテライトサンドボックスプロセスおよびアプリケーションドメインのすべてと同様に、ローカルマシン上のスプーラに設定されているデフォルトコレクションを持つことができる。完全修飾パスを持たない任意のオブジェクトの正規名は、デフォルトコレクション内で自動的に検索される。アプリケーション空間内で実装されたコレクション(例えば、ローカルサービスをバイパスするサーバへの直接ネットワークアクセス)がアクセスされる場合、完全修飾パス(つまり、「\」で始まるパス)を使用しなければならない。
例示され、説明されている実施形態では、オブジェクトパス内の「\」、「:」、「”」、「^」および「.」は予約文字である。
キャレット文字(^)は、後続文字をエスケープするために使用され、これにより、任意の文字を文字列内で表すことができる。有効なエスケープを以下の表にまとめた。
Figure 2006252539
したがって、パスに「\」を含まなければならないオブジェクト名を分離するために、「\」を「^\」でエスケープすることが可能である。
フレンドリ名および名前解決パイプライン
オブジェクトは、さらに、状況に応じて、フレンドリ名(または表示名)を付けることもできる。オブジェクトは、以下のメカニズムを使用して必ず特定されなければならない。
● 表示目的のために、オブジェクトクラスのベースレスクエリをサービスと突き合わせて作らなければならない。このクラスと一致するすべてのローカルオブジェクトが返される。そのときからUIは、返されたオブジェクトの正規名を使用し、クラス表示名を示さなければならない。
● ユーザインターフェースに直接入力することが可能な名前(リモートサーバのUNC名を含む)の場合、ネームリゾルバと呼ばれるプラガブルなコンポーネントのシーケンスを与えることができる。アプリケーションでは、「フレンドリ名」を正規名に解決するためにこれらを呼び出す。既存のAPIは、ネームリゾルバを使用して、OpenPrinterおよびClosePrinterなどのフレンドリ名ベースの呼び出しを正規名形式に変換する(名前解決は、時間がかかる可能性が高いため、キャッシング層を導入しなければならない)。
● ネームリゾルバのシーケンスは、与えられた名前マッピングの優先度を意味する。例えば、リモートUNC名が接続にアップグレードされる場合、それと同じ名前は、リモートキューを表すキューオブジェクトではなく、ローカルコレクション内の論理キューオブジェクトに解決する。
● アプリケーションは、最大のフル機能のネームバインディングが返されることのみ、またはフレンドリ名に対するすべての同じバインディングが返されることを選択することができる。可能なすべてのネームバインディングを返すのは、解決すべき多数のコレクションをロードする必要がある可能性があるため、非常に費用がかかる。
● 現在のルータアーキテクチャとは異なり、名前解決要素を用意することにより、コレクション全体が不必要にロードされるのを防ぐ。それらのオブジェクトについてフレンドリ名をサポートしたいすべてのコレクションは、名前解決要素も実装しなければならない。
● アプリケーションは、名前解決を実行するときに、目的を指定することが許される。例えば、管理アプリケーションでは、非キャッシュ情報のみを使用したいことを指定することが可能である。この場合、非キャッシュオブジェクトは、キャッシュバージョンよりも能力が低くても返される。
セキュリティ
例示され、説明されている実施形態では、セキュリティは、システムによって提供されるサービス層に緊密に結び付けられている。しかし、重要なトピックであり、実装について説明する前にモデルのグローバルな概要が望ましいので、セキュリティの仕組みの概要をここで説明する。
図4は、一実施形態による新しいスプーラセキュリティモデルの概念図を示す。新しいスプーラセキュリティモデルの1つの目標は、CDIをオブジェクトへの軽量内部インターフェースとして保持し、認証機能を実行しないようにすることである。さらに、CDIは、リモートコレクションを介してデータをサーバにルーティングすることができる。その後、サーバによって許可が実行される。したがって、この実施形態によれば、CDIルーティング層は、許可機能を備えない。最後に、CDIは、認証も許可も必要ない場合にアプリケーション空間内でも実行される。
そのため、認証は、アクセストランスポートおよびプロトコルと一致する方法でリモートアクセスアダプタにより実行され、許可は、適切なコレクションサービスによって実行される(またはリモートサーバに遅延される)。このアプローチの1つの帰結として、CDIおよびコレクションのすべては、無許可ユーザによるアクセス可能である。これを緩和しやすくするために、論理システムオブジェクトは、マシンの印刷システム全体へのアクセスを制御するアクセス制御リスト(ACL)を備える。コマンドのバッチがリモートアクセスアダプタにより受信されると、論理システムオブジェクトに対しアクセスチェックが実行される。これらのコマンド(取得、設定、およびクエリ)は、アクセスチェックが成功した場合のみ実行を許可される。このオペレーションは、リモートアクセスアダプタにより受信されたパッチコマンドに対し1回だけ実行される。例示され、説明されている実施形態では、論理システムACLは、デフォルトでは、「Everyone」(ただし「Anonymous」ではない)となっている。管理者は、印刷サブシステムへのアクセスを制限する論理システム許可を変更することを許される。
例示され、説明されている実施形態では、論理マシンオブジェクトへの許可がないまま、リモートアクセスアダプタが通す必要のある論理システムオブジェクト上に特別な予約済みシステムリセットコマンドがある。論理マシンオブジェクトを使用することにより、管理者は、このコマンドを実行し、管理者を論理マシンACLに追加して戻す。このメカニズムは、管理者は、管理者がサブシステムに再びアクセスできなくなる論理機械オブジェクトへの許可拒否するのを防ぐ。
例示され、説明されている実施形態では、ローカルコレクションのすべてのオブジェクトは、関連付けられたACLを持つ。オブジェクト上のアクセスチェックでは、ちょうど、ACLに対するアクセスをチェックする。それぞれのオブジェクトインスタンスは、そのクラスの新しいオブジェクトについてデフォルトの継承可能なACLを備えるクラスオブジェクトを持ち、CDIは、クラスオブジェクトのコレクションを保持する。管理者は、与えられたクラスの新しいオブジェクトについてデフォルトのACLを用意するクラスACLを自由に修正できる。これにより、管理者は、オブジェクトへの作成権を他のユーザに移譲することができるが、それでも、作成時にデフォルトのACLをそのオブジェクトに適用することができる。
例示され、説明されている実施形態では、CDIは、オブジェクトのローカルコレクションをできる限り容易に書けるようにするサービス層を備える。このサービス層は、セキュリティインフラストラクチャをオブジェクト実装に提供し、そのオブジェクト実装は自由にそのインフラストラクチャを使用する。
図4には、パーミッションが変更された場合に新しいACLをすべての参加クラスに再帰的に適用するパーミッションエージェントは示されていない。このエージェントは、クラスオブジェクトへの変更をクラスのインスタンスに伝搬する役割を持ち、また、管理階層変更をオブジェクトインスタンスに伝搬する役割も持つ。
CDIアクセッサモデル
このインターフェースのより基本的な態様の1つはアクセッサモデルである。このメカニズムを使用することにより、共通データインターフェースおよびコレクションは、呼び出し側のデータ構造に初期値を設定できる。例示され、説明されている実施形態では、操作対象の印刷スプーラがアンマネージドコアサービスからなるため、CDIアクセッサモデルはアンマネージドである。印刷システムのいくつかのコンポーネントはマネージドであり、印刷システム内のデータにフルアクセスすることが望まれているため、マネージドコードアクセス層もある。
CDIアクセッサモデルの背後にある考え方は、CDIはクライアントオブジェクトの1つのコレクションとサーバオブジェクトの複数のコレクションとの間のブローカーであるということである。これは、クライアントおよびサーバが、それぞれのパーティにおいて転送を望むフィールドのみを使用してこの情報を交換するための効率的なメカニズムを実現する。
例えば、サーバコレクション、クライアントコレクション、およびCDIと関連して、一実施形態により、この機能を実装する方法のいくつかの態様を示す図5を考察する。
この実施例では、サーバおよびクライアントは両方とも、同じメカニズム−タイプマップ−を介して公開または取り出したいデータを記述する。タイプマップには、それぞれのオブジェクトがサポートするさまざまな副型およびフィールドが記述される。フィールド毎に、記述するクラスのすべてのインスタンスについて与えられたプロパティを取得または設定する方法を認識するインターフェースが用意される。したがって、タイプマップが与えられると、クラスインスタンスのプロパティのすべてにアクセスできる。
クライアントおよびサーバクラスの記述が与えられると、CDIは的確な最適化を実行することができる。特に、CDIは、クライアントタイプマップおよびサーバタイプマップからそれぞれのフィールドおよび型を照合し、アクセスインターフェースのみからなる最適化されたタイプマップを作成することができる。2つのオブジェクトインスタンス上でこの最適化されたタイプマップが実行されると、要求されたデータはすべて、中間の記憶装置またはデータの検索を使用せずに、その2つのオブジェクト間で転送される。最適化されたタイプマップの目標は、ターゲットオブジェクトは正規構造を持つという事実を利用することである。与えられたコレクションについて、サーバサイドオブジェクトは正規構造を持つ。また、与えられたクエリに対し、システム内のすべてのオブジェクトから同じデータが一般的には望ましい。そのため、ソースオブジェクトの特定クラスとデスティネーションオブジェクトの特定のクラスとの間のバインディングは、常に同じである。さらに、ソースおよびデスティネーションオブジェクトは最終的にはシステムコンポーネントであり、それ自体正規構造であるため、それぞれのオブジェクトインスタンスは、軽量の方法で格納できる。
さらに、データを取り出せるサーバオブジェクトが1つしかないとすれば、これで十分であると考えられる。しかし、実際には、互換性のあるサーバオブジェクトの実装が多数ありえ、それぞれタイプマップを持つ。そのため、クライアントがタイプマップをCDIに登録した場合、CDIは、GUIDで検索できる最適化されたタイプマップ用に格納空間を作成する。その後、サーバサイドは、必要に応じて、それぞれの最適化されたマップを格納する。この目標は、クライアントがアプリケーション起動時にマップを登録することである。その後、システムは、クライアントがデータ取り出しを開始したときにその特定のクライアントタイプの周辺に最適化集合を構築する。
テンプレート派生タイプマップ
クラスインスタンスのアクセスオブジェクトを作成すると、それぞれのインターフェースの背後にあるそれぞれのインスタンスは1つのプロパティへのアクセス方法しか認識していないので、多数のコードが書かれる可能性がある。それぞれのインスタンスがデータを使用してサーバおよびクライアント内のプロパティにアクセスできるようにすることにより大量の作業を省くことができる(例えば、フィールドオフセットを使用することで、一般的に多くのオブジェクトにまたがるフィールドにアクセスできる)。これを実行すると、コーディングされなければならないアクセスオブジェクト実装の数を大幅に減らせる。
例示され、説明されている実施形態では、CDIは、さらに、ユーザがクラスを定義し、多数のメソッドまたはフィールドを作成し、その後、定義されることが望まれているフィールドまたはメソッドを公開するテーブルを書くために使用できるテンプレートライブラリも備える。テンプレートメカニズムは、クラスフィールド型またはメソッドシグネチャから直接、型情報を抽出し、アクセスオブジェクトインスタンスを自動的に作成する。これにより、クライアント(またはサーバ)は、IDLを書かずに、オブジェクトを公開することができる。オブジェクトは、その後、印刷システムによりサポートされるトランスポート手段でサポートされるようにでき、非同期呼び出しのメリットを自動的に受け取る。
以下に示した抜粋コードは、クライアントがサーバから取り出すことを望んでいる構造を定義する最も単純なメカニズムを示しているが、エラー処理は省略されている。
Figure 2006252539
タイプマップメカニズムでは、さらに、呼び出し側がメソッドを指定することができる。以下の抜粋コードは、この場合にメソッドを定義する方法を例示し、エラー処理は省略されている。
Figure 2006252539
例示され、説明されている実施形態では、テンプレートライブラリは、CDIの型からC++の型へのマッピングのコアセットをサポートしている。このライブラリは、サードパーティにより拡張可能であり、したがって、テンプレートライブラリの一部を全く変更せずに、いつでも、新しい型を導入または精緻化することができる。
共通データインターフェースの使用
この節で取り上げられている資料は、上述の資料を基に拡張されるが、かなり低い水準で行われる。本明細書の残り部分は、一実施形態によるCDIの使用および実装の低水準の説明をもっぱらとする。
CDI型
CDI型システムは、システムが保証する多数の標準型をサポートするように設計されている(例えば、これらは、システムによってサポートされている任意のプロトコル上で動作し、大半は、クエリに使用できる)。CDI型システムは、さらに、設計時に新しい型を作成し、実行時にシステム内でそれらの型を使用するメカニズムも備える。
この目的のために、ImgVariant型が、以下の抜粋コードに示されているように定義される。システムのバリアント型のように、それは、型と無名共用体を持つ。しかし、これは、以下の表に示されているように、システムのバリアント型とは非常に異なる、基本型の集合をサポートする。
Figure 2006252539
Figure 2006252539
他の違いは、ImgVariant型は拡張可能であるという点である。これは、ImgTypeを共用体でなく、ポインタとして定義することにより、実現される。この宣言は、以下の抜粋コードに示されている。
Figure 2006252539
列挙型を新しい型として予約するために、ImgTypeReservationグローバル変数を定義し、そのアドレスが、定義された型に対する保証された一意の識別子になる。同様に、システムは、システム自体の型をグローバル一意ポインタとして定義する。これにより、ローダを使用して、それらの型がアドレス空間において衝突しないことを保証する。
例示され、説明されている実施形態では、印刷システムは、バリアント型を操作するため以下のメソッドを用意している。
Figure 2006252539
新しいCDIプリミティブ型
CDI ImgVariant型それ自体は、CDIにより定義された幾つかの新しい型を含むことができる。これらは、順に以下のとおりである。
IImgImutableString
これは参照カウント文字列である。この型は、CDIによりBSTRとの間で自由変換でき、文字列の効率的操作を行うことができる。そのインターフェースおよび作成関数は、以下の抜粋コードに示されている。
Figure 2006252539
Valueメソッドは、不変文字列内に保持されている文字列を指すポインタを返す。呼び出し側は、この値を修正してはならないが、読み込むのは自由である。そのアドレスは、変化せず、文字列参照が保持されている間、解放も修正もされない。
NewInterfaceメソッドを使用すると、呼び出し側は、同じ文字列への新しいインターフェースを要求することができる。これは、参照カウント問題を分離するのに役立つ。呼び出し側は、その文字列への単一スレッドインターフェースを要求することができる。この場合、新しいインターフェースでの参照カウントは連動しない。呼び出し側が、単一スレッドコンテキスト内で文字列の操作を何回も行うことを知っている場合、これにより、そのパフォーマンスを改善することが可能である。ImgCreateStringにより作成される初期文字列は、常に、フリースレッドである。
IImgCanonicalName
この型は、内部で、プラグインにより使用され。他の型への正規名参照を提供する。この型は、以下の抜粋コードに例示されている。
Figure 2006252539
正規名は、オブジェクトパスの解析された要素からなる。それぞれの要素は、不変文字列として格納される。正規名は、パスから作成されるか、または不変文字列の集合から直接構成することができる。例えば、パス「\{GUID}\abc^\def」については、正規名は、「{GUID}」および「abc\def」の2つの文字列からなる。このインターフェースでは、さらに、呼び出し側が正規名の部分文字列からパスを形成することができ、例えば、文字列「ab\\cd」、「efg」を含む正規名を作成し、その後、パス「ab^\^\cd\efg」を取得することが可能である。
不変文字列のように、正規名も不変であり、スレッドまたは参照カウントを目的として、それから新しいエイリアスインターフェースを取得することができる。
IImgMultiValuedName
多値名は、正規名による参照を多数の異なるオブジェクトに返すために使用される。これは、2つのオブジェクトクラスの間の1−NまたはN−Nの関係を表すために使用される。そのインターフェースは、以下の抜粋コードに示されている。
Figure 2006252539
多値名を正規名の集合から構成することができ、またそれぞれの正規名を取り出すことができる。不変文字列および正規名インターフェースのように、これは不変であり、参照カウントまたはスレッドを理由として、新しいインターフェースを取得することができる。
これらのインターフェースのナビゲートは、呼び出し側にとってはいくぶん複雑である可能性があるため、多値名は、GetNamesAsStringsインターフェースを通じてBSTRパスの配列として囲まれている正規名全体を取得するメカニズムを備える。返された多値文字列を解放するために、ImgFreeMultiString呼び出しが使用される。さらに、呼び出し側は、パスのマルチ文字列からマルチ名へまっすぐに進むことができる。これは、静的パスの集合から多値名を構成するうえで特に有用である可能性がある。
新しいバリアント型の登録
標準バリアント型は、常に、電線を経由して正しくマーシャリングを行い、すべて、システムに使用されるクエリ言語でサポートする。しかし、特にプロセス内の場合、バリアント型を拡張すると非常に有用と考えられる。これにより、点などの新しい値型、または文字列に変換する必要のない印刷可能領域を作成できる。代替えとして、コマンドの一部として取り出し、操作できるインターフェースを定義することができる。この目的のために、CDIは、VariantCopy、VariantClear、およびVariantConvertにより処理できるバリアント型を拡張するメカニズムを備える。
このインターフェースは、以下の抜粋コードに示されている。
Figure 2006252539
ここで、登録されている型に対しすべてのオペレーションを実行する方法を認識するIImgVariantExtenderインターフェースで供給する必要がある。その後、さらに、このインターフェースによりサポートされる型の集合およびそのインターフェースで実行する変換の集合も供給する。その後、システムは、バリアント型の処理を拡張し、指定された型に対しそれらのインターフェースを呼び出すことを含むようにする。
標準バリアント型間の変換が用意された場合、リモーティング層も、有線でその適切なデータを正しくマーシャリングする。これにより、サーバオブジェクトと同じプロセス内で、または有線で、透過的に型を使用することができる。
タイプマップの登録
クライアントタイプマップは、構成された後、CDIに登録され、インターフェースは、そのタイプマップ登録を表すクライアントに返される。このオブジェクトは、さまざまなコレクションクラスにバインドするために使用される最適化されたタイプマップを蓄積する。その目的は、プロセスがあらかじめ使用するつもりの型すべてを登録してから、それ以降与えられたタイプマップを使用できるようにすることである。最適化されたタイプマップが構築されるときに、オブジェクトに対しデータのクエリを実行するのに要する時間は、フィールドを比較しなくてよいので、非常に短くなる。タイプマップを登録するための完全なインターフェースは、以下の抜粋コードに示される。
Figure 2006252539
このインターフェースに使用される型は多数あるため、それぞれについて以下で検討する。
EImgCopyFlags
これらのフラグは、コピーオペレーションに関連付けられ、これにより、クライアントは、データをコピーする場合に遭遇した問題について知ることができる。これらのフラグのほとんどは説明を要しない。興味深いフラグとしては以下のものがある。
● Private−システムの外部でデータをコピーしてはならない。システムの一部と考えられる他のプロセスは、データを受け取ることが可能である。データは、決して有線で送信されることはない。
● NotModified−データがサーバ上でそれ以降修正されていないことを示す。これは、設定オペレーションを最適化する場合に使用できる。
● CollectHistory−これは、このフィールドへの変更の履歴を収集すべきであることをCDIに指示する。デフォルトの動作は、フィールドの履歴を圧縮する。
ImgExtraCopyData
これは、アクセッサに渡され、アクセッサはフラグを修正または挿入できる。また、設定が実行される場合に変更ハンドラをアクセッサに渡すためにも使用され、これにより、変更ハンドラは、プロパティ値が変更された場合に変更を送信することができる。
ImgFieldAccess
これは、フィールドを指定する。構造体フィールドのほとんどは説明を要しない。クライアント上で記述を指定する必要はない。サーバ上では、このフィールドはリフレクションに使用できる。タグは、サーバ上で使用され、これにより、特定のフィールドを簡単に参照できる。タグを一意に保つのは、構造体を伝搬する側の役目である。
ImgFieldAccessors
これは、フィールドアクセッサの集合を指定する。
ImgClassDescription
これは、クラスを記述し、取得アクセッサおよび設定アクセッサを指定する。
IImgAccessor
このインターフェースでは、特定のフィールドにアクセスできる。ImgVariantは、データを一時的に格納し、多数の異なる型のデータを受け渡すことができる。
IImgTypeMaps
このインターフェースを、クライアント側で解放することができる。次に、登録時に渡されたアクセッサインターフェースすべてが解放される。
IImgCommonData
これは、タイプマップを登録するために使用できる中央インターフェースである。このインターフェースを、解放することができ、タイプマップ登録は有効なままである。
バッチ処理インターフェース
残りの各節(つまり、オブジェクトクエリ、オブジェクトコマンド、および通知)では、データアクセスインターフェースを詳細に取り扱う。この節では、オブジェクトとはどのようなものであり、クライアントはオブジェクトをどのように、取得し、設定し、クエリを実行するのかについて取りあげる。
クライアントがこれらのオブジェクトにアクセスするために使用するインターフェースは、以下の抜粋コードに示されている。
Figure 2006252539
Figure 2006252539
Figure 2006252539
このアクセスインターフェースは、例えば、限定はしないが、以下を含む新しい概念を公開する。
● バッチ処理インターフェース(IImgBatch)
● 非同期プログラミングメカニズム(IImgAsyncResult)
● クライアントコレクションインターフェース(IImgClientCollection)
これらのインターフェースのそれぞれについて、まず要約で説明し、その後、潜在的呼び出しシーケンスの実施例を示し、これらの概念を具体的に説明する。
データアクセスインターフェースに発行されるすべてのアクションは、バッチ処理される。バッチ処理インターフェースは、IImgCommonData::GetDataBatch()の呼び出しから戻り、その後、一連のアクションがバッチ処理インターフェースに発行され、最後にバッチが実行される。呼び出し側が単一アクションを発行することを望んでいる場合は、ただ1つのアクションのバッチ要求を作成するだけである。
Executeメソッドが呼ばれるまでアクションはどれも実行されない。Executeは、同期的に、または非同期的に呼び出すことができる(Executeが呼び出されるか、またはBeginExecuteが呼び出されるかに応じて)。呼び出し側は、完了インターフェース内を通ることができるか、またはIImgAsyncResultインターフェースから返されたウェイトハンドルを使用することができる。このルールは、呼び出し側が完了インターフェースを通る場合、ウェイトハンドルを取り出せないというものである。呼び出し側は、クッキーインターフェースを通じて付加データを呼び出しに関連付けることができる。CDIは、Doneメソッドが呼完了インターフェースで呼び出され、必要に応じてクッキーを解放できることを保証する。呼び出し側は、EndExecute呼び出しを呼び出して、バッチ処理呼び出しの結果を取り出さなければならない。
呼び出し側は、バッチをシリアル、パラレル、またはトランザクションバッチとして開くことができる。非トランザクションバッチは部分的成功戻り値を持つことができるが、トランザクションバッチはそうではない。残念なことに、すべてのコレクションがトランザクションをサポートするわけではなく(トランザクションをサポートしていないダウンレベルのシステムと通信する可能性がある)、バッチのアクションのどれかが非トランザクションコレクションにクロスした場合、バッチ全体が失敗する。したがって、一実施形態により、トランザクションバッチ処理は、主に、システム内部で実行することができるか、または一度だけ、サーババージョンがポジティブに識別されている。
「Pause all printers」のようなバッチ処理可能ないくつかのアクションについては、トランザクションであることは意味をなさないが、それは、1つのキューが一時停止できなかったため、どのキューも一時停止しないのではなく、キューの半分を一時停止しているからである。バッチの意味動作がシリアルである場合、バッチ内のアクションは、順次実行されることが保証される。バッチの意味動作が並列である場合、システムは、十分な資源があるか、または他の何らかの形でそうするのが最適である場合に、アクションを並列実行する可能性がある。これは、並列バッチ意味動作では、アクションはどれも任意の順序で失敗する可能性があることを意味する。トランザクションバッチは、さらに、順次意味動作を暗示する。
バッチ内のそれぞれのアクションは、増大するインデックスを返す。呼び出し側は、バッチ呼び出しの結果を取り出す必要がない場合に、インデックスを無視することができる。(それがトランザクションバッチである可能性があり、またバッチのステータスは、アクションのステータスである)。それぞれの呼び出しの結果は、バッチインターフェースの対応する「Result」メソッドを呼び出すことにより取り出すことができる。この呼び出しでエラーが報告された場合、拡張エラー情報をバッチから返すことができる。
executeの同期および非同期形式は、非同期の場合に、EndExecute呼び出しから戻りステータスが返されることを除き同じである。バッチコマンドは並列実行することが可能であるため、バッチは、部分的な失敗結果を伴う可能性がある。それぞれのインデックスに対しクエリを実行し、どの呼び出しが失敗したか、呼び出し側で望む場合に、その失敗理由を正確に決定することができる。
実施形態による、バッチ処理インターフェースのメソッドを以下に要約する。
● GetObjectData−与えられたタイプマップおよび呼び出し側指定オブジェクトを使用して与えられたオブジェクト名からデータを取り出す。
● SetObjectData−書き込みを行うため与えられたタイプマップを使用して与えられたオブジェクトにデータを書き込み(クライアントコレクションとサーバコレクションとの間のアクセッサは逆転される)、そのオブジェクトからデータが取り出される。データがリモートデスティネーションに送信される場合には、内容は早い段階でオブジェクトからすっかりコピーされることに注意されたい。ローカルオブジェクトに対してデータが設定されている場合、それらの内容は、後から実際の設定が行われるときにコピーされる。
● QueryObjectData−特定のオブジェクトクラスに対してクエリを発行する。クエリについて、以下で詳述する。クエリは、ただ単一オブジェクトではなくクエリの条件を満たすために多くのオブジェクトがコレクションから割り当てられることを除きGetコマンドと概念上ほぼ同様である。
● IssueCommandToObject−オブジェクトに対してコマンドを発行する。コマンドについて、以下で詳述する。コマンドは、与えられたオブジェクト上の特定の型に発行される。コマンド自体は、ユニコード文字列であり、入力引数の順序付きリストを受け取る。出力パラメータは、ResultIssueCommand呼び出しを通じて呼び出し側で取り出すことができる。
● Execute−これにより、ここまでバッチ処理されるすべてのコマンドが実行される。
● Cancel−execute呼び出し実行後、現在進行中のアクションをキャンセルする。これは、さらに、呼び出しが実行される前にバッチ処理インターフェースからコマンドを一気に消去する。
バッチ処理インターフェースは、Cancel呼び出しが戻った後、または同期Execute呼び出しが完了するか、非同期EndExecuteが戻った後にしか、再利用できない。
図6は、バッチ呼び出しコマンドの図を示している。ここでは、IImgDataBatchインターフェースは実行すべきコマンドのリストを作成すると仮定する。
クエリ、コマンド、および通知は、後の節で詳しく取りあげる。したがって、オブジェクトの状態を取得し、その後、オブジェクトの名前およびコメントを変更し、それらの変更を再び適用するコードスニペットのサンプルを以下に示す。コードは、非同期コールバック形式で書かれており、非同期バッチ処理インターフェースを例示しているが、実際にはこのような複雑なことを必要としない。
Figure 2006252539
Figure 2006252539
Figure 2006252539
オブジェクトのクエリ
この節では、オブジェクトのクエリについて説明する。IDataAccessBatchにより公開されるインターフェースを以下に示す。
Figure 2006252539
typeMapおよびclientCollectionパラメータについては、すでに説明されている。queryStringパラメータは、クエリを制御する。ヌルであれば、クエリは、クエリベースにより指定されるように与えられた型のすべてのオブジェクトを要求する。ヌルでなければ、クエリのフィルタを指定する。クエリは、クエリベース、クエリクラス、およびクエリ文字列からなる。クエリ文字列については、少し後で取りあげる。クエリベースは、クエリのルートオブジェクトである、つまり、他のオブジェクトが存在すると考えられるオブジェクトである(ジョブ列挙のクエリベースは、プリンタまたはサーバオブジェクトとすることができる)。クエリベース関係は、通常、階層的でなく、関係的である(つまり、クエリベースから2レベル下でオブジェクトを列挙できない)。しかし、厳格な階層とは異なり、オブジェクトは、多くの異なるクエリベースの下に置くことができる。これは、基幹ストアが関係的であるという事実を反映している。クエリベースをサポートする主な理由は、クエリのダウンレベル列挙型ベースの実装で列挙型に対するルートオブジェクトを容易に見つけられることにある。しかし、クエリベースは、アップレベルの場合には、クエリの解析を複雑にする。
クエリおよび型のサンプルリストを以下の表にまとめた。コレクション内のオブジェクトは、コレクションのプログラム名を使用できないことに注意されたい。これらは、フレンドリ名に対し名前解決メカニズムを使用し、その後、内部で、数値オブジェクト名を使用してオブジェクトを参照するようにしなければならない。文字列は人間が編集する可能性が高いため、コレクションを、クエリに対するプログラム名を使用して指定することができる。
Figure 2006252539
リモートコレクションは、ローカルマシンに対するクエリについてオブジェクト返す必要はないことに注意されたい。効率が悪すぎるため、すべてのサーバにクエリを実行することはできない。クエリ文字列は、与えられたオブジェクトが持たなければならない属性を指定するフィルタである。フィールドは以下の形式をとる。
Programmatic.Type.Name.Version:FieldName
将来のクエリでは、データに埋め込まれたXMLドキュメント内のデータにアクセスすることを許されることであろう。これらのクエリは以下の形式を持つ。
Programatic.Type.Name.Version:FieldName\Node\Node\Property
有効な演算子およびその優先度を以下の表にまとめた。
Figure 2006252539
フィールドは、複数の定数とのみ比較することができる。以下に有効な定数を示す。
● 任意の整数値。整数を、10進数または16進数形式で表すことができる。
● 任意の浮動小数点数。
● 引用符で囲まれた任意のリテラル文字列。引用符を文字列の一部とする必要がある場合は、BASICスタイルの””を使用する。
有効なクエリを以下の表にまとめた。いくつかの共通アクセスオブジェクトの意味動作を簡素化するために、ダウンレベルサーバとの相互運用性を容易に確立できるクエリベースを正しく定義することができる。これらに含まれるのは、以下のとおりである。
● 印刷キュークエリ−クエリベースは、印刷キューを含むサーバオブジェクトでなければならない。
● ジョブオブジェクトクエリ−クエリベースは、ジョブを含むキューまたはサーバオブジェクトでなければならない。
Figure 2006252539
一実施形態により以下の制約条件がクエリに適用される。
● クエリが数値型(整数または浮動小数点数)についてフィールドを比較する場合、実際のフィールドは数値(32ビット整数、64ビット整数、または倍精度数)でなければならない。
● クエリが文字列型についてフィールドを比較し、比較演算子がCONTAINSでない場合、唯一の有効なフィールド型は、BSTRまたはIImgImutableStringである。
● CONTAINS演算子は、文字列型にのみ作用する。単一値文字列については、等しいかどうかの検査となる。正規名については、パスが同じかどうかの検査となる。マルチ文字列については、マルチ文字列内の文字列が等しいかどうかの検査を評価する。多値名については、多値名の中の正規名のどれかにより表されるパスが包含演算子が参照する文字列に等しいかどうかの検査と同等である。
● ビット単位のAND演算は、整数型にしか適用されない。
この説明を具体的にするために、以下の抜粋コードでサンプルを示す。これは一組の印刷オブジェクトのクエリを実行し、その後それらを列挙する。このサンプルでは、IAsyncResultインターフェースの待機可能な形式を使用する。ここでもまた、この場合には、これは必要ではないが、インターフェースの他の使用法を示している。呼び出し側に対してIImgClientCollectionおよび列挙子を自動的に構築するテンプレートライブラリの機能を使用することに注意されたい。簡単のためエラー処理は省略される。
Figure 2006252539
Figure 2006252539
オブジェクトコマンド
オブジェクトのコレクションのクエリを実行するとともに、与えられたオブジェクトにコマンドを発行することができる。
オブジェクト上のコマンドは、オブジェクトが持つ可能性のある他のコレクションからの組み込み型を含む、型に結び付けられる。これにより、オブジェクトのコマンド集合を拡張できるか、または永続性ベースとすることができる。
一実施形態によれば、コマンドは以下のプロパティを持つ。
● コマンドは決してキャッシュされないが、データはキャッシュできる。
● コマンドは、失敗例外を超えて呼び出し側にパラメータを返すことができる。
● コマンドは、順序付けされた入力および出力パラメータの固定された集合を持つ。コマンドは、オーバーロードまたは拡張することはできない。コマンドの意味動作は、システムのバージョンが新しくなっても決して変わることはありえない。(コマンドは、陳腐化する可能性があり、最終的にサポートは打ち切られる場合がある。)
コマンドは、オブジェクト構成およびオブジェクト削除に使用される。オブジェクト削除の場合、定義済みの型およびメソッドが定義される−「Microsoft.GenericObject.1」、コマンド「Delete」。削除コマンドは、パラメータを取らず、パラメータを返さない。すべての削除可能なオブジェクトは、このコマンドを公開する必要がある。すべての埋め込み可能なオブジェクトも、このコマンドを公開する必要がある。埋め込まれたオブジェクトの含んでいる側のオブジェクトが削除された場合、埋め込まれたオブジェクトのすべてに自分自身を削除するよう要求する。
セキュリティ保護可能なすべてのオブジェクトが公開する必要があるもう1つのコマンドは、「Microsoft.GenericObject.1」コマンド「AccessCheck」であり、これは、単一のパラメータ−パーミッションオブジェクト−を取り、真または偽を返す。このコマンドは、自コレクションを通じてアクセスされる場合に埋め込みオブジェクトと同じセキュリティ意味動作を必ず強制するように組み込み型により使用される。
コマンド呼び出し結果から返されたパラメータの存続期間は、バッチの存続時間と同じである。バッチが、解放、キャンセルされるか、または他のアクションがバッチに対し実行された場合、コマンドパラメータは消去される。
最後に、コマンドインターフェースの使用例を以下に示す。これは、すでに発見されている印刷キューにストリームオブジェクトを要求する。
Figure 2006252539
通知
通知を、さらに、オブジェクト、オブジェクトクラス、サーバ、またはコレクションから受け取ることもできる。このインターフェースは、さらに、クライアントからバッチ処理される。このインターフェースは以下に示されている。
Figure 2006252539
Figure 2006252539
このインターフェースは、多数の新しい概念を公開しており、とりわけ、例えば、限定はしないが、通知コレクション、通知オブジェクト、通知フィルタ、および通知チャネルが含まれる。このインターフェースは、他の2つのアクションRegisterNotificationCollectionおよびResultNotificationCollectionとともにバッチインターフェースを拡張する。
通知コレクションは、わずかに豊富な意味を持つクライアントコレクションである。これは、同質なクライアントオブジェクトのコレクションである。それぞれのオブジェクトは、タイプマップにより記述することができる。特定のオブジェクトに対する通知が発生した場合、またはオブジェクトが追加された場合、オブジェクトが取り出され、その後、値を入力される。オブジェクトに対する新しいデータがその中に入れられると、そのオブジェクト上のEndNotifyChangesメソッドが呼び出され、オブジェクトが更新されると、インプリメンタが必要な処理を実行することができる。
呼び出し側により指定された通知コレクションは、常に、逐次的に更新される(つまり、複数のスレッドにより呼び出される可能性があるが、一度に1つのスレッドしかそれを呼び出さない)。通知コレクションは、PopulateまたはUpdate呼び出しが、そのチャネル上で実行された場合のみ更新される。したがって、呼び出し側は、マルチスレッドアクセスをオブジェクトに対し実行している場合に、PopulateまたはUpdate呼び出しに適切なロックを掛けることによりオブジェクトを保護することができる。呼び出し側が通知に対しコールバックを指定した場合、一度に1つのスレッドのみがコールバックで実行することを保証される。
通知は、以下のように働く。Populate呼び出しがチャネルに対し実行されると、Addメソッドを通じて指定されたコレクションからオブジェクトが割り当てられる。その後、BeginNotifyChanges呼び出しでオブジェクトが呼び出され、これが更新サイクルか、値設定サイクルであるかが、このときに、オブジェクトに渡される。
その後、通知チャネルを通じて通知が受信される。呼び出し側がコールバックを指定した場合、新しい更新が受信されると(またはチャネルがエラーを発生した場合に)コールバックが呼び出される。呼び出し側がコールバックを指定しなかった場合、ウェイトハンドルが利用可能になるか、またはIsCompletedメソッドについてチャネルがポーリングされることができる。通知は、サブシステムにより受信されるが、チャネル上でUpdateメソッドが呼び出されるまでクライアントオブジェクトに適用されない。何らかの理由によりチャネルが途絶した場合、更新の際に適切なエラーが返される。
Updateの呼び出し時に、クライアントオブジェクトは、サーバ上で変更されたプロパティで更新される。新しいオブジェクトがサーバ上で作成されるか、または通知フィルタと一致する場合、コレクションは、Addメソッドの呼び出しを受け取り、通知の理由がオブジェクトがこれでフィルタと一致したことであるのか、またはオブジェクトが新しいのかを知らされる。
同様に、オブジェクトがフィルタに一致しない場合、または削除されてしまっている場合、コレクション上でRemoveメソッドが呼び出される。
オブジェクトは、プロパティの直接呼び出しにより更新される。更新は、BeginNotifyChangesメソッドの呼び出しとEndNotifyChangesメソッドの呼び出しで囲まれる。
呼び出し側が通知の受信を停止することを望んでいる場合、受け取ったINotificationChannelインターフェースを解放する。
コレクション内のすべてのローカルオブジェクトから2つのフィールドについて通知を受信するサンプルコードが以下に示されている。このサンプルコードは、ローカルコレクション内のすべてのプリンタに対するStatusおよびNameフィールドの変更を受け取る。プリンタは、クエリの結果として画面上で更新されると仮定される。読みやすくするため、エラー処理は省略されている。
Figure 2006252539
Figure 2006252539
Figure 2006252539
クライアントコレクション
CDIインターフェースの一態様、つまり、データをある種の中間データオブジェクトに書き込みデータセットを伝搬するのではなくクライアントコレクションおよびクライアントオブジェクトの値設定を行う選択には、いくつかの利点がある。
例えば、そうすることにより、通知およびデータ設定を、非常によく似た方法で取り扱うことができる。クライアントの観点からこれが意味することは、クライアントオブジェクトは、これら2つの場合において非常に容易に再利用できるということである。さらに、そうすることにより、クライアントコードは極めて効率的なものとすることができる。特に、データがクライアントオブジェクトの中に集められた後、固有の方法で構造体内のオフセットとして参照される。データが中間コレクション内に格納される場合、クライアントは、順にデータをいくつかのクライアントオブジェクト内にコピーして操作しなければならないか、またはデータをコレクションから毎回取り出さなければならない。
さらに、クライアントコレクションおよびクライアントオブジェクトの値設定により、クライアントコード内の失敗条件は、コレクションからコピーされるときではなく、データが設定されるときに制限される。これは、クライアントコードの複雑さを実質的に低減する可能性を有する。中間コレクションが使用される場合、コレクション内のデータがアクセスされるときには必ず、失敗の可能性がある。
さらに、クライアントコレクションおよびクライアントオブジェクトの値設定により、複数の種類の中間コレクションを使用することができる。本質的に、このメカニズムは、完全に柔軟なビルダパターンをカプセル化する。これは、汎用「クライアント」がタイプマップを動的に構築し、それを、お気に入りの任意の種類の中間コレクションにマップすることができることを意味する。これは、マネージドデータプロバイダ用のデータセットオブジェクトを構築するために使用することが可能であろう。それとは別に、データのXMLビューを構築するために使用することも可能であろう。これは、中間データセットが間に挿入されることにより生じる忠実度またはパフォーマンスの喪失なしで実行することが可能である。さらに、関連するプロパティは、クライアントコレクションおよびクライアントオブジェクトの値設定により、クライアントコレクションは、実際に、容易にリモーティングを行える形式でデータを準備するアクセスアダプタとすることができるというものである。しかし、ネガティブな面では、クライアントオブジェクトは、取り出したいそれぞれのプロパティに対するアクセッサを公開することを強制される可能性がある。
動的タイプマップ
例示され説明されている実施形態を使用することにより、ユーザが1つのオブジェクトインスタンスを所有することを望んでいるが、呼び出し条件に応じてサーバオブジェクトから異なるフィールドを動的に取り出すことができることを望んでいる状況に対処することができる。このようなことが生じる可能性のあるケースは2つあり、1つは、多数のプロパティを備える具体的オブジェクトがあるが、呼び出し側が与えられた呼び出しで伝搬されることを望んでいる実際のプロパティが動的である場合、もう1つは、呼び出し側が実際にデータを完全に動的に取り扱いたい場合である。それぞれ、例示され、説明されているアーキテクチャ内に解決策がある。
第1の問題を解決するために、例示され説明されている実施形態において、それぞれのプロパティに関連付けられているタグを使用して、クラスから部分集合動的タイプマップを構築する。これらのタグは、テンプレートライブラリの一部として指定することもできる。テンプレートライブラリは、指定されたタグのみと一致する部分的タイプマップを取り出す。この解決策は、以下の抜粋コードに示されている。
Figure 2006252539
完全に実行時に決定されるプロパティの完全にランダムな集合をリモートサーバから取り出せるようにすることも、タイプマップインターフェースを通じて実現できる。しかし、この場合、単にプロパティの集合を1つのクラスに束縛することはできない。この場合、低レベルのタイプマップインターフェースのパワーと柔軟性が実際に効くのである。この場合、呼び出し側は、すべてのインターフェースはオブジェクトインスタンスでもあるという事実を利用し、バリアント型を直接使用することができる。この概念は、図7に示されている。
そこでは、それぞれのインターフェースは、実際に、静的なメソッドまたはフィールドではなく、オブジェクトを指す。それぞれのオブジェクトは、最終デスティネーションオブジェクトを操作する方法に関するある種の状態を保持する。この場合、これは、デスティネーションオブジェクトが保持するオブジェクト配列へのインデックスを保持する。デスティネーションオブジェクトの配列のサイズは可変であり、デリゲートオブジェクトおよびタイプマップは両方とも、動的に構築できる。したがって、このメカニズムを使用することにより、呼び出し側は、ソースオブジェクトにバインドすることができ、任意のソースオブジェクトをオンザフライで構築できる。
例示され説明されている実施形態では、このメカニズムは、実際には完全に汎用的である。これらのインターフェースがXMLドキュメントの構築、データセットの作成、または画面へのデータの書き込みに参加できない特定の理由はない。また、これを使用することで、オブジェクトのコレクションを任意の形式で構築することもできる。これは、longhorn APIまたはその他のデータアクセスAPIにブリッジする際に極めて有用である。
このスキームを実装するコードは以下に示されており、バッチインターフェースを通じて1つのオブジェクトにアクセスすることを含む(エラー処理は省かれている)。
Figure 2006252539
Figure 2006252539
Figure 2006252539
属性テンプレートライブラリおよび継承
テンプレートライブラリの興味深い態様の1つは、オブジェクト間の継承(複数の継承を含む)をサポートすることである。これは、サーバ上に比べて、クライアント上ではあまり使い道がない。サーバ上では、これにより、共通機能および対応するフィールドおよびメソッドを基本クラスに格納し、必要に応じて派生クラスに引き込むことができる。
継承をサポートすることに加えて、このライブラリは、仮想メソッドを正しく処理する。つまり、基本クラス内の仮想メソッドを、基本クラスタイプマップ内で参照することができ、したがって、基本クラス内の仮想メソッドは、派生タイプマップ内の派生クラスを正しく呼び出す。型の正常に機能している集合の実施例は、以下の抜粋コードに示される。このコードは、単に、クラスの構造を示しているだけである−簡単のため実装は省略されている。
Figure 2006252539
Figure 2006252539
この実施例では、派生クラスは、1つの仮想メソッドをオーバーライドし、2つの純粋メソッドを実装する。他のフィールドおよびメソッドはすべて、基本クラスから引き込まれる。派生クラスのメソッドは、テーブルの定義が基本クラスで定義されているテーブルから実際に引き込まれるとしても、そのまま呼び出される。
派生テーブルは、そのテーブル内の「Inherits」フィールドとともに基本クラステーブルの定義を引き込む。基本クラスおよび基本クラステーブルの拡張は、派生クラスのテーブル内に即座に反映される。したがって、これらのテーブルは、真の多重継承を実装するものとして示すことができる。
カーソル
カーソルは、呼び出し側が単一要求としてではなく、サーバから一度に1チャンクずつデータを取り出すためのインターフェースである。これは、列挙する必要のあるオブジェクトが多数、サーバ上にある場合に特に有用である。これは、1回の呼び出しによりネットワーク上で返さなければならないデータの量を減らし、サーバサイドでのワーキングセットを減らす。オブジェクトのコレクションが非常に大きい場合、さらに、これにより、クライアントはオブジェクトすべてをメモリに格納する必要がなくなる。その代わりに、クライアントは、テーブルの中へのカーソルを保持し、必要に応じてさらに多くの行を取り出すことができる。この特定の実装の実施例では、カーソルは、以下のさまざまな理由からCDIでは現在実装されていない。
● サーバ上に保持されているオブジェクトの数は、典型的なデータベースに格納されるのとほぼ同じ桁数とはいえない。クライアントがデータのコピーを格納するのに十分なメモリを持たないことは極めてありそうにない。
● サーバ上の多くのオブジェクトは、ほとんどのキューがジョブを受け取るので、必ずアクティブである。したがって、ワーキングセットは、データベースの場合ほど考慮しなくてよい。
● ネットワークトラフィックは、2つのパスでクエリを実行することにより任意に低減でき、その初期クエリは、それぞれのオブジェクトの正規名を取り出し、その後、GetObjectData呼び出しの第2の集合で、それぞれのオブジェクトに対するデータを取り出すことができる。複数のGetObjectData呼び出しを適宜1つのまとまりにできるので、それぞれのオブジェクトからデータを取り出すためにネットワーク内を行き来する必要がない。
● 呼び出し側は、正確なクエリフィルタを指定できるので、データセットのサイズをかなり小さくできる。例えば、クライアントスプーラは、すべてのジョブを列挙することなく、指定されたユーザに属すジョブを列挙することができ、それにより指定されたユーザに属さないものを除去することができる。
● 呼び出し側は取り出したいフィールドを正確に指定できるため、データの量は、不自由な情報レベルシステムを持つ現行システムに比べてかなり低減できる。例えば、現在、キュー内のジョブの数を取り出すためには、呼び出し側で、デフォルトのDEVMODEおよびセキュリティ記述子も含む、PRINTER_INFO_2を指定しなければならない。
● インターフェースは、現在、通知を除き、ワイヤレベルでステートレスである。カーソルは、サーバ状態を増やす傾向がある。カーソルに必要な状態を保持するためのオーバーヘッドは、特に緩和の数が指定された場合に、それから得られるメリットを超えることが考えられる。
しかしながら、特に印刷システムがドキュメントアーカイブを実行するようにスケーリングされる場合、または非常に大きな印刷サーバを少数がアクティブである非常に多くのキューを処理するようにできる場合に、システム内のある点においてカーソルを実装することが望ましいことがある(オブジェクトをいたずらにメモリ内に引き込むことを回避することは、このシナリオでは非常に重要になる)。この節では、クエリに対しかなり安価な前進のみカーソルが得られるメカニズムを説明する。
通知に関しては、通知はクライアントインターフェースに対する変更を必要としないと考える。ワイヤインターフェース(wire interface)は、値設定されたデータをチャンク単位でクライアントに送信し、その後、クライアントオブジェクトの更新を開始する。最適なパフォーマンスが得られるように、更新は元の初期値設定と交互に並べられる場合がある。
クライアントカーソルに関して、以下の事項を考察する。例示され、説明されているシステムの1つの目標は、可能な限りステートレスワイヤプロトコルを保持することである。したがって、カーソルによりオブジェクトのどのような集合が取り出されるかを定義し、その後、それらの目標を達成する実装を提供する。カーソルの妥当な意味動作は以下のとおりである。
● カーソルは、前進のみである。
● カーソルにより取り出されるオブジェクトの集合は、カーソルが作成されたときのクエリと一致するオブジェクトの数からその後削除されたオブジェクトの数を差し引いた数である。これは、カーソルが最初に作成された後作成されたオブジェクトを含まない。これは、遅いクライアントが、オブジェクトの集合が急激に変化する場合にサーバに対して決して終了しないという状況を防止する。
説明されている解決策は、増加一途のシーケンスカウントをそれぞれのオブジェクトとともに保持することである。カーソルが確立されると、現在の最大シーケンスカウント数は、クライアントにより記録される。オブジェクトの集合が返され、最後のオブジェクトの最大シーケンスカウントが記憶される。オブジェクトの次の集合が取り出される場合、このクエリでは、まず、Timestamp>last_maxおよびTimestamp<initial_maxである、次のCHUNKSIZEオブジェクトを取り出す。
結局、サーバ上の要求毎にこのクエリを実行するオーバーヘッドが、サーバ上のカーソルコンテキストを保持するために必要な接続を維持する平均オーバーヘッドを超えることになる可能性がある。解決策の妥協案は、GUIDにより識別されたサーバ上でカーソルのキャッシュを保持することである。クライアントは、タイムスタンプおよびGUIDをサーバにサブミットする。サーバサイドカーソルがまだキャッシュ内に存在している場合、当然その状態が使用される。そうでない場合、それは、タイムスタンプクエリを実行して復元され、キャッシュ内に再度挿入される。これにより、サーバは、低速なクライアントに対して手軽に状態を破棄することができる。
主要な目標が個々のネットワーク要求のサイズを低減し、クエリに対しサーバ上で必要なワーキングセットを縮小することであると仮定した場合、CDIインターフェースは、必ずしも変更を必要とせず、リモートアクセスアダプタおよびローカルアクセスアダプタは、クライアントがクエリを発行したときに透過的にサーバサイドへのカーソルを使用するだけである。
非常に大きなデータセットの場合、クライアント側で、一度にその状態全体をメモリに保持することのないようにカーソル自体を操作したい場合がある。この場合、カーソルを表すインターフェースは、CDIインターフェースから取り出される。暗黙のうちに単一カーソルは大量のデータを取り出すので、この呼び出しをバッチ処理させることは必要ない。
フレンドリ名解決
さまざまな点で、フレンドリ名を正規名に変換するという概念について説明してきた。フレンドリ名は、オブジェクトインスタンスの人間が読み取り可能なものであり、例えば、server.mydomain.orgというサーバあるという概念はフレンドリ名である。正規名は、サーバと通信するために使用するプロトコル、論理サーバがホスティングされる物理サーバ、および論理サーバオブジェクトインスタンスへの完全に一義的な参照を識別する完全に一義的な名前である。例えば、上記のフレンドリ名は、「{63315ca9−bef6−4cc5−9152−05e369d3d691}\www.realhost.net\{a4b6e956−dee0−46d0−b82c−7ffc8f814e95}\{f091b5a1−ad2a−4dfe−9d37−9592b1ae2512}」という正規名に対応している可能性がある。正規名は、完全に一義的であるという利点を持ち、コンピュータにとっては優れたものである。しかし、人間にとっては容易に入力できるものではない。
正規名が与えられた場合、これが関連している場合にオブジェクトのフレンドリ名を決定することは容易である。オブジェクトは、単純に、オブジェクトから取り出すことができる「Object:Name」などのプロパティを持つ。しかし、システムがフレンドリ名しか持たない場合、正規名を決定できなければならない。この節では、このインターフェースのアプリケーション呼び出し可能側について説明する。ネームリゾルバを実装することについては、以下の「フレンドリ名解決プラグイン」という表題の節で説明する。クライアントのフレンドリ名解決インターフェースは、以下に、一実施形態に従って示されている。
Figure 2006252539
呼び出し側が、フレンドリネームリゾルバを取得することを望んでいる場合、IImgCommonDataインターフェース上でGetFriendlyNameResolverメソッドを呼び出す。フレンドリ名は、2つの論理メソッドのみ(およびそれらの1つに対する非同期呼び出しパターン)を公開する。
ResolveName
解決すべき名前、例えば「server.mydomain.org」および名前のクラス、例えば「Server」が与えられた場合、名前解決インターフェースは、フレンドリネームリゾルバプラグインを呼び出して、IImgCanonicalNameIteratorインターフェースとしてプラグインにより返される有効なすべての結果を返す。ネームイテレータ(name iterator)を使用することにより、呼び出し側は、フレンドリ名に対応するすべての正規名を取り出すことができる。正規名を何回も返せるようにする理由は、同じオブジェクトが異なるパスを介して見える場合があるからである。例えば、同じサーバに対し、SOAPとRPCの両方を介してアクセスできる。
ResolveNameメソッドは、特定のオブジェクトにアクセスする方法を調べるために複数のプロトコルに対しクエリを実行しなければならない場合があるため、長い時間を要することがある。そのため、このインターフェースは、さらに、BeginResolveNameおよびEndResolveNameメソッドの形で非同期呼び出しパターンも用意する。これらは、バッチBeginExecuteおよびEndExecuteメソッドにより使用されるのと同じ非同期呼び出しパターンを使用する。呼び出し側は、コールバックインターフェースを指定するか、またはIImgAsyncResultの戻りを介して返されるシステム待機可能ハンドルを取得することができる。これらは、対応する正規名すべてが解決されたときに通知を受ける。
RemoveName
ネームリゾルバは、名前解決は潜在的に非常に遅く、コストがかかるため、フレンドリ名に解決された名前のキャッシュを保持する。キャッシュは、時間がたてば自動的にフラッシュされる。名前解決がその後キャッシュ内にあるのと同じ名前を解決できなくなった場合、それらの名前関連付けは駆除される。この動作は、一定時間の経過後、名前は陳腐化したとみなされることである。呼び出し側が再び名前を要求した場合、陳腐化した名前はネームリゾルバにより返されるが、名前解決の他のラウンドのものをネームリゾルバプラグインに発行し、そのどれもが名前を返さない場合には、その名前がキャッシュから削除される。これは、名前に対する非常に高速な解決を実現するが、陳腐化した名前バインディングが一定期間返される可能性がある。
呼び出し側は、フレンドリ名を解決するが、その後、CDIを介してアクセスされたときに正規名が失敗するため名前が陳腐化していると独立に決定する可能性がある。同じフレンドリ名を再び要求すれば、同じ陳腐化した名前を取得する可能性がある。これを防ぐために、RemoveNameメソッドを通じて、陳腐化した名前をキャッシュから明示的に削除することができる。呼び出し側がこれを実行しない場合、名前は、最終的に、クリアされるが、これがオプションの最適化である。
拡張オブジェクトの動作
前の節の目標は、CDIのインターフェースおよび基本概念を提示することである。この提示の目標は、主に使用法の観点から明らかにすることであった。前の節で提示されているようなインターフェースは、アプリケーション作成者が、印刷システム内のオブジェクトに対する通知の取得、設定、クエリ、および受信を行うのに十分強力なものである。この節が目指すのは、新しいセキュリティおよび発見機能を使用可能にするためオブジェクトにより公開できる付加的動作を提示することである。
オブジェクトファクトリ、オブジェクトクローニング
この節では、システム内に新しいオブジェクトを作成し、それらのオブジェクト(適用可能であれば)を他のシステムに転送し、新しいオブジェクト作成ユーザインターフェース(UI)を挿入できるようにするために使用できるメカニズムを取りあげる。ファクトリオブジェクトを除くシステム内のすべてのオブジェクトは、このメカニズムをサポートしなければならない。このメカニズムは、図8に示されており、以下の説明の基盤として使用される。
オブジェクト作成およびクローニングメカニズムでは、以下を行えるドライバストアがあると仮定する。
1.UIアセンブリ厳密名に基づきUIアセンブリをクライアントまたはサーバに供給する。
2.コレクションアセンブリ厳密名に基づきコレクションアセンブリをサーバ済度に供給する。
厳密名およびそれをバージョニングに関係付ける方法の正確な定義は、別に説明する。ただし、文脈上、以下で考察する。
厳密名は、使用されているアセンブリの実際のインスタンスおよび1つのモニカ内のアセンブリのパブリッシャを両者とも一意に識別する名前である。この一実装は、公開鍵暗号法を使用してアセンブリの内容に署名し、その後その署名の暗号ハッシュ(通常は、MD5ハッシュ)を実行し、そのハッシュ(またはハッシュの一部)を名前に埋め込む。この名前はアセンブリの内容に実際に結び付けられているだけでなく、アセンブリのパブリッシャにも結び付けられている。誰かが異なる機能で他のアセンブリを作成し、非常に大きな数(128ビットハッシュでは1038)のアセンブリを作成してそれぞれについてプロセス全体を試みることなく自分のアセンブリの厳密名を使用可能な知られている手法はない。
本質的な考え方は、それぞれのコレクションは、オブジェクトインスタンスの集合に対するファクトリオブジェクトとして機能するよく知られているオブジェクトインスタンスを提供するというものである。新しいオブジェクトに対する構成パラメータはあらかじめ知ることができないため、オブジェクトは、新しいオブジェクトインスタンスを作成するCreate()と呼ばれるコマンドを使用してカスタム型(この実施例では、Company.Type.1)を実装する。呼び出し側がファクトリオブジェクトおよびファクトリ型を知っている場合、新しいスプーラにおいてそのクラスのオブジェクトを作成することができる。
クローニングは、Microsoft.Object.1型をサポートするオブジェクトによりサポートされる。このオブジェクトによりサポートされるフィールドは、Collection SN、その作成に使用されファクトリオブジェクトインスタンスおよび3つのコマンド、GetStream、Delete、およびUpdateFromStreamを含む。GetStreamは、オブジェクトの内容をストリームの中に取り出し、Deleteは、オブジェクトを削除し、UpdateFromStreamは、それに渡されるストリームに基づきオブジェクトの状態を更新する。オブジェクトは、任意の種類のストリームをサポートできるが、相互運用性の理由から、ストリームはXMLであるのが理想的である。
オブジェクトのクローニングが行われる場合、オブジェクトインスタンスに対し、そのコレクションSNおよびファクトリオブジェクトインスタンスのクエリが実行される。これらは、ストリーム内に格納され、その後、ストリームにより表されるようなオブジェクトの状態が格納される。
オブジェクトを復元するには、ドライバストアからコレクションを取り出し、ファクトリオブジェクトを特定する。ファクトリオブジェクトは、CreateCloneコマンドを通じてストリームの残り部分に渡される。これにより、ファクトリは同一のオブジェクトインスタンスを作成する。
システム内のすべてのオブジェクトは、切り離されたUI作成およびクローニング機能をサポートしなければならないことに注意されたい。しかし、簡単のため、ファクトリオブジェクトおよびクローニングインターフェースは、説明および図を簡略化するため残りの節には示されていない。
階層
階層は、通常、2つの目標を達成する。1つは、探索空間を細分し、オブジェクトの効率的な特定を行えるようにすることである。CDIを複数のコレクションに分割する機能、与えられたクラスをサポートしている場合にコレクションのみをロードできる機能、および一連のアクションを与えられたサーバに送ることができる機能は、この目標をすでに達成している。もう1つは、システムまたは管理者が複数のオブジェクトを論理階層にグループ化できるようにすることにより異種オブジェクトを管理し、発見できるようにすることである。すべてのオブジェクトが階層内のどこかに配置されているため、階層を利用することにより発見することが可能である。そのため、システム内のすべてのオブジェクトが発見されるまでユーザがそれぞれのオブジェクト内へ順繰りにドリルダウンすることができるブラウザを構築することができる。階層は、さらに、管理アクションによりオブジェクトの部分木にセキュリティ変更を適用できるようにすることによりシステムのセキュリティのビューも実現できる。このメカニズムは、ファイルシステムでセキュリティを実装する方法に類似している。
階層は、通常、オブジェクト間の関係を示すためには有用でない。純粋な階層では、1つのオブジェクトは他のちょうど1つのオブジェクトの下にしか配置できない。そのため、ジョブは、プリンタおよびサーバの両方に属すことはできない。また、階層は、オブジェクト間の多対一の関係を効率よく示すこともできない。関係モデルは、オブジェクトの関係を示すうえでかなり強力である。CDIを使用すると、バッチ処理インターフェース(他のオブジェクトにより包含されると論理的に考えられるオブジェクトを返す)上のQueryアクションのQueryBaseメカニズムを通じてこれを効果的に行うことができる。
階層の第1の目標は、すでにCDIおよびリモートアクセスアダプタルーティングメカニズムにより達成されており、またCDIの関係メカニズムは、オブジェクト関係を表すためにとにかくより強力であるため、システム内の異種オブジェクトの管理および発見をサポートするメソッドだけがあればよい。既存のモデルはかなりの割合のケースについて十分に強力であるため、すべてのオブジェクトが必ず階層をサポートするとは限らないことに注意されたい。サービス層により提供されるデフォルトの永続可能なストアは、階層を自動的にサポートする。したがって、ローカルオブジェクトに対する最も単純な実装は、自動的に階層をサポートする。発見可能な階層をサポートするが、修正可能な階層をサポートしない場合もある。例えば、現在のスプーラRPCインターフェースをサポートするリモートアダプタを使用すると、クライアントはサーバの下でプリンタ、プリンタの下でジョブを発見できる可能性があるが、編成を変更することは許されない。
階層は、1つの型を持つLinkクラスと呼ばれる新しいClassを導入することにより表すことができ、リンク型は、何らかの方法で現在のオブジェクトの「下に」あると考えることができるオブジェクトの正規名である1つのプロパティObjectを持つ。現在のクラスから階層的にトラバースされうるオブジェクトインスタンスを発見したい場合、クエリベースとしてトラバースされるオブジェクトインスタンスを持つLinksクラスについてクエリを実行する。階層内に設定される多数のオブジェクトの実施例が図9に示されている。これは、ありとあらゆるマシン上のルートオブジェクトとなる、論理システムオブジェクトを除外する。
リンククラスクエリの実装は、永続的オブジェクトコレクションサービスにより自動的に実現される。しかし、発見可能な階層を公開することを望んでいるコレクションでは、リンククエリに値を設定できる。例えば、DSオブジェクトを公開するコレクションは、それぞれのDSオブジェクトの子を列挙し、その後、親オブジェクトが列挙された場合にそれぞれのオブジェクトの区別名をリンクタブの中に投入できる。
セキュリティおよび階層
階層は、発見可能性とセキュリティを規定する。CDIは、オブジェクトのセキュリティ記述子が変更された場合に、子オブジェクトを通じて実行され、セキュリティ継承ルールを強制することになるセキュリティエージェントを備える。セキュリティは、永続的オブジェクトコレクションサービスにより自動的に処理され、セキュリティエージェントは、このコレクション内のオブジェクトに対し自動的に実行される。
論理グループと呼ばれる特別なオブジェクトが用意され、管理者はオブジェクトの任意の集合をその下に置くことができる。これにより、管理者は、論理グループ上のACLを変更し、その論理グループの下にあるすべてのオブジェクトにそれらのACLを自動的に適用させることができる。これにより、管理者は、有用とわかっている管理階層をサーバ上で適用し、その後、セキュリティルールをその階層に適用することができる。
セキュリティおよびクラスミックスイン
階層によりセキュリティを制御するとともに、システムでは、さらに、クラスによりセキュリティを制御することもできる。このため、作成者/所有者管理アクセス権をシステム上で作成されたすべてのジョブに付与するなどの機能を使用できる。現行システムでは、クラスルールは、システムにハードコードされているが、将来、どのクラスでもミックスインが使用可能になる。
図10に示されているように、クラス継承は、セキュリティ階層内で編集可能なクラスオブジェクトを公開することにより実現される。これらは、それぞれ、作成時にそれぞれのクラスに適用されるデフォルトのセキュリティ記述子を最初に含むことになる。他のすべてのオブジェクトと同様に、これらは、システム全体の基本オブジェクトとして使用される論理システムオブジェクトからその記述子を継承する。適切なクラスのオブジェクトが作成されると、親オブジェクトとクラスオブジェクトの両方が、セキュリティ記述子を派生させるために使用される。図10は、さらに、階層上の論理グループの効果も示している。ここで、管理者は、2つの論理グループを作成しており、1つはクラスタサーバへのアクセスを制御することができ、もう1つはローカルサーバオブジェクト上のプリンタへのアクセスを制御することができる。ここでそれぞれの場合にオブジェクトが1つしか示されていないが、それぞれの論理グループの下に、オブジェクトをいくつでも配置することが可能である。
メタデータ
例示され、説明されている実施形態では、CDIは、オブジェクトをリモートオブジェクトにバインドする機能を備えるが、呼び出し側は、バインドする前にそのオブジェクトがサポートするフィールドおよびコマンドを知っていなければならない。ほとんど常に、クライアントは、サーバオブジェクトおよびそれらがサポートするインターフェースを知っている。クライアントが知らなかった場合、機能するサーバオブジェクトについて先験的に知っている必要があるため、クライアントは正常に機能できないであろう。インターフェースは、この動作を最適化するように適合され、呼び出される際のコンテキストを正確に知っているクラスはメタデータメカニズムを実装する必要はない。
しかし、クライアントが操作対象のクラスについて先験的知識を持たない場合もある。例えば、クライアントは、マネージドデータプロバイダインターフェースへのCDI呼び出しを翻訳するアクセスアダプタである場合もある。この場合、そのクライアントにより要求されるデータは、先験的に知ることはできず、通信相手のサーバオブジェクトも、先験的に知られることはできない。または、そのクライアントは、クライアントまたはサーバ上のオブジェクトのすべてをオブジェクトの型に関係なくブラウズし操作できるようにする汎用管理UIである場合もある。
この目的のために、例示され、説明されている実施形態は、呼び出し側がオブジェクトインスタンスに対しそのメタデータについてクエリを実行できるようにする標準システム型を備える。これらの型は、Type、Property、Command、およびParameter型である。コレクションアダプタサービスを使用して実装されるクラスは、自動的に完全なメタデータサポートをフリーで取得するこれは、クラスのそれぞれについて供給されるサーバオブジェクトのタイプマップから取り出される。
メタデータを取り出すためのベースとしてオブジェクトによりクエリが実行可能な型を図11に示す。
メタデータは、クエリのベースとしてオブジェクトによりTypes型について最初にクエリを実行することにより取り出される。Types型は、論理オブジェクトインスタンスによりサポートされるすべての型のリストを備える。将来、システムにおいてオブジェクトを他のオブジェクトの中に埋め込む、または他のオブジェクトを拡張することが可能になるため、これらの型は、基幹の基本オブジェクトだけでなく、そのオブジェクトインスタンスに対するすべての集成型を含むことになる。次に、それぞれのTypes型は、サポートされるコマンドまたはプロパティについてクエリが実行されるようにできる。さらにそれぞれのコマンドは、サポートされるパラメータについてクエリが実行されるようにできる。
クエリベース
クエリベースは、他の何らかの形で非階層型であるシステムでは風変わりな設計の態様である。この節では、そもそもなぜそれらが実装されたのか、またどのようにして関係クエリにマップされるのかについて説明する。
クエリベースでは、ソースオブジェクトを指定し、クエリが実行されるクラスのインスタンスを何らかの尺度により「下」にあると考えることができる。これは、さまざまな理由から与えられる。まず、これを使用すると、他の方法ではクエリの一部として関係を表す方法を知ることがない誰かが下位要素の列挙を構成できる。第2に、列挙に基づくダウンレベルのシステムに非常にうまくマッピングされるということである。クエリのベースは、非常に自然に、列挙における親オブジェクトとなる。したがって、ダウンレベルオブジェクトでは、クエリベースおよびオブジェクト状態に対するフィルタは、クエリを実装する自然な方法である。第3に、可変性の高い構成を持つオブジェクトの場合(例えば、オブジェクトにより格納されるメタデータ)、親オブジェクトからの列挙のシーケンスとしてクエリを取り扱うことがより論理的である。
しかし、クエリベースは、関係クエリにマッピングするための何らかの操作を必要とする。幸いなことに、これは、実現が比較的容易である。
Figure 2006252539
例示目的のために、上記のテーブルは、印刷キュー内の多数のジョブを例示している。ジョブが関連付けられているオブジェクトの正規名を格納する2つのフィールド(基幹データベース内の外部キーとして実装される)がある。リモートオブジェクトを参照するそれぞれの列は、リモートオブジェクトクラスを認識する。
クエリが特定の基本オブジェクトを受ける場合、オブジェクトのクラスはオブジェクト内の論理フィールドに相関され、その後、クエリは、正しい値を持つこのフィールドを含むように拡張される。
例えば、クエリがBase=”{SSSS}”、Base Class=”Server”を受け、クエリ文字列が「Jobs:Size<150KB」である場合、これは、以下のクエリに翻訳される。
Jobs:Server=”{SSSS}” AND (Jobs:Size<150KB)
これは、正しい結果、Fred’s Jobを返す。この翻訳は、コレクションアダプタサービス内で自動的に実行される。どのようなフィールドをクエリベースとして使用することができ、どのようなクラスに対応するのかを知る必要があるため、サーバオブジェクトのタイプマップ内に少し多くのメタデータを必要とする。
CDI実装
前節では、オブジェクトから予想される動作を説明し、クライアントに公開されるインターフェースについて説明した。この節では、CDIのサーバサイドの実装を説明する。CDIにより提供されるサービスおよびプラグインモデルについて説明する。
図12は、CDIの主要コンポーネントとともに、システム内に挿入されるさまざまなプラグインを示す。あらかじめ、主要コンポーネントのそれぞれの説明を行い、その後、CDIボックス自体の中のコンポーネントの詳細な説明を行う。コレクションアダプタサービスは、システムによって提供されるが、これは、プラグインによりホスティングされる別のサービスと考えられ、CDIそれ自体の一部でない。コレクションアダプタサービスについては、次の節で説明する。
アプリケーション
アプリケーションへのインターフェースは、前節の主要焦点となっていた。アプリケーションでは、CDIにバッチインターフェースを要求し、多数のアクションを記録し、その後、それらを実行する。実行が完了すると、アプリケーションは結果を取得できる。
ルータ
アクションを実行すると、ルータによりそのバッチがルーティングされ、プラグインに渡される。ルータは、同じプラグインを宛先とするバッチの連続する範囲を見つけて、それらの範囲を1回の呼び出しでプラグインに渡す。したがって、プラグインは、そのまま、バッチ処理動作自体を保存することができる。アプリケーションにより呼び出され意味動作に応じて、これらの節は、プラグインに並列に、順次に、受け渡すことができるか、またはトランザクションオブジェクトをバッチに関連付けて、プラグインがトランザクションを調整するようにできる。
プラグイン
プラグインは、DLLマニフェストおよび構成情報と関連してDLLにより公開されるインターフェースである。単一のDLLで、1つまたは複数のプラグインインターフェースを公開することができる。例示され、説明されている実施形態では、プラグインインターフェースは、1つのメソッドを持つ1つのファクトリインターフェース、および2つのメソッドAsyncProcessRequestおよびShutdownを持つプラグインインターフェース(IImgBatchCollection)からなる。プラグインインターフェースは、そのまま、そのオペレーションをバッチとして受け取る。したがって、これは、バッチもサポートする他のシステムへのリモーティングに使用する論理インターフェースである。この目的のために、例示され、説明されている実施形態では、プラグインであるローカルアクセスアダプタ、リモートアクセスアダプタ、サンドボックスアダプタ、および適応型プラグインが用意されるが、それぞれについて以下の段落で別々に説明する。
ローカルアクセスアダプタは、ローカルサービスまたはユーザ別サービスへのアクセスを行えるようにする。現在、これは、非同期COMを使用するが、他のリモーティングメカニズムを使用できない理由は特にない。
リモートアクセスアダプタは、リモートマシンにアクセスするためのものであり、大部分、ローカルアクセスアダプタと同じメカニズムを使用し、サーバ上でクライアント別状態を低減するいくつかの違いがある。
サンドボックスアダプタは、これまでのアプリケーションの作業を、要求をバッチにグループ化することとして保存するために使用される。これは、同じ万能プラグインモデルをプロセス内またはプロセス外コンポーネントで使用することができ、さらには、望めばサンドボックスシステムコンポーネントも可能であることも意味する。CDIのほかにシステムのすべての部分は、プラグインとして公開される。
適応型プラグインは、極めて単純な形態であるが、プラグインは、非同期呼び出しで、キューに入れられているバッチオペレーションを解釈する必要があり、これは複雑な作業になりうる。このような理由から、コレクションアダプタサービス(CAS)が用意されている。コレクションアダプタサービスを使用すると、オブジェクト(IImgObject)の複数のオブジェクトコレクション(IImgObjectCollection)をプラグインし、次に、バッチ処理された呼び出しを解釈し、それらを供給されるコレクションおよびオブジェクト上の複数の呼び出しに翻訳することができる。コレクションアダプタサービスは、これらのインターフェースの同期および非同期の両方の実装を効率よく扱うことができる。コレクションインターフェースは、十分に広く、ダウンレベルプロトコルにアクセスするために使用できる。通常、バッチ処理をサポートしないため、これらの場合において、パフォーマンスの損失はない。
サービス
例示され、説明されている実施形態では、CDIは、一連のサービスを提供する。これらのほとんどは、プラグインからしかアクセスできない。これらのサービスは、パブリックであり、CASおよび他のプラグインに等しく公開される。これにより、CASだと制限が強すぎると考える独立系ソフトウェアベンダまたは独立系ハードウェアベンダは同じ機能自体を得ることができる。明示的な目標は、CASがほとんどのシナリオを解決できるようにすることであり、システム供給オブジェクトはすべてそれを使用する。CDIにより提供されるサービスは、クエリコンパイラ、ワークフロー、トランザクション、変更スコープ、バリアント、およびタイプマップを含み、以下では、それぞれについて別々に説明する。
クエリコンパイラは、アプリケーションにより供給されるクエリを2つの形式、解析木とフィルタにコンパイルすることができる。解析木は、プラグイン側でクエリを他の形式のクエリに翻訳することを望んでいる場合に有用である−これは、かっこおよび演算子優先度が解決され、いくつかの基本的な適格性検査がパーザーによりすでに実行されているため、自分でクエリの再解析を試みるよりも容易である。フィルタは、オブジェクトにバインドすることができ、メソッド−与えられたオブジェクトの状態が渡されたクエリと一致する場合に呼び出し側が検査できる「DoesMatch」を備える。
ワークフローは、アプリケーションがCDIへの呼び出しを実行する場合には必ず、インスタンス化されるインターフェースである。これは、ユーザアクションの論理的実行に対応する。ワークフローは、作業をスケジュールすることができ、ワークフローがキャンセルされるとそれに関連付けられた作業項目を通知する(通常、ユーザからの元の呼び出しがキャンセルされるため)。ワークフローは、再帰を検出し、防ぐためにトークンの集合を追跡することができる。プラグイン側でCDIからの呼び出しの結果としてシステムへの呼び出しを実行したい場合、元の呼び出しのと同じワークフローを使用しなければならない。特別なサーバサイド専用呼び出し(IImgCommonDataServer::RecurseDataBatch)を通じてこれを実行する。
再帰を実行する場合、同じオペレーションが同じ流れで再発し、したがって再帰から戻るか検査するために後で使用できるトークンを流れの中に挿入しなければならない。ワークフローは、さらに、元の呼び出しのトークンも追跡する。プラグインが非同期に、独立してCDIを呼び出す場合、クライアントインターフェースを通じてそうすることができるか、またはそれ自身のワークフローを作成し、RecurseDataBatchを呼び出すことができる。
呼び出し側がトランザクションを要求した場合、このオブジェクトが作成され、バッチに関連付けられる。トランザクションは、1つのトランザクションコレクションおよび従属アイテムの集合をトランザクションに関連付けるメカニズムを備える。これは、トランザクションとの同期と非同期の両方のインターフェースを備える。バッチが実行を終了すると、トランザクションはコミットされる。結果は、ストアに送られ、ストアが正しく更新すると、従属アイテムが実行される。従属アイテムとしての資格を得るためには、アイテムは、コミット要求を失敗できてはならない。これは、ストアに伝搬される状態変化に応じてオブジェクトをメモリ内で活動状態にするために使用される。プラグインが他のオブジェクトを含むようにトランザクションを拡張することを望んでいる場合(例えば、順に他のオブジェクトを削除する「Delete」コマンドを実装するために)、RecurseDataBatchを介してCDIにコールバックするときに同じトランザクションを指定することができる。毎回の再帰を介したすべての変更は、一番外側のバッチが正常に完了するまで保留状態を保つ。
変更スコープは、それぞれのチャネルを表すサーバサイド変更ハンドラに関係する。変更スコープを、トランザクション上に挿入できる。
バリアント型については、前の節で取りあげた。バリアント型は、クライアントまたはサーバサイドのいずれかにより使用することができる。
タイプマップについても、前の節で取りあげた。最適化されたマップは、サーバサイドからしか見えない。
プラグインインターフェース
例示され、説明されている実施形態では、プラグインインターフェースは、COMに似たオブジェクトインスタンス化モデルを使用してインスタンス化される。これは、プラグインがレジストリにクラスidを登録することを必要としない。プラグインをインスタンス化するプロセスは、図13に示されている。
例示され、説明されている実施形態では、プラグインはすべて、WMI.Config内に、CDI構成の一部として格納される。プラグインデータの一部は、WMI.ConfigによりプラグインDLLのXML構成ファイルから合成される(これは、XCOPYベースのソリューションに役立つ)。CDI構成は、プラグインDLLのリストからなる。それぞれのDLLについて、それぞれサポートするコレクションGUIDとともに、それぞれの論理コレクション内でサポートされるクラスの一覧を示す。それぞれ、関連付けられたいくつかの初期化データも持つ。これは、通常、DLLによりサポートされるオブジェクトが永続し、取り出される場所を表す。ルータ側でプラグインインターフェースをインスタンス化することを望んでいる場合、これはコレクションGUIDを取り出し、対応するDLLを見つけて、DllGetClassObjectを呼び出す。
Figure 2006252539
その後、CLSID_IImgBatchCollectionおよびIID_IImgBatchCollectionFactoryを要求する。その後、DLLは、プラグインによりサポートされるIImgBatchCollectionのさまざまなインスタンスを返すことができるクラスファクトリを返す。IImgBatchCollectionFactoryは、以下のインターフェースをサポートする。
Figure 2006252539
ファクトリは、CreateInstanceで以下の情報を渡される。
● IImgCommonDataServerインターフェース。このインターフェースは、IImgCommonDataから継承し、さらに、サーバサイドサービスにアクセスするいくつかのプラグイン特有のメソッドも含む。注意:プラグインは、CoCreateInstance(CLSID_IImgCommonData)を呼び出すべきではない、というのも、これはクライアントインターフェースを作成するからである。システムは、最後のクライアントインターフェースが解放されたときにシャットダウンし、サーバサイドプラグインがクライアントインターフェースを保持しているとシャットダウンしない。
● collectionGUID。これは、CDI構成内に存在するのと同じGUIDである。ファクトリは、このGUIDに応じて、異なるIImgBatchCollectionインターフェースをインスタンス化することを選択することが可能である。
● 初期化データ−このデータは、WMI.Configから取り出される。現在のところ、これは、文字列により表されている。プラグインは、この初期化データを使用して、オブジェクトの取得元を選択する。
● Riid−これは、CDIにより要求されるインターフェースである。現在、IID_IImgBatchCollectionのみが要求されるが、将来のインターフェースは、ここで要求されることが可能である。
プラグインにより返されるインターフェースは以下のとおりである。
Figure 2006252539
AsyncProcessRequestインターフェースは、データの宛先がバッチからプラグインになっている場合に呼ばれる。コレクションは以下に渡される。
● IImgServerItemCompletionインターフェース。このインターフェースは、要求が完全に処理されたときに呼び出される単一メソッド−「Done」をサポートする。呼び出し側は、AsyncProcessRequestから即座に戻ることができる。呼び出し側は、AsyncProcessRequest呼び出しを失敗しない限り、「Done」を呼び出さなければならない。「Done」の呼び出しに失敗すると、クライアントのExecute呼び出しは完了しない。
● BatchArray。このインターフェースは、クライアントにより要求されるアクションにアクセスできるようにする。
● バッチ配列の開始および終了インデックス。これを使用すると、ルータは、その後さまざまなプラグインにより共有される1つのバッチを作成することができる。これらのプラグインは、クライアントが並列実行の意味動作を要求した場合に、並列実行している可能性がある。
バッチ配列は、以下のインターフェースを持つ。
Figure 2006252539
バッチの意味動作、関連するトランザクション、およびワークフローは、バッチ配列から取り出すことができる。これらのインターフェースは、バッチアレイにエイリアスされているため、増えた参照カウントとともに返されない。ItemAtメソッドは、与えられたインデックスでバッチアクションを返す。これは、アイテムの型を示す列挙を含む。また、アイテムが完了したかどうか、およびエラー情報を示すようにプラグイン側で設定できるフィールドも含む。これは、対応するアクションについて呼び出し側により渡されるパラメータを含む共用体を含む。
インターセプション
プラグインインターフェースおよびルータが定義されているため、インターセプションの説明は以下のとおりである。インターセプションは、バッチ処理ルータがデータを送信できる他のプラグインインターフェースとして、例示され、説明されている実施形態において実装される。しかし、ルーティングに対するコレクションid(またはクエリのクラス)しか必要としない、通常のプラグインについて格納される構成情報と異なり、インターセプトするプラグインは、以下の情報断片を指定する。
● インターセプトアクション。インターセプタは、取得、設定、クエリ、コマンド、または通知をトラップしたいかどうかを指定することができる。
● インターセプトクラス。インターセプタは、どのようなクラスのオブジェクトについて呼び出されたいかを指定する。このクラスは、「*」として指定できるが、この場合、すべてのクラスについて登録される。
● インターセプトコレクション。インターセプタは、オブジェクトをインターセプトすることが望まれているコレクションの一意的GUIDを指定する。このコレクションは、「*」として指定できるが、この場合、すべてのコレクションについて登録される。
● インターセプトオブジェクト。インターセプタは、監視したいオブジェクトの一意的なオブジェクトidを指定できる(これを行う場合、オブジェクトのDeleteコマンドをインターセプトしてインターセプションを削除しなければならない)。「*」が指定された場合、すべてのクラスに対し、インターセプタが呼び出される。
インターセプションテーブル内のそれぞれの登録は、GUIDを割り当てられる。インターセプションメカニズムは、「Chain of command」パターンを利用する。バッチ処理ルータにより実行されるアクションは以下のとおりである。
1.バッチ内の与えられたアイテムをコレクションにルーティングする前に、ルータはまず、上述のフィールドを使用して呼び出しについて登録されているインターセプタがあるかどうかを確認する。
2.もしあれば、同じルールに基づいて同じインターセプタを宛先とするアクションの連続する集合が見つかる。
3.インターセプション登録に関連付けられているGUIDがワークフロー上に挿入され、インターセプタが呼び出される。
インターセプタはこの時点で、他のプラグインの場合のように、バッチアクションを渡される。これは、以下の2つの方法のうちの1つでアクションの実行を変更する。
1.ルータに対してRecurseBatchActions()を呼び出し、再びワークフロー、それに加えて元のバッチアクションを渡す。これにより、アクションが修正されることはないが、インターセプタはそれらを読み込んで、追加アクション自体を実行することができる(例えば、シンクロナイザの場合、キャッシュされているデータが古ければ、これを使用して同期処理アクションを起動する)。
2.これはそれぞれのバッチアクションを解釈し、その後、RecurseDataBatchを呼び出してワークフローを再び渡すことによりそれらを修正する。このオプションを使用することにより、インターセプタは、アクションの結果を変更できるが、実装することは(意図的に)かなり困難である。例えば、「Get」の結果を変更するには、一時プロキシオブジェクトをインスタンス化し、実際のオブジェクト取得の結果を保持しなければならず、新しいタイプマップを登録して、この一時オブジェクトに書き込む必要がある。
これらの呼び出しのいずれでも、バッチ処理ルータへのコールバックが生じる。バッチ処理ルータは、ワークフロー内にリストされているGUIDトークンを持つインターセプタを呼び出さないことを除き、前と全く同じ検索を実行する。したがって、アクションがデスティネーションオブジェクトにルーティングされるまで、それぞれのインターセプションが順に使い尽くされる。ルータは、呼び出しが再帰的になっている場合にすでに呼び出されているインターセプタを自動的に無視するため、この同じメカニズムにより、適切な動作をするインターセプタおよびオブジェクトの集合が再帰を示さないように防止する。
インターセプタは、呼び出しの連鎖を形成する役割を持つため、連鎖形成の前または後にアクションを実行することを選択することができる。これは、バッチの意味動作を変更できる。通常、バッチがトランザクションでない場合、インターセプションはトランザクションであることを確実にしたいことがある。これは、非同期に呼び出されるため、インターセプトされたアクションと並行してインターセプションを実行することすら可能である。
インターセプションの使用
インターセプションは、2つの目的−システム拡張または態様拡張−に使用することができる。インターセプションを、バッチアクションの動作を拡張するためIHVにより使用することができる。例えば、キューが解析されるときに、ドライバによって他のアクションが実行される必要がある場合がある。これらの拡張は、元のアクションの結果を変更しようとするのでない限り、十分に安全である。このような理由から、RecurseBatchActionsメソッドは、実装をかなり単純にされる。バッチアクションの結果を変更することはかなり難しいが、それは、タイプマップ、クライアントオブジェクト、およびクライアントオブジェクトコレクションなどの何らかの厄介なものを含む、インターセプション、およびすべてのパラメータを修正することを必要とするからである。インターセプションは、互換性を維持し、システムにパッチをあてるメカニズムとして使用されると考えることもできる。例えば、システムの改訂により、プラグインの誤動作が生じた場合、それが認識するものへの呼び出しを変更するインターセプタを作成することが可能である。その後、例えば、目標オブジェクトに到達する前に大きすぎる文字列とともに呼び出しをインターセプトすることによりセキュリティホールにパッチをあてるインターセプタを供給することによりシステムにサービスの提供することが可能である。これは、極めて汎用的に行うことさえ可能であり、例えば、MAX_PATHよりも大きいすべての文字列を拒絶するインターセプタを作成することが可能であり、または、1フィールド毎に適切な文字列長さを持つテーブルを用意することが可能である。
インターセプションが最も有用である場合、多数のオブジェクトをクロス/カットするシステムの態様を実装する例えば、特定のパターンに従うシステム内のすべてのアクションのログを取るインターセプタを作成することが可能である(例えば、「Access Denied」で失敗する)。
オブジェクトコマンド
オブジェクトコマンドは、サーバサイドでしか呼び出されないという点でオブジェクトプロパティと異なる。これは、コマンド呼び出しがバリアント型の配列をクライアントからサーバに渡し、また戻すことにより実行されるためである。クライアントサイドプロキシオブジェクトが呼び出されるという概念はない。データ表現を以下に示した。
Figure 2006252539
Figure 2006252539
上からわかるように、サーバクラス記述は、クライアントクラス記述と同じであるが、一連のコマンドの記述も含む。コマンドは、型、コマンド、および記述を持つ。これは、コマンドインターフェースへのポインタを含む。コマンドインターフェースは、プロパティにアクセスする際に使用されるアクセッサインターフェースに類似した動作をする。コマンドインターフェースは、コマンドおよびコマンドの入力パラメータを含むlmgVariantの配列が適用されなければならないオブジェクトに渡される。すべてのコマンドは、非同期に実行することができるが、これは、インターフェースがBeginCommandおよびEndCommandの両方のメソッドを持つからである。
それぞれのコマンドは、さらに、そのパラメータのすべての型も定義し、さらに、それぞれのコマンドに対するすべての記述のリストも持つ。
プロパティアクセッサのように、コマンドは、動的な型の一番上に構築することができる。しかし、基本レベルでは、アクションを実行することに対応しており(データを取り出すこととは反対に)、また動的プロキシオブジェクトは、コマンドを呼び出すときにワイヤマーシャリングを行うように構築される必要はないため、これは、プロパティの場合ほど有用である可能性はない。インターセプションを介してコマンドが拡張された場合には、有用である可能性もある。
IATLコマンド
IATLは、CDIタイプマッププロパティをC++フィールドおよびメソッドに直接マッピングするメカニズムを備えるのと同様に、CDIコマンドをC++クラスメソッド呼び出しに直接マッピングするメカニズムを備える。
IATLを使用することにより、呼び出し側はコマンドを、非同期BeginCommand、EndCommandペアがインプリメンタ向けに自動的に構築される単一メソッドとして実装することができる。これは、インプリメンタが、IOを実行しないコマンドを実装したい場合に有用である。それとは別に、IATLにより、クラスは2つのメソッドを備え、コマンドを非同期に実装することができる。IATLコマンドを構築するために使用されるメカニズムは、以下の抜粋コードとしてまとめられている。
Figure 2006252539
Figure 2006252539
Figure 2006252539
この抜粋コードは、あるクラスからのメソッドはCDIコマンドとして公開できるさまざまな方法を示している。
Printコマンドは、ServerPrinterCommandBase内に実装され、単一同期メソッドとして実装される。すべての非同期メソッドは、第1引数としてImg::iatl::CommandParamsパラメータを受け取る。この構造体は、コマンドに関連付けられているワークフローおよび共通データインターフェースを保持する。第2のパラメータは、第1のコマンド引数にマッピングされ、というように続く。どのパラメータが入力であり、どれが出力パラメータであるかについて曖昧さをなくすために、呼び出し側は、メソッドが多数の入力および出力機能をどのように持つかを示すためCommand関数にパラメータを供給しなければならない。例えば、入力コマンドが参照される場合:
Figure 2006252539
g1Inパラメータは、これが1つの入力パラメータを持つコマンドであることを示す。コマンドとして呼び出せるメソッドでは、入力パラメータは出力パラメータの前になければならない。
プロパティタイプマップと同様に、コマンドタイプマップは、基本型から派生型に継承することができる。これは、Inherits関数で実行される。
Figure 2006252539
コマンドパラメータの型は、メソッド引数から自動的に推論される。しかし、オプションの記述フィールドは、テーブル内で与えられなければならない。これは、InDescripおよびOutDescrip関数を介して実行される。例えば、次のようである。
Figure 2006252539
ここで、Command Functionは、コマンドの基本定義を与え、InDescripおよびOutDescrip関数は、それぞれ、第1の入力およびパラメータを記述する。複数のパラメータが記述されている場合、InDescripおよびOutDescripの複数の呼び出しを行うことが生きる。
IATLコマンドマップにより示されている他の注目すべき特徴は、非同期コマンドを実装できることである。これは、ServerPrinterクラス上のBeginNothingおよびEndNothingメソッドにより例示される。
Figure 2006252539
これは、コマンドを記述で次のように参照される。
Figure 2006252539
この場合のCommand関数では、入力パラメータは定義によりBeginメソッドが受け取り、出力パラメータは定義によりEndメソッドが返すので、どれが入力および出力パラメータであるかを指示する必要はない。この場合、BeginメソッドおよびEndメソッドは、さらに、同期(単一メソッド)コマンドへの異なる構造体、つまり、Img::iatl::InCommandParamsおよびImg::iatl::OutCommandParamsを取る。InCommandParamsは、保存され、オペレーションが完了したことを示すコールバックインターフェースおよびオペレーションに関連付けられるコンテキスト情報を含む。Endメソッドは、コンテキスト情報を戻され、コマンドの結果をエラーコードまたは戻りパラメータの集合として返すことができる。
クエリコンパイラ
クエリコンパイラは、CDIクエリをクラス記述または解析木を持つオブジェクトに対して適用可能なフィルタにコンパイルするメカニズムを備える。クエリコンパイラにより公開されるインターフェースは、以下の抜粋コードに示されている。
Figure 2006252539
Figure 2006252539
Figure 2006252539
サーバサイドCDIインスタンスは、クエリをコンパイルするメカニズムを備える。クエリフィルタが望ましい場合、IImgCommonDataサーバインターフェースのCompileQueryメソッドが使用される。解析木が必要な場合、CompileQueryTreeメソッドが呼び出される。
クエリフィルタは、ファクトリとして返される。特定のクラス記述がクエリフィルタファクトリに渡されると、クエリフィルタが返される。カバーの下のクエリフィルタは、クエリにより動的に生成されるクラスに対してタイプマップを構築する。サーバオブジェクトにバインドされる場合、サーバオブジェクトに対して最適化されたマップを構築する。この最適化されたマップは、その後クエリが適用されるクエリオブジェクトに値を設定するために使用される。
クエリフィルタファクトリから返されるクエリフィルタは、定義により、特定のサーバクラスにバインドされる。これは、複数のサーバクラスオブジェクトインスタンスに対し適用することができる。これはスレッドセーフではない。呼び出し側が異なるスレッドから同じクエリを使用したい場合、同じクエリフィルタファクトリから異なるクエリフィルタインスタンスを取得し、異なるスレッド中でそれを使用することができる。
クエリフィルタは、クラス記述をサポートするクラスに対して適用可能であるという利点を有する。しかし、クラスに対して適用すべきフィルタについては、クラスをインスタンス化し、そのフィルタと潜在的に一致する可能性のあるすべてのインスタンスを評価しなければならない。これは、十分に小さなオブジェクトの集合については適切であるが(場合によっては、現在のコンピュータでは10,000のオーダー)、オブジェクトの集合が大きくなるとパフォーマンスが非常に低下する。オブジェクトの大きな集合の場合、SQLによって使用されるようなクエリメカニズムを使用しなければならない。しかし、CDIクエリ構文は、SQL構文と同一ではない。この問題を解決するために、代わりにクエリ木をコンパイルし、その後、SQLクエリに翻訳することができる。CDIクエリコンパイラを実行できることにより、クエリフィルタに対し同じクエリを処理する方法と矛盾がないように演算子優先順位およびかっこなどの問題をCDIコンパイラにより評価することができる。
CompileQueryTreeメソッドから返されるインターフェースは、Rootメソッドを通じてコンパイル済みクエリ木へのエイリアスを返す。返される解析木により占有されるメモリは、IImgQueryTreeインターフェースが解放されるとシステムに戻される。
一実施形態では、解析木は、クエリノードから始まり、クエリノードは比較とすることができるか、またはブールノードとすることが可能である。ブールノードの場合、ノードは演算子を持ち、次に、2つのクエリノードからなる。これは、解析木を構築するための構文である。比較ノードの場合、比較は、解析識別子と定数とからなる。クエリ「Printer.cJobs > 10 AND Printer.cJobs < 100」のように、識別子が同じ式の中に2回出現した場合、同じImgParseldentifierインスタンスが解析木内に2回出現する。pCookieフィールドは、呼び出し側がクッキー内の識別子の概念を格納するための木内のプレースホルダである。例えば、Printer.cJobs がデータベース内のNumberOfJobs列に翻訳された場合、これを、クッキー内に格納することが可能である。拡張ポイントを用意することのほかは、クッキーは無視される。
トランザクション
トランザクションは、オペレーションが完全に成功すること、および失敗した場合は、マシンに中間状態が格納されないことを保証するためにCDIが使用するメカニズムである。トランザクションを処理する実際のメカニズムは、CDIとCASとに分散される。CDIは、トランザクションおよびワークフローを処理するためのインターフェースを備える。CASは、トランザクションの正しさを保証し、デッドロックのないロック戦略を規定するために必要なメカニズムを用意する。
それぞれのトランザクションは、正確に1つのトランザクションオブジェクトにより制御される。それぞれのトランザクションオブジェクトは1つの論理ストアオブジェクトを有する。システム内のそれぞれの論理ストアは、GUIDにより参照される。ストアオブジェクトは、トランザクションが調整を必要とする永続的状態の処理を調整する。ストアはただ1つという制限は、ストアが分散リソースマネージャ(DRM)でない場合に2つのトランザクションストアに対する2回のコミットが成功することを保証できるということをシステム側で保証できないと考えられる場合に妥当なものである。それらがDRMである場合、トランザクションは、調整される形で1つの論理ストア全域にある、つまり、COM+の場合のように、分散トランザクションコーディネータ(DTC)により提供されるものである。
それぞれのトランザクションは、さらに、多数の従属がアクションを保持する。従属アクションは、そのオペレーションのCommitまたはRevertに失敗できないというのがルールである。従属アクションは、一般に、キャッシュされた状態(またはロック)を永続的ストアの状態に結合するために使用される。例えば、CASは、トランザクションをストアに適用する前にそれぞれのオブジェクトのクローニングを行い、ストアが変更を正常にコミットした場合に、クローニングされたオブジェクトはキャッシュ内にスワップされる。トランザクションインターフェースは以下に示されている。
Figure 2006252539
呼び出し側またはインプリメンタが非同期呼び出しメカニズムを使用することを望んでいる場合には、インターフェースのすべてがCOM非同期呼び出しパターンを使用することに注意されたい。そうでない場合、そのまま、インターフェースへの同期呼び出しを実行するか、または同期トランザクション従属アクションを実装することができる。
ストアまたはトランザクション従属アイテムを実装することを望んでいる場合には、IImgTransactionDependentItemインターフェースを実装しなければならない。このインターフェースは、CommitまたはRevertの2つのメソッドを持つ。ストアがコミット(復帰ではなく)に失敗する場合があり、他の従属アイテムは常にそのCommitおよびRevertメソッドを成功させなければならない。
それぞれのトランザクションは、ちょうど1つのストアを持つことができる。現在のストアおよびそのストアGUIDを、GetTransactionalCollectionメソッドにより取り出すことができる。
呼び出し側がトランザクションストアを設定することを望んでいる場合、SetTransactionaICollection呼び出しが使用される。トランザクションはマルチスレッドインターフェースであるため、SetTransactionalCollectionはGUID、設定すべきコレクションの両方を取り、もしそこにあれば既存のコレクションを返す。以下の3つの場合がある(ETransactionSetResult戻りパラメータにより示される)。
● トランザクションは、現在、関連付けられたストアオブジェクトを持たない。この場合、戻りは、TransactionCollectionSetであり、コレクションで渡されるものが、トランザクションに関連付けられたストアになる。
● トランザクションは現在、ストアオブジェクトを持つが、指定されているものと同じGUIDを持つ。この場合、トランザクションオブジェクトは、既存のコレクションを呼び出し側に返す。呼び出し側は、前のコレクションを解放し、現在トランザクションにある永続的ストアで呼び出しを継続しなければならない。
● トランザクションは現在、ストアオブジェクトを持ち、それは異なるストアである(異なるストアGUIDを持つ)。この場合、トランザクションオブジェクトは、TransactionCollectionIncompatibleを返す。呼び出し側は、通常、この時点でオペレーションを失敗する。(これにより、トランザクションが復帰する)。
トランザクションコーディネータはストアオブジェクトへのインターフェースを知ることができないため(それはトランザクションファイルシステムからSQLデータベースへの何かでありうる)、これが、lUnknownとして呼び出し側に返され、そこから、Querylnterfaceを介して実際のストアインターフェースを取り出すことができる。ストアは、トランザクションオブジェクトが正しくストアへの変更のCommitまたはRevertを実行できるようにIImgTransactionDependentItemを実装しなければならない。
トランザクション従属アイテムは、2つのフェーズでコミットまたは復帰される。これは、InsertDependentActionへのTransactionOrderFirstおよびTransactionOrderLastパラメータを介して指定される。ロックのためCASに依存するトランザクションは、TransactionOrderFirstのみを使用すべきであるが、それは、CASがTransactionOrderLastの従属アイテムを使用して、必ず調整トランザクションがコミットまたは復帰された後にオブジェクトロックが解除されるようにするからである。
ワークフロー
CDIインターフェースは、たいてい非同期である。そのため、単一オペレーションは、1つのスレッド上で完了することができるか、または複数のスレッド上で完了する可能性がある。非同期性の小さいプログラミングを使用するシステムでは、状態をスレッドに関連付けることができる場合が多く、例えば、スレッドは、トランザクションが起動した後に、スレッドからのメソッド発行で常に暗示される関連付けられたトランザクションを持つ可能性がある。ワークフローの概念は、CDIのスレッドの一般概念を置き換える。ワークフローは、常に、ユーザによってサブミットされるバッチに正確に対応する。ユーザは、ワークフローを作成しない。これは、新しいバッチが発行されるときにCDIにより自動的に作成される。サーバプラグインは、それ自身の目的のために望んでいる場合に最初からワークフローを作成できる。
ワークフローは、さらに、新しい非同期ワークアイテムを作成し、それをワークフローに、したがって開始バッチに関連付けることもサポートする。バッチがキャンセルされた場合、ワークフローもキャンセルされ、したがって、ワークフロー上のすべてのアイテムがキャンセルを要求される。このメカニズムを使用すると、CDIはすべてのインターフェース上で明示的なキャンセレーションメソッドをサポートする必要はなく、メソッドは代わりにワークフローを受け取るだけである。
ワークフローインターフェースは以下に示されている。
Figure 2006252539
Figure 2006252539
Figure 2006252539
次に、ワークフローによって与えられるサービスである、ワークアイテム、トークン、スコープ、およびトランザクションを取りあげる。トランザクションは、上では独立して取りあげられているが、ワークフローは、それらに対する何らかの特別な処理を有する。
ワークアイテム
ワークアイテムを実装するために、呼び出し側は、IImgWorkItemインターフェースを実装しなければならない。ワークアイテムが実行され、ワークフローがキャンセルされた場合にCancelメソッドが呼び出されると、Runメソッドがそのインターフェース上で呼び出される。
ワークアイテムは以下の3つの基本型がある。
● 「AddWorkItem」で作成される、通常のワークアイテム。この種のワークアイテムは、十分なリソースが利用可能であれば直ちに実行される。すべてのワークアイテム同様、呼び出し側は、どのような種類のワークアイテムがワークアイテムフラグを通じて実行されるかを指定できる。
● 「AddWaitableItem」で作成される、待機可能なワークアイテム。待機可能なワークアイテムは、関連付けられたイベントの発生が知らされたときに実行される。
● 「AddDependentItem」で作成される、従属ワークアイテム。従属ワークアイテムは実行されないが、ワークフローがキャンセルされる場合は「Cancel」メソッドが呼び出される。これにより、呼び出し側は、異なる非同期メソッドを使用できるが(例えば、オーバーラップする構造体を使用してReadFileを呼び出すことが可能である)、そのまま、元のワークフローからキャンセレーション通知を受け取る。
IImgWorkItemControlインターフェースは2つの目的を成就する−これにより、待機可能なワークアイテムは、そのワークアイテムをトリガするように設定できるイベントハンドラを返すことができる。また、これにより、呼び出し側は、インターフェースを解放することにより特定のワークアイテムをキャンセルすることができる。この場合のキャンセル呼び出しは、常に、非同期である、つまり、ワークアイテムはキャンセレーションを通知されるが、このインターフェース上のRelease呼び出しは、キャンセレーションが完了するのを待たないということである。
これは、ワークフローに対するShutdownメソッドの動作とは異なる。シャットダウンメソッドは、ワークフロー内のワークアイテムすべてがキャンセルされるのを同期して待つ。
トークン
トークンは、ワークフロー上の特定の状態をマークするために使用される。これらは、インターセプションを実装するときに再帰が無限に実行されるのを防ぐために使用されることを意図されている。つまり、特定の種類のインターセプションが、トークンをワークフローに追加して、その後、その種類のインターセプションが再び発生することを防ぐことができる。
トークンはGUIDである−トークンを、ワークフローに追加すること、ワークフロー内で見つけること、およびワークフローから削除することができる。
トランザクション
ワークフローは、正確に1つのトランザクションを持ちうる。ワークフローは、トランザクションを作成できる唯一のインターフェースである。ワークフローは、現在のトランザクションを処理するためのヘルパメソッドを多数備える。
● CreateTransactionは、トランザクションを作成し、それを現在のワークフローに関連付ける。トランザクションがすでに存在している場合、これは、良いものであると考えられ、現在のトランザクションが返される。(呼び出し側は、これは、EImgBatchTransactionCreation戻りを通じて発生したと推論できる)。
● GetBatchTransactionは、もし存在すればワークフローに現在関連付けられているバッチトランザクションを返す。存在しなければNULLを返す。
● InsertTransactionalCollectionは、コレクションをワークフローに関連付けられたトランザクションに挿入する。挿入されたコレクションまたは既存のコレクションは、返されるppISetTransCollectionを介して返される。コレクションが非互換である(異なるGUIDを使用する)場合、呼び出しは失敗する。
● GetTransactionalCollectionは、ワークフローに関連付けられたトランザクションに関連付けられているトランザクションコレクションを取り出す。
スコープ設定ワークフロー
ワークフローは、他のワークフローを含むことができる。ワークフローのスコープが他のワークフロー内に設定された場合、すべてのワークアイテムおよびトークンをその親から自動的に継承する。また、その親ワークフローから進行中のトランザクションも継承する。ワークフローのスコープを設定することにより、2つの主要な種類の機能を使用できる。
● 親ワークフロー内のトークンを、削除できない。このため、ワークフロー内のトークンの集合は、ワークフロー呼び出しが呼び出し側に再帰的に戻るまで「ロック」状態にできる。これは、インターセプタがうっかり、削除すべきでないトークンを削除してしまうことを防止できるという点で有用である。
● ユーザからの非トランザクション要求は、実装の詳細として実行するために、トランザクションも必要とする可能性がある。例えば、削除要求で、多数の下位オブジェクトも削除する必要が生じる可能性がある。元のバッチは、トランザクションにすべきでないか、またはトランザクションにできない他のアイテムを含むことがあるため、呼び出し側によって作成されたワークフローにトランザクションを追加することはしたくないであろう。解決策として、第1のワークフローの内側のスコープに入るワークフローを生成し、その後、トランザクションを内側のワークフローに関連付ける。これにより、ワークアイテム上のキャンセレーション要求を維持することができ、さらに、元のワークフローをトランザクションにすることなく、元のワークフロー上のトークンを保存することもできる。
サーバサイド通知
CDIは、通知をサポートすることを望んでいるプラグインコレクションをサポートする。これにより、通知チャネルで、リモートコレクションおよびローカル(プロセス内またはサンドボックス)コレクションから同時にデータを取り出し、クライアントに代わって通知チャネルを矛盾なく処理することができる。CASは、特定のオブジェクトに関する通知をさらにサポートする(ロック機能インフラストラクチャを通じて通知が正しくシリアライズされることを保証するなど)。
それぞれのバッチコレクションは、それぞれの通知チャネルについてデータをクライアントコレクションにプッシュするために使用されるIImgNotificationDataServerインターフェースを与えられる。CDI自体は、クライアントコレクションおよび他のインフラストラクチャを通知のため保持する。
Figure 2006252539
Figure 2006252539
通知データサーバインターフェースは、以下の3つのメソッドを公開する。
● RegisterShutdown−これにより、呼び出し側は、シャットダウンされるチャネルに関心のあることを示すことができる。例えば、リモートアクセスアダプタは、クライアント通知チャネルがプルダウンされたときにそれ自身の通知チャネルをプルダウンすることを知っている必要があると考えられる。
● CreateNotificationObject−これは、通知チャネルを通じてデータをブッシュするために使用されなければならない新しい通知インターフェースを作成する。それぞれのIImgPushNotifyDataThroughChannelインスタンスは、スレッドセーフでない。このシステムは、IImgPushNotifyDataThroughChannelインスタンスを通じて送信される変更が一グループとして送信されるか、全く送信されないかの保証を与える。
● SendFailure−通知がそのチャネルを通じて送信されるのを妨げる致命的エラーが発生する可能性がある。この場合、SendFailureメソッドを呼び出すことができる。これは、チャネルを破壊することが保証される。さらに、エラー情報を最善努力方式で呼び出し側に送信する。
チャネルインターフェースを介したプッシュ通知データは、以下のメソッドを持つ。
● SendAddObjectNotify−新しい通知オブジェクトが追加されたことをチャネルに知らせる。オブジェクトは、実際に作成されたため追加された可能性があるか、または代わりにクエリフィルタに一致する状態に変化した可能性がある。
● SendRemoveObjectNotify−オブジェクトが実際に削除されたか、またはクエリフィルタに一致しなくなり、したがってクライアントコレクションから論理的に削除されてしまっていることをチャネルに知らせる。
● SendChangeDataNotify−これは、個別のフィールド情報をチャネルからクライアントに送信する。マップインデックスは、クライアントの登録されているクラス記述内のフィールドのインデックスである。送られるそれぞれの変更は、2つの動作のうちの1つをとることができる。変更がシステム内のどこかにバッファリングされ、同じフィールドへの他の変更が発生した場合、新しいフィールド値に置き換わる。これは、バッファリングされている通知データに必要な記憶域を最小にする利点を有する。それとは別に、すべての変更が有意である可能性もあり、その場合、呼び出し側は、すべての変更の履歴を保持するように要求することができる。
● SendDone−これは、IImgPushNotifyDataインターフェースに送信された変更を終了する。通知の初期データが送信され、その場合、NotifyUpdatePopulate変更形態を使用できるか、またはこれが、オブジェクト状態の後続の変化に関する通知であり、その場合、NotifyUpdateを指定できる。
フレンドリ名解決プラグイン
プラグインバッチコレクションが正規名空間に差し込むために使用するメカニズムについては、上の「プラグインインターフェース」という表題の節で説明されている。基本的に、それぞれのコレクションはGUIDにより識別される。バッチコレクションがさらにフレンドリ名もサポートしたい場合、フレンドリ名解決ハンドラを登録しなければならない。これは、要求されたクラスのフレンドリ名を可能ならば正規名に翻訳する。フレンドリネームリゾルバは、通常のプラグインが登録されるのと同じ方法でCDIに登録されるが、ただし、フレンドリ名クラスは、コレクションGUIDの代わりに使用され、異なるクラスファクトリおよびインターフェースが代わりに使用される点が異なる。クラスファクトリおよびプラグインインターフェースが以下に示されている。
Figure 2006252539
クライアントが名前解決を要求した場合、フレンドリネームリゾルバがキャッシュ内にその名前を見つけられなければ、そのクラスについてそれぞれ登録されているプラグインに対する名前解決ハンドラが呼び出される(並列呼び出しで)。それぞれのネームリゾルバは、名前を解決しようとし、名前解決が終了すると、リゾルバは、IImgServerItemCompletionインターフェース上でDoneを呼び出す。ネームリゾルバは、その後、BeginResolveNameにより返される同じコンテキストとともにEndResolveNameを呼び出す。次に、ネームリゾルバは、ネームリゾルバがフレンドリ名に対応していると判定した正規名を含むIImgCanonicalNameイテレータを返す。
ネームリゾルバプラグインは、通常、CDIインターフェースに対して、取得、クエリ、またはコマンドを使用することにより名前解決を実行することに注意されたい。したがって、非同期インターフェースを実装しても、次に、他の非同期インターフェースを呼び出すので、通常、あまり問題にならない。
呼び出し側がすべてのクエリコレクションについてIImgCanonicalNameイテレータを実装しなくても済むように、正規名を蓄積し、そこからイテレータインスタンスを返すことができるコレクションインターフェースが用意される。このインターフェースは以下に示されている。
Figure 2006252539
コレクションアダプタサービス
例示され、説明されている実施形態では、IImgBatchCollectionインターフェースは、実装が一見複雑そうである。呼び出し側は、それぞれのバッチアイテムを一通り実行し、デコードし、それへの応答方法を決定しなければならない。一般に、コレクションがバッチにアクセスしたい理由は、マシンまたはプロセス境界を越えて伝送するためバッチを保存するということだけである。バッチが実際に永続的ストアにロードされ、永続的ストアからロードされるオブジェクトのグループと相互作用する場合、これは、処理するプラグインにとって非常に複雑なことになる。このような理由から、コレクションアダプタサービスが用意されている。コレクションアダプタサービスは、以下の機能を備えている。
● プラグインコレクションの集合からオブジェクトを取り出す。
● インスタンス化されたオブジェクトをキャッシュし、使用されない場合にはフラッシュする。
● タイプマップを通じてクライアントオブジェクトをサーバオブジェクトにバインディングする作業を管理する。
● 互換性のあるコレクション間のトランザクションを調整する。
● トランザクションに関連してオブジェクトロックを管理する。
● 同期および非同期の両方のオブジェクトを管理する。
● オブジェクトフィルタを実装するためクエリコンパイラと相互作用する。
● 呼び出しを逐次実行するか、または並列実行するかを動的に選択することによりリソースを最適利用する。
● 楽観的ロックスキームを通じてオブジェクト同時実行性を維持する。
● オブジェクト変更通知を処理する。
基本CDIがさまざまなプラグインを1つにまとめる接着剤の働きをする場合、コレクションアダプタサービスは、高機能、非同期の高性能プラグインの実装ができる限り簡単になるようにする役割を持つ。コレクションアダプタサービスモデルは、一実施形態により図14に示されている。
与えられたCASインスタンスは、中に複数のオブジェクトコレクションを差し込むことができる。それぞれのオブジェクトコレクションは、単一のクラス名、例えば「Printers」をサポートし、与えられたオブジェクトコレクション内のすべてのオブジェクトは、同質である。したがって、与えられたサーバオブジェクトが実装するすべてのプロパティおよびコマンドを表す単一クラス記述により記述することができる。コレクションアダプタサービスは、サーバクラス記述を使用して、クライアントオブジェクトとサーバオブジェクトとの間でデータを転送し、オブジェクトコマンドを実行する。サーバ内のそれぞれのオブジェクトは、IImgObjectインターフェースを介して何らかの基本機能を実装する。IImgCollectionAdapterは、以下のインターフェースを持つ。
Figure 2006252539
クライアントは、IImgBatchCollectionFactory::CreateInstanceメソッドの「CoCreateinstance」を呼び出すことによりコレクションアダプタをインスタンス化する。これは、IImgCollectionAdapter::Initializeを呼び出して、それを、渡されたIImgCommonDataServerインターフェースに渡す。その後、RegisterObjectCollection呼び出しを通じて、オブジェクトコレクションのそれぞれをインスタンス化し、登録する。
IImgObjectCollectionは、以下のメソッドを持つ。
Figure 2006252539
GetTransactionCollectionData呼び出しは、コレクションがトランザクションをサポートする方法、コレクションがトランザクションをサポートできないこと、従属アイテムとしてのトランザクション(これは、一時的コレクションによりサポートできる)、または基幹ストレージシステムに依存するカスタムトランザクションインターフェースおよびトランザクションが成功できるスコープを一意に識別するIDを返すことによりトランザクションをサポートできることの情報を返す。
GetCollectionData呼び出しは、オブジェクトクラス名、最適化されたタイプマップバインディングで使用されるObjectId、およびそれぞれのオブジェクト記述するサーバクラス記述を返す。残りの呼び出しBeginGetおよびEndGetおよびBeginEnum/EndEnumでは、コレクションからオブジェクトを取り出すことができる。シャットダウンメソッドは、IImgBatchCollection::Shutdownメソッドが呼び出された場合にCASにより呼び出される。
時間がかかりそうなCASが実行する呼び出しは、Begin/Endペアの形をとる。それぞれのBegin呼び出しは、IImgServerItemCompletionインターフェースを取り、ppContextパラメータを通じてコンテキストを返せる。CASは、インターフェースのインプリメンタへの以下の保証を行う。
● Begin呼び出しが失敗した場合、End呼び出しは呼び出されない。
● Begin呼び出しが成功した場合、End呼び出しは呼び出されることが保証される。
● End呼び出しは、IImgServerItemCompletion::Doneメソッドが呼び出されるまで呼び出されない。
● End呼び出しは、Beginメソッドが戻るまで実行されない。
● End呼び出しは、Begin呼び出しで返されるコンテキストを渡される。
これらの保証により、Beginメソッドは、Beginメソッド内でDoneを呼び出すことにより同期呼び出しを実装することができる。それが実行するIOバインドオペレーションを、他のスレッドで実行するか(好ましくは他のオペレーション併せて)、または非同期呼び出しとして順に実装すべきである。非同期アイテムが完了すると、IImgServerItemCompletion::Doneメソッドが呼び出されなければならない。開始メソッドが呼び出しに特有の状態を追跡する必要がある場合、これは、ppContextパラメータで返すことができる。CASではEnd呼び出しが実行されることを保証しているので、コンテキストを、常に解放できる。CASでは、以下のメカニズムを使用して呼び出しのスケジューリングを行う。
● 呼び出しが同期であり(Beginメソッドの内側でDoneが呼び出される)、呼び出し側が並列実行を要求した場合、メソッドの実行は、CPUバインドであると仮定される。したがって、次の呼び出しは最初にシリアライズされる。呼び出しが失敗すると、結果は記録されるが、後続のすべての呼び出しはそのまま実行される。
● 呼び出しが非同期で、クライアントが並列実行を要求する場合、次の「Begin」メソッドは開始スレッドで即座に呼び出される。
● 呼び出しが非同期で、クライアントが順次またはトランザクション意味動作を要求した場合、作業の残りは、IImgServerItemCompletion::Doneメソッドが呼び出されたのと同じスレッドで実行される。
これらルールは、CASのクライアントをコレクションまたはオブジェクト側で、IOバインドオペレーションが非同期パターンで実行されることを保証しなければならないか、さもなければ他のワークアイテムの並列実行を防ぐことができることを意味する。
オブジェクトは、以下のインターフェースを持つ。
Figure 2006252539
実装すべきメソッドは以下のとおりである。
● Initialize呼び出しは、オブジェクトが最初にコレクションから返されたときにCASにより呼び出される。これは、オブジェクトにそれ自身を削除させる、ロックさせる、トランザクションと相互作用させる、システムの残り部分に変更通知を送らせるハンドラインターフェースをオブジェクトに渡す。また、呼び出しフィルタも返すことができる。呼び出しフィルタは、オブジェクトが部分的インスタンス化をサポートするかどうかを示す(その場合、BeginGet/EndGetメソッドは、データをそこから読み込む前に呼び出される)。また、いくつかのフィールドを書き出すことのみによりオブジェクトの永続化をサポートするかどうかも示す。この場合、BeginGet/EndGetメソッドは、呼び出し側が集合内でどのプロパティを指定したかを正確に指定することで呼び出される。
● GetRealObjectAddressは ImgServerClassDescriptionアクセサリが関係するオブジェクトアドレスを返す。これは、オブジェクトが多重継承を使用して実装されている場合に、IImgObjectインターフェースアドレスは必ずしも実際のオブジェクトアドレスと同じではないため、必要である。
● BeginGet/EndGet−これらのメソッドは、その呼び出しフィルタ内で部分的オブジェクトをサポートしていることをオブジェクトが示す場合にのみ呼び出される。オブジェクトは、最適化されたマップがどのフィールドを読み込もうとしているのかを示すタグを渡される。オブジェクトは、永続的ストアからの最初のインスタンス化の後にこれを使用して重いフィールドをフェッチすることができる。オブジェクトがこれを実行し、呼び出しがIOバインドである場合(ほとんどいつでもそうなる)、非同期呼び出しパターンを使用しなければならない。
● CloneObject−CASは、オブジェクトが不変な方法で実装されると仮定する。これにより、オブジェクトは、データがそこから読み込まれている間、ロック解除状態のままにできる。これにより、トランザクションがコミットするまでオブジェクトを重複状態に保持できるため、トランザクションが簡素化される。したがって、オブジェクトは、集合が生じる前にそれ自身をクローニングするよう求められる。オブジェクトは、CASと互換性のある不変な方法でコーディングされなければならない。
● BeginSet/EndSet−メソッドのこのペアは、オブジェクトのクローニングが実行され、そのアクセサリを使用して状態が変更された後に集合内で呼び出される。オブジェクトは、その新しい状態がこの呼び出しで有効であることを確認できる。呼び出しフィルタでそれを要求する場合、その集合が生じたときにクライアントによりどのフィールドが指定されたかが知らされる。
オブジェクトハンドラ
オブジェクトハンドラは、CASによりそれぞれのオブジェクトに渡されるインターフェースであり、これにより、オブジェクトは、さまざまな方法でCASと相互作用できる。CAS内でキャッシュ状態を保持されているオブジェクト毎にオブジェクトハンドラのちょうど1つのインスタンスがある。IImgObjectHandlerは、さらに、それぞれのオブジェクトについて非同期ロックも公開する。このロックは、CASにより、トランザクションと変更通知の両方を含む状態変更に対するオブジェクトへのアクセスを論理的にシリアライザするために使用される。オブジェクト上のいくつかのアクションでは、オブジェクトをロックする必要がある。オブジェクトハンドラインターフェースによりこの意味動作を強制する。オブジェクトハンドラインターフェースは以下に示されている。
Figure 2006252539
オブジェクト非同期ロック
重要なメソッドは、GetObjectLockであり、これにより、呼び出し側は、オブジェクトに関連付けられたロックを取り出すことができる。返されるロックは、トランザクションロックをサポートする非同期ロックである。ロックおよび関連付けられた意味動作は、CASにより使用され、その同じ意味動作は、他の呼び出し側により使用されなければならない。インターフェースは以下に示されている。
Figure 2006252539
ロックは、非同期である、つまり、ロックを取得できるときにコールバックする。これは、以下の機能を実現する意図的な設計上の選択である。
● ロックを取得しようとするワークフローをキャンセルできる。ロックインターフェースは非同期なので、呼び出し側に対し、ロック取得の試みがキャンセルされたことを通知できる。
● ロックはトランザクションをまたがってオブジェクトアクセスをシリアライズするために使用されるので、またトランザクションは、多くのオブジェクトを取得しなければならない場合があり、状態をストアに書き込む必要が通常はあるので、オブジェクトロックは、長期間にわたって潜在的に保持される可能性がある。したがって、ロックアクセスは、IOバインドであるオペレーションについて潜在的に待機している可能性がある。非同期ロックを使用すると、スレッドを他のCPUバインドオペレーションに再利用できるため、IOが完了するのを待たなくて済む。
CASは、取得/クエリおよびコマンドに対しオブジェクトロックを使用しないことに注意されたい。つまり、トランザクションがオペレーションを論理的に保持している可能性はあるけれども、設定および通知をシリアライザするだけである。呼び出し側でコマンドをトランザクションにしたい場合、トランザクションを自分で作成し、オブジェクトロックを取得しなければならない。
ロックを取得することを望んでいる呼び出し側は、IImgLockEntryインターフェースを実装しなければならない。このインターフェースは、EnterLockとNotify Cancelの2つのメソッドを持つ。
EnterLockは、呼び出し側がロックを取得した場合に呼び出される。ImgLockContextは、EnterLock関数に渡される。このロックコンテキストは、ロックのその特定の取得に正確に関連付けられており、ロックが解除されたときにロックインターフェースに受け渡さなければならない。これは次の2つの目的を遂行する。
● 他の呼び出し側が誤って、ロックを取得していないのにロックを解除しようとした場合、解除は無効である。
● ロックが保持されなければならないという事実は、ロックコンテキストを提示することが必要だとすることで他のインターフェースにより意味論的に表現することができる。これは、さらに、関連付けられたアクションを実行する前にロックが実際に保持されていることもチェックすることができる。
さらに、呼び出し側がロックを取得したワークフローがキャンセルされる場合、そのインターフェース上のNotifyCancelメソッドが呼び出される。その後、それでもまだロックを取得しなければならないかどうか、またはロックへのアクセスをアボートすべきかどうかを決定することができる。AcquireLockが呼び出された必要なロックシーケンスインターフェースを解放することによりロックの取得をキャンセルすることができる。
呼び出し側が、ロックを取得することが可能であると保証できない場合には望ましくない。例えば、ロックを取得し、参照カウントをインクリメントし、その後ロックを解除したい場合がある。その後、オブジェクトに対しいくつかのアクションを実行し、再びロックを取得し、参照カウントをデクリメントすることが可能である。第2のオペレーションに対してロックを取得することができなかった場合、参照カウントは正しくデクリメントされることは決してない。
呼び出し側がロックへのアクセスを保証できるようにするには、IImgLockSequenceインターフェースを使用する。ロックシーケンスがロックから戻ると、ロックの順次取得および解除は成功することが保証される。これは、実装の詳細として、IImgLockSequenceインターフェースは、十分な記憶域を確保し常にロックを取得できるオブジェクトにより実装される。
ロックとトランザクション
トランザクションは、多数のオブジェクトを順次ロックすることを必要とする場合がある。これは、複数のトランザクション間にロックの循環取得がある場合にシステムがデッドロックに陥る機会となる。2つのトランザクションが同じロックを保持していることは意味論的には非論理的であり、したがって、ロックはトランザクションに対する特別なサポートを行う。これは、プロパティを設定する前にオブジェクトをロックするときにCASにより自動的に使用され、トランザクションの意味動作を実装したいオブジェクトにより使用されなければならない。
ロックは、一度にちょうど1つのトランザクションにより保持することができる。ロックを取得することを望んでいるトランザクションは、AddTransactionToLock呼び出しを使用する。ロックを保持しているトランザクションがすでにある場合には、この呼び出しは、pbTransactionAddedパラメータでFALSEを返す。その後、トランザクションは復帰され(トランザクションにより現在保持されているロックまたはリソースを解放する)、呼び出し側に失敗を返す前に既存のトランザクションが完了するのを待たなければならない。呼び出し側は、WaitForTransactionToFinishを呼び出して、ロックを保持しているトランザクションが完了するのを待つ(これらは非同期的に通知される)。ロックを保持しているトランザクションがない場合、即座にコールバックされる。ロックは、トランザクションがコミットされるかまたは復帰されると、トランザクションから自動的に切り離される。
呼び出し側が既存のトランザクションの終了を待たなければならない理由は、呼び出し側がオペレーションを再試行した場合に、簡単に再び古い(変更されていない)オブジェクト状態を取り出し、ロックを保持しているトランザクションに対し「スピン」する、ということがないことを保証することである。
CDI/CAS楽観的ロックモデル
CDIは、クライアントに対し、ロック構文を意図的に公開していない。この理由は多数ある。
● それぞれのロックは、さらにコンテキストオーバーヘッドをクライアントにより維持される可能性のあるサーバに加えなければならない。
● クライアントがエラー状態に入り、ロックを続けた場合、サーバのオペレーションを無効にする可能性がある。
● ロックを解除していないクライアントを取り扱うために、手動ロック破壊メカニズムをサーバに追加しなければならない。これは、他の方法では単に回避される追加UIおよびメンテナンスである。
しかし、サーバ状態を正しく保持し、「戦う管理者」問題を回避することは望ましい。2人の管理者が同時にプリンタの名前を変更しようとした場合のために、一方の名前変更は成功するが、他方は失敗するようにしたい。
システムは、オブジェクトロックを取得するためにトランザクションが使用するメカニズムにより部分的にそれらの意味動作を保持する。また、すべてのオブジェクトに「Object:LockId」プロパティを与えることにより保持される。簡単に言うと、オブジェクト状態を変更するには、さらに、現在のオブジェクトロックidと一致するロックidを用意しなければならないということである。これは、オブジェクトを変更しようとする前にユーザが最後のオブジェクト状態に気づいていたことを示す。一致しないオブジェクトidを与えた場合、状態を変更しようとする試みは失敗する。それに対する応答として、呼び出し側は、変更したいプロパティを再度取得しなければならず、したがってロックidを再度取得しなければならない。その後、適切に書かれているクライアントであれば、プロパティをチェックして、有効にしたい変更がまだ意味を持つことを確認してから、再びオペレーションを試みる。
オブジェクト変更ハンドラ
オブジェクトに対する変更ハンドラを取り出すために、オブジェクトロックを取得し、その後、オブジェクトハンドラでGetChangeHandlerメソッドを呼び出さなければならない。GetChangeHandlerメソッドは、ロックコンテキストを必要とする。変更ハンドラを取得するためにオブジェクトが使用できる他のメカニズムは、設定時にパラメータとしてプロパティアクセッサに渡すというものである。(この場合のCASは、オブジェクトプロパティを設定してくれる前にオブジェクトロックを取得する)。オブジェクト変更ハンドラインターフェースは以下に示されている。
Figure 2006252539
CDI変更ハンドラインターフェースについては上の節で説明されている。そのインターフェースは、特定のチャネル通して変更を送る機能を備える。CASは、クエリのスコープを正しく設定し、特定のオブジェクトに注目している可能性のあるチャネルすべてを処理する機能を追加する。オブジェクトが実行しなければならないのは、どのプロパティが変更したかを示すことだけである。最も単純なメカニズムは、NotifyChangeを呼び出して、変更されたフィールドのタグを渡すことである。CASは、その後、プロパティアクセッサを介してそのフィールドに対するデータを取り出し、プロパティ変更通知を、その変更に注目するすべてのチャネルに送信する。
CASがプロパティを取り出す手間を省くために、呼び出し側は、さらに、NotifyChangeData呼び出しを介してデータを直接指定することもできる。
最後に、すべての変更が変更ハンドラに蓄積されると、SendChangesメソッドを介して送ることができる。変更をどれも送れない場合、CASは、そのオブジェクトをターゲットとする可能性のあるすべての通知チャネルを破棄する。
変更通知のIATLサポート
変更通知は、オブジェクト側で実装するのは困難でない。さらに簡単に行えるようにするため、オブジェクトのプロパティがCDIプロパティの取得または設定を通じてしか修正されず、そのプロパティがデータメンバとして実装される場合に、IATLは、変更通知コードを自動的に生成する。フィールドを指定するときに、gNotify修飾子をタイプマップ内のField関数に渡すだけでよい。これは以下に示されている。
Figure 2006252539
これは、そのプロパティの取得および設定アクセッサを自動的に構築する。プロパティが変化すると、変更は、CASによりプロパティアクセッサに供給される変更ハンドラに送られる。
残りのオブジェクトハンドラ関数
DeleteObject
この関数は、CASのキャッシュからオブジェクトを削除する。これは、さらに、変更通知をクライアントにも送る。オブジェクトを削除するには、オブジェクトがロックされ、ロックコンテキストが提示されていなければならない。
CurrentObject
CASは不変なオブジェクトモデルを使用する。オブジェクトが修正されると、クローンが作成され、その後、状態が変更された場合にキャッシュ内に挿入される。エラーが発生した場合、新しいオブジェクトは破棄される。この設計の意味するものとして興味深いのは、オブジェクトが非同期イベントの結果として変更通知を送りたい場合、または他の何らかの形でプロパティ取得時またはコマンド実行時にオブジェクトの最新バージョンを必要とする場合に、現在保持しているオブジェクトのインスタンスが正しいインスタンスであるかどうかを知ることができないという点である。この場合に対処するために、オブジェクトハンドラは、現在のオブジェクトインスタンスを取り出すことができる。オブジェクト状態変更はオブジェクトロックにより保護されているため、ロックは、現在のオブジェクトが意味のある形で取り出される前に取得されなければならない。
HoldObjectInCacheとReleaseObjectFromCache
CASは、通常、オブジェクトを約10秒間メモリ内にキャッシュしてから破棄する。オブジェクトは、代わりに、キャッシュ内に永久的に残るか、または他のオブジェクトがキャッシュされている間にキャッシュされたままとすることを決定することができる。この要求条件に対応するため、HoldObjectInCacheメソッドをオブジェクトハンドラ上で呼び出すことができる。呼び出されると、オブジェクトは、対応するReleaseObjectFromCache呼び出しが実行されるまでキャッシュ内に保持される。HoldObjectInCacheは、何回も呼び出すことができ、オブジェクトは、ReleaseObjectFromCacheへの同じ回数の呼び出しが実行されたときのみ解放される。
他のいくつかのオペレーションのためオブジェクトがすでにキャッシュ内にアクティブ状態で保持されている場合にHoldObjectInCacheを安全に呼び出すことができる。そうでない場合、HoldObjectInCacheへの呼び出しが実行されている間に、キャッシュからオブジェクトが解放される潜在的競合状態がある。これで、クラッシュは生じないが、明らかに、HoldObjectInCache呼び出しはこの場合には受け付けられない。HoldObjectInCacheが変更することを保証される時点は以下のとおりである。
● オブジェクトによりサポートされているIImgObjectインターフェースへのInitialize呼び出しのとき。
● プロパティの取得または設定またはコマンド呼び出しのとき。
● 呼び出し側が、他の何らかの方法で、以前にHoldObjectInCache呼び出しを発行したことを知っているとき。
フレームワーク提供コレクション
IImgObjectCollectionおよびIImgObjectインターフェースは、実装することについては特に困難ではなく、CASを使用するプラグインが両方とも実装したいか、または実装する必要がある場合がある。例えば、新しいデータモデルを介してダウンレベルサーバ上のオブジェクトを表すアダプタを書く場合、自分用のIImgObjectCollectionを用意したい。しかし、標準フレームワーク提供のオブジェクトコレクションを使用できる場合が多数ある。これらは図15に示されている。
フレームワーク提供コレクションおよびその関数は以下のとおりである。
メモリ内コレクションは、永続しないオブジェクトの動的コレクションを提供する。このコレクションは、公開すべき少数の実際の不変なオブジェクトとともにプラグインにより与えられたときに有用な場合がある(フィルタファクトリなど)。また、これは、TS印刷などのシナリオで軽量の永続不可能なオブジェクト用のストアを用意する際にも有用な場合がありうる。
永続的オブジェクトコレクションサービスは、永続的ストア内にオブジェクトを持続させることができる機能を備えるコレクションである。レジストリ、SQLデータベース、またはWinFSを含む、オブジェクトを持続させることができるストアが多数ありうる。それぞれのストアは、それ専用の永続的オブジェクトコレクションサービスのインスタンスを持つ。永続的オブジェクトコレクションサービスは、適切なストアにオブジェクト状態を入れて持続させる機能をサポートする。これは、サーバタイプマップ(ImgServerClassDescription)を使用して、格納に必要なオブジェクト状態を取り出す。さらに、可能な場合には基幹ストアにより実現されるクエリサポートにクエリを直接マッピングする。
通知シムコレクションは以下のように機能する。多くの場合において、システムは、通知に対する限られたサポートを行う、または全くサポートしないダウンレベルシステムにブリッジする。この場合、呼び出し側は、すべてのオブジェクトを列挙し、新しいオブジェクトが到着するか、または出て行くかを確認し、フィールドに変化があった場合に適切な通知を発生させる必要がある。IImgObjectCollectionインターフェースはパブリックであり、ImgServerClassDescriptionにより、呼び出し側は、オブジェクト上のフィールドすべてにアクセスすることができるため、この動作を自動化する汎用シムオブジェクトコレクションが用意される。これは、さらに、通知をサポートするだけのために余分な数行のコードを追加したくない呼び出し側に対し使用することも可能である。しかし、変更があった場合に自動的に通知を生成するデフォルトの実装をフィールドに対し用意することができる。
要するに、フレームワークは、ほとんどのユーザが自分専用のコレクションインターフェースを実装しなくて済む缶詰オブジェクトコレクションを多数用意するということである。アダプタコレクションインターフェースは、可能な例外である。シムコレクションは、ダウンレベルアダプタからのイベントの生成を自動化するために用意される。
IImgObjectのIATL実装
IImgObjectも、特に実装が困難なインターフェースではない。標準オブジェクトをできるだけ簡単に書けるようにするために、IATLは、非部分的オブジェクト実装をサポートするIImgObjectの標準実装を備える。実装されるクラスは以下のとおりである。
● TServerObjectBase−IUnknown、Initialize、BeginGet/EndGet、およびBeginSet/EndSetのデフォルト実装を提供する。取得および設定関数は何もしない。
● TServerObject−このテンプレートは、基本クラステンプレート作成機能を通じてGetRealObjectAddress実装を追加する。
● TServerDefaultCloneableObject−このテンプレートは、CloneObjectメソッドを追加する。呼び出し側は、派生クラスにコピーコンストラクタを用意しなければならず、またオブジェクトがコピーされた後、例外をスローしないか、エラーがあった場合には例外をスローするか、またはIsValid()メソッドからエラーを返すようにしなければならない。
● TIMCServerObject−このオブジェクトは、メモリ内コレクション用にBeginSet/EndSetメソッドペアを実装する。
マネージドオブジェクト
IATLは、メソッドおよびフィールドをプロパティとして表すことができ、メソッドをCDIを通じてコマンドとして表すことができるテンプレートライブラリを用意することにより、アンマネージドC++クラスを自動的にサポートするように設計されている。アンマネージド空間内に残すことには多くの利点があるが、システムでは、特にパフォーマンス、ロバスト性、および設計安定性の面でマネージドコードが改善されるので、マネージドオブジェクトのデータ駆動型のサポートを行うようにもしたい。
CASは多くの重要な機能をカプセル化するので、同じことを行う並列のマネージド実装を用意することは賢明でない。解決策として、マネージドメタデータを使用して、アンマネージド空間内にImgServerClassDescriptionを作成し、それを使用して、シャドウアンマネージドオブジェクトに値を設定し、シャドウアンマネージドオブジェクトを保持する。
一実施形態による解決策が図16に示されている。ここで、マネージドオブジェクトからのクラスメタデータは、アンマネージド空間内のImgServerClassDescriptionにマッピングされる。このクラス記述では、シャドウアンマネージドオブジェクトを操作できるアクセッサを使用する。アンマネージドオブジェクト内のそれぞれのプロパティにインデックスを設定することができ、それぞれのプロパティは、マネージドオブジェクト内のプロパティに対応する。マネージドオブジェクトは、変更通知メカニズムを使用して、非同期変更をシャドウアンマネージドオブジェクトに伝搬する。アンマネージドオブジェクト上で設定が行われると必ず、最初にそれらのプロパティがマネージドオブジェクトに適用され、次に、マネージドオブジェクトの状態が複製されてアンマネージドオブジェクトに戻される。コマンドは、マネージドオブジェクト上のメソッド呼び出しに直接マッピングされる。
このメカニズムの利点は、オブジェクト上の最も一般的なオペレーションである取得およびクエリが、アンマネージドシャドウオブジェクト上で完全に実行されるという点である。さらに、アンマネージドシャドウオブジェクトは、アンマネージド永続的オブジェクトコレクションサービスにより格納することができ、またメモリ内コレクションの中に配置することができる。これは、さらに、他の方法ではプロパティ取得を実行するために必要になるであろう遅いリフレクションメカニズムをバイパスする。マネージドオブジェクトに対する変更は、1バッチアクション当たり1つの相互運用サンクに制約することができる。CASの後にこれが発生するため、解釈の前にバッチ全体をマーシャリングすることはできない。この制限は、クエリおよび取得の場合にマネージドパスを全く回避することにより弱めなければならない。
例示的なクライアントデバイス/プリントサーバコンポーネント
図17は、上述の実施形態を実装するためにクライアントデバイスと印刷システムの両方において使用できるコンポーネントを備える例示的なコンピューティングデバイスを示している。
コンピューティングデバイス1742は、1つまたは複数のプロセッサまたは処理ユニット1744、システムメモリ1746、およびシステムメモリ1746を含むさまざまなシステムコンポーネントをプロセッサ1744に結合するバス1748を備える。バス1748は、メモリバスまたはメモリコントローラ、周辺機器バス、アクセラレイティッドグラフィックスポート、およびさまざまなバスアーキテクチャのどれかを使用するプロセッサまたはローカルバスを含む数種類のバス構造のうちの1つまたは複数を表している。システムメモリ1746は、読み取り専用メモリ(ROM)1750およびランダムアクセスメモリ(RAM)1752を含む。起動時などにコンピューティングデバイス1742内の要素間の情報伝送を助ける基本ルーチンを含む基本入出力システム(BIOS)1754は、ROM 1750に格納される。
コンピューティングデバイス1742は、さらに、図に示されていないハードディスクへの読み書きを行うためのハードディスクドライブ1756、取り外し可能磁気ディスク1760への読み書きを行うための磁気ディスクドライブ1758、およびCD−ROMまたはその他の光媒体などの取り外し可能光ディスク1764への読み書きを行うための光ディスクドライブ1762を備える。ハードディスクドライブ1756、磁気ディスクドライブ1758、および光ディスクドライブ1762は、SCSIインターフェース1766または他の何らかの適切なインターフェースによりバス1748に接続される。ドライブおよび関連コンピュータ可読媒体は、コンピュータ1742用のコンピュータ可読命令、データ構造体、プログラムモジュール、およびその他のデータを格納する不揮発性記憶装置を実現する。本発明で説明されている例示的な環境ではハードディスク、取り外し可能磁気ディスク1760、および取り外し可能光ディスク1764を採用しているが、当業者であれば、磁気カセット、フラッシュメモリカード、デジタルビデオディスク、複数のランダムアクセスメモリ(RAM)、複数の読み取り専用メモリ(ROM)などのコンピュータからアクセス可能なデータを格納できる他のタイプのコンピュータ可読媒体もこの例示的な動作環境で使用できることを理解するであろう。
オペレーティングシステム1770、1つまたは複数のアプリケーションプログラム1772(ユーザエージェントまたはブラウザなど)、その他のプログラムモジュール1774、およびプログラムデータ1776を含む、多くのプログラムモジュールは、ハードディスク1756、磁気ディスク1760、光ディスク1764、ROM 1750、またはRAM 1752に格納されることができる。ユーザはキーボード1778およびポインティングデバイス1780などの入力デバイスを通じてコンピュータ1742にコマンドおよび情報を入力することができる。他の入力装置(図に示されていない)としては、マイク、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、スキャナなどがある。これらの入力デバイスおよびその他の入力デバイスは、バス1748に結合されたインターフェース1782を通じて処理ユニット1744に接続される。モニタ1784またはその他の種類の表示デバイスも、ビデオアダプタ1786などのインターフェースを介してバス1748に接続される。パーソナルコンピュータは、通常、モニタのほかに、スピーカおよびプリンタなど、他の周辺出力デバイス(図に示されていない)を備える。
コンピュータ1742は、通常、さらに1つまたは複数のプリンタに接続されるプリントサーバ1788などの1つまたは複数のリモートコンピュータへの論理接続を使用してネットワーク接続環境で動作する。プリントサーバ1788は、パーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ピアデバイス、またはその他の共通ネットワークノードとすることができ、通常は、コンピュータ1742に関して上で説明されている要素の多くまたはすべてを含む。図17で説明されている論理接続は、ローカルエリアネットワーク(LAN)1790とワイドエリアネットワーク(WAN)1792を含む。このようなネットワーキング環境は、オフィス、企業全体にわたるコンピュータネットワーク、イントラネット、およびインターネットでは一般的である。
LANネットワーキング環境で使用する場合、コンピュータ1742はネットワークインターフェースまたはアダプタ1794を介してローカルネットワークに接続される。WANネットワーキング環境で使用される場合、コンピュータ1742は、通常、モデム1796またはインターネットなどのワイドエリアネットワーク1792上で通信を確立するためのその他の手段を備える。モデム1796は、内蔵でも外付けでもよいが、シリアルポートインターフェース1768を介してバス1748に接続される。ネットワーク接続環境では、パーソナルコンピュータ1742またはその一部に関して示されているプログラムモジュールは、リモートメモリ記憶デバイスに格納されうる。図に示されているネットワーク接続は例示的であり、コンピュータ間の通信リンクを確立するのに他の手段が使用可能であることは理解されるであろう。
一般に、コンピュータ1742のデータプロセッサは、コンピュータのさまざまなコンピュータ可読記憶媒体にさまざまな時点において格納された命令を使ってプログラムされる。プログラムおよびオペレーティングシステムは、通常、例えば、フロッピー(登録商標)ディスクまたはCD−ROMで配布される。そこから、コンピュータの補助記憶装置にインストールまたはロードされる。実行時に、それらは少なくとも一部はコンピュータの主記憶装置にロードされる。本明細書で説明されているシステムは、これらおよび他のさまざまな種類のコンピュータ可読記憶媒体を含むが、ただしそのような媒体にマイクロプロセッサまたはその他のデータプロセッサに関して説明されるブロックを実装する命令またはプログラムが格納されている場合である。説明されているシステムは、さらに、本明細書で説明されている方法および手法に従ってプログラムされた場合にコンピュータ自体も含む。
説明のため、プログラムおよびオペレーティングシステムなどの他の実行可能なプログラムコンポーネントは、本明細書では、離散ブロックとして例示されているが、そのようなプログラムおよびコンポーネントは、さまざまな時点において、コンピュータの異なる記憶コンポーネント内にあり、コンピュータの(複数の)データプロセッサにより実行されることは理解される。
結論
上述のさまざまな実施形態は、サードパーティのコンポーネント作成者が新しいクラスをシステム内に容易に挿入することを可能にできるプラガブルアーキテクチャを備える。複数のデータプロバイダからデータを取り出せるルーティングシステムが実現される。さらに、名前解決パイプラインが、人間によって指定された名前を内部の正規名に解決する。さらに、さまざまな実施形態では、オブジェクトから取り出したいデータをクライアントが正確に指定することができる機能を備える。オブジェクトからデータを取り出すための極めて効率的なメカニズムは、最適化されたタイプマップを使用する。タイプマップが構築されると、それ以上、文字列比較または検索を実行する必要はない。任意のデータをサポートできる単一のプラガブルインターフェースも備える。これは、セットアップに関する限り、インストール可能オブジェクトは1種類のみ必要であるということを意味する。他のオブジェクト型は、コレクションを通じてファクトリオブジェクトから取得できる。これは、例えば、パイプライン要素を構築するために使用できる。
さらに、システム内の任意のオブジェクトでクエリをサポートし、フィルタ処理された通知を含む通知をサポートし、キャッシングおよび作業スケジューリングをサポートすることを簡単に行えるようにする一群のサービスが提供される。
説明されている実施形態は、さらに、アクセスアダプタを通じて一連の基本型を処理できるプロトコルまたはトランスポート上でのトンネリングを可能にする機能も備えることができる。さまざまな実施形態ではさらに、ダウンレベルプロトコルでトランスポートされるオブジェクトのコレクションを提供し、ダウンレベル(およびアップレベル)プロトコルをシステムに動的に追加できる機能もサポートする。
さらに、非同期データインターフェースが備えられる。これは、多数の最終的にはIOバインドデータ書き込みが発生する場合に同期インターフェースだとサーバの機能が絞られるため重要である。また、単一UIスレッドが実行され、実行中のオペレーションに対してストールしないため、UIプログラミングが簡素化される。
さらに、バッチ処理インターフェースを使用することにより、オブジェクトコマンド、取得、設定、クエリ、および通知要求の任意のグループ化が可能である。これは、クライアントがプリンタのコレクションを削除するなどのオペレーションをサポートすることが可能になるため重要である。また、ネットワーク待ち時間の影響を低減できるという点でも有利である。例えば、UIで、特定のキューに関する多数のプロパティを取り出したい場合、その要求すべてを1つのメッセージでバッチ化することにより、ネットワーク上で1回のやり取りで済ませることができるが、もしデータが順次的に取り出されるとすれば、ネットワーク上で何回もやり取りする必要がある。
さらに、さまざまな実施形態では、通知を除いて、ほとんど完全にステートレスなインターフェースを実現することができる。
さらに、プログラミングモデルは、クライアントオブジェクトのコレクションを使用することにより簡素化される。バッチ実行が成功してオブジェクトに値が設定された後、取り出されたデータに対する後続のすべてのオペレーションは、そのオブジェクト状態で格納されているため成功することが保証される。このプログラミングモデルは、さらに、通知およびクエリクライアントの意味動作をきちんと、ほとんど同じにする。
さらに、CDIでは、後続の反復で、またはいくつかのコレクションにおいて、以下を可能にできる。まず、CDIでは、標準型メタデータシステムを通じて新しいデータ型を動的に発見する機能を利用できる。汎用デバッグインターフェースおよびデータクエリインターフェースなどのいくつかの機能が使用可能になる。第2に、すべてのコレクションは同じインターフェースを持つため、他のプロセスまたはアプリケーションドメインにおいて容易にサンドボックス化できる。第3に、すべてのコレクションは同じインターフェースを持つため、呼び出しカウントシム(call counting shim)を実装することにより、システムは任意のコレクションをメンテナンスモードにし、それをアンロードすることができる。これは、既存のコンポーネントをアップグレードするときに、セットアップ作業におおいに役立つ。第4に、バッチもトランザクションにすることにより、トランザクションサポートを極めて容易に追加できる。最後に、すべてのオブジェクトは同じインターフェースを使用するため、デコレータなどのパターンをシステムに容易に追加できる。これにより、サードパーティが自由自在にシステムを拡張できる可能性が広がる。
本発明は構造的機能および/または方法論的ステップに固有の言語で説明されているが、付属の請求項で定められている発明は、説明した特定の機能またはステップに必ずしも限られないことは理解されるであろう。むしろ、特定の機能およびステップは請求されている発明を実施する好ましい形態として開示されている。
一実施形態によるデータインターフェースのさまざまなコンポーネントを例示する高水準ブロック図である。 一実施形態による印刷データアクセスインターフェースの高水準ブロック図である。 一実施形態によるプロセス外通信のいくつかの態様を例示するブロック図である。 一実施形態によるセキュリティモデルの概要を例示する高水準ブロック図である。 一実施形態によるタイプマッピングメカニズムを例示するブロック図である。 一実施形態による共通データインターフェースオブジェクトアクセスインターフェースのブロック図である。 一実施形態による動的タイプマップのブロック図である。 一実施形態によるオブジェクト作成およびクローニングを例示するブロック図である。 一実施形態による抽象階層を例示するブロック図である。 一実施形態によるクラス階層およびセキュリティを例示するブロック図である。 一実施形態によりオブジェクトから取り出されるメタデータを例示するブロック図である。 一実施形態による共通データインターフェースの例示的なコンポーネントのブロック図である。 一実施形態によるプラグインモデルのブロック図である。 一実施形態によるコレクションアダプタサービスにより使用されるオブジェクトモデルのブロック図である。 一実施形態によるフレームワーク提供コレクションを例示するブロック図である。 一実施形態によるマネージドオブジェクトおよびアンマネージドオブジェクトの相互運用性を例示するブロック図である。 1つまたは複数の実施形態を実装するために使用することができるコンピューティングデバイスの例示的なコンポーネントを示すブロック図である。
符号の説明
100 システム
102 共通データインターフェース(CDI)
104 バッチ処理ルータ
106 プラグインテーブル
108 インターセプションテーブル
110 メッセージプラグイン
112 メッセージサービス
114 コレクション
116 オブジェクト
118 システム拡張
120 他のコラボレーション
1742 コンピュータ
1744 処理ユニット
1746 システムメモリ
1748 バス
1750 ROM
1756 ハードディスクドライブ
1758 磁気ディスクドライブ
1760 磁気ディスク
1762 光ディスクドライブ
1764 光ディスク
1766 SCSIインターフェース
1768 シリアルポート
1770 オペレーティングシステム
1772 アプリケーションプログラム
1774 他のモジュール
1776 プログラムデータ
1778 キーボード
1780 ポインティングデバイス
1782 キーボード/マウスインターフェース
1784 モニタ
1786 ビデオアダプタ
1788 プリントサーバ
1790 ローカルエリアネットワーク
1792 ワイドエリアネットワーク
1794 ネットワークインターフェース
1796 モデム

Claims (20)

  1. コンピュータ可読命令を含む1つまたは複数のコンピュータ可読媒体であって、前記命令は、実行されると、
    汎用データモデルを実現するように構成されたインターフェースを備え、
    クライアントまたはクライアントアプリケーションが、クライアントスレッドに制御を即座に返すデータ要求を開始できるようにする非同期クライアントディスパッチを実現し、
    サーバが前記クライアントから非同期に要求を処理することができる非同期サーバディスパッチを実現するように構成されたソフトウェアアーキテクチャを実現することを特徴とする1つまたは複数のコンピュータ可読媒体。
  2. 前記ソフトウェアアーキテクチャは、前記サーバ上で進行中の呼び出しをいつでも前記クライアントによりキャンセルできるキャンセレーションを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  3. 前記ソフトウェアアーキテクチャは、クライアントがアクションの任意のシーケンスを構築し、前記アクションを前記サーバに1つの単位として送信できるバッチ処理を実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  4. 前記ソフトウェアアーキテクチャは、アクションのバッチに、全体として実行しなければならない、または前記サーバの状態を変更してはならないという意味動作を割り当てることができるトランザクション呼び出しを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  5. 前記ソフトウェアアーキテクチャは、アクションのバッチに、すべてのアイテムは並列実行できるという意味動作を割り当てることができるトランザクション呼び出しを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  6. 前記ソフトウェアアーキテクチャは、関連付けられたシステムを監視すること、前記システムに同期して応答すること、または前記システムの動作を修正することのうちの1つまたは複数を実行できるコンポーネントを前記アーキテクチャ内に挿入できるインターセプションを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  7. 前記ソフトウェアアーキテクチャは、オブジェクトの与えられたクラスによりサポートされるプロパティを取り出すために使用できるリフレクションを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  8. 前記ソフトウェアアーキテクチャは、
    クライアントがアクションの任意のシーケンスを構築し、前記アクションを前記サーバに1つの単位として送信できるバッチ処理と、
    アクションのバッチに、全体として実行しなければならない、または前記サーバの状態を変更してはならないという意味動作を割り当てることができるトランザクション呼び出しとを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  9. 前記ソフトウェアアーキテクチャは、
    クライアントがアクションの任意のシーケンスを構築し、前記アクションを前記サーバに1つの単位として送信できるバッチ処理と、
    アクションのバッチに、すべてのアイテムは並列実行しなければならないという意味動作を割り当てることができる並列呼び出しとを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  10. 前記ソフトウェアアーキテクチャは、
    クライアントがアクションの任意のシーケンスを構築し、前記アクションを前記サーバに1つの単位として送信できるバッチ処理と、
    アクションのバッチに、全体として実行しなければならない、または前記サーバの状態を変更してはならないという意味動作を割り当てることができるトランザクション呼び出しと、
    アクションのバッチに、すべてのアイテムは並列実行しなければならないという意味動作を割り当てることができる並列呼び出しとを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  11. 前記ソフトウェアアーキテクチャは、
    クライアントがアクションの任意のシーケンスを構築し、前記アクションを前記サーバに1つの単位として送信できるバッチ処理と、
    関連付けられたシステムを監視すること、前記システムに同期して応答すること、または前記システムの動作を修正することのうちの1つまたは複数を実行できるコンポーネントを前記アーキテクチャ内に挿入できるインターセプションとを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  12. 前記ソフトウェアアーキテクチャは、
    クライアントがアクションの任意のシーケンスを構築し、前記アクションを前記サーバに1つの単位として送信できるバッチ処理と、
    オブジェクトの与えられたクラスによりサポートされるプロパティを取り出すために使用できるリフレクションとを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  13. 前記ソフトウェアアーキテクチャは、
    クライアントがアクションの任意のシーケンスを構築し、前記アクションを前記サーバに1つの単位として送信できるバッチ処理と、
    オブジェクトの与えられたクラスによりサポートされるプロパティを取り出すために使用できるリフレクションと、
    関連付けられたシステムを監視すること、前記システムに同期して応答すること、または前記システムの動作を修正することのうちの1つまたは複数を実行できるコンポーネントを前記アーキテクチャ内に挿入できるインターセプションとを実現するように構成されることを特徴とする請求項1に記載の1つまたは複数のコンピュータ可読媒体。
  14. コンピュータ可読命令を含む1つまたは複数のコンピュータ可読媒体であって、前記命令は、
    印刷システムであって、
    バッチ処理ルータへのインターフェースとして使用さる、クライアントからのメッセージを構築して前記バッチ処理ルータにディスパッチし、応答を前記クライアントに送信できるように構成されている、共通データインターフェースと、
    前記共通データインターフェースと通信できるようにリンクされ、前記共通データインターフェースにより渡されるメッセージを受信し、1つまたは複数のコレクションに前記メッセージを非同期にディスパッチするように構成された、バッチ処理ルータと、
    1つまたは複数のコレクションを対象とするメッセージを受信して、処理するように構成されたメッセージ処理プラグインを追跡するように構成されているプラグインテーブルと、
    1つまたは複数のオブジェクトをターゲットとするメッセージをインターセプトして修正する場合に使用するように構成されたインターセプションテーブルとを含む印刷システムを備えるソフトウェアアーキテクチャを実現することを特徴とする1つまたは複数のコンピュータ可読媒体。
  15. 前記メッセージは、1つまたは複数のプラグインを宛先とする1つまたは複数のオペレーションを含むことができることを特徴とする請求項14に記載の1つまたは複数のコンピュータ可読媒体。
  16. さらに、前記バッチ処理ルータに通信できるように関連付けられ、前記バッチ処理ルータからメッセージの集合を受信し、適切な場合に、前記メッセージを他のデバイスに送信するように構成されたメッセージプラグインを備えることを特徴とする請求項14に記載の1つまたは複数のコンピュータ可読媒体。
  17. さらに、前記バッチ処理ルータに通信できるように関連付けられ、コレクションインターフェース上でメッセージを受信し、前記メッセージを呼び出しのシーケンスに分割するように構成されたメッセージサービスを含むことを特徴とする請求項14に記載の1つまたは複数のコンピュータ可読媒体。
  18. さらに、前記バッチ処理ルータに通信できるように関連付けられ、コレクションインターフェース上でメッセージを受信し、前記メッセージを呼び出しのシーケンスに分割するように構成されたメッセージサービスを含み、前記メッセージサービスは、
    メッセージをスレッドに割り当てるタスク、または
    メッセージが複数の遅延呼び出しに応答できるようにするタスク、または
    コレクション内のオブジェクトから適切なデータを取り出して、メッセージに設定するタスク、または
    キャンセレーションオペレーションを処理するタスク、または
    オブジェクトインスタンスをキャッシングするタスク、または
    オブジェクトを透過的にロックするタスク、または
    コレクション内に保持されているオブジェクトのリフレクションサービスを実行するタスクのうちの1つまたは複数を実行するように構成されていることを特徴とする請求項14に記載の1つまたは複数のコンピュータ可読媒体。
  19. さらに、オブジェクトの1つまたは複数のコレクションを含み、個々のコレクションはオブジェクトの同質な集合を保持することを特徴とする請求項14に記載の1つまたは複数のコンピュータ可読媒体。
  20. さらに、オブジェクトの1つまたは複数のコレクションを含み、個々のコレクションはオブジェクトの同質な集合を保持し、個々のコレクションは、DLLから取り出されたCOMインターフェースとして実装されることを特徴とする請求項14に記載の1つまたは複数のコンピュータ可読媒体。
JP2006032952A 2005-03-10 2006-02-09 システムデータインターフェース、関連アーキテクチャ、印刷システムデータインターフェース、および関連印刷システムアーキテクチャ Withdrawn JP2006252539A (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US11/077,514 US7962917B2 (en) 2005-03-10 2005-03-10 System data interfaces, related architectures, print system data interfaces and related print system architectures

Publications (2)

Publication Number Publication Date
JP2006252539A true JP2006252539A (ja) 2006-09-21
JP2006252539A5 JP2006252539A5 (ja) 2009-04-23

Family

ID=36808660

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006032952A Withdrawn JP2006252539A (ja) 2005-03-10 2006-02-09 システムデータインターフェース、関連アーキテクチャ、印刷システムデータインターフェース、および関連印刷システムアーキテクチャ

Country Status (5)

Country Link
US (1) US7962917B2 (ja)
EP (1) EP1701245A3 (ja)
JP (1) JP2006252539A (ja)
KR (1) KR20060097577A (ja)
CN (1) CN1869923B (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015531948A (ja) * 2012-10-19 2015-11-05 マカフィー, インコーポレイテッド セキュアディスクアクセス制御

Families Citing this family (39)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7644403B2 (en) * 2005-09-12 2010-01-05 Oracle International Corporation Method and system for automated root-cause analysis for class loading failures in java
US7814472B2 (en) * 2005-09-12 2010-10-12 Oracle International Corporation System and method for shared code-sourcing in a Java Virtual Machine environment
US8020156B2 (en) * 2005-09-12 2011-09-13 Oracle International Corporation Bulk loading system and method
US7784043B2 (en) * 2005-09-12 2010-08-24 Oracle International Corporation Method and system for automated code-source indexing in Java Virtual Machine environment
US7954096B2 (en) * 2005-09-12 2011-05-31 Oracle International Corporation Shared loader system and method
JP4916729B2 (ja) * 2006-01-30 2012-04-18 ブラザー工業株式会社 仮想デバイス名変更プログラム
JP4696938B2 (ja) * 2006-01-30 2011-06-08 ブラザー工業株式会社 仮想デバイス名変更プログラム
JP4337824B2 (ja) * 2006-01-30 2009-09-30 ブラザー工業株式会社 仮想デバイス名変更プログラム
US20070250499A1 (en) * 2006-04-21 2007-10-25 Simon Widdowson Method and system for finding data objects within large data-object libraries
US8386732B1 (en) * 2006-06-28 2013-02-26 Emc Corporation Methods and apparatus for storing collected network management data
US8744891B1 (en) * 2007-07-26 2014-06-03 United Services Automobile Association (Usaa) Systems and methods for dynamic business decision making
US8112516B2 (en) * 2007-08-23 2012-02-07 Cisco Technology, Inc. Selective user notification based on IP flow information
US8620856B2 (en) * 2008-01-18 2013-12-31 International Business Machines Corporation Method and system for providing a data exchange service provider interface
US20090271765A1 (en) * 2008-04-29 2009-10-29 Microsoft Corporation Consumer and producer specific semantics of shared object protocols
US20090313628A1 (en) * 2008-06-13 2009-12-17 Microsoft Corporation Dynamically batching remote object model commands
US8549090B2 (en) * 2008-08-13 2013-10-01 Hbc Solutions, Inc. Messaging tracking system and method
US8069172B2 (en) * 2008-11-05 2011-11-29 Oracle International Corporation Re-executing query objects without affecting transaction data in an application development framework not providing for creation of multiple instances of the same query object
CN102156705A (zh) * 2011-01-26 2011-08-17 北京数码大方科技有限公司 Cad文件加载方法及装置
US9619247B2 (en) * 2011-07-15 2017-04-11 Microsoft Technology Licensing, Llc Enabling fast string acquisition in an operating system for efficient interoperations with various language projections
US8898143B2 (en) * 2012-09-28 2014-11-25 Sap Se Database comparison system and method
US9442993B2 (en) 2013-02-11 2016-09-13 Dell Products L.P. Metadata manager for analytics system
US9191432B2 (en) * 2013-02-11 2015-11-17 Dell Products L.P. SAAS network-based backup system
US8893155B2 (en) * 2013-03-14 2014-11-18 Microsoft Corporation Providing distributed array containers for programming objects
US9706007B2 (en) * 2013-10-17 2017-07-11 Blue Syntax Consulting LLC System and method for querying disparate data sources in real time
US9531839B1 (en) 2014-04-10 2016-12-27 Google Inc. Systems and methods for request isolation protection
US9678787B2 (en) 2014-05-23 2017-06-13 Microsoft Technology Licensing, Llc Framework for authoring data loaders and data savers
US10698767B1 (en) * 2014-12-22 2020-06-30 Amazon Technologies, Inc. Decentralized management of multi-service workflows
WO2016118964A1 (en) * 2015-01-25 2016-07-28 Iguazio Systems Ltd. Application-centric object storage
CN106250208A (zh) * 2016-08-02 2016-12-21 福建升腾资讯有限公司 基于Xen虚拟化平台在不同环境下池类型桌面的实现方法
CN107678867A (zh) * 2017-09-26 2018-02-09 武汉斗鱼网络科技有限公司 一种进行远程过程调用的方法及装置
CN108009026A (zh) * 2017-10-27 2018-05-08 深圳市买买提乐购金融服务有限公司 接口调用方法、第三方数据接入平台及计算机可读介质
CN110609753B (zh) * 2018-06-15 2023-07-28 伊姆西Ip控股有限责任公司 用于优化远程调用的方法、设备和计算机程序产品
CN109240977A (zh) * 2018-09-10 2019-01-18 浙江大学 一种基于四相双轨编码协议的异步路由器电路
CN111506366B (zh) * 2020-04-17 2023-09-05 咪咕文化科技有限公司 插件调用方法、装置、电子设备与存储介质
CN111752720B (zh) * 2020-06-27 2023-07-07 武汉众邦银行股份有限公司 一种异步请求伪装同步请求方法
JP7276265B2 (ja) * 2020-06-30 2023-05-18 株式会社安川電機 生産システム、上位制御装置、制御装置、通信方法、及びプログラム
CN113051088B (zh) * 2021-03-31 2022-03-08 广州锦行网络科技有限公司 程序加载方法、装置、设备及计算机可读介质
CN115269060B (zh) * 2022-06-15 2023-06-20 知学云(北京)科技股份有限公司 一种基于aPaaS平台的服务执行前后置处理方法
US20240061851A1 (en) * 2022-08-22 2024-02-22 Sap Se Explanation of Computation Result Using Challenge Function

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6253252B1 (en) 1996-07-11 2001-06-26 Andrew Schofield Method and apparatus for asynchronously calling and implementing objects
US6901596B1 (en) * 1998-05-07 2005-05-31 Hewlett-Packard Development Company, L.P. Method of communicating asynchronous events to remote procedure call clients
US7468802B1 (en) * 2000-04-17 2008-12-23 International Business Machines Corporation Method and apparatus for processing print jobs via parallel spooling and despooling operations
US7206843B1 (en) * 2000-04-21 2007-04-17 Sun Microsystems, Inc. Thread-safe portable management interface
US7324220B1 (en) * 2001-07-09 2008-01-29 Lexmark International, Inc. Print performance under the windows® operating system
JP3634783B2 (ja) * 2001-09-14 2005-03-30 キヤノン株式会社 印刷システム及び印刷データ処理方法
US20040194087A1 (en) * 2002-04-11 2004-09-30 International Business Machines Corporation Batch processing of requests in a data processing network
US7327482B2 (en) * 2002-10-15 2008-02-05 Sharp Laboratories Of America, Inc. Integrated printer monitoring
US7206807B2 (en) * 2003-01-21 2007-04-17 Bea Systems, Inc. Asynchronous invoking a remote web service on a server by a client who passes on a received invoke request from application code residing on the client
US7178150B1 (en) * 2003-01-29 2007-02-13 Sprint Communications Company L.P. Serialization method for transmitting data via CORBA interceptors
US7460260B2 (en) * 2003-07-24 2008-12-02 Toshiba Corporation Method of providing continuous feedback
US20050179936A1 (en) * 2004-02-13 2005-08-18 Microsoft Corporation Scalable print spooler

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015531948A (ja) * 2012-10-19 2015-11-05 マカフィー, インコーポレイテッド セキュアディスクアクセス制御

Also Published As

Publication number Publication date
EP1701245A2 (en) 2006-09-13
KR20060097577A (ko) 2006-09-14
CN1869923B (zh) 2010-12-08
EP1701245A3 (en) 2008-02-20
US7962917B2 (en) 2011-06-14
CN1869923A (zh) 2006-11-29
US20060206903A1 (en) 2006-09-14

Similar Documents

Publication Publication Date Title
US7962917B2 (en) System data interfaces, related architectures, print system data interfaces and related print system architectures
JP4394643B2 (ja) アイテムベースのストレージプラットフォームにおけるデータモデリングのためのシステムおよび方法
US7702725B2 (en) Digital object repositories, models, protocol, apparatus, methods and software and data structures, relating thereto
EP1847925B1 (en) Methods and systems for accessing, by application programs, resources provided by an operating system
US6895586B1 (en) Enterprise management system and method which includes a common enterprise-wide namespace and prototype-based hierarchical inheritance
US7853947B2 (en) System for virtualizing access to named system objects using rule action associated with request
JPH11327919A (ja) オブジェクト指向割込みシステム用の方法およびデバイス
US20070067321A1 (en) Method and system for locating and accessing resources
US20070067255A1 (en) Method and system for accessing resources
JP2007521533A (ja) アプリケーションプログラムをアイテムベースのストレージプラットフォームとインターフェースするためのシステムおよび方法
JPH11272483A (ja) サ―バに機能を追加する方法および装置
US20060070030A1 (en) Method and apparatus for providing an aggregate view of enumerated system resources from various isolation layers
JP4394644B2 (ja) データの編成、検索、および共有のためのストレージプラットフォーム
Lee et al. Foundation Framework System Services
Stangel A prototype implementation of a virtual file system
Kozlovics The webAppOS Architecture

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20090119

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20090310

A761 Written withdrawal of application

Free format text: JAPANESE INTERMEDIATE CODE: A761

Effective date: 20120229