プライマリ・コンテンツに移動
Oracle® XML Developer's Kitプログラマーズ・ガイド
12c リリース1 (12.1) B71283-04
目次へ移動
目次
索引へ移動
索引

前
次

11 XML Pipeline Processor for Javaの使用

この章では、Extensible Markup Language (XML) Pipeline Processor for Javaの使用方法について説明します。

内容は次のとおりです。

11.1 XML Pipeline Processorの概要

内容は次のとおりです。

11.1.1 前提条件

この章では、次の内容を十分に理解していると想定します。

11.1.2 標準と仕様

Oracle XML Pipeline Processorは、World Wide Web Consortium (W3C)ノートのXML Pipeline Definition Languageバージョン1.0に基づいています。W3Cノートでは、アプリケーション・プログラミング・インタフェース(API)ではなくXMLボキャブラリが定義されています。パイプライン仕様は次の場所にあります。

http://www.w3.org/TR/xml-pipeline/

「XDK for JavaのためのPipeline Definition Language標準」で、W3CノートとOracle XML Developer's Kit (XDK)でのOracle XML Pipeline Processorの実装との違いについて説明します。

関連項目:

表33-1

11.1.3 XMLのマルチステージ処理

Oracle XML Pipeline Processorは、XML Pipeline Definition Languageに基づいています。入力XMLパイプライン文書を受け取り、派生した依存性に基づいてパイプライン・プロセスを実行できます。XMLで記述されるパイプライン文書は、実行するプロセスを宣言方式で指定します。パイプライン文書中に<processdef/>要素を使用して、Javaクラスをプロセスに関連付けることができます。

Pipeline Processorはマルチステージ処理に使用します。マルチステージ処理は、XMLコンポーネントを順次またはパラレルに処理するときに発生します。ある処理ステージの出力を別の処理ステージの入力にすることができます。プロセスの入力と出力を定義するパイプライン・ドキュメントを記述できます。図11-1に、可能なパイプライン・シーケンスを示します。

図11-1 パイプライン処理

図11-1の説明は次にあります。
「図11-1 パイプライン処理」の説明

XML Pipeline Processor自体に加えて、XDKにはパイプライン文書内で連結できるプロセス用のAPIが提供されています。表11-2に、oracle.xml.pipeline.processesパッケージで提供されているクラスの概要を示します。

パイプラインでの一般的なXML処理ステージは次のとおりです。

  1. 入力XML文書を解析します。oracle.xml.pipeline.processesパッケージには、DOM解析用のDOMParserProcessと、SAX解析用のSAXParserProcessが含まれます。

  2. 入力XML文書を検証します。

  3. 入力文書をシリアライズまたは変換します。パイプライン・プロセッサではSAXパーサーをExtensible Stylesheet Language Transformation (XSLT)プロセッサに接続できません。DOMが必要です。

マルチステージ処理において、大規模なXML文書のフィルタ処理と検索にはSAXが最適です。XMLコンテンツを変更するには、または効率的に動的にアクセスするには、DOMを使用します。

関連項目:

パイプライン・アプリケーションへの入力を提供するパイプライン文書を記述する方法は、「パイプラインでのXMLの処理」を参照してください

11.1.4 カスタマイズしたパイプライン・プロセス

oracle.xml.pipeline.controller.Processクラスは、すべてのパイプライン・プロセス定義のベース・クラスです。oracle.xml.pipeline.processesパッケージのクラスは、このベース・クラスを拡張します。カスタマイズしたパイプライン・プロセスを作成するには、Processクラスを拡張するクラスを作成する必要があります。

少なくとも、すべてのカスタム・プロセスは、Processクラスの何も処理を行わないinitialize()およびexecute()メソッドをオーバーライドする必要があります。カスタマイズしたプロセスがSAXイベントを入力として受け入れる場合は、受信したSAXイベントを処理する適切なContentHandlerを戻すように、SAXContentHandler()メソッドをオーバーライドする必要があります。また、適切なErrorHandlerを戻すように、SAXErrorHandler()メソッドをオーバーライドする必要があります。表11-1に、前述のメソッドの詳細を示します。

表11-1 oracle.xml.pipeline.controller.Processクラスのメソッド

クラス 説明

initialize()

