(57)【要約】      （修正有）【課題】メッセージを分割取得する方法を提供する。【解決手段】ネットワーク１０９を介して他の装置１１０へメッセージを送信するメッセージ通信装置１００において、メッセージを分割して設定するためのインタフェース定義を解釈する。そして、そのインタフェース定義に記載されたオペレーションを用いて、分割して設定されたオブジェクトのデータを一つのメッセージに変換して送信する。他の装置１１０から大量のデータが送られてきた場合や他の装置に大量のデータを送信したい場合、大量のメモリを消費しない。【選択図】図２
2010244144.tif 000002
【特許請求の範囲】
【請求項１】
ネットワークを介して他の装置へメッセージを送信するメッセージ通信装置であって、
メッセージを分割して設定するためのインタフェース定義を解釈する解釈手段と、
前記インタフェース定義に記載されたオペレーションを用いて、分割して設定されたオブジェクトのデータを一つのメッセージに変換して送信するメッセージ変換手段と、
を有することを特徴とするメッセージ通信装置。
【請求項２】
ネットワークを介して他の装置からメッセージを受信するメッセージ通信装置であって、
メッセージを分割して取得するためのインタフェース定義を解釈する解釈手段と、
前記インタフェース定義に記載されたオペレーションを用いて前記受信したメッセージを分割したオブジェクトに変換するオブジェクト変換手段と、
を有することを特徴とするメッセージ通信装置。
【請求項３】
前記メッセージ変換手段は、前記インタフェース定義に記載されたオペレーションから導き出されるメソッドを介して前記分割して設定されたデータを一つのメッセージに変換し、送信すべき全てのオブジェクトのデータが変換されたメッセージを送信することを特徴とする請求項１に記載のメッセージ通信装置。
【請求項４】
前記インタフェース定義とは、ソフトウェアへの命令であるオペレーションと該オペレーションに対するデータ型の情報を定義した定義文書であり、前記定義文書に記述されたオペレーションが大量のデータを保持可能な型のデータを扱うか否かを判定し、前記オペレーションが大量のデータを保持可能な型を扱うと判断した場合に、前記大量のデータとなるオブジェクトを一つのメッセージに変換して送信するメソッドを定義することを特徴とする請求項３に記載のメッセージ通信装置。
【請求項５】
前記オブジェクト変換手段は、前記インタフェース定義に記載されたオペレーションから導き出されるメソッドで大量のデータを扱う型として宣言されたオブジェクトに変換する場合に、前記受信したメッセージを分割した大量のデータのオブジェクトに変換することを特徴とする請求項２に記載のメッセージ通信装置。
【請求項６】
前記インタフェース定義とは、ソフトウェアへの命令であるオペレーションと該オペレーションに対するデータ型の情報を定義した定義文書であり、前記定義文書に記述されたオペレーションが大量のデータを保持可能な型のデータを扱うか否かを判定し、前記オペレーションが大量のデータを保持可能な型を扱うと判断した場合に、前記受信したメッセージを分割した大量のデータのオブジェクトに変換するメソッドを定義することを特徴とする請求項５に記載のメッセージ通信装置。
【請求項７】
ネットワークを介して他の装置へメッセージを送信するメッセージ通信装置の処理方法であって、
解釈手段が、メッセージを分割して設定するためのインタフェース定義を解釈する解釈工程と、
メッセージ変換手段が、前記インタフェース定義に記載されたオペレーションを用いて、分割して設定されたオブジェクトのデータを一つのメッセージに変換して送信するメッセージ変換工程と、
を有することを特徴とするメッセージ通信装置の処理方法。
【請求項８】
ネットワークを介して他の装置からメッセージを受信するメッセージ通信装置の処理方法であって、
解釈手段が、メッセージを分割して取得するためのインタフェース定義を解釈する解釈工程と、
オブジェクト変換手段が、前記インタフェース定義に記載されたオペレーションを用いて前記受信したメッセージを分割したオブジェクトに変換するオブジェクト変換工程と、
を有することを特徴とするメッセージ通信装置の処理方法。
【請求項９】
請求項７又は８に記載のメッセージ通信装置の処理方法をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ネットワークを介して他の装置とメッセージを通信するメッセージ通信装置及びその処理方法に関する。
【背景技術】
【０００２】
近年、ネットワークを介して複数の装置同士がデータを授受するＷｅｂサービス技術を用いたパーソナルコンピュータ（ＰＣ）や機器の連携が一般的に行なわれている。Ｗｅｂサービスにおけるデータのやり取りでは、一般的に通信装置が、アプリケーションが設定したオブジェクトをＸＭＬデータにして送信し、受信したＸＭＬデータをオブジェクトにしてアプリケーションに返す。サービスを利用する側の通信装置上のアプリケーションは、サービスを提供する側のアプリケーション呼び出しの引数に、送信するオブジェクトを設定し、受信したオブジェクトを戻り値として受け取る。一方、サービスを提供する側の通信装置上のアプリケーションは、アプリケーション呼び出しの引数に、サービス利用側からのオブジェクトを受信し、戻り値をオブジェクトとして返す。ここで、オブジェクトとは、アプリケーションの環境においてデータもしくはデータとデータの操作を表現する実体である。
【０００３】
このようなアプリケーション呼び出しにおいて、サービス提供側のアプリケーションがどのようなオブジェクトを受け取り、どのようなオブジェクトを返すかをインタフェース定義文書として事前に定義する。このインタフェース定義文書の一般的な例としてＸＭＬをベースとした言語仕様であるＷｅｂサービス記述言語（ＷＳＤＬ）が存在する。ここで、サービス提供側もサービス利用側も、このＷＳＤＬに従ってサービスを実行するためのオブジェクトを生成する。このＷＳＤＬには、インタフェースの命令単位を示すオペレーションの記述があり、オペレーション毎にサービス利用側とサービス提供側との間で授受するメッセージ構造が規定されている。また、送信データ、受信データのデータ型情報も規定されている。
【０００４】
例えば、特許文献１には、ＷＳＤＬに従ってサービス利用側がサービスを実行するためのオブジェクトやサービス提供側がサービスのインタフェースを表現するオブジェクトをサービス実行オブジェクトとして自動生成することが開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００６−１６４２６４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、アプリケーション呼び出しを行なう際に、アプリケーションが受け取るオブジェクトや設定するオブジェクトが大量のデータを保持可能な型である場合がある。例えば、配列のデータやリスト型は格納するデータ数に制限がないため、大量のデータを設定可能である。また、単なる文字列型でもデータが膨大な場合があり、そのようなオブジェクトの作成は、特に、組込み機器のようなメモリ容量が少ない環境下で処理を実行する場合、メモリ容量の制限により、実行できない場合がある。
【課題を解決するための手段】
【０００７】
ネットワークを介して他の装置へメッセージを送信するメッセージ通信装置であって、
メッセージを分割して設定するためのインタフェース定義を解釈する解釈手段と、
前記インタフェース定義に記載されたオペレーションを用いて、分割して設定されたオブジェクトのデータを一つのメッセージに変換して送信するメッセージ変換手段と、
を有することを特徴とする。
【発明の効果】
【０００８】
本発明によれば、他の装置から大量のデータが送られてきた場合や他の装置に大量のデータを送信したい場合、大量のメモリを消費せずに動作することができる。
【図面の簡単な説明】
【０００９】
【図１】本実施形態におけるメッセージ通信装置のハードウェア構成例を示す図。
【図２】本実施形態におけるメッセージ通信装置のソフトウェア構成例を示す図。
【図３】サービス実行オブジェクト生成部の処理を示すフローチャート。
【図４】サービスを定義する情報を記述したＷＳＤＬ文書の一例を示す図。
【図５】生成されたサービス実行オブジェクトの一例を示す図。
【図６】サービス利用側のサービス実行オブジェクトの呼び出し例を示す図。
【図７】サービス利用側のメソッド処理部の処理を示すフローチャート。
【図８】サービス提供側のメソッド処理部の処理を示すフローチャート。
【図９】メッセージ変換部の処理を示すフローチャート。
【図１０】オブジェクト変換部の処理を示すフローチャート。
【発明を実施するための形態】
【００１０】
以下、図面を参照しながら発明を実施するための形態について詳細に説明する。まず、メッセージ通信装置のハードウェア構成及びソフトウェア構成を、図１及び図２を用いて説明する。図１において、他の装置１１０とメッセージ通信装置１００とはネットワーク１０９を介してＷｅｂサービスのメッセージを授受するパーソナルコンピュータ（ＰＣ）などのコンピュータである。ここで、他の装置１１０はサービスを提供する側（サービス提供側）でもサービスを利用する側（サービス利用側）でも良い。また、他の装置１１０が本発明を実施するメッセージ通信装置でも良い。
【００１１】
メッセージ通信装置１００には、主な構成要素として、全体の制御を司るコントローラ部１０１、操作部１０２、表示部１０３、ハードディスク１０４、ネットワークアダプタ１０８が含まれる。また、コントローラ部１０１はＣＰＵ１０５、ＲＯＭ１０６、ＲＡＭ１０７等を備える。ＣＰＵ１０５は、メッセージ通信装置１００における各処理部の処理を実行する。ＲＯＭ１０６には、ＣＰＵ１０５が実行する各種プログラムやプログラムが必要とするデータ等が記憶される。また、一部のプログラムやデータは、ハードディスク１０４に予め格納しておき、ＲＡＭ１０７に読み出される。この例では、ハードディスク１０４にアプリケーションを実行するプログラムやメッセージを記憶する。ＲＡＭ１０７は、メッセージ通信装置１００における各処理部の作業領域であり、プログラム実行中に使用するデータを一時的に記憶する。
【００１２】
操作部１０２は、ユーザが行なう操作を入力する入力部であり。キーボート、マウスがこれに該当する。表示部１０３は、後述する処理を実行するアプリケーションのＧＵＩ（グラフィカルユーザインタフェース）を表示する。表示部１０３には、アプリケーションのパネル、ボタン、テキストフィールドなどのＧＵＩが表示され、キーボード、マウス等の操作部１０２から入力を受けると、それぞれＧＵＩ部品に対応付けられたプログラムが実行される。例えば、アプリケーションのＧＵＩ操作に基づいて他の装置１１０に対するメッセージ送信を行ないたい場合、操作部１０２、表示部１０３を使用する。
【００１３】
ネットワークアダプタ１０８は、ネットワーク１０９を介して他の装置１１０に接続するためのものであり、例えばＬＡＮカードに相当する。ここで、ネットワーク１０９は、メッセージを通信できれば形態は問わず、例えばインターネット、ＷＡＮ、ＬＡＮなどである。
【００１４】
図２に示すＷｅｂサービス記述言語（ＷＳＤＬ）文書２０１は、Ｗｅｂサービスのインタフェース定義を記述したＷＳＤＬの仕様に従った定義文書である。ＷＳＤＬ文書２０１には、サービスの命令単位であるオペレーションやオペレーションに対してサービス提供側とサービス利用側間でやり取りされるメッセージの定義などが記述されている。
【００１５】
メッセージ通信装置１００には、サービス実行オブジェクト生成部２０２、アプリケーション２０３、サービス実行処理部２０４が含まれる。サービス実行オブジェクト生成部２０２は、ＷＳＤＬ文書２０１を入力し、ＷＳＤＬ文書２０１に記述されたオペレーションや送受信するメッセージ構造を解釈してサービスを実行するためのサービス実行オブジェクト２０５を生成する。サービス実行処理部２０４は、アプリケーション２０３からの要求に応じて、サービス実行オブジェクト２０５を用いて他の装置１１０にメッセージを送信、或いは他の装置１１０からメッセージを受信する。ここで、サービス実行処理部２０４は他の装置１１０がサービス利用側であればサービス提供側として機能し、他の装置１１０がサービス提供側であればサービス利用側として機能する。
【００１６】
メッセージ通信装置１００におけるアプリケーション２０３は、他の装置１１０とメッセージの送受信を行なうために、送受信するデータをサービス実行オブジェクト２０５のインタフェースに応じた型のオブジェクトとして設定及び取得を行なう。
【００１７】
サービス実行処理部２０４には、サービス実行オブジェクト２０５、メソッド処理部２０９、メッセージ変換部２０６、オブジェクト変換部２０７、記憶領域２０８が含まれる。サービス実行オブジェクト２０５は、サービス実行オブジェクト生成部２０２が生成したアプリケーション２０３と実際の送受信処理を行なう処理部とのインタフェースとなるオブジェクトである。サービス実行オブジェクト２０５は、送受信するメッセージを引数や戻り値として表現するメソッドを持つ。ここでメソッドとは、ＷＳＤＬ文書２０１から生成されたサービス実行オブジェクトでオペレーションを実行するために呼び出すインタフェースである。
【００１８】
本実施形態では、Ｊａｖａ（登録商標）を使用して説明するため、このメソッドは、Ｊａｖａ（登録商標）でのメソッドとして表現される。しかし、本発明はＪａｖａ（登録商標）に限るものではなく、別のプログラム環境でも良く、メソッドは例えば、Ｃ言語、ベーシック言語等の関数として表現されても良い。
【００１９】
ＷＳＤＬ文書２０１のオペレーションを呼び出すための、このメソッド呼び出しをすることで、受信メッセージの内容をオブジェクトとして取得したり、送信メッセージに表現したいデータをオブジェクトとして設定することができる。例えば、メッセージ通信装置１００がサービス提供側の場合、アプリケーション２０３は、サービス実行オブジェクト２０５のメソッドの引数に、他の装置１１０から受信したメッセージのデータを表現するオブジェクトを受け取る。そして、戻り値に他の装置１１０に送信するデータを表現するオブジェクトを設定する。
【００２０】
一方、メッセージ通信装置１００がサービス利用側の場合、アプリケーション２０３は、サービス実行オブジェクト２０５のメソッドの引数に、他の装置１１０に送信するデータを表現するオブジェクトを設定する。そして、戻り値として他の装置１１０から受信したメッセージのデータを表現するオブジェクトを受け取る。
【００２１】
メソッド処理部２０９は、サービス利用側の場合、サービス実行オブジェクト２０５からの呼び出しに従ってメッセージ変換部２０６及びオブジェクト変換部２０７を使用してメッセージ送受信を制御する。また、メソッド処理部２０９は、サービス提供側の場合、サービス実行オブジェクト２０５のメソッド呼び出しを制御し、メッセージ変換部２０６及びオブジェクト変換部２０７を使用してメッセージ送受信処理を行なう。
【００２２】
メッセージ変換部２０６は、サービス実行オブジェクト２０５のメソッドの引数又は戻り値として渡されたオブジェクトをメッセージに変換する。１つのメッセージを生成するためにメソッド処理部２０９から複数回に渡ってオブジェクトを設定された場合には順次メッセージを生成し、最後のオブジェクトが渡された段階でメッセージを完成させる。
【００２３】
オブジェクト変換部２０７は、他の装置１１０から受信したメッセージをサービス実行オブジェクト２０５の引数又は戻り値として渡すオブジェクトに変換する。尚、受信したメッセージが大量データを保持可能なメッセージ構造である場合、メッセージを部分的にオブジェクトに変換する。大量データを扱わないメッセージ構造である場合にはデータを分割せずにオブジェクトを生成する。
【００２４】
記憶領域２０８は、メッセージ変換部２０６が生成したメッセージやオブジェクト変換部２０７が他の装置１１０から渡されたメッセージを一時保存するためのメモリである。本実施形態では、図１に示すハードディスク１０４を使用する。
【００２５】
ここで、本実施形態におけるメッセージ通信装置の特徴的な処理を、図３乃至図１０を用いて説明する。まず、サービス実行オブジェクト生成部２０２の処理を、図３を用いて説明する。この処理では、図４に示すようなサービスを定義する情報を記述したＷＳＤＬ文書２０１を読み込み、その記述に従ってサービスを実行することが可能なサービス実行オブジェクト２０５を生成する。図４の例は、「DataService」というサービス名４０１で、「setData」４０２、「getData」４０３という２つのオペレーションを持つＷＳＤＬ文書２０１である。また、サービス実行オブジェクト生成部２０２で生成されるサービス実行オブジェクトの一例を図５に示す。尚、本実施形態では、サービス実行オブジェクト２０５やアプリケーション２０３を、Ｊａｖａ（登録商標）のコードを例に挙げて説明するが、これに限るものではない。
【００２６】
まず、Ｓ３０１において、図４に示すＷＳＤＬ文書２０１の読み込みを行なう。そして、Ｓ３０２において、ＷＳＤＬ文書２０１からオペレーションを検索する。検索の結果、オペレーション「setData」４０２を検出すると（Ｓ３０２でＹｅｓ）、Ｓ３０３へ処理を進め、検索したオペレーションをメソッドとして表現する際の引数、戻り値となる型を決定する。図４に示すＷＳＤＬ文書２０１の例では、オペレーション「setData」４０２のリクエストメッセージ、即ち、引数のデータ型は「CustomerData」４０４である。この「CustomerData」４０４は、出現最大個数を表現するmaxOccursが無制限であるunbounded４０５として宣言されている。また、レスポンスメッセージ、即ち、戻り値の型はboolean型４０６であり、maxOccurs“１”４０７に指定されている。ここで、サービス実行オブジェクト２０５の引数、戻り値の型を決定する。引数については、大量データを無制限に保持可能であることを表現するため「CustomerData」型の配列に決定し、戻り値についてはboolean型に決定する。
【００２７】
次に、Ｓ３０４において、Ｓ３０３で決定した引数、戻り値となる型を生成する。この引数の型はＷＳＤＬ文書２０１で新たに定義されたデータ型であるため「CustomerData」型のオブジェクトを生成する。生成した「CustomerData」型のオブジェクトの一例を図５の５０３として示す。５０３の詳細な説明については後述する。また、戻り値booleanは、Ｊａｖａ（登録商標）のboolean型をそのまま利用するため、新たな型オブジェクトは生成しない。
【００２８】
次に、Ｓ３０５において、引数に配列表現を持つか否かを判定する。配列表現を持つと判定された場合はＳ３０７へ処理を進める。このＳ３０７では、オペレーションに対するメソッドに、引数に設定する値が最後のデータであることを示すboolean型の引数（終端通知情報）を追加する。次に、Ｓ３０８において、メソッド呼び出しがどのセッションのメッセージ処理か特定するためのＩＤ（セッション管理ＩＤ）を引数として追加する。このオペレーション「setData」は、引数に「CustomerData」型の配列を持つため、引数に最後のデータであることを示すboolean型の引数とＩＤ型の引数とを追加する。
【００２９】
一方、Ｓ３０５において、引数に配列を持たないと判定された場合はＳ３０６へ処理を進め、戻り値が配列型か否かを判定する。配列型であると判定された場合はＳ３０８へ処理を進め、メソッド呼び出しがどのセッションのメッセージ処理か特定するためのＩＤを引数として追加する。また、引数、戻り値が共に配列型を持たない場合はＳ３０９へ処理を進め、引数の追加は行なわない。Ｓ３０９では、上述の処理で確定したオペレーション「setData」のメソッド名、引数、戻り値を記憶しておき、上述のＳ３０２に戻り、次のオペレーションの検索を行なう。ここで、メソッド名は、オペレーションの名前そのものを用いる。
【００３０】
また同様に、Ｓ３０２において、図４の例の場合、オペレーション「getData」４０３が検索され、オペレーション「setData」の場合と同様に、メソッド名、引数、戻り値を決定する。オペレーション「getData」４０３は、ＷＳＤＬ文書２０１の上で引数はなく、レスポンスメッセージが「CustomerData」型４０８でmaxOccurがunboundedの戻り値を持っている。即ち、戻り値は「CustomerData」型５０３の配列で示され、戻り値に配列を持つため、メソッドの引数として、セッション管理ＩＤが追加される。オペレーション「getData」についても、メソッド名、引数、戻り値を確定し、記憶する。
【００３１】
その後、Ｓ３０２において、オペレーションを検出しなければ、ＷＳＤＬ文書２０１のオペレーションを全て処理したと判定し、Ｓ３１０へ処理を進める。Ｓ３１０では、記憶しておいたメソッドの情報に基づき、オペレーションに対応したメソッドを持つサービス実行オブジェクト２０５を生成する。
【００３２】
ここで、サービス実行オブジェクト生成部２０２によって生成されるサービス実行オブジェクト２０５を説明する。図５に、サービス実行オブジェクト２０５として、サービス利用側のオブジェクト５０１、サービス提供側のオブジェクト５０２、メソッドの引数、戻り値として用いられる「CustomerData」型のオブジェクト５０３を示す。尚、サービス実行オブジェクト２０５には、サービス提供側が用いるオブジェクト、サービス利用側が用いるオブジェクトがあるが、本実施形態ではサービス実行オブジェクト生成部２０２がどちらも生成する。また、本発明は、これに限ることはなく、サービス実行オブジェクト生成部２０２にどちらを生成するかを設定可能にしても良い。
【００３３】
サービス利用側のオブジェクト５０１は、オペレーション「setData」、「getData」に対応した「setData」メソッド、「getData」メソッドを有する。「setData」メソッドは、引数に「CustomerData」型の配列、終端通知情報、セッション管理ＩＤ、戻り値にbooleanを持つ。「getData」メソッドは、引数にセッション管理ＩＤ、戻り値に「CustomerData」型の配列を持つ。各メソッドには、アプリケーション２０３がメソッド呼び出しの際に、サービス実行処理部２０４を呼び出す処理が実装される。例えば、オペレーションとその引数に応じたメッセージ生成やメッセージからオペレーションの戻り値に応じたオブジェクトを生成するためにサービス実行処理部２０４が必要なＷＳＤＬの情報を渡す実装になる。ここで、ＷＳＤＬの情報は、例えばXML Schema、SOAP action等の情報である。アプリケーション２０３が、サービス利用側のオブジェクト５０１のメソッドを呼び出すことにより、リクエストメッセージが生成され送信される。そして、サービスからのレスポンスメッセージがオブジェクトに変換されてメソッドの戻り値としてアプリケーション２０３に戻る。
【００３４】
サービス提供側のオブジェクト５０２は、オペレーション「setData」、「getData」に対応した「setData」メソッド、「getData」メソッドを有する。但し、実装のされていないメソッドとして生成される。アプリケーション２０３はサービス提供側のオブジェクト５０２をサービス実行オブジェクトとしてサービス実行処理部２０４に予め登録しておく。登録の際に、アプリケーション２０３は提供するオペレーションの機能に従った実装を行なう。サービス実行処理部２０４は、受信したメッセージに応じて、メッセージをオブジェクトに変換して、そのオブジェクトを引数としてオペレーションに該当するサービス提供側のオブジェクト５０２のメソッドを呼び出す。
【００３５】
サービス提供側のオブジェクト５０２には、もう一つ「getＷＳＤＬInfo」メソッドが定義されている。これは、ＷＳＤＬ上の情報（XML Schema、SOAP action等）を取得するために定義されている。サービス実行処理部２０４は、受信メッセージに該当するオペレーションの特定、引数へのオブジェクト変換、オブジェクトから送信メッセージへの変換処理にＷＳＤＬ上の情報を用いる。サービス実行オブジェクト生成部２０２は、読み込んだＷＳＤＬ文書２０１から必要な情報を提供するように「getＷＳＤＬInfo」メソッドを生成する。
【００３６】
「CustomerData」型のオブジェクト５０３は、メソッドの引数や戻り値として使用される。図４のＷＳＤＬ文書の「CustomerData」のcomplexType定義４１０をオブジェクトとして表現したものである。「CustomerData」のcomplexType定義は、string型のfirstNameという名前の要素とstring型のlastNameという名前の要素を持つように定義されている。その要素を表現するため、「CustomerData」型のオブジェクトはfirstNameというString型の変数、lastNameというString型の変数を持つ。そして、これら変数の値を設定、取得するメソッド、「setFirstName」、「getFirstName」「setLastName」、「getLastName」を有する。
【００３７】
次に、サービス利用側のアプリケーション２０３がサービス実行オブジェクト２０５を呼び出す際の呼び出し例を、図６を用いて説明する。図６に、サービス利用側のアプリケーションプログラムコードの一部を示す。まず、「setData」オペレーションを呼び出すためのサービス実行オブジェクト２０５の使い方について説明する。このコード例では、ファイルにCSV形式で保存されているfirstName、lastNameの情報を読み出し、「setData」オペレーションを使用してDataServiceのＷｅｂサービスに送る。図５のサービス利用側のオブジェクト「DataServiceRequester」クラスを使用して、setDataオペレーションを呼び出す。
【００３８】
符号６０１で示す部分は、サービス実行オブジェクト２０５のメソッドの引数や戻り値の変数を定義している。ここで、「result」は戻り値用の変数、「customerData」は送信する「CustomerData」型の配列サイズが５の変数である。「id」は引数となるセッション管理ＩＤ、「ID」クラスは、本実施形態では「newInstance」メソッドを呼び出すことにより毎回一意な「ID」を作成するものとする。そして、「end」は終端通知情報用の変数であり、trueの場合に最後のデータであることを示す。
【００３９】
符号６０２で示す、「csvFile」は、firstName、lastNameの情報を記載したCSV形式のファイルを表す「CSVFile」型の変数である。「CSVFile」クラスは「getCustomerData」メソッドにより指定したCSV形式のファイルから指定した範囲のデータを「CustomerData」型で返すものとする。符号６０３で示す、「dataService」は「DataServiceRequester」型の変数で、このクラスの「setData」メソッドを使用して「setData」オペレーションを呼び出す。
【００４０】
符号６０４で示す部分は、for文のブロックで、CSVファイルから５つずつデータを「CustomerData」型で読み出して、「setData」オペレーションを呼び出す処理を示している。符号６０５は、「csvFile」の「getCustomerData」メソッドを呼び出し、CSVファイル中のi番目から（i-1）番目までの情報を「CustomerData」型の配列で取得することを示している。符号６０６で、CSVファイルから最後の情報を取り出したか否かを判断するif文のブロックで、最後のデータであれば、「end」変数にtrueを設定する。
【００４１】
符号６０７は、「dataService」の「setData」メソッドを呼び出し、「setData」オペレーションを呼び出している。引数には、CSVファイルから読み出した送信データである「customerData」、セッション管理ＩＤ「id」、終端を通知する「end」を設定している。「end」をtrueにして呼び出すと、送信する全てのデータが揃うのでメッセージが完成する。完成したメッセージはDataService Ｗｅｂサービスに送信され、受信メッセージがサービス実行処理部２０４によってboolean型の受信データに変換されて「setData」メソッドの戻り値として返る。
【００４２】
次に、「getData」オペレーションを呼び出すためのサービス実行オブジェクト２０５の使い方を説明する。このコード例では、「geteData」オペレーションを呼び出し、DataService Ｗｅｂサービスから返される「CustomerData」を標準出力する例を示している。符号６０８で示す部分は、サービス実行オブジェクト２０５のメソッドの引数や戻り値の変数を定義している。「resultCustomerData」は戻り値用の変数で、「id」はセッション管理ＩＤである。符号６０９で示す部分は、「getData」オペレーションの呼び出しで受信したメッセージの全ての「CustomerData」を戻り値として返されるまで処理を続けることを示すwhileブロックである。「getData」メソッドは受信メッセージに表現された「CustomerData」を全てオブジェクトとして変換した場合にnullを返す。そのため、whileを継続する条件式は「getData」メソッドの戻り値がnullでない場合となる。
【００４３】
サービス実行処理部２０４は「getData」メソッドが呼ばれると、引数には配列はないため、最初のメソッド呼び出しで送信メッセージが確定し、Ｗｅｂサービスにメッセージを送信する。そして、メッセージを受信すると、受信メッセージをidに関連して保存し、部分的に「CustomerData」型のオブジェクトに変換した値を戻り値として返す。その後、順次「getData」メソッドが呼び出されると、指定されたidに関して保存したメッセージを「CustomerData」型に変換して戻り値として返す。受信メッセージを全て処理した場合にはnullを返す。符号６１０の部分では、取得した「resultCustomerData」を標準出力している。「CustomerData」クラスの「getFirstName」、「getLastName」メソッドを使用して、取得した「firstName」、「lastName」の情報を標準出力している。
【００４４】
以上、アプリケーション２０３がサービス実行オブジェクト２０５をサービス利用側のオブジェクトとして呼び出す処理を説明した。次に、アプリケーション２０３がサービス実行処理部２０４にサービス提供側のオブジェクトを登録し、サービス実行オブジェクト２０５を実装する例を説明する。ここでは、サービス提供側のオブジェクト５０２のDataServiceProviderクラスの「setData」、「getData」に実行する処理を実装する。具体的には、DataServiceProviderクラスを継承したクラスを作成する。このクラスのメソッドは、メソッドに対応するオペレーションのメッセージを受信した場合に、メソッド処理部２０９によって呼び出される。このメソッドの戻り値はメッセージ変換部２０６によって送信メッセージに変換されてサービス利用者側に送信される。
【００４５】
まず、「setData」メソッドの場合、引数は「CustomerData」の配列、セッション管理ＩＤ、終端通知情報の三つである。サービス実行処理部２０４は、受信メッセージが「setData」オペレーションであると判断した場合、アプリケーション２０３から登録されたサービス実行オブジェクト２０５の「setData」メソッドを呼び出す。その際、受信メッセージの「CustomerData」を順次少量ずつ「CustomerData」型の配列としてオブジェクトに変換する。メッセージの最後の「CusotmerData」をオブジェクトに変換した場合には、終端通知情報「end」をtrueに設定し、またメッセージの処理が途中であればfalseを設定して呼び出す。セッション管理ＩＤは、ある１つのメッセージを処理している場合は同じものを渡す。「setData」メソッドの実装は、セッション管理ＩＤに基づいて処理されているメッセージを識別し、「CustomerData」型の配列を処理する。そして、「end」がtrueに設定された場合には、送信メッセージに設定すべき正しいbooleanの値を戻り値として返すようにする。
【００４６】
次に、「getData」メソッドの場合、引数はセッション管理ＩＤのみで、戻り値は「CustomerData」型の配列である。メソッド処理部２０９は、受信メッセージが「getData」オペレーションであると判断した場合、アプリケーション２０３から登録されたサービス実行オブジェクト２０５の「getData」メソッドを呼び出す。「getData」メソッドの場合、戻り値が配列であるため、送信メッセージに設定する「CustomerData」型の値が分割されて渡される可能性がある。そのため、最後のデータであることを示すnullが返るまで、「getData」メソッドを呼び出す。そして、呼び出しの度に戻り値のオブジェクトをメッセージ変換部２０６でメッセージに変換する処理を実行し、nullが返った時点でメッセージを完成させてサービス呼び出し元にメッセージを送信する。この「getData」メソッドを呼び出す際に、同じメッセージに関する処理をしている場合は同じＩＤ、新規に処理するメッセージの場合は新しいＩＤを生成して引数に渡す。
【００４７】
「getData」メソッドの実装は、セッション管理ＩＤに基づいて処理されているセッションを識別しながら、同じセッション管理ＩＤである場合は、「CustomerData」型の配列オブジェクトを順次戻り値として返す。そして、そのセッションにおいて返すべき配列の値がない場合にnullを返すようにする。
【００４８】
次に、サービス実行処理部２０４のメソッド処理部２０９がサービス利用側として動作する場合の処理を、図７を用いて説明する。サービス利用側では、まずアプリケーション２０３がサービス実行オブジェクト２０５のメソッド呼び出しを行なう。メソッドが呼ばれると、アプリケーション２０３から引数の情報と、メッセージ生成やオブジェクト変換に必要なＷＳＤＬの情報がメソッド処理部２０９に渡される。メソッド処理部２０９は、渡された情報に基づいて送信メッセージの生成と受信メッセージからのオブジェクト生成を行なう。そして、オブジェクトに変換した値をサービス実行オブジェクト２０５に返し、そのオブジェクトがサービス実行オブジェクト２０５のメソッド呼び出しの戻り値としてアプリケーション２０３に渡る。
【００４９】
まず、メソッド処理部２０９はサービス実行オブジェクト２０５のメソッドが呼ばれるとメッセージ送信が完了しているか否かを判定する（Ｓ７０１）。この判定では、ＩＤに関してメッセージ送信が完了したか否かを記憶しているため、メソッド呼び出しでＩＤが指定されている場合、そのＩＤから送信完了を判定する。一方、メソッド呼び出しの引数にＩＤがなければ、ＩＤ＝nullに対して記憶している送信状況に基づき判定する。次に、メソッド処理部２０９はサービス実行オブジェクト２０５から渡された引数の値、ＩＤ、終端通知情報、ＷＳＤＬ情報に基づいてメッセージ生成を行なうために、メッセージ変換部２０６を呼び出す（Ｓ７０２）。この際、引数、戻り値の型に配列がない場合、ＩＤ、終端通知情報はメソッドに渡されないため、ＩＤ＝null、end＝trueをメッセージ変換部２０６に渡す。
【００５０】
ここで、メッセージ変換部２０６が渡された情報に基づいてメッセージ生成を行ない、メッセージ送信を完了したか否かをメソッド処理部２０９に返す（Ｓ７０３）。メッセージ変換部２０６の処理は図９を用いて更に後述する。次に、メソッド処理部２０９は送信完了であれば（Ｓ７０４でＹｅｓ）、このＩＤのメッセージ送信が完了し、メッセージの転送処理モードを受信として記憶する（Ｓ７０５）。次に、メソッド処理部２０９は送信したメッセージに対する応答メッセージを受信する（Ｓ７０６）。一方、メソッド処理部２０９は送信完了でなければ（Ｓ７０４でＮｏ）、サービス実行オブジェクト２０５のメソッド呼び出しを完了させるため、適当な戻り値を返す（Ｓ７０７）。ここで、送信が未完了と判断されるのは、引数の値に配列が含まれ、終端通知情報がfalseの場合のみである。この終端通知情報がfalseであることから、最後の値がまだ設定されていないので、アプリケーション２０３はこのメソッドの戻り値が正しい値と判断しない。そのため、返す値は受信メッセージに基づいて生成された戻り値でなくてもかまわない。例えば、nullで表現できる戻り値についてはnullを返し、プリミティブな値であれば、数値に関しては０やbooleanの場合はfalse等、初期値として使用される値を返す。
【００５１】
メッセージ変換部２０６でメッセージ送信が未完了となると、同じＩＤのメソッド呼び出しで終端通知情報がtrueに設定された場合に完成され、Ｗｅｂサービスに送信される。そのため、それまでは、メッセージ変換部２０６にて記憶領域２０８に保管された状態になる。アプリケーション２０３が終端通知情報をtrueに設定してメソッドを呼び出すと、メソッド処理部２０９はＩＤに対して送信処理が未完了と判定する（Ｓ７０１でＮｏ）。そして、上述したように、メソッド処理部２０９はメッセージ変換部２０６を呼び出し（Ｓ７０２）、メッセージ変換部２０６がメッセージを完成させてメッセージ送信を行なう（Ｓ７０３）。そして、送信側処理が完了したと判定し（Ｓ７０４でＹｅｓ）、転送処理モードを受信として記憶する（Ｓ７０５）。その後、メッセージを受信すると（Ｓ７０６）、メッセージ送信完了と判定する（Ｓ７０１でＹｅｓ）。そして、受信したメッセージのストリームと変換する戻り値の型、ＩＤを渡してオブジェクト変換部２０７を呼び出す（Ｓ７０８）。
【００５２】
ここで、オブジェクト変換部２０７が渡された情報に基づいてオブジェクト生成処理を行ない、オブジェクトと共に受信したメッセージの処理が全て完了したか否かをメソッド処理部２０９に返す（Ｓ７０９）。ここで、受信側の処理が完了していれば（Ｓ７１０でＹｅｓ）、メソッド処理部２０９は記憶しているＩＤの転送処理モードの情報を削除する（Ｓ７１２）。そして、メソッド処理部２０９はオブジェクト変換部２０７から渡されたオブジェクトをサービス実行オブジェクト２０５のメソッドに返し、メソッド呼び出しに対する処理を終了する（Ｓ７１１）。一方、受信側の処理が完了していなければ（Ｓ７１０でＮｏ）、ＩＤに対する現在の転送処理モードの情報は削除せずに、メソッド呼び出しに対する処理を終了する。ここで、受信側の処理が未完了となる場合は、メソッドの戻り値が配列で、まだ配列の終端までメッセージをオブジェクトにしてない場合である。この場合、アプリケーション２０３はメソッド呼び出しの戻り値が配列型であり、nullが返るまでメソッドを呼び出し、全ての配列のデータを取得する。戻り値がnullにならない間は、メソッド処理部２０９ではＳ７０１でＹｅｓ、Ｓ７１０でＮｏになる処理を繰り返す。その後、nullになるとＳ７１０でＹｅｓになり、このセッション管理ＩＤに関する送受信処理が完了となる。
【００５３】
次に、サービス実行処理部２０４のメソッド処理部２０９がサービス提供側として動作する場合の処理を、図８を用いて説明する。メソッド処理部２０９がサービス提供側として動作する場合、メッセージを受信したことをきっかけにして処理を開始する。メソッド処理部２０９は受信したメッセージに応じて、予め登録されたサービス実行オブジェクト２０５のメソッド呼び出しを行なう。そして、メソッド処理部２０９はオブジェクト変換部２０７が返したオブジェクトを引数にメソッドを呼び出し、メッセージ変換部２０６で戻り値をメッセージに変換して呼び出し元に応答メッセージを返す。
【００５４】
まず、メソッド処理部２０９がメッセージを受信し（Ｓ８０１）、受信したメッセージに対応するサービス実行オブジェクト２０５のメソッドを特定する（Ｓ８０２）。具体的には、メソッド処理部２０９はアプリケーション２０３から登録されたサービス実行オブジェクト２０５に保持されているＷＳＤＬ情報を取得し、そのＷＳＤＬ情報から受信したメッセージのオペレーションを特定する。そして、メソッド処理部２０９はそのオペレーションからメソッド名、引数の型を導き出し、メソッドを特定する。次に、メソッド処理部２０９はメソッドの引数にセッション管理ＩＤがあるか否かを判定し（Ｓ８０３）、あれば（Ｓ８０３でＹｅｓ）、セッション管理ＩＤを新規に生成する（Ｓ８０４）。次に、メソッド処理部２０９はメソッドの引数に設定するオブジェクトを生成するために、受信したメッセージのストリーム、セッション管理ＩＤ、引数の型、ＷＳＤＬ情報を指定してオブジェクト変換部２０７を呼び出す（Ｓ８０５）。
【００５５】
ここで、オブジェクト変換部２０７が渡された情報に基づきオブジェクト生成の処理を行ない、オブジェクトと共に受信したメッセージの処理が全て完了したか否かをメソッド処理部２０９に返す（Ｓ８０６）。次に、メソッド処理部２０９では、オペレーションに該当するメソッドの引数に従ってオブジェクト変換部２０７から返されたオブジェクト、セッション管理ＩＤ、終端通知情報を指定してメソッドを呼び出す（Ｓ８０７）。また、メソッド処理部２０９は終端通知情報にオブジェクト変換部２０７が受信メッセージ処理を全て完了したか否かを指定する。尚、完了していれば、true、未完了であればfalseを指定する。
【００５６】
次に、メソッド処理部２０９はメソッド呼び出しの戻り値をメッセージに変換するために、メッセージ変換部２０６に渡す終端通知情報を特定する。メッセージ変換部２０６が渡された終端通知情報に基づいて生成したメッセージを完成させて送信するか否かを決定する。そのため、受信メッセージの処理が全て完了し、且つメソッド呼び出しの戻り値がメッセージに設定する最終の値であるかを判断基準にしてメッセージ変換部２０６に渡す終端通知情報を決定する。ここで、メソッド処理部２０９はメソッド呼び出しの戻り値がnullでない配列の場合は、最終の値ではないと判断する。一方、メソッド処理部２０９はnullの配列或いは戻り値の型が配列でない場合は、最終の値と判断する。従って、戻り値が最終の値で、Ｓ８０６でオブジェクト変換部２０７が受信メッセージ処理を全て完了したと返してきた場合に（Ｓ８０８でＹｅｓ）、終端通知情報のendをtrueに設定する（Ｓ８１０）。一方、Ｓ８０８でＮｏの場合には、終端通知情報のendをfalseに設定する（Ｓ８０９）。
【００５７】
次に、メソッド処理部２０９はこの段階までに確定したセッション管理ＩＤ、メソッド呼び出しの戻り値、終端通知情報end、ＷＳＤＬ情報を指定してメッセージ変換部２０６を呼び出す（Ｓ８１１）。そして、メッセージ変換部２０６が与えられた情報に基づいてメッセージを生成し、メッセージ送信を完了したか否かをメソッド処理部２０９に返す（Ｓ８１２）。メソッド処理部２０９は返された情報に基づき、メッセージ送信が完了したか否かを判定する。完了していれば（Ｓ８１３でＹｅｓ）、そのセッションのメッセージ送受信の処理が全て完了したことになる。一方、メッセージ送信が完了してなければ（Ｓ８１３でＮｏ）、完了していない受信側の処理、或いは送信側の処理を続ける。受信側の処理が完了していれば（Ｓ８１４でＹｅｓ）、メソッド呼び出しの配列型の引数にnull、終端通知情報endをtrueに設定し（Ｓ８１５）、メソッド呼び出しを行なう（Ｓ８０７）。そして、メソッド呼び出しの戻り値をメッセージに変換する処理を続ける。一方、受信側の処理が完了していない場合は（Ｓ８１４でＮｏ）、受信側の処理を完了させるため、Ｓ８０５に戻り、受信メッセージをオブジェクト変換する処理を繰り返す。
【００５８】
上述した処理により、サービス提供側のメソッド処理部２０９はサービス利用側からの要求メッセージの受信、サービス実行オブジェクト２０５のメソッド呼び出し、応答メッセージの生成と送信を行なう。
【００５９】
ここで、メッセージ変換部２０６の処理を、図９を用いて説明する。メッセージ変換部２０６はセッション管理ＩＤ、終端通知情報、ＷＳＤＬ情報を用いてオブジェクトをメッセージに変換する処理を行なう。ＷＳＤＬ情報は、例えばXML Schemaのようなメッセージの構造を示す情報を持っているため、メッセージ変換部２０６はその構造情報とオブジェクトに基づき、XMLメッセージを生成することができる。
【００６０】
まず、メッセージ変換部２０６は渡されたセッション管理ＩＤがnullか否かを判定する（Ｓ９０１）。ＩＤがnullの場合は、サービス実行オブジェクト２０５のメソッドにＩＤがない（戻り値にも引数も配列型がない）ことを示し、メッセージ変換部２０６の１回の処理で送信メッセージを確定し、生成したメッセージを即送信してよいことを示す。そのため、ＩＤがnullと判断した場合（Ｓ９０１でＹｅｓ）、ＷＳＤＬ情報に基づきオブジェクトをメッセージに変換し（Ｓ９０２）、生成したメッセージを即送信する（Ｓ９０３）。一方、ＩＤがnullでないと判断した場合（Ｓ９０１でＮｏ）、メッセージ記憶リストにＩＤが登録されているか判定する（Ｓ９０４）。このメッセージ記憶リストとは、処理中のメッセージをそのセッションＩＤと共に記憶するためのリストである。このリストにＩＤが登録されていない場合（Ｓ９０４でＮｏ）、メッセージ変換部２０６はオブジェクトとＷＳＤＬ情報から新規に生成したメッセージをファイルとして記憶領域２０８に保存し（Ｓ９０６）、ＩＤとファイルをリストに登録する（Ｓ９０７）。しかし、このリストにＩＤが登録されている場合（Ｓ９０４でＹｅｓ）、メッセージ変換部２０６はファイルに保存したメッセージにオブジェクトとＷＳＤＬ情報から作成したメッセージを追加更新して保存する。
【００６１】
次に、終端通知情報endがfalseである場合（Ｓ９０８でＮｏ）、メッセージ変換部２０６はメッセージを送信せずに、メッセージ送信が未完了であることを呼び出し元に伝えて（Ｓ９１３）、処理を終了する。一方、終端通知情報endがtrueである場合（Ｓ９０８でＹｅｓ）、メッセージ変換部２０６はメッセージを完成させて（Ｓ９０９）、送信する（Ｓ９１０）。次に、メッセージ変換部２０６はメッセージ記憶リストからＩＤとメッセージを保存したファイルを削除し（Ｓ９１１）、メッセージ送信が完了したことを呼び出し元に伝えて（Ｓ９１２）、処理を終了する。
【００６２】
ここで、オブジェクト変換部２０７の処理を、図１０を用いて説明する。オブジェクト変換部２０７は受信メッセージのストリーム、変換するオブジェクトの型情報、ＷＳＤＬ情報を用いてメッセージをオブジェクトに変換する処理を行なう。また、ＷＳＤＬ情報はメッセージの構造を示す情報を持っており、オブジェクト変換部２０７はその構造情報とメッセージに基づき、オブジェクトを生成する。
【００６３】
まず、オブジェクト変換部２０７は変換するオブジェクトの型に配列型があるか否かを判別する（Ｓ１００１）。配列型がない場合（Ｓ１００１でＮｏ）、オブジェクト変換部２０７はメッセージを一度にオブジェクトに変換し（Ｓ１００２）、オブジェクトと受信メッセージが処理したことを返して、処理を終了する。例えば、サービス利用側でsetDataオペレーションを処理している場合、戻り値がboolean型で、配列ではないので、boolean型のオブジェクトに変換してbooleanの値とメッセージ処理完了を返す。しかし、配列型がある場合は（Ｓ１００１でＹｅｓ）、オブジェクト変換部２０７は上述したメッセージ記憶リストにＩＤとメッセージが登録されているか否かを判定する（Ｓ１００３）。登録されていなければ（Ｓ１００３でＮｏ）、オブジェクト変換部２０７は受信メッセージをファイルとして記憶領域２０８に記憶し、ＩＤと共にメッセージ記憶リストに登録する（Ｓ１００４）。そして、オブジェクト変換部２０７はメッセージからオブジェクトを生成する（Ｓ１００６）。一方、既に登録されていれば（Ｓ１００３でＹｅｓ）、オブジェクト変換部２０７はそのＩＤに対するメッセージを取得する（Ｓ１００５）。そして、オブジェクト変換部２０７は取得したメッセージからオブジェクトを生成する（Ｓ１００６）。
【００６４】
尚、渡された型、ＷＳＤＬ情報に基づいてオブジェクトを生成する。配列型のデータについては該当するメッセージ中の全てのデータを一度にオブジェクトにするのではなく、部分的にオブジェクトに変換する。ある配列サイズ分オブジェクトに変換し、次にオブジェクト変換部２０７が呼び出された際に、その続きからオブジェクトに変換する処理を行なう。例えば、サービス利用側でgetDataオペレーションを処理している場合、戻り値としてCustomerData型の配列にオブジェクト変換する。メッセージ中の冒頭５つのCustomerDataのデータをCustomerData型のオブジェクトに変換する。そして、オブジェクト変換部２０７が再度呼び出されると、続く６番目から１０番目までをオブジェクト変換し、順次呼び出される毎に５個をオブジェクト変換する。
【００６５】
次に、メッセージの全てをオブジェクトに変換する処理が完了していれば（Ｓ１００７でＹｅｓ）、オブジェクト変換部２０７はメッセージ記憶リストからＩＤとメッセージを削除する（Ｓ１００８）。そして、オブジェクト変換部２０７は生成したオブジェクトと共にメッセージの全てをオブジェクトに変換する処理が完了したことを呼び出し元に返し（Ｓ１００９）、処理を終了する。一方、配列型のデータに対して最後のデータまでオブジェクト変換が完了していなければ、オブジェクト変換部２０７は生成したオブジェクトとオブジェクト変換処理が未完了であることを呼び出し元に返し（Ｓ１０１０）、処理を終了する。
【００６６】
サービス利用側で、例えばgetDataオペレーションに対する応答メッセージ中に10,000人のCustomerDataが含まれる場合、全てCustomerData型のオブジェクトにするとメモリを大量に消費する。本実施形態では、メッセージを一旦保存してからメッセージを分割してオブジェクトに変換するため、一度にCustomerData型がオブジェクトとしてメモリに展開する量を削減できる。
【００６７】
また、サービス利用側でsetDataオペレーションを使用してメッセージを生成する際も、10,000人のCustomerData型のオブジェクトを生成してメソッド呼び出しをするとメモリを大量に消費する。本実施形態では、少量ずつオブジェクトを設定し、メッセージを逐次生成、保存しながら処理を行なうため、メモリの使用量を削減できる。
【００６８】
このように、メモリの少ない組み込みシステム上でアプリケーションを実行したい場合に、メモリの枯渇を防ぎ、他の装置との間で大量のデータを送受信することができる。
【００６９】
尚、オブジェクト変換部２０７で分割してオブジェクトのサイズを固定として説明したが、外部からサイズを指定できるようにしても良い。また、メッセージ通信装置１００がサービス実行オブジェクト生成部２０２を有する構成を説明した。しかし、サービス実行処理部２０４が使用するサービス実行オブジェクト２０５は、サービス実行オブジェクト生成部２０２を有する別装置で生成されたものでも良い。
【図１】
2010244144.tif 000003
【図２】
2010244144.tif 000004
【図３】
2010244144.tif 000005
【図７】
2010244144.tif 000006
【図８】
2010244144.tif 000007
【図９】
2010244144.tif 000008
【図１０】
2010244144.tif 000009
【図４】
2010244144.tif 000010
【図５】
2010244144.tif 000011
【図６】
2010244144.tif 000012