(57)【要約】【課題】ライフサイクル制御に係る条件や権限などの変更を簡便に行うことを可能にするプログラムおよび情報処理装置を提供する。【解決手段】本発明によれば、バンドルの制御するモジュール制御実行部と、各種制御条件を保持する制御条件記憶部と、制御条件の成立に応答して所定の制御動作の実行を依頼する制御動作制御部と、各バンドルから設定値を取得して制御動作制御部に通知する設定値取得部と、制御条件設定情報を外部から入力するための制御条件設定用ファイルと、制御条件設定用ファイルから読み出した内容に基づいて制御条件を設定する設定解釈部とを含み、モジュール制御実行部は、制御動作制御部からの依頼に応答してモジュール制御動作を実行する情報処理装置が提供される。【選択図】図１
2014059725.tif 000002
【特許請求の範囲】
【請求項１】
プラットフォーム上で動作する複数のアプリケーションモジュールを制御するモジュール制御手段を含む情報処理装置であって、
前記モジュール制御手段は、
アプリケーションモジュールのモジュール制御動作を実行するモジュール制御実行部と、
各アプリケーションモジュールに係る設定値で定義される設定値条件、該設定値条件で定義される制御条件および該制御条件の成立に伴って実行すべき制御動作を保持する制御条件記憶部と、
前記制御条件の成立を判断し、該制御条件の成立に応答して、該制御条件に紐付いた１以上の前記制御動作の実行を、前記モジュール制御実行部に依頼する制御動作制御部と、
各アプリケーションモジュールから前記設定値を取得し、該設定値を前記制御動作制御部に通知する設定値取得部と、
前記制御条件および前記モジュール制御動作を含む制御条件設定情報を外部から入力するための制御条件設定用情報と、
前記制御条件設定用情報から読み出した内容に基づいて、前記制御条件を前記制御条件記憶部に設定し、前記モジュール制御動作を制御設定記憶部に設定し、前記モジュール制御権制御動作を権限設定記憶部に設定する設定解釈部と
を含み、
前記モジュール制御実行部は、
前記制御動作制御部からの依頼に応答して、前記制御設定記憶部に設定された前記モジュール制御動作を実行する、
情報処理装置。
【請求項２】
前記モジュール制御手段は、
さらに、前記モジュール制御動作を行う権限の変更を内容とするモジュール制御権制御動作を実行する権限制御実行部を含み、
前記制御動作制御部は、前記制御条件の成立に応答して、該制御条件に紐付いた１以上の前記モジュール制御権制御動作の実行を前記権限制御実行部に依頼し、
前記制御条件設定情報は、前記モジュール制御権制御動作をさらに含み、
前記設定解釈部は、前記制御条件設定用情報から読み出した前記モジュール制御権制御動作を権限設定記憶部に設定し、
前記権限制御実行部は、
前記制御動作制御部からの依頼に応答して、前記権限設定記憶部に設定された前記モジュール制御権制御動作を実行する、
請求項１に記載の情報処理装置。
【請求項３】
前記モジュール制御実行部は、
前記アプリケーションモジュールに係るユーザが前記モジュール制御動作に係る前記権限を有していることを条件に、該モジュール制御動作を実行する、請求項２に記載の情報処理装置。
【請求項４】
前記モジュール制御動作は、起動動作であり、前記モジュール制御実行部は、制御対象となる前記アプリケーションモジュールに依存する他のモジュールが全て起動していることを条件に、該アプリケーションモジュールを起動する、
請求項１〜３のいずれか一項に記載の情報処理装置。
【請求項５】
前記モジュール制御動作は、停止動作であり、前記モジュール制御実行部は、制御対象となる前記アプリケーションモジュールに依存する他のモジュールが全て起動していることを条件に、該アプリケーションモジュールを起動する、
請求項１〜４のいずれか一項に記載の情報処理装置。
【請求項６】
前記設定値は、前記アプリケーションモジュールが他のモジュールの制御を行うためのトリガー条件を構成する文字データまたはバイナリデータである、
請求項１〜５のいずれか一項に記載の情報処理装置。
【請求項７】
前記設定値取得部は、各アプリケーションモジュールから定期的に前記設定値を取得する、請求項１〜６のいずれか一項に記載の情報処理装置。
【請求項８】
前記制御動作制御部は、前記制御動作の実行順序を前記制御条件について定義された優先度に基づいて決定する、請求項１〜７のいずれか一項に記載の情報処理装置。
【請求項９】
前記プラットフォームはＯＳＧｉフレームワークであり、前記アプリケーションモジュールはバンドルである、請求項１〜８のいずれか一項に記載の情報処理装置。
【請求項１０】
コンピュータを請求項１〜９のいずれか一項に記載の前記モジュール制御手段として機能させるためのコンピュータ実行可能なプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置およびプログラムに関する。
【背景技術】
【０００２】
OSGiフレームワークは、OSGi Allianceによって標準化されたサービスプラットフォームであり、現在、多くのベンダーがOSGiフレームワークに準拠した数々のアプリケーションサービスを提供している（例えば、特許文献１）。OSGiフレームワーク上で動くプログラムモジュールは、“バンドル”と呼ばれる。OSGiフレームワークにおいては、これらのバンドルをネットワークを介してユーザが動的にインストール・起動・停止・アンインストール・アップデートすることができ、また、その際に再コンパイルが不要であるといった簡便さがこのプラットフォームの特徴となっている。
【０００３】
バンドルのインストール・起動・停止・アンインストールに係る制御を、OSGiでは、“ライフサイクル制御”と呼ぶ。OSGiフレームワークにおいて、ライフサイクル制御は、そのフレームワークを通してのみ実行することができる。この機能を提供するフレームワーク上のモジュールを以降、管理バンドルと呼ぶ。管理バンドルは、フレームワーク上で動作するバンドルから依頼を受けて、他のバンドルをネットワークを介して外部からインストールしたり、同一フレームワーク上で動作する他のバンドルを起動・停止・アンインストールしたりする。
【０００４】
すなわち、OSGiフレームワークにおいては、管理バンドルが複数のバンドル（アプリケーションバンドル）の仲立ちをして、バンドル同士を連携させることで１つの大きなサービスを実現する。
【０００５】
ただし、これまでのフレームワークでは、管理バンドルは他のバンドルからの依頼を受けてライフサイクル制御を実施するに過ぎず、その制御に係る条件の成立や権限などについては、個々のアプリケーションバンドルが各自で判断した上で管理バンドルに制御依頼する構成となっていた。したがって、複数のアプリケーションバンドルに跨る動作の条件や権限などを変更するためには、それぞれのアプリケーションバンドルの変更に係るプログラムを全て書き換える必要があった（そして、この場合は、再コンパイルが必要となる）。
【０００６】
このような作業は、基本的にユーザサイド（保守者やシステム管理者）が自由に行えるものではなく、また、このような作業を依頼されるソフトウェア開発者にしてみても、数多くの対象の中から変更に係るモジュールとその対象箇所を探し出し、それら全てを漏れなく且つ整合性をもって書き換える作業は、非常に煩雑であり、大きな負担となっていた。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明は、上記従来技術における課題に鑑みてなされたものであり、本発明は、ライフサイクル制御に係る条件や権限などの変更をユーザサイドで簡便に行うことを可能にする新規なプログラムおよび該プログラムを実装した情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明者は、ライフサイクル制御に係る条件や権限などの変更をユーザサイドで簡便に行うことを可能にするため構成につき鋭意検討した結果、以下の構成に想到し、本発明に至ったのである。
【０００９】
すなわち、本発明によれば、プラットフォーム上で動作する複数のアプリケーションモジュールを制御するモジュール制御手段を含む情報処理装置であって、前記モジュール制御手段は、アプリケーションモジュールのモジュール制御動作を実行するモジュール制御実行部と、各アプリケーションモジュールに係る設定値で定義される設定値条件、該設定値条件で定義される制御条件および該制御条件の成立に伴って実行すべき制御動作を保持する制御条件記憶部と、前記制御条件の成立を判断し、該制御条件の成立に応答して、該制御条件に紐付いた１以上の前記制御動作の実行を、前記モジュール制御実行部に依頼する制御動作制御部と、各アプリケーションモジュールから前記設定値を取得し、該設定値を前記制御動作制御部に通知する設定値取得部と、前記制御条件、前記モジュール制御動作および前記モジュール制御権制御動作を含む制御条件設定情報を外部から入力するための制御条件設定用情報（ファイル）と、前記制御条件設定用情報から読み出した内容に基づいて、前記制御条件を前記制御条件記憶部に設定し、前記モジュール制御動作を制御設定記憶部に設定し、前記モジュール制御権制御動作を権限設定記憶部に設定する設定解釈部とを含み、前記モジュール制御実行部は、前記制御動作制御部からの依頼に応答して、前記制御設定記憶部に設定された前記モジュール制御動作を実行する情報処理装置が提供される。
【図面の簡単な説明】
【００１０】
【図１】本実施形態の情報処理装置のソフトウェア構成図。
【図２】本実施形態におけるバンドル制御権テーブルを示す図。
【図３】本実施形態における制御条件設定情報を示す図。
【図４】本実施形態の情報処理装置が実行する処理のシーケンス図。
【図５】本実施形態における設定解釈部が実行する制御条件設定の読み込み処理のフローチャート。
【図６】本実施形態における制御条件管理テーブルを示す図。
【図７】本実施形態における設定値条件テーブルを示す図。
【図８】本実施形態における制御動作管理テーブルを示す図。
【図９】本実施形態におけるバンドル制御動作テーブルを示す図。
【図１０】本実施形態におけるバンドル制御権制御動作テーブルを示す図。
【図１１】本実施形態の情報処理装置が実行する処理のシーケンス図。
【図１２】本実施形態における制御動作制御部が実行する処理のフローチャート。
【図１３】本実施形態における優先度設定テーブルを示す図。
【図１４】本実施形態における制御動作制御部が実行する処理のフローチャート。
【図１５】本実施形態における権限制御実行部が実施する処理のフローチャート。
【図１６】本実施形態におけるバンドル制御実行部が実施する処理のフローチャート。
【発明を実施するための形態】
【００１１】
以下、本発明を、実施形態をもって説明するが、本発明は後述する実施形態に限定されるものではない。なお、以下に参照する各図においては、共通する要素について同じ符号を用い、適宜、その説明を省略するものとする。
【００１２】
本発明のモジュール制御プログラムは、コンピュータにインストールされると、共通プラットフォーム上で動作する複数のアプリケーションモジュールを制御する手段として機能する。以下、共通プラットフォームとしてOSGi Allianceに準拠したOSGiフレームワークを採用した実施形態に基づいて説明する。
【００１３】
図１は、本発明の実施形態であるモジュール制御プログラムが実装された情報処理装置１００のソフトウェア構成図を示す。
【００１４】
情報処理装置１００は、複数のアプリケーションバンドル１０と、OSGiフレームワーク２０と、バンドル制御手段３０とを含んで構成されている。
【００１５】
OSGiフレームワーク２０において、“バンドル”とは、プログラムモジュールとして参照されるものであり、基本サービスバンドルとアプリケーションバンドルからなる。基本サービスバンドルは、各サービスに共通する基本的な機能をOSGi Allianceが標準化したものであり、その仕様が決められている。一方、アプリケーションバンドル１０については、各ベンダーが自由に設計することができ、各アプリケーションバンドル１０は、OSGi Allianceに準拠したOSGiフレームワーク２０が提供するＪａｖａ（登録商標）ベースの実行環境で動作する。
【００１６】
一方、バンドル制御手段３０は、本発明の実施形態であるモジュール制御プログラムによって実現されるモジュール制御手段であり、アプリケーションバンドル１０のインストール・起動・停止・アンインストールに係る制御（以下、ライフサイクル制御という）を実行する。なお、バンドル制御手段３０は、それ自体が１つのバンドルとしてOSGiフレームワーク２０上で動作する。
【００１７】
従来、アプリケーションバンドル１０に係るライフサイクル制御は、特権を与えられ“管理バンドル”が他のアプリケーションバンドル１０から依頼を受けて実施していたところ、本実施形態のバンドル制御手段３０は、従来の管理バンドルの機能を拡張するものであり、制御動作制御部３１と、バンドル制御実行部３２と、権限制御実行部３３と、設定解釈部３４と、設定値取得部４０とを含んで構成されている。
【００１８】
制御動作制御部３１は、所定の制御条件が成立したか否かを判断し、成立した制御条件に対応する１以上の制御動作をバンドル制御実行部３２および権限制御実行部３３の少なくとも一方に依頼する。
【００１９】
バンドル制御実行部３２は、制御動作制御部３１からの依頼を受けて、アプリケーションバンドル１０に対してライフサイクル制御に係る所定の制御動作（インストール・起動・停止・アンインストール）を実施する。
【００２０】
権限制御実行部３３は、制御動作制御部３１からの依頼を受けて、アプリケーションバンドル１０に対してライフサイクル制御を行う権限を変更する制御動作を実施する。
【００２１】
ここで、バンドル制御実行部３２は、アプリケーションバンドル１０への制御動作を実施する際、権限制御実行部３３にユーザ権限の有無を問い合わせる。これを受けて、権限制御実行部３３は、権限記憶部３８に保持されるバンドル制御権テーブル５００を参照し、問い合わせに係るユーザが制御対象となるアプリケーションバンドル１０を制御する権限を持っているか否かをバンドル制御実行部３２に返す。
【００２２】
図２は、バンドル制御権テーブル５００を例示する。バンドル制御権テーブル５００においては、各バンドルに対する制御動作に係る権限（以下、バンドル制御権として参照する）がユーザ毎に定義される。図２に示す例では、ユーザ“Alice”がバンドル“com.foo.print”を停止“STOP”する権限およびバンドル“com.foo.preview”を停止“STOP”する権限を持つことが記述され、また、バンドル“com.foo.log”については、何の権限も持たない“NULL”ことが記述されている。バンドル制御権は、図２に例示する“START”、“STOP”、“NULL”、“ALL”（全ての権限を持つ）の他にも、“RESTART”、“INIT”、“COMMUNICATE”などを記述することもできる。なお、本実施形態においては、OSGiフレームワークが備える既存の機能を流用して権限記憶部３８を構成してもよい。
【００２３】
設定解釈部３４は、情報処理装置１００の起動時において、制御条件設定用ファイル３９から制御条件設定情報を読み込んで解析し、制御条件に関する各種パラメータを、制御条件記憶部３５、制御設定記憶部３６、権限設定記憶部３７のそれぞれに振り分けて設定する。
【００２４】
ここで、本実施形態における制御条件設定用ファイル３９は、外部から制御条件設定情報を入力することができるように構成されており、制御条件設定情報受け付け部として機能する。バンドル開発者やシステム管理者などは、制御条件設定用ファイル３９を介して制御条件設定情報の内容を自由に設定することができる。
【００２５】
図３は、XML形式で記述された制御条件設定情報を例示的に示す。以下、図３に例示する制御条件設定情報の内容について説明する。
【００２６】
“condition”タグは制御条件を表し、“condition”タグのname属性は、制御条件名を表す。図３に示す例では、１行目および６行目の“condition”タグで囲まれた２行目〜５行目のコードによって制御条件が記述されている。
【００２７】
“or”タグは、ＯＲ条件を表し、図３に示す例では、 “printingLimitationAtAlice”という制御条件名を持つ制御条件が“or”タグで囲まれる２つの条件（３行目の条件および４行目の条件）のＯＲ条件であることを表している。この他にも“and”タグや“not”タグ等を使って、ＡＮＤ条件やＮＯＴ条件を記述することもできる。
【００２８】
“attr”タグは、設定値の条件を表し、“attr”タグのname属性は設定値名を表す。図３に示す例では、３行目のコードは、 “prop.Alice.print.bwcount”という設定値名を持つ設定値が“value”が指定する値“100”に対して、“ope”が指定するオペランド“moreThan”を満たすことを条件とする旨が記述されている。この他にも、“ope”によって “lessThan”、“equals”、“＜”、“＝”などの演算子を指定することができる。
【００２９】
“exec”タグは、“condition”タグに記述した制御条件が成立した際に行うべき制御動作を表し、図３に示す例では、“exec”タグで囲まれた８行目〜１４行目のコードに制御動作が定義されている。
【００３０】
“bundle”タグは、バンドルに対する制御動作を表し、“bundle”タグのname属性は制御対象となるバンドル名を表し、“bundle”タグで囲まれる値がバンドルに対する制御動作の内容を表す。図３に示す例では、８行目は、バンドル“com.foo.print”を停止“STOP”する制御動作を表し、９行目は、バンドル“com.foo.log”を停止“STOP”する制御動作を表している。
【００３１】
“grant”タグは、ユーザのバンドル制御権に関する制御動作を表し、 “grant”タグの“ope”属性は“bundle”タグに囲まれる値（バンドル制御権の内容）について行う制御動作の内容を表す。そして、“user”タグは、制御の対象となるバンドル制御権を所有するユーザのユーザ名を表す。
【００３２】
図３に示す例では、“grant”タグで囲まれた１１行目〜１３行目が、“Alice”というユーザから、バンドル“com.foo.print”に係る権限（“ALL”）を削除（“delete”）するという制御動作、ならびに、“Alice”というユーザから、バンドル“com.foo.log”に係る権限（“ALL”）を削除（“delete”）するという制御動作を表している。
【００３３】
設定値取得部４０は、各アプリケーションバンドル１０から各種設定値を取得して設定値記憶部４２内で管理する。設定値取得部４０は、設定値の変更を監視し、変更を検出したことに応答して、バンドル制御手段３０にその旨（変更された値）を通知する。なお、ここでいう設定値とは、各アプリケーションバンドル１０が他のバンドルのライフサイクル制御を行うためのトリガー条件を構成するデータ一般（文字データまたはバイナリデータ）として参照されるものであり、日付やシステム起動時間などの各種時間情報やアプリケーションが使用するリソース（画像データなど）などを例示することができる。なお、本実施形態においては、各アプリケーションバンドル１０の設定値の出力先を予め設定値取得部４０に設定しておくことが前提となる。
【００３４】
以上、本実施形態の情報処理装置１００のソフトウェア構成について概説したが、続いて、上述したバンドル制御手段３０が実行する具体的な動作について説明する。なお、以下の説明においては、適宜、図１を参照するものとする。
【００３５】
図４は、情報処理装置１００の起動時に本実施形態の情報処理装置１００が実行する処理のシーケンス図である。
【００３６】
OSGiフレームワーク２０は、情報処理装置１００が起動すると、設定解釈部３４に対して制御条件の読込を指示する（Ｓ１）。これに応答して、設定解釈部３４は、制御条件設定用ファイル３９から制御条件設定情報を読み込む。
【００３７】
設定解釈部３４は、読み込んだ制御条件設定情報を解析して、図６〜図１０に示す各種テーブルを作成する。以下、設定解釈部３４が実行する制御条件設定の読み込み処理（テーブル作成処理）につき、図５に示すフローチャートに基づいて具体的に説明する。
【００３８】
設定解釈部３４は、制御条件設定用ファイル３９から制御条件設定情報を読み込んで以下の処理を開始する（ステップ１０１）。まず、ステップ１０２において、制御条件設定情報の文法チェックを行う。具体的には、XMLの構文に従っているか、タグ間の対応付けや入れ子構造が正しいか、指定されたタグや属性がシステム内に登録されているか等、制御条件設定情報の内容が正しいフォーマットで記載されているか否かを検証する。
【００３９】
その結果、文法に誤りがあった場合は（ステップ１０３、Ｎｏ）、制御条件設定の読み込みを失敗し、そのまま処理を終了する（ステップ１０４）。一方、文法に誤りがない場合は（ステップ１０３、Ｙｅｓ）、ステップ１０５に進んで、制御条件管理テーブル１０００を作成（更新）する。
【００４０】
図６は、制御条件管理テーブル１０００を例示的に示す。制御条件管理テーブル１０００では、制御条件が設定値条件で定義される。図６に示す例では、制御条件“printingLimitationAtAlice”が設定値条件ＩＤ列“C001∧C002”として定義されている。
【００４１】
設定値条件ＩＤ列は、設定値条件ＩＤとシステムが提供する演算子（算術演算子や関係演算子、論理演算子など）や関数で表される。図６に示す設定値条件ＩＤ列“C001∧C002”は、ＩＤ“C001”が示す設定値条件とＩＤ“C002”が示す設定値条件の論理和“∧”を意味する。以下、図３に例示した制御条件設定情報を解析して制御条件管理テーブル１０００を作成する過程を説明する。
【００４２】
まず、“condition”タグから制御条件名“printingLimitationAtAlice”を読み込み、“condition”タグ内の２つの“attr”タグのそれぞれに対して固有の設定値条件ＩＤ（“C001”、“C002”）を割り当てた上で、演算子タグ“or”と“attr”タグ間の関係に基づいて設定値条件ＩＤ列“C001∧C002”を作成する。最後に、読み込んだ制御条件名“printingLimitationAtAlice”と作成した設定値条件ＩＤ列“C001∧C002”とを紐付けたレコードを制御条件管理テーブル１０００内に作成する。
【００４３】
制御条件管理テーブル１０００の作成（更新）が終了すると、ステップ１０６に進み、設定値条件テーブル１１００を作成（更新）する。
【００４４】
図７は、設定値条件テーブル１１００を例示的に示す。設定値条件テーブル１１００では、設定値に係る条件が定義される。設定値条件テーブル１１００においては、設定解釈部３４が割り当てた設定値条件ＩＤに対して、設定値名、設定値およびオペランドが紐付けて記述される。ここで、設定値名は、システム管理者やバンドル作成者などが付与する任意の名称であり、設定値は、具体的な数値やシステムが提供する変数あるいは関数などが記述される。
【００４５】
図７に示す例においては、設定値名“prop.Bob.preview.trylimitdate”の設定値が本日の日付（“$Date(TODAY)”）よりも大きい(“moreThan”)という条件に対して設定値条件ＩＤ“C003”が割り当てられている。以下、図３に例示した制御条件設定情報を解析して設定値条件テーブル１１００を作成する過程を説明する。
【００４６】
まず、設定値条件ＩＤを割り当てた全ての“attr”タグについて、“name”属性、“value”属性“ope”属性をそれぞれ読み込む。その後、各値を設定値条件テーブル１１００の設定値名、設定値、オペランドの各フィールドに紐付けて格納して１つのレコードを作成する。図７に示す例では、設定値条件ＩＤ“C001”のレコードに、３行目の“prop.Alice.print.bwcount”、“100”、“moreThan”が格納され、設定値条件ＩＤ“C002”のレコードに、４行目の“prop.Alice.print.colorcount”、“50”、“moreThan”が格納されている。
【００４７】
設定値条件テーブル１１００の作成（更新）が終了すると、ステップ１０７に進み、制御動作管理テーブル１２００を作成（更新）する。
【００４８】
図８は、制御動作管理テーブル１２００を例示的に示す。制御動作管理テーブル１２００では、制御条件が満たされたときにバンドル制御手段３０が実施すべき制御動作が定義される。制御動作管理テーブル１２００においては、制御条件名に対して、制御番号、制御ＩＤおよび制御タイプが紐付けて記述されている。ここで、制御番号は、制御動作を実施する順番を示し、制御ＩＤは、設定解釈部３４が制御動作を定義する際に割り当てる識別子を示す。また、制御タイプは、制御動作の種類を示し、制御動作には、バンドルに対する制御動作（“BUNDLE”）、または、バンドル制御権に対する制御動作（“AUTH”）のいずれかにタイプが割り当てられる。以下、図３に例示した制御条件設定情報を解析して制御動作管理テーブル１２００を作成する過程を説明する。
【００４９】
まず、“exec”タグ内に存在する２つの“bundle”タグ、および１つの“grant”タグのそれぞれに対して固有の制御ＩＤ（“S001”、“S001”、S003”）を割り当てた後、コードに記述されている順番に従って昇順で制御番号を割り当てる。次に、バンドルの制御動作を表す“bundle”タグに係る制御ＩＤおよび制御番号に対して、制御タイプとして“BUNDLE”を割り当て、ユーザの権限に関する制御動作を表す“grant”タグに係る制御ＩＤおよび制御番号に対しては、制御タイプとして“AUTH”を割り当る。最後に、割り当てた制御番号、制御ＩＤ、制御タイプに対して、ステップ１０５で取得した制御条件名“printingLimitationAtAlice”を紐付けて１つのレコードを作成する。
【００５０】
なお、上述した手順で作成された３つのテーブル（制御条件管理テーブル１０００・設定値条件テーブル１１００・制御動作管理テーブル１２００）は、制御条件記憶部３５において参照可能に保持される。
【００５１】
続いて、処理はステップ１０８に進み、バンドル制御動作テーブル１３００を作成（更新）する。図９は、バンドル制御動作テーブル１３００を示す。バンドル制御動作テーブル１３００では、バンドルに対する制御動作が定義される。バンドル制御動作テーブル１３００においては、制御ＩＤに対して、バンドル名と制御動作の内容が紐付けて記述される。図９に示す例では、先のステップ１０７で割り当てた制御ＩＤ“S001”に対して、バンドル“com.foo.print”を停止“STOP”させる制御動作が定義されている。以下、図３に例示した制御条件設定情報を解析してバンドル制御動作テーブル１３００を作成する過程を説明する。
【００５２】
まず、“exec”タグ内に存在する“bundle”タグについて、“name”属性とバンドル制御動作テーブル１３００の内容をそれぞれ読み込む。その後、読み込んだ各値をバンドル制御動作テーブル１３００のバンドル名および制御動作の各フィールドに紐付けて格納して１つのレコードを作成する。図９に示す例では、制御ＩＤ“C001”のレコードに、８行目の“com.foo.print”および“STOP”が紐付いて格納され、制御ＩＤ“C002”のレコードに、９行目の“com.foo.log”および“STOP”が紐付いて格納されている。なお、“exec”タグ内に “bundle”タグが存在しない場合は、ステップ１０８はスキップされる。上述した手順で作成したバンドル制御動作テーブル１３００は、制御設定記憶部３６に保存される。
【００５３】
続いて、処理は、ステップ１０９に進み、バンドル制御権制御動作テーブル１４００を作成（更新）する。図１０は、バンドル制御権制御動作テーブル１４００を示す。バンドル制御権制御動作テーブル１４００では、バンドル制御権に対する制御動作が定義される。バンドル制御権制御動作テーブル１４００においては、制御ＩＤに対して、バンドル名、ユーザ名、バンドル制御権および制御動作の内容が紐付けて記述される。以下、図３に例示した制御条件設定情報を解析してバンドル制御権制御動作テーブル１４００を作成する過程を説明する。
【００５４】
まず、“exec”タグ内に存在する“grant”タグについて“ope”属性（制御動作）を読み込み、次に、“grant”タグに囲まれる“user”タグが表すユーザ名を読み込み、次に、“grant”タグに囲まれる“bundle”タグが表す、“name”属性（バンドル名）とバンドル制御権を読み込む。その後、読み込んだ各値をバンドル制御権制御動作テーブル１４００のバンドル名、ユーザ名、バンドル制御権および制御動作の各フィールドに紐付けて格納して１つのレコードを作成する。
【００５５】
図１０に示す例では、制御ＩＤ“S003”について、バンドル“com.foo.print”に対してユーザ“Alice”が有する権限（“ALL”）を削除する（“DELETE”）という制御動作と、バンドル“com.foo.log”に対してユーザ“Alice”が有する権限（“ALL”）を削除する（“DELETE”）という制御動作（２つの制御動作）が定義されている。なお、“exec”タグ内に“grant”タグが存在しない場合は、ステップ１０９はスキップされる。上述したバンドル制御権制御動作テーブル１４００は、権限設定記憶部３７に保存される。
【００５６】
全てのテーブル作成が終了すると、制御条件設定の読み込み処理を終了する（ステップ１１０）。
【００５７】
以上、設定解釈部３４が実行する制御条件設定の読み込み処理（テーブル作成処理）についての説明が終わったので、引き続き、図４のシーケンス図に戻って説明を続ける。
【００５８】
設定解釈部３４から制御条件設定の読込完了の通知を受けたOSGiフレームワーク２０は、制御動作制御部３１に対して制御の開始を指示する（Ｓ２）。これを受けて、制御動作制御部３１は、制御条件管理テーブル１０００（図６）の内容を制御条件記憶部３５から読み込み、制御条件管理テーブル１０００に記述された制御条件の中で、成立している条件があるか否かを確認する（Ｓ３）。
【００５９】
具体的には、制御条件管理テーブル１０００の各レコードから制御条件名とこれに紐付いた設定値条件ＩＤ列を読み取り、当該設定値条件ＩＤ列に記載された設定値条件ＩＤをキーとして制御条件記憶部３５内の設定値条件テーブル１１００（図７）を検索して、当該設定値条件ＩＤに紐付いた設定値名を取得する。その後、取得した設定値名に係る設定値を設定値取得部４０から取得する（Ｓ４）。
【００６０】
取得した設定値が設定値条件ＩＤ列とオペランドの関係を満たしている場合、当該制御条件ＩＤが示す制御条件は成立していると判断される。その後、制御動作制御部３１は、成立した制御条件に対応する制御動作の種類に応じて、バンドル制御実行部３２または権限制御実行部３３のいずれかに制御動作を依頼する（Ｓ５）。
【００６１】
具体的には、成立した制御条件の制御条件名をキーとして制御条件記憶部３５内の制御動作管理テーブル１２００（図８）を検索し、制御タイプを取得する。その結果、制御タイプが“AUTH”であった場合は、権限制御実行部３３に対してバンドル制御権に対する制御動作を依頼する（Ｓ６）。これを受けて、権限制御実行部３３は、権限記憶部３８内のバンドル制御権テーブルの内容を更新する制御動作を実施する。
【００６２】
一方、制御タイプが“BUNDLE”であった場合は、バンドル制御実行部３２に対してバンドルに対する制御動作を依頼する（Ｓ７）。これを受けて、バンドル制御実行部３２は、現在のユーザが制御対象となるバンドルを制御動作する権限を有しているか否かについて権限制御実行部３３に確認を行い（Ｓ８）、権限を有している場合、当該バンドルに対して制御動作を行う（Ｓ９）。
【００６３】
以上、情報処理装置１００の起動時に実行される処理について説明してきたが、次に、起動後において設定値の変更がなされた場合に情報処理装置１００が実行する処理について説明する。
【００６４】
図１１は、起動後において設定値の変更がなされた場合に情報処理装置１００が実行する処理を表すシーケンス図である。
【００６５】
起動後、ユーザの操作や他のバンドルからの制御によって（Ｓ１）、アプリケーションバンドル１０の設定値の変更が指示されると（Ｓ２）、これに応答して、設定値取得部４０は、設定値記憶部４２に保存される設定値を更新した後（Ｓ３）、その旨を制御動作制御部３１に通知する（Ｓ４）。
【００６６】
これを受けて、制御動作制御部３１は、制御条件管理テーブル１０００（図６）の内容を制御条件記憶部３５から読み込み、制御条件管理テーブル１０００に記述された制御条件の中で、当該設定値の変更に伴って成立した制御条件があるか否かを確認する（Ｓ５）。以降、Ｓ６〜Ｓ１１までのシーケンスは、図４におけるＳ４〜Ｓ９のシーケンスと同じであるので、これ以上の説明を省略する。
【００６７】
続いて、図１１におけるＳ５〜Ｓ９までのシーケンスにおいて制御動作制御部３１が実行する具体的な処理の内容を図１２に示すフローチャートに基づいて説明する。なお、以下では、設定値“prop.Alice.print.bwcount”が“100”から“120”に更新された場合を例にとって説明する。
【００６８】
設定値取得部４０は、設定値“prop.Alice.print.bwcount”を“100”から“120”に更新すると、その旨を制御動作制御部３１に通知する（図１１のＳ４）。この通知には、更新された設定値の設定値名“prop.Alice.print.bwcount”、更新後の設定値“120”、設定値が変更されたバンドルのユーザ名が含まれる。制御動作制御部３１は、上記通知を受けたことに応答して処理を開始する（ステップ２０１）。
【００６９】
制御動作制御部３１は、ステップ２０２において、設定値に関連する条件を検索し、検索結果を配列Ｐに保存する。具体的には、更新された設定値の設定値名“prop.Alice.print.bwcount”をキーとして制御条件記憶部３５内の設定値条件テーブル１１００（図７）を検索し、設定値名“prop.Alice.print.bwcount”に紐付いた設定値条件ＩＤ“C001”を取得する。続いて、取得した設定値条件ＩＤ“C001”をキーとして制御条件管理テーブル１０００（図６）を検索し、対応する制御条件（この場合、“printingLimitationAtAlice”、“C001∧C002”）を取得し、配列Ｐに保存する。
【００７０】
続くステップ２０３では、１以上の制御条件が取得されたか否か（配列Ｐの要素数が０より大きいか否か）が判断される。１つの制御条件も取得されなかった場合には（ステップ２０３、Ｎｏ）、変更された設定値に依存する制御条件は存在しないので、そのまま処理を終了する（ステップ２０４）。
【００７１】
一方、制御条件管理テーブル１０００（図６）から少なくとも１つの制御条件を取得した場合には、取得した制御条件の数（配列Ｐの要素数）をＮにセットし（ステップ２０５）、配列Ｐの要素[ｉ]および配列Ｃの要素[ｊ]を０に初期化した後に（ステップ２０６）、続くステップ２０７〜ステップ２１１のループ内で、取得した全ての制御条件について、その成否を検証する。
【００７２】
まず、ステップ２０７において、以下の判断処理が実施される。例では、制御条件に係る設定値条件ＩＤ列“C001∧C002”に含まれる全ての設定値条件ＩＤ（“C001”および“C002”）をキーとして設定値条件テーブル１１００（図７）を検索し、当該設定値条件ＩＤに対応する設定値条件を抽出する。例では、設定値条件テーブル１１００の１行目と２行目のレコードが抽出される。
【００７３】
続いて、抽出した全ての設定値条件の成否を調べる。ここで、設定値条件ＩＤ“C001”に係る設定値条件（設定値“prop.Alice.print.bwcount”が“100”よりも大きい“moreThan”）に関して、設定値取得部４０から通知された設定値“prop.Alice.print.bwcount”の値“120”はこれを満たしている。一方、設定値条件ＩＤ“C002”に係る設定値は、設定値取得部４０からの通知には含まれていないので、これについては、別途、設定値取得部４０から取得して、設定値条件ＩＤ“C002”に係る設定値条件（設定値“prop.Alice.print.colorcount”が“50”よりも大きい“moreThan”）について、その成否を調べる。
【００７４】
最後に、上述した２つの設定値条件の成否に基づいて、設定値条件ＩＤ列“C001∧C002”の真偽を判定する。ここで、仮に設定値条件ＩＤ“C002”に係る設定値条件が成立していた場合は、設定値条件ＩＤ列“C001∧C002”の判定結果は真となる（すなわち、制御条件を満たす）。制御条件が満たされた場合（ステップ２０７、Ｙｅｓ）、その制御条件名“printingLimitationAtAlice”を配列Ｃに保存する（ステップ２０８）。
【００７５】
ステップ２０７〜ステップ２１１のループの結果、満たされた制御条件が１つも存在しなかった場合には（ステップ２１２、Ｎｏ）、設定値の変更に伴って行うべき制御は無いので、そのまま処理を終了する（ステップ２１３）。一方、少なくとも１つの満たされた制御条件があった場合は（ステップ２１２、Ｙｅｓ）、ステップ２１４において、満たされた制御条件が複数であるか否かを判断する。
【００７６】
満たされた制御条件が複数ある場合は（ステップ２１４、Ｙｅｓ）、ステップ２１５に進んで、複数の制御条件についてその優先度を決定する。ここで優先度とは、最終的に動作や権限が反映されるべき度合いを意味する。この優先度を決定しないままでこのシステムを動作させた場合、処理のタイミング等により制御の順序が変わってしまい、不規則な挙動をしているかのように振舞ってしまう。
【００７７】
本実施形態においては、図１３に例示するような優先度設定テーブル１５００を設けて、制御条件ごとに予め優先度を固定的に定義しておき、満たされた複数の制御条件について、優先度設定テーブル１５００を参照して優先度を決定するように構成することができる。また、関連するモジュールのソフトウェアメトリクス（モジュールの総行数や、総複雑度）を利用したり、制御条件設定情報に記述された条件の数や制御の数などを利用したりして、優先度を動的に決定するように構成することもできる。この他、必要に応じて、その都度ユーザに問い合わせて優先度を決定するように構成してもよい。
【００７８】
ステップ２１５で優先度を決定すると、続くステップ２１６において、配列Ｃ内の複数の制御条件を優先度の低い条件から昇順に整列する。なお、満たされた制御条件が１つであった場合は（ステップ２１４、Ｎｏ）、上述したステップ２１５、２１６をスキップする。
【００７９】
最後に、配列Ｃの各要素（成立した制御条件）に対応する制御動作を整列した順番に（すなわち、優先度の低いものから順番に）実施する（ステップ２１７〜ステップ２２１）。その結果、優先度が低い制御動作の後に優先度の高い制御動作が実施されるようになり、優先度が高い制御動作の影響が全体の制御に反映されるようになる。全ての制御動作を実施し終えた時点で（ステップ２２１、Ｙｅｓ）、処理を正常終了する（ステップ２２２）。
【００８０】
続いて、図１２のステップ２１９における処理の詳細を図１４に示したフローチャートに基づいて説明する。
【００８１】
制御動作制御部３１は、配列Ｃから順番に１つずつ制御条件名を入力として受け取り（ステップ３０１）、以下の処理を開始する。まず、ステップ３０２において、制御条件名をキーとして制御動作管理テーブル１２００（図８）を検索して、制御条件名“printingLimitationAtAlice”に紐付いた制御を取得し、配列Ｄに保存する。図８に示す例では、制御条件名“printingLimitationAtAlice”に紐付いた３つの制御ＩＤ“S001”、“S002”、“S003”に係る制御が保存される。
【００８２】
続くステップ３０３において、取得した制御を制御番号順に整列する。図８に示す例では、“S001”、“S002”、“S003”の順番で整列する。
【００８３】
続いて、配列Ｄに保存した制御の総数をＮにセットし（ステップ３０４）、制御の要素[ｉ]を０に初期化した後（ステップ３０５）、続くステップ３０６〜ステップ３１０のループ内で、配列Ｄの全ての制御について、依頼動作を実施する。
【００８４】
具体的には、制御ＩＤに紐付いた制御タイプが“AUTH”であった場合は（ステップ３０７、Ｙｅｓ）、権限制御実行部３３に対して当該制御ＩＤを渡し、バンドル制御権の制御を依頼する（ステップ３０８）。一方、制御ＩＤに紐付いた制御タイプが“AUTH”でない場合には（ステップ３０７、Ｎｏ）、バンドル制御実行部３２に対して当該制御ＩＤを渡し、バンドルの制御を依頼する（ステップ３０９）。配列Ｄの全ての制御について、依頼を終えた段階で（ステップ３０６、Ｙｅｓ）、処理は終了する（ステップ３１１）。
【００８５】
次に、図１４のステップ３０８で制御動作制御部３１から依頼を受けた権限制御実行部３３が実施する処理を図１５に示すフローチャートに基づいて説明する。
【００８６】
権限制御実行部３３は、制御動作制御部３１から制御ＩＤを入力として受けたことに応答して処理を開始する（ステップ４０１）。まず、権限制御実行部３３は、受け取った制御ＩＤをキーとしてバンドル制御権制御動作テーブル１４００（図１０）を検索し、当該制御ＩＤに対応するバンドル制御権動作の内容（バンドル名、ユーザ名、ユーザ権限、制御動作の各値）を取得する（ステップ４０２）。例では、権限制御実行部３３は、制御動作制御部３１から受け取った制御ＩＤ“S003”に対応する２つのバンドル制御権動作の内容（“com.foo.print”、“Alice”、“ALL”、“DELETE”ならびに“com.foo.log”、“Alice”、“ALL”、“DELETE”）を取得する。
【００８７】
続いて、権限制御実行部３３は、取得したバンドル制御権動作に係るバンドル（“com.foo.print”および“com.foo.log”）に対する権限を編集する権限を、現ユーザ（すなわち、設定値が変更されたアプリケーションバンドル１０のユーザ）が持っているか否かについて、OSGiフレームワーク２０が提供するアクセス管理機構（OSGiにおけるConfigurationPermission、FilePermission、AdminPermission等に相当）に問い合わせて判断する（ステップ４０３）。その結果、現ユーザが編集する権限を持たない場合は（ステップ４０４、Ｎｏ）、バンドル制御権動作を実施することなく、そのまま処理を終了する（ステップ４０５）。
【００８８】
一方、編集する権限を持つ場合（ステップ４０４、Ｙｅｓ）、ステップ４０２で取得したユーザ名とバンドル名に係る権限について、権限記憶部３８に保存されるバンドル制御権テーブル５００（図２）の値を更新する（ステップ４０６）。例では、バンドル制御権テーブル５００（図２）において、“Alice”の“com.foo.print”に対する全ての権限“ALL”（この場合“STOP”）を削除“DELETE”し、“Alice”の“com.foo.print”に対する権限を新たに“NULL”に更新する。更新が完了すると、処理を終了する（ステップ４０７）。
【００８９】
次に、図１４のステップ３０９で制御動作制御部３１から依頼を受けたバンドル制御実行部３２が実施する処理を図１６に示すフローチャートに基づいて説明する。
【００９０】
バンドル制御実行部３２は、制御動作制御部３１から制御ＩＤを入力として受けたことに応答して、バンドル自体の制御（例では、起動と停止）を開始する（ステップ５０１）。
【００９１】
バンドル制御実行部３２は、まず、制御ＩＤをキーとしてバンドル制御動作テーブル１３００（図９）を検索し、制御ＩＤに紐付いた制御対象となるバンドル名および制御動作を取得する（ステップ５０２）。仮に、制御ＩＤとして“S001”を受けとった場合、図９に示す例では、バンドル名“com.foo.print”とその制御動作“STOP”を取得する。
【００９２】
続くステップ５０３では、制御対象となるバンドルの状態が、取得した制御動作の内容と等しいか否かが判断される。仮に、制御対象となるバンドルが“com.foo.print”であり、その制御動作として“STOP”を取得した場合、当該バンドル“com.foo.print”の状態を確認し、その結果、バンドル“com.foo.print”が既に停止（“STOP”）している場合には（ステップ５０３、Ｙｅｓ）、さらに停止制御を行う必要がないので、そのまま処理を終了する（ステップ５０４）。一方、制御対象となるバンドルの状態が、取得した制御動作の内容と等しくない場合（ステップ５０３、Ｎｏ）、ステップ５０５に進む。
【００９３】
ステップ５０５では、現ユーザ（すなわち、設定値を変更したユーザ）が制御対象のバンドルについて、取得した制御動作を行う権限があるか否かを権限制御実行部３３に問い合わせて確認する。その結果、権限が存在しない場合は（ステップ５０６、Ｎｏ）、制御を実施することは出来ないため、そのまま処理を終了する（ステップ５０７）。一方、権限が存在する場合には（ステップ５０６、Ｙｅｓ）、ステップ５０８に進む。
【００９４】
一般に、バンドルには依存バンドルが存在する。バンドルは、依存バンドルの全てが起動していない状態で自身の起動を行うことができず、また、依存バンドルの全てが停止していない状態で自身の停止を行うことができない。この点につき、ステップ５０８では、ステップ５０２で取得した制御動作の内容が起動“START”であるか否か（すなわち、起動“START”であるか停止“STOP”であるか）を判断し、制御動作の内容に応じた処理を実施する。
【００９５】
ステップ５０８において、取得した制御動作の内容が起動“START”であると判断した場合（ステップ５０８、Ｙｅｓ）、まず、ステップ５０９において、当該制御対象となるバンドルに依存するバンドルが有るか否かを判断する。この判断は、OSGiフレームワーク２０への問い合わせ結果に基づいて行われ、その結果、依存バンドルが存在しない場合には（ステップ５０９、Ｎｏ）、制御対象のバンドルを起動“START”した後（ステップ５１９）、処理を終了する（ステップ５２０）。
【００９６】
一方、依存するバンドルが存在する場合には（ステップ５０９、Ｙｅｓ）、全ての依存バンドルについて、起動“START”を再帰的に実施する（ステップ５１０〜ステップ５１７）。全ての依存バンドルについて起動“START”を実施した後に（ステップ５１７、Ｙｅｓ）、全ての依存バンドルが起動した状態となっているか否かを確認する（ステップ５１８）。これは、依存バンドルの起動処理を行っている間に、設定値やリソースの書き換えが行われることにより、起動した依存バンドルが再び終了させられている可能性があるからである。
【００９７】
その結果、全ての依存バンドルが起動している場合は（ステップ５１８、Ｙｅｓ）、制御対象のバンドルを起動“START”し（ステップ５１９）、処理を終了する（ステップ５２０）。一方、全ての依存バンドルが起動していない場合には（ステップ５１８、Ｎｏ）、起動“START”を実施することができないため、処理は失敗する（ステップ５１５）。
【００９８】
先のステップ５０８において、ステップ５０２で取得した制御動作の内容が起動（“START”）でないと判断された場合（すなわち、停止“STOP”であると判断された場合）には（ステップ５０８、Ｎｏ）、続くステップ５２１において、制御対象のバンドルが、他のバンドルから依存されているか否か（すなわち、他のバンドルの依存バンドルとなっているか否か）を判断する。なぜならば、自身が他のバンドルの依存バンドルである場合、これを勝手に停止することは不適切だからである。この判断は、OSGiフレームワーク２０への問い合わせ結果に基づいて行われ、被依存バンドルが存在した場合は（ステップ５２１、Ｙｅｓ）、そのまま処理を終了する（ステップ５２２）。
【００９９】
一方、被依存バンドルが存在しない場合には（ステップ５２１、Ｎｏ）、続くステップ５２３において、依存バンドルが存在するか否かの判断を行う。この判断は、同じく、OSGiフレームワーク２０への問い合わせ結果に基づいて行われ、その結果、依存バンドルが存在しない場合には（ステップ５２３、Ｎｏ）、制御対象のバンドルを停止“STOP”し（ステップ５３０）、処理を終了する（ステップ５３１）。
【０１００】
一方、依存するバンドルが存在する場合には（ステップ５２３、Ｙｅｓ）、全ての依存バンドルについて、停止“STOP”を再帰的に実施する（ステップ５２４〜ステップ５２９）。全ての依存バンドルについて停止“STOP”を実施した後に（ステップ５２９、Ｙｅｓ）、制御対象のバンドルを停止“STOP”し（ステップ５３０）、処理を終了する（ステップ５３１）。
【０１０１】
以上、説明したように、本発明によれば、ライフサイクル制御に係る条件や権限などを変更したいユーザは、これまでのようにアプリケーションバンドルのプログラムを書き換える必要がなく、制御条件設定ファイルを介して所望の変更内容を入力するだけで事足りるため、負担が大幅に軽減される。また、変更に伴って再コンパイルの不要もないため、ユーザビリティが向上する。
【０１０２】
上述した実施形態の各機能は、Ｃ、Ｃ＋＋、Ｃ＃、Ｊａｖａ（登録商標）などのオブジェクト指向プログラミング言語などで記述された装置実行可能なプログラムにより実現でき、本実施形態のプログラムは、ハードディスク装置、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、フレキシブルディスク、ＥＥＰＲＯＭ、ＥＰＲＯＭなどの装置可読な記録媒体に格納して頒布することができ、また他装置が可能な形式でネットワークを介して伝送することができる。
【０１０３】
以上、本発明について実施形態をもって説明してきたが、本発明は上述した実施形態に限定されるものではなく、例えば、モジュール制御手段は、アプリケーションモジュールだけではなく、プラットフォームに制御を行うように構成してもよい。その他、当業者が推考しうる実施態様の範囲内において、本発明の作用・効果を奏する限り、本発明の範囲に含まれるものである。
【符号の説明】
【０１０４】
１０…アプリケーションバンドル
２０…OSGiフレームワーク
３０…バンドル制御手段
３１…制御動作制御部
３２…バンドル制御実行部
３３…権限制御実行部
３４…設定解釈部
３５…制御条件記憶部
３６…制御設定記憶部
３７…権限設定記憶部
３８…権限記憶部
３９…制御条件設定用ファイル
４０…設定値取得部
４２…設定値記憶部
１００…情報処理装置
５００…バンドル制御権テーブル
１０００…制御条件管理テーブル
１１００…設定値条件テーブル
１２００…制御動作管理テーブル
１３００…バンドル制御動作テーブル
１４００…バンドル制御権制御動作テーブル
１５００…優先度設定テーブル
【先行技術文献】
【特許文献】
【０１０５】
【特許文献１】特開２０１０‐６６９０３号公報
【図１】
2014059725.tif 000003
【図２】
2014059725.tif 000004
【図３】
2014059725.tif 000005
【図４】
2014059725.tif 000006
【図５】
2014059725.tif 000007
【図６】
2014059725.tif 000008
【図７】
2014059725.tif 000009
【図８】
2014059725.tif 000010
【図９】
2014059725.tif 000011
【図１０】
2014059725.tif 000012
【図１１】
2014059725.tif 000013
【図１２】
2014059725.tif 000014
【図１３】
2014059725.tif 000015
【図１４】
2014059725.tif 000016
【図１５】
2014059725.tif 000017
【図１６】
2014059725.tif 000018