プロセスを実行前に初期化します。

getInput()を起動してプロセスの要素に関連付けられた特定の入力オブジェクトをフェッチし、supportType()を起動してサポートされる入力の型を示します。出力に対しても同様に、getOutput()およびsupportType()を起動します。

execute()

プロセスを実行します。

getInParaValue()getInput()またはgetInputSource()を起動して、プロセスへの入力をフェッチします。カスタム・プロセスがSAXイベントを出力する場合は、execute()内でgetSAXContentHandler()およびgetSAXErrorHandler()メソッドを起動して、パイプラインの後続のプロセスで使用するSAXハンドラを取得する必要があります。

setOutputResult()getOutputStream()getOutputWriter()またはsetOutParam()を起動して、このプロセスによって生成される出力または外部パラメータを設定します。

getErrorSource()getErrorStream()またはgetErrorDocument()を起動して、このプロセスの要素に関連付けられたパイプライン・エラー要素にアクセスします。execute()の実行中に例外が発生した場合は、error()またはinfo()を起動して例外をPipelineErrorHandlerに伝播します。

SAXContentHandler()

SAXのContentHandlerを戻します。

他のプロセスから発生する依存性が使用可能でない場合は、nullを戻します。依存性が使用可能な場合は、メソッドが最後まで実行されます。

SAXErrorHandler()

SAXのErrorHandlerを戻します。

このメソッドをオーバーライドしなかった場合、JAXBプロセッサは、このクラスに実装されているデフォルト・エラー・ハンドラを使用してSAXエラーを処理します。

関連項目:

oracle.xml.pipeline.processesパッケージの詳細は、 Oracle Database XML Java APIリファレンスを参照してください

11.2 XML Pipeline Processorの使用: 概要

内容は次のとおりです。

11.2.1 XML Pipeline Processorの使用: 基本プロセス

XML Pipeline Processorには次のパッケージを介してアクセスできます。

  • oracle.xml.pipeline.controller: 依存性に基づいてパイプラインのXMLプロセスを実行するXMLパイプライン・コントローラを提供します。

  • oracle.xml.pipeline.processes: XMLパイプライン・コントローラで実行できるXMLプロセスのラッパー・クラスを提供します。oracle.xml.pipelin.processesパッケージには、パイプライン・アプリケーション・フレームワークの設計に使用できるクラスが含まれます。各クラスは、oracle.xml.pipeline.controller.Processクラスを拡張します。

    表11-2に、パッケージに含まれるコンポーネントを示します。XML Pipeline Processorとパイプライン文書を組み合せることによって、これらのコンポーネントとプロセスを連結できます。

表11-2 oracle.xml.pipeline.processesのクラス

クラス 説明

CompressReaderProcess

圧縮されたXMLを受け取り、解析済XMLを出力します。

CompressWriterProcess

DOMまたはSAXによって解析されたXMLを受け取り、圧縮済XMLを出力します。

DOMParserProcess

受信したXMLを解析し、DOMツリーを出力します。

SAXParserProcess

受信したXMLを解析し、SAXイベントを出力します。

XPathProcess

DOMを入力として受け入れ、XPathパターンを使用してXML DocumentまたはXML DocumentFragmentから1つ以上のノードを選択し、DocumentまたはDocumentFragmentを出力します。

XSDSchemaBuilder

XMLスキーマを解析し、検証のためのスキーマ・オブジェクトを出力します。このプロセスはXML Pipeline Processorに組み込まれています。XML文書の検証に使用されるスキーマ・オブジェクトを作成します。

XSDValProcess

ローカル・スキーマと照合して検証し、結果を分析し、必要に応じてエラーを報告します。

XSLProcess

DOMを入力として受け入れ、XSLスタイルシートを適用し、変換の結果を出力します。

XSLStylesheetProcess

XSLスタイルシートをストリームまたはDOMとして受け取り、XSLStylesheetオブジェクトを作成します。

図11-2に、XML Pipeline Processorを使用するJavaアプリケーションにパイプライン文書を渡し、プロセッサを構成し、パイプラインを実行する方法を示します。

図11-2 Pipeline Processor for Javaの使用

図11-2の説明は次にあります。
「図11-2 Pipeline Processor for Javaの使用」の説明

