import java.util.Map;
import org.w3c.dom.ls.LSInput;
import org.w3c.dom.ls.LSResourceResolver;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
/**
* URL変換マップに従い、XML文書からの外部参照をリダイレクトする。
* 主な用途は外部スキーマのリソース化など。
*/
public class XmlResourceResolver
- implements LSResourceResolver, EntityResolver {
+ implements LSResourceResolver{
/** XML Schema. */
public static final String SCHEMA_XML =
assert this.getClass().equals(THISCLASS);
Map<URI, URI> map;
- map = new HashMap<URI, URI>();
+ map = new HashMap<>();
map = Collections.synchronizedMap(map);
this.uriMap = map;
/**
* 絶対URIと相対URIを合成したURIを返す。
* 正規化も行われる。
+ *
* @param base 絶対URIでなければならない。nullでもよい。
* @param relative 絶対URIでもよいがその場合baseは無視される。null可。
* @return 合成結果のURLオブジェクト。必ず絶対URIになる。
relativeURI = EMPTY_URI;
}
+ URI result = buildBaseRelativeURI(baseURI, relativeURI);
+ return result;
+ }
+
+ /**
+ * 絶対URIと相対URIを合成したURIを返す。
+ * 正規化も行われる。
+ *
+ * @param baseURI 絶対URIでなければならない。nullでもよい。
+ * @param relativeURI 絶対URIでもよいがその場合baseは無視される。
+ * @return 合成結果のURLオブジェクト。必ず絶対URIになる。
+ * @throws java.lang.IllegalArgumentException 絶対URIが生成できない。
+ */
+ private static URI buildBaseRelativeURI(URI baseURI, URI relativeURI)
+ throws IllegalArgumentException {
URI resultURI;
+
if(baseURI == null || relativeURI.isAbsolute()){
resultURI = relativeURI;
}else{
* @param originalURI オリジナルURI
* @return 入力ストリーム。リダイレクト先が未登録の場合はnull
* @throws java.io.IOException 入出力エラー。
- * もしくはリソースが見つからない。
+ * もしくはリソースが見つからない。
*/
private InputStream getXMLResourceAsStream(URI originalURI)
throws IOException{
return input;
}
- /**
- * {@inheritDoc}
- * URL変換したあとの入力ソースを返す。
- * @param publicId {@inheritDoc}
- * @param systemId {@inheritDoc}
- * @return {@inheritDoc}
- * @throws org.xml.sax.SAXException {@inheritDoc}
- * @throws java.io.IOException {@inheritDoc}
- */
- @Override
- public InputSource resolveEntity(String publicId, String systemId)
- throws SAXException, IOException{
- if(systemId == null) return null;
-
- URI originalUri;
- try{
- originalUri = new URI(systemId);
- }catch(URISyntaxException e){
- return null;
- }
-
- InputStream is = getXMLResourceAsStream(originalUri);
- if(is == null) return null;
-
- InputSource source = new InputSource(is);
- source.setPublicId(publicId);
- source.setSystemId(systemId);
-
- return source;
- }
/**
* JRE1.5用LSInput実装。