package jp.sfjp.mikutoga.xml;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import org.w3c.dom.ls.LSResourceResolver;
/**
- * URL変換マップに従い、XML文書からの外部参照をリダイレクトする。
- * 相対URIはこのクラスをベースに解決される。
- * 主な用途は外部スキーマのリソース化など。
+ * register & redirect original URI to local resource contents.
*/
public class XmlResourceResolver
implements LSResourceResolver{
/**
- * コンストラクタ。
+ * Constructor.
*/
public XmlResourceResolver(){
super();
}
/**
- * 絶対URIと相対URIを合成したURIを返す。
- * 正規化も行われる。
+ * merge base-uri text & relative URI text.
*
- * @param base 絶対URIでなければならない。nullでもよい。
- * @param relative 絶対URIでもよいがその場合baseは無視される。null可。
- * @return 合成結果のURLオブジェクト。必ず絶対URIになる。
- * @throws java.net.URISyntaxException URIとして変。
- * @throws java.lang.IllegalArgumentException 絶対URIが生成できない。
+ * @param base base URI text must be absolute or null.
+ * @param relative relative URI text.
+ * If absolute, base is ignored.
+ * Ignored if null.
+ * @return merged absolute URI.
+ * @throws java.net.URISyntaxException illegal URI
+ * @throws java.lang.IllegalArgumentException result is not Absolute.
*/
protected static URI buildBaseRelativeURI(String base, String relative)
throws URISyntaxException,
}
/**
- * 絶対URIと相対URIを合成したURIを返す。
- * 正規化も行われる。
+ * merge base-uri & relative URI.
*
- * @param baseURI 絶対URIでなければならない。nullでもよい。
- * @param relativeURI 絶対URIでもよいがその場合baseは無視される。
- * @return 合成結果のURLオブジェクト。必ず絶対URIになる。
- * @throws java.lang.IllegalArgumentException 絶対URIが生成できない。
+ * @param baseURI base URI must be absolute or null.
+ * @param relativeURI relative URI. If absolute, baseURI is ignored.
+ * @return merged absolute URI.
+ * @throws java.lang.IllegalArgumentException result is not Absolute.
*/
private static URI buildBaseRelativeURI(URI baseURI, URI relativeURI)
throws IllegalArgumentException {
/**
- * オリジナルURIとリダイレクト先のURIを登録する。
- * オリジナルURIへのアクセスはリダイレクトされる。
+ * map original URI & local resource URI.
*
- * @param original オリジナルURI
- * @param redirect リダイレクトURI
+ * @param original original URI
+ * @param redirect local resource URI
*/
- private void putRedirectedImpl(URI original, URI redirect){
+ public void putRedirected(URI original, URI redirect){
URI oridinalNorm = original.normalize();
URI redirectNorm = redirect.normalize();
}
/**
- * オリジナルURIとリダイレクト先のURIを登録する。
- * オリジナルURIへのアクセスはリダイレクトされる。
- *
- * @param original オリジナルURI
- * @param redirect リダイレクトURI
- */
- public void putRedirected(URI original, URI redirect){
- putRedirectedImpl(original, redirect);
- return;
- }
-
- /**
- * ローカル版リソース参照解決を登録する。
+ * add other resolver mapping.
*
- * @param lsc ローカル版リソース参照解決
- */
- public void putRedirected(LocalXmlResource lsc){
- URI original = lsc.getOriginalResource();
- if(original == null) return;
-
- URI local = lsc.getLocalResource();
-
- putRedirected(original, local);
-
- return;
- }
-
- /**
- * 別リゾルバの登録内容を追加登録する。
- *
- * @param other 別リゾルバ
+ * @param other resolver
*/
public void putRedirected(XmlResourceResolver other){
this.uriMap.putAll(other.uriMap);
}
/**
- * 登録済みリダイレクト先URIを返す。
+ * get redirected local resource URI.
*
- * @param original オリジナルURI
- * @return リダイレクト先URI。未登録の場合はnull
+ * @param original original URI
+ * @return mapped local resource URI. null if unmapped.
*/
public URI getRedirected(URI original){
URI keyURI = original.normalize();
}
/**
- * 登録済みリダイレクト先URIを返す。
+ * get redirected local input stream.
*
- * @param original オリジナルURI
- * @return リダイレクト先URI。未登録の場合はオリジナルを返す
- */
- public URI resolveRedirected(URI original){
- URI result = getRedirected(original);
- if(result == null) result = original;
- return result;
- }
-
- /**
- * 登録済みリダイレクト先リソースの入力ストリームを得る。
- *
- * @param originalURI オリジナルURI
- * @return 入力ストリーム。リダイレクト先が未登録の場合はnull
- * @throws java.io.IOException 入出力エラー。
- * もしくはリソースが見つからない。
+ * @param originalURI original URI
+ * @return mapped local resource input stream.
+ * If no mapping, return zero-length data stream.
+ * @throws java.io.IOException local resource i/o error
*/
private InputStream getXMLResourceAsStream(URI originalURI)
throws IOException{
+ InputStream result;
+
URI resourceURI = getRedirected(originalURI);
- if(resourceURI == null) return null;
+ if(resourceURI == null){
+ result = new ByteArrayInputStream(new byte[0]);
+ }else{
+ URL resourceURL = resourceURI.toURL();
+ result = resourceURL.openStream();
+ }
- URL resourceURL = resourceURI.toURL();
- InputStream is = resourceURL.openStream();
+ result = new BufferedInputStream(result);
- return is;
+ return result;
}
/**
* {@inheritDoc}
*
- * <p>URL変換したあとの入力ソースを返す。
+ * <p>Return redirected local resource data.
*
* @param type {@inheritDoc}
* @param namespaceURI {@inheritDoc}
* @param publicId {@inheritDoc}
* @param systemId {@inheritDoc}
* @param baseURI {@inheritDoc}
- * @return {@inheritDoc}
+ * @return {@inheritDoc} LSInput of local resource.
+ * If no mapping, return zero-length data.
*/
@Override
- public LSInput resolveResource(String type,
- String namespaceURI,
- String publicId,
- String systemId,
- String baseURI ){
+ public LSInput resolveResource(
+ String type,
+ String namespaceURI,
+ String publicId,
+ String systemId,
+ String baseURI ){
if(systemId == null) return null;
URI originalURI;
try{
originalURI = buildBaseRelativeURI(baseURI, systemId);
}catch(URISyntaxException e){
- return null;
+ assert false;
+ throw new AssertionError(e);
}
InputStream is;
try{
is = getXMLResourceAsStream(originalURI);
}catch(IOException e){
- return null;
+ assert false;
+ throw new AssertionError(e);
}
- if(is == null) return null;
LSInput input = createLSInput();
input.setBaseURI(baseURI);