この場合、基本的な手順は次のようになります。

  1. パイプライン実行への入力となるパイプライン文書をインスタンス化します。次のように、コンストラクタにFileReaderを渡してオブジェクトを作成します。
    PipelineDoc pipe;
    FileReader f;
    pipe = new PipelineDoc((Reader)f, false);
    
  2. パイプライン・プロセッサをインスタンス化します。PipelineProcessorは、パイプラインを実行する最上位クラスです。表11-3に、使用可能なメソッドの一部を示します。

    表11-3 PipelineProcessorメソッド

    メソッド 説明

    executePipeline()

    setPipelineDoc()を起動することによって設定したPipelineDocに基づいて、パイプラインを実行します。

    getExecutionMode()

    実行モードのタイプとしてPIPELINE_SEQUENTIALまたはPIPELINE_PARALLELを取得します。

    setErrorHandler()

    パイプラインのエラー・ハンドラを設定します。この起動はパイプラインを実行するために必須です。

    setExecutionMode()

    実行モードを設定します。PIPELINE_PARALLELは、デフォルトであり、パイプライン内のプロセスをパラレルに実行することを指定します。PIPELINE_SEQUENTIALは、パイプライン内のプロセスを順次実行することを指定します。

    setForce()

    実行の動作を設定します。TRUEの場合は、パイプライン入力についてターゲットが最新の状態であるかどうかにかかわらず、パイプラインを実行します。

    setPipelineDoc()

    パイプラインのPipelineDocオブジェクトを設定します。

    パイプライン・プロセッサをインスタンス化する文は次のとおりです。

    proc = new PipelineProcessor();
    
  3. パイプライン文書にプロセッサを設定します。次に例を示します。
    proc.setPipelineDoc(pipe);
    
  4. プロセッサの実行モードを設定し、その他の必要な構成を行います。たとえば、PipelineProcessor.setExecutionMode()に定数を渡してモードを設定します。

    次の文は、シーケンシャルな実行を指定します。

    proc.setExecutionMode(PipelineConstants.PIPELINE_SEQUENTIAL); 
    
  5. エラー・ハンドラをインスタンス化します。エラー・ハンドラは、PipelineErrorHandlerインタフェースを実装する必要があります。次に例を示します。
    errHandler = new PipelineSampleErrHdlr(logname);
    
  6. setErrorHandler()を起動することで、プロセッサに対してエラー・ハンドラを設定します。次に例を示します。
    proc.setErrorHandler(errHandler);
    
  7. パイプラインを実行します。次に例を示します。
    proc.executePipeline();

    関連項目:

11.2.2 XML Pipeline Processorのデモ・プログラムの実行

XML Pipeline Processorのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/pipelineにあります。表11-4に、ユーティリティのテストに使用できるXMLファイルとJavaソース・ファイルを示します。

表11-4 Pipeline Processorのサンプル・ファイル

ファイル 説明

README

Pipeline Processorのデモの設定方法が記述されたテキスト・ファイル。

PipelineSample.java

Pipeline Processorのサンプル・アプリケーション。このプログラムは第1引数としてpipedoc.xmlを受け取ります。

PipelineSampleErrHdlr.java

PipelineSampleで使用されるエラー・ハンドラを作成するサンプル・プログラム。

book.xml

一連の書籍を記述したサンプルXML文書。この文書は、pipedoc.xmlpipedoc2.xmlおよびpipedocerr.xmlで入力として指定されます。

book.xsl

book.xmlの書籍リストをHTML表に変換するXSLTスタイルシート。

book_err.xsl

pipedocerr.xmlパイプライン文書で入力として指定されるXSLTスタイルシート。このスタイルシートには、意図的にエラーが含まれています。

id.xsl

pipedoc3.xmlパイプライン文書で入力として指定されるXSLTスタイルシート。

items.xsd

pipedoc3.xmlパイプライン文書で入力として指定されるXMLスキーマ文書。

pipedoc.xml

パイプライン文書。このドキュメントは次の処理を指定します。(1)プロセスp1でDOMを使用してbook.xmlを解析します。(2)プロセスp2でbook.xslを解析してスタイルシート・オブジェクトを作成します。(3)プロセスp3でスタイルシートをDOMに適用してmyresult.htmlを生成します。

