以下、図面に基づいて本発明の実施の形態を説明する。図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には、更に、アクティビティ31が含まれている。「アクティビティ」とは、複数のフィルタの組み合わせによって、一つの「機能」(複合機1がユーザに対して提供する一つのまとまった単位のサービス又はアプリケーション)を実現するソフトウェアである。
すなわち、フィルタはそれぞれ独立性が高いため、フィルタの組み合わせ(アプリケーション)を動的に構築することが可能である。具体的には、ジョブの実行要求を受け付けるたびに、利用するフィルタと、フィルタの実行順序、及びそれぞれのフィルタの実行条件等をオペレーションパネルを介してユーザに設定させることにより、ユーザ所望の機能を実現するようにしてもよい。
しかし、コピー機能のように頻繁に利用する機能については、毎回フィルタを選択することにより実行指示を行うのはユーザにとって煩雑である。かかる課題を解決するのがアクティビティ31である。すなわち、フィルタの組み合わせをアクティビティ31として予め定義しておけば、ユーザは、アクティビティ31を単位として実行対象を選択することができる。選択されたアクティビティ31は、当該アクティビティ31に定義された組み合わせに係る各フィルタを自動的に実行する。したがって、アクティビティ31によって、操作の煩雑さを解消することができるとともに、アプリケーション単位で実行対象を選択していた従来のユーザインタフェースと同様の操作感を提供することができる。
図中では、アクティビティ31として、ScanToStorageアクティビティ31a、StorageToEmailアクティビティ31b、及びScanToEmailアクティビティ31c等が例示されている。
ScanToStorageアクティビティ31aは、読取フィルタ301と、文書加工フィルタ311と、保管文書登録フィルタ322との組み合わせにより、ドキュメントボックス蓄積機能を実現するアクティビティ31である。
StorageToEmailアクティビティ31bは、保管文書読出フィルタ302と、文書加工フィルタ311と、メール送信フィルタ323との組み合わせにより、保管文書のメールによる送信機能を実現するアクティビティ31である。
ScanToEmailアクティビティ31cは、ScanToStorageアクティビティ31aとStorageToEmailアクティビティ31bとを組み合わせることにより、二つのアクティビティ31による機能の連携(連続的な実行)を実現するアクティビティ31である。すなわち、上記において、「アクティビティ」とは、複数のフィルタの組み合わせによって構成される旨を説明したが、ScanToEmailアクティビティ31cは、複数のアクティビティの組み合わせによって構成される。
図4は、ScanToEmailアクティビティの構成を示す図である。図4では、ScanToEmailアクティビティ31cによってScanToStorageアクティビティ31a及びStorageToEmailアクティビティ31bが呼び出され、ScanToStorageアクティビティ31a及びStorageToEmailアクティビティ31bによって、それぞれを構成する各フィルタが呼び出される様子が示されている。
ScanToEmailアクティビティ31cのように、複数のアクティビティの組み合わせによって構成されるアクティビティ31を、本実施の形態では「連携アクティビティ」という。「連携アクティビティ」に対し、ScanToStorageアクティビティ31aやStorageToEmailアクティビティ31bのように、通常の(フィルタの組み合わせによって構成される)アクティビティを「文書操作アクティビティ」という。また、両者を区別しない場合は、アクティビティ31という。
なお、基本的に各アクティビティ31は独立しており、連携アクティビティを除いてアクティビティ31間における依存関係(呼び出し関係)は基本的に存在しない。したがって、アクティビティ31単位で追加(インストール)又は削除(アンインストール)が可能である。よって、図1に示されているアクティビティ31以外にも、必要に応じて各種のフィルタの組み合わせによるアクティビティ31を作成し、インストールすることができる。
デバイスサービス層40は、アプリケーションロジック層30における各アクティビティ31や各フィルタから共通に利用される下位機能が実装されている部分であり、例えば、画像パイプ41及びデータ管理部42等が含まれる。画像パイプ41は、上述したパイプの機能を実現する。すなわち、或るフィルタからの出力データを次のフィルタに伝達する。データ管理部42は、各種のデータベースを表現する。例えば、ユーザ情報が登録されたデータベースや、文書又は画像データ等が蓄積されるデータベース等が相当する。
デバイス制御層50は、デバイス(ハードウェア)を制御するドライバと呼ばれるプログラムモジュール群が実装されている部分であり、例えば、スキャナ制御部51、プロッタ制御部52、メモリ制御部53、Tel回線制御部54、及びネットワーク制御部55等が含まれる。各制御部は、当該制御部の名前に付けられているデバイスを制御する。
フィルタ及びアクティビティ31について更に詳しく説明する。図5は、フィルタの構成要素を説明するための図である。図5に示されるように、各フィルタは、フィルタ設定用UI、フィルタロジック、フィルタ固有下位サービス、及び永続記憶領域情報等より構成される。このうち、フィルタ設定用UI、フィルタ固有下位サービス、及び永続記憶領域情報については、フィルタによって必ずしも構成要素に含まれない。
フィルタ設定用UIは、フィルタの実行条件等を設定させるための画面をオペレーションパネル等に表示させるプログラムである。例えば、読取フィルタ301であれば、解像度、濃度、画像種別等を設定させる画面が相当する。なお、オペレーションパネルの表示がHTMLデータや、スクリプトに基づいて行われ得ることに鑑みれば、フィルタ設定用UIはHTMLデータやスクリプトであってもよい。
フィルタロジックは、フィルタの機能を実現するためロジックが実装されたプログラムである。すなわち、フィルタの構成要素としてのフィルタ固有下位サービスや、デバイスサービス層40又はデバイス制御層50等を利用して、フィルタ設定用UIを介して設定された実行条件に応じてフィルタの機能を実現する。例えば、読取フィルタ301であれば、スキャナによる原稿の読み取り制御のためのロジックが相当する。
フィルタ固有下位サービスは、フィルタロジックを実現するために必要な下位機能(ライブラリ)である。すなわち、デバイスサービス層40又はデバイス制御層50相当する機能であるが、他のフィルタから使用されないものについては、フィルタの一部として実装されてもよく、当該一部がフィルタ固有下位サービスに相当する。例えば、読取フィルタ301であれば、スキャナを制御するための機能が相当するが、本実施の形態では、デバイス制御層50においてスキャナ制御部51として実装されている。したがって、読取フィルタ301において、フィルタ固有下位サービスの実装は必ずしも必要ではない。
永続記憶領域情報は、フィルタに対する設定情報(例えば、実行条件のデフォルト値)等、不揮発メモリに保存する必要があるデータのスキーマ定義が相当する。当該スキーマ定義は、フィルタのインストール時にデータ管理部42に登録される。
図6は、アクティビティの構成要素を説明するための図である。図6に示されるように、アクティビティ31は、アクティビティUI、アクティビティロジック、及び永続記憶領域情報等より構成される。
アクティビティUIは、アクティビティ31に関する画面(例えば、アクティビティ31の実行条件等を設定させるための設定画面)をオペレーションパネル等に表示させるための情報又はプログラムである。
アクティビティロジックは、アクティビティ31の処理内容が実装されたプログラムである。基本的に、アクティビティロジックには、フィルタの組み合わせに関するロジック(例えば、フィルタの実行順、複数のフィルタに跨る設定、フィルタの接続変更、エラー処理等)が実装されている。但し、連携アクティビティの場合は、アクティビティ31を連携させるためのロジックが実装されている。
永続記憶領域情報は、アクティビティ31に対する設定情報(例えば、実行条件のデフォルト値)等、不揮発メモリに保存する必要があるデータのスキーマ定義が相当する。当該スキーマ定義は、アクティビティ31のインストール時にデータ管理部42に登録される。
ところで、アクティビティ31やフィルタは、プログラム内においてはオブジェクトとして扱われる。斯かるオブジェクトは、次のようなクラス構成に基づく。図7は、第一の実施の形態におけるアクティビティ及びフィルタのクラス構成例を示す図である。
図7において、アプリケーションクラス330は、連携アクティビティ及び文書操作アクティビティの両者を抽象的に表現するクラスである。連携アクティビティクラス340は、連携アクティビティを表現するクラスである。連携アクティビティクラス340のインスタンスを、以下「連携アクティビティオブジェクト340A」という。文書操作アクティビティクラス350は、文書操作アクティビティを表現するクラスである。文書操作アクティビティクラス350のインスタンスを、以下「文書操作アクティビティオブジェクト350A」という。フィルタクラス360は、フィルタを表現するクラスである。フィルタクラス360のインスタンスを、以下「フィルタオブジェクト」という。
連携アクティビティクラス340及び文書操作アクティビティクラス350は、アプリケーションクラス330を継承している。したがって、連携アクティビティ及び文書操作アクティビティは、アプリケーションクラス330において定義されているインタフェースによって、両者の相違を意識することなく扱うことができる。
連携アクティビティクラス340は、文書操作アクティビティクラス350に対して二つの関連(関連r1、関連r2)を有している。関連r1は、連携される二つの文書操作アクティビティのうち、先に実行される文書操作アクティビティに対応する文書操作アクティビティオブジェクト350Aへの関連を示す。関連r1において関連付けられる文書操作アクティビティオブジェクト350Aは、「前ジョブ」といったロール名によって識別される。関連r2は、連携される二つの文書操作アクティビティのうち、後に実行される文書操作アクティビティに対応する文書操作アクティビティオブジェクト350Aへの関連を示す。関連r2において関連付けられる文書操作アクティビティオブジェクト350Aは、「後ジョブ」といったロール名によって識別される。
文書操作アクティビティクラス350は、複数のフィルタクラス360を集約している。これは、文書操作アクティビティが、複数のフィルタの組み合わせによって構成されることを表現している。
以下、複合機1の処理手順について説明する。図8は、アクティビティを利用可能にするための初期処理を説明するためのシーケンス図である。図8の処理は、複合機1の起動時や等、利用可能なアクティビティ31の一覧の表示が要求された場合等、少なくともアクティビティ31に対して実行要求が行われる前に実行される。
ステップS101において、プラグイン管理部21は、複合機1にインストールされている各アクティビティ31に対し、初期化を要求する。なお、インストールされているアクティビティ31の一覧情報は、複合機1の記憶装置に記録されている。したがって、プラグイン管理部21は、当該一覧情報を取得し、当該一覧情報に基づいて、各アクティビティ31に対する初期化要求を行う。
初期化を要求されたアクティビティ31は、当該アクティビティ31に対応する文書操作アクティビティオブジェクト350又は連携アクティビティオブジェクト340Aを生成し、生成されたオブジェクトをリクエスト管理部22に登録する(S102)。これにより、リクエスト管理部22は、登録されたオブジェクトを介して各アクティビティ31を操作可能となる。
次に、図9は、文書操作アクティビティの処理手順を説明するためのシーケンス図である。図9では、文書操作アクティビティの具体例として、ScanToStorageアクティビティ31aの処理手順が示されている。図中において、ScanToStorageオブジェクト351は、ScanToStorageアクティビティ31aに対応する文書操作アクティビティオブジェクト350Aを示す。また、読取フィルタオブジェクト361、文書加工フィルタオブジェクト362、保管文書登録フィルタオブジェクト363は、それぞれ読取フィルタ301、文書加工フィルタ311、保管文書登録フィルタ322に対応するフィルタオブジェクト360Aを示す。なお、アクティビティ31に対応するオブジェクトによって実行される処理は、当該アクティビティ31を構成するアクティビティロジック(図6参照)に基づく。また、フィルタに対応するオブジェクトによって実行される処理は、当該フィルタを構成するフィルタロジック(図5参照)に基づく。
ユーザによって、複合機1のオペレーションパネルを介してScanToStorageアクティビティ31aが実行対象として選択されると、ローカルUI部12は、ScanToStorageアクティビティ31aの名前(「ScanToStorage」)を指定して、その検索をリクエスト管理部22に要求する(S201)。続いて、リクエスト管理部22は、図8の処理によって登録されている各オブジェクト(文書操作アクティビティオブジェクト350Aや連携アクティビティオブジェクト340A)に対して、それぞれが対応するアクティビティ31の名前を問い合わせる(S202)。
続いて、リクエスト管理部22は、各オブジェクトより返却された名前の中から、ローカルUI部12による検索要求において指定された名前(「ScanToStorage」)を検索し、検索要求に係るアクティビティ31の存否を確認する(S203)。リクエスト管理部22は、ローカルUI部12による検索要求において指定された名前と一致する名前を有するアクティビティ31の存在が確認された場合は、当該アクティビティ31に対応するオブジェクトをローカルUI部12に返却する(S204)。ここでは、ScanToStorageアクティビティ31aが実行対象とされているため、ScanToStorageオブジェクト351が返却される。
続いて、ローカルUI部12は、ScanToStorageオブジェクト351に対して、実行条件の生成を要求する(S205)。続いて、ScanToStorageオブジェクト351は、ScanToStorageアクティビティ31aを構成する各フィルタに対応するオブジェクト(読取フィルタオブジェクト361、文書加工フィルタオブジェクト362、保管文書登録フィルタオブジェクト363)の生成等を行い(S206、S207、S208)、規定値としての実行条件をScanToStorageアクティビティ31a及びその構成フィルタに設定する。なお、規定値としての実行条件は、例えば、フィルタの構成要素である永続記憶領域情報(図5参照)の一部に含まれている。
続いて、ローカルUI部12は、ScanToStorageアクティビティ31aのアクティビティUI(図6参照)を呼び出すことによりScanToStorageアクティビティ31aの画面情報を取得し、当該画面情報に基づいてScanToStorage設定画面をオペレーションパネルに表示させる。
図10は、ScanToStorage設定画面の表示例を示す図である。ScanToStorage設定画面611は、ScanToStorageアクティビティ31aの実行条件を設定させるための画面であり、図中では、ScanToStorageアクティビティ31aを構成する各フィルタの設定画面(読取フィルタ設定画面611a、文書加工フィルタ設定画面611b、及び保管文書登録フィルタ設定画面611c)が表示された例が示されている。すなわち、各フィルタの実行条件を設定させることで、ScanToStorageアクティビティ31aの実行条件が設定されるからである。各フィルタの設定画面の画面情報は、ScanToStorageアクティビティ31aのアクティビティUIが、ローカルUI部12からの呼び出しに応じて各フィルタのフィルタ用設定UI(図5参照)を呼び出すことにより取得され、ScanToStorageアクティビティ31aの画面情報に含められる(マージされる)。なお、単に、各フィルタの設定画面を並べるだけでなく、各フィルタに対して一括して設定を行うためのUIをScanToStorage設定画面611に表示させるようにしてもよい。
それぞれのフィルタの設定画面において設定された実行条件は、それぞれのフィルタのフィルタロジック(図5参照)において保持される。
このように、フィルタ単位で実行条件の設定用のユーザインタフェースが実装されるため、或るフィルタを用いて実現されるアクティビティ31間では、当該フィルタのユーザインタフェースを共通的に用いることができる。したがって、アプリケーション(アクティビティ31)ごとに同様のユーザインタフェースを改めて実装する必要はなく、開発工数を削減することができる。
続いて、ユーザによってオペレーションパネルを介して実行の開始指示が入力されると、ローカルUI部12は、ScanToStorageオブジェクト351に実行を要求する(S209)。続いて、ScanToStorageオブジェクト351は、ScanToStorageアクティビティ31aを構成する各フィルタ(読取フィルタ301、文書加工フィルタ311、及び保管文書登録フィルタ332)をその実行順に従ってパイプによって接続し、ScanToStorageアクティビティ31aによる処理をジョブとしてリクエスト管理部22のジョブキューに登録する(S210)。ここで、「パイプによって接続する」とは、具体的には、各フィルタに対して入力側のパイプ及び出力側のパイプを識別する情報(例えば、ファイル名やメモリのアドレス等)を通知することをいう。したがって、パイプによって接続されることにより、それぞれのフィルタは、入力側のパイプ及び出力側のパイプを識別することが可能となる。
図11は、フィルタがパイプによって接続された状態を概念的に示す図である。図11では、各フィルタ(「F」)間がパイプ(「P」)によって接続されている様子が示されている。
なお、パイプにはその実体として利用される対象に応じて様々な種類が存在する。したがって、各フィルタ間をいずれのパイプによって接続するべきかが判断される必要がある。斯かる判断は、予め各アクティビティ31のアクティビティロジック内に固定的に定義されていてもよいし、記憶装置に次のようなテーブルを記録しておき当該テーブルに基づいて行われても良い。
図12は、フィルタとパイプの対応テーブルの例を示す図である。図12の対応テーブル60によれば、例えば、読取フィルタ301と印刷フィルタ321や、文書変換フィルタ312と印刷フィルタ321は、DMA(Direct Memory Access)パイプによって接続され、高速にデータが転送される。また、PC文書受信フィルタ305と文書変換フィルタ312とは、スプールパイプによって接続される。スプールパイプとは、HDDを用いるパイプであり、左側のフィルタから出力されたデータは、右側のフィルタが読み出すまでHDDにスプール(保存)される。それ以外のフィルタ間は、汎用メモリパイプによって接続される。汎用メモリパイプとは、有限サイズのRAMバッファによってデータ転送を行うパイプである。図12に示される対応テーブル60は、フィルタやパイプの拡張(追加)や削除等に応じて編集可能である。なお、図1における画像パイプ41は、上記の各種のパイプへのインタフェースを提供するモジュールを抽象的に表現したものである。
続いて、リクエスト管理部22は、ジョブキューに登録されたジョブのスケジューリングを行い(S211)、ScanToStorageアクティビティ31aの実行順が回ってくると、ScanToStorageオブジェクト351に実行を要求する(S212)。ScanToStorageオブジェクト351は、ScanToStorageアクティビティ31aを構成する各フィルタに対応するフィルタオブジェクト360Aに対して並列的に実行要求を出力する(S213、S214、S215)。すなわち、フィルタの呼び出しは、前に実行されるフィルタによる処理の完了を待たずに各フィルタに対してほぼ同時に行われる。フィルタ間の同期はパイプによってとられるからである。実行要求を受けた各フィルタは自分の入力側のパイプにデータが入力されるまで待機する。但し、入力フィルタには、入力側にパイプは存在しない。したがって、入力フィルタは実行要求に応じて処理を開始する。
図9の例において具体的に説明すると、読取フィルタ301は、スキャナによる画像データの読み取りを制御し、読み取られた画像データを出力側に接続されているパイプに出力する。文書加工フィルタ311は、入力側に接続されているパイプ(読取フィルタ301の出力側に接続されているパイプ)に対する画像データの入力を検知すると、実行条件において指定された画像変換処理を実行し、変換結果の画像データを出力側に接続されているパイプに出力する。保管文書登録フィルタ322は、入力側に接続されているパイプ(文書加工フィルタ311の出力側に接続されているパイプ)に対する画像データの入力を検知すると、当該画像データをハードディスクに保存する。以上によって、スキャナによって読み取られた画像データの保存といった機能(ScanToStorageアクティビティ31aの機能)が実現される。
各フィルタのオブジェクトは、それぞれの処理が完了すると、ScanToStorageオブジェクト351に対して実行の完了を通知する(S216、S217、S218)。ScanToStorageオブジェクト351は、実行を要求した全てのフィルタオブジェクト360Aより実行完了通知を受け取ると、ジョブの完了をローカルUI部12に通知する(S219)。
次に、連携アクティビティの処理手順について説明する。図13は、連携アクティビティの処理手順を説明するためのシーケンス図である。図13では、連携アクティビティの具体例として、ScanToEmailアクティビティ31cの処理手順が示されている。図13中、図9と同一部分には同一符号を付している。図13において、ScanToEmailオブジェクト353は、ScanToEmailアクティビティ31cに対応する連携アクティビティオブジェクト340Aを示す。また、StorageToEmailオブジェクト352は、StorageToEmailアクティビティ31bに対応する文書操作アクティビティオブジェクト350Aを示す。
ユーザによって、複合機1のオペレーションパネルを介してScanToEmailアクティビティ31cが実行対象として選択されると、ローカルUI部12は、ScanToEmailアクティビティ31cの名前(「ScanToEmail」)を指定して、その検索をリクエスト管理部22に要求する(S301)。続いて、リクエスト管理部22は、図8の処理によって登録されている各オブジェクト(文書操作アクティビティオブジェクト350Aや連携アクティビティオブジェクト340A)に対して、それぞれが対応するアクティビティ31の名前を問い合わせる(S302、S303、S304)。
続いて、リクエスト管理部22は、各オブジェクトより返却された名前の中から、ローカルUI部12による検索要求において指定された名前(「ScanToEmail」)を検索し、検索要求に係るアクティビティ31の存否を確認する(S305)。この際、リクエスト管理部22は、検索要求に係るアクティビティ31が連携アクティビティの場合は、当該アクティビティ31に関連付けられて管理されている連携定義情報に基づいて、連携対象となるアクティビティ31を特定し、その存否についても確認する。
図14は、連携アクティビティの連携定義情報の構成例を示す図である。図14では、連携アクティビティの具体例であるScanToEmailの連携定義情報が示されている。図14おいて、連携定義情報は、構成情報410、引継ぎデータ情報420、及び次ジョブ起動条件情報430より構成される。このうち、ステップS305では、構成情報410が利用される。構成情報410は、連携アクティビティ名、前アクティビティ名、及び後アクティビティ名等の項目より構成される。連携アクティビティ名は、当該連携定義情報の対象となっている連携アクティビティの名前である。前アクティビティ名は、当該連携アクティビティによって連携されるアクティビティ31のうち先に実行されるアクティビティ31の名前である。後アクティビティ名は、当該連携アクティビティによって連携されるアクティビティ31のうち後に実行されるアクティビティ31の名前である。したがって、ステップS305において、リクエスト管理部22は、ScanToEmailアクティビティ31cだけでなく、ScanToEmailアクティビティ31cによって連携されるScanToStorageアクティビティ31a及びStorageToEmailアクティビティ31bの存否についても確認する。なお、連携定義情報は、アクティビティ31の永続記憶領域情報の一部として管理されていてもよいし、複合機1の記憶装置においてファイルとして保存されていてもよい。
リクエスト管理部22は、ローカルUI部12による検索要求において指定された名前と一致する名前を有するアクティビティ31(ScanToEmailアクティビティ31c)と、ScanToEmailアクティビティ31cによって連携される全てのアクティビティ31の存在が確認された場合は、ScanToEmailアクティビティ31cに対応するScanToEmailオブジェクト353をローカルUI部12に返却する(S306)。
続いて、ローカルUI部12は、ScanToEmailオブジェクト353に対して、実行条件の生成を要求する(S307)。続いて、ScanToEmailオブジェクト353は、規定値としての実行条件をScanToEmailアクティビティ31cに設定すると共に、ScanToEmailアクティビティ31cを構成する各アクティビティ31に対応するオブジェクト(ScanToStorageオブジェクト351、StorageToEmailオブジェクト352)に対して実行条件の生成要求を行う(S309、S312)。なお、ScanToEmailオブジェクト353は、連携定義情報の構成情報410に基づいて、ScanToEmailアクティビティ31cを構成する各アクティビティ31を特定する。
ScanToEmailアクティビティ31cを構成する各アクティビティ31に対応するオブジェクトは、それぞれのアクティビティ31及びその構成フィルタに規定値としての実行条件を設定する。例えば、図中では、ScanToStorageオブジェクト351が、ScanToStorageアクティビティ31aを構成する各フィルタに対応するオブジェクト(読取フィルタオブジェクト361、文書加工フィルタオブジェクト362、保管文書登録フィルタオブジェクト363)の生成や実行条件の設定等を行っている様子が示されている(S309〜S311)。StorageToEmailオブジェクト352も同様の処理を実行するが、図中では便宜上省略されている。
続いて、ローカルUI部12は、ScanToEmail31cアクティビティ31cのアクティビティUIを呼び出すことによりScanToEmail31cアクティビティ31cの画面情報を取得し、当該画面情報に基づいてScanToEmail設定画面をオペレーションパネルに表示させる。
図15は、ScanToEmail設定画面の表示例を示す図である。図15において、ScanToEmail設定画面613には、ScanToStorageアクティビティ31bに対応するScanToStorageボタン613a、StorageToEmailアクティビティ31bに対応するStorageToEmailボタン613bが表示されている。このように、連携アクティビティの設定画面では、当該連携アクティビティによって連携されるアクティビティ31に対応するボタンが表示される。
ScanToEmail設定画面613において、ScanToStorageボタン613aが選択(タッチ)されると、ローカルUI部12は、ScanToStorageアクティビティ31aのアクティビティUIを呼び出すことによりScanToStorageアクティビティ31aの画面情報を取得し、当該画面情報に基づいてScanToStorageアクティビティ設定画面611を表示させる。
また、StorageToEmailボタン613bが選択されると、ローカルUI部12は、StorageToEmailアクティビティ31bのアクティビティUIを呼び出すことによりStorageToEmailアクティビティ31bの画面情報を取得し、当該画面情報に基づいてStorageToEmailアクティビティ設定画面612を表示させる。StorageToEmailアクティビティ設定画面612には、ScanToStorageアクティビティ設定画面611と同様に、それを構成する各フィルタの設定画面(保管文書読出フィルタ設定画面612a、文書加工フィルタ設定画面612b、及びメール送信フィルタ設定画面612c)が表示される。
それぞれのフィルタの設定画面において設定された実行条件は、それぞれのフィルタのフィルタロジック(図5参照)において保持される。
なお、StorageToEmail設定画面613における保管文書読出フィルタ設定画面612aでは、複合機1の記憶装置に保管されている文書データ(画像データ)の一覧の中から、読み出すデータを選択させるようなユーザインタフェースが想定される。しかし、ScanToEmailアクティビティ31cによってStorageToEmailアクティビティ31bが連携される場合、StorageToEmailアクティビティ31bによって処理対象(Emailの送信対象)とされる文書データは、ScanToStorageアクティビティ31aにより出力される文書データであり、ユーザに選択させる必要はない。したがって、StorageToEmail設定画面612では、保管文書読出フィルタ設定画面612aを表示させなくてもよい。また、表示させたとしても、処理対象とする文書データは選択できないようにすればよい。文書データを選択できないようにするための制御は、ScanToEmailアクティビティ31cが実行すればよい。
続いて、ユーザによってオペレーションパネルを介して実行の開始指示が入力されると、ローカルUI部12は、ScanToEmailオブジェクト353に実行を要求する(S313)。続いて、ScanToEmailオブジェクト353は、ScanToEmailアクティビティ31cによる処理をジョブとしてリクエスト管理部22のジョブキューに登録する(S314)。
リクエスト管理部22は、ジョブキューに登録されたジョブのスケジューリングを行い(S315)、ScanToEmailアクティビティ31cの実行順が回ってくると、ScanToEmailオブジェクト353に実行を要求する(S316)。ScanToStorageオブジェクト353は、構成情報410の前アクティビティ名に係るScanToStorageオブジェクト351に実行を要求する(S317)。以降ステップS318〜S323までは、図9におけるステップS213〜S218までと同様にScanToStorageアクティビティ31aの機能が実行される。ScanToStorageオブジェクト351は、実行を要求した全てのフィルタオブジェクト360Aより実行完了通知を受け取ると(S321、S322、S323)、ScanToStorageアクティビティ31aのジョブの完了をScanToEmailオブジェクト353に通知する(S324)。
続いて、ScanToEmailオブジェクト325は、次のジョブ(StorageToEmailアクティビティ31bのジョブ)の起動の要否判断を行う(S325)。この判断は、連携定義情報を構成する次ジョブ起動条件情報430に基づいて行われる。図14において、次ジョブ起動条件情報430は、情報取得先、取得内容、及び次ジョブ起動条件等の項目より構成される。情報取得先は、次のジョブの起動の要否判断を行うための情報(以下「判断情報」という。)の取得先の識別情報を示す。図14では、ScanToStorageアクティビティ31aが情報取得先とされている。取得内容は、判断情報として取得する情報の内容を示す。図14では、ScanToStorageアクティビティ31aの状態を示す情報の一例として実行結果を示す情報(正常終了(OK)又は異常終了(NG))が取得内容とされている。次ジョブ起動条件は、判断情報に基づく次のジョブの起動条件を示す。図14では、実行結果が正常終了(OK)であることが次のジョブの起動条件とされている。
したがって、図14の例に基づけば、ScanToEmailオブジェクト353は、次ジョブ起動条件情報430の情報取得先と取得内容との値に基づいて、ScanToStorageオブジェクト351より、ScanToStorageアクティビティ31aの実行結果を取得し(S326)、実行結果と次ジョブ起動条件とを比較する。
実行結果が正常終了でない場合(すなわち、次ジョブ起動条件が満たされない場合)、次に実行されるべきStorageToEmailアクティビティ31bは実行されない。一方、実行結果が正常終了である場合(すなわち、次ジョブ起動条件が満たされる場合)、ScanToEmailオブジェクト353は、連携定義情報を構成する引継ぎデータ情報420に基づいて、引継ぎデータの設定を行う(S327)。
ここで、引継ぎデータとは、連携されるアクティビティ31間において、前に実行されるアクティビティ31より後に実行されるアクティビティ31に引き継がれるべき情報(伝達されるべき情報)をいう。図14において、引継ぎデータ情報420は、情報取得先、取得内容、設定先、及び設定内容等の項目より構成される。取得先は、引継ぎデータの取得先の識別情報を示す。図14では、保管文書登録フィルタ322(ScanToStorageアクティビティ31aにおける出力フィルタ)が取得先とされている。取得内容は、取得先より取得されるべきデータの内容を示す。図14では、文書ID(すなわち、保管文書登録フィルタ322によって保存された画像データの文書ID)が取得内容とされている。設定先は、保管文書読出フィルタ302(StorageToEmail31bにおける入力フィルタ)が設定先とされている。設定内容は、設定先に設定されるべきデータの内容を示す。図14では文書IDが設定内容とされている。
したがって、図14の例に基づけば、ScanToEmailオブジェクト353は、ScanToStorageアクティビティ31aの保管文書登録フィルタ322より、保存された画像データの文書IDを取得し、その文書IDを引継ぎデータとしてStorageToEmailアクティビティ31bの保管文書読出フィルタ302の実行条件として設定する。
続いて、ScanToEmailオブジェクト353は、StorageToEmailオブジェクト352に対して実行を要求する(S328)。当該実行要求に応じ、StorageToEmail31aにより、保存されている画像データのEmailによる送信が実行される。この際、引継ぎデータに基づいてScanToStorageアクティビティ31aの保管文書登録フィルタ322によって保存されている画像データが処理対象とされる。なお、StorageToEmailアクティビティ31bの処理手順については、ScanToStorageアクティビティ31aと同様であるため、図13では省略されている。
StorageToEmailオブジェクト352より実行完了が通知されると、ScanToEmailオブジェクト353は、ScanToEmailアクティビティ31cのジョブの完了をローカルUI部12に通知する(S329)。このように、ScanToEmailアクティビティ31cによって、ScanToStorageアクティビティ31a及びStorageToEmailアクティビティ31bが連続的に実行されることで、スキャナによって読み取られた画像データのEmailによる送信といった機能が実現される。
次に、図13においてScanToEmailアクティビティ31cを例として説明した連携アクティビティの処理手順を、フローチャートを用いてより一般化して説明する。図16は、連携アクティビティの処理手順を説明するためのフローチャートである。
ステップS401において、構成情報410の前アクティビティ名に基づいて、連携されるアクティビティ31のうち先に実行すべきアクティビティ31を実行させる。なお、当該ステップは、図13におけるステップS317に対応する。
続いて、次ジョブ起動条件情報430の情報取得先と取得内容とに基づいて、判断情報を取得する(S402)。続いて、取得された判断情報を参照して、次ジョブ起動条件情報430の次ジョブ起動条件が満たされているか否かを判定する(S403)。次ジョブ起動条件が満たされていない場合(S403でNO)、後に実行すべきアクティビティ31の実行は行わない。
一方、次ジョブ起動条件が満たされている場合(S403でYES)、引継ぎデータ情報420に基づいて、引継ぎデータの設定の要否を判定する(S404)。具体的には、当該連携アクティビティに対して引継ぎデータ情報420が登録(設定)されているか否かを判定する。引継ぎデータの設定が必要である場合(すなわち、当該連携アクティビティに対して引継ぎデータ情報420が登録(設定)されている場合)(S404でYES)、引継ぎデータ情報420に基づいて取得先より引継ぎデータを取得し(S405)、設定先に引継ぎデータを設定する(S406)。引継ぎデータの設定が不要な場合(すなわち、当該連携アクティビティに対して引継ぎデータ情報420が登録(設定)されていない場合)(S404でNO)は、引継ぎデータの取得及び設定は行われない。
続いて、構成情報410の後アクティビティ名に基づいて、後に実行すべきアクティビティ31を実行させる。
次に、第二の実施の形態について説明する。図17は、第二の実施の形態におけるアクティビティ及びフィルタのクラス構成例を示す図である。図17中、図7と同一部分には同一符号を付し、その説明は省略する。
図17において、連携アクティビティクラス340は、図7における関連r1及びr2の代わりに、アプリケーションクラス330に対して関連r3及びr4を有している。関連r3は、連携される二つのアクティビティ31のうち、先に実行されるアクティビティ31に対応する連携アクティビティオブジェクト340A又は文書操作アクティビティオブジェクト350Aへの関連を示す。関連r4は、連携される二つのアクティビティ31のうち、後に実行されるアクティビティ31に対応する連携アクティビティオブジェクト340A又は文書操作アクティビティオブジェクト350Aへの関連を示す。
このことは、連携アクティビティ自身も連携の対象となり得ることを示す。連携アクティビティが他の連携アクティビティによって連携される場合、当該他の連携アクティビティは、連携対象とされる複数の連携アクティビティ又は文書操作アクティビティを連続的に実行させる。
例えば、図13のシーケンス図を例とすると、二つの文書操作アクティビティオブジェクト(ScanToStorageオブジェクト351及びStorageToEmailオブジェクト352)の少なくともいずれ一方が、連携アクティビティオブジェクト340Aに置き換わる。置き換わった連携アクティビティオブジェクト340Aは、図13におけるScanEmailオブジェクト353と同様の処理を実行する。すなわち、連携アクティビティオブジェクト340Aにより処理が階層的に実行される。その他の点については、図13と同様でよい。
次に、第三の実施の形態について説明する。図18は、第三の実施の形態におけるアクティビティ及びフィルタのクラス構成例を示す図である。図18中、図7と同一部分には同一符号を付し、その説明は省略する。
図18では、アクティビティリンククラス370が追加されている。アクティビティリンククラス370は、連携アクティビティクラス340と文書操作アクティビティクラス350との関連を保持するためのクラスである。以下、アクティビティリンククラス370のインスタンスを「アクティビティリンクオブジェクト370A」という。
アクティビティリンククラス370は、文書操作アクティビティクラス350に対して二つの関連(関連r5、関連r6)を有している。関連r5は、連携される二つの文書操作アクティビティのうち、先に実行される文書操作アクティビティに対応する文書操作アクティビティオブジェクト350Aへの関連を示す。関連r5において関連付けられる文書操作アクティビティオブジェクト350Aは、「前ジョブ」といったロール名によって識別される。関連r6は、連携される二つの文書操作アクティビティのうち、後に実行される文書操作アクティビティに対応する文書操作アクティビティオブジェクト350Aへの関連を示す。関連r6において関連付けられる文書操作アクティビティオブジェクト350Aは、「後ジョブ」といったロール名によって識別される。
また、連携アクティビティクラス340は、アクティビティリンククラス370を1対多の多重度で集約している。すなわち、図18のクラス構成によれば、次のような関係を構築することができる。
図19は、第三の実施の形態における連携アクティビティと文書操作アクティビティとの関係を示すオブジェクト図である。図19では、1つの連携アクティビティクオブジェクト340Aが二つのアクティビティリンクオブジェクト370Aを集約している例が示されている。各アクティビティリンクオブジェクト370Aは、それぞれ関連r5及びr6によって二つの文書操作アクティビティオブジェクト350と関連付けられる。但し、一方のアクティビティリンクオブジェクト370Aの後ジョブとしての文書操作アクティビティオブジェクト350Aと、他方のアクティビティリンクオブジェクト370Aの前ジョブとしての文書操作アクティビティオブジェクト350Aとは共通する。したがって、図19の例では、アクティビティリンクオブジェクト370Aを介して一つの連携アクティビティオブジェクト340Aに三つの文書操作アクティビティオブジェクト350Aが関連付けられていることになる。すなわち、図18のようなクラス構成によれば、一つの連携アクティビティによって3つ以上の文書操作アクティビティを連携させることができる。
このようなオブジェクト構成が構築される場合、図14における構成情報420は、前前アクティビティ名及び後アクティビティ名といった固定的な構成ではなく、連携されるアクティビティ31の数に応じて、各アクティビティ31の名前を保持する項目を追加可能なようにすればよい。
なお、第三の実施の形態では、図13のシーケンス図において、実行順が3番目以降のアクティビティについては、実行順が2番目のアクティビティに関する処理手順を同様に繰り返せばよい。
次に、第四の実施の形態について説明する。図20は、第四の実施の形態におけるアクティビティ及びフィルタのクラス構成例を示す図である。図20中、図18と同一部分には同一符号を付し、その説明は省略する。
図20において、アクティビティリンククラス370は、図18における関連r5及びr6の代わりに、アプリケーションクラス330に対して関連r7及びr8を有している。関連r7は、アクティビティリンクオブジェクト370Aによって関連付けられる二つのアクティビティ31のうち、先に実行されるアクティビティ31に対応する連携アクティビティオブジェクト340A又は文書操作アクティビティオブジェクト350Aへの関連を示す。関連r8は、アクティビティリンクオブジェクト370Aによって関連付けられる二つのアクティビティ31のうち、後に実行されるアクティビティ31に対応する連携アクティビティオブジェクト340A又は文書操作アクティビティオブジェクト350Aへの関連を示す。
このことは、連携アクティビティ自身もアクティビティリンクオブジェクト370Aを介して連携の対象となり得ることを示す。すなわち、第四の実施の形態は、第二の実施の形態と第三の実施の形態とを合成したものであり、一つの連携アクティビティによって、三つ以上の連携アクティビティ又は文書操作アクティビティの連携が可能な例である。
第四の実施の形態では、図13のシーケンス図において、第二の実施の形態及び第三の実施の形態において説明した変更を加えればよい。
上述したように、本発明の実施の形態における複合機1によれば、独立性の高いフィルタを組み合わせることによって構築されるアプリケーションであるアクティビティ31同士を連携させることができる。したがって、より柔軟に、かつ、効率的にアプリケーションを構築することができる。
特に、前に実行されるアクティビティ31の実行結果等、状態を示す情報に基づいて後に連携されるアクティビティ31の実行の要否が判定されるため、アクティビティ31の実行結果や状態に応じて柔軟な処理手順を実行させることができる。
したがって、本実施の形態において説明したように、複数のアクティビティ31の機能を連携させるだけでなく、各アクティビティ31において共通に必要とされる処理を抽出し、その抽出された処理を実行する新たなアクティビティ31を定義することで、より効率的にアプリケーションを構築することができる。
具体的には、例えば、アクティビティ31が異常終了した場合、その際の後処理は、エラーメッセージの表示等、各アクティビティ31において共通する点が多い。あるいは、全く同一のロジックであるかもしれない。斯かる場合に、各アクティビティ31に当該後処理を実装していては、同様のソースコードが分散され、保守作業が煩雑になってしまう。そこで、アクティビティ31の連携の仕組みを利用し、後処理を実行するアクティビティ31(以下「後処理アクティビティ」という。)を定義し、当該後処理アクティビティを他のアクティビティ31の後に実行されるように連携させるようにすれば、アクティビティ31ごとに後処理を実装する必要がなくなる。この場合、後処理アクティビティに関する次ジョブ起動条件は、前に実行されるアクティビティ31の実行結果がNG(異常終了)であることとすればよい。また、例えば、異常終了コード等を引継ぎデータとすればよい。
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。