以下、図面に基づいて本発明の実施の形態を説明する。図1は、本発明の実施の形態における複合機のソフトウェア構成例を示す図である。ここで、複合機とは、プリンタ、コピー、スキャナ、又はFAX等の複数の機能を一台の筐体において実現する画像形成装置をいう。
図1に示されるように、複合機1におけるソフトウェアは、ユーザインタフェース層10、コントロール層20、アプリケーションロジック層30、デバイスサービス層40、及びデバイス制御層50等より構成される。なお、図中における各層の上下関係は、層間の呼び出し関係に基づいている。すなわち、基本的に図中において上にある層が下の層を呼び出す。
ユーザインタフェース層10は、機能(例えば、コピー、印刷、スキャン、FAX送信)の実行要求を受け付けるための機能が実装されている部分であり、例えば、通信サーバ部11及びローカルUI部12等が含まれる。通信サーバ部11は、例えば、非図示のクライアントPC(Personal Computer)等からネットワーク経由で要求を受け付ける。ローカルUI部12は、例えば、非図示のオペレーションパネルを介して入力される要求を受け付ける。ユーザインタフェース層10において受け付けられた要求は、コントロール層20に伝えられる。
コントロール層20は、要求された機能を実現するための処理を制御するための機能が実装されている部分であり、例えば、プラグイン管理部21及びリクエスト管理部22等が含まれる。プラグイン管理部21は、アプリケーションロジック層30におけるアクティビティ31やフィルタ等を利用可能な状態にするための処理(プラグイン処理)等を制御する。リクエスト管理部22は、ユーザインタフェース層10において受け付けられた要求に応じた複合機1の機能を実行するための処理を制御する。なお、本実施の形態において「複合機1の機能」とは、複合機1がユーザに対して提供する一つのまとまった単位(要求が入力されて最終的な出力が得られるまで)のサービスと同義であり、ソフトウェア的には一つのまとまった単位のサービスを提供するアプリケーションと同義である。
アプリケーションロジック層30は、それぞれが複合機1において提供される機能の一部を実現する部品群が実装されている部分である。すなわち、アプリケーションロジック層30における部品を組み合わせることにより一つの機能が実現される。本実施の形態では、各部品を「フィルタ」と呼ぶ。これは、複合機1のソフトウェアアーキテクチャが「パイプ&フィルタ」と呼ばれる考え方に基づくことによる。
図2は、パイプ&フィルタの概念を説明するための図である。図2において、「F」はフィルタを示し、「P」はパイプを示す。図中に示されるように、各フィルタはパイプによって接続される。フィルタは、入力されたデータに対して変換を施し、その結果を出力する。パイプは、フィルタから出力されたデータを次のフィルタに伝達する。
すなわち、本実施の形態における複合機1では、各機能をドキュメント(データ)に対する「変換」の連続として捉える。複合機の各機能は、ドキュメントの入力、加工、及び出力によって構成されるものとして一般化することができる。そこで「入力」、「加工」、及び「出力」を「変換」として捉え、一つの「変換」を実現するソフトウェア部品がフィルタとして構成される。デバイスからのデータの入力を実現するフィルタを特に「入力フィルタ」という。また、データの加工(画像処理等)を実現するフィルタを特に「変換フィルタ」という。更に、デバイスへのデータの出力を実現するフィルタを特に「出力フィルタ」という。なお、各フィルタは独立しており、フィルタ間における依存関係(呼び出し関係)は基本的に存在しない。したがって、フィルタ単位で追加(インストール)又は削除(アンインストール)が可能とされている。
図1において、アプリケーションロジック層30には、入力フィルタとして、読取フィルタ301、保管文書読出フィルタ302、メール受信フィルタ303、FAX受信フィルタ304、PC文書受信フィルタ305、レポートフィルタ306等が含まれている。
読取フィルタ301は、スキャナによる画像データの読み取りを制御し、読み取られた画像データを出力する。保管文書読出フィルタ302は、複合機1の記憶装置に保管されている文書データ(画像データ)を読み出し、読み出されたデータを出力する。メール受信フィルタ303は、電子メールの受信し、当該電子メールに含まれているデータを出力する。FAX受信フィルタ304は、FAX受信を制御し、受信されたデータを出力する。PC文書受信フィルタ305は、非図示のクライアントPCから印刷データを受信し、受信された印刷データを出力する。レポートフィルタ306は、複合機1の設定情報や履歴情報等を、例えば表形式に整形されたデータとして出力する。
また、変換フィルタとしては、文書加工フィルタ311及び文書変換フィルタ312等が含まれている。文書加工フィルタ311は、入力されたデータに所定の画像変換処理(集約、拡大、又は縮小等)を施し、出力する。文書変換フィルタ312は、レンダリング処理を実行する。すなわち、入力されたPostScriptデータをビットマップデータに変換して出力する。
また、出力フィルタとしては、印刷フィルタ321、保管文書登録フィルタ322、メール送信フィルタ323、FAX送信フィルタ324、PC文書送信フィルタ325、及びプレビューフィルタ326等が含まれている。
印刷フィルタ321は、入力されたデータをプロッタに出力(印刷)させる。保管文書登録フィルタ322は、入力されたデータを複合機1内のハードディスク内に保存する。メール送信フィルタ323は、入力されたデータを電子メールに添付して送信する。FAX送信フィルタ324は、入力されたデータをFAX送信する。PC文書送信フィルタ325は、入力されたデータをクライアントPCに送信する。プレビューフィルタ326は、入力されたデータを、複合機1のオペレーションパネルにプレビュー表示させる。
例えば、複合機1における各種機能は、次のようなフィルタの組み合わせにより実現される。図3は、本実施の形態の複合機における各機能を実現するためのフィルタの組み合わせの例を示す図である。
例えば、コピー機能は、読取フィルタ301と印刷フィルタ321とを接続することにより実現される。読取フィルタ301によって原稿より読み取られた画像データを印刷フィルタ321によって印刷すればよいからである。なお、集約、拡大、又は縮小等の加工が要求された場合は、これらの加工を実現する文書加工フィルタ311が二つのフィルタの間に挿入される。
プリンタ機能(クライアントPCからの印刷機能)は、PC文書受信フィルタ305と文書変換フィルタ312と印刷フィルタ321とを接続することにより実現される。スキャンto email機能(スキャンした画像データを電子メールで転送する機能)は、読取フィルタ301とメール送信フィルタ323とを接続することによって実現される。FAX送信機能は、読取フィルタ301とFAX送信フィルタ324とを接続することによって実現される。FAX受信機能は、FAX受信フィルタ304と印刷フィルタ321とを接続することによって実現される。ドキュメントボックス蓄積機能(スキャンした画像データを複合機1内に保存する機能)は、読取フィルタ301と保管文書登録フィルタ322とを接続することによって実現される。ドキュメントボックス印刷機能(複合機1内に保存されている文書データを印刷する機能)は、保管文書読出フィルタ302と印刷フィルタ321とを接続することにより実現される。
図3において、例えば、読取フィルタ301については5つの機能において利用されている。このように、各フィルタは複数の機能から利用可能であり、それによって各機能を実現するための開発工数を削減することができる。例えば、コピー機能とスキャン機能(ドキュメントボックス蓄積)について、その動作条件を設定させるためのユーザインタフェースは類似しているものであった。それにも拘わらず、各機能をアプリケーションによって実装する場合には、アプリケーションごとに個別にユーザインタフェースの実装も行われていた。しかし、本実施の形態の複合機1によれば、コピー機能及びスキャン機能のいずれの場合も、読取フィルタ301のユーザインタフェースによって設定が行われ、ユーザインタフェースの共通化をも図ることができる。
更に、新たな機能を実現する場合について考える。まず、機能1として、複合機1では対応していないPDL(Page Description Language)(以下、「他PDL」という。)によってクライアントPCから送信される印刷データを印刷する機能を実現する場合について考える。この場合、図3におけるプリンタ機能を雛形とすることができる。但し、プリンタ機能では、PC文書受信フィルタ305により出力されるデータがPostScript形式であることが前提とされている。文書変換フィルタ312が入力データとして扱えるのはPostScript形式のデータだからである。しかし、機能1の場合、PC文書受信フィルタ305によって受信され、当該フィルタより出力されるのは他PDL形式のデータである。したがって、このまま文書変換フィルタ312に転送しても文書変換フィルタ312は適切に処理を実行することができない。そこで、他PDL形式からPostScript形式へのデータ変換を実行する変換フィルタ(以下「他PDL−PS変換フィルタ」という。)を新たに実装し、当該フィルタをPC文書受信フィルタ305と文書変換フィルタ312との間に挿入すれば、機能1を実現することができる。すなわち、機能1は、PC文書受信フィルタ305と他PDL−PS変換フィルタと文書変換フィルタ312と印刷フィルタ321とを接続することにより実現される。
次に、機能2として、Webサイトから情報を収集し、収集された情報を印刷する機能(以下「機能2」という。)を実現する場合について考える。この場合、Webサイトから情報を収集するフィルタが存在しない。したがって、少なくともWebサイトから情報を収集する入力フィルタ(以下「Web収集フィルタ」という。)を新たに実装する必要がある。また、機能2では最終的に印刷を実行させたいので、出力フィルタとしては印刷フィルタ321を用いるのが適切である。ここで問題となるのが、Web収集フィルタと印刷フィルタ321との間をどのように接続するかである。すなわち、印刷フィルタ321の入力データはレンダリングされたビットマップである必要があるところ、Web収集フィルタ内にレンダリング機能を実装するのは非常に工数がかかるので適切ではない。そこで、既にレンダリング機能を実現する文書変換フィルタ312を利用することが考えられる。ただし、文書変換フィルタ312の入力データは、PostScript形式である必要がある。そこで、Web収集フィルタを、収集した情報をPostScript形式によって出力するように実装すれば、文書変換フィルタ312との接続が可能となる。このようにWeb収集フィルタを実装することにより、機能2は、Web収集フィルタと文書変換フィルタ312と、文書変換フィルタ312と印刷フィルタ321との接続により実現される。
このように、複合機1では各フィルタを部品として各機能を構築するため、機能のカスタマイズ又は拡張を簡便に行うことができる。すなわち、各フィルタ間には、機能的な依存関係はなく独立性が保たれているため、フィルタの新たな追加やフィルタの組み合わせの変更によって、新たな機能(アプリケーション)を容易に開発することができる。したがって、新たなアプリケーションの実装が要求された場合、当該アプリケーションの一部の処理について実装されていない場合は、当該一部の処理を実現するフィルタのみを開発し、インストールすればよい。よって、コントロール層20及びアプリケーションロジック層30より下位の層について、新たなアプリケーションの実装に応じて発生する修正の頻度を低下させることができ、安定したプラットフォームを提供することができる。
アプリケーション層30には、また、フィルタ管理部33が含まれている。フィルタ管理部33は、複合機1にインストールされているフィルタの一覧情報等を管理する。当該一覧情報は、例えば、フィルタのインストール時において、フィルタ管理部33の管理する記憶領域(記憶装置上における記憶領域)に記録される。
アプリケーション層30には、更に、アクティビティ31が含まれている。「アクティビティ」とは、複数のフィルタの組み合わせによって、一つの「機能」(複合機1がユーザに対して提供する一つのまとまった単位のサービス又はアプリケーション)を実現するソフトウェアである。
すなわち、フィルタはそれぞれ独立性が高いため、フィルタの組み合わせ(アプリケーション)を動的に構築することが可能である。具体的には、ジョブの実行要求を受け付けるたびに、利用するフィルタと、フィルタの実行順序、及びそれぞれのフィルタの動作条件等をオペレーションパネルを介してユーザに設定させることにより、ユーザ所望の機能を実現するようにしてもよい。
しかし、コピー機能のように頻繁に利用する機能については、毎回フィルタを選択することにより実行指示を行うのはユーザにとって煩雑である。かかる課題を解決するのがアクティビティ31である。すなわち、フィルタの組み合わせをアクティビティ31として予め定義しておけば、ユーザは、アクティビティ31を単位として実行対象を選択することができる。選択されたアクティビティ31は、当該アクティビティ31に定義された組み合わせに係る各フィルタを自動的に実行する。したがって、アクティビティ31によって、操作の煩雑さを解消することができるとともに、アプリケーション単位で実行対象を選択していた従来のユーザインタフェースと同様の操作感を提供することができる。
図中では、アクティビティ31として、コピーアクティビティ31a、プリンタアクティビティ31b、及びマルチ文書アクティビティ31c等が例示されている。
コピーアクティビティ31aは、読取フィルタ301と、文書加工フィルタ311と、印刷フィルタ321との組み合わせにより、コピー機能(コピーアプリケーション)を実現するアクティビティ31である。
プリンタアクティビティ31bは、PC文書受信フィルタ305と、文書変換フィルタ312と、印刷フィルタ321との組み合わせにより、印刷機能(プリンタアプリケーション)を実現するアクティビティ31である。
マルチ文書アクティビティ31cは、入力フィルタ、変換フィルタ、及び出力フィルタのそれぞれについて、自由な組み合わせが可能なアクティビティ31である。
なお、基本的に各アクティビティ31は独立しており、アクティビティ31間における依存関係(呼び出し関係)は基本的に存在しない。したがって、アクティビティ31単位で追加(インストール)又は削除(アンインストール)が可能である。よって、図1に示されているアクティビティ31以外にも、必要に応じて各種のフィルタの組み合わせによるアクティビティ31を作成し、インストールすることができる。
また、アクティビティ31の実行に際し利用されるフィルタは、固定的ではなく(常に同じではなく)、そのアクティビティ31に対して設定される動作条件に応じて異なり得る。
デバイスサービス層40は、アプリケーションロジック層30における各アクティビティ31や各フィルタから共通に利用される下位機能が実装されている部分であり、例えば、画像パイプ41、データ管理部42、及びパイプ管理部43等が含まれる。画像パイプ41は、上述したパイプの機能を実現する。すなわち、或るフィルタからの出力データを次のフィルタに伝達する。データ管理部42は、各種のデータベースを表現する。例えば、ユーザ情報が登録されたデータベースや、文書又は画像データ等が蓄積されるデータベース等が相当する。パイプ管理部43は、複合機1において利用可能なパイプの種類の一覧情報等を管理する。後述されるように、パイプには種類がある。当該一覧情報は、例えば、パイプ管理部43の管理する記憶領域(記憶装置上における記憶領域)に記録される。
デバイス制御層50は、デバイス(ハードウェア)を制御するドライバと呼ばれるプログラムモジュール群が実装されている部分であり、例えば、スキャナ制御部51、プロッタ制御部52、メモリ制御部53、Tel回線制御部54、及びネットワーク制御部55等が含まれる。各制御部は、当該制御部の名前に付けられているデバイスを制御する。
フィルタ及びアクティビティ31について更に詳しく説明する。図4は、フィルタの構成要素を説明するための図である。図4に示されるように、各フィルタは、フィルタ設定用UI、フィルタロジック、フィルタ固有下位サービス、及び永続記憶領域情報等より構成される。このうち、フィルタ設定用UI、フィルタ固有下位サービス、及び永続記憶領域情報については、フィルタによって必ずしも構成要素に含まれない。
フィルタ設定用UIは、フィルタの動作条件等を設定させるための画面をオペレーションパネル等に表示させるプログラムである。例えば、読取フィルタ301であれば、解像度、濃度、画像種別等を設定させる画面が相当する。なお、オペレーションパネルの表示がHTMLデータや、スクリプトに基づいて行われ得ることに鑑みれば、フィルタ設定用UIはHTMLデータやスクリプトであってもよい。
フィルタロジックは、フィルタの機能を実現するためロジックが実装されたプログラムである。すなわち、フィルタの構成要素としてのフィルタ固有下位サービスや、デバイスサービス層40又はデバイス制御層50等を利用して、フィルタ設定用UIを介して設定された動作条件に応じてフィルタの機能を実現する。例えば、読取フィルタ301であれば、スキャナによる原稿の読み取り制御のためのロジックが相当する。
フィルタ固有下位サービスは、フィルタロジックを実現するために必要な下位機能(ライブラリ)である。すなわち、デバイスサービス層40又はデバイス制御層50相当する機能であるが、他のフィルタから使用されないものについては、フィルタの一部として実装されてもよく、当該一部がフィルタ固有下位サービスに相当する。例えば、読取フィルタ301であれば、スキャナを制御するための機能が相当するが、本実施の形態では、デバイス制御層50においてスキャナ制御部51として実装されている。したがって、読取フィルタ301において、フィルタ固有下位サービスの実装は必ずしも必要ではない。
永続記憶領域情報は、フィルタに対する設定情報(例えば、動作条件のデフォルト値)等、不揮発メモリに保存する必要があるデータのスキーマ定義が相当する。当該スキーマ定義は、フィルタのインストール時にデータ管理部42に登録される。
図5は、アクティビティの構成要素を説明するための図である。図5に示されるように、アクティビティ31は、アクティビティUI、アクティビティロジック、及び永続記憶領域情報等より構成される。
アクティビティUIは、アクティビティ31に関する画面(例えば、アクティビティ31の動作条件等を設定させるための設定画面)をオペレーションパネル等に表示させるための情報又はプログラムである。
アクティビティロジックは、アクティビティ31の処理内容が実装されたプログラムである。基本的に、アクティビティロジックには、フィルタの組み合わせに関するロジック(例えば、フィルタの実行順、複数のフィルタに跨る設定、フィルタの接続変更、エラー処理等)が実装されている。
永続記憶領域情報は、アクティビティ31に対する設定情報(例えば、動作条件のデフォルト値)等、不揮発メモリに保存する必要があるデータのスキーマ定義が相当する。当該スキーマ定義は、アクティビティ31のインストール時にデータ管理部42に登録される。
図3又は図4に示されるように、フィルタの機能を実現するロジックはフィルタロジックに、アクティビティロジックに実装される。そこで、更に、フィルタロジック及びアクティビティロジックについて詳しく説明する。
図6は、アアクティビティロジックとフィルタロジックとの文書操作に関するクラス構成例を示す図である。ここで、文書操作とは、文書を表現する各種データ(例えば、画像データ)に対する操作(処理)をいう。なお、以下の説明において、「オブジェクト」とは、各クラスのインスタンス、すなわち、クラスの定義に基づいてメモリ上に生成される具体的なデータ(情報)をいう。したがって、オブジェクトが保持又は管理する情報はメモリ上に記憶される。なお、以下の説明において、XXXオブジェクトとは、XXXクラスのインスタンスを意味する。
図6において、符号Aで示される破線で囲まれたクラス、すなわち、アプリケーションロジッククラス410、文書操作条件クラス420、文書操作ジョブクラス430、機能コネクタクラス440、及びジョブ開始トリガクラス450は、アクティビティロジックを構成するクラス群である。
アプリケーションロジッククラス410は、一つのインスタンスで一つのアクティビティ31のアクティビティロジックを表現するクラスであり、アクティビティ31の動作条件及びアクティビティ31のジョブを管理する。斯かる管理機能に対応させて、アクティビティロジッククラス410は、文書操作条件クラス420及び文書操作ジョブクラス430をそれぞれ1対多の多重度で集約する。なお、「アクティビティ31のジョブ」とは、アクティビティ31の機能が完了するまでの一連の処理をいい、本実施の形態では特に「文書操作ジョブ」という。例えば、アクティビティ31が、一つの入力フィルタ、一つの変換フィルタ、一つの出力フィルタより構成される場合、これら三つのフィルタの接続によって実行される処理の開始から終了までの処理工程が、一つの文書操作ジョブに相当する。
文書操作条件クラス420は、一つのインスタンスで、一つのアクティビティ31に対する動作条件を表現及び管理するクラスである。すなわち、アクティビティ31に設定される動作条件は、文書操作条件オブジェクトにおいて保持される。
機能コネクタクラス440は、二つの役割を担う。第一の役割を担うためにインスタンス化される機能コネクタオブジェクトは、アクティビティ31によって利用されるフィルタ間の接続関係を管理する。第二の役割を担うためにインスタンス化される機能コネクタオブジェクトは、アクティビティ31が二つ以上の出力フィルタを構成要素とする場合に(以下、このようなアクティビティを「多出力のアクティビティ」という。)、各出力フィルタの実行順(出力順)を管理する。
出力フィルタの実行順(出力順)について説明する。図7は、多出力のアクティビティにおけるフィルタの接続関係の一例を示す図である。図7では、図2と同じ表記法を用いている。すなわち、「F」はフィルタを示し、「P」はパイプを示す。
図7において、フィルタ331は、入力フィルタである。フィルタ332及び334は、変換フィルタである。フィルタ333及び335は、出力フィルタである。図7の例では、フィルタ331によって入力されたデータの出力先は二つに分岐し、フィルタ332とフィルタ334となっている。フィルタ332によって処理されたデータは、フィルタ333によって出力される。また、フィルタ334によって処理されたデータはフィルタ335によって出力される。このように多出力の場合、少なくとも複数の出力フィルタは並列的な関係となる。ここで、フィルタ333による出力処理と、フィルタ335による出力処理との順番(いずれを先に実行させるか、又は同時に実行させるか)を制御したい場合がある。この順番が、出力順に相当する。
なお、図6において、機能コネクタクラス440は、ロール名が「フィルタ接続」の関連r1と、ロール名が「出力順」の関連r2とによって文書操作条件クラス420に集約される。関連r1は、フィルタ間の接続関係(図7における、フィルタ331とフィルタ332との接続、フィルタ332とフィルタ333との接続、フィルタ331とフィルタ334との接続、フィルタ334とフィルタ335との接続)を管理する(すなわち、第一の役割を担う)インスタンスに対する関連を示す。関連r2は、出力順を管理する(すなわち、第二の役割を担う)インスタンスに対する関連を示す。
文書操作ジョブクラス430は、文書操作ジョブを制御するクラスである。文書操作ジョブクラス430は、1対多の多重度でジョブ開始トリガクラス450を集約する。
ジョブ開始トリガクラス450は、多出力のアクティビティ31について出力順を制御する必要がある場合、当該出力順を制御するためのクラスである。
ジョブ状態通知先クラス460は、フィルタから当該フィルタのジョブの状態の通知を受けるためのインタフェースが定義された抽象クラスである。フィルタのジョブの状態の通知を受ける必要があるクラスは、ジョブ状態通知先クラス460を継承する。本実施の形態では、文書操作ジョブクラス430及びジョブ開始トリガ450が、状態通知先クラス460のインタフェースを継承している。なお、フィルタのジョブとは、一つのフィルタによって実行される処理をいい、本実施の形態では、特に「フィルタジョブ」という。
一方、図6において、符号Fで示される破線で囲まれたクラス、すなわち、フィルタロジッククラス510、フィルタ条件クラス520、フィルタジョブクラス530、及びパイプジョブクラス540は、フィルタロジックを構成するクラス群である。
フィルタロジッククラス510は、フィルタロジックを表現するクラスであり、フィルタの動作条件及びフィルタジョブを管理する。斯かる管理機能に対応させて、フィルタロジッククラス510は、フィルタ条件クラス520及びフィルタジョブクラス530をそれぞれ1対多の多重度で集約する
フィルタ条件クラス520は、一つのインスタンスで一つのフィルタに対する動作条件を表現及び管理するクラスである。すなわち、フィルタに設定される動作条件は、フィルタ条件クラス520において保持される。
フィルタジョブクラス530は、フィルタジョブを制御するクラスである。
パイプジョブクラス540は、パイプのジョブ(パイプによるフィルタ間のデータの伝達)を制御するクラスである。
フィルタジョブクラス530は、パイプジョブクラス540に対しそれぞれ一対多の多重度で二つの関連(関連r12及び関連r13)を有する。関連r12は、「データソース(フィルタに対するデータの入力側)」としてのパイプのパイプジョブオブジェクトへの関連である。関連13は、「データシンク(フィルタからのデータの出力側)」としてのパイプのパイプジョブオブジェクトへの関連である。
以上のように、アクティビティロジック及びフィルタロジックは、主にその動作条件を管理するためのクラスと、そのジョブを制御するためのクラスとによって構成される点について共通する。引き続き図6を参照しつつ、アクティビティロジックを構成するクラスとフィルタロジックを構成するクラスとの関連について説明する。
文書操作条件クラス420は、二つの関連(関連r3及び関連r4)によってフィルタ条件クラス520を1対多の多重度で集約する。この集約関係は、アクティビティ31の動作条件は、当該アクティビティ31が利用する各フィルタの動作条件の集合によって構成されることを示す。関連r3は、「利用するフィルタ」のフィルタ条件オブジェクトに対する関連であり、関連r4は、「機能有効なフィルタ」のフィルタ条件オブジェクトに対する関連である。「利用するフィルタ」とは、アクティビティ31が静的な意味において利用するフィルタ(すなわち、利用する可能性が有るフィルタ)をいい、アクティビティ31ごとに異なり得る。したがって、関連r3は、アクティビティ31が利用する可能性が有るフィルタのフィルタ条件オブジェクトへの関連を示す。「機能有効なフィルタ」とは、アクティビティ31が動的な意味において利用するフィルタ(すなわち、実際に利用するフィルタ)をいう。したがって、関連r4は、アクティビティが実際に利用するフィルタのフィルタ条件オブジェクトへの関連を示す。なお、「機能有効なフィルタ」は、アクティビティ31の動作条件に応じて「利用するフィルタ」の中から選択される。
機能コネクタクラス440は、フィルタ条件クラス520に対して関連r5及び関連r6を有する。関連r5は、「前段のフィルタ」のフィルタ条件オブジェクトに対する関連であり、関連r6は、「後段のフィルタ」のフィルタ条件オブジェクトに対する関連である。「前段のフィルタ」及び「後段のフィルタ」の意味は、機能コネクタオブジェクトの役割に応じて異なる。すなわち、機能コネクタオブジェクトが、フィルタの接続関係を管理するものである場合、「前段のフィルタ」とは、当該接続関係において前に接続されるフィルタを意味し、「後段のフィルタ」とは、当該接続関係において後に接続されるフィルタを意味する。また、機能コネクタオブジェクトが、出力順を管理するものである場合、「前段のフィルタ」とは、先に実行される出力フィルタを意味し、「後段のフィルタ」とは、後に実行される出力フィルタを意味する。
文書操作ジョブクラス430は、二つの関連(関連r7及び関連r8)によってフィルタジョブクラス530を1対多の多重度で集約する。この集約関係は、文書操作ジョブは、当該アクティビティ31が利用する各フィルタのフィルタジョブの集合によって構成されることを示す。関連r7は、「制御対象のジョブ」に関するフィルタジョブオブジェクトに対する関連であり、関連r8は、「最初に実行する出力系ジョブ」に関するフィルタジョブオブジェクトに対する関連である。「制御対象のジョブ」とは、文書操作ジョブの実行に応じて実行される各フィルタジョブである。「最初に実行する出力系ジョブ」とは、出力系のジョブ(出力フィルタによるジョブ)のうち、文書操作ジョブの実行の開始に応じて最初に実行開始の指示対象とされるジョブである。後述されるように、文書操作ジョブの実行が開始されると、当該アクティビティ31が利用する各フィルタに対して並列的にジョブの実行の開始が指示される。但し、出力順が設定されている場合、当該出力順に係る出力フィルタに関しては、出力順において最初の出力フィルタに対してのみ実行の開始が指示される。したがって、関連r8は、出力順において最初の出力フィルタに関するフィルタジョブオブジェクト対する関連である。文書操作ジョブクラス430とフィルタジョブクラス530との関連r8における多重度は1対多である。したがって、一つの文書操作ジョブにおいて、「最初に実行する出力系ジョブ」は複数存在し得る。
文書操作ジョブクラス430は、また、文書操作条件クラス420に対して1対1の多重度で関連r11を有する。したがって、文書操作ジョブオブジェクトでは、対応する文書条条件オブジェクトへの関連が保持される。
ジョブ開始トリガクラス450は、フィルタジョブクラス530に対して関連r9及び関連r10を有する。関連r9は、「終了イベント待ち」の対象となるフィルタジョブオブジェクトに対する関連であり、関連r10は、「ジョブ開始指示対象」となるフィルタジョブオブジェクトに対する関連である。ジョブ開始トリガオブジェクトは、「終了イベント待ち」のフィルタジョブオブジェクトより当該フィルタジョブの終了イベントが通知されると、「ジョブ開始指示対象」のフィルタジョブオブジェクトに対してジョブの開始を指示する。換言すれば、「終了イベント待ち」のフィルタジョブオブジェクトとは、出力順において先に実行される出力フィルタのフィルタジョブオブジェクトであり、「ジョブ開始指示対象」のフィルタジョブオブジェクトとは、出力順において後に実行される出力フィルタのフィルタジョブオブジェクトである。すなわち、関連r9及び関連r10によって出力順が管理される。なお、ジョブ開始トリガクラス450は、フィルタジョブクラス530に対して1対多の多重度で関連r9及び関連r10を有する。したがって、一つのジョブ開始トリガオブジェクトは、複数のフィルタジョブオブジェクトを終了イベント待ちの対象とすることができ、複数のフィルタジョブオブジェクト530をジョブ開始指示対象とすることができる。具体的には、出力フィルタを三つ利用するアクティビティ31の場合、例えば、二つの出力フィルタのジョブの終了を待ち合わせて他のフィルタにジョブの実行を開始させたり、一つのフィルタのフィルタジョブの終了に応じて、他の二つのフィルタのフィルタジョブの実行を開始させたりすることができる。
フィルタジョブクラス530は、ジョブ状態通知先クラス460を集約する。この関連によって、フィルタジョブクラス530は、ジョブの状態の変化(ジョブの終了等)の通知先を識別する。なお、上述したようにジョブ状態通知先クラス460は、インタフェースのみが定義されている抽象クラスであり、文書操作ジョブクラス430及びジョブ開始トリガクラス450が当該インタフェースを継承している。したがって、フィルタジョブオブジェクトからのジョブの状態の変化の通知は、実際の文書操作ジョブオブジェクトやジョブ開始トリガオブジェクトに通知される。但し、ジョブ状態通知先クラス460によって、実際の通知先は、フィルタジョブクラス530に対して隠蔽される。したがって、フィルタジョブオブジェクトは、実際の通知先を意識する必要はない。
なお、図6に示されるクラス図は、アクティビティロジックとフィルタロジックのフレームワーク部分についてのクラス図である。すなわち、それぞれ具体的なアクティビティ31やフィルタにおけるアクティビティロジック又はフィルタロジックでは、図6に示されるクラスを継承したクラスによってその機能を拡張することができる。
図6に示されるクラス図に基づいて、コピーアクティビティ31aの一つの機能であるコピー蓄積機能の動作条件及びジョブが、オブジェクトとしてどのように表現されるかを示す。その前に、コピー蓄積機能のフィルタ構成について説明しておく。
図8は、コピー蓄積機能のフィルタ構成例を示す図である。図8に示されるように、コピー蓄積機能は、読取フィルタ301、二つ文書加工フィルタ311(文書加工フィルタ311a、文書加工フィルタ311b、印刷フィルタ321、及び保管文書登録フィルタ322より構成される。
読取フィルタ301は、文書加工フィルタ311a及び311bに接続される。文書加工フィルタ311aは、印刷フィルタ321に接続される。文書加工フィルタ311bは、保管文書登録フィルタ322に接続される。
読取フィルタ301→文書加工フィルタ311a→印刷フィルタ321の接続により、スキャンされた画像データの印刷、すなわち、コピー機能が実現される。また、読取フィルタ301→文書加工フィルタ311b→保管文書登録フィルタ322の接続により、スキャンされた画像データのHDDへの保存機能が実現される。このように、コピー蓄積機能は、並列的な関係にある二つの出力フィルタを利用する多出力の機能である。
斯かるコピー蓄積機能の動作条件は、図6のクラス図に基づけば次のようなオブジェクト構成によって表現される。
図9は、コピー蓄積機能の動作条件を表現するオブジェクト図の例である。図中(A)は、図6より抜粋された動作条件に関するクラス図である。(B)は、(A)に示されるクラス構成に基づいてインスタンス化されるオブジェクトの構成を示すオブジェクト図である。なお、(B)における各矩形は、それぞれ一つのオブジェクトを示す。また、矩形内は、「XXX:YYY」の形式で文字列が表記されている。ここで、「XXX」は、オブジェクト名を示し、「YYY」は、クラス名を示す。以下において、そのクラスに属するオブジェクト一般を総称する場合は、<クラス名>オブジェクトと記載する。一方、各インスタンスを具体的に識別する場合は、<オブジェクト名>オブジェクトと記載する。
(B)に示されるように、コピーアクティビティ31aのコピー蓄積機能の動作条件は、コピーアクティビティ31aに対応する文書操作条件オブジェクトとしてコピー蓄積条件オブジェクト421を有する。また、読取フィルタ301、文書加工フィルタ311a、印刷フィルタ321、文書加工フィルタ311b、保管文書登録フィルタ322のそれぞれに対応するフィルタ条件オブジェクトとして、読取条件オブジェクト521、加工A条件オブジェクト522、印刷条件オブジェクト523、加工B条件オブジェクト524、保管条件オブジェクト525を有する。また、各フィルタの接続関係に対応させて各フィルタに対応するフィルタ条件オブジェクトを接続する機能コネクタオブジェクトとして、フィルタ接続オブジェクト441、フィルタ接続オブジェクト442、フィルタ接続オブジェクト443、及びフィルタ接続オブジェクト444を有する。また、印刷フィルタ321と保管文書登録フィルタ322との実行順を印刷条件オブジェクト523と保管条件オブジェクト525との関係によって管理する機能コネクタオブジェクトとして出力順オブジェクト445とを有する。なお、オブジェクト間を結ぶ各線分は、オブジェクト間の関連を示す。
(B)のオブジェクト構造は、コピー蓄積条件オブジェクト421をルートとして、ツリー構造を有している。したがって、以下、アクティビティ31の動作条件を表現するオブジェクト構造を「条件ツリー」という。
また、図10は、コピー蓄積機能の文書操作ジョブを表現するオブジェクト図の例である。図中(A)は、図6より抜粋されたジョブに関するクラス図である。(B)は、(A)に示されるクラス構成に基づいてインスタンス化されるオブジェクトの構成を示すオブジェクト図である。
(B)に示されるように、コピー蓄積機能の文書操作ジョブは、コピーアクティビティ31aに対応する文書操作ジョブオブジェクトとしてコピー蓄積ジョブオブジェクト431を有する。また、読取フィルタ301、文書加工フィルタ311a、印刷フィルタ321、文書加工フィルタ311b、保管文書登録フィルタ322のそれぞれに対応するフィルタジョブオブジェクトとして、読取ジョブオブジェクト531、加工Aジョブオブジェクト532、印刷ジョブオブジェクト533、加工Bジョブオブジェクト534、保管ジョブオブジェクト535を有する。また、各フィルタを接続するパイプに対応するパイプジョブオブジェクトとして、パイプジョブオブジェクト541、パイプジョブオブジェクト542、パイプジョブオブジェクト543、及びパイプジョブオブジェクト544を有する。また、印刷フィルタ321と保管文書登録フィルタ322の実行順を印刷条件オブジェクト523と保管条件オブジェクト525との関係によって管理するジョブ開始トリガオブジェクトとしてトリガAオブジェクト451を有する。
(B)のオブジェクト構造は、コピー蓄積ジョブオブジェクト431をルートとして、ツリー構造を有している。したがって、以下、アクティビティ31のジョブを表現するオブジェクト構造を「ジョブツリー」という。
以下、上記ソフトウェアに基づく複合機1による処理手順について説明する。図11は、文書操作の実行処理の概要を説明するためのアクティビティ図である。なお、図11において、アクティビティ31とは、厳密にはアクティビティ31のアクティビティロジックのことを指す。
まず、複合機1のオペレーションパネルを介してユーザによって文書操作の開始の指示が入力される(S11)。当該指示は、例えば、実行対象とするアクティビティ31の選択が相当する。続いて、選択されたアクティビティ31(以下、「カレントアクティビティ」という。)は、文書操作の動作条件の雛形を生成する(S12)。具体的には、カレントアクティビティは、図6に示したクラス構成に基づいて、当該アクティビティ31の規定値としての動作条件を表現する条件ツリーを生成する。
続いて、ユーザによってオペレーションパネルを介してカレントアクティビティの動作条件が設定されると(S13)、カレントアクティビティは、その設定内容を条件ツリーに反映する(S14)。具体的には、条件ツリーの構造を変更したり、条件ツリーを構成する各オブジェクトの属性の値を変更したりする。
条件ツリーの構造の変更は、例えば、動作条件に応じて、新たに利用するフィルタが追加された場合や、不要となるフィルタが生じた場合、また、多出力の場合に出力順が設定された場合等に行われる。新たに利用するフィルタが追加された場合は、当該フィルタに対応するフィルタ条件オブジェクトがインスタンス化され、条件ツリーに追加される。不要となるフィルタが生じた場合は、当該フィルタに対応するフィルタ条件オブジェクトが条件ツリーから削除される。出力順が設定された場合は、その出力順に対応する機能コネクタオブジェクトがインスタンス化され、条件ツリーに追加される。
また、各オブジェクトの属性の値の変更は、例えば、或るフィルタの動作条件が変更された場合に行われる。この場合、当該フィルタに対応するフィルタ条件オブジェクトにおいて、変更されたパラメータ(例えば、読取フィルタ301であれば読み取り解像度等)に対応する属性の値が変更される。
動作条件の設定が終了し、ユーザによってスタートボタンが押下される等により、カレントアクティビティによる文書操作ジョブの実行が指示されると(S15)、リクエスト管理部22は、条件ツリーに基づいてジョブツリーを生成する(S16)。
図12は、は、条件ツリーに基づくジョブツリーの生成を説明するための図である。ジョブツリーの生成は、基本的に、条件ツリーを構成する各オブジェクトをジョブに関するオブジェクトに変換することによって行われる。
すなわち、図12(A)に示されるように、フィルタ条件オブジェクトに基づいてフィルタジョブオブジェクトを生成する。
また、(B)に示されるように、フィルタ接続の管理の役割を担う機能コネクタオブジェクトに基づいてパイプジョブオブジェクトを生成する。
また、(C)に示されるように、機能コネクタオブジェクトが管理するフィルタの接続関係に基づいて、フィルタジョブオブジェクト間をパイプジョブオブジェクトによって接続する。
また、(D)に示されるように、出力順の管理の役割を担う機能コネクタオブジェクトに基づいてジョブ開始トリガオブジェクトを生成する。そして、機能コネクタオブジェクトに対して「前段のフィルタ」として関連付けられているフィルタ条件オブジェクトに対応するフィルタジョブオブジェクトを、ジョブ開始トリガに対して「終了イベント待ち」として関連付ける。また、機能コネクタオブジェクトに対して「後段のフィルタ」として関連付けられているフィルタ条件オブジェクトに対応するフィルタジョブオブジェクトを、ジョブ開始トリガに対して「ジョブ開始指示対象」として関連付ける。
斯かる処理により、条件ツリーに基づいてジョブツリーが生成される。
続いて、カレントアクティビティは、当該文書操作ジョブの実行を開始し(S17)。生成されたジョブツリーに基づいて、カレントアクティビティが利用する各フィルタにジョブの実行の開始を指示する(S18)。ジョブの実行が終了したフィルタからは、カレントアクティビティに対してジョブの終了イベントが通知される(S19)。全てのフィルタよりジョブの終了イベントの通知を受けると、カレントアクティビティは、当該文書操作ジョブの実行を終了する(S20)。ユーザは、文書操作ジョブの終了に応じて、文書操作を終了する(S21)。
図11においてアクティビティ図によって説明した処理について、主なステップごとにオブジェクト間のメッセージのやり取りを明確にしたシーケンス図を用いて以下に説明する。
図13及び図14は、条件ツリーの生成処理を説明するためのシーケンス図である。なお、図13及び図14に示される処理は、図15に示される条件ツリーを生成する処理に該当する。図15に示される条件ツリーは、図9に示されるコピー蓄積機能の条件ツリーの一部である。
オペレーションパネルを介して、ユーザによって、コピーアクティビティ31aのコピー蓄積機能が選択されると、ローカルUI部12は、コピー蓄積機能の設定画面のコンテンツ(以下「UIコンテンツ」という。)の提供をコピーアクティビティ31aのアクティビティUI32aに要求する(アクティビティUIについては、図5において説明した通りである)(S101)。続いて、アクティビティUI32aは、コピーアクティビティ31aのアクティビティロジックにおけるアプリケーションロジックオブジェクト(アプリケーションロジッククラス410のインスタンス)のフレームワーク(F/W)部(アプリケーションロジックF/W410F)に対し、文書操作の動作条件の生成を要求する(S102)。続いて、アプリケーションロジックF/W410Fは、アプリケーションロジックオブジェクトの拡張部(アプリケーションロジック具象410C)に対し、コピー蓄積機能に固有の動作条件の生成処理の実行を要求する(S103)。なお、アクティビティロジックF/W410Fとアプリケーションロジック具象410Cとは、図中では、異なるオブジェクトであるかのように表現されているが、実際には一つのオブジェクト(コピーアクティビティ31aに独自の実装を行うために作成されたアプリケーションロジッククラス410のサブクラス(拡張部分)のオブジェクト)である。すなわち、アプリケーションロジックF/W410は、当該オブジェクトに関する実装のうち、フレームワーク部分であるアプリケーションロジッククラス410において実装されている部分を示す。また、アプリケーションロジック具象410Cは、当該オブジェクトの実装のうち、サブクラスにおいて実装されている部分を示す。
続いて、アプリケーションロジック具象410Cは、文書操作条件クラス420のインスタンスとしてコピー蓄積条件オブジェクト421を生成する(S104)。続いて、アプリケーションロジック具象410Cは、読取フィルタ301のフィルタロジックにおける読取ロジックオブジェクト511(フィルタロジッククラス510のインスタンス)に読取フィルタ301の動作条件の生成を要求する(S105)。読取ロジックオブジェクト511は、読取条件オブジェクト521を生成し(S106)、生成された読取条件オブジェクト521(又はをの参照情報)をアプリケーションロジック具象410Cに返却する(S107)。なお、読取条件オブジェクト521の生成時において、例えば、当該オブジェクトのコンストラクタ内で、読取フィルタ301の規定値としての動作条件が読取条件オブジェクト521の属性値として設定される。続いて、アプリケーションロジック具象410Cは、コピー蓄積条件オブジェクト421に対して読取条件オブジェクト521を「利用するフィルタ」として追加する(S108)。これにより、コピー蓄積条件オブジェクト421と読取条件オブジェクト521との間に関連r3(図6参照)が形成される。続いて、アプリケーションロジック具象410Cは、コピー蓄積条件オブジェクト421に対して読取条件オブジェクト521が「機能有効なフィルタ(実際に利用されるフィルタ)」で有るか否かについて登録する。読取条件オブジェクト521が「機能有効なフィルタ」である場合、コピー蓄積条件オブジェクト421と読取条件オブジェクト521との間に関連r4(図6参照)が形成される。なお、読取条件オブジェクト521が「機能有効なフィルタ」であるか否かは、アプリケーションロジック具象410Cに定義されており、ここでは、「機能有効なフィルタ」として登録される。
続いて、ステップS113〜S119においては、文書加工フィルタ311及び印刷フィルタ321のフィルタロジックに対して、ステップS105〜S109において説明した処理と同様の処理が実行される。これにより、加工A条件オブジェクト522及び印刷オブジェクト条件オブジェクト523が生成され、これらのフィルタ条件オブジェクトとコピー蓄積条件オブジェクト421との間に関連が形成される。
続いて、アプリケーションロジック具象410Cは、コピー蓄積条件オブジェクト421により、「利用するフィルタ」として関連付けられているフィルタ条件オブジェクトの一覧(以下、「フィルタ条件一覧」という。)を取得する(S120、S121)。続いて、アプリケーションロジック具象410Cは、フィルタ条件一覧に含まれている各フィルタ条件オブジェクト(読取条件オブジェクト521、加工A条件オブジェクト522、及び印刷条件オブジェクト523)に対して、状態通知先を設定する(S122〜S124)。
続いて、アプリケーションロジック具象410Cは、読取条件オブジェクト521を「前段のフィルタ」とし、加工A条件オブジェクト522を「後段のフィルタ」とする機能コネクタオブジェクト(図15におけるフィルタ接続オブジェクト441)をコピー蓄積条件オブジェクト421に追加(登録)する(S125)。続いて、アプリケーションロジック具象410Cは、加工A条件オブジェクト522を「前段のフィルタ」とし、印刷条件オブジェクト523を「後段のフィルタ」とする機能コネクタオブジェクト(図15におけるフィルタ接続オブジェクト442)をコピー蓄積条件オブジェクト421に追加(登録)する(S126)。これにより、各機能コネクタオブジェクトとコピー蓄積条件オブジェクト421との間の関連が形成される。なお、図中では、便宜上、機能コネクタオブジェクトのインスタンス化と、機能コネクタオブジェクトに対する「前段のフィルタ」としてのフィルタ条件オブジェクトの登録、及び「後段のフィルタ」としてのフィルタ条件オブジェクトの登録についてのステップは、省略されているが、これらの処理もアプリケーションロジック具象410Cによって実行される。
以上で、図15に示される条件ツリーの生成が完了する。条件ツリーが生成されると、アプリケーションロジック具象410Cは、コピー蓄積条件オブジェクト421をアプリケーションロジックF/W410Fに返却する(S127)。続いて、アプリケーションロジックF/W410Fは、優先度を引数として「リクエスト」の生成をリクエスト管理部22に要求する(S128)。ここで、優先度とは、実行対象とされている文書操作ジョブの優先度をいい、例えば、ユーザによって設定される。また、リクエストとは、当該文書操作ジョブの実行要求を表現する情報をいう。
リクエスト管理部22は、リクエストの生成要求に応じ、当該リクエストを表現するリクエストオブジェクト2201を生成し(S129)、当該リクエストオブジェクト2201をアプリケーションロジックF/W410Fに返却する(S130)。続いて、アプリケーションロジックF/W410Fは、リクエストオブジェクト2201にコピー蓄積条件オブジェクト421を登録する(S131)。続いて、アプリケーションロジックF/W410Fは、コピー蓄積条件オブジェクト421(すなわち、文書操作ジョブの動作条件)をアクティビティUI32aに返却する(S132)。
アクティビティUI32aは、コピー蓄積条件オブジェクト421に基づいて把握される条件ツリーに基づいて、初期状態として規定値の動作条件が表示されるUIコンテンツ作成し、当該UIコンテンツをローカルUI部12に返却する(S134)。
ローカルUI部12は、UIコンテンツに基づいて、コピー蓄積機能の設定画面を複合機1のオペレーションパネルに表示させる。この時点においては、コピー蓄積機能の規定値としての動作条件(条件ツリー)が生成された状態となっている。したがって、この後、設定画面を介して動作条件の変更が行われると、それに応じて条件ツリーの変更が行われる。
なお、図9の残り部分の条件についてもほぼ同様の処理手順によって生成される。
また、規定値としての条件ツリーの構成は、アプリケーションロジック具象410Cに直接定義(ハードコーディング)されていてもよいし、例えば、編集可能なファイル内において、所定の形式(例えば、XML(eXtensible Markup Language)形式)によって定義されていてもよい。後者の場合、ファイル内の定義情報に基づいて、アプリケーションロジック具象410Cによって条件ツリーが構成されるため、ソースコードを変更せずに規定値としての条件ツリーの構成の変更が可能となる。
次に、条件ツリーに基づいてジョブツリーを生成し、ジョブツリーに基づいてジョブを実行する処理について説明する。図16及び図17は、ジョブツリーの生成及びジョブの実行処理を説明するためのシーケンス図である。図16及び図17においてもコピー蓄積機能を例として説明する。図16及び図17において、図9、図10、又は図13と同一部分には同一符号を付している。なお、図16及び図17において、便宜上、文書加工フィルタ311、印刷フィルタ321として表現されている矩形は、それぞれのフィルタのフィルタロジックオブジェクト及びフィルタジョブオブジェクトの双方を示す。
オペレーションパネルにおいてスタートボタンが押下されると、ローカルUI部12は、スタートボタンが押されたことをUIコンテンツ1201に通知する(S201)。UIコンテンツ1201には、UIコンテンツ1201に基づいて表示されるボタン等の表示部品やスタートボタンが操作された際の処理が定義されている。したがって、UIコンテンツ1201は、当該定義に従ってコピーアクティビティ31aのコピー蓄積機能の文書操作ジョブの実行をリクエスト管理部22に要求する(S202)。この際、状態通知先としてUIコンテンツ1201が指定される。
続いて、リクエスト管理部22は、操作者によるコピー蓄積機能の操作権限の有無を権限判断部61に問い合わせる(S203)。権限判断部61は、ポリシーデータに基づいて、操作権限の判断を行うソフトウェアである。権限判断部61は、複合機1の内部に存在してもよいし、複合機1とネットワークを介して接続するコンピュータ(例えば、セキュリティサーバ)内に存在してもよい。権限判断部61より返信される判断結果において(S204)、権限が認められている場合には、以降の処理が継続される。
続いて、リクエスト管理部22は、権限判断部61からの判断結果において指定されている責務に関する処理を実行する(S205)。ここで、責務とは、権限が認められる代わりに課される条件をいう。例えば、ログの記録等が代表的な例である。続いて、リクエスト管理部22は、ジョブツリーの生成を開始する(S206)。ステップS207〜S254までは、ジョブツリーの生成処理に関する。
まず、リクエスト管理部22は、リクエストオブジェクト2201に登録されているコピー蓄積条件オブジェクト421のフレームワーク部であるコピー蓄積条件F/W421Fより、コピー蓄積機能のアプリケーション名を取得する(S207、S208)。アプリケーション名は、各アクティビティ31の機能を識別する名前である。続いて、アプリケーション名に基づいて、コピー蓄積機能に対応するアプリケーションロジックオブジェクトを取得する(S209)。なお、各アクティビティ31に対応するアプリケーションロジックオブジェクトは、リクエスト管理部22がアクセス可能なメモリ領域において管理されている。
続いて、リクエスト管理部22は、取得されたアプリケーションロジックオブジェクトのアプリケーションロジックF/W410Fに対して、ジョブ(ジョブツリー)の生成を要求する(S210)。アプリケーションロジックF/W410Fは、アプリケーションロジック具象410Cに対して設定された動作条件(条件ツリー)に応じた権限情報(利用する機能や資源に関する情報)の作成を要求する(S211)。アプリケーションロジック具象410Cは、権限情報を作成し、アプリケーションロジックF/W410Fに返却する(S212)。
続いて、アプリケーションロジックF/W410Fは、権限情報に基づいて、動作条件に応じた権限の有無を権限判断部61に問い合わせる(S213)。権限判断部61より権限の判断結果が返信されると(S214)、アプリケーションロジックF/W410Fは、判断結果に指定されている責務に関する処理を実行する(S215)。続いて、アプリケーションロジックF/W410Fは、アプリケーションロジック具象410Cに対し、コピー蓄積機能に対応する文書操作ジョブオブジェクトの生成を要求する(S216)。アプリケーションロジック具象410Cは、コピー蓄積機能に対応する文書操作ジョブオブジェクトとして、コピー蓄積ジョブオブジェクト431を生成し、当該オブジェクトをアプリケーションロジックF/W410Fに返却する(S217)。なお、コピー蓄積オブジェクト431は、フレームワーク部である文書操作ジョブクラス430を継承したサブクラスのインスタンスである。図16において、コピー蓄積ジョブF/W431Fは、コピー蓄積ジョブオブジェクト431に関する実装のうち、フレームワーク部分である文書操作ジョブクラス430において実装されている部分を示す。また、コピー蓄積ジョブ具象431Cは、コピー蓄積ジョブオブジェクト431の実装のうち、サブクラスにおいて実装されている部分を示す。
続いて、アプリケーションロジックF/W410Fは、生成されたコピー蓄積ジョブオブジェクト431をリクエスト管理部22に返却する(S218)。なお、この時点では、ジョブツリーのうち、ルート部分のみが生成された状態である。
続いて、リクエスト管理部22は、コピー蓄積条件F/W421Fに対してフィルタ条件オブジェクトの一覧(フィルタ条件一覧)の取得を要求する(S219)。コピー蓄積条件F/W421Fは、条件ツリーにおいて、コピー蓄積条件オブジェクト421に関連付けられているフィルタ条件オブジェクトの一覧を返却する(S220)。
続いて、リクエスト管理部22は、フィルタ条件一覧に含まれる一つのフィルタ条件オブジェクトを処理対象とし(ここでは、読取条件オブジェクト521が処理対象にされたこととする。)、読取条件オブジェクト521よりフィルタ名を取得する(S221、S222)。フィルタ名は、各フィルタを識別するための名前である。続いて、リクエスト管理部22は、取得されたフィルタ名に基づいて、フィルタ管理部33に対してフィルタ(厳密には、フィルタロジックオブジェクト)の検索を要求する(S223)。フィルタ管理部33は、管理しているフィルタの一覧の中から、検索対象のフィルタ名と一致するフィルタ名を有するフィルタを検索し、当該フィルタのフィルタロジックオブジェクト(ここでは、読取ロジックオブジェクト511)を返却する(S224)。続いて、リクエスト管理部22は、読取ロジックオブジェクト511に対して、当該フィルタ(読取フィルタ301)のフィルタジョブオブジェクの生成を要求する(S225)。読取ロジックオブジェクト511は、読取ジョブオブジェクト531を生成し(S226)、当該読取ジョブオブジェクト531をリクエスト管理部22に返却する(S227)。なお、ステップS221〜S226までの処理は、図12(A)に示される内容を実現するものである。
続いて、リクエスト管理部22は、読取ジョブオブジェクト531に対し、対応するフィルタ条件オブジェクト(読取条件オブジェクト521)を登録する(S228)。続いて、リクエスト管理22は、読取条件オブジェクト521と、それに基づいて生成された読取ジョブオブジェクト531との対応関係を示す情報(対応情報)を記憶装置に記録(保存)しておく(S229)。
なお、ステップS221〜S239は、ステップS220において取得されるフィルタ条件一覧に含まれる各フィルタ条件オブジェクト(すなわち、条件ツリーを構成する各フィルタ条件オブジェクト)に関して実行される(loop1)。その結果、ジョブツリーを構成する各フィルタジョブオブジェクト(例えば、図16では省略されている加工Aジョブオブジェクト532、印刷ジョブオブジェクト533等)が生成され、それぞれに対応するフィルタロジックオブジェクトに登録される。また、ステップS229の処理によって、図18に示されるような情報が記憶装置に記録される。
図18は、フィルタ条件オブジェクトとフィルタジョブオブジェクトとの対応情報を示す図である。図18に示される対応情報2202では、フィルタ条件オブジェクトごとに対応するフィルタ条件オブジェクトが表形式によって示されている。図18の例では、読取条件オブジェクト521に読取ジョブオブジェクト531が対応し、加工A条件オブジェクト522に加工Aジョブオブジェクト532が対応し、印刷条件オブジェクト523に印刷ジョブオブジェクト533が対応し、加工B条件オブジェクト524に加工Bジョブオブジェクト534が対応し、保管条件オブジェクト525に保管ジョブオブジェクト535が対応することが示されている。
対応情報2202は、具体的には、例えば、各オブジェクトの参照情報(ポインタ等)や識別情報(ID等)の対応関係を保持することによって構成するようにしてもよい。
なお、以下において、フィルタ条件オブジェクトとフィルタジョブオブジェクトとの関係において、「対応する」という言葉を用いるとき、その対応関係は、対応情報2202に基づいて特定される対応関係を意味する。したがって、フィルタ条件オブジェクトに"対応する"フィルタジョブオブジェクトとは、当該フィルタ条件オブジェクトに基づいて生成されたフィルタジョブオブジェクトを意味し、ひいては、当該フィルタ条件オブジェクトと同じフィルタに係るフィルタジョブオブジェクトを意味する。
続いて、リクエスト管理部22は、コピー蓄積条件F/W421Fに対して、機能コネクタオブジェクトの一覧の取得を要求する(図17:S240)。コピー蓄積条件F/W421Fは、条件ツリーにおいてコピー蓄積条件オブジェクト421に関連付けられている機能コネクタオブジェクトの一覧(機能コネクタ一覧)を返却する(S241)。
続いて、リクエスト管理部22は、機能コネクタ一覧に含まれる一つの機能コネクタオブジェクト440Fを処理対象とし(以下、処理対象とされた機能コネクタオブジェクトを「カレント機能コネクタオブジェクト」という。)、カレント機能コネクタオブジェクトに対して「前段のフィルタ」の取得を要求する(S242)。カレント機能コネクタオブジェクトは、「前段のフィルタ」として自らに関連付けられているフィルタ条件オブジェクトを返却する(S243)。続いて、リクエスト管理部22は、カレント機能コネクタオブジェクトに対して「後段のフィルタ」の取得を要求する(S244)。カレント機能コネクタオブジェクトは、「後段のフィルタ」として自らに関連付けられているフィルタ条件オブジェクトを返却する(S245)。例えば、カレント機能コネクタオブジェクトが、フィルタ接続オブジェクト441である場合(図9又は図15参照)、「前段のフィルタ」として読取条件フィルタ521が、「後段のフィルタ」として加工A条件オブジェクト522が取得される。
続いて、リクエスト管理部22は、「前段のフィルタ」に係るフィルタ条件オブジェクトと、「後段のフィルタ」に係るフィルタ条件オブジェクトとを指定して、その組み合わせに対応するパイプの取得をパイプ管理部43に要求する(S246)。パイプ管理部43は、指定された「前段のフィルタ」と「後段のフィルタ」との組み合わせに基づいて対応するパイプを判定する。すなわち、パイプの実体はメモリ(HDD(Hard Disk Drive)も含む)であるが、パイプの両端のフィルタに応じて利用するメモリの種類が異なる。その対応関係は、例えば、図19に示されるように複合機1のHDD内に予め定義されている。
図19は、フィルタとパイプの対応テーブルの例を示す図である。図19に示される対応テーブル60には、「前段のフィルタ」と「後段のフィルタ」との組み合わせに応じて両者を接続するパイプが定義されている。例えば、読取フィルタ301と印刷フィルタ321や、文書変換フィルタ312と印刷フィルタ321は、DMA(Direct Memory Access)パイプによって接続され、高速にデータが転送される。また、PC文書受信フィルタ305と文書変換フィルタ312とは、スプールパイプによって接続される。スプールパイプとは、HDDを用いるパイプであり、左側のフィルタから出力されたデータは、右側のフィルタが読み出すまでHDDにスプール(保存)される。それ以外のフィルタ間は、汎用メモリパイプによって接続される。汎用メモリパイプとは、有限サイズのRAMバッファによってデータ転送を行うパイプである。図19に示される対応テーブル60は、フィルタやパイプの拡張(追加)や削除等に応じて編集可能である。なお、図1における画像パイプ41は、上記の各種のパイプへのインタフェースを提供するモジュールを抽象的に表現したものである。
したがって、パイプ管理部43は、対応テーブル60に基づいて、指定された二つのフィルタを接続するパイプを判定し、当該パイプに対応する画像パイプ41をリクエスト管理部22に返却する(S247)。
続いて、リクエスト管理部22は、返却された画像パイプ41に対し、当該画像パイプ41のジョブの制御するためのパイプジョブオブジェクトの生成を要求すると(S248)、画像パイプ41は、パイプジョブオブジェクトを生成し、返却する(S249)。
続いて、リクエスト管理部22は、「前段のフィルタ」のフィルタジョブオブジェクト(読取ジョブオブジェクト531)と当該パイプジョブオブジェクトとを指定して、当該フィルタジョブオブジェクトに対し当該パイプジョブオブジェクトを出力側のパイプとして(「データシンク」として)登録するよう「前段のフィルタ」のフィルタロジックオブジェクト(ここでは、読取ロジックオブジェクト511)に要求する(S250)。当該要求に応じ、読取ロジックオブジェクト511は、読取ジョブオブジェクト531に対し、当該パイプオブジェクトを「データシンク」として関連付ける。これにより、読取ジョブオブジェクト531と当該パイプオブジェクトとの間に関連r13(図6参照)が形成される。
続いて、リクエスト管理部22は、「後段のフィルタ」のフィルタジョブオブジェクト(加工Aジョブオブジェクト531)と当該パイプジョブオブジェクトとを指定して、当該フィルタジョブオブジェクトに対し当該パイプジョブオブジェクトを入力側のパイプとして(「データソース」として)登録するよう「後段のフィルタ」のフィルタロジックオブジェクト(ここでは、加工Aロジックオブジェクト512)に要求する(S251)。当該要求に応じ、加工Aロジックオブジェクト512は、加工Aジョブオブジェクト532に対し、当該パイプオブジェクトを「データソース」として関連付ける。これにより、加工Aジョブオブジェクト513と当該パイプオブジェクトとの間に関連r13(図6参照)が形成される。
なお、ステップS242〜S251は、ステップS241において取得される機能コネクタ一覧に含まれる各機能コネクタオブジェクト(すなわち、条件ツリーを構成する各機能コネクタオブジェクト)に関して実行される(loop2)。その結果、ジョブツリーを構成する各フィルタジョブオブジェクトとパイプジョブオブジェクトとの間に関連r12及び関連r13が形成される(すなわち、各フィルタジョブオブジェクトが適切なパイプオブジェクトによって接続される)。
続いて、リクエスト管理部22は、フィルタ条件一覧に含まれる一つのフィルタ条件オブジェクト(例えば、読取条件オブジェクト521)を指定して、当該フィルタ条件オブジェクトに対応するフィルタロジックオブジェクト(例えば、読取ロジックオブジェクト511)に対し、当該フィルタ条件オブジェクトが有効であるか否かを問い合わせる(S252)。フィルタロジックオブジェクトは、指定されたフィルタ条件オブジェクトが、「機能有効なフィルタ」として文書操作オブジェクトに関連付けられている場合は、当該フィルタ条件オブジェクトは有効であると判定し、関連付けられていない場合は、当該フィルタ条件オブジェクオクトは無効であると判定し、その判定結果をリクエスト管理部22に返却する(S253)。
リクエスト管理部22は、当該フィルタ条件オブジェクトが有効であった場合は、当該フィルタ条件オブジェクトに対応するフィルタジョブオブジェクト(例えば、当該フィルタ条件オブジェクトが読取条件オブジェクト521である場合は読取ジョブオブジェクト531)をコピー蓄積ジョブF/W431Fに登録する(S254)。
なお、ステップS252〜S254は、フィルタ条件一覧に含まれる各フィルタ条件オブジェクトに関して実行される(loop3)。その結果、有効なフィルタ条件オブジェクトに対応するフィルタジョブオブジェクトとコピー蓄積ジョブオブジェクト431との間に関連r7が形成される。
続いて、実行対象とされているアクティビティ31の機能が多出力の場合、リクエスト管理部22の制御によって出力順の設定がジョブツリーに反映される(S255)。続いて、リクエスト管理部22の制御により、出力系ジョブ(出力フィルタのフィルタジョブ)のうち、最初に実行するジョブ(文書操作ジョブの実行の開始に応じて最初に実行開始の指示対象とされるフィルタジョブ)の選別が行われる(S256)。なお、ステップS255及びS256の詳細については後述する。
この時点で、ジョブツリーの生成が完了する。
続いて、リクエスト管理部22は、リクエストオブジェクト2201に対して、生成されたジョブツリーのルートである文書操作ジョブオブジェクト(コピー蓄積ジョブオブジェクト431)を登録する(S257)。続いて、リクエスト管理部22は、ジョブ状態の通知先をコピー蓄積ジョブF/W431Fに登録する(S258)。ここでは、ジョブ状態の通知先として、リクエストオブジェクト2201が登録される。
続いて、リクエスト管理部22は、リクエストオブジェクト2201に対して登録されているジョブの実行を指示する(S259)。リクエストオブジェクト2201は、登録されているコピー蓄積ジョブオブジェクト431のコピー蓄積ジョブF/W431Fに対してジョブの実行を要求する(S260)。コピー蓄積ジョブF/W431Fは、コピー蓄積ジョブ具象431Cに対してジョブの実行を要求する(S261)。ここで、コピー蓄積ジョブ具象431Cは、ジョブツリーを構成する各フィルタジョブオブジェクトに対してジョブの実行を要求するが、この点については後述する。
その後、各フィルタにおいてジョブが完了すると、それぞれのフィルタのフィルタジョブオブジェクトよりジョブの完了がコピー蓄積ジョブF/W431Fに通知される(S262、S263、S264)。フィルタジョブの実行を要求した全てのフィルタジョブオブジェクトよりジョブの完了が通知されると、コピー蓄積ジョブF/W431Fは、文書操作ジョブの完了をリクエストオブジェクト2201とUIコンテンツ1201のそれぞれに通知する(S265、S266)。当該通知に応じ、例えば、UIコンテンツ1201は、文書操作ジョブが終了した旨を示す画面をオペレーションパネルに表示させる。
続いて、図17のステップS255において実行される処理の詳細について説明する。図20は、リクエスト管理部による多出力の場合のジョブツリーに対する出力順の設定処理を説明するためのフローチャートである。
ステップS301において、条件ツリーを参照し、出力順の設定の有無を判定する。条件ツリーにおいて、「出力順」を管理する機能コネクタオブジェクト(すなわち、関連r2(図6参照)に係る機能コネクタオブジェクト。図9の例では出力順オブジェクト445が相当する。)が一つでも存在する場合は、出力順の設定は有ると判定される。当該機能コネクタオブジェクトが存在しない場合は、出力順の設定は無いと判定される。
出力順の設定が有る場合(S301でYES)、「出力順」を管理する機能コネクタオブジェクトの一覧(以下、「出力順設定リスト」という。)を条件ツリーより取得する(S302)。続いて、出力順設定リストより一つの機能コネクタオブジェクト(出力順設定)を取り出す(S303)。ここで、取り出された機能コネクタオブジェクトを、以下「カレント機能コネクタオブジェクト」という。続いて、カレント機能コネクタオブジェクトに対応するジョブ開始トリガオブジェクトを生成する(S304)。ここで生成されたジョブ開始トリガオブジェクトを、以下「カレントジョブ開始トリガオブジェクト」という。
続いて、カレント機能コネクタオブジェクトに対して「前段のフィルタ」として関連付けられているフィルタ条件オブジェクト(以下、「前段フィルタ条件オブジェクト」という。)をカレント機能コネクタオブジェクトより取得する(S305)。続いて、前段フィルタ条件オブジェクトに対応するフィルタジョブオブジェクトをカレントジョブ開始トリガにイベント待ち対象として関連付け(S306)、待ちイベントは終了イベントであることをカレントジョブ開始トリガオブジェクトにセットする(S307)。これにより、これにより、カレントジョブ開始トリガと当該フィルタジョブオブジェクトとの間に関連r9(図6参照)が形成される。
続いて、カレント機能コネクタオブジェクトに対して「後段のフィルタ」として関連付けられているフィルタ条件オブジェクト(以下、「後段フィルタ条件オブジェクト」という。)をカレント機能コネクタオブジェクトより取得する(S308)。続いて、後段フィルタ条件オブジェクトに対応するフィルタジョブオブジェクトを「ジョブ開始指示対象」として関連付ける(S309)。これにより、これにより、カレントジョブ開始トリガと当該フィルタジョブオブジェクトとの間に関連r10(図6参照)が形成される。
なお、ステップS304〜S309の処理は、図12(D)に示される内容を実現するものである。また、ジョブ開始トリガオブジェクトには、「終了イベント待ち」としてのフィルタジョブオブジェクトと、「ジョブ開始指示対象」としてのフィルタジョブオブジェクトとを複数関連付けることが可能である。
ステップS303〜S309の処理が出力順設定リストに含まれる全ての機能コネクタオブジェクトに対して実行されると(S310でYES)、図20の処理は終了する。なお、ステップS301において、出力順の設定は無いと判定された場合(S301でNO)、ステップS302以降の処理は実行されない。
続いて、図17のステップS256において実行される処理の詳細について説明する。図21は、リクエスト管理部による最初に実行される出力系のフィルタジョブの選別処理を説明するためのフローチャートである。
ステップS351において、条件ツリーを参照し、出力順の設定の有無を判定する。この処理は、図20のステップS301と同様である。出力順の設定が有る場合(S351でYES)、「出力順」を管理する機能コネクタオブジェクトの一覧(出力順設定リスト)を条件ツリーより取得する(S352)。続いて、出力順設定リストより一つの機能コネクタオブジェクト(出力順設定)を取り出す(S353)。ここで、取り出された機能コネクタオブジェクトを、以下「カレント機能コネクタオブジェクト」という。続いて、カレント機能コネクタオブジェクトに対して「後段のフィルタ」として関連付けられているフィルタ条件オブジェクト(以下、「後段フィルタ条件オブジェクト」という。)をカレント機能コネクタオブジェクトより取得する(S354)。続いて、後段フィルタ条件オブジェクトを除外リストに追加する(S355)。
ここで、除外リストとは、最初の実行対象から除外される出力フィルタに関するフィルタ条件オブジェクトを後述の処理のために保持しておくためのリストである。本実施の形態の複合機1では、出力順において後に実行される出力フィルタは、最初の実行対象とはされない。したがって、後段フィルタ条件オブジェクトは除外リストに登録される。
ステップS303〜S309の処理が出力順設定リストに含まれる全ての機能コネクタオブジェクトに対して実行されると(S356でYES)、ステップS357に進む。
また、ステップS351において、出力順の設定は無いと判定された場合は(S351でNO)、ステップS352〜S356の処理は実行されずにステップS357に進む。
ステップS357以降では、条件ツリーの構成するフィルタ条件オブジェクトの中で、出力フィルタのフィルタ条件オブジェクトを全て探索し、探索されたフィルタ条件オブジェクトから除外リストに含まれているフィルタ条件オブジェクトを除外することで、最初に実行される出力フィルタジョブを特定している。
ステップS357において、「フィルタ接続」を管理する機能コネクタオブジェクト(すなわち、関連r1(図6参照)に係る機能コネクタオブジェクト。図9の例ではフィルタ接続オブジェクト441〜444が相当する。)の一覧(以下「フィルタ接続情報リスト」という。)を条件ツリーより取得する。続いて、フィルタ接続情報リストより一つの機能コネクタオブジェクト(フィルタ接続情報)を取り出す(S358)。ここで、取り出された機能コネクタオブジェクトを、以下「機能コネクタオブジェクトA」という。続いて、機能コネクタオブジェクトAに対して「後段のフィルタ」として関連付けられているフィルタ条件オブジェクト(以下、「A後段フィルタ条件オブジェクト」という。)を機能コネクタオブジェクトAより取得する(S359)。
続いて、出力フィルタのフィルタ条件オブジェクトの探索に用いるフラグ変数(FOUND変数)にFALSEを代入することにより初期化する(S360)。続いて、フィルタ接続情報リストより、機能コネクタオブジェクトAの次の機能コネクタオブジェクトを取り出す。ここで取り出された機能コネクタオブジェクトを、以下「機能コネクタオブジェクトB」という。続いて、機能コネクタオブジェクトBに対して「前段のフィルタ」として関連付けられているフィルタ条件オブジェクト(以下、「B前段フィルタ条件オブジェクト」という。)を機能コネクタオブジェクトBより取得する(S362)。
続いて、A後段オブジェクトとB前段オブジェクトとが同一か否かを判定する(S363)。同一である場合、A後段オブジェクトは、出力フィルタのフィルタ条件オブジェクトではないため、FOUND変数にTRUEを代入し(S364)、ステップS367に進む。一方、A後段オブジェクトとB前段オブジェクトとが同一では無い場合、フィルタ接続情報リストにおいて、機能コネクタオブジェクトA以外で機能コネクタオブジェクトBとして処理対象とされていない機能コネクタオブジェクト(未処理の機能コネクタオブジェクト)が存在するか否かを判定する(S365)。未処理の機能コネクタオブジェクトが存在する場合(S365でNO)、ステップS360に戻る。未処理の機能コネクタオブジェクトが存在しない場合(S365でYES)、ステップS367に進む。
ステップS367に進む段階で、A後段オブジェクトと同一のB前段オブジェクトが存在した場合は、FOUND変数の値はTRUEであり、A後段オブジェクトと同一のB前段オブジェクトが存在しなかった場合は、FOUND変数の値はFALSEである。FOUNDの値がTRUEであるということは、A後段オブジェクトは出力フィルタのフィルタ条件オブジェクトではないということになる。一方、FOUND変数の値がFALSEであるということは、A後段オブジェクトは出力フィルタのフィルタ条件オブジェクトであるということになる。
この点について、図9(B)の条件ツリーを用いて具体的に説明する。当該条件ツリーでは、印刷条件オブジェクト523及び保管条件オブジェクト525が出力フィルタのフィルタ条件オブジェクトである。この二つのフィルタ条件オブジェクトには、当該オブジェクトを「後段のフィルタ」とする機能コネクタオブジェクトは存在するが、当該オブジェクトを「前段のフィルタ」とする機能コネクタオブジェクトは存在しない。一方、出力フィルタ以外のフィルタのフィルタ条件オブジェクトには、当該オブジェクトを「前段のフィルタ」とする機能コネクタオブジェクトと、当該オブジェクトを「後段のフィルタ」とする機能コネクタオブジェクトとが存在する。ステップS360〜S365では、条件ツリーの斯かる特性に基づいて、A後段オブジェクトが出力フィルタの機能コネクタオブジェクトであるか否かを特定しているのである。したがって、FOUNDの値がFALSEの場合、A後段オブジェクトは出力フィルタのフィルタ条件オブジェクトであると判定できる。
続いて、ステップS367においてFOUND変数の値がTRUEであるか否か(すなわち、A後段オブジェクトが出力フィルタのフィルタ条件オブジェクトであるか否か)を判定する。FOUND変数の値がTRUEでない場合(A後段オブジェクトが出力フィルタのフィルタ条件オブジェクトである場合)(S367でYES)、A後段オブジェクトが除外リストに含まれているか否かを判定する(S368)。除外リストに含まれていない場合(S368でYes)、A後段オブジェクトに対応するフィルタジョブオブジェクトをジョブツリーの文書操作ジョブオブジェクト(例えば、図10におけるコピー蓄積ジョブオブジェクト431)に「最初に実行する出力系ジョブ」として関連付ける(S369)。これにより、文書操作オブジェクトと出力フィルタのフィルタジョブオブジェクトとの間に関連r8(図6参照)が形成される。
フィルタ接続情報リストに含まれている全ての機能コネクタオブジェクトが機能コネクタオブジェクトAとして処理されると(S370でYES)、図21の処理は終了する。なお、一つの文書操作ジョブオブジェクトには、「最初に実行する出力計ジョブ」として複数のフィルタジョブオブジェクトが関連付けられ得る。
次に、図17におけるステップS261のジョブの実行要求に応じて実行される処理について説明する。図22及び図23は、フィルタジョブの実行処理を説明するためのシーケンス図である。図22及び図23中、図16、図17、図9、又は図10と同一部分には同一符号を付している。
コピー蓄積ジョブF/W431Fよりジョブの実行要求を受け付けると(S261)、コピー蓄積ジョブF/W431Fは、ジョブツリーを構成する各フィルタジョブオブジェクト(すなわち、コピー蓄積オブジェクト431との間に関連r7(図6参照)を有するフィルタジョブオブジェクト)に対して、ジョブの優先度の設定(S401)、ジョブグループの設定(S402)、制御モードの取得(S403、S404)、ジョブエントリの設定(S405)を行う。制御モードとは、他のフィルタジョブと同期をとる必要があるか並列的に実行可能かを示す情報をいう。ジョブエントリの設定は、当該ジョブをスケジュール管理下に置くことをいう。
各フィルタジョブオブジェクトは、当該フィルタのフィルタジョブの実行の可否を示す通知(実行可否通知)をコピー蓄積ジョブF/W431Fに対して行う(S406)。コピー蓄積ジョブF/W431Fは、各フィルタジョブオブジェクトより受けた実行可否通知の全てが実行可能であることを示していると、各フィルタオブジェクトに対してジョブの実行準備を要求する(S407)。各フィルタオブジェクトは、リソースの確保等の実行準備を行い、ジョブの実行準備の成否をコピー蓄積ジョブF/W431Fに通知する(S408)。全てのフィルタジョブオブジェクトが実行準備に成功すると、コピー蓄積ジョブF/W431Fは、各フィルタジョブオブジェクトに制御モードを設定する(S409)。ここで設定される制御モードは、ステップS404において各フィルタジョブオブジェクトより取得された制御モードに基づいて、コピー蓄積ジョブF/W431Fが、各フィルタジョブの整合性が図れるように調整した結果としての制御モードである。
なお、図中では、S401〜S409は、読取ジョブオブジェクト531に対してのみ実行されるように示されているが、上記の説明の通り、ジョブツリーを構成する各フィルタジョブに対して行われる。
続いて、コピー蓄積ジョブF/W431Fは、コピー蓄積機能の文書操作ジョブの実行を開始する(S410)。すなわち、コピー蓄積ジョブF/W431Fは、各フィルタジョブオブジェクトに対し、それぞれのフィルタジョブの実行開始を指示する(S411、S412、S413)。ここで、入力フィルタ、変換フィルタ、出力フィルタを問わず、フィルタ間の接続関係における前のフィルタの実行の完了を待たずに各フィルタジョブオブジェクトに対して並列的に実行開始が指示される。但し、出力フィルタのフィルタジョブオブジェクトに関しては、コピー蓄積ジョブオブジェクト431に対して「最初に実行する出力系ジョブ」として登録されているもの(関連r8(図6参照)を有するもの)のみが実行開始の指示対象とされる。したがって、例えば、図9の例では、保管ジョブオブジェクト535には、この時点ではジョブの実行開始は指示されない。なお、「最初に実行する出力系ジョブ」として登録されているフィルタジョブオブジェクトが複数有る場合、複数のフィルタジョブオブジェクトが、この時点で実行開始指示の対象とされる。
実行開始を指示されたフィルタジョブオブジェクトは、当該フィルタジョブの実行を制御する。制御モードとして、同期モード(前のフィルタの実行の完了後に自らのジョブの実行を開始するモード)が設定されている場合、フィルタは自分の入力側のパイプにデータが入力されるまで待機する。この場合、前のフィルタがジョブの実行結果としての画像データをパイプに出力すると、当該フィルタは自らのジョブの実行を開始する。すなわち、フィルタ間の同期はパイプによってとられる。但し、入力フィルタには、入力側にパイプは存在しない。したがって、入力フィルタは実行開始指示に応じて処理を開始する。
その後、各フィルタジョブオブジェクトは、ジョブの状態が変化すると、変化後のジョブの状態(ジョブの終了や中断等)を示すイベントを「状態通知先」として関連付けられているコピー蓄積ジョブF/W431Fとジョブ開始トリガオブジェクト451とに通知する(図23:S421、S422、S425、S426、S429、S430)。
コピー蓄積ジョブF/W431Fは、各フィルタジョブオブジェクトより通知されるイベントの内容に応じた処理を実行する(S423、S427、S431)。また、ジョブ開始トリガオブジェクト451も、通知されたイベントの内容に応じた処理を実行する(S424、S428、S432)。特に、実行対象とされているアクティビティ31(機能)が多出力の場合、ジョブ開始トリガオブジェクト451は、「終了イベント待ち」として関連r9(図6参照)によって関連付けられているフィルタジョブオブジェクト(すなわち、先に実行される出力フィルタのフィルタジョブオブジェクト。コピー蓄積機能では印刷ジョブオブジェクト533が相当する。)から終了イベントが通知されると、「ジョブ開始指示対象」として関連r10(図6参照)によって付けられているフィルタジョブオブジェクト(すなわち、後に実行される出力フィルタのフィルタオブジェクト。コピー蓄積機能では保管ジョブオブジェクト535が相当する。)に対して、ジョブの実行開始を指示する(S433)。
このように、「最初に実行する出力系ジョブ」の対象から除外された出力フィルタに対しては、先に実行されるべき出力フィルタのフィルタジョブの実行の完了に応じ、ジョブ開始トリガオブジェクト450よりジョブの実行開始が指示される。これによって、多出力の場合であっても、適切に出力順が制御される。本実施の形態におけるコピー蓄積機能であれば、印刷フィルタ321による印刷の完了後に、保管文書登録フィルタ322によるデータ保存が行われる。
「最初に実行する出力系ジョブ」でないフィルタジョブオブジェクトも、ジョブの実行開始の指示元が異なるだけであり、ジョブの実行の開始後の振る舞いは他のフィルタジョブオブジェクトと同様である。したがって、ジョブの状態が変化すると、変化後のジョブの状態を示すイベントを「状態通知先」として関連付けられているコピー蓄積ジョブF/W431Fに通知する(S434)。コピー蓄積ジョブF/W431Fは、当該フィルタジョブオブジェクトより通知されるイベントの内容に応じた処理を実行する(S435)。
全てのフィルタジョブオブジェクトよりジョブの終了イベントが通知されると、コピー蓄積ジョブF/W431Fは、コピー蓄積機能の文書操作ジョブの終了をリクエストオブジェクト2201及びUIコンテンツ1201に通知する(S436、S437)。
続いて、図23のステップS423、S427、S431、及びS435等において、コピー蓄積ジョブF/W431F(文書操作ジョブオブジェクト)によって実行される処理について説明する。図24は、文書操作ジョブオブジェクトによるイベント処理の処理手順を説明するためのフローチャートである。
ステップS501において、フィルタジョブオブジェクトよりイベントを受信する。続いて、イベントがフィルタジョブの終了イベントであるか否かを判定する(S502)。終了イベントである場合(S502でYES)、イベントの送信元のフィルタジョブオブジェクトのフィルタジョブが終了したこと(ジョブの終了記録)を記憶装置上のジョブ終了チェックリストに追加記録しておく(S503)。続いて、ジョブ終了チェックリストに記録されている全てのフィルタジョブの終了記録を読み出し(S504)、ジョブツリーを構成する全てのフィルタジョブオブジェクトのジョブ(フィルタジョブ)が終了したか否かを判定する(S505)。全てのフィルタジョブが終了した場合(S505でYES)、文書操作ジョブが終了したこと状態通知先(図23の例では、リクエストオブジェクト2201及びUIコンテンツ1201)に通知する(S506)。全てのフィルタジョブが終了していない場合(S505でNO)、文書操作ジョブの終了通知は実行しないで図24の処理を終了する。なお、受信したイベントが終了イベントではない場合(S502でNO)、当該イベントに応じた処理を実行する(S507)。
続いて、図27のステップS507における他のイベント処理の一例として、フィルタジョブの中断イベントを受信した際の文書操作ジョブオブジェクトによる処理について説明する。図25は、中断イベントを受信した際の文書操作ジョブオブジェクトによるイベント処理の処理手順を説明するためのフローチャートである。
ステップS521において、フィルタジョブオブジェクトよりイベントを受信する。続いて、イベントがジョブの中断イベントであるか否かを判定する(S522)。中断イベントである場合(S522でYES)、中断の原因は入力側のパイプへのデータの入力待ちであるか否かを、中断イベントに含まれている中断の原因を示す情報に基づいて判定する(S523)。中断の原因が入力側のパイプへのデータの入力待ちである場合(S523でYES)、リソースの開放可否判断及び文書操作ジョブの中断状態への移行処理を実行し(S524)、図25の処理を終了する。なお、ステップS524の詳細については後述する。
中断の原因が入力側のパイプへのデータの入力待ちでない場合(S523でNO)、再開可能な中断であるか否かを、中断イベントに含まれている再開の可否を示す情報に基づいて判定する(S525)。再開が可能である場合(S525でYES)、中断イベントに含まれている情報に基づいて、再開の指示(フィルタジョブオブジェクトに対するフィルタジョブの再開指示)が必要な中断であるか否かを判定する(S526)。再開の指示が必要である場合(S526でYES)、中断イベントの送信元のフィルタジョブオブジェクトに対しては、再開指示が必要であることを中断の原因と共に記憶装置に記録しておく(S527)。再開の指示が必要でない場合は(S526でNO)、ステップS527は実行されない。続いて、文書操作ジョブオブジェクトは、中断状態に移行し(S528)、図25の処理を終了する。
一方、再開可能な中断ではないと判定した場合(S525でNO)、全てのフィルタジョブオブジェクトに対してジョブのキャンセルを指示し(S529)、図25の処理を終了する。
また、受信したイベントが中断イベントでない場合(S522でNO)、当該イベントに応じた処理を実行する(S530)。
続いて、図25のステップS524における処理の詳細について説明する。図26は、文書操作ジョブオブジェクトによるリソースの開放可否判断及び文書操作ジョブの中断状態への移行処理を説明するためのフローチャートである。
ステップS541において、変換フィルタ及び出力フィルタのフィルタジョブオブジェクトに対し、各フィルタジョブにおいて利用されているリソースの開放の可否を問い合わせる。ここで、リソースとは、例えば、メモリや、当該フィルタに特有の処理に関するハードウェア(例えば、プロッタ等)等が相当する。続いて、問い合わせの結果、全てのフィルタジョブのリソースが開放可能であるか否かを判定する(S542)。全てのフィルタジョブのリソースが開放可能である場合(S542でYES)、全てのフィルタジョブオブジェクトに対してフィルタジョブの中断を指示する(S543)。少なくとも一つのフィルタジョブのリソースが開放不可能である場合は(S542でNO)、ステップS543は実行されない。続いて、文書操作ジョブオブジェクトは、中断状態に移行し(S544)、図25の処理を終了する。
次に、図23のステップS424、S428、及びS432等において、ジョブ開始トリガオブジェクト451によって実行される処理について説明する。図27は、ジョブ開始トリガオブジェクトによるイベント処理の処理手順を説明するためのフローチャートである。
ステップS551において、フィルタジョブオブジェクトよりイベントを受信する。続いて、イベントがジョブの終了イベントであるか否かを判定する(S552)。終了イベントである場合(S552でYES)、終了イベントの送信元のフィルタジョブオブジェクトは、「終了イベント待ち」として関連r9(図6参照)によって関連付けられているフィルタジョブオブジェクトであるか否かを判定する(S553)。当該判定は、関連r9に基づいて行えばよい。イベントの送信元が、「終了イベント待ち」のフィルタジョブオブジェクトである場合(S553でYES)、「ジョブ開始指示対象」として関連r10(図6参照)によって付けられているフィルタジョブオブジェクト(すなわち、後に実行される出力フィルタのフィルタオブジェクトに対してフィルタジョブの実行開始を指示する(S554)。ここで、ジョブ開始トリガオブジェクトに「終了イベント待ち」として複数のフィルタジョブオブジェクトが関連付けられている場合、ジョブ開始トリガオブジェクトは、当該複数のフィルタジョブオブジェクトの全てから終了イベントが受信されてから、「ジョブ開始指示対象」として関連付けられているフィルタジョブオブジェクトに対して実行開始を指示する。また、「ジョブ開始指示対象」として複数のフィルタジョブオブジェクトが関連付けられている場合、当該複数のフィルタジョブオブジェクトに対して実行開始を指示する。なお、イベントが終了イベントでない場合は、ステップS553及びS554は実行されない。
上述したように本実施の形態における複合機1によれば、各フィルタを部品として各機能を構築するため、機能のカスタマイズ又は拡張を簡便に行うことができる。すなわち、各フィルタ間には、機能的な依存関係はなく独立性が保たれているため、フィルタの新たな追加やフィルタの組み合わせの変更によって、新たな機能(アプリケーション)を容易に開発することができる。したがって、新たなアプリケーションの実装が要求された場合、当該アプリケーションの一部の処理について実装されていない場合は、当該一部の処理を実現するフィルタのみを開発し、インストールすればよい。よって、コントロール層20及びアプリケーションロジック層30より下位の層について、新たなアプリケーションの実装に応じて発生する修正の頻度を低下させることができ、安定したプラットフォームを提供することができる。
また、フィルタの組み合わせによって構成される機能をアクティビティとして予め定義しておくことにより、より簡便な操作で、フィルタの組み合わせ(接続)による機能を利用することができる。
また、アクティビティが多出力の場合に、フィルタの接続関係において並列的な関係にある複数の出力フィルタ間の実行順を制御することが可能である。したがって、フィルタの実行順に関して、柔軟な制御が可能である。
なお、本実施の形態において、ジョブ開始トリガクラス450(ジョブ開始トリガオブジェクト451)は、出力順制御手段の一例に相当する。したがって、ジョブ開始トリガオブジェクト451とフィルタジョブオブジェクトとの間に形成される関連r10及び関連r11は、出力順情報に相当する。
ところで、以下に複合機1のハードウェア構成の一例を示す。図28は、本発明の実施の形態における複合機のハードウェア構成の一例を示す図である。
複合機1のハードウェアとしては、コントローラ201と、オペレーションパネル202と、ファクシミリコントロールユニット(FCU)203と、撮像部121と、印刷部122が存在する。
コントローラ201は、CPU211、ASIC212、NB221、SB222、MEM−P231、MEM−C232、HDD(ハードディスクドライブ)233、メモリカードスロット234、NIC(ネットワークインタフェースコントローラ)241、USBデバイス242、IEEE1394デバイス243、セントロニクスデバイス244により構成される。
CPU211は、種々の情報処理用のICである。ASIC212は、種々の画像処理用のICである。NB221は、コントローラ201のノースブリッジである。SB222は、コントローラ201のサウスブリッジである。MEM−P231は、複合機1のシステムメモリである。MEM−C232は、複合機1のローカルメモリである。HDD233は、複合機1のストレージである。メモリカードスロット234は、メモリカード235をセットするためのスロットである。NIC241は、MACアドレスによるネットワーク通信用のコントローラである。USBデバイス242は、USB規格の接続端子を提供するためのデバイスである。IEEE1394デバイス243は、IEEE1394規格の接続端子を提供するためのデバイスである。セントロニクスデバイス244は、セントロニクス仕様の接続端子を提供するためのデバイスである。オペレーションパネル202は、オペレータが複合機1に入力を行うためのハードウェア(操作部)であると共に、オペレータが複合機1から出力を得るためのハードウェア(表示部)である。
なお、図1等に示されるソフトウェアは、例えば、MEM−C232に格納され、CPU211によって処理されることによりその機能を複合機に実行させる。
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。