--- /dev/null
+/*\r
+ * XML utilities\r
+ *\r
+ * Copyright(c) 2009 olyutorskii\r
+ * $Id: XmlUtils.java 888 2009-11-04 06:23:35Z olyutorskii $\r
+ */\r
+\r
+package jp.sourceforge.jindolf;\r
+\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.net.URISyntaxException;\r
+import javax.xml.XMLConstants;\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+import javax.xml.parsers.ParserConfigurationException;\r
+import javax.xml.transform.stream.StreamSource;\r
+import javax.xml.validation.Schema;\r
+import javax.xml.validation.SchemaFactory;\r
+import jp.sourceforge.jindolf.corelib.XmlResource;\r
+import org.w3c.dom.ls.LSResourceResolver;\r
+import org.xml.sax.EntityResolver;\r
+import org.xml.sax.ErrorHandler;\r
+import org.xml.sax.SAXException;\r
+import org.xml.sax.SAXParseException;\r
+\r
+/**\r
+ * XML関連のユーティリティ。\r
+ */\r
+public final class XmlUtils{\r
+\r
+ private static final ErrorHandler STRICT_HANDLER = new StrictHandler();\r
+ private static final XmlResourceResolver RESOLVER =\r
+ new XmlResourceResolver();\r
+\r
+ /**\r
+ * リゾルバ経由でリソースにアクセスし、\r
+ * 共通スキーマによるバリデーションを行うためのDocumentBuilderを生成する。\r
+ * @return ビルダ\r
+ * @throws URISyntaxException URIが不正\r
+ * @throws IOException 入出力エラー\r
+ * @throws ParserConfigurationException パーサ準備失敗\r
+ * @throws SAXException スキーマが変\r
+ */\r
+ public static DocumentBuilder createDocumentBuilder()\r
+ throws IOException,\r
+ URISyntaxException,\r
+ ParserConfigurationException,\r
+ SAXException {\r
+ Schema xsdSchema = createCoreSchema(RESOLVER);\r
+ DocumentBuilder builder = createBuilder(xsdSchema, RESOLVER);\r
+\r
+ return builder;\r
+ }\r
+\r
+ /**\r
+ * 共通コアスキーマを得る。\r
+ * このスキーマはLSResourceResolverによるリダイレクトをサポートする。\r
+ * @param resolver リゾルバ\r
+ * @return スキーマ\r
+ * @throws URISyntaxException URIが不正\r
+ * @throws IOException 入出力エラー\r
+ * @throws SAXException スキーマが変\r
+ */\r
+ public static Schema createCoreSchema(LSResourceResolver resolver)\r
+ throws URISyntaxException,\r
+ IOException,\r
+ SAXException {\r
+ SchemaFactory xsdSchemaFactory =\r
+ SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);\r
+ xsdSchemaFactory.setResourceResolver(resolver);\r
+ xsdSchemaFactory.setErrorHandler(STRICT_HANDLER);\r
+\r
+ InputStream is = XmlResource.I_URL_COREXML.openStream();\r
+ StreamSource source = new StreamSource(is);\r
+ Schema schema = xsdSchemaFactory.newSchema(source);\r
+\r
+ return schema;\r
+ }\r
+\r
+ /**\r
+ * スキーマによる妥当性検証を兼用するDocumentBuilderを生成する。\r
+ * @param schema スキーマ\r
+ * @param resolver リゾルバ\r
+ * @return DOM用ビルダ\r
+ * @throws ParserConfigurationException パーサ準備失敗\r
+ */\r
+ public static DocumentBuilder createBuilder(Schema schema,\r
+ EntityResolver resolver)\r
+ throws ParserConfigurationException{\r
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
+ factory.setNamespaceAware(true);\r
+ factory.setValidating(false);\r
+ factory.setSchema(schema);\r
+\r
+ DocumentBuilder builder = factory.newDocumentBuilder();\r
+ builder.setErrorHandler(STRICT_HANDLER);\r
+ builder.setEntityResolver(resolver);\r
+\r
+ return builder;\r
+ }\r
+\r
+ /**\r
+ * 隠しコンストラクタ。\r
+ */\r
+ private XmlUtils(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * スキーマ検証用の厳密なエラーハンドラ。\r
+ */\r
+ public static class StrictHandler implements ErrorHandler{\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ */\r
+ public StrictHandler(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * {@inheritDoc}\r
+ * @param e {@inheritDoc} エラー情報\r
+ * @throws org.xml.sax.SAXException {@inheritDoc} 引数と同じ物\r
+ */\r
+ public void error(SAXParseException e) throws SAXException{\r
+ throw e;\r
+ }\r
+\r
+ /**\r
+ * {@inheritDoc}\r
+ * @param e {@inheritDoc} エラー情報\r
+ * @throws org.xml.sax.SAXException {@inheritDoc} 引数と同じ物\r
+ */\r
+ public void fatalError(SAXParseException e) throws SAXException{\r
+ throw e;\r
+ }\r
+\r
+ /**\r
+ * {@inheritDoc}\r
+ * @param e {@inheritDoc} エラー情報\r
+ * @throws org.xml.sax.SAXException {@inheritDoc} 引数と同じ物\r
+ */\r
+ public void warning(SAXParseException e) throws SAXException{\r
+ throw e;\r
+ }\r
+\r
+ }\r
+\r
+}\r