4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd2xml;
10 import java.io.BufferedInputStream;
12 import java.io.IOException;
13 import java.io.InputStream;
14 import java.net.MalformedURLException;
17 import javax.xml.parsers.ParserConfigurationException;
18 import javax.xml.parsers.SAXParser;
19 import javax.xml.parsers.SAXParserFactory;
20 import javax.xml.validation.Schema;
21 import jp.sfjp.mikutoga.pmd.model.xml.Schema101009;
22 import jp.sfjp.mikutoga.pmd.model.xml.Schema130128;
23 import jp.sfjp.mikutoga.xml.BotherHandler;
24 import jp.sfjp.mikutoga.xml.NoopEntityResolver;
25 import jp.sfjp.mikutoga.xml.SchemaUtil;
26 import org.xml.sax.InputSource;
27 import org.xml.sax.SAXException;
28 import org.xml.sax.XMLReader;
33 final class XmlInputUtil {
38 private XmlInputUtil(){
40 throw new AssertionError();
45 * 実在ファイルからXML入力ソースを得る。
49 static InputSource fileToSource(File file){
52 URI uri = file.toURI();
57 }catch(MalformedURLException e){
58 // 実在File由来のURLでは起こりえない
60 throw new AssertionError(e);
63 String systemId = url.toString();
65 InputSource source = new InputSource(systemId);
71 * InputSourceからInputStreamを得る。
72 * <p>入力ソースには、少なくともバイトストリームか
73 * URL文字列(SystemId)のいずれかが設定されていなければならない。
76 * @throws IllegalArgumentException 入力ソースの設定が足りない。
77 * @throws IOException 入力ソースにアクセス不能。
79 static InputStream openInputSource(InputSource source)
80 throws IllegalArgumentException, IOException{
83 is = source.getByteStream();
86 String systemId = source.getSystemId();
87 if(systemId == null) throw new IllegalArgumentException();
89 URL url = new URL(systemId);
90 is = url.openStream();
93 is = new BufferedInputStream(is);
101 * <li>XML名前空間機能は有効になる。
102 * <li>DTDによる形式検証は無効となる。
103 * <li>XIncludeによる差し込み機能は無効となる。
108 private static SAXParserFactory buildFactory(Schema schema){
109 SAXParserFactory factory = SAXParserFactory.newInstance();
111 factory.setNamespaceAware(true);
112 factory.setValidating(false);
113 factory.setXIncludeAware(false);
114 // factory.setFeature(name, value);
116 factory.setSchema(schema);
126 private static SAXParser buildParser(Schema schema){
127 SAXParserFactory factory = buildFactory(schema);
131 parser = factory.newSAXParser();
132 }catch(ParserConfigurationException | SAXException e){
134 throw new AssertionError(e);
137 // parser.setProperty(name, value);
144 * @param resolver リゾルバ
145 * @param xmlInType 入力XML種別
148 private static Schema buildSchema(ModelFileType xmlInType ){
152 schemaUris = new URI[]{
153 Schema101009.RES_SCHEMA_PMDXML,
157 schemaUris = new URI[]{
158 Schema130128.RES_SCHEMA_PMDXML,
162 schemaUris = new URI[]{
163 Schema101009.RES_SCHEMA_PMDXML,
164 Schema130128.RES_SCHEMA_PMDXML,
168 throw new IllegalStateException();
173 schema = SchemaUtil.newSchema(schemaUris);
174 }catch(IOException | SAXException e){
176 throw new AssertionError(e);
184 * <p>エラーハンドラには{@link BotherHandler}が指定される。
185 * @param xmlInType 入力XML種別
188 static XMLReader buildReader(ModelFileType xmlInType){
189 Schema schema = buildSchema(xmlInType);
191 SAXParser parser = buildParser(schema);
195 reader = parser.getXMLReader();
196 }catch(SAXException e){
198 throw new AssertionError(e);
201 reader.setEntityResolver(NoopEntityResolver.NOOP_RESOLVER);
202 reader.setErrorHandler(BotherHandler.HANDLER);