pipedoc2.xml

パイプライン文書。このドキュメントは次の処理を指定します。(1)プロセスp1でSAXを使用してbook.xmlを解析します。(2)プロセスp2でSAXイベントから圧縮されたXML compxmlを生成します。(3)プロセスp3で圧縮されたストリームからmyresult2.htmlをXMLとして再生成します。

pipedoc3.xml

パイプライン文書。この文書は次の処理を指定します。(1)プロセスp5でDOMを使用してpo.xmlを解析します。(2)プロセスp1でXPath式を使用してDOMツリーから1つのノードを選択します。(3)プロセスp4でitems.xsdを解析してスキーマ・オブジェクトを生成します。(4)プロセスp6で選択したノードをスキーマと照合して検証します。(5)プロセスp3でid.xslを解析してスタイルシート・オブジェクトを生成し、検証済ノードを生成してmyresult3.htmlを出力します。

pipedocerr.xml

パイプライン文書。このドキュメントは次の処理を指定します。(1)プロセスp1でDOMを使用してbook.xmlを解析します。(2)プロセスp2でbook_err.xslを解析し、エラーが検出されなかった場合はスタイルシート・オブジェクトを生成し、エラーが検出された場合はインライン・スタイルシートを適用します。(3)プロセスp3でDOMにスタイルシートを適用してmyresulterr.htmlを生成します。book_err.xslにはエラーが含まれているため、プログラムで入力XMLのテキスト・コンテンツをmyresulterr.htmlに書き込む必要があります。

po.xml

発注書を記述したサンプルXML文書。この文書は、pipedoc3.xmlで入力として指定されます。

サンプル・プログラムのコンパイル方法および実行方法は、READMEに示されています。この場合、基本的な手順は次のようになります。

  1. ディレクトリを$ORACLE_HOME/xdk/demo/java/pipelineディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\pipelineディレクトリ(Windowsの場合)に変更します。
  2. 「XDK for Java環境の設定」の説明に従って、環境変数が設定されていることを確認します。
  3. システム・プロンプトでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行して、PipelineSample.javaおよびPipelineSampleErrHdler.javaのクラス・ファイルを生成し、デモ・プログラムを実行します。出力ファイルはlogサブディレクトリに書き込まれます。

    または、次の構文を使用して、デモ・プログラムを手動で実行することもできます。

    java PipelineSample pipedoc pipelog [ seq | para ]
    

    pipedocオプションは、使用するパイプライン文書を指定します。pipelogオプションは、パイプラインのログ・ファイル名を指定します。seqまたはparaを指定した場合、ログ・ファイル名は必須ですが、それ以外の場合はオプションです。ログ・ファイルを指定しなかった場合は、デフォルトでpipeline.logが生成されます。seqオプションを指定するとスレッドは順次処理され、paraを指定するとパラレル処理されます。seqおよびparaのどちらも指定しなかった場合のデフォルトは、パラレル処理です。

  4. パイプラインから生成されたファイルおよびログ・ファイルを表示します。パイプラインから生成されるすべてのファイルは、名前の先頭に文字列myresultが付けられます。

11.2.3 XML Pipeline Processorコマンドライン・ユーティリティの使用

XML Pipeline Processorのコマンドライン・インタフェースは、orapipeと呼びます。Pipeline Processorは、Oracle Databaseにパッケージ化されています。Oracle Universal Installerを使用すると、デフォルトでディスク上の$ORACLE_HOME/binにユーティリティがインストールされます。

最初にユーティリティを実行する前に、「XDK for Java環境の設定」の説明に従って、環境変数が設定されていることを確認します。オペレーティング・システムのコマンドラインで、次の構文を使用してorapipeを実行します。

orapipe options pipedoc

pipedocはパイプライン文書であり、必須です。表11-5に、orapipeユーティリティの使用可能なオプションを示します。

表11-5orapipeのコマンドライン・オプション

オプション 用途

-help

ヘルプ・メッセージを出力します。

-log logfile

指定されたログ・ファイルにエラーおよびメッセージを書き込みます。デフォルトはpipeline.logです。

-noinfo

情報項目をログに記録しません。デフォルトはオンです。

-nowarning

警告をログに記録しません。デフォルトはオンです。

-validate

