OSDN Git Service

mainエントリのパッケージを変更。
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / dxchg / XmlUtils.java
1 /*
2  * XML utilities
3  *
4  * License : The MIT License
5  * Copyright(c) 2009 olyutorskii
6  */
7
8 package jp.sfjp.jindolf.dxchg;
9
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.net.URISyntaxException;
13 import javax.xml.XMLConstants;
14 import javax.xml.parsers.DocumentBuilder;
15 import javax.xml.parsers.DocumentBuilderFactory;
16 import javax.xml.parsers.ParserConfigurationException;
17 import javax.xml.transform.stream.StreamSource;
18 import javax.xml.validation.Schema;
19 import javax.xml.validation.SchemaFactory;
20 import jp.sourceforge.jindolf.corelib.XmlResource;
21 import org.w3c.dom.ls.LSResourceResolver;
22 import org.xml.sax.EntityResolver;
23 import org.xml.sax.ErrorHandler;
24 import org.xml.sax.SAXException;
25 import org.xml.sax.SAXParseException;
26
27 /**
28  * XML関連のユーティリティ。
29  */
30 public final class XmlUtils{
31
32     private static final ErrorHandler STRICT_HANDLER = new StrictHandler();
33     private static final XmlResourceResolver RESOLVER =
34             new XmlResourceResolver();
35
36
37     /**
38      * 隠しコンストラクタ。
39      */
40     private XmlUtils(){
41         super();
42         return;
43     }
44
45
46     /**
47      * リゾルバ経由でリソースにアクセスし、
48      * 共通スキーマによるバリデーションを行うためのDocumentBuilderを生成する。
49      * @return ビルダ
50      * @throws URISyntaxException URIが不正
51      * @throws IOException 入出力エラー
52      * @throws ParserConfigurationException パーサ準備失敗
53      * @throws SAXException スキーマが変
54      */
55     public static DocumentBuilder createDocumentBuilder()
56             throws IOException,
57                    URISyntaxException,
58                    ParserConfigurationException,
59                    SAXException {
60         Schema xsdSchema = createCoreSchema(RESOLVER);
61         DocumentBuilder builder = createBuilder(xsdSchema, RESOLVER);
62
63         return builder;
64     }
65
66     /**
67      * 共通コアスキーマを得る。
68      * このスキーマはLSResourceResolverによるリダイレクトをサポートする。
69      * @param resolver リゾルバ
70      * @return スキーマ
71      * @throws URISyntaxException URIが不正
72      * @throws IOException 入出力エラー
73      * @throws SAXException スキーマが変
74      */
75     public static Schema createCoreSchema(LSResourceResolver resolver)
76             throws URISyntaxException,
77                    IOException,
78                    SAXException {
79         SchemaFactory xsdSchemaFactory =
80             SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
81         xsdSchemaFactory.setResourceResolver(resolver);
82         xsdSchemaFactory.setErrorHandler(STRICT_HANDLER);
83
84         InputStream is = XmlResource.I_URL_COREXML.openStream();
85         StreamSource source = new StreamSource(is);
86         Schema schema = xsdSchemaFactory.newSchema(source);
87
88         return schema;
89     }
90
91     /**
92      * スキーマによる妥当性検証を兼用するDocumentBuilderを生成する。
93      * @param schema スキーマ
94      * @param resolver リゾルバ
95      * @return DOM用ビルダ
96      * @throws ParserConfigurationException パーサ準備失敗
97      */
98     public static DocumentBuilder createBuilder(Schema schema,
99                                                   EntityResolver resolver)
100             throws ParserConfigurationException{
101         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
102         factory.setNamespaceAware(true);
103         factory.setValidating(false);
104         factory.setSchema(schema);
105
106         DocumentBuilder builder = factory.newDocumentBuilder();
107         builder.setErrorHandler(STRICT_HANDLER);
108         builder.setEntityResolver(resolver);
109
110         return builder;
111     }
112
113     /**
114      * スキーマ検証用の厳密なエラーハンドラ。
115      */
116     public static class StrictHandler implements ErrorHandler{
117
118         /**
119          * コンストラクタ。
120          */
121         public StrictHandler(){
122             super();
123             return;
124         }
125
126         /**
127          * {@inheritDoc}
128          * @param e {@inheritDoc} エラー情報
129          * @throws org.xml.sax.SAXException {@inheritDoc} 引数と同じ物
130          */
131         @Override
132         public void error(SAXParseException e) throws SAXException{
133             throw e;
134         }
135
136         /**
137          * {@inheritDoc}
138          * @param e {@inheritDoc} エラー情報
139          * @throws org.xml.sax.SAXException {@inheritDoc} 引数と同じ物
140          */
141         @Override
142         public void fatalError(SAXParseException e) throws SAXException{
143             throw e;
144         }
145
146         /**
147          * {@inheritDoc}
148          * @param e {@inheritDoc} エラー情報
149          * @throws org.xml.sax.SAXException {@inheritDoc} 引数と同じ物
150          */
151         @Override
152         public void warning(SAXParseException e) throws SAXException{
153             throw e;
154         }
155
156     }
157
158 }