4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sourceforge.mikutoga.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 org.xml.sax.SAXException;
26 * XML用各種スキーマのローカル参照解決基盤。
28 public abstract class LocalSchema {
33 protected LocalSchema(){
40 * XML Schema 用のスキーマファクトリを返す。
43 private static SchemaFactory newSchemaFactory(){
44 SchemaFactory schemaFactory =
45 SchemaFactory.newInstance(
46 XMLConstants.W3C_XML_SCHEMA_NS_URI
49 // schemaFactory.setFeature(name, value);
50 // schemaFactory.setProperty(name, object);
52 schemaFactory.setErrorHandler(BotherHandler.HANDLER);
60 * @param resolver リゾルバ
61 * @param lscs ローカルスキーマ情報の配列
64 public static Schema newSchema(XmlResourceResolver resolver,
65 LocalSchema... lscs ){
66 List<Source> sourceList = new LinkedList<Source>();
67 for(LocalSchema lsc : lscs){
68 if(lsc == null) continue;
69 lsc.appendToUriMap(resolver);
71 Source local = lsc.getLocalSchemaSource();
72 if(local == null) continue;
73 sourceList.add(local);
76 SchemaFactory schemaFactory = newSchemaFactory();
77 schemaFactory.setResourceResolver(resolver);
79 Source[] sources = new Source[sourceList.size()];
80 sourceList.toArray(sources);
84 if(sources.length <= 0){
85 result = schemaFactory.newSchema();
87 result = schemaFactory.newSchema(sources);
89 }catch(SAXException e){ // Build error
91 throw new AssertionError(e);
98 * オリジナル版スキーマ定義のURIを返す。
100 * スキーマの自動判定&ダウンロードが求められていると見なされる。
101 * <p>このクラスの実装では常にnullを返す。
102 * @return オリジナル版スキーマのURL。
104 public abstract URI getOriginalSchema();
107 * ローカルリソース版スキーマ定義のURIを返す。
109 * スキーマの自動判定&ダウンロードが求められていると見なされる。
110 * <p>このクラスの実装では常にnullを返す。
111 * @return ローカルリソース版スキーマのURL。
113 public abstract URI getLocalSchema();
117 * <p>ローカルスキーマのSourceを返す。
118 * @return Source 見つからなければnull
120 public Source getLocalSchemaSource(){
123 uri = getLocalSchema();
124 if(uri == null) return null;
129 }catch(MalformedURLException e){ // Build error
131 throw new AssertionError(e);
136 is = url.openStream();
137 }catch(IOException e){ // Build error
139 throw new AssertionError(e);
141 is = new BufferedInputStream(is);
143 Source result = new StreamSource(is);
149 * ローカルで解決可能なリソース参照をリゾルバに追加登録する。
150 * @param resolver リゾルバ
152 public void appendToUriMap(XmlResourceResolver resolver){
153 URI original = getOriginalSchema();
154 URI local = getLocalSchema();
156 if(original == null) return;
158 resolver.putRedirected(original, local);