パイプライン・スキーマで入力pipedocを検証します。検証は、デフォルトでオフになっています。これは追加の機能であるため、outparam機能を使用した場合、現在のパイプライン・スキーマによるvalidateが失敗します。

-version

バージョン番号を出力します。

-sequential

シーケンシャル・モードでパイプラインを実行します。デフォルトはパラレルです。

-force

ターゲットが最新の状態にある場合でもパイプラインを実行します。デフォルトでは、forceは指定されていません。

-attr name value

$nameの値として、指定されたvalueを設定します。たとえば、属性名がsource、値がbook.xmlの場合、<input ... label="$source">と指定して、この値をパイプライン文書の要素に渡すことができます。

11.3 パイプラインでのXMLの処理

内容は次のとおりです。

11.3.1 パイプライン文書の作成

Oracle XML Pipeline Processorを使用するには、W3Cノートで指定されたPipeline Definition Languageの規則に従ってXML文書を作成する必要があります。

W3C仕様では、XML処理コンポーネントとプロセスの入力および出力が定義されています。XML Pipeline Processorには、次のXDKコンポーネントのサポートが含まれます。

  • XMLパーサー

  • XML Compressor

  • XML Schemaバリデータ

  • XSLTプロセッサ

11.3.1.1 パイプライン文書の例

XML Pipeline Processorは、パイプライン文書の規則に従って一連のXML処理を実行し、結果を戻します。例11-1に、デモ・ディレクトリに含まれているサンプル・パイプライン文書pipedoc.xmlを示します。

例11-1 pipedoc.xml

<pipeline xmlns="http://www.w3.org/2002/02/xml-pipeline"
          xml:base="http://example.org/">
 
  <param name="target" select="myresult.html"/>
 
  <processdef name="domparser.p" 
   definition="oracle.xml.pipeline.processes.DOMParserProcess"/>
  <processdef name="xslstylesheet.p"  
   definition="oracle.xml.pipeline.processes.XSLStylesheetProcess"/>
  <processdef name="xslprocess.p" 
   definition="oracle.xml.pipeline.processes.XSLProcess"/>
 
   <process id="p2" type="xslstylesheet.p" ignore-errors="false">
     <input name="xsl" label="book.xsl"/>
     <outparam name="stylesheet" label="xslstyle"/>
   </process>
 
   <process id="p3" type="xslprocess.p" ignore-errors="false">
     <param name="stylesheet" label="xslstyle"/>
     <input name="document" label="xmldoc"/>
     <output name="result" label="myresult.html"/>
   </process>
 
  <process id="p1" type="domparser.p" ignore-errors="true">
     <input name="xmlsource" label="book.xml "/>
     <output name="dom" label="xmldoc"/>
     <param name="preserveWhitespace" select="true"></param>
     <error name="dom">
       <html xmlns="http://www/w3/org/1999/xhtml">
         <head>
            <title>DOMParser Failure!</title>
         </head>
         <body>
           <h1>Error parsing document</h1>
         </body>
       </html>
     </error>
  </process>
 
</pipeline>
11.3.1.1.1 パイプライン文書に指定するプロセス

例11-1では、3つのプロセスをコールし、oracle.xml.pipeline.processesパッケージのJavaクラスに関連付けています。パイプライン文書では、<processdef/>要素を使用して、次の関連付けを作成しています。

  • domparser.pDOMParserProcessクラスの関連付け

  • xslstylesheet.pXSLStylesheetProcessクラスの関連付け

  • xslprocess.pXSLProcessクラスの関連付け

11.3.1.1.2 パイプライン文書に指定する処理アーキテクチャ

PipelineSampleプログラムでは、例11-1に示したpipedoc.xml文書の他に、XML文書のbook.xmlおよびbook.xslを入力として受け入れます。このパイプラインの基本設計は次のとおりです。

  1. 受信したbook.xml文書を解析し、DOMツリーを生成します。このタスクはDOMParserProcessによって実行されます。
  2. book.xslをストリームとして解析し、XSLStylesheetオブジェクトを生成します。このタスクはXSLStylesheetProcessによって実行されます。
  3. book.xmlのDOMを入力として受け取り、スタイルシート・オブジェクトを適用し、myresult.htmlに結果を書き込みます。このタスクはXSLProcessによって実行されます。

