package org.itscool.commons.document;

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
 * リスト1ではパーサのエラーを例外でキャッチしようとしましたが、XMLパーサのエラーはイベントとして発生する
 * ので、エラー・ハンドラという仕組みで取り扱うことができます。
 * エラー・ハンドラは、インタフェースorg.xml.sax.ErrorHandlerを実装することで、アプリケーション側で用意
 * します。
 *
 * 定義されているメソッドは表2の三つです。
 *
 * 表2. ErrorHandlerのメソッド 戻り値型 メソッド名(引数リスト) 概要
 * void error(SAXParseException exception)      解析継続可能なエラー。妥当性制約違反。
 * void fatalError(SAXParseException exception) 解析継続不能な深刻なエラー。整形式制約違反。
 * void warning(SAXParseException exception)    警告。
 *
 * インタフェースErrorHandlerの実装クラスとして、org.xml.sax.helpers.DefaultHandlerを使うことも可能で
 * す。
 * クラスDefaultHandlerは、インタフェースErrorHandlerのほかに、ContentHandler, DTDHandler, Entity
 * Resolverのメソッドも実装しており、このクラスを継承することで、不要なメソッドの実装を省略することが
 * できます。
 * @author kano
 */
public class XmlConfigExceptionHandler implements ErrorHandler{
    private String fileName;
    
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    
    public void warning(SAXParseException e) throws SAXException{
        String err = "warning! "+ fileName + " line=" + e.getLineNumber() + "col=" + e.getColumnNumber();
        err += "[" + e.getMessage() + "]";
        
        throw new SAXException(err);
    }
    public void error(SAXParseException e) throws SAXException{
        String err = "error! "+ fileName + " line=" + e.getLineNumber() + "col=" + e.getColumnNumber();
        err += "[" + e.getMessage() + "]";
        
        throw new SAXException(err);
    }
    public void fatalError(SAXParseException e) throws SAXException{
        String err = "fatal! "+ fileName + " line=" + e.getLineNumber() + "col=" + e.getColumnNumber();
        err += "[" + e.getMessage() + "]";
        
        throw new SAXException(err);
    }
}
