OSDN Git Service

91d04067c38e7216a1bf486b240e1721cb2251af
[mikutoga/Pmd2XML.git] / src / main / java / jp / sfjp / mikutoga / pmd2xml / XmlInputUtil.java
1 /*
2  * xml input utility
3  *
4  * License : The MIT License
5  * Copyright(c) 2013 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.pmd2xml;
9
10 import javax.xml.parsers.ParserConfigurationException;
11 import javax.xml.parsers.SAXParser;
12 import javax.xml.parsers.SAXParserFactory;
13 import javax.xml.validation.Schema;
14 import jp.sfjp.mikutoga.pmd.model.xml.Schema101009;
15 import jp.sfjp.mikutoga.pmd.model.xml.Schema130128;
16 import jp.sfjp.mikutoga.xml.BotherHandler;
17 import jp.sfjp.mikutoga.xml.LocalXmlResource;
18 import jp.sfjp.mikutoga.xml.SchemaUtil;
19 import jp.sfjp.mikutoga.xml.XmlResourceResolver;
20 import org.xml.sax.SAXException;
21 import org.xml.sax.XMLReader;
22
23 /**
24  * XML入力に関する各種ユーティリティ。
25  */
26 final class XmlInputUtil {
27
28     /**
29      * 隠しコンストラクタ。
30      */
31     private XmlInputUtil(){
32         assert false;
33         throw new AssertionError();
34     }
35
36
37     /**
38      * SAXパーサファクトリを生成する。
39      * <ul>
40      * <li>XML名前空間機能は有効になる。
41      * <li>DTDによる形式検証は無効となる。
42      * <li>XIncludeによる差し込み機能は無効となる。
43      * </ul>
44      * @param schema スキーマ
45      * @return ファクトリ
46      */
47     private static SAXParserFactory buildFactory(Schema schema){
48         SAXParserFactory factory = SAXParserFactory.newInstance();
49
50         factory.setNamespaceAware(true);
51         factory.setValidating(false);
52         factory.setXIncludeAware(false);
53 //      factory.setFeature(name, value);
54
55         factory.setSchema(schema);
56
57         return factory;
58     }
59
60     /**
61      * SAXパーサを生成する。
62      * @param schema スキーマ
63      * @return SAXパーサ
64      */
65     private static SAXParser buildParser(Schema schema){
66         SAXParserFactory factory = buildFactory(schema);
67
68         SAXParser parser;
69         try{
70             parser = factory.newSAXParser();
71         }catch(ParserConfigurationException e){
72             assert false;
73             throw new AssertionError(e);
74         }catch(SAXException e){
75             assert false;
76             throw new AssertionError(e);
77         }
78
79 //      parser.setProperty(name, value);
80
81         return parser;
82     }
83
84     /**
85      * スキーマを生成する。
86      * @param resolver リゾルバ
87      * @param xmlInType 入力XML種別
88      * @return スキーマ
89      */
90     private static Schema builsSchema(XmlResourceResolver resolver,
91                                         ModelFileType xmlInType ){
92         LocalXmlResource[] schemaArray;
93         switch(xmlInType){
94         case XML_101009:
95             schemaArray = new LocalXmlResource[]{
96                 Schema101009.SINGLETON,
97             };
98             break;
99         case XML_130128:
100             schemaArray = new LocalXmlResource[]{
101                 Schema130128.SINGLETON,
102             };
103             break;
104         case XML_AUTO:
105             schemaArray = new LocalXmlResource[]{
106                 Schema101009.SINGLETON,
107                 Schema130128.SINGLETON,
108             };
109             break;
110         default:
111             throw new IllegalStateException();
112         }
113
114         Schema schema = SchemaUtil.newSchema(resolver, schemaArray);
115
116         return schema;
117     }
118
119     /**
120      * XMLリーダを生成する。
121      * <p>エラーハンドラには{@link BotherHandler}が指定される。
122      * @param xmlInType 入力XML種別
123      * @return XMLリーダ
124      */
125     static XMLReader buildReader(ModelFileType xmlInType){
126         XmlResourceResolver resolver = new XmlResourceResolver();
127
128         Schema schema = builsSchema(resolver, xmlInType);
129
130         SAXParser parser = buildParser(schema);
131
132         XMLReader reader;
133         try{
134             reader = parser.getXMLReader();
135         }catch(SAXException e){
136             assert false;
137             throw new AssertionError(e);
138         }
139
140         reader.setEntityResolver(resolver);
141         reader.setErrorHandler(BotherHandler.HANDLER);
142
143         return reader;
144     }
145
146 }