パイプライン文書で使用している処理アーキテクチャについて次の点に注意してください。

  • targetパラメータのデフォルト値およびxml:baseの設定から、ターゲット情報セットはhttp://example.org/myresult.htmlであると推定されます。

  • プロセスp2の入力はbook.xslです。出力パラメータにはラベルxslstyleが使用されているため、このプロセスを実行してp3への入力を生成する必要があります。

  • プロセスp3は、入力パラメータxslstyleおよび文書xmldocに依存します。

  • プロセスp3の出力パラメータには、ラベルhttp://example.org/myresult.htmlが使用されているため、このプロセスを実行してターゲットを生成する必要があります。

  • プロセスp1は、入力文書book.xmlに依存し、xmldocを出力します。したがって、このプロセスを実行してp3への入力を生成する必要があります。

例11-1では、複数の処理順序によってすべての依存性を満たすことができます。指定された規則から判断すると、XML Pipeline Processorはp3を最後に処理する必要がありますが、p1およびp2は、どちらの順番でも処理でき、パラレルで処理することもできます。

11.3.2 Pipeline Processorアプリケーションの作成

PipelineSample.javaソース・ファイルは、基本的なパイプライン・アプリケーションです。このアプリケーションでは、表11-4の任意のパイプライン文書を使用して、入力XML文書を解析および変換できます。

