2 * local xml schema for PMD-XML
4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.xml;
10 import java.io.BufferedInputStream;
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.net.MalformedURLException;
16 import java.util.LinkedList;
17 import java.util.List;
18 import javax.xml.XMLConstants;
19 import javax.xml.transform.Source;
20 import javax.xml.transform.stream.StreamSource;
21 import javax.xml.validation.Schema;
22 import javax.xml.validation.SchemaFactory;
23 import jp.sourceforge.mikutoga.xml.XmlResourceResolver;
24 import org.xml.sax.SAXException;
27 * XML用各種スキーマのローカル参照解決基盤。
29 public abstract class LocalSchema {
34 protected LocalSchema(){
41 * XML Schema 用のスキーマファクトリを返す。
44 private static SchemaFactory newSchemaFactory(){
45 SchemaFactory schemaFactory =
46 SchemaFactory.newInstance(
47 XMLConstants.W3C_XML_SCHEMA_NS_URI
50 // schemaFactory.setFeature(name, value);
51 // schemaFactory.setProperty(name, object);
53 schemaFactory.setErrorHandler(BotherHandler.HANDLER);
61 * @param resolver リゾルバ
62 * @param lscs ローカルスキーマ情報の配列
65 public static Schema newSchema(XmlResourceResolver resolver,
66 LocalSchema... lscs ){
67 List<Source> sourceList = new LinkedList<Source>();
68 for(LocalSchema lsc : lscs){
69 if(lsc == null) continue;
70 lsc.appendToUriMap(resolver);
72 Source local = lsc.getLocalSchemaSource();
73 if(local == null) continue;
74 sourceList.add(local);
77 SchemaFactory schemaFactory = newSchemaFactory();
78 schemaFactory.setResourceResolver(resolver);
80 Source[] sources = new Source[sourceList.size()];
81 sourceList.toArray(sources);
85 if(sources.length <= 0){
86 result = schemaFactory.newSchema();
88 result = schemaFactory.newSchema(sources);
90 }catch(SAXException e){ // Build error
92 throw new AssertionError(e);
99 * オリジナル版スキーマ定義のURIを返す。
101 * スキーマの自動判定&ダウンロードが求められていると見なされる。
102 * <p>このクラスの実装では常にnullを返す。
103 * @return オリジナル版スキーマのURL。
105 public abstract URI getOriginalSchema();
108 * ローカルリソース版スキーマ定義のURIを返す。
110 * スキーマの自動判定&ダウンロードが求められていると見なされる。
111 * <p>このクラスの実装では常にnullを返す。
112 * @return ローカルリソース版スキーマのURL。
114 public abstract URI getLocalSchema();
118 * <p>ローカルスキーマのSourceを返す。
119 * @return Source 見つからなければnull
121 public Source getLocalSchemaSource(){
124 uri = getLocalSchema();
125 if(uri == null) return null;
130 }catch(MalformedURLException e){ // Build error
132 throw new AssertionError(e);
137 is = url.openStream();
138 }catch(IOException e){ // Build error
140 throw new AssertionError(e);
142 is = new BufferedInputStream(is);
144 Source result = new StreamSource(is);
150 * ローカルで解決可能なリソース参照をリゾルバに追加登録する。
151 * @param resolver リゾルバ
153 public void appendToUriMap(XmlResourceResolver resolver){
154 URI original = getOriginalSchema();
155 URI local = getLocalSchema();
157 if(original == null) return;
159 resolver.putRedirected(original, local);