(57)【要約】    【課題】  コマンドモジュールを全く変更することなく、外部の設定を変更するだけで、コマンドのローカル実行とリモート実行とを切り替えることができるプログラミングフレームワークを提供する。    【解決手段】  プログラミングフレームワークは、クライアント１００の設定ファイル１４０を読み込む。Ｓ９０５の判別でコマンドをダミー実行する場合、cmdオブジェクトのdummyExecuteメソッドを実行し、ダミー実行しない場合でＳ９０７の判別でローカル実行の場合、cmdオブジェクトのexecuteメソッドを実行する。リモート実行の場合、コマンドサーバ２００のServerクラス１２２のオブジェクトに対しtransferメソッドをネットワークＮ経由で呼び出す。transferメソッドの引数にcmdオブジェクトを指定し、transferメソッドはCommand派生クラスのオブジェクトをネットワーク経由で戻り値として返す。このオブジェクトをcmdオブジェクトとし、戻り値として実行終了したcmdオブジェクトを返す。【選択図】      図９
2005085240.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも第１の情報処理装置と第２の情報処理装置とが接続されるネットワーク環境におけるプログラム上の要求を抽象化した実体であるコマンドを実行するためのプログラミングフレームワークにおいて、
前記コマンドの実行を要求する前記第１の情報処理装置に格納されるコマンドモジュールと、
前記ネットワークを通じて前記第１の情報処理装置に接続された前記第２の情報処理装置に格納される、前記コマンドモジュールと同一のコマンドモジュールと、
前記第１の情報処理装置に設けられた、前記コマンドの実行を制御する設定ファイルとを備え、
前記コマンドの実行処理は、
前記第１の情報処理装置が前記設定ファイルに設定されたコマンドの実行権限の設定内容を判別する実行権限判別ステップと、
前記設定ファイルの設定がコマンドをダミー実行する設定である否かを判別するダミー実行判別ステップと、
前記設定ファイルの設定によるコマンドの実行先がローカル実行を行なう前記第１の情報処理装置であるのかリモート実行を行なう前記第２の情報処理装置であるのかを判別する実行先判別ステップとを備え、
前記設定ファイルの設定がダミー実行する設定である場合には、前記実行先判別ステップの結果の如何にかかわらず第１の情報処理装置がコマンドをローカル実行することを特徴とするプログラミングフレームワーク。
【請求項２】
前記実行権限判別ステップは、前記設定ファイルの設定を参照し、該設定においてはコマンドの実行者とコマンドの種類との組み合わせに対して実行権限をマトリックス定義したポリシーを複数持つことを特徴とする請求項１記載のプログラミングフレームワーク。
【請求項３】
前記第１の情報処理装置及び前記第２の情報処理装置の実行環境がJavaであり、前記第２の情報処理装置による前記リモート実行の実現手段がEJB（Enterprise JavaBeans）であることを特徴とする請求項１または２記載のプログラミングフレームワーク。
【請求項４】
請求項１、請求項２、または請求項３のいずれか１項に記載のプログラムを格納したことを特徴とするコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、少なくとも第１の情報処理装置と第２の情報処理装置とが接続されるネットワーク環境におけるプログラム上の要求を抽象化した実体であるコマンドを実行するためのプログラミングフレームワークに関する。
【背景技術】
【０００２】
従来、プログラム上の「要求」をオブジェクトとしてカプセル化する手段は、デザインパターンの「Command」としてよく知られている（例えば、非特許文献１参照）。このCommandパターンの本質的な構成と動作はＵＭＬ（Unified Modeling Language）のクラス図とシーケンス図とを用いてそれぞれ図１１と図１２とのように表わすことができる。
【０００３】
図１１は、Commandパターンの構成を示すＵＭＬクラス図である。
【０００４】
１１０１のApplicationクラスはコマンドを使用する任意のクラスである。１１０２のInvokerクラスはコマンドの起動を担うクラスである。コマンドの起動にはInvokerクラスのstoreCommandメソッドを使用する。storeCommandメソッドはCommand派生クラスのオブジェクトを引数に取り、同じくCommand派生クラスのオブジェクトを戻り値として返す。
【０００５】
１１０３のCommandクラスはすべてのコマンドの抽象基底クラスである。Command抽象基底クラスには抽象メソッドexecuteのみ宣言されている。executeメソッドは各Command派生クラスで実行する実動作のプレースホルダとして宣言されており、Invokerクラス１１０２のstoreCommandメソッドから呼ばれる。このexecuteメソッドは引数・戻り値を持たない。
【０００６】
１１０４のConcreteCommandクラスはCommand派生クラスの例として記したものである。ConcreteCommandクラスではCommand抽象基底クラス１１０３の抽象メソッドexecuteが実装されている。ここで、setＡとsetＢはexecuteメソッドに引数を与えるためのメソッドであるセッターであり、getＣとgetＤはexecuteメソッドの実行後に実行結果（戻り値）を取得するためのメソッドであるゲッターである。
【０００７】
図１２は、Commandパターンの動作を説明するＵＭＬシーケンス図である。
【０００８】
１２０１は、図１１のApplicationクラス１１０１をインスタンス化したオブジェクトである。１２０２は、図１１のConcreteCommandクラス１１０４をインスタンス化したオブジェクトであり、cmdという名称が与えられている。１２０３は、図１１のInvokerクラス１１０２をインスタンス化したオブジェクトである。
【０００９】
先ず、１２０４でApplicationオブジェクト１２０１はConcreteCommandクラスのインスタンスを生成する。以後このオブジェクトをcmdという名称で記す。
【００１０】
次に、１２０５でcmdオブジェクト１２０２のセッターであるsetＡを呼び出し、１２０６で同様のセッターであるsetＢを呼び出すことにより、executeメソッドを呼び出すのための引数をcmdオブジェクト１２０２に設定する。
【００１１】
次に、１２０７でApplicationオブジェクト１２０１は、cmdオブジェクト１２０２を引数としてInvokerオブジェクト１２０３のstoreCommandメソッドを呼び出す。
【００１２】
次に、１２０８でInvokerオブジェクト１２０３のstoreCommandメソッドは、引数で与えられたcmdオブジェクト１２０２に対してexecuteメソッドを呼び出す。executeメソッド呼び出しが終了すると、Invokerオブジェクト１２０３のstoreCommandメソッドはexecuteメソッド終了後のcmdオブジェクト１２０２を戻り値として返す（ＵＭＬではメソッドの終了を省略可能なため、図１２では図示を省略してある）。
【００１３】
その後、Applicationオブジェクト１２０１は、返されたcmdオブジェクト１２０２のゲッターであるgetＣを１２０９で呼び出し、同様のゲッターgetＤを１２１０で呼び出すことにより、executeメソッドの呼び出しの結果を得ることができる。
【００１４】
このようなCommandパターンをネットワーク経由で適用することによってコマンドのリモート実行が可能になる。ここで、サーバ側にEJBを使用した例は「EJB Command」パターンとして知られている（例えば、非特許文献２参照）。EJB Commandパターンの本質的な構成及び動作は、ＵＭＬのクラス図とシーケンス図とを用いてそれぞれ図１３と図１４とのように表わすことができる。ただし、両図にある「ネットワーク境界」についてはＵＭＬの記法ではなく、「本来は２枚である図」を「１枚の図」に表記するために便宜的に用いた記法である。
【００１５】
図１３は、EJBコマンドパターンの構成を示すＵＭＬクラス図である。
【００１６】
１３０５はネットワーク境界である。図面上、このネットワーク境界１３０５よりも上がクライアント側の構成であり、下がサーバ側の構成である。図示したように、クライアント側の構成は図１１のCommandパターンの構成と同様である。
【００１７】
１３０６のServerクラスはEJBの実装クラスであり、クライアントからのコマンドの実行要求をネットワーク経由で受けるためのクラスである。Serverクラス１３０６のtransferメソッドがコマンドの実行要求を受ける。transferメソッドはCommand派生クラスのオブジェクトを引数に取り、同じくCommand派生クラスのオブジェクトを戻り値として返す。
【００１８】
１３０７のCommandクラス及び１３０８のConcreteCommandクラスは、それぞれ１３０３のCommandクラス及び１３０４のConcreteCommandクラスとまったく同じものである。つまり、CommandクラスとConcreteCommandクラスはまったく同じものがクライアント側とサーバ側に存在している。
【００１９】
図１４は、EJBコマンドパターンの動作を説明するＵＭＬシーケンス図である。
【００２０】
１４１６はネットワーク境界である。図面上、このネットワーク境界１４１６よりも左がクライアント側の動作を示し、右がサーバ側の動作を示す。
【００２１】
１４０１，１４０２，１４０３はクライアント側のオブジェクトであり、１４０１は、図１３のApplicationクラス１３０１をインスタンス化したオブジェクトである。１４０２は、図１３のConcreteCommand１３０４をインスタンス化したオブジェクトであり、名称はcmdである。１４０３は、図１３のInvokerクラス１３０２をインスタンス化したオブジェクトである。
【００２２】
１４０４，１４０５はサーバ側のオブジェクトであり、１４０４は、図１３のServerクラス１３０６をインスタンス化したオブジェクトであり、１４０５は、図１３のConcreteCommandクラス１３０８をインスタンス化したオブジェクトである。
【００２３】
先ず、１４０６でApplicationオブジェクト１４０１がConcreteCommandクラスのcmdオブジェクト１４０２を生成して、１４０７，１４０８で引数を設定し、１４０９でInvokerオブジェクト１４０３のstoreCommandメソッドを呼び出すまでは図１２における１２０４から１２０７までと同様である。
【００２４】
次に、Invokerオブジェクト１４０３は、オブジェクトをネットワーク経由で引数として渡すために、１４１０でcmdオブジェクトに対してシリアライズ（直列化）処理を実行する。
【００２５】
次に、Invokerオブジェクト１４０３は、１４１１でネットワーク１４１６を経由してServerオブジェクト１４０４のtransferメソッドを呼び出す。このときの引数は１４１０でシリアライズされたcmdオブジェクトである。シリアライズされたcmdオブジェクトを受け取ったServerオブジェクト１４０４は、１４１２で先ずデシリアライズ（非直列化）処理を実行してcmdオブジェクトを復元する。ここで復元されたcmdオブジェクトが１４０５であり、これはcmdオブジェクト１４０２と論理的に等価な実体である。
【００２６】
最後にServerオブジェクト１４０４は、１４１３でcmdオブジェクト１４０５のexecuteメソッドを呼び出す。以上でネットワーク経由のtransferメソッドの呼び出し１４１１が終了するが、図１２と同様にメソッドの終了は図示していない。
【００２７】
ここで、transferメソッドは戻り値としてcmdオブジェクト１４０５をシリアライズして返し、Invokerオブジェクト１４０３は返されたcmdオブジェクトをデシリアライズして１４０２のcmdオブジェクトと置き換える。この結果、Applicationオブジェクト１４０１は、１４１４，１４１５でゲッターでgetＣやgetＤを呼び出して処理結果を得ることができる。
【非特許文献１】Erich Gamma、 Richard Helm、Ralph Johnson、John Vissides著「オブジェクト指向による再利用のためのデザインパターン」
【非特許文献２】Floyd Marinescu著「ＥＪＢデザインパターン」
【発明の開示】
【発明が解決しようとする課題】
【００２８】
上記のように従来においても、コマンドのローカル実行やリモート実行が可能である。しかしながら、コマンドを用いて汎用ライブラリを作成する場合には、コマンドがローカルで実行されるかリモートで実行されるかを前もって決定できないという問題があった。
【００２９】
また、コマンドの実行にあたっては、コマンドの実行者とコマンドの種類とを対応付けた実行権限の設定を行なうことが多くの場合に必要になるが、実行者の数やコマンドの種類が多くなると、この実行権限の設定が複雑になり過ぎるという問題があった。
【００３０】
さらに、特に開発初期においては、完全なものでなくてもコマンドの実行が可能な環境を早急に用意したいという要求があるが、リモート実行を選択した場合は少なくともクライアント、サーバ、リソース（データベース等）の環境を整備しなければならず、この要求に応えにくいという問題があった。
【００３１】
本発明は以上の事情に鑑みてなされたものであり、本発明の目的は、コマンドモジュールを全く変更することなく、外部の設定を変更するだけで、コマンドのローカル実行とリモート実行とを切り替えることができるプログラミングフレームワークを提供することにある。
【００３２】
さらに、コマンドの実行権限の設定がローカル実行の場合でもリモート実行の場合でもサーバ側ではなくクライアント側で行なうことができるプログラミングフレームワークの提供を目的とする。
【００３３】
さらには、コマンドの実行権限の設定は、実行権限を表わすポリシーを切り替えるだけで、複雑な組み合わせを設定できるプログラミングフレームワークの提供を目的とする。
【００３４】
さらにまた、サーバやリソース（データベース等）にアクセスすることなくクライアントだけでダミーの処理を行なうこと（ダミー実行）ができるプログラミングフレームワークの提供を目的とする。
【課題を解決するための手段】
【００３５】
上記目的を達成するために、請求項１記載のプログラミングフレームワークは、少なくとも第１の情報処理装置と第２の情報処理装置とが接続されるネットワーク環境におけるプログラム上の要求を抽象化した実体であるコマンドを実行するためのプログラミングフレームワークにおいて、前記コマンドの実行を要求する前記第１の情報処理装置に格納されるコマンドモジュールと、前記ネットワークを通じて前記第１の情報処理装置に接続された前記第２の情報処理装置に格納される、前記コマンドモジュールと同一のコマンドモジュールと、前記第１の情報処理装置に設けられた、前記コマンドの実行を制御する設定ファイルとを備え、前記コマンドの実行処理は、前記第１の情報処理装置が前記設定ファイルに設定されたコマンドの実行権限の設定内容を判別する実行権限判別ステップと、前記設定ファイルの設定がコマンドをダミー実行する設定である否かを判別するダミー実行判別ステップと、前記設定ファイルの設定によるコマンドの実行先がローカル実行を行なう前記第１の情報処理装置であるのかリモート実行を行なう前記第２の情報処理装置であるのかを判別する実行先判別ステップとを備え、前記設定ファイルの設定がダミー実行する設定である場合には、前記実行先判別ステップの結果の如何にかかわらず第１の情報処理装置がコマンドをローカル実行することを特徴とする。
【００３６】
請求項２記載のプログラミングフレームは、請求項１に記載のプログラミングフレームワークにおいて、前記実行権限判別ステップは、前記設定ファイルの設定を参照し、該設定においてはコマンドの実行者とコマンドの種類との組み合わせに対して実行権限をマトリックス定義したポリシーを複数持つことを特徴とする。
【００３７】
請求項３記載のプログラミングフレームは、請求項１または２記載のプログラミングフレームワークにおいて、前記第１の情報処理装置及び前記第２の情報処理装置の実行環境がJava（登録商標）であり、前記第２の情報処理装置による前記リモート実行の実現手段がEJB（Enterprise JavaBeans）であることを特徴とする。
【００３８】
上記目的を達成するために、請求項４記載の記憶媒体は、コンピュータ読み取り可能な記憶媒体において、請求項１、請求項２、または請求項３のいずれか１項に記載のプログラムを格納したことを特徴とする。
【発明の効果】
【００３９】
請求項１記載のプログラミングフレームワーク及び請求項４記載の記録媒体によれば、コマンドの実行処理は、第１の情報処理装置が設定ファイルに設定されたコマンドの実行権限の設定内容を判別し、設定ファイルの設定がコマンドをダミー実行する設定である否かを判別し、設定ファイルの設定によるコマンドの実行先がローカル実行を行なう第１の情報処理装置であるのかリモート実行を行なう第２の情報処理装置であるのかを判別し、設定ファイルの設定がダミー実行する設定である場合には、実行先判別の結果の如何にかかわらず第１の情報処理装置がコマンドをローカル実行するので、コマンドモジュールを全く変更することなく、外部の設定を変更するだけで、コマンドのローカル実行とリモート実行とを切り替えることができる。また、コマンドの実行権限の判別はローカル実行の場合でもリモート実行の場合でも第２の情報処理装置側ではなく第１の情報処理装置側で行なうことができる。さらに、第２の情報処理装置やデータベース等にアクセスすることなく第１の情報処理装置だけでダミー実行ができる。
【００４０】
請求項２記載のプログラミングフレームワーク及び請求項４記載の記録媒体によれば、実行権限の判別は、設定ファイルの設定を参照し、該設定においてはコマンドの実行者とコマンドの種類との組み合わせに対して実行権限をマトリックス定義したポリシーを複数持つので、これらの実行権限を表わすポリシーを切り替えるだけで、実行権限の設定は複雑な組み合わせに設定できる。
【発明を実施するための最良の形態】
【００４１】
以下、本発明の実施の形態について図面を参照して詳細に説明する。
【００４２】
本実施の形態においてはプログラミング言語としてJavaを使用し、サーバ側のリモート呼び出し機構にEJBを使用するものとして説明する。
【００４３】
図１は、本実施の形態に係るプログラミングフレームワークが実施されるネットワークの全体構成図である。
【００４４】
１００はコマンドの実行を要求するクライアント（第１の情報処理装置）であり、２００はコマンドをリモート実行するためのコマンドサーバ（第２の情報処理装置）である。３００はＤＢサーバである。これらクライアント１００、コマンドサーバ２００、及びＤＢサーバ３００はそれぞれネットワークＮを通じて相互に通信可能であり、クライアント１００とコマンドサーバ２００とはネットワークＮを通じてＤＢサーバ３００にアクセスできる。これらクライアント１００、コマンドサーバ２００、及びサーバ３００は情報処理装置である。
【００４５】
なお、ＤＢサーバ３００を別個に独立した情報処理装置として図示したが、ＤＢサーバ機能をクライアント１００やコマンドサーバ２００が備えるようにしてもよい。
【００４６】
図２は、図１におけるクライアント１００、コマンドサーバ２００、ＤＢサーバ３００として使用される情報処理装置の構成の一例を示すブロック図である。
【００４７】
１０は、制御プログラムに従って本装置全体の制御を行なうＣＰＵである。２０は、ＣＰＵ１０が実行する処理などの本装置の制御プログラムや文書画像等を格納する内部記憶部のＲＡＭである。３０は、ＣＰＵ１０の制御の下にインターネット等のネットワークとの接続を行なってデータ等を送受信するネットワークインタフェース（Net I/F）である。
【００４８】
４０は、ファイルを保存する磁気ディスク等の外部記憶装置である。５０はディスプレイ、６０はキーボード、７０はマウス等のポインティングデバイスである。
【００４９】
ＲＡＭ２０に格納されているプログラムは、同じくＲＡＭ２０に格納されているＯＳ（Operating System）の機能を必要に応じて使用して、ＲＡＭ２０に一時記憶するデータの内容を読み書きしたり、外部記憶装置４０上のファイルの内容を読み書きしたり、ネットワークインタフェース３０を通じてデータの送受信を行なったり、キーボード６０やポインティングデバイス７０からの入力を受け取ったり、ディスプレイ５０に画像表示を行なったりする等の所定の動作を行なうためのものである。
【００５０】
なお、プログラムはＲＡＭ２０に格納されるとしたが、これに限るものではなく、プログラムを外部記憶装置４０から読み込んで実行するようにしてもよい。また、ネットワークインタフェース３０を介してプログラムを受信して実行するようにしてもよい。また、図２には示していないが、ＲＯＭ等の読み出し専用の内部記憶部から読み込んで実行するようにしてもよい。
【００５１】
また、キーボード６０やポインティングデバイス７０の代わりに、あるいはそれらに加えて、音声入力等の他の入力装置を備えることもできる。また、これらすべての構成要素を必ずしも備える必要はなく、コマンドサーバ２００やＤＢサーバ３００においては、多くの場合にディスプレイ５０を省略したり、キーボード６０やポインティングデバイス７０を他の情報処理装置と共有したりしてもよい。
【００５２】
次に、図３乃至図５を参照して本実施の形態で使用する情報処理装置内のブロック構成について説明する。
【００５３】
図３は、本実施の形態におけるクライアント、コマンドサーバ、ＤＢサーバの動作に主として関わる論理ブロック（モジュール）の全体構成を示すブロック図である。
【００５４】
１００Ａはクライアント１００のブロック境界を表わしており、ここではJavaの実行環境を示す。１４０は外部記憶装置４０上に存在する設定ファイルである。１２０ａはＲＡＭ２０に格納されているプログラムであり、コマンドの実行を要求するクライアントモジュールである。
【００５５】
クライアントモジュール１２０ａは論理的にさらに、Admin権限のモジュールとUser権限のモジュールとの２種類のモジュールに分かれている。Admin権限モジュールとUser権限モジュールとは異なるスレッドで動作しているので、スレッドを調べることによってどちらのモジュールが動作しているのかを判定できる。
【００５６】
１２０ｂはＲＡＭ２０に格納されているプログラムであり、コマンドを実行するためのモジュールと、実行されるコマンド群とから成るコマンドモジュールである。
【００５７】
２００Ａはコマンドサーバ２００のブロック境界を表しており、ここではEJBコンテナの機能を含むJavaの実行環境を示す。２２０はＲＡＭ２０に格納されているプログラムであり、コマンドを実行するためのモジュールと、実行されるコマンド群とから成るコマンドモジュールである。このコマンドモジュール２２０はクライアント１００のコマンドモジュール１２０ｂとまったく同じものであり、クライアント１００のＲＡＭ２０に格納されているか、コマンドサーバ２００のＲＡＭ２０に格納されているかという点のみが異なる。
【００５８】
３００ＡはＤＢサーバ３００のブロック境界を表わしており、ここではＲＡＭ２０に格納されているＤＢプログラム（図示せず）の管理範囲を示す。３４０はＤＢプログラムが外部記憶装置４０上に構築したデータベース（ＤＢ）である。クライアント１００やコマンドサーバ２００のプログラムは、ＤＢプログラムが規定する方法でＤＢサーバ３００にアクセスすることにより、ネットワークＮを経由してＤＢ３４０のデータの読み書きを行なうことができる。
【００５９】
図４は、コマンドがリモート実行で動作している場合に使用されるモジュールを表わす活性ブロック図である。
【００６０】
図４において、使用されているモジュールや通信経路が太線で示されている。図示したように、クライアント１００とＤＢサーバ３００との通信経路のみが使用されていない。
【００６１】
図５は、コマンドがローカル実行で動作している場合に使用されるモジュールを表わす活性ブロック図である。図４と同様に、使用されているモジュールや通信経路は太線で示されている。図示のように、モジュールはコマンドサーバ２００のコマンドモジュール２２０が使用されていない。また、クライアント１００とコマンドサーバ２００との間の通信経路、およびコマンドサーバ２００とＤＢサーバ３００との間の通信経路も使用されていない。
【００６２】
図６は、コマンドモジュールに含まれるクラスのＵＭＬクラス図である。
【００６３】
図示したように、大別してコマンドを実行するためのモジュール１２１，１２２とコマンド群１２３〜１２７とから成る。
【００６４】
Invokerクラス１２１は、従来の技術として例示した図１１のInvokerクラス１１０２及び図１３のInvokerクラス１３０２と同じ役割を担う。上記のようにクライアント１００のコマンドモジュール１２０ｂとコマンドサーバ２００のコマンドモジュール２２０とはまったく同じものであり、Invokerクラス１２１はクライアント１００及びコマンドサーバ２００の何れにも格納されているが、コマンドサーバ２００ではInvokerクラス１２１は使用されない。
【００６５】
Serverクラス１２２は、従来の技術として例示した図１３のServerクラス１３０６と同じ役割を担う。Serverクラス１２２はクライアント１００及びコマンドサーバ２００の何れにも格納されているが、クライアント１００ではServerクラス１２１は使用されない。
【００６６】
Commandクラス１２３は、すべてのコマンドの抽象基底クラスである。抽象メソッドとしてexecuteとdummyExecuteが宣言されている。ここで、executeは通常実行のためのメソッド、dummyExecuteはダミー実行のためのメソッドとして派生クラスで定義されることを想定している。
【００６７】
UserCommandクラス１２４は、User権限で実行されるコマンドを表わす抽象基底クラスであり、Commandクラス１２３から継承して宣言されている。同じくAdminCommandクラス１２５は、Admin権限で実行されるコマンドを表わす抽象基底クラスであり、Commandクラス１２３から継承して宣言されている。
【００６８】
１２６はUser権限コマンドの例であるRegistCommandである。RegistCommand１２６はユーザ名を登録するためのコマンドである。セッターとしてsetNameメソッドでユーザ名を受け取る。コマンド実行後、ユーザＩＤをゲッターのgetIdメソッドで返す。executeメソッドではセッターで受け取ったユーザ名をＤＢ３４０に登録し、一意なユーザＩＤを新規に発番する。dummyExecuteメソッドでは実際にＤＢ３４０に登録することはせず、ユーザＩＤを乱数で生成する。
【００６９】
１２７はAdmin権限コマンドの例であるDeleteCommandである。DeleteCommand１２７はユーザ名を削除するためのコマンドである。セッターとしてsetIdメソッドでユーザＩＤを受け取る。ゲッターはない。executeメソッドではセッターで受け取ったユーザＩＤをＤＢ３４０から検索して、存在すれば削除する。dummyExecuteメソッドでは実際にＤＢ３４０にアクセスせずに、何もしないで処理を終了する。
【００７０】
上記１２３〜１２７のコマンド群はクライアント１００及びコマンドサーバ２００の何れにも格納されているが、ローカル実行の場合には、コマンドサーバ２００では使用されない。
【００７１】
なお、図６のクラス図には必要最小限のメソッドしか定義されていないが、これらのクラスでは他のフィールドやメソッドを自由に定義して使用しながら本実施の形態を実現することができる。
【００７２】
図７は設定ファイルの内容を示す図である。
【００７３】
この設定ファイルはJavaのプロパティファイルとして記述されている。Javaのプロパティファイルはテキストファイルであり、１行につき１項目を定義する。#で始まる行は単なるコメント行として無視される。ここでは１４１〜１４３の３種類の項目の定義を行なっている。
【００７４】
１４１は、コメントにも記されているようにコマンドの実行先の設定であり、target=remoteの行かtarget=localの行かのいずれかを設定（他の行はコメントアウト＝コメント行として無効化）して使用する。図７ではtarget=remoteの行が設定されている。target=remoteが設定されている場合は、リモート実行が指定されているので、コマンドはコマンドサーバ２００で実行される。一方、target=localが設定されている場合は、ローカル実行の指定であり、コマンドはクライアント１００で実行される。
【００７５】
１４２は、コメントにも記されているようにコマンドの実行権限の設定であり、policy=strictの行、policy=normalの行、及びpolicy=tolerateの行のうちのいずれか１つを設定（他の行はコメントアウト）して使用する。図７ではpolicy=strictの行が設定されている。コマンドの実行権限の設定による動作の違いについては図８を用いて後述する。
【００７６】
１４３は、コメントにも記されているようにダミー実行の設定であり、dummy=trueの行及びdummy=falseの行のいずれか一方を設定（他の行はコメントアウト）して使用する。図７ではdummy=trueの行が設定されている。dummy=trueが設定されている場合は、コマンドはダミー実行モードとなり、各コマンドのdummyExecuteメソッド（図６参照）が実行される。dummy=falseが設定されている場合は、コマンドは通常実行モードとなり、各コマンドのexecuteメソッド（図６参照）が実行される。
【００７７】
なお、設定ファイルをJavaプロパティファイルとして説明したが、これに限るものではなく、解析可能なフォーマットであればテキストファイルでもバイナリファイルでも構わない。また、設定内容をＤＢに格納する形式としてもよい。
【００７８】
図８は、クライアントモジュールの種類、コマンドの種類、及びコマンドの実行権限の設定に応じたコマンドの実行の可否を示す図であり、（ａ）はコマンドの実行権限の設定１４２がstrictの場合を示し、（ｂ）はコマンドの実行権限の設定１４２がnormalの場合を示し、（ｃ）はコマンドの実行権限の設定１４２がtolerateの場合を示す。
【００７９】
図中、○が実行可能であることを表し、×が実行不可能であることを表わす。図７の１４２に示したように、実行権限の設定にはstrict、normal、及びtolerateの３種類がある。
【００８０】
（ａ）の場合には、コマンドの実行権限は厳格（strict）にチェックされる。図示したように、Admin権限のコマンド１２５は、クライアントモジュール１２０ａのうちAdmin権限のクライアントモジュールからのみ実行可能である。User権限のコマンド１２４は、クライアントモジュール１２０ａのうちUser権限のクライアントモジュールからのみ実行可能である。
【００８１】
（ｂ）の場合には、コマンドの実行権限はstrictでもtolerateでもないポリシーでチェックされる。図示のように、Admin権限のコマンド１２５は、クライアントモジュール１２０ａのうちAdmin権限のクライアントモジュールからのみ実行可能である。一方、User権限のコマンド１２４は、クライアントモジュール１２０ａのうちUser権限のクライアントモジュール及びAdmin権限のクライアントモジュール双方から実行可能である。
【００８２】
（ｃ）の場合には、コマンドの実行権限は寛容（tolerate）にチェックされる。図示のように、Admin権限のコマンド１２５及びUser権限のコマンド１２４の何れもが、クライアントモジュール１２０ａのAdmin権限のクライアントモジュール及びUser権限のクライアントモジュール７０３の何れからも実行可能である。
【００８３】
なお、実行権限の設定例を３種類示したが、これに限るものではなく、必要なポリシーをいくつでも決めることができる。  
【００８４】
図９及び図１０のフローチャートを参照して、コマンド実行時の動作について説明する。
【００８５】
図９は、コマンドの実行処理を示すフローチャートである。
【００８６】
具体的にはクライアント１００のクライアントモジュール１２０ａからコマンドモジュール１２０ｂ内のInvokerクラス１２１をインスタンス化したオブジェクトに対してstoreCommandメソッドを呼び出した場合の動作である。このときの引数はコマンドモジュール１２０ｂに存在する任意のCommand１２３の派生クラスをインスタンス化したオブジェクトである。
【００８７】
先ず、ステップＳ９０１で処理を開始する。ここで、引数で渡されたコマンドオブジェクトをcmdという名称で記す。
【００８８】
ステップＳ９０２でクライアント１００の設定ファイル１４０を読み込む。ここで、コマンドの実行先の設定１４１の内容をtgtという変数名で記す。また、ダミー実行の設定１４３の内容をdmyという変数名で記す。tgtは実行先の設定１４１に示すように‘remote’または‘local’という値を取る。dmyはダミー実行の設定１４３に示すように‘true’または‘false’という値を取る。
【００８９】
次に、ステップＳ９０３でコマンドの実行権限のチェック処理を行なう。このチェック処理の詳細は、図１０のフローチャートを参照して後述する。このチェック処理は、チェック結果が「成功」か「失敗」かを返す。
【００９０】
ステップＳ９０４でチェック結果が成功であるか否かを判定し、チェックが成功でない（失敗）場合には、コマンドの実行を失敗として終了する（ステップＳ９１１）。
【００９１】
ステップＳ９０４の判定の結果、コマンドの実行権限のチェックが成功である場合には、ステップＳ９０５でコマンドをダミー実行するか否かを判定する。この判定は、変数dmyの値が‘false’か否かで行なう。dmyの値が‘false’でない場合（dmyの値が‘true’の場合）には、ダミー実行が指定されているものと判断して、ステップＳ９０６に進んでcmdオブジェクトのdummyExecuteメソッド（図６参照）を実行し、続いてステップＳ９１０で戻り値として実行を終了したcmdオブジェクトを返して本処理を終了する。
【００９２】
ステップＳ９０５の判別の結果、ダミー実行しない場合（dmyの値が‘false’の場合）には、ステップＳ９０７でコマンドの実行先を判定する。この判定は、変数tgtの値が‘remote’か否かで行なう。tgtの値が‘remote’でない場合（tgtの値が‘local’の場合）には、ローカル実行が指定されているものと判断して、ステップＳ９０８に進んでcmdオブジェクトのexecuteメソッド（図６参照）を実行し、続いてステップＳ９１０で戻り値として実行の終了したcmdオブジェクトを返して本処理を終了する。
【００９３】
ステップＳ９０７の判定でtgtの値が‘remote’である場合には、リモート実行が指定されているものと判断して、ステップＳ９０９に進む。ステップＳ９０９ではコマンドサーバ２００に格納されているコマンドモジュール２２０のServerクラス１２２のオブジェクトに対してtransferメソッドをネットワークＮを経由して呼び出す。ここで、transferメソッドへの引数にはcmdオブジェクトを指定する。transferメソッドはCommand１２３の派生クラスのオブジェクトをネットワーク経由で戻り値として返すので、返されたオブジェクトを新たにcmdオブジェクトとする。
【００９４】
JavaではEJBサーバへのリモート呼び出しの際、引数・戻り値のオブジェクトのシリアライズ・デシリアライズ処理はプログラムが直接に行なうのではなくJava実行環境において行なわれるので、それぞれの処理はフローチャートに図示していない。続いてステップＳ９１０で戻り値として実行を終了したcmdオブジェクトを返して処理を終了する。
【００９５】
図１０は、図９のステップＳ９０２で実行される実行権限のチェック処理を示すフローチャートである。ステップＳ９０２からはチェック対象のコマンドオブジェクトが引数で渡される。
【００９６】
ステップＳ１００１で処理を開始する。ここで、引数で渡されたコマンドオブジェクトをcmdという名称で記す。
【００９７】
ステップＳ１００２で設定ファイル１４０を読み込む。ここで、実行権限の設定１４２の内容をpcyという変数名で記す。pcyは実行権限の設定１４２に示すように‘strict’または‘normal’または‘tolerate’という値を取る。
【００９８】
次に、ステップＳ１００３では、呼び出し側のモジュールがUser権限モジュールか否かを判定する。すなわち、User権限モジュールかAdmin権限モジュールかを判定する。User権限モジュールでない場合、すなわちAdmin権限モジュールである場合には、ステップＳ１００４に進む。User権限モジュールである場合には、ステップＳ１００６に進む。
【００９９】
ステップＳ１００４はAdmin権限モジュールから呼び出された場合の処理起点であり、コマンドがAdmin権限コマンドか否か、すなわち、Admin権限コマンド１２５の派生クラスか否かを判定する。Javaにおいてこの判定はcmd instanceof AdminCommandという式を評価することにより行なえる。cmdがAdmin権限コマンドである、すなわち、Admin権限コマンド１２５の派生クラスである場合には、実行権限の設定内容１４２に関わらず実行が可能なので、ステップＳ１００９に進んでチェック成功として本処理を終了する。
【０１００】
ステップＳ１００４の判定の結果、cmdがAdmin権限コマンドでない、すなわち、Admin権限コマンド１２５の派生クラスでない場合（cmdがUser権限コマンド１２４の派生クラスである場合）には、ステップＳ１００５に進んで実行権限の設定がtolerateか否か、すなわち、tolerateかそれ以外のstrictまたはnormalかを判定する。この時点でモジュールはAdmin権限モジュール、コマンドはUser権限コマンドであることが判定されている。図８を参照して、実行権限の設定がstrictまたはnormalならば実行不可、tolerateならば実行可であることが分かる。
【０１０１】
したがって、ステップＳ１００５ではpcyの値を‘tolerate’と比較し、pcy=‘tolerate’か否かを判定し、pcy=‘tolerate’である場合には、ステップＳ１００９に進んでチェック成功として処理を終了する。pcy=‘tolerate’でない場合（つまりpcyの値が‘strict’または‘normal’である場合）には、ステップＳ１００８に進んでチェック失敗として本処理を終了する。
【０１０２】
ステップＳ１００６〜Ｓ１００７もステップＳ１２０４〜Ｓ１２０５と同様であるので説明を省略する。
【０１０３】
本実施の形態ではプログラミング言語にJavaを使用したが、これに限るものではなく、いかなるプログラミング言語も使用可能である。また、リモート呼び出し機構にEJBを使用したが、これもEJBに限定するものではなく、プログラミング言語から利用可能であれば、いかなるリモート呼び出し機構も使用可能である。
【０１０４】
また、本実施の形態を実行するプログラムは記憶媒体に記憶させて提供することができる。上記プログラムを供給する記憶媒体としては、例えば、フロッピー（登録商標）ディスク、ハードディスク、光ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、磁気テープ、不揮発性のメモリカードなどがある。
【図面の簡単な説明】
【０１０５】
【図１】本実施の形態に係るプログラミングフレームワークが実施されるネットワークの全体構成図である。
【図２】図１におけるクライアント、コマンドサーバ、ＤＢサーバとして使用される情報処理装置の構成の一例を示すブロック図である。
【図３】本実施の形態におけるクライアント、コマンドサーバ、ＤＢサーバの動作に主として関わる論理ブロック（モジュール）の全体構成を示すブロック図である。
【図４】コマンドがリモート実行で動作している場合に使用されるモジュールを表わす活性ブロック図である。
【図５】コマンドがローカル実行で動作している場合に使用されるモジュールを表わす活性ブロック図である。
【図６】コマンドモジュールに含まれるクラスのＵＭＬクラス図である。
【図７】設定ファイルの内容を示す図である。
【図８】クライアントモジュールの種類、コマンドの種類、及びコマンドの実行権限の設定に応じたコマンドの実行の可否を示す図であり、（ａ）はコマンドの実行権限の設定がstrictの場合を示し、（ｂ）はコマンドの実行権限の設定がnormalの場合を示し、（ｃ）はコマンドの実行権限の設定がtolerateの場合を示す。
【図９】コマンドの実行処理を示すフローチャートである。
【図１０】図９のステップＳ９０２で実行される実行権限のチェック処理を示すフローチャートである。
【図１１】Commandパターンの構成を示すＵＭＬクラス図である。
【図１２】Commandパターンの動作を説明するＵＭＬシーケンス図である。
【図１３】EJBコマンドパターンの構成を示すＵＭＬクラス図である。
【図１４】EJBコマンドパターンの動作を説明するＵＭＬシーケンス図である。
【符号の説明】
【０１０６】
１００  クライアント
１２０ａ  クライアントモジュール
１２０ｂ  コマンドモジュール
１４０  設定ファイル
１４１  コマンドの実行先の設定
１４２  コマンドの実行権限の設定
１４３  ダミー実行の設定
２００  コマンドサーバ
２２０  コマンドモジュール
３００  ＤＢサーバ
Ｎ  ネットワーク
Ｓ９０３  コマンドの実行権限のチェック処理
Ｓ９０５  コマンドをダミー実行するか否かの判別
Ｓ９０７  コマンドの実行先の判別
【図１】
2005085240.tif 000003
【図２】
2005085240.tif 000004
【図３】
2005085240.tif 000005
【図４】
2005085240.tif 000006
【図５】
2005085240.tif 000007
【図６】
2005085240.tif 000008
【図７】
2005085240.tif 000009
【図８】
2005085240.tif 000010
【図９】
2005085240.tif 000011
【図１０】
2005085240.tif 000012
【図１１】
2005085240.tif 000013
【図１２】
2005085240.tif 000014
【図１３】
2005085240.tif 000015
【図１４】
2005085240.tif 000016