このプログラムの基本手順は次のとおりです。

  1. 初期設定を行います。プログラムで、FileReader型(入力XMLファイル)、PipelineDoc(入力パイプライン文書)およびPipelineProcessor(プロセッサ)の参照を宣言します。第1引数はパイプライン文書であり、必須です。第2引数を受け取った場合は、文字列lognameに格納されます。次のコード部分で、この方法を示します。
    public static void main(String[] args)
    {
      FileReader f;
      PipelineDoc pipe;
      PipelineProcessor proc;
     
      if (args.length < 1)
      {
        System.out.println("First argument needed, other arguments are ".
                           "optional:");
        System.out.println("pipedoc.xml <output_log> <'seq'>");
        return;
      }
      if (args.length > 1)
        logname = args[1];
      ...
    
  2. 最初のコマンドライン引数をファイル名としてコンストラクタに渡し、FileReaderオブジェクトを作成します。次に例を示します。
    f = new FileReader(args[0]);
    
  3. FileReaderオブジェクトへの参照を渡し、PipelineDocオブジェクトを作成します。次の例では、FileReaderReaderにキャストし、検証なしを指定しています。
    pipe = new PipelineDoc((Reader)f, false);
    
  4. XML Pipeline Processorをインスタンス化します。パイプライン・プロセッサをインスタンス化する文は次のとおりです。
    proc = new PipelineProcessor();
    
  5. パイプライン文書にプロセッサを設定します。次に例を示します。
    proc.setPipelineDoc(pipe);
    
  6. プロセッサの実行モードを設定し、その他の構成を行います。次のコード部分は、条件を使用して実行モードを決定します。プログラムに3つ以上の引数が渡された場合は、渡された引数に応じて、モードをシーケンシャルまたはパラレルに設定します。次に例を示します。
    String execMode = null;
    if (args.length > 2)
    {
       execMode = args[2];
       if(execMode.startsWith("seq"))
          proc.setExecutionMode(PipelineConstants.PIPELINE_SEQUENTIAL);
       else if (execMode.startsWith("para"))
          proc.setExecutionMode(PipelineConstants.PIPELINE_PARALLEL);
    }
    
  7. エラー・ハンドラをインスタンス化します。エラー・ハンドラは、PipelineErrorHandlerインタフェースを実装する必要があります。プログラムでは、PipelineSampleErrHdlr.javaに示されているPipelineSampleErrHdlerを使用しています。次のコード部分で、この方法を示します。
    errHandler = new PipelineSampleErrHdlr(logname);
    
  8. setErrorHandler()を起動することで、プロセッサに対してエラー・ハンドラを設定します。次の文で、この方法を示します。
    proc.setErrorHandler(errHandler);
    
  9. パイプラインを実行します。次の文で、この方法を示します。
    proc.executePipeline();

    関連項目:

    oracle.xml.pipelineのサブパッケージの詳細は、 Oracle Database XML Java APIリファレンスを参照してください

11.3.3 パイプライン・エラー・ハンドラの作成

XML Pipeline Processorを起動するアプリケーションは、プロセッサから受け取ったエラーを処理するPipelineErrorHandlerインタフェースを実装する必要があります。setErrorHandler()を起動してプロセッサのエラー・ハンドラを設定します。エラー・ハンドラを作成する場合、様々なタイプのエラーに対して例外を発生させるように指定できます。

oracle.xml.pipeline.controller.PipelineErrorHandlerインタフェースは、表11-6に示すメソッドを宣言します。これらのメソッドはすべてvoidを戻します。

表11-6 PipelineErrorHandlerメソッド

メソッド 説明

error(java.lang.String msg, PipelineException e)

PipelineExceptionエラーを処理します。

fatalError(java.lang.String msg, PipelineException e)

致命的なPipelineExceptionエラーを処理します。

warning(java.lang.String msg, PipelineException e)

PipelineException警告を処理します。

info(java.lang.String msg)

エラーに関するオプションの追加情報を出力します。

表11-6の最初の3つのメソッドは、oracle.xml.pipeline.controller.PipelineExceptionオブジェクトへの参照を受け取ります。特に有用なPipelineExceptionクラスのメソッドを次に示します。

  • getExceptionType(): スローされた例外のタイプを取得

  • getProcessId(): 例外が発生したプロセスIDを取得

  • getMessage(): このThrowableエラーのメッセージ文字列を戻す

PipelineSampleErrHdler.javaソース・ファイルは、PipelineSampleプログラムで使用される基本的なエラー・ハンドラを実装します。この場合、基本的な手順は次のようになります。

  1. コンストラクタを実装します。次に示すように、コンストラクタはログ・ファイル名を受け入れ、それをFileWriterオブジェクト内にラップします。
    PipelineSampleErrHdlr(String logFile) throws IOException
    {
      log = new PrintWriter(new FileWriter(logFile));
    }
    
  2. error()メソッドを実装します。この実装は、プロセスID、例外タイプおよびエラー・メッセージを出力します。また、エラー・カウントを保持する変数を増分します。次に例を示します。
    public void error (String msg, PipelineException e) throws Exception
    {
      log.println("\nError in: " + e.getProcessId());
      log.println("Type: " + e.getExceptionType());
      log.println("Message: " +  e.getMessage());
      log.println("Error message: " + msg);
      log.flush();
      errCount++;
    }
    
  3. fatalError()メソッドを実装します。この実装は、error()のパターンに従います。次に例を示します。
    public void fatalError (String msg, PipelineException e) throws Exception
    {
      log.println("\nFatalError in: " + e.getProcessId());
      log.println("Type: " + e.getExceptionType());
      log.println("Message: " +  e.getMessage());
      log.println("Error message: " + msg);
      log.flush();
      errCount++;
    }
    
  4. warning()メソッドを実装します。この実装は、errCount変数のかわりにwarnCount変数を増分することを除いて、error()の基本パターンに従います。次に例を示します。
    public void warning (String msg, PipelineException e) throws Exception
    {
      log.println("\nWarning in: " + e.getProcessId());
      log.println("Message: " +  e.getMessage());
      log.println("Error message: " + msg);
      log.flush();
      warnCount++;
    }
    
  5. info()メソッドを実装します。このメソッドは前述のメソッドとは異なり、PipelineExceptionの参照を入力として受け取りません。次に示す実装は、メソッドが受け取ったStringを出力し、warnCount変数の値を増分します。
    public void info (String msg)
    {
      log.println("\nInfo : " + msg);
      log.flush();
      warnCount++;   
    }
    
  6. PrintWriterをクローズするメソッドを実装します。次に示すコードは、closeLog()メソッドを実装します。このメソッドは、エラーおよび警告の数を出力し、PrintWriter.close()を起動します。
    public void closeLog()
    {
      log.println("\nTotal Errors: " + errCount + "\nTotal Warnings: " +
                   warnCount);
      log.flush();
      log.close();
    }

    関連項目:

    PipelineErrorHandlerインタフェースおよびPipelineExceptionクラスの詳細は、 Oracle Database XML Java APIリファレンスを参照してください