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

import java.net.URL;

import jp.co.cybec.cb3.exception.ConfigFileDefinitionException;
import jp.co.cybec.cb3.util.logging.ErrorCodeConstant;
import jp.co.cybec.cb3.util.logging.LogMessageConstant;
import jp.co.cybec.cb3.util.logging.LogMessageFactory;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
 * XMLスキーマエンティティを解決するクラス。
 *
 * @author Jianming Guo
 */
public class ValidationEntityResolver implements EntityResolver {

	/** メッセージ */
	private static final LogMessageFactory MESSAGE = new LogMessageFactory(
			LogMessageConstant.CB3_MESSAGE_FILENAME);

	/** XMLスキーマファイルパス */
	private static final String SCHEMA_FILE_PATH = "schema/";

	/** XMLファイル名(エラーメッセージ用) */
	private URL xmlFile = null;

	/**
	 * XMLスキーマファイルリソースを返します。
	 *
	 * @param publicId 参照しているエンティティの識別ID
	 * @param systemId 参照しているエンティティのシステム識別ID
	 * @return XMLスキーマファイルURL
	 * @exception SAXException パーサ例外発生の場合
	 * @exception ConfigFileDefinitionException 設定ファイルに指定しているXMLスキーマファイルが正しくない場合
	 */
	public InputSource resolveEntity(String publicId, String systemId)
		throws SAXException, ConfigFileDefinitionException {
		String entityURL = null;

		if (publicId != null) {
			entityURL = publicId;
		}

		if (entityURL == null && systemId != null) {
			// ファイル名のみを取得
			entityURL = systemId.substring(systemId.lastIndexOf('/') + 1);
		}

		if (entityURL == null) {
			throw new ConfigFileDefinitionException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.UTIL_009, LogMessageConstant.CB3_UTIL_001, this.xmlFile,
					".xsd"));
		}

		// XMLスキーマファイルURLを作成
		URL url = ValidationEntityResolver.class.getClassLoader().
						getResource(SCHEMA_FILE_PATH  + entityURL);
		if (url == null) {
			throw new ConfigFileDefinitionException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.UTIL_010, LogMessageConstant.CB3_UTIL_001, this.xmlFile,
					entityURL));
		}

		try {
			return new InputSource(url.toString());
		} catch (Exception e) {
			throw new ConfigFileDefinitionException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.UTIL_011, LogMessageConstant.CB3_UTIL_001, this.xmlFile,
					entityURL), e);
		}
	}

	/**
	 * XMLファイル名を設定します。
	 *
	 * @param xmlFile XMLファイル名
	 */
	public void setXmlFile(URL xmlFile) {
		this.xmlFile = xmlFile;
	}
}
