図1は、本発明の実施例に該当する融合機101を表す。図1の融合機101は、種々のハードウェア111と、種々のソフトウェア112と、融合機起動部113により構成される。
融合機101のハードウェア111としては、撮像部121と、印刷部122と、その他のハードウェア123が存在する。撮像部121は、読取原稿から画像(画像データ)を読み取るためのハードウェアである。印刷部122は、画像(画像データ)を印刷用紙に印刷するためのハードウェアである。
融合機101のソフトウェア112としては、種々のアプリケーション131と、種々のプラットフォーム132が存在する。これらのプログラムは、UNIX(登録商標)等のOS(オペレーティングシステム)によりプロセス単位で並列的に実行される。
アプリケーション131としては、コピー用のアプリケーションであるコピーアプリ141、プリンタ用のアプリケーションであるプリンタアプリ142、スキャナ用のアプリケーションであるスキャナアプリ143、ファクシミリ用のアプリケーションであるファクシミリアプリ144、ネットワークファイル用のアプリケーションであるネットワークファイルアプリ145が存在する。
アプリケーション131は、専用のSDK(ソフトウェア開発キット)を使用して開発することができる。SDKを使用して開発したアプリケーション131をSDKアプリと呼ぶ。専用のSDKとしては、C言語でアプリケーション131を開発するための「CSDK」や、Java(登録商標)言語でアプリケーション131を開発するための「JSDK」が提供される。CSDKを使用して開発したアプリケーション131を「CSDKアプリ」と呼び、JSDKを使用して開発したアプリケーション131を「JSDKアプリ」と呼ぶ。図1の融合機101にも、CSDKアプリ146と、JSDKアプリ147が存在する。図1の融合機101にはさらに、Java(登録商標)言語で記述されたJSDKアプリ147とC言語で記述された他のソフトウェア112との仲介を行うソフトウェア112として、JSDKプラットフォーム148が存在する。
プラットフォーム132としては、種々のコントロールサービス151、システムリソースマネージャ152、種々のハンドラ153が存在する。コントロールサービス151としては、ネットワークコントロールサービス(NCS)161、ファクシミリコントロールサービス(FCS)162、デリバリコントロールサービス(DCS)163、エンジンコントロールサービス(ECS)164、メモリコントロールサービス(MCS)165、オペレーションパネルコントロールサービス(OCS)166、サーティフィケーションコントロールサービス(CCS)167、ユーザディレクトリコントロールサービス(UCS)168、システムコントロールサービス(SCS)169が存在する。ハンドラ153としては、ファクシミリコントロールユニットハンドラ(FCUH)171、イメージメモリハンドラ(IMH)172が存在する。
NCS161のプロセスは、ネットワーク通信の仲介を行う。FCS162のプロセスは、ファクシミリのAPIを提供する。DCS163のプロセスは、蓄積文書の配信処理に関する制御を行う。ECS164のプロセスは、撮像部121や印刷部122に関する制御を行う。MCS165のプロセスは、メモリやハードディスクドライブに関する制御を行う。OCS166のプロセスは、オペレーションパネルに関する制御を行う。CCS167のプロセスは、認証処理や課金処理に関する制御を行う。UCS168のプロセスは、ユーザ情報の管理に関する制御を行う。SCS169のプロセスは、システムの管理に関する制御を行う。
アプリケーション131とプラットフォーム132の仲介を行うソフトウェア112として、仮想アプリケーションサービス(VAS)135が存在する。VAS135は、アプリケーション131をクライアントとするサーバプロセスとして動作すると共に、プラットフォーム132をサーバとするクライアントプロセスとして動作する。VAS135は、アプリケーション131から見てプラットフォーム132を隠蔽するラッピング機能を備え、プラットフォーム132のバージョンアップに伴うバージョン差を吸収する役割等を担う。
融合機起動部113は、融合機101の電源投入時に最初に実行される。これにより、UNIX(登録商標)等のOSが起動され、アプリケーション131やプラットフォーム132が起動される。これらのプログラムは、ハードディスクドライブやメモリカードに蓄積されており、ハードディスクドライブやメモリカードから再生されて、メモリに起動されることになる。
図2は、図1の融合機101に係るハードウェア構成図である。融合機101のハードウェア111としては、コントローラ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は、融合機101のシステムメモリである。MEM−C232は、融合機101のローカルメモリである。HDD233は、融合機101のストレージである。メモリカードスロット234は、メモリカード235をセットするためのスロットである。NIC241は、MACアドレスによるネットワーク通信用のコントローラである。USBデバイス242は、USB規格の接続端子を提供するためのデバイスである。IEEE1394デバイス243は、IEEE1394規格の接続端子を提供するためのデバイスである。セントロニクスデバイス244は、セントロニクス仕様の接続端子を提供するためのデバイスである。
オペレーションパネル202は、オペレータが融合機101に入力を行うためのハードウェア(操作部)であると共に、オペレータが融合機101から出力を得るためのハードウェア(表示部)である。
図3は、図1の融合機101に係る外観図である。図3には、撮像部121の位置と、印刷部122の位置と、オペレーションパネル202の位置が図示されている。図3には更に、読取原稿のセット先となる原稿セット部301と、印刷用紙の給紙先となる給紙部302と、印刷用紙の排紙先となる排紙部303が図示されている。
オペレーションパネル202は、図4のように、タッチパネル311と、テンキー312と、スタートボタン313と、リセットボタン314と、機能キー315と、初期設定ボタン316により構成される。タッチパネル311は、タッチ操作で入力を行うためのハードウェア(タッチ操作部)であると共に、画面表示で出力を得るためのハードウェア(画面表示部)である。テンキー312は、キー(ボタン)操作で数字入力を行うためのハードウェアである。スタートボタン313は、ボタン操作でスタート操作を行うためのハードウェアである。リセットボタン314は、ボタン操作でリセット操作を行うためのハードウェアである。機能キー315は、キー(ボタン)操作でCSDKアプリ146やJSDKアプリ147による操作画面を表示させるためのハードウェアである。初期設定ボタン316は、ボタン操作で初期設定画面を表示させるためのハードウェアである。
原稿セット部301は、ADF(自動原稿搬送装置)321と、フラットベッド322と、フラットベッドカバー323により構成される。給紙部302は、4個の給紙トレイにより構成される。排紙部303は、1個の排紙トレイにより構成される。
(CSDK/JSDK/OSGi)
図5は、図1のCSDKアプリ146とJSDKアプリ147のソフトウェア構成図である。CSDKアプリ146は、C言語のアプリケーションであり、それぞれプロセスとして実行される事になる。JSDKアプリ147は、Java(登録商標)言語のアプリケーションであり、それぞれスレッドとして実行される事になる。
図1の融合機101には、CSDKアプリ146として、他のCSDKアプリ146の制御を行うSAS(SDKアプリケーションサービス)411が存在し、JSDKアプリ147として、他のJSDKアプリ147の制御を行うSAS Manager(SDKアプリケーションサービスマネージャ)511が存在する。CSDKアプリ146の方はプロセスとして実行されてJSDKアプリ147の方はスレッドとして実行されるので、CSDKアプリ146用のアプリケーション管理機構とJSDKアプリ147用のアプリケーション管理機構が別個に存在するのである。SAS411とSAS Manager511はそれぞれ、CSDKアプリ146とJSDKアプリ147の起動制御,起動解除制御,インストール制御,アンインストール制御,アップデート制御等を行う。
さて、SAS411は、CSDKアプリ146の制御を行う事ができるだけではなく、SAS Manager511を介してJSDKアプリ147の制御を行う事もできる。SAS411は、CSDKアプリ146については直接的にその制御を行う事ができると共に、JSDKアプリ147についてはSAS Manager511を介して間接的にその制御を行う事ができるのである。このように、CSDKアプリ146用のアプリケーション管理機構とJSDKアプリ147用のアプリケーション管理機構は、SAS Manager511を制御できる機能をSAS411に具備させると言う形で統合的に構成されている。融合機101のソフトウェアの根幹部分はC言語によるので、SDKアプリを制御する機能を同じくC言語によるSAS411に集中しておくのが好適なのである。
図6は、図1の融合機101におけるOSGi(Open Service Gateway initiative)サービスプラットフォームについて説明するための図である。OSGiサービスプラットフォームは、OSGiアライアンスによる標準化技術であり、Java(登録商標)言語に基づいたオープンなソフトウェア部品化技術である。OSGiサービスプラットフォームが実装された機器では、Java(登録商標)言語のソフトウェアは「バンドル」と言うソフトウェア部品の形で実装される。そして、該機器の諸機能はバンドルをもって構成する事ができると共に、該機器の諸機能のアップデートやカスタマイズやメンテナンスはバンドルのダウンロードをもって実現する事ができる。
図1の融合機101には、Java(登録商標)言語のソフトウェアとして、JSDKアプリ147と、JSDKプラットフォーム148と、OSGi用のアプリケーションであるOSGiアプリ401と、OSGi用のサービスであるOSGiサービス402と、バンドルの管理(バンドルのライフサイクルやデータの管理等)を行うOSGiフレームワーク403が存在する。
図1の融合機101にはさらには、他機のOSGiサービスプラットフォームを自機のOSGiサービスプラットフォームと同様に処理するためのCSC(Communication Service Concierge)421と、Java(登録商標)言語のソフトウェアを実行するためのCVM(Compact Virtual Machine)555が存在する。
さて、OSGiアプリ401とJSDKアプリ147に関して、OSGiアプリ401はバンドル化された状態で融合機101に実装するものとするが、JSDKアプリ147はバンドル化されていない状態で融合機101に実装するものとする。理由は、JSDKアプリ147をバンドル化して実装する負担をJSDKアプリ147のベンダに課さないようにするためである。その代わり、JSDKアプリ147をバンドル化する「Bundle Activator404」がJSDKプラットフォーム148に存在している。そして、OSGiフレームワーク403は、バンドル化された状態で融合機101に実装されたバンドル(OSGiアプリ401)の管理を行うと共に、バンドル化されていない状態で融合機101に実装されて「Bundle Activator404」によってバンドル化されるバンドル(JSDKアプリ147)の管理を行う事になる。このようにして、OSGiアプリ401用のアプリケーション管理機構とJSDKアプリ147用のアプリケーション管理機構は、OSGiフレームワーク403とBundle Activator404を併設すると言う形で統合的に構成されているのである。これにより、Java(登録商標)言語のアプリケーションの管理先の一元化が実現されている。
なお、OSGiフレームワーク403は、当然の事ながら、OSGiサービス402を構成するバンドルの管理や、JSDKプラットフォーム148を構成するバンドルの管理も行う。Java(登録商標)言語のソフトウェアの管理先の一元化が実現されていると言える。そして、OSGiアプリ401はここではServletかJSPであるものとする。そして、JSDKアプリ147はここではXletであるものとする。
なお、JSDKアプリ147についても、バンドル化された状態で実装するものとしてもよい。さらに、JSDKアプリ147については、バンドル化された状態で実装してもバンドル化されていない状態で実装してもどちらでもよいものとしてもよい。バンドル化された状態で実装されるJSDKアプリ147については、Bundle Activator404によるバンドル化は不要である。
(JSDK)
図7は、図1のJSDKアプリ147とJSDKプラットフォーム148のクラス図である。JSDKアプリ147とJSDKプラットフォーム148は、全体で1プロセスとして、同一プロセス上で実行される。JSDKアプリ147とJSDKプラットフォーム148中の各ブロックは、それぞれこの1プロセス上のスレッドとして、スレッド単位で並列的に実行(マルチスレッド)される。JSDKアプリ147とJSDKプラットフォーム148は、Java(登録商標)コンパイラによりソースコードからバイトコードに一括翻訳されており、Java(登録商標)仮想マシンにより逐次実行される。JSDKアプリ147とJSDKプラットフォーム148は「Java(登録商標) 2 Micro Edition」の「Foundation Profile」がベースとなっている。
JSDKアプリ147としては、図に示す通り、ユーザアプリ501と、SAS Manager511と、Screen Manager512等が存在する。
ユーザアプリ501は、融合機101のユーザ(例えばベンダ)がJSDKを使用して開発したJSDKアプリ147である。SAS Manager511は、他のJSDKアプリ147(ユーザアプリ501等)の制御等を行うJSDKアプリ147である。Screen Manager512は、他のJSDKアプリ147(ユーザアプリ501等)を操作対象とする操作画面の表示等を行うJSDKアプリ147である。
ユーザアプリ501はここでは、スタンドアロンアプリケーションやアプレットと並ぶJava(登録商標)アプリケーションの一種であるXletである。SAS Manager511とScreen Manager512はここでは、独自の拡張を施したXlet(XletEx)である。
JSDKプラットフォーム148には、図に示す通り、JSDK Environment521と、Xlet Manager531と、Multi Xlet Manager532と、Send Manager541と、Event Manager542と、System Event Manager543と、Panel Manager544と、Install Manager545と、Server/Client Manager546と、Service Manager547等のクラスが存在する。
JSDK Environment521は、JSDKシステムの実行環境を反映したJSDKシステムの起動環境設定を実行するクラスである。
Xlet Manager531は、1対1でXletを管理するクラスである。ここでは、5個のXletのライフサイクルやデータがそれぞれ1対1で5個のXlet Manager531によって管理される。Multi Xlet Manager532は、全てのXlet Manager531を管理するクラスである。ここでは、5個のXlet Manager531のライフサイクルやデータが全て1個のMulti Xlet Manager532によって管理される。なお、SAS Manager511,Screen Manager512,JSDK Environment521,Multi Xlet Manager532,Send Manager541,Event Manager542,System Event Manager543,Panel Manager544,Install Manager545,Server/Client Manager546,Service Manager547等のクラスのバンドルのライフサイクルやデータは、OSGiフレームワーク403によって管理される。
System Event Manager543は、図1のプラットフォーム132からのシステムイベント(電力モード等)の管理を行うクラスである。Panel Manager544は、1個のXletが図2のオペレーションパネル202の画面を占有する際の調停を行うクラスである。Install Manager545は、SDcardやWebからのインストールやアンインストールの管理を行うクラスである。Service Manager547は、Xletからのサービス要求に応じてXletへのサービス提供を行うクラスである。
図7のJSDKシステムでは、APIとして、JSDK API551とJSDK API552が利用される。なお、XletとXletExの差異として、XletExは、オブジェクトにアクセスするのにJSDK API551の利用とJSDKプラットフォーム148へのアクセスが可能である点が挙げられる。図1の融合機101にはさらに、図7のJSDKシステムに係る要素として、C言語とJava(登録商標)言語のインタフェースとなるJSDK Session553とNative JSDK Session554や、JSDKアプリ147とJSDKプラットフォーム148を実行するためJava(登録商標)仮想マシンであるCVM555が存在する。
図8は、JSDKシステムの起動処理を説明するための図である。JSDKシステムの起動処理では先ず、OSGiフレームワーク403が、OSGiアプリ401やOSGiサービス402を構成するバンドルを生成(S1)する。次に、OSGiフレームワーク403が、JSDKアプリ147やJSDKプラットフォーム148を構成するバンドルを生成(S2)する。次に、JSDK Environment521が、JSDK Session553やNative JSDK Session554を生成するなど、JSDKシステムの実行環境を反映したJSDKシステムの起動環境設定を実行(S3)する。次に、JSDK Session553が、Send Manager541やEvent Manager542を生成(S4)する。なお、ユーザアプリ501の起動処理には、SAS411やSAS Manager511が関与(S5)する。
以下、Service Manager547について詳細に説明する。文中、Service Manager547についてはFunction Service601、JSDK API551についてはFunction API611、JSDK API552についてはC/J API621と表記する。なお、APIは、アプリケーションプログラムインタフェースの略語に相当する。
1)Function Service
図9は、図7のJSDKシステムを構成するFunction Service601について説明するためのクラス図である。Function Service601は、ユーザアプリ501からのサービス要求に応じてユーザアプリ501へのサービス提供を行うクラスである。サービス内容の具体例としては、コピー処理の実行制御に関するサービス、プリント処理の実行制御に関するサービス、スキャン処理の実行制御に関するサービス、ファックス処理の実行制御に関するサービスが挙げられる。図7のJSDKシステムには、Function Service601とユーザアプリ501との間のサービス授受を仲介するAPIとして、Function API611が存在する。
Function Service601は、ユーザアプリ501からのサービス要求を調停する機能を備える。ユーザアプリ501からのサービス要求が競合する場合があるからである。Function Service601は、図9に示す通り、一のユーザアプリ501からのサービス要求と他のユーザアプリ501からのサービス要求とが競合する際には、一方のサービス要求を優先させて他方のサービス要求を劣後させる等、一方のサービス要求と他方のサービス要求とを調停する事になる。
Function Service601には、Adaptive Function701や、Adaptive Behavior702等のクラスが存在する。さらに、Adaptive Behavior702には、Copy Service711や、Print Service712や、Scan Service713や、Fax Service714や、SAS Service721等のクラスが存在する。
Adaptive Function701は、ユーザアプリ501等からのサービス要求を受け付けるクラスである。Adaptive Function701は、ユーザアプリ501等からのサービス要求を処理する動的に変更可能な種々の関数を備える。Adaptive Behavior702は、ユーザアプリ501等へのサービス提供を執り行うクラスである。Adaptive Behavior702は、自己の振る舞いを動的に変更する機能を備える。なお、プログラムの振る舞いの取り扱いに関する具体例は例えば、特願2004−062413に開示されている。
Copy Service711は、コピー処理の実行制御に関するサービス提供等を執り行うクラスである。Print Service712は、プリント処理の実行制御に関するサービス提供等を執り行うクラスである。Scan Service713は、スキャン処理の実行制御に関するサービス提供等を執り行うクラスである。Fax Service714は、ファックス処理の実行制御に関するサービス提供等を執り行うクラスである。
SAS Service721は、ユーザアプリ501の動作態様を制御するクラスである。SAS Service721は、Adaptive Behavior702の振る舞いの動的な変更に応じて所定のユーザアプリ501の動作態様を変更する。なお、SAS Service721は、SAS Manager511を制御する事でユーザアプリ501の動作態様を制御する事ができる。
なお、JSDKアプリ147とJSDKプラットフォーム148はリフレクション型のアーキテクチャで実装されている。リフレクションとは、プログラムが自己の静的な構造や動的な振る舞いに関する情報を公開したり、自己の静的な構造や動的な振る舞いを変更したりする能力を意味する。リフレクション型のアーキテクチャは、ベースレベルとメタレベルからなる。図7のJSDKシステムでは、JSDKアプリ147がベースレベルに相当し、JSDKプラットフォーム148がメタレベルに相当する。
図10は、Function Service601の動作について説明するための図である。図10は、図9のクラス図に対応するコラボレーション図に相当する。
ユーザアプリ501がFunction Service601にサービスを要求する際には先ず、ユーザアプリ501からFunction API611に、当該サービスを要求する旨のサービス要求が送信(S11)される。次に、Function API611からAdaptive Function701に、当該サービスを要求する旨の当該サービス要求が送信(S12)される。次に、Adaptive Function701からAdaptive Behavior702に、当該サービスを要求する旨の当該サービス要求が状態遷移のイベント形式で送信(S13)される。次に、Adaptive Behavior702からプラットフォーム132に、当該サービスに関する情報処理,通信処理,画像形成処理等の種々の処理を要求する旨の処理要求が状態遷移のアクション形式で送信(S14)される。
続いて次に、プラットフォーム132からAdaptive Behavior702に、当該処理要求に関する処理結果が状態遷移のイベント形式で送信(S21)される。次に、Adaptive Behavior702からAdaptive Function701に、上記のサービス要求に関するサービス結果が状態遷移のアクション形式で送信(S22)される。次に、Adaptive Function701からFunction API611に、上記のサービス要求に関する上記のサービス結果が送信(S23)される。次に、Function API611からユーザアプリ501に、上記のサービス要求に関する上記のサービス結果が送信(S24)される。
さて、プラットフォーム132が情報処理,通信処理,画像形成処理等の上記の処理を実行する際に上記の処理を実行する上での不都合や不具合が存在する場合には、プラットフォーム132からJSDK Environment521に、不都合や不具合が存在する旨の通知が送信(S31)される。次に、JSDK Environment521からAdaptive Behavior702に、自己の振る舞いを動的に変更する旨の命令が送信(S32)される。次に、Adaptive Behavior702が、自己の振る舞いを動的に変更(S33)して更に、Adaptive Function701の種々の関数の動作を動的に変更(S34)する。次に、SAS Service721が、SAS Manager511を通じて所定のユーザアプリ501の動作態様を変更(S35,S36)する。
図11は、Function Service601の動作の具体例について説明するための図である。図11のコラボレーション図は、図10のコラボレーション図の具体例に該当する。
先ず、第3のユーザアプリ501からFax Service714に、ファックス送信処理の実行制御に係るサービス要求が送信(S41)される。次に、Fax Service714からプラットフォーム132に、ファックス送信処理に係る処理要求が送信(S42)される。続いて次に、第1のユーザアプリ501からPrint Service712に、プリント処理の実行制御に係るサービス要求が送信(S43)される。次に、Print Service712からプラットフォーム132に、プリント処理に係る処理要求が送信(S44)される。
次に、プラットフォーム132からJSDK Environment521に、ファックス送信処理とプリント処理を同時に実行するためのメモリが不足している旨が通知(S51)される。次に、JSDK Environment521は、ファックス送信処理の実行中はプリント処理の処理要求を発行しないようPrint Service712の振る舞いを動的に変更(S52)する。
次に、プラットフォーム132からJSDK Environment521に、プリント処理を停止してもファックス送信処理を実行するためのメモリがいまだ不足している旨が通知(S61)される。次に、JSDK Environment521は、ファックス送信処理の実行中はファックス送信処理の要求元のユーザアプリ501を除く全てのユーザアプリ501を停止するようSAS Service721の振る舞いを動的に変更(S62)する。次に、SAS Service721は、ファックス送信処理の実行中はファックス送信処理の要求元のユーザアプリ501を除く全てのユーザアプリ501を停止(S63,S64)する。
図12は、Function Service601の振る舞い変更処理について概念的に説明するための図である。
Function Service601にて、Adaptive Behavior702には、State Machine Pool731、Modify Agent732等のクラスが存在する。
State Machine Pool731は、Print Service712やFax Service714の状態遷移モデルの管理を執り行う。Modify Agent732は、Print Service712やFax Service714の状態遷移モデルの修正を執り行う。状態遷移モデルの管理・修正は、Copy Service711やScan Service713も実施対象となる。
Print Service712の状態遷移モデルについて説明しておく。Idle状態741は、プリント処理の待機中の状態である。Print状態742は、プリント処理を実行中の状態である。Idle状態741からPrint状態742は、印刷開始イベント743により遷移する。Print状態742からIdle状態741は、印刷終了イベント744により遷移する。
Fax Service714の状態遷移モデルについて説明しておく。Idle状態751は、ファックス送信処理の待機中の状態である。FaxSend状態752は、ファックス送信処理を実行中の状態である。Idle状態751からFaxSend状態752には、送信開始イベント753により遷移する。FaxSend状態752からIdle状態751には、送信終了イベント754により遷移する。
Modify Agent732は、State Machine Pool731が管理する状態遷移モデルに状態遷移の実行条件を付加する事で、State Machine Pool731が管理する状態遷移モデルを修正する事ができる。これによって、Print Service712やFax Service714の振る舞いが動的に変更される事になる。
図12にて、図12Aは振る舞い変更前の状態遷移モデルを表し、図12Bは振る舞い変更後の状態遷移モデルを表す。Print Service712に関して、図12AではIdle状態741からPrint状態742に遷移するのに制限条件は存在しないが、図12BではIdle状態741からPrint状態742に遷移するのに制限条件が存在する。当該制限条件(ガード条件)は、Fax Service714がIdle状態751の際に限りPrint Service712の状態遷移を許容する事を意味する。当該制限条件(ガード条件)による振る舞い変更処理が、図11のS51・S52による振る舞い変更処理に匹敵する。
Function Service601は、アスペクト指向プログラムに相当する。アスペクト指向とは、システム横断的な関心事の分離メカニズムを意味する。アスペクト指向では、アスペクト指向プログラムにアスペクトを織り込む事で、アスペクト指向プログラムの状態遷移モデルに状態遷移の実行条件を付加する事ができる。これによって、Modify Agent732は、State Machine Pool731が管理する状態遷移モデルに状態遷移の実行条件を付加する。なお、Function Service601は、振る舞いと部品が分離されて設計されており、Modify Agent732からState Machine Pool731に、状態遷移モデルと部品ライブラリが登録される。これによって、アスペクト指向によるアスペクトの織り込みが実現されている。
XMI言語によるXML文書(図9,図10,図11)について説明しておく。図10に示す通り、JSDK Environment521とFunction Service601では、XMI言語を記述言語とするXML文書であるAspectSM.xmlファイル(以下、単に「AspectSM」という。)の記述内容に従って、それぞれS32の処理とS33の処理を実行する。図11で言えば、AspectSMにはメモリが不足している際にはFunction Service601の振る舞いを動的に変更する旨が記述されている。なお、XMLは「eXtensible Markup Language」の略語に相当する。また、XMIは「XML Metadata Interchange」の略語に相当する。
以上の説明のように、Function Service601は、自己の振る舞いを動的に変更する事ができる。これにより、JDSKアプリ147の多様な変化にJSDKプラットフォーム148が適切に対応する事ができるのである。更に、Function Service601は、自己の振る舞いの動的な変更に応じてユーザアプリ501の動作態様を変更する事ができる。これにより、JDSKアプリ147の多様な変化にJSDKプラットフォーム148が、JSDKプラットフォーム148の制御と更にJDSKアプリ147の制御を基に適切に対応する事ができるのである。
図12において概念的に説明した内容を更に具体的に説明する。図12に示されるモジュール構成は、図13に示されるクラス図に基づいている。図13は、Function Serviceの振る舞いの動的な変更を実現するクラス群を説明するためのクラス図である。
図13において、StateMachinePoolクラス1000は、State Machine Pool731を表現するクラスである。すなわち、State Machine Pool731は、StateMachinePoolクラス1000のインスタンスである。
StateMachineクラス1001は、Adaptive Behavior702における各サービス(Copy Service711、Print Service712、Scan Service713、及びFax Service714等)を表現するクラスである。すなわち、Copy Service711、Print Service712、Scan Service713、及びFax Service714等は、それぞれSateMachineクラス1001のインスタンス(StateMachineオブジェクト)として生成される。したがって、以後、これらのサービスを総称する場合、「ステートマシン」という。
StateVertexクラス1002は、抽象クラスであり、各ステートマシンの状態遷移モデルにおいて状態を表現するクラスのルートクラスに相当する。StateVertexクラス1002には、connectメソッド1002aや、reconnectメソッド1002b等のメソッドが定義されている。connectメソッド1002aは、遷移先の状態及びその状態遷移との接続を実行するメソッドである。状態遷移についてはTransitクラス1003によって表現される。したがって、より具体的には、connectメソッド1002aは、当該メソッドが呼び出されたオブジェクトと、当該オブジェクトの遷移先のStateVertexオブジェクト(厳密にはそのサブクラスのオブジェクト。以下、総称する場合「状態オブジェクト」という。)及びその状態遷移に対応するTransitオブジェクト(以下、「遷移オブジェクト」という。)との接続を実行するクラスである。ここでいう接続は、例えば、状態オブジェクト内に、遷移先の状態オブジェクトや、その遷移オブジェクトの識別情報(ID、参照、又はポインタ等)を保持することで実現される。reconnectメソッド1002bは、遷移先の変更を実行するメソッドである。なお、Trasitクラス1003には、インタフェースとしてEventインタフェース1003a、Guradインタフェース1003b、及びActionインタフェース1003c等が定義されている。Eventインタフェース1003aは、状態遷移の遷移イベントを実装するためのインタフェースである。Guardインタフェース1003bは、ガード条件を実装するためのインタフェースである。Actionインタフェース1003cは、状態遷移時に実行するアクションを実装するためのインタフェースである。
StateVertexクラス1002のサブクラスとしては、Stateクラス1004及びPseudoStateクラス1005が定義されている。Stateクラス1004は、例えば、ステートマシンの状態を表現するクラスである。Stateクラス1004には、インタフェースとしてIStateインタフェース1004a及びActivityインタフェース1004b等が定義されている。IStateインタフェース1004aは、状態の入場時の処理(入場処理)及び退場時の処理(退場処理)を実装するためのインタフェースである。Activityインタフェース1004bは、状態にある間実行する処理を実装するためのインタフェースである。これらのインタフェースは、クラスとして実装される。したがって、例えば、Activityインタフェース1004bの処理は、Activityクラスに実装される。
PseudoSateクラス1005は、初期状態や終期状態等、その名の通り擬似的な状態を表現するクラスであり、そのサブクラスとしては初期状態を表現するInitialStateクラス1006及び終期状態を表現するFinalStateクラス1007等がある。但し、図12の状態遷移モデルでは、初期状態及び終期状態は便宜上省略されている。
ModifyAgentクラス1009は、Modify Agent732を表現するクラスである。すなわち、Modify Agent732は、ModifyAgentクラス1009のインスタンスである。PluginAgetntクラス1008については後述する。
上記クラス間の関係について説明する。StateMachinePoolクラス1000は、StateMachineクラス1001を集約する。これは、State Machine Pool731が、一つ以上のステートマシンのそれぞれの状態遷移モデルを管理することを表現したものである。
StateMachineクラス1001は、StateVertexクラス1002を集約する。これは、一つのステートマシンは、一つ以上の状態を有することを表現したものである。StateVertexクラス1002は、Transitクラスを集約する。これは、状態と状態との間は遷移によって接続されることを表現したものである。
以上のような、モデルに基づいて、例えば、Print Service712は、以下のようなオブジェクトによって構成される。
図14は、Print Serviceのオブジェクト構成を表す図である。Print Service712は、図12の状態遷移モデルに基づいて、Idle状態オブジェクト741S、Print状態オブジェクト742S、印刷開始オブジェクト743T、プ及び印刷終了オブジェクト744T等より構成される。Idle状態オブジェクト741S及びPrint状態オブジェクト742Sは、Stateクラス1004のインスタンスである。印刷開始オブジェクト743T及び印刷終了オブジェクト744Tは、Transitクラス1003のインスタンスである。
図14においてオブジェクト同士を連結する線分は、オブジェクト同士の参照関係を表す。遷移元の状態オブジェクトは遷移先の状態オブジェクトを参照している。なお、図中では状態オブジェクト間に遷移オブジェクトが接続されている。例えば、Idle状態オブジェクト741SとPrint状態オブジェクト742Sとの間には印刷開始オブジェクト743Tが接続されている。しかし、このことはIdle状態703が、Print状態オブジェクト742Sを参照していないことを示すものではない。Idle状態オブジェクト741Sは、Print状態オブジェクト742Sを参照すると共に、その状態遷移に対応する遷移オブジェクトとして印刷開始オブジェクト743Tをも参照することを表現したものである。
オブジェクトの状態は、サービスの授受を行う「アクティブ状態」とサービスの授受を行わない「非アクティブ状態」に分類される。Function Service601におけるステートマシンの振る舞い変更を当該ステートマシンの動作中に実行するには、当該ステートマシンの更新部分のオブジェクトがアクティブ状態ではないとき(非アクティブ状態のとき)に実行すればよい。当該ステートマシンの動作中のオブジェクト同士のサービスの授受が更新処理により阻害されずに済むからである。よって、Function Service601の更新処理をFunction Service601の更新部分のオブジェクトがアクティブ状態ではないときに実行するのである。なお、状態遷移図によるモデリングでは、一のオブジェクトがアクティブ状態のときは他のオブジェクトは非アクティブ状態に限定される。すなわち、各オブジェクトは互いに排他的に処理を実行する(動作する)。
図14に示されるPrint Service712のオブジェクト構成が構築される過程について説明する。
図15は、Print Serviceのオブジェクト構成の構築処理を説明するためのシーケンス図である。図15の処理は、Print Service712がState Machine Pool731によってインスタンス化される際に実行される。
Print Service712は、インスタンス化されると、Print Service712の状態遷移情報に基づいて、Print Service712の状態遷移モデルに対応したオブジェクト構成を構築する(S401)。状態遷移情報は、例えば、融合機101の所定の記憶装置内に、以下の形式で保存されている。
図16及び図17は、Print Serviceの状態遷移情報の定義例を示す図である。図16及び図17によって一つの状態遷移情報900の記述例が示されている。状態遷移情報900は、XMI(XML Metadata Interchange)に従った記述例が示されている。XMIは、モデルを各種のソフトウェアの間でXML文書によって交換することを目的とした標準規格である。但し、本実施の形態を実施するにあたり、状態遷移情報は、必ずしもXMIに従って記述される必要はない。なお、図中における行番号は、説明の便宜上付加したものである。
状態遷移情報900の1行目における<StateMachine>タグのタグ名、及びそのname属性の値(「Print」)によって、状態遷移情報900は、Print Service712に対応するものであることが定義されている。また、当該<StateMachine>タグにおけるxmi.id属性の値(「003」)は、Print Service712を識別するためのIDである。
3行目の<CompositeState>タグは、Print Service712における状態の定義の開始の宣言に相当する。当該宣言は、<CompositeState>タグのxmi.idの値(「004」)によって識別される。
5行目から15行目におけるCompositeState要素910は、Idle状態741に対する定義である。CompositeState要素910のname属性の値には「Idle」が設定され、xmi.id要素の値には、「005」が設定されている。
16行目から26行目(図17)におけるCompositeState要素920は、Print状態742に対する定義である。CompositeState要素920のname属性の値には「Print」が設定され、xmi.id要素の値には、「008」が設定されている。
また、34行目から64行目には、Print Service712における各状態遷移が定義されている。すなわち、34行目から50行目におけるTransition要素930は、Idle状態741からPrint状態742への状態遷移に対する定義である。Transition要素930が当該状態遷移に対する定義であることは、Transition要素930の子要素として定義されている、Transition.source要素931及びTransition.target要素932より特定される。Transition.source要素931は遷移元の状態が設定される要素である。Transition.source要素931の子要素のxmi.idref属性の値は「005」である。したがって、遷移元は、xmi.id属性の値が「005」の状態、すなわち、Idle状態741であることが分かる。また、Transition.target要素932は遷移先の状態が設定される要素である。Transition.target要素932の子要素のxmi.idref属性の値は「008」である。したがって、遷移先は、xmi.idの値が「008」の状態、すなわち、Print状態742であることが分かる。なお、Transition要素930のname属性の値は「印刷開始」であり、xmi.id属性の値は「006」である。
51行目から64行目におけるTransition要素940は、Print状態742からIdle状態741への状態遷移に対する定義である。Transition要素940が当該状態遷移に対する定義であることは、Transition.source要素941内のxmi.idref属性の値が「008」(Print状態742)であり、Transition.target要素942内のxmi.idref属性の値が「005」(Idle状態741)であることから特定される。なお、Transition要素940のname属性の値は「印刷終了」であり、xmi.id属性の値は「007」である。
5行目以降の説明に戻る。各状態に対応する、CompositeState要素910及びCompositeState要素920は、StateVertex.outgoing要素及びStateVertex.incoming要素の少なくともいずれか一方を子要素として有する。StateVertex.outgoing要素は、遷移元からの状態遷移に対する接続が定義される要素である。StateVertex.incoming要素は、遷移先への状態遷移に対する接続が定義される要素である。
例えば、Idle状態741に対応するCompositeState要素910おけるStateVertex.outgoing要素911においてその子要素のxmi.idref属性の値は「006」であり、StateVertex.incoming要素912において、その子要素のxmi.idref属性の値は「007」である。したがって、Print状態742からの遷移先への状態遷移は、Transition要素930が対応する状態遷移に相当し、遷移元の状態遷移は、Transition要素940が対応する状態遷移に相当することが分かる。
また、Print状態742に対応するCompositeState要素920おけるStateVertex.outgoing要素921においてその子要素のxmi.idref属性の値は「007」であり、StateVertex.incoming要素922において、その子要素のxmi.idref属性の値は「006」である。したがって、Print状態742からの遷移先への状態遷移は、Transition要素940が対応する状態遷移に相当し、遷移元の状態遷移は、Transition要素930が対応する状態遷移に相当することが分かる。
上記のような状態遷移情報900に基づいて、Print Service712は、まず、各状態オブジェクト及び遷移オブジェクト等をインスタンス化する。図中では、状態遷移情報900におけるCompositeState要素910、CompositeState要素920、Transition要素930、及びTransition要素940のそれぞれに基づいて、Idle状態オブジェクト741S、Print状態オブジェクト742S、印刷開始オブジェクト743T、及び印刷終了オブジェクト744Tが生成されている例が示されている(S402〜S405)。
続いて、Print Service712は、各状態オブジェクトの参照関係が状態遷移情報900に定義された状態遷移の順になるよう、遷移元の状態オブジェクトに対して遷移先の状態オブジェクトを接続する。例えば、Print Service712は、Print状態オブジェクト742Sの識別情報と印刷開始オブジェクト743Tの識別情報とを引数として、Idle状態オブジェクト741Sのconnect()メソッドを呼び出す(S406)。また、Print Service712は、Idleオブジェクト741Sの識別情報と印刷終了オブジェクト744Tの識別情報とを引数として、Print状態オブジェクト742Sのconnect()メソッドを呼び出す(S407)。connect()メソッドを呼び出された各状態オブジェクトは、当該状態オブジェクト内において引数に指定された識別情報を保持する。
このように、connect()メソッドの引数に、状態オブジェクトと遷移オブジェクトとのそれぞれの識別情報が指定された場合、当該メソッドが呼び出された状態オブジェクトは、その状態オブジェクトの識別情報と遷移オブジェクトの識別情報とを関連付けて(ペアで)保持する。これによって、ある状態オブジェクトがアクティブのときに、あるイベントが発生したときの遷移先の状態オブジェクトが特定され得る。
以上の処理によって、Print Service712について、図14に示されるようなオブジェクト構成が構築される。
上記をふまえて、Print Service712の振る舞い変更処理を具体的に説明する。図18及び図19は、Print Serviceの振る舞い変更処理を説明するためのシーケンス図である。
プラットフォーム132からJSDK Environment521に、例えば、不都合や不具合の発生等を示すイベントが送信される(S421)。ここでは、メモリが不足していることを示すイベントが通知されたこととする。但し、ここで通知されるイベントは不具合や不都合に限定されず、例えば、機器の状態の変化も含まれ得る。機器の状態の変化としては、静的な情報(機種名、機種のスペック、周辺機器情報)の変化と動的な情報(使用可能メモリ、周辺機器の状態、ユーザ操作)の変化とがある。静的な情報の変化は確定した時にJSDK Environment521に通知され、動的な情報は変化が発生した時に随時通知される。 JSDK Environmnet521は、プラットフォーム132からのイベントに応じた振る舞い修正指示がAspectSMに記載されているか確認する。
図20は、Print Serviceの振る舞いの変更内容が記述されたAspectSMの記述例を示す図である。AspectSM810には、Print Service712の状態遷移情報900(図16及び図17)に対する変更内容が記述されている。
AspectSM810において、1行目から6行目までの<Event>タグで囲まれたEvent要素811のname属性、type属性、value属性のそれぞれには、振る舞いを変更するトリガとなるイベント名、条件、閾値が記述される。また、Event要素811の子要素(modify.StateMachine要素)には、振る舞いの変更対象となるステートマシンが記述される。図20の例では、空きメモリが10MBを下回ったことを示すイベントを受信した場合にPrint(Print Service712)に対して振る舞いを変更することが記述されている。
7行目から15行目までのaspect要素812のXMI.StateMachine属性には、変更するステートマシン名(Print)が記述される。また、pointcut.Transmission要素813のname属性には、Print Service712において変更対象となる状態遷移の名前が記述され、timeng属性にはAspectSM810による変更処理を実行するタイミングが記述される。図20の例では、Print Service712の状態遷移において、Idle状態741のときに振る舞い変更処理を実行することが記述されている。advice.Gaurd要素には、変更の内容が記述される。すなわち、<advice.Guard>タグのタグ名におけるadvice.以降によって、変更の対象がGuard(ガード条件)であることが記述されている。また、type属性によって、変更の種別が「insert」(挿入)であることが記述されている。すなわち、変更内容はガード条件を挿入することであることが記述されている。10行目から12行目までは、実際に状態遷移情報900に挿入される定義である。すなわち、AspectSM810では、「Idle状態741のときにPrint Service712の印刷開始イベント743に基づく状態遷移に対してガード条件(Fax Service714がIdle状態であること)を付加すること」が定義されている。
なお、各イベントに応じたAspectSMは、予め融合機101のHDD233又はメモリカード235等に保存されている。
したがって、ステップS421において通知されたイベントが、空きメモリが10MBを下回ったことを示すものであった場合、JSDK Environmnet521は、図20のAspectSM810に基づいて、Print Service712の振る舞いを変更する必要があることを判断し、Modify Agent732にPrint Service712の振る舞い変更情報を添付して振る舞い変更要求を発行する(S422)。ここで、「振る舞い変更情報」とは、AspectSM810より、振る舞いの変更に必要な情報のみが抽出されたものでもよいし、AspectSM810そのものでもよい。
Modify Agent732は、Print Service712に対する振る舞い変更要求を受け、State Machine Pool731に対して、Print Service712の状態遷移情報900の取得要求を発行する(S423)。State Machine Pool731は、状態遷移情報900の取得要求に対して、当該状態遷移情報が登録されていれば状態遷移情報900をModify Agent732に提供する(S424)。
State Machine Pool731から状態遷移情報900を取得できた場合、Modify Agent732は、Print Service712の状態遷移情報900に対する振る舞い変更処理の可否を判断する(S425a)。一方、状態遷移情報900を取得できなかった場合、Modify Agent732は、State Machine Pool731にPrint Service712は登録されていないことを実装してないことをJSDK Environmnet521に通知する(S425b)。
ステップS425aにおいて、振る舞い変更処理が可能であると判断した場合、Modify Agent732は、State Machine Pool731に対して、Print Service712がインスタンス化されているか(すなわち、図14に示されるオブジェクト構成がメモリ上に構築されているか)を問い合わせる(S426a)。一方、ステップS425aにおいて、振る舞い変更処理は不可能であると判断した場合、Modify Agent732は、JSDK Environmnet521に変更不可であることを通知する(S426b)。
ステップS426aの問い合わせに対して、State Machine Pool731は、Print Service712がインスタンス化されていればそのインスタンスを返却する(S427)。
Print Service712のインスタンスが生成されていない場合、Modify Agent732は、状態遷移情報900に対し振る舞い変更情報に応じた修正を行い、修正された状態遷移情報900をState Machine Pool731に登録する(S428a)具体的には、状態遷移情報900の34行目と38行目の間に、AspectSM810の10行目から13行目が挿入される。したがって、以降にPrint Service712がインスタンス化される際は、修正された状態遷移情報900に基づいて、オブジェクト群が構築される。
一方、Print Service712のインスタンスが生成されている場合、Modify Agent732は、図19に示される処理を実行する(S428b)
図19において、Modify Agent732は、Print Service712のIdle状態オブジェクト741Sを検索する(S431、S432)。ここで、Modefy Agent732は、AspectSM810のpointcut.Transmission要素813のtiming属性に基づいて、Idle状態オブジェクト741Sを監視することにより、Print Service712がIdle状態741に遷移するまで待機する。
Print Service712がIdle状態741に遷移すると、Modify Agent732は、Idle状態オブジェクト741Sより、印刷開始オブジェクト743Tを検索する(S433、S434)。続いて、Modify Agent732は、ガード条件を表現するガード条件オブジェクト746を生成し(S435)、AspectSM810に定義されているガード条件([is_in(FaxTxIdle)])を、ガード条件オブジェクト746に設定する(S436)。ここで、FaxTxIdleは、Fax Service714のIdle状態オブジェクトの識別情報である。
続いて、Modify Agent732は、印刷開始オブジェクト743Tに対して、ガード条件オブジェクト746を設定する(S437)。ここで、印刷開始オブジェクト743Tは、Idle状態741からPrint状態742への状態遷移に対応するオブジェクトである。したがって、ステップS437の処理により、当該状態遷移にガード条件が付加されたことになる。以降、Print Service712において、Idle状態741からPrint状態742への遷移が発生する際、印刷開始オブジェクト743Tに設定されたガードオブジェクト746に基づいて、遷移の可否が判定される。
上述したように、本実施の形態におけるFunction Service601は、状態オブジェクトの遷移によってサービスを実現する。また、サービスの実現過程において、アクティブな状態オブジェクトが限定されるように構成されている。言い換えれば、非アクティブな状態オブジェクトが存在することになる。このような構成を前提として、AspectSM810には、更新部分が非アクティブなタイミングで更新が行われるような更新指示が記述されている。そして、かかるAspectSM810に従って、更新部分が非アクティブなときに更新が実行される。したがって、本実施の形態におけるFunction Service601は、当該Function Service601の実行中にその振る舞いの変更を実行することができる。また、振る舞いの変更にあたり、オブジェクト群が再構築されるわけではないので、当該Function Service601の参照側との参照関係が破壊されることなく、動的にその振る舞いを変更することが可能となっている。よって、融合機101を再起動することなくFunction Service601の振る舞いは変更され得る。
なお、本実施の形態においては、ステートマシンが状態遷移モデルに基づいて設計された例を用いて説明したが、本発明が適用可能なプログラムは、状態ごとにオブジェクトが構築されるような構成であるものに限定されない。お互いに排他的に動作する複数のモジュール(オブジェクトも含む)の接続によって構成されているものでればよい。ここで排他的に処理を実行するとは、あるモジュールが動作中(アクティブ)のときは、他のモジュールは動作中でない(非アクティブである)ことが保証されることをいう。このようなソフトウェアであれば、動作中でないモジュールを変更することが可能であり、本実施の形態において説明した振る舞いの変更処理を適用させることができる。
2)Modify Service
図21は、図7のJSDKシステムを構成するModify Service602について説明するためのクラス図である。Modify Service602は、JSDKアプリ147からのFunction Service601に対するサービスの提供要求に応じて、Function Service601のサービスを修正するクラスである。すなわち、第一節(Function Service)では、プラットフェーム132からのイベントに応じて、Function Service601が、自らの振る舞いを変更する処理について説明したが、Modify Service602は、JSDKアプリ147がFunction Service601を利用しようとしたときに、Function Service601の振る舞いを変更するのである。
図7のJSDKシステムでは、第1節で取り上げたFunction Service601と第2節で取り上げるModify Service602は下位層と上位層の関係にある。図7のJSDKシステムには、Function Service601とユーザアプリ501との間のサービス授受を仲介するAPIとして、Function API611が存在し、Modify Service602とユーザアプリ501との間のサービス授受を仲介するAPIとして、Modify API612が存在する。Modify Service602とModify API612の実装態様は、図21の実装態様ではなく図22の実装態様でもよい。図21についての説明の内容は図22についても同様に成立する。なお、図21は、Modify API612は、複数のユーザアプリ501に対して有効であること(呼び出し元が限定されないこと)を示す。一方、図22は、Modify API612は、特定のユーザアプリ501に対して有効であること(呼び出し元が限定されること)を示す。
Modify Service602とModify API612の実装理由を説明する事にする。図7のJSDKシステムには、Function Service601の振る舞いを動的に変更する機能は実装しているが、Function API611の動作を動的に変更する機能は実装していない。APIの実装態様はユーザアプリ501の開発効率に与える影響が大きいところ、APIの動作を動的に変更するような実装は開発トラブルや市場トラブルを招き兼ねないからである。よって、Function Service601のサービスを修正するには、Function Service601のサービスを修正するModify Service602を、Function Service601に上乗せするのである。そしてさらに、Function API611にModify API612を上乗せする。
図21に示す通り、旧バージョンのユーザアプリ501は、Function API611を通じてFunction Service601にサービスを要求(S101)する。一方、新バージョンのユーザアプリ501は、Function Service601にサービスを要求する際には、Function API611を通じてFunction Service601にサービスを要求(S102)して、Modify Service602にサービスを要求する際には、Modify API612を通じてModify Service602にサービスを要求(S103)する。
但し、Modify Service602を介してサービス要求がなされ、Function Service601の振る舞いが変更された後は、旧バージョンのユーザアプリ501であっても、Function API611を通じて、振る舞いが変更されたFunction Service601によるサービスの提供を受けることができる。
Modify Service612について更に具体的に説明する。図23は、Modify ServiceによるFunction Serviceの変更処理を説明するためのシーケンス図である。図23では、Fax Servece714を利用するためのFunction API611の呼び出しに応じて、Printer Service712の振る舞いが変更される例について説明する。
JSDKアプリ147の一つであるFax送信アプリ501fが起動されている状態において、ユーザが、オペレーションパネル202を介してFax送信アプリ501fに対して送信開始の指示を行ったとする(S501)。Fax送信アプリ501fは、ユーザからの指示に応じ、Function API601又はModify API612の一部を構成するFax送信クラス611fを用いて送信開始を行う(S502)。具体的には、Fax送信アプリ501fは、Fax送信クラス611fのstart()メソッド(Faxtx.start())を呼び出す。
Fax送信クラス611fは、FaxTx.start()メソッドが呼ばれたこと(送信開始イベント753の発生)を要求元のアプリのプロダクトIDを添えてModify Service602に通知する(S503)。Modify Service602は、通知されたイベント(送信開始イベント753)が、Fax送信アプリ501fのインストールの際にFax送信アプリ501fに対応させて登録されたAspectSMに基づく振る舞い変更のトリガとなるイベントであるか当該AspectSMを参照することにより判断する。
図24は、Fax送信アプリに対応させて登録されたAspectSMの記述例を示す図である。図24のAspectSM820は、2行目の記述内容が、図20のAspectSM810と異なる。
すなわち、AspectSM820のEvent要素821のname属性には、振る舞いを変更するトリガとなるイベント名として"Method"が記述されている。これは、メソッドが呼び出されたことがトリガとなることを意味する。また、type属性には、トリガとなる具体的なメソッド名(" jp.co.rrr.function.FaxTx:start(void)")が記述されている。ここで「FaxTx」とは、Fax送信クラスを示す。更に、value属性には、メソッドの呼び出し元を特定するプロダクトID("123456")が記述されている。ここで、"123456"は、Fax送信アプリ501fのプロダクトIDである。呼び出し元を特定しない場合、value属性の値は空となる。なお、value属性の値にプロダクトIDが指定されない場合(すなわち、呼び出し元が限定されない場合)と、プロダクトIDが指定される場合(すなわち、呼び出し元が限定される場合)との違いは、図21と図22との違いによって概念的に示されている。
上記より、AspectSM820には、Fax送信アプリ501fからのFaxtx.start()の呼び出しが、振る舞いを変更するトリガであることが記述されていることが分かる。
したがって、Modify Service602は、AspectSM820のEvent要素821に基づいて、Fax送信クラス611fより通知されたイベント(送信開始イベント753)は、振る舞い変更のトリガとなるイベントであると判断し、Modify Agent732に「振る舞い変更情報」を添えて、Printer Service712の振る舞いの変更を要求する(S504)。
続いて、ステップS505からステップS510bまでは、図18のステップS423からステップS428bまでと同様の処理が実行される。したがって、ステップS510bでは、図19において説明した処理と同様の処理が実行され、Printer Service712の振る舞いが変更される。すなわち、Printer Service712における、Idle状態741からPrint状態742への状態遷移に対してガード条件が付加される。
続いて、Modify Agent732は、Printer Service712の振る舞いの変更が完了したことをModify Service602に通知する(S511)。Modify Service602は、Fax送信クラス611fに対して変更の完了を通知する(S512)。
Fax送信クラス611fは、Modify Service602からの変更完了通知が届くまで待機している。Fax送信クラス611fは、変更完了通知に応じてState Machine Pool731に対して送信開始イベント753を発行する(S513)。State Machine Pool731は、送信開始イベント753の通知先を検索し、検索されたFax Service713に送信開始イベント753を通知する(S514)。
ここでFax Service713によってFaxの送信処理が実行されるが、この間は、上記で説明した振る舞いの変更によってPrinter Service712に対して印刷開始イベント743が発行されても、印刷は開始されない。
Fax Service714によるFax送信が完了すると(S515)、State Machine Pool731は、Fax送信クラス611fに送信完了通知を行う(S516)。Fax送信クラス611fは、State Machine Pool731からの送信完了通知を受けてFax送信アプリ501fに送信完了通知を行う(S517)。Fax送信アプリ501fは、オペレーションパネル202に送信が完了した旨のメッセージ等を表示することにより、Fax送信の完了をユーザに通知する(S518)。
ところで、図23のステップS514において、「State Machine Pool731は、送信開始イベント753の通知先を検索する」と説明したが、State Machine Pool731に通知されたイベントが、どのように各ステートマシンに通知されるかについて説明する。
図25は、State Machine Poolによるイベントの通知方式について説明するための図である。
State Machine Pool731は、イベントを受け付けると、管理しているステートマシン群に対して、ラウンドロビン方式で順番にイベントを発行する。これにより、ステートマシン間では排他的な動作が実現される。また、個々のステートマシンも遷移処理を排他的に処理することにより、State Machine Pool731内のアクション処理を排他的に実行することができる。
図25に示される手順に沿って説明する。
送信開始イベント753が、State Machine Pool731に対して発行される(S521)。State Machine Pool731は、管理している全てのステートマシン(但し、イベントに宛先が明示されている場合は、特定のステートマシン)に送信開始イベント753をラウンドロビン方式で発行する(S521〜S524)。例えば、Fax Service714が、待ち行列の最初に位置している場合、State Machine Pool731は、最初にFax Service714に送信開始イベント753を発行する(S521)。
Fax Service714は、今現在、アクティブな状態オブジェクトに接続している全ての遷移オブジェクトに対して順番にイベントを発行し、遷移条件を満足しているかを確認する。遷移条件を満足していれば、アクションを実行して遷移する。例えば、Idle状態751であれば、送信開始イベント753によりFaxSend状態752に遷移し、Fax送信を開始する。
3)Extend Service
図26は、図7のJSDKシステムを構成するExtend Service603について説明するためのクラス図である。Extend Service603は、Function Service601のサービスを拡張するクラスである。図7のJSDKシステムでは、第1節で取り上げたFunction Service601と第3節で取り上げるExtend Service603は同位層の関係にある。図7のJSDKシステムには、Function Service601とユーザアプリ501との間のサービス授受を仲介するAPIとして、Function API611が存在し、Extend Service603とユーザアプリ501との間のサービス授受を仲介するAPIとして、第1のExtend API613−1が存在し、Function Service601とExtend Service603との間のサービス授受を仲介するAPIとして、第2のExtend API613−2が存在する。
Extend Service603とExtend API613の実装理由を説明する事にする。JSDKアプリ147の多様な変化にJSDKプラットフォーム148が適切に対応するには、Function Service601のサービスをより他律的に変更できる方が好適な場合がある。Function Service601に部品を外部から提供してFunction Service601のサービスを拡張する場合等である。よって、Function Service601のサービスを拡張するのに、Function Service601のサービスを拡張するExtend Service603を、Function Service601とともに実装するのである。そしてさらに、Function API611とともにExtend API613を実装する。
図26に示す通り、旧バージョンのユーザアプリ501は、Function API611を通じてFunction Service601にサービスを要求(S201)する。一方、新バージョンのユーザアプリ501は、Function Service601に非拡張バージョンのサービスを要求する際は、Function API611を通じてFunction Service601にサービスを要求(S202)して、Function Service601に拡張バージョンのサービスを要求する際は、第1のExtend API613−1とExtend Service603と第2のExtend API613−2とを通じてFunction Service601にサービスを要求(S203−1,2)する。
図27は、Extend Serviceの動作の概要を説明するための図である。
図27に示されるFunction Service601にて、Adaptive Behavior702には、非拡張バージョンのFax Service714であるFaxTx1と、拡張バージョンのFax Service714であるFaxTx2が存在する。FaxTx1は、画像データをFAX送信するFax Service714である。FaxTx2は、画像データをPDFからTIFFに変換してFAX送信するFax Service714である。画像データをPDFからTIFFに変換してFAX送信する場合において、FaxTx1が送信処理に関与する場合にはJSDKアプリ147で変換処理を実行する事になり、FaxTx2が送信処理に関与する場合にはJSDKプラットフォーム148で変換処理を実行する事になる。
図28は、FaxTx1やFaxTx2の状態遷移モデルである。FaxTx1の状態には、初期状態760、Idle状態761、Send状態762、及び終期状態764等が存在する。FaxTx2の状態には、初期状態760、Idle状態761、Send状態762、Transform状態763、及び終期状態764等が存在する。Idle状態761は、FAX送信処理の待機中の状態である。Send状態762は、FAX送信処理を実行中の状態である。Transform状態763は、画像変換処理を実行中の状態である。図28により、FaxTx1とFaxTx2は継承関係にある事が解る。FaxTx1が継承前のクラスであり、FaxTx2が継承後のクラスである。
Function Service601にて、Adaptive Behavior702では、自己の振る舞いを動的に継承する事で、自己の振る舞いを動的に変更する事ができる。例えば、図27に示す通り、FaxTx1がFaxTx2に動的に継承される事で、画像データをPDFからTIFFに変換しない振る舞いが変換する振る舞いに動的に変更される事になる。
Function Service601にて、Adaptive Behavior702では、自己に振る舞い継承用のプラグイン部品をプラグインする事で、自己の振る舞いを動的に継承する事ができる。例えば、図27に示す通り、画像データをPDFからTIFFに変換するためのプラグイン部品の「PDF2TIFF」のプラグインにより、FaxTx1がFaxTx2に動的に継承される。振る舞い継承用のプラグイン部品は、Extend Service603がFunction Service601に提供する。
図29は、Fax Serviceに関するプラグイン処理を説明するための図である。
Function Service601にて、Adaptive Behavior702には、State Machine Pool731、Plugin Agent733等のクラスが存在する。
State Machine Pool731は、FaxTx1やFaxTx2の状態遷移モデルを管理するクラスである。Plugin Agent733は、FaxTx1やFaxTx2の状態遷移モデルに振る舞い継承用のプラグイン部品のプラグイン結果を反映させるクラスである。
Plugin Agent733は、Function Service601に振る舞い継承用のプラグイン部品がプラグインされた場合、State Machine Pool731が管理する状態遷移モデルに振る舞い継承用のプラグイン部品のプラグイン結果を反映させる。これによって、Function Service601の振る舞いが動的に変更される。
図26から図29にかけてその概要を説明したFaxTx1からFaxTx2への拡張処理について更に具体的に説明する。
拡張前のFax Service714であるFaxTx1は、図13に示したモデルに基づいて、以下のようなオブジェクトによって構成される。
図30は、FaxTx1のオブジェクト構成を表す図である。FaxTx1は、図28の状態遷移モデルに基づいて、初期状態オブジェクト760S、終期状態オブジェクト764S、Idle状態オブジェクト761S、Send状態オブジェクト762S、送信開始オブジェクト765T、送信処理オブジェクト762A等より構成されている。
また、図31はFaxTx2のオブジェクト構成を表す図である。FaxTx2は、図28の状態遷移モデルに基づいて、初期状態オブジェクト760S、終期状態オブジェクト764S、Idle状態オブジェクト761S、Send状態オブジェクト762S、Transform状態オブジェクト763S、送信開始オブジェクト765T、送信処理オブジェクト762A、変換処理オブジェクト763A、変換終了オブジェクト766T等より構成されている。なお、図30及び図31においては、一部の遷移オブジェクトが省略されているが(例えば、Send状態762から終期状態764への状態遷移に対応する遷移オブジェクト)、これは便宜的なものである。
図30及び図31より、FaxTx1からFaxTx2への拡張処理とは「Transform状態オブジェクト763S」や「変換処理オブジェクト763A」や「変換終了オブジェクト766T」といった拡張処理用のオブジェクトをFaxTx1に対して追加する事で実現できることが分かる。
Fax Service714の拡張処理の影響が顕著なオブジェクトが、Fax Service714の更新部分のオブジェクトである。Fax Service714の更新部分のオブジェクトとは、オブジェクトの入替部分やオブジェクトの追加部分(Fax Service714の更新部分)に連結するオブジェクトを意味する。図30から図31への拡張処理では、Fax Service714の更新部分に相当するのがスイッチ770等の追加部分であり、Fax Service714の更新部分のオブジェクトに相当するのがSend状態オブジェクト762Sや送信開始オブジェクト765Tである。Fax Service714の拡張処理をFax Service714の動作中に実行するには、Fax Service714の更新部分のオブジェクトがアクティブ状態ではないとき(非アクティブ状態のとき)に実行すればよい。
図32及び図33は、FaxTx1の状態遷移情報の定義例を示す図である。図32及び図33によって一つの状態遷移情報1100の記述例が示されている。なお、図中における行番号は、説明の便宜上付加したものである。
状態遷移情報1100の121行目における<StateMachine>タグのタグ名、及びそのname属性の値(FaxTx1)によって、状態遷移情報1100は、FaxTx1に対応するものであることが定義されている。また、当該<StateMachine>タグにおけるxmi.id属性の値(「004」)は、FaxTx1を識別するIDである。
125行目の<CompositeState>タグは、FaxTx1における状態の定義の開始の宣言に相当する。当該宣言は、<CompositeState>タグのxmi.idの値(「017」)によって識別される。
130行目から137行目における<Pseudostate>タグによって囲まれたPseudostate要素1110は、初期状態760に対する定義である。Pseudostate要素1110のname属性の値には「Init」が設定され、xmi.id要素の値には、「018」が設定されている。
138行目から148行目におけるCompositeState要素1120は、Send状態762に対する定義である。CompositeState要素1120のname属性の値には「Send」が設定され、xmi.id要素の値には、「019」が設定されている。
149行目から159行目におけるCompositeState要素1130は、Idle状態761に対する定義である。CompositeState要素1130のname属性の値には「Idle」が設定され、xmi.id要素の値には、「022」が設定されている。
160行目から183行目におけるPseudostate要素1140は、終期状態764に対する定義である。Pseudostate要素1140のname属性の値には「end」が設定され、xmi.id要素の値には、「024」が設定されている。
また、191行目から228行目には、FaxTx1における各状態遷移が定義されている。すなわち、191行目から204行目におけるTransition要素1150は、Idle状態761からSend状態762への状態遷移に対する定義である。Transition要素1150が当該状態遷移に対する定義であることは、Transition要素1150の子要素として定義されている、Transition.source要素1151及びTransition.target要素1152より特定される。Transition.source要素1151は遷移元の状態が設定される要素である。Transition.source要素1151の子要素のxmi.idref属性の値は「022」である。したがって、遷移元は、xmi.id属性の値が「022」の状態、すなわち、Idle状態761であることが分かる。また、Transition.target要素1152は遷移先の状態が設定される要素である。Transition.target要素1152の子要素のxmi.idref属性の値は「019」である。したがって、遷移先は、xmi.idの値が「019」の状態、すなわち、Send状態762であることが分かる。なお、Transition要素1150のname属性の値は「送信開始」であり、xmi.id属性の値は「023」である。
205行目から218行目におけるTransition要素1160は、Send状態762から終期状態764への状態遷移に対する定義である。Transition要素1160が当該状態遷移に対する定義であることは、Transition.source要素1161内のxmi.idref属性の値が「019」(Send状態762)であり、Transition.target要素1162内のxmi.idref属性の値が「024」(終期状態764)であることから特定される。なお、Transition要素1160のname属性の値は「送信終了」であり、xmi.id属性の値は「020」である。
219行目から228行目におけるTransition要素1170は、初期状態760からIdle状態761への状態遷移に対する定義である。Transition要素1170が当該状態遷移に対する定義であることは、Transition.source要素1171内のxmi.idref属性の値が「018」(初期状態760)であり、Transition.target要素1172内のxmi.idref属性の値が「022」(Idle状態761)であることから特定される。なお、Transition要素1170のxmi.id属性の値は「018」である。
130行目以降の説明に戻る。各状態に対応する、Pseudostate要素1110、CompositeState要素1120、及びCompositeState要素1130は、StateVertex.outgoing要素及びStateVertex.incoming要素の少なくともいずれか一方を子要素として有する。StateVertex.outgoing要素は、遷移元からの状態遷移に対する接続が定義される要素である。StateVertex.incoming要素は、遷移先への状態遷移に対する接続が定義される要素である。
例えば、初期状態760に対応するPseudostate要素1110におけるStateVertex.outgoing要素1111において、その子要素のxmi.idref属性の値は「018」である。したがって、初期状態760からの遷移先への状態遷移は、Transition要素1170が対応する状態遷移に相当することが分かる。
また、Send状態762に対応するCompositeState要素1120おけるStateVertex.outgoing要素1121においてその子要素のxmi.idref属性の値は「020」であり、StateVertex.incoming要素1122において、その子要素のxmi.idref属性の値は「023」である。したがって、Send状態762からの遷移先への状態遷移は、Transition要素1160が対応する状態遷移に相当し、遷移元の状態遷移は、Transition要素1150が対応する状態遷移に相当することが分かる。
なお、Idle状態761に対応するCompositeState要素1130、終期状態764に対応するPseudostate要素1140においても同様に状態遷移との接続が定義されている。
このような状態遷移情報に基づいて、FaxTx1のオブジェクト構成は構築される。なお、オブジェクト構成の構築処理は、図15において説明したものに準ずるため、ここでの説明は省略する。
上記をふまえて、Fax Service714の拡張処理を具体的に説明する。図34は、Fax Serviceの拡張処理を説明するためのシーケンス図である。
例えば、管理者は、FaxTx2とFaxTx1との差分の追加モジュールが格納されたSDカードを融合機101のメモリカードスロット234に挿入する(S601)。
図35は、SDカード内の追加モジュールの構成例を示す図である。図35に示されるSDカード235aには、Fax拡張インタフェース613−1aと、更新差分サービスバンドル840と、AspectSM.xmlファイル850(AspectSM850)とが格納されている。Fax拡張インタフェース613−1a(FaxTxEx)は、Fax Service714を拡張するためのExtend API613−1に相当する。更新差分サービスバンドル840には、拡張処理を実行するにあたり、図13のクラス図において、IStateインタフェース1004a、Activityインタフェース1004b、Eventインタフェース1003a、Guardインタフェース1003b、又はActionインタフェース1003cに対応するクラスのうち、追加が必要とされるクラスが実装された機能モジュール(例えば、Java(登録商標)のクラスファイル。以下「追加モジュール」という。))が格納されている。ここでは、追加モジュールとして、PDF2Tiff841とConvertEnd842とが格納されている。
AspectSM850は、FaxTx1からFaxTx2への拡張処理をどのように実施するかについての仕様がXML形式記述されているファイルである。
図36は、Fax Serviceの拡張内容が記述されたAspectSMの記述例を示す図である。図中、行番号は説明の便宜上付加したものである。AspectSM850には、FaxTx1の状態遷移情報1100(図32及び図33)に対する変更内容が記述されている。
AspectSM850の記述例において、2行目は、xmi.idの値が「004」であるFaxTx1に対して状態遷移の変更を行うことを指示している。すなわち、2行目におけるxmi.idref属性は、変更の対象となるステートマシンのxmi.idが指定される。
3行目から20行目までは一つ目の変更箇所に関する変更情報が記述されている。3行目には、変更箇所と変更タイミングが指定されている。変更箇所は、pointcut.<xxx>における<xxx>の記述とxmi.ref属性の値とによって指定される。ここで、<xxx>の部分は「CompositeState」であり、xmi.ref属性の値は「017」である。したがって、状態遷移情報1100の125行目における<CompositeState>タグ内に対する変更が指定されていることになる。また、変更のタイミングは、timing属性の値によって指定される。ここでは、「Idle」が指定されている。したがって、FaxTx1がIdle状態761にあるときに、変更を行うべきことが指定されている。
4行目には、変更の内容が指定されている。すなわち、<advice.CompositeState>タグのタグ名におけるadvice.以降によって、変更の対象がCompositeState要素であることが指定されている。また、type属性によって、変更の種別が「insert」(挿入)であることが指定されている。すなわち、3行目及び4行目によって、<CompositeState>タグ内に新たなCompositeState要素を挿入すべき旨が指定されている。
5行目から18行目は、挿入の対象となるCompositeState要素851の定義である。CompositeState要素851は、FaxTx2のTransform状態763に対応する。CompositeState要素851内の記述形式は、図32及び図33において説明した通りである。すなわち、CompositeState要素851の子要素である、StateVertex.outgoing要素852において遷移先への接続が定義され、StateVertex.incoming要素853において遷移元への接続が定義されている。
ところで、CompositeState要素851は、State.entry要素854が子要素として定義されている。State.entry要素854は、CompositeState要素851が対応するTransform状態763における入場処理が定義される要素である。すなわち、CompositeState要素851の子要素として、Action要素855が定義されているが、そのxmi.id属性とname属性より、xmi.id属性の値が「026」であり、name属性の値がpdf2tiffによって識別される処理が実行されることが指定されている。
21行目から42行目までは二つ目の変更箇所に関する変更情報が指定されている。21行目には、変更箇所及び変更のタイミングが指定されている。ここでは、Idle状態761のときにTransition要素1150(図33参照)に対して変更を行うことが指定されている。
二つ目の変更箇所には、二つの変更が指定されている。22行目から24行目までに一つ目の変更が指定されており、25行目から41行目までに二つ目の変更が指定されている。
一つ目の変更については、22行目の<advice.Transition.target>タグのタグ名におけるadovice.以降によって変更対象がTransition.target要素1152であることが指定されている。また、type属性によって、変更の種別が修正(modify)であることが指定されている。23行目には、変更の対象に関して修正後の定義が記述されている。すなわち、一つ目の変更は、Idle状態761からSend状態762への状態遷移を、Idle状態761からTransform状態763への状態遷移に修正することである。
二つ目の変更(25行目から41行目)は、新たな状態遷移(Tranform状態605からSend状態762への状態遷移)に対応するTransision要素の挿入をIdle状態761のときに行うことである。この内容は、上記の説明から読み取れるため、各行毎の説明は省略する。
43行目から55行目は、標準ではなく独自の書式に基づく定義が行われている拡張記述部分である。43行目のpointcut.以下の「XMI.extension」によって、拡張記述部分であることが指定されている。本実施の形態では、この部分に、状態遷移処理で呼ばれるアクション処理と、イベント処理等に使用する機能モジュール(例えば、Java(登録商標)クラス)との関連付けが定義される。
44行目では、当該advice要素の子要素の定義を挿入(insert)すべきことが指定されている。
45行目から49行目までは、挿入される定義である。45行目には、Bundleを実装することが指定されている。Bundleの実装先は、xmi.idref属性の値(「004」)で指定される。すなわち、FaxTx1である。
46行目から49行目までは、Transform状態763に対応させて新たに挿入するCompositeState要素851(5行目から18行目)の入場処理の定義(15行目から17行目)におけるpdf2tiffと、実際にその処理が実装されているjp.co.rrr.function.pdf2tiffクラスとの関連付けが定義されている。これによって、FaxTx2に更新された後、Transform状態763に遷移したときには、jp.co.rrr.function.pdf2tiffが実行されることになる。48行目のproperty要素は、jp.co.rrr.function.pdf2tiffクラスが実行されるときのプロパティ情報である。
50行目から52行目は、Transform状態763からSend状態762への状態遷移のトリガとなる変換完了イベントとjp.co.rrr.function.convertEndクラスとの関連付けが定義されている。これによって、Traneform状態605中に変換完了イベントが検知されると、jp.co.rrr.function.convertEndクラスが実行され、その実行結果がtrueであれば、Send状態762に遷移することになる。
図34に戻る。管理者によるSDカード235aの挿入が自動的に検知されると、又はSDカード235aが挿入され、オペレーションパネル202から更新指示が入力されると、SAS411は、SAS Manager511に拡張処理の実行を要求する(S602)。なお、SDカード235aに記録された情報は、ネットワークを介してダウンロードされてもよい。この場合、SDカードのような記録媒体を用いる必要はない。
SAS Manager511は、挿入されたSDカード235aの更新差分サービスバンドル840によるFaxTx1からFaxTx2への更新の可否についてチェックを行う(S603)。更新が可能な場合、SAS Manager511は、更新差分サービスバンドル840の融合機101へのインストールの可否をチェックする(S604)。インストールが可能な場合、SAS Manager511は、SDカード235a内の更新差分サービスバンドル840をOSGiフレームワーク403(融合機101)にインストールする(S605)。更新差分サービスバンドル840のインストールが完了すると、SAS Manager511は、更新差分サービスバンドル840をアクティブ状態に遷移させるようにOSGiフレームワーク403に要求する(S606)。
OSGiフレームワーク403は、更新差分サービスバンドル840のインスタンスを(以下、「更新差分オブジェクト840a」という。)生成し、アクティブな状態に遷移させる(S607)。
続いて、SAS Manager511は、Fax拡張インタフェース613−1aをOSGiフレームワーク403にインストールし(S608)、Fax拡張インタフェース613−1aのFunction Service601への組み込みをExtend Service603に要求する(S609)。
続いて、Extend Service603が、Fax拡張インタフェース613−1aをアクティブな状態にするようOSGiフレームワーク403に要求すると(S610)、OSGiフレームワーク403は、Fax拡張インタフェース613−1aをアクティブな状態に遷移させる。(S611)。Fax拡張インタフェース613−1aがアクティブな状態に遷移すると、Extend Service603は、Fax拡張インタフェース613−1aをFunction Service601に登録する(S612)。これによって、Fax拡張インタフェース613−1aの呼び出しが可能となる。
一方、ステップS607においてアクティブな状態にされた更新差分オブジェクト840aは、Plugin Agent733に対して更新差分サービスバンドル840がプラグインされたことをAspectSM850を添えて通知する(S613)。Plugin Agent733は、State Machine Pool731より、FaxTx1のオブジェクト(FaxTx1オブジェクト714a)を取得する(S614、S615)。
Plugin Agent733は、FaxTx1オブジェクト714aに対して、AspectSM850を添えてFaxTx2への更新要求を行う(S616)。FaxTx1オブジェクト714aは、AspectSM850に基づいて、サービスバンドルFaxTx1をFaxTx2へ更新する為に必要な追加モジュール判断し、当該追加モジュール(ここでは、PDF2Tiff841及びConvertEnd842)の取得を更新差分オブジェクト840aに要求する(S617)。更新差分オブジェクト840aは、当該追加モジュールを取得し、FaxTx1オブジェクト714aに返却する(S618)。
続いて、FaxTx1オブジェクト714aは、AspectSM850に従って、FaxTx1のオブジェクト構成を、FaxTx2に対応するものに更新すると共に、当該更新によって新たに追加されたActivityオブジェクトと追加モジュールとの関連付けを行う(S619)。なお、ステップS619の処理は、AspectSM850に記述されているタイミングで行われる。
続いて、FaxTx1オブジェクト714aは、FaxTx1についてFaxTx2への更新が完了したことをPlugin Agent733に通知する(S620)。但し、FaxTx1をFaxTx2に切り替えるスイッチ770は、FaxTx1の状態のままである。
更新が完了した旨の通知は、SAS Manaer511を介してSAS411に通知される(S621、S622)。SAS411は、管理者に更新完了を通知するため、オペレーションパネル202に更新完了を通知するメッセージを表示させる(S623)。なお、この状態では、スイッチ770は、まだFaxTx2には切り替えられていないので、SAS411は、管理者にFaxTx2へ切り替える否かを問い合わせる。
そこで、管理者が、オペレーションパネル202を介してFaxTx2への切替指示を入力すると(S624)、SAS411は、FaxTx2への切替要求をSAS Manager511に通知する(S625)。SAS Manager511は、Plugin Agent733にFaxTx2への切り替えを要求する(S626)。Plugin Agent733は、FaxTx1オブジェクト714aに対して、その振る舞い(状態遷移)をFaxTx2に対応するものに切り替えるように指示する(S627)。
FaxTx1オブジェクト714aは、FaxTx1がIdle状態761になるまで待機する。Idle状態761に遷移すると、FaxTx1オブジェクト714aは、スイッチ770を切り換えることにより、自己の振る舞いをFaxTx2に対応するものに切り替える(S628)。切り替えが完了すると、FaxTx1オブジェクト714aは、Plugin Agent733に対して、切替完了通知を行う(S629)。切替完了通知は、SAS Manager511を介してSAS411に伝達される(S630、S631)。SAS411は、切替完了通知に応じ、FaxTx1の切り替えが完了した旨をオペレーションパネル202に表示させる(S632)。
次に、ステップS619における、FaxTx1のオブジェクト構成の更新処理の詳細について説明する。図37は、FaxTx1のオブジェクト構成の更新処理を説明するためのシーケンス図である。
まず、FaxTx1オブジェクト714aは、FaxTx1の状態が、AspectSM850に指定されている変更箇所ごとにおけるtiming属性の値に指定されている状態に遷移するまで待機する(S6191)。図36のAspectSM850の例では、全ての変更箇所に対するタイミングは、Idle状態761として指定されている。したがって、ここでは、Idle状態761に遷移するまで待機する。
FaxTx1の状態がIdle状態761に遷移すると、FaxTx1オブジェクト714aは、AspectSM850の記述にしたがって、拡張処理を開始する。
例えば、FaxTx1オブジェクト714aは、AspectSM850の3行目から20行目に基づいてTransform状態763に対応するTransform状態オブジェクト763Sを生成する(S6192)。続いて、FaxTx1オブジェクト714aは、AspectSM850の25行目から41行目に基づいて、変換終了オブジェクト766Tを生成する(S6193)。続いて、FaxTx1オブジェクト714aは、AspectSM850の9行目から14行目や、22行目から24行目に基づいて、オブジェクト間の接続関係を変更する。すなわち、FaxTx1オブジェクト714aは、Transform状態オブジェクト763Sの識別情報を引数としてIdle状態オブジェクト761Sのreconnect()メソッドを呼び出す(S6194)。これに応じて、Idle状態オブジェクト761Sは、遷移先の状態オブジェクトとして、Send状態オブジェクト762SとTransform状態オブジェクト763Sとを保持することになる。これは、ちょうど図31において、スイッチ770によって遷移先が分岐している状態に相当する。スイッチ770は、例えば、Idle状態オブジェクト761Sが参照可能なフラグ変数として実装される。例えば、当該フラグ変数の値が0のときには遷移先はSend状態オブジェクト762Sとされ、1のときには遷移先はTransform状態オブジェクト763Sとされるといった具合である。なお、Idle状態オブジェクト761SとTransform状態オブジェクト763Sとの接続は行われたが、図34において説明したように、この時点では、スイッチ770は切り替えられていないため、Idle状態オブジェクト761Sからの遷移先のオブジェクトはSend状態オブジェクト762Sのままである(すなわち、FaxTx1として機能する。)。
続いて、FaxTx1オブジェクト714aは、Send状態オブジェクト762Sの識別情報と変換完了オブジェクト766Tの識別情報とを引数としてTransform状態オブジェクト763Sのconnect()メソッドを呼び出す(S6195)。これに応じて、Transform状態オブジェクト763Sは、Send状態オブジェクト762Sの識別情報と変換完了オブジェクト766Tの識別情報とを関連付けて保持する。すなわち、変換終了イベントが発生した際のTransform状態763からSend状態762への状態遷移に対応する接続が構築されたことになる。
続いて、FaxTx1オブジェクト714aは、AspectSM850の43行目から55行目に基づいて、追加モジュールとオブジェクトとの関連付けを行う。すなわち、Transform状態オブジェクト763Sの入場処理のインタフェース(IStateインタフェース1004a)に対してPDF2TIFF841を関連付ける(S6196)。続いて、変換完了オブジェクト766TのEventインタフェース1003aに対してConvertEnd842を関連付ける(S6197)。
以上の処理によって、FaxTx1のオブジェクト構成は、図31に示されるようなもの(FaxTx2)に更新される。
ところで、図36において、AspectSM850にはFaxTx1の状態遷移情報1100(図32及び図33)に対する変更内容が記述されていると説明した。しかし、上記のように、FaxTx1オブジェクト714aは、AspectSM850に基づいて状態遷移情報1100を書き換えるのではなく、FaxTx1を構成するオブジェクトを変更することで拡張処理を実現する。FaxTx1は、状態遷移情報1100に基づいてそのオブジェクトが構築されたものである。したがって、状態遷移情報1100に対する変更内容が記述されたAspectSM850は、そのままFaxTx1のオブジェクト構成に適用することができるのである。なお、AspectSM850に基づいて状態遷移情報1100を更新し、更新された状態遷移情報1100に基づいてFaxTx1(厳密には、FaxTx2に更新されたもの)を再構築してもよい。但し、この場合、再構築の前にFaxTx1を構成するオブジェクト群が破棄されるため、FaxTx1を利用中のアプリケーション等との参照関係が破壊されてしまう。したがって、本実施の形態のように、オブジェクト群を再構築するのではなく、既存のオブジェクト構成を変更する方が好適である。
なお、上記のように、拡張処理後は、FaxTx1とFaxTx2とは、スイッチ770を切り替えることにより容易に切り替えが可能である。したがって、FaxTx1からFaxTx2への更新後、再度FaxTx2からFaxTx1に戻したい場合は、スイッチ770を切り替えることにより実現すればよい。すなわち、Idle状態オブジェクト761Sが参照可能なフラグ変数の値を更新すればよい。また、FaxTx2からFaxTx1への更新指示が記述されたAspectSMに基づいて、FaxTx2からFaxTx1への更新を実現してもよい。この場合スイッチ770を切り替えるタイミングは、当該AspectSMに記述されたタイミングで行われる。
上述したように、本実施の形態では、AspectSM850には、拡張部分が非アクティブなタイミングでFax Service714の拡張が行われるような拡張指示が記述されている。そして、かかるAspectSM850に従って、拡張部分が非アクティブなときに拡張が実行される。したがって、本実施の形態におけるFax Service714は、当該Fax Service714の実行中にその振る舞いの拡張を実行することができる。また、振る舞いの拡張にあたり、オブジェクト群が再構築されるわけではないので、当該Fax Service714の参照側との参照関係が破壊されることなく、動的にその振る舞いを拡張することが可能となっている。よって、融合機101を再起動することなくFax Service714の振る舞いは拡張され得る。
4)OSGi
図38は、Service Registry801について説明するためのクラス図である。Service Registry801は、OSGiフレームワーク403を構成するクラスである。サービス提供側であるFunction Service601は、自己が提供するサービス内容をService Registry801に登録(S301)し、サービス要求側であるユーザアプリ501は、自己が要求するサービス内容をService Registry801から検索(S302)する。これによって、ユーザアプリ501は、Function Service601にサービスを要求(S303)して、Function Service601は、ユーザアプリ501にサービスを提供(S304)する。
図39は、状態遷移モデルのバンドル化手順について説明するためのデータ図である。状態遷移モデルは、振る舞いと部品に分離されて設計される。振る舞いはXMI言語にて記述されて、部品はJava(登録商標)言語にて記述される。XMI言語によるコードとJava(登録商標)言語によるコードはOSGiによるバンドル化手順に従ってバンドル化される。バンドルには、マニフェストファイル802が同梱される。マニフェストファイル802には、バンドルにとって必要な情報が格納される。
図40・図41は、CSC421について説明するための図である。融合機101には他機のOSGiサービスプラットフォームを自機のOSGiサービスプラットフォームと同様に処理するためのCSC421が実装されている。CSC421の実装態様は、図6に示す通りである。
図40は他機が融合機101である場合を表し、図41は他機がPC803である場合を表す。図40・図41に示す通り、自機のCSC421と他機のCSC421の仲介によって、自機のSAS Manager511と他機のSAS Manager511の連携が実現される。