(57)【要約】      （修正有）【課題】イベントハンドラを用いた処理負担を軽減すること。【解決手段】ＸＭＬ文書の複数のイベント情報に対応した複数の処理を行うカスタムハンドラをカスタムハンドラ記憶領域１３３に記憶しておき、第二のイベント制御部１２６でＸＭＬ文書を解析して生成される複数のイベント情報が、カスタムハンドラに対応する複数のイベント情報に一致する場合には、当該カスタムハンドラを読み出して処理を行う。【選択図】図１
2008003759.tif 000002
【特許請求の範囲】
【請求項１】
構造化文書を構成する要素に応じたイベント情報をアプリケーションプログラムに通知することで、当該アプリケーションプログラムにおいて当該イベント情報に応じた処理を行う実行装置であって、
複数のイベント情報を備えるイベント列情報、当該イベント列情報に備えられる当該イベント情報に対応した複数の処理を行うカスタムプログラム、を記憶する記憶部と、
構造化文書を構成する要素を分析し、当該要素に応じた複数のイベント情報が前記イベント列情報と一致するか否かを判定し、複数の当該イベント情報が前記イベント列情報と一致する場合に、前記記憶部から前記カスタムプログラムを読み込み実行する処理を行う制御部と、
を備えることを特徴とする実行装置。
【請求項２】
請求項１に記載の実行装置であって、
前記カスタムプログラムは、
前記イベント列情報に備えられる前記イベント情報の各々に対応するメソッドと、
前記イベント情報の各々から前記メソッドを呼び出すための情報と、
を備えることを特徴とする実行装置。
【請求項３】
請求項２に記載の実行装置であって、
前記制御部は、
前記構造化文書を構成する要素から前記イベント情報を生成するイベント情報生成処理と、
前記イベント情報生成処理において生成されたイベント情報毎に、当該イベント情報の変数を特定するログ情報を取得するログ情報取得処理と、
前記ログ情報取得処理により取得されたログ情報を解析することにより、繰り返し生成される複数のイベント情報により構成されるイベント列を特定して、イベント列情報として前記記憶部に記憶するイベント列特定処理と、
前記イベント列情報に含まれる各々のイベント情報に対応するメソッドを前記アプリケーションプログラムから取得するメソッド取得処理と、
前記メソッド取得処理により取得されたメソッドに、前記イベント列情報に含まれるイベント情報から当該メソッドを呼び出すための情報を追加することで前記カスタムプログラムを生成するカスタムプログラム生成処理と、
を行うことを特徴とする実行装置。
【請求項４】
請求項２に記載の実行装置であって、
前記制御部は、
繰り返し生成される複数のイベント情報により構成されるイベント列を特定したイベント列特定情報を読み込む読込処理と、
前記イベント列特定情報に含まれる各々のイベント情報に対応するメソッドを前記アプリケーションプログラムから取得するメソッド取得処理と、
前記メソッド取得処理により取得されたメソッドに、前記イベント列特定情報に含まれるイベント情報から当該メソッドを呼び出すための情報を追加することで前記カスタムプログラムを生成するカスタムプログラム生成処理と、
を行うことを特徴とする実行装置。
【請求項５】
コンピュータに読み込まれることで、構造化文書を構成する要素に応じたイベント情報をアプリケーションプログラムに通知することで、当該アプリケーションプログラムにおいて当該イベント情報に応じた処理を前記コンピュータに実行させるプログラムであって、
コンピュータを、
複数のイベント情報を備えるイベント列情報、当該イベント列情報に備えられる当該イベント情報に対応した複数の処理を行うカスタムプログラム、を記憶する記憶手段、
構造化文書を構成する要素を分析し、当該要素に応じた複数のイベント情報が前記イベント列情報と一致するか否かを判定し、複数の当該イベント情報が前記イベント列情報と一致する場合に、前記記憶手段から前記カスタムプログラムを読み込み実行する処理を行う制御手段、
として機能させることを特徴とするプログラム。
【請求項６】
請求項５に記載のプログラムであって、
前記カスタムプログラムは、
前記イベント列情報に備えられる前記イベント情報の各々に対応するメソッドと、
前記イベント情報の各々から前記メソッドを呼び出すための情報と、
を備えることを特徴とするプログラム。
【請求項７】
請求項６に記載のプログラムであって、
前記制御手段は、
前記構造化文書を構成する要素から前記イベント情報を生成するイベント情報生成処理と、
前記イベント情報生成処理において生成されたイベント情報毎に、当該イベント情報の変数を特定するログ情報を取得するログ情報取得処理と、
前記ログ情報取得処理により取得されたログ情報を解析することにより、繰り返し生成される複数のイベント情報により構成されるイベント列を特定して、イベント列情報として前記記憶手段に記憶するイベント列特定処理と、
前記イベント列情報に含まれる各々のイベント情報に対応するメソッドを前記アプリケーションプログラムから取得するメソッド取得処理と、
前記メソッド取得処理により取得されたメソッドに、前記イベント列情報に含まれるイベント情報から当該メソッドを呼び出すための情報を追加することで前記カスタムプログラムを生成するカスタムプログラム生成処理と、
を行うことを特徴とするプログラム。
【請求項８】
請求項６に記載のプログラムであって、
前記制御手段は、
繰り返し生成される複数のイベント情報により構成されるイベント列を特定したイベント列特定情報を読み込む読込処理と、
前記イベント列特定情報に含まれる各々のイベント情報に対応するメソッドを前記アプリケーションプログラムから取得するメソッド取得処理と、
前記メソッド取得処理により取得されたメソッドに、前記イベント列特定情報に含まれるイベント情報から当該メソッドを呼び出すための情報を追加することで前記カスタムプログラムを生成するカスタムプログラム生成処理と、
を行うことを特徴とするプログラム。
【請求項９】
構造化文書を構成する要素に応じたイベント情報をアプリケーションプログラムに通知することで、当該アプリケーションプログラムにおいて当該イベント情報に応じた処理をコンピュータが行う実行方法であって、
前記コンピュータの記憶手段が、複数のイベント情報を備えるイベント列情報、当該イベント列情報に備えられる当該イベント情報に対応した複数の処理を行うカスタムプログラム、を記憶する過程と、
前記コンピュータの制御手段が、構造化文書を構成する要素を分析し、当該要素に応じた複数のイベント情報が前記イベント列情報と一致するか否かを判定し、複数の当該イベント情報が前記イベント列情報と一致する場合に、前記記憶手段から前記カスタムプログラムを読み込み実行する処理を行う過程と、
を備えることを特徴とする実行方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、構造化文書を構成する要素に応じたイベント情報をアプリケーションプログラムのインターフェースに通知し、当該インターフェースから当該アプリケーションプログラムにイベント対応情報を通知することで、当該アプリケーションプログラムにおいて当該イベント情報に応じた処理を行わせる技術に関する。
【背景技術】
【０００２】
ＸＭＬ（eXtansible Markup Language）文書をアプリケーションから操作する場合には、ＸＭＬパーサを用いてＸＭＬ文書の字句を解析して、その解析結果をアプリケーションに提供するようにしている。
【０００３】
ここで、ＸＭＬパーサの方式の一つに、ＳＡＸ(Simple API for XML)と呼ばれる手法が提案されており、このＳＡＸでの処理を効率的に行う技術として、非特許文献１に記載の技術がある。
【０００４】
非特許文献１に記載の技術は、まず、ＳＡＸパーサで処理対象となる文書のスキーマをテンプレートとして与え、テンプレートからオートマトンを生成する。そして、入力されたＸＭＬ文書がオートマトンと一致する場合には、一致した部分に関しては、予め保持されている字句解析結果を利用することにより、字句解析時間を短縮する。
【０００５】
【非特許文献１】Yoichi Takeuchi et.al.,尿 Differential-analysis Approach for Improving SOAP Processing Performance  Proceedings of the 2005 ACM/IEEE SC|05 Conference (SC'05), EEE'05, 2005, p.472-479.
【発明の開示】
【発明が解決しようとする課題】
【０００６】
非特許文献１に記載の技術では、ＸＭＬ文書の字句解析の処理を効率化させることはできるが、予め保存されている字句解析結果を利用したとしても、多くの場合、各イベントに対応するイベントハンドラにおいて、要素の名前による場合分け処理、ある要素が処理中か否かを表すフラグを設定、参照する状態管理用の処理等を行う必要があり、これらの処理は、イベントハンドラの引数情報が定数に確定していたり、イベントハンドラの呼び出し順序が確定していたりする場合には、無駄に実行されてしまう。
【０００７】
そこで、本発明は、イベントハンドラを用いた処理負担を軽減することを目的とする。
【課題を解決するための手段】
【０００８】
以上の課題を解決するため、本発明は、構造化文書において繰り返し現れるイベントに対応した処理を行うカスタムプログラムを予め記憶しておき、処理対象となっている構造化文書において当該繰り返し現れるイベントが認定された場合に、予め記憶されているカスタムプログラムを用いて処理を行うことを特徴とする。
【０００９】
例えば、本発明は、構造化文書を構成する要素に応じたイベント情報をアプリケーションプログラムに通知することで、当該アプリケーションプログラムにおいて当該イベント情報に応じた処理を行う実行装置であって、複数のイベント情報を備えるイベント列情報、当該イベント列情報に備えられる当該イベント情報に対応した複数の処理を行うカスタムプログラム、を記憶する記憶部と、構造化文書を構成する要素を分析し、当該要素に応じた複数のイベント情報が前記イベント列情報と一致するか否かを判定し、複数の当該イベント情報が前記イベント列情報と一致する場合に、前記記憶部から前記カスタムプログラムを読み込み実行する処理を行う制御部と、を備えることを特徴とする。
【発明の効果】
【００１０】
以上のように、本発明によれば、処理対象となっている構造化文書において繰り返し現れるイベントが認定された場合に、予め記憶されているカスタムプログラムを用いて処理を行うため、ハンドラの呼び出し回数を削減することが期待できる。また、カスタムハンドラでは、アプリケーションプログラムで定義されているハンドラのコードが決まった順序で配置されるため、上述のような、場合分け処理や状態管理処理の実行を削減することが期待できる。以上により、構造化文書を効率的に処理することができる。
【発明を実施するための最良の形態】
【００１１】
図１は本発明の第一の実施形態である実行装置１００の概略図である。
【００１２】
図示するように、実行装置１００は、ファイル読み取り部１１０と、制御部１２０と、記憶部１３０と、を備えている。
【００１３】
ファイル読み取り部１１０は、ＲＯＭ（Read Only Memory）等の外部記憶装置あるいはネットワーク装置からＸＭＬ文書を読み取り、後述する制御部１２０の字句解析部１２１に送る。
【００１４】
制御部１２０は、字句解析部１２１と、第一のイベント制御部１２２と、イベントログ取得部１２３と、ログ解析部１２４と、ハンドラ生成部１２５と、第二のイベント制御部１２６と、アプリケーション実行部１２７と、を備えている。
【００１５】
字句解析部１２１は、カスタムハンドラの蓄積過程においては、ＸＭＬ文書の解析を行い、ＸＭＬ文書の各要素を特定し、後述する第一のイベント制御部１２２に送る。一方、カスタムハンドラの使用過程においては、ＸＭＬ文書の解析を行い、ＸＭＬ文書の各要素を特定し、後述する第二のイベント制御部１２６に送る。
【００１６】
ここで、カスタムハンドラの蓄積過程及びカスタムハンドラの使用過程の区別は、実行装置１００のオペレータの指示に従えばよい。
【００１７】
第一のイベント制御部１２２は、字句解析部１２１から送られてきた要素に対するイベント情報を生成して、後述するイベントログ取得部１２３に送る制御を行う。
【００１８】
イベントログ取得部１２３は、第一のイベント制御部１２２より送られたイベント情報の種別と、当該イベント情報で特定されている要素名と、を取得し、後述する記憶部１３０のログデータ記憶領域１３１に順次記録する。
【００１９】
このようにして取得されるログデータの一例を図３に示す。図３のログデータ１３１ａは、図２に示すＸＭＬ文書１１０ａが読み込まれた際に取得されるものである。図示するように、本実施形態におけるログデータ１３１ａは、各々のイベント情報毎に、イベント情報の種別と、要素名と、が記憶されている。
【００２０】
ログ解析部１２４は、後述する記憶部１３０に記憶されるログデータ１３１ａを解析して、繰り返し現れるイベント列を特定し、後述する記憶部１３０のイベント列情報記憶領域に、例えば、図４に示すようなイベント列テーブル１３２ａを記憶する。
【００２１】
繰り返し現れるイベント列の特定は、例えば、ログデータの１行を１つの要素とみなして、ＳＥＱＵＩＴＵＲアルゴリズム(Nevill-Manning,C.G,Written.I.H,祢dentifying Hierarchical Structure in Sequences:A linear-time algorithm   Journal of Artificail Intelligence Research,p.67-82,1997)を適用することにより可能である。
【００２２】
例えば、ＳＥＱＵＩＴＵＲアルゴリズムでは、空の初期生成規則に対して、入力を末尾に順次追加する。このとき、生成規則が次の規則を満たすように、新たな規則の追加や規則の削除を行う。
【００２３】
規則１：同一隣接要素は文法中で一度のみ現れる。
【００２４】
規則２：すべての生成規則は二度以上現れる。
【００２５】
図５を用いて、図３に示すログデータ１３１ａを入力とした場合の処理例を説明する。
【００２６】
図５（ａ）は、ログデータ１３１ａの先頭から要素１３１ｂまでが処理された段階での生成規則である。この段階では、規則１、規則２ともに満たされるので、初期の生成規則Ｎ０に入力要素が順次追加されている。
【００２７】
次に、要素１２４ｄが生成規則Ｎ０に追加されると、要素１２４ａ及び要素１２４ｂと、要素１２４ｃ及び要素１２４ｄと、の同一隣接要素が２回現れるため、規則１に適合しなくなる。
【００２８】
そのため、新たな生成規則Ｎ１を追加する。これにより、図５（ｂ）に示される生成規則が生成される。
【００２９】
次に、要素１２４ｈが生成規則Ｎ０に追加されると、要素１２４ｅ及び要素１２４ｆと、要素１２４ｇ及び要素１２４ｈと、の同一隣接要素が２回現れるため、再び、生成規則１に適合しなくなる。
【００３０】
そのため、生成規則Ｎ１に新たに、要素１２４ｈを追加したものを、新たな生成規則Ｎ１とすることにより、図５（ｃ）に示される生成規則が生成される。
【００３１】
以下、同様に、入力される要素に対して順次、処理を繰り返すことにより、最終的に図５（ｄ）の生成規則が作成される。図５（ｄ）の生成規則では、生成規則Ｎ１が複数回現れているため、この生成規則Ｎ１で表現される部分である要素列１３１ｅ（図３参照）が繰り返されていることが特定できる。
【００３２】
なお、本実施例では、イベントの状態として、イベント情報の種別と要素名とが一致した場合に状態が一致するとしているが、その他の例として、イベント情報の種別とすべての引数が一致した場合に状態が一致すると判定することや、characters以外のみ、イベント情報の種別とすべての引数が一致した場合に状態が一致すると判定すること等も可能である。
【００３３】
ハンドラ生成部１２５は、ログ解析部１２４で特定された繰り返し実行されるイベント情報と、後述するアプリケーション実行部１２７が保持するイベントハンドラと、イベント列情報記憶領域１３２に記憶されているイベント列テーブル１３２ａと、に基づいて、繰り返し実行されるイベント情報で実行される処理をまとめたカスタムハンドラを生成し、後述する記憶部１３０のカスタムハンドラ記憶領域１３３に当該カスタムハンドラを記憶するとともに、後述するイベント列テーブル１３２ａのハンドラ参照欄１３２ｃに記憶したカスタムハンドラを呼び出すための情報を記憶する。
【００３４】
なお、本実施形態においては、カスタムハンドラは、クラスファイルとして生成する。クラスファイルの作成は、既存技術であるJavassistを使用することで、クラスファイルの物理フォーマットを意識することなく、Java（登録商標）ソースコード、もしくは、バイトコードレベルの操作により、クラスの追加、メソッドの追加、メソッドに対するコードの追加などの操作を行うことができる。
【００３５】
また、ハンドラ生成部１２５での処理については、下記において図９及び図１０を用いて詳述する。
【００３６】
第二のイベント制御部１２６は、字句解析部１２１から送られてきた要素からイベント情報を生成するとともに、生成されたイベント情報が、後述するイベント列情報記憶領域１３２に記憶されているイベント列テーブル１３２ａのイベント列情報欄１３２ｂに登録されているイベント列を構成するか否かを判定し、生成された複数のイベント情報がイベント列情報欄１３２ｂに登録されているイベント列と一致する場合には、対応するハンドラ参照欄１３２ｃに登録されている情報に基づいて、カスタムハンドラ記憶領域１３３から対応するカスタムハンドラを呼び出す処理を行う。
【００３７】
一方、第二のイベント制御部１２６は、生成したイベント情報が、後述するイベント列情報記憶領域１３２に記憶されているイベント列テーブル１３２ａのイベント列情報欄１３２ｂに登録されているイベント列を構成しない場合には、当該イベント情報をアプリケーション実行部１２７に通知する処理を行う。
【００３８】
なお、第二のイベント制御部１２６での処理についても、下記において図１５を用いて詳述する。
【００３９】
アプリケーション実行部１２７は、第二のイベント制御部１２６からイベント情報を取得し、取得したイベント情報に対応するメソッドをイベントハンドラから特定して、特定されたメソッドを実行することで、読み込まれたＸＭＬ文書に対応する処理を行う。
【００４０】
記憶部１３０は、ログデータ記憶領域１３１と、イベント列情報記憶領域１３２と、カスタムハンドラ記憶領域１３３と、を備えている。
【００４１】
ログデータ記憶領域１３１には、第一のイベント制御部１２２からイベントログ取得部１２３へ送られたイベント情報の種別と、当該イベント情報で特定されている要素名と、を記録したログデータが記憶される。図３に、このようにして取得されるログデータ１３１ａの一例を示す。
【００４２】
イベント列情報記憶領域１３２には、複数のイベント情報からなるイベント列情報と、当該イベント列で行われる処理をまとめたカスタムハンドラを特定するための情報と、が記憶されている。
【００４３】
例えば、本実施形態においては、図４に示されているようなイベント列テーブル１３２ａが記憶されている。
【００４４】
図示するように、イベント列テーブル１３２ａは、イベント列情報欄１３２ｂと、ハンドラ参照欄１３２ｃと、を備えている。
【００４５】
イベント列情報欄１３２ｂには、図４に示されているように、各々の行毎に、イベント種別欄１３２ｄと、要素欄１３２ｅと、引数格納エリア１３２ｆと、が設けられている。
【００４６】
イベント種別欄１３２ｄには、第一のイベント制御部１２２から送られたイベント情報の種別が登録される。
【００４７】
要素欄１３２ｅには、第一のイベント制御部１２２から送られたイベント情報の要素名が登録される。
【００４８】
なお、以上のイベント種別欄１３２ｄ及び要素欄１３２ｅについては、カスタムハンドラの蓄積過程において、イベントログ取得部１２３により必要な情報が登録される。
【００４９】
引数格納エリア欄１３２ｆには、イベント情報のイベントハンドラに対する引数のデータが登録される。なお、本実施形態においては、当該引数が要素名を示す場合には、当該引数については、引数格納エリア欄１３２ｆには登録しないようにしている。
【００５０】
なお、引数格納エリア欄１３２ｆについては、カスタムハンドラの蓄積過程では空欄にされており、カスタムハンドラの使用過程において、第二のイベント制御部１２６により必要な情報が登録される。
【００５１】
ここで、ＳＡＸにおけるイベント情報に対応するイベントハンドラの引数の型、個数については、ＳＡＸインターフェースの規格において規定されている。
【００５２】
例えば、図６にorg.xml.sax.DocumentHandlerクラスに定義されているハンドラメソッドのインタフェースの例を示す。
【００５３】
例えば、図６の要素１４０ａ、要素１４０ｂに示されているように、startDocumentやendDocumentに対して使用される引数可能エリアは０個となる。
【００５４】
また、図６の要素１４０ｃに示されているように、startElementに対しては、第１引数が要素名を表すため、この引数は引数格納エリアに登録されず、startElementイベントハンドラの第２引数のattsに対応した引数データが登録される。
【００５５】
ハンドラ参照欄１３２ｃには、イベント列情報欄１３２ｂに登録されるイベント列が認識された場合に呼び出されるカスタムハンドラを実装するオブジェクトへの参照が登録される。ここで、本実施形態においては、ハンドラ参照欄１３２ｃに登録されるデータの型は、図７に示すような抽象型とするが、このような態様に限定されるわけではない。
【００５６】
カスタムハンドラ記憶領域１３３には、ハンドラ生成部１２５で生成されたカスタムハンドラが記憶される。
【００５７】
以上のように構成される実行装置１００は、例えば、図８に示すようなコンピュータ１５０により実現可能である。
【００５８】
ここで、コンピュータ１５０は、ＣＰＵ（Central Processing Unit）１５１と、メモリ１５２と、補助記憶装置１５３と、入力装置１５４と、出力装置１５５と、読取装置１５６と、これらを接続するバス１５７と、を備えている。
【００５９】
例えば、ファイル読み取り部１１０は、外部記憶装置であるＲＯＭ１５８に記憶された情報を読み取ることができる読取装置１５６により実現可能であり、制御部１２０は、補助記憶装置１５３に記憶されている所定のプログラムをメモリ１５２に読み込み、ＣＰＵで実行することにより実現可能であり、記憶部１３０は、補助記憶装置１５３により実現可能である。
【００６０】
以上のように構成される実行装置１００の使用法は、大きく分けて、カスタムハンドラを生成するカスタムハンドラ生成過程と、カスタムハンドラ生成過程で生成されたカスタムハンドラを用いてＸＭＬ文書を処理するカスタムハンドラ使用過程と、に分けられる。
【００６１】
カスタムハンドラ生成過程では、ファイル読み取り部１１０で読み取られたＸＭＬ文書を字句解析部１２１で解析し、解析した要素に対するイベント情報を第一のイベント制御部で生成し、生成したイベント情報をイベントログ取得部１２３へ送ることにより、イベント情報のログデータ１３１ａを取得する。次に、ログ解析部１２４により、ログデータ１３１ａを解析し、繰り返し現れるイベント列を特定し、その結果をイベント列テーブル１３２ａとして作成する。そして、ハンドラ生成部１２５により、アプリケーション記憶領域１３２に記憶されているイベントハンドラから、イベント列テーブル１３２ａで指定された繰り返しバターンに対する処理を行うカスタムハンドラを生成し、カスタムハンドラ記憶領域１３３に記憶する
また、カスタムハンドラ使用過程においては、ファイル読み取り部１１０で読み取られたＸＭＬ文書を、字句解析部１２１で解析し、解析された要素を第二のイベント制御部１２６に送る。そして、第二のイベント制御部１２６では、解析された要素に対応するイベント情報を生成し、生成されたイベント情報がイベント列テーブル１３２ａに記録されている繰り返し実行される一連のイベント列に対応すると認識すると、カスタムハンドラ記憶領域１３３に記憶されているカスタムハンドラの呼び出しを行う。
【００６２】
図９は、ハンドラ生成部１２５の処理フローを示すフローチャートである。
【００６３】
本処理フローは、大きくわけて、カスタムハンドラクラスの作成、作成されたクラスファイルのロード、カスタムハンドラのオブジェクト参照のイベント列テーブル１３２ａへの登録の三つの処理となる。
【００６４】
まず、ハンドラ生成部１２５は、アプリケーション実行部１２７に保持されているイベントハンドラをコピーして、そのクラス名を「ＨＣ」に変更することにより、カスタムハンドラクラスの定義を作成する（Ｓ１６０）。
【００６５】
例えば、アプリケーション実行部１２７に保持されているイベントハンドラとして、図１１に示すイベントハンドラ１４１があり、図４に示すイベント列テーブル１３２ａが生成されイベント列情報記憶領域１３２に記憶されているとすると、ステップ１６０では、イベントハンドラクラス１４１のコピーが作成され、クラス名を「ＵＨ」から「ＨＣ」に変更することで、図１２に示すカスタムハンドラクラス１４２のコード１４２ａが生成される。
【００６６】
次に、ハンドラ生成部１２５は、インデックス「Ｉ」を「０」に初期化して（Ｓ１６１）、イベント列テーブル１３２ａに未処理のイベント列情報欄１３２ｂのエントリがあるか否かを検索する（Ｓ１６２）。
【００６７】
そして、イベント列テーブル１３２ａに未処理のイベント列情報欄１３２ｂのエントリがある場合には（Ｓ１６２）、当該エントリを変数Ｔとして取得し（Ｓ１６３）、変数Ｔに対して追加ハンドラクラス１４２ｂを生成して（図１２参照）、内部クラスとしてカスタムハンドラクラス１４２に追加する処理を行う（Ｓ１６４）。
【００６８】
ここで、追加ハンドラクラス１４２ｂのクラス名は、「ＨＣ」にインデックス「Ｉ」の値を追加することにより区別することができるようにしている。
【００６９】
なお、ステップＳ１６４での処理については、図１３を用いて詳述する。
【００７０】
そして、ハンドラ生成部１２５は、ステップＳ１６４で生成された追加ハンドラクラス１４２ｂに対してインライン展開を施すことにより（Ｓ１６５）、図１３に示されているように、コード１４１ａの変数に追加ハンドラクラス１４２ｂで特定された情報を代入した、第二の追加ハンドラクラス１４３が生成される。
【００７１】
例えば、図１２の要素１４２ｃに対しては、インライン展開を適用することで、図１１のイベント情報「startElement」に対応するハンドラメソッドの本体コード１４１ｂが、要素１４２ｃの代わりに展開され、そして、定数伝搬により、図１１のコード１４１ｃ及び１４１ｄで参照される引数ｎが、要素１４２ｃで特定される値である”商品”に置き換えられる。これにより、図１３のコード１４３ａが生成される。
【００７２】
さらに、ハンドラ生成部１２５は、第二の追加ハンドラクラス１４３に対して、定式評価、不要コード削除等の最適化を適用する（Ｓ１６６）。
【００７３】
例えば、図１３のコード１４３ｂで定義されるbufferの定義は、使用点が無いため、不要コードとして削除される。
【００７４】
また、図１３のコード１４３ｃ及びコード１４３ｄは、条件を静的に評価することにより、常にfalseとなることが判明するため、これらのコードは削除される。以下、同様に定式評価と不要コード削除を適用すると、結果として、図１４に示す第三の追加ハンドラクラス１４４が生成される。
【００７５】
なお、追加ハンドラクラス１４２ｂは、カスタムハンドラクラス１４２の内部クラスとして定義されているため、追加ハンドラクラス１４２ｂから、カスタムハンドラクラス１４２のすべての要素がアクセス可能である。そのため、既存技術を用いてインライン展開や最適化処理を適用することができる。
【００７６】
そして、ハンドラ生成部１２５は、コード１４２ａの内部ハンドラクラスとして第三の追加ハンドラクラス１４４を有するカスタムハンドラクラス１４２の定義からクラスファイルを生成、ロードし、オブジェクトを生成し、カスタムハンドラ記憶領域１３３に記憶するとともに、生成されたオブジェクトを、アプリケーションで用意されたイベントハンドラのオブジェクトに変えて、パーサのハンドラとして設定する（Ｓ１６７）。
【００７７】
最後に、ハンドラ生成部１２５は、イベント列情報欄１３２ｂに対応するハンドラ参照欄１３２ｃにカスタムハンドラの対応する内部クラスのオブジェクトの参照を設定する（Ｓ１６８）。
【００７８】
図１０は、内部クラス追加処理（図９のＳ１６４）の処理フローを示すフローチャートである。
【００７９】
本処理フローでは、追加ハンドラクラスとメソッドの定義を行い、メソッドにイベント列情報の各イベントハンドラの呼び出しコードを追加する。
【００８０】
まず、ハンドラ生成部１２５は、変数Ｔのイベント列情報欄１３２ｂの情報を変数ＩＴとして取得する（Ｓ１７０）。
【００８１】
次に、ハンドラ生成部１２５は、カスタムハンドラクラス１４２に、クラス名ＮＭ（ここでは、カスタムハンドクラス１４２のクラス名「ＨＣ」にインデックス「Ｉ」の値「０」を追加した「ＨＣ０」）の内部クラスの定義を追加する（Ｓ１７１）。このとき、内部クラスは、図５で示されるCustomHandlerクラスを継承するようにする。
【００８２】
このような処理により、例えば、図１２の要素１４２ｄが追加される。
【００８３】
また、ハンドラ生成部１２５は、ＮＭ名の内部クラスに、禰andler買＜\ッドの定義を追加する（Ｓ１７２）。
【００８４】
このような処理により、例えば、図１２の要素１４２ｅが追加される。
【００８５】
そして、ハンドラ生成部１２５は、変数Ｋと変数Ｊを「０」に初期化する（Ｓ１７３）。
【００８６】
次に、ハンドラ生成部１２５は、変数ＩＴに未処理のエントリがあるか否かを確認する（Ｓ１７４）。
【００８７】
そして、変数ＩＴに未処理のエントリがある場合には（Ｓ１７４）、変数ＩＴの未処理のエントリを変数Ｅとして取得する（Ｓ１７５）。
【００８８】
そして、変数Ｅに対応するイベントハンドラへの呼び出しコードをクラス名ＮＭの内部クラスに追加する（Ｓ１７６）。
【００８９】
例えば、図４のエントリ１３２ｇが変数Ｅとして取得された場合には、変数Ｅのイベント種別「startElement」の呼び出しコードが追加される。
【００９０】
また、ハンドラ生成部１２５は、変数Ｅに対応するイベント情報の引数情報を取得する（Ｓ１７７）。なお、前述のように、各イベント情報に対応する引数情報については、ＳＡＸインターフェースの規格において規定されているため、このような規格に対応したものを、例えば、第一のイベント制御部１２２等から取得すればよい。
【００９１】
そして、ハンドラ生成部１２５は、未処理の引数情報があるか否かを確認し（Ｓ１７８）、未処理の引数情報がある場合には、未処理の引数が、要素名である場合には（Ｓ１７９）、要素名の文字列をステップＳ１７５で追加した呼び出しコードに追加する（Ｓ１８０）。
【００９２】
例えば、イベント種別「startElement」の一つ目の引数が要素名を表すことはＳＡＸイベントとして決まっているため、一つ目の引数については、ステップＳ１８０が適用され、要素名の文字列”商品”が追加される。
【００９３】
一方、未処理の引数が、要素名ではない場合には（Ｓ１７９）、未処理の引数がｉｎｔ型か否かを確認する（Ｓ１８１）。
【００９４】
そして、この未処理の引数がｉｎｔ型である場合には（Ｓ１８１）、禰andler買＜\ッドの第２引数の配列オブジェクトのＫ番目の要素を取得するコードを、ステップＳ１７６で追加した呼び出しコードに追加する（Ｓ１８２）。
【００９５】
例えば、イベント種別「startElement」の二つ目の引数に対しては、要素名でなく、かつ、int型でもないため、ステップＳ１８２が適用され、”(Attributes)args[0]”のコードが追加される。
【００９６】
このようなコードを追加した後、変数Ｋに「１」をインクリメントする（Ｓ１８３）。
【００９７】
一方、この未処理の引数がｉｎｔ型でない場合には（Ｓ１８１）、禰andler買＜\ッドの第１引数の配列オブジェクトのＪ番目の要素を引数の型にキャストするコードを、ステップＳ１７６で追加した呼び出しコードに追加する（Ｓ１８４）。
【００９８】
そして、このようなコードを追加した後、変数Ｊに「１」をインクリメントする（Ｓ１８５）。
【００９９】
以上に記載したステップＳ１７８〜ステップＳ１８５の処理を未処理の引数情報がなくなるまで繰り返し、ステップＳ１７４〜ステップＳ１８５の処理を変数ＩＴに未処理のエントリがなくなるまで繰り返すことにより、例えば、図１２の要素群１４２ｆが追加される。
【０１００】
図１５は、第二のイベント制御部１２６における処理フローを示すフローチャートである。
【０１０１】
本処理フローでは、ＸＭＬ文書解析で発生するイベントが、繰り返される一連のイベントの最初にマッチした場合、途中にマッチした場合、最後にマッチした場合、途中までマッチした場合、まったくマッチしない場合の五つの場合に応じて処理を決定する。
【０１０２】
まず、第二のイベント制御部１２６は、字句解析部１２１から送られてきた要素からイベント情報を生成する（Ｓ２００）。
【０１０３】
第二のイベント制御部１２６は、生成したイベント情報とイベント列情報記憶領域１３２に記憶されているイベント列テーブル１３２ａにマッチ中のイベント列情報があるか否かを変数Ｅの有無により判断する（Ｓ２０１）。即ち、第二のイベント制御部１２６の呼び出し時の初期値では、現在処理中の変数Ｅは空となっている。変数Ｅが空であることは、マッチ中のイベント列情報がないことを示している。
【０１０４】
変数Ｅが空の場合には、ステップＳ２００で生成したイベント情報を先頭エントリに持つイベント列情報がないかイベント列テーブル１３２ａを検索する（Ｓ２０２）。
【０１０５】
そして、第二のイベント制御部１２６は、ステップＳ２００で生成したイベント情報を有するイベント列情報が見つからない場合は（Ｓ２０３）、ステップＳ２００で生成したイベント情報に対応するイベントハンドラをカスタムハンドラ記憶領域１３３から呼び出し(Ｓ２０４)、処理を終了する。
【０１０６】
一方、第二のイベント制御部１２６は、ステップＳ２００で生成したイベント情報を有するイベント列情報が見つかった場合は（Ｓ２０３）、見つかったイベント列情報の先頭行を変数Ｅとして取得する（Ｓ２０４）。
【０１０７】
そして、第二のイベント制御部１２６は、ステップＳ２００で生成したイベント情報に対する引数を変数Ｅの引数格納エリア欄１３２ｆに登録する（Ｓ２０５）。
【０１０８】
次に、第二のイベント制御部１２６は、見つかったイベント列情報の次の行を変数Ｅとして取得し（Ｓ２０４）、処理を終了し、次の要素の処理へ進む。
【０１０９】
一方、変数Ｅが空ではない場合、即ち、変数Ｅにイベント列情報の列が格納されている場合には（Ｓ２０１）、ステップＳ２００で生成したイベント情報のイベント種別及び要素名が、変数Ｅのイベント種別及び要素名と一致するか否かを確認し（Ｓ２０７）、一致する場合には（Ｓ２０７）、変数Ｅがイベント列情報の最終行か否かを確認し（Ｓ２０８）、最終行である場合には（Ｓ２０８）、イベント列情報と完全に一致したため、カスタムハンドラの呼び出しを行う（Ｓ２１０）。カスタムハンドラの引数は、Ｏｂｊｅｃｔ型の配列とｉｎｔ型の配列を作成し、イベント列情報の引数エリアに格納されているすべてのエントリの引数データのうち、ｉｎｔ型のものはｉｎｔ型の配列に、それ以外のものは、Ｏｂｊｅｃｔ型の配列に順次設定することで作成する。
【０１１０】
一方、変数Ｅが最終行ではない場合には（Ｓ２０９）、イベント列情報とマッチングの途中段階のため、ステップＳ２０５に進む。
【０１１１】
また、ステップＳ２００で生成したイベント情報と変数Ｅとが一致しない場合には（Ｓ２０７）、ステップＳ２００で生成したイベント情報とイベント列情報とがマッチしなくなった場合であるため、この場合には、変数Ｅが属するイベント列情報の先頭行からＥまでの各行に対して、そのエントリの引数エリアに格納されている引数を設定してカスタムハンドラ記憶領域１３３からイベントハンドラの呼び出しを行う(Ｓ２１１)。
【０１１２】
そして、ステップＳ２１０及びステップＳ２１１の後には、変数Ｅをクリアして（Ｓ２１２）、処理を終了する。
【０１１３】
なお、すべてのイベントの処理が終了した時点で、変数Ｅが空でない場合、先頭から変数Ｅまでのイベントハンドラの呼び出しを行う。この処理は、ステップＳ２１１と同等である。
【０１１４】
図１５に示したフローチャートにおいて、図４に示されているイベント列テーブル１３２ａがイベント列情報記憶領域１３２に記憶されている場合に、図１６に示されているＸＭＬ文書を解析する際の動作を説明する。なお、図１７は、図１６に示されているＸＭＬ文書が解析されたときに第二のイベント制御部１２６により解析されるイベント情報を示している。
【０１１５】
まず、ＸＭＬ文書の解析が始まると、第二のイベント制御部１２６は、最初のイベント情報１４５ａを取得する（Ｓ２００）。
【０１１６】
初期状態では、変数Ｅは空であるため（Ｓ２０１）、イベント列情報の検索が行われる(Ｓ２０２)。
【０１１７】
イベント列テーブル１３２ａには、イベント列情報の先頭エントリとしてイベント情報１４５ａをもつエントリが存在しないため、カスタムハンドラ記憶領域１３３に記憶されているカスタムハンドラ１４２からイベント情報１４５ａに対するイベントハンドラであるＨＣクラス（図１２参照）のstartDocumentメソッドが呼び出される(Ｓ２０９)。
【０１１８】
そして、第二のイベント制御部１２６は、スタートから処理を繰り返し、次のイベント情報１４５ｂを生成する（Ｓ２００）。イベント情報１４５ｂも同様に、ステップＳ２０９に進み、ＨＣクラスのstartElementメソッドが呼び出される。
【０１１９】
次に、第二のイベント制御部１２６は、スタートから処理を繰り返し、次のイベント情報１４５ｃを生成する（Ｓ２００）。
【０１２０】
第二のイベント制御部１２６は、イベント情報１４５ｃでは、このイベント情報を先頭にもつイベント列情報が見つかるため（Ｓ２０３）、ステップＳ２０４、ステップＳ２０５により、エントリ１３２ｇの引数格納エリア欄１３２ｆに、イベント情報１４５ｃの引数を格納する。
【０１２１】
そして、第二のイベント制御部１２６は、変数Ｅに次のエントリ１３２ｈを設定し（Ｓ２０６）、スタートから処理を繰り返す。
【０１２２】
ステップＳ２００では、第二のイベント制御部１２６は、次のイベント情報１４５ｄを生成する。
【０１２３】
ここで、今回は変数Ｅにエントリ１３２ｈが設定されているため、第二のイベント制御部１２６は、ステップＳ２０７に進む。そして、イベント情報１４５ｄは、変数Ｅに格納されているエントリ１３２ｈのイベント種別及び要素とマッチし（Ｓ２０７）、また、エントリ１３２ｈは最終行ではないため（Ｓ２０９）、ステップＳ２０５が適用され、エントリ１３２ｈの引数可能エリア欄１３２ｆにイベント情報１４５ｄの引数データを設定し（Ｓ２０５）、次の行のエントリ１３２ｉを変数Ｅに設定し（Ｓ２０６）、スタートに戻り処理を継続する。
【０１２４】
ここで、イベント情報１４５ｅからイベント情報１４５ｉまでは、イベント情報１４５ｄと同様の処理となる。
【０１２５】
そして、第二のイベント制御部１２６は、次のイベント情報１４５ｊを取得した場合には（Ｓ２００）、イベント情報１４５ｊは、イベント列情報の最後の行とマッチするため（Ｓ２０７、Ｓ２０９）、ステップＳ２１０が適用され、イベント列情報の引数格納エリアに保持されている引数データとイベント情報１４５ｊの引数データと、ハンドラ参照欄１３２ｃに設定されるオブジェクトを利用して、対応するカスタムハンドラ１４２の呼び出しを行う。以上により、イベント列テーブルに登録されているイベント列がＸＭＬ文書解析時に現れた場合に、カスタムハンドラを呼び出すことが出来る。
【０１２６】
なお、ＸＭＬ文書のイベント列がイベント列テーブルに登録されているイベント列と途中までマッチする場合(イベント情報１４５ｏ)は、ステップＳ２１１により、イベント列情報の先頭であるエントリ１３２ｇから変数Ｅに設定されているエントリ１３２ｊまでのそれぞれのイベントハンドラの呼び出しが行われる。
【０１２７】
以上により、ＸＭＬ文書から繰り返し実行されるイベント列を特定し、そのイベント列に対応するカスタムハンドラを作成し、解析対象のＸＭＬ文書に繰り返しパターンが見つかった場合に、カスタムハンドラを呼び出すことができるようになる。
【０１２８】
なお、本実施形態では、制御部１２０で行われる処理は同一のアプリケーションの実行中で行われるが、字句解析部１２１、第一のイベント制御部１２２、イベントログ取得部１２３、ログ解析部１２４及びハンドラ作成部１２５におけるカスタムハンドラの作成過程をあらかじめ別のアプリケーションとして実行し、別のアプリケーションの実行中に第二のイベント制御部１２６の処理を行うことも考えられる。この場合、イベント列テーブル１３２ａとカスタムハンドラはファイルに一度記録すること等によりアプリケーション間で受け渡される。
【０１２９】
図１８は、本発明の第二の実施形態における実行装置３００の概略図である。
【０１３０】
図示するように、実行装置３００は、ファイル読み取り部１１０と、制御部３２０と、記憶部３３０と、入力部３９０と、を備えている。
【０１３１】
このような相異点を有することから、本実施形態においては、制御部３２０において、第一の実施形態で備えられていた第一のイベント制御部１２２、イベントログ取得部１２３及びログ解析部１２４の代わりにユーザ指示解析部３２８が備えられている。
【０１３２】
ここで、ユーザ指示解析部３２８は、ファイル読み取り部１１０を介して読み取られたユーザ指示ファイルを読み込み、その結果、イベント列テーブル１３２ａを作成する。
【０１３３】
なお、ユーザ指示ファイルには、連続して発生するイベント種別と要素名が指示され、例えば、図３の１３１ｅと同様の情報を備えているものとする。
【０１３４】
ユーザ指示ファイルからイベント列テーブル１３２ａを作成する手順は、第一の実施形態においてログ解析部１２４がイベント列テーブル１３２ａを作成する手順と同様である。
【０１３５】
以上に記載した実施形態においては、複数のイベント情報がイベント列テーブル１３２ａと一致しない場合にも、カスタムハンドラの１４２のコード１４２ａ（図１２参照）を用いて、メソッドを特定しているが、このような態様に限定されず、複数のイベント情報がイベント列テーブル１３２ａと一致しない場合には、アプリケーション実行部１２７のイベントハンドラを用いて処理を行うようにすることも可能である。
【図面の簡単な説明】
【０１３６】
【図１】実行装置１００の概略図。
【図２】ＸＭＬ文書１１０ａの概略図。
【図３】ログデータ１３１ａの概略図。
【図４】イベント列テーブル１３２ａの概略図。
【図５】繰り返し現れるイベント列を特定する処理を説明するための概略図。
【図６】ハンドラメソッドのインタフェースの例を示す概略図。
【図７】ハンドラ参照欄１３２ｃに登録されるデータの型を示す概略図。
【図８】コンピュータ１５０の概略図。
【図９】ハンドラ生成部１２５の処理フローを示すフローチャート。
【図１０】内部クラス追加処理の処理フローを示すフローチャート。
【図１１】イベントハンドラ１４１ａの概略図。
【図１２】カスタムハンドラクラス１４２の概略図。
【図１３】第二の追加ハンドラクラス１４３の概略図。
【図１４】第三の追加ハンドラクラス１４４の概略図。
【図１５】第二のイベント制御部１２６における処理フローを示すフローチャート。
【図１６】ＸＭＬ文書の概略図。
【図１７】イベント情報の概略図。
【図１８】実行装置３００の概略図。
【符号の説明】
【０１３７】
１００、３００  実行装置
１１０  ファイル読み取り部
１２０  制御部
１２１  字句解析部
１２２  第一のイベント制御部
１２３  イベントログ取得部
１２４  ログ解析部
１２５  ハンドラ生成部
１２６  第二のイベント制御部１２６
１２７  アプリケーション実行部
３２８  ユーザ指示解析部
１３０、３３０  記憶部
１３１  ログデータ記憶領域
１３２  イベント列情報記憶領域
１３３  カスタムハンドラ記憶領域
【図１】
2008003759.tif 000003
【図２】
2008003759.tif 000004
【図３】
2008003759.tif 000005
【図４】
2008003759.tif 000006
【図５】
2008003759.tif 000007
【図６】
2008003759.tif 000008
【図７】
2008003759.tif 000009
【図８】
2008003759.tif 000010
【図９】
2008003759.tif 000011
【図１０】
2008003759.tif 000012
【図１１】
2008003759.tif 000013
【図１２】
2008003759.tif 000014
【図１３】
2008003759.tif 000015
【図１４】
2008003759.tif 000016
【図１５】
2008003759.tif 000017
【図１６】
2008003759.tif 000018
【図１７】
2008003759.tif 000019
【図１８】
2008003759.tif 000020