OSDN Git Service

Merge commit '2458eff3aea04f67893bc824b5cf896fbb767332'
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / XmlUtils.java
diff --git a/src/main/java/jp/sourceforge/jindolf/XmlUtils.java b/src/main/java/jp/sourceforge/jindolf/XmlUtils.java
new file mode 100644 (file)
index 0000000..64cf58d
--- /dev/null
@@ -0,0 +1,153 @@
+/*\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