/*
 * ValidationErrorHandler.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * XMLスキーマでXMLファイル妥当性検証エラーハンドルクラス。<br>
 * @author Jianming Guo
 */
public class ValidationErrorHandler implements ErrorHandler {
	/** ログ */
	private static final Log LOG = LogFactory.getLog(ValidationErrorHandler.class);

	/**
	 * 妥当性検証結果:true＝有効  false＝エラー
	 */
	private boolean isValid = true;

	/**
	 * 妥当性検証結果を返します。
	 *
	 * @return 妥当性検証結果
	 */
	public boolean isValid() {
		return isValid;
	}

	/**
	 * XMLパーサの致命なエラー処理。
	 *
	 * @param exception SAX構文解析例外
	 * @throws SAXException SAX 例外
	 */
	public void error(SAXParseException exception) throws SAXException {
		LOG.error("(" + getSystemId(exception)
				+ ":" + exception.getLineNumber() + ") "
				+ exception.getMessage());

		isValid = false;
	}

	/**
	 * XMLパーサの致命なエラー処理。
	 *
	 * @param exception SAX構文解析例外
	 * @throws SAXException SAX 例外
	 */
	public void fatalError(SAXParseException exception)  throws SAXException {
		LOG.error("(" + getSystemId(exception)
				+ ":" + exception.getLineNumber() + ") "
				+ exception.getMessage());

		isValid = false;
	}

	/**
	 * XMLパーサの警告エラー処理。
	 *
	 * @param exception SAX構文解析例外
	 * @throws SAXException SAX 例外
	 */
	public void warning(SAXParseException exception)  throws SAXException {
		LOG.error("(" + getSystemId(exception)
				+ ":" + exception.getLineNumber() + ") "
				+ exception.getMessage());

		isValid = false;
	}

	/**
	 * SAX例外のシステム識別IDのファイルのみを取得します。
	 *
	 * @param exception SAX構文解析例外
	 * @return ファイル名
	 */
	private String getSystemId(SAXParseException exception) {
		String systemId = exception.getSystemId();
		return systemId == null ? "" : systemId.substring(systemId.lastIndexOf('/') + 1);
	}
}
