OSDN Git Service

strictry inhibit unknown mapping.
authorOlyutorskii <olyutorskii@users.osdn.me>
Tue, 25 Jun 2019 13:10:54 +0000 (22:10 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Tue, 25 Jun 2019 13:10:54 +0000 (22:10 +0900)
src/main/java/jp/sfjp/mikutoga/xml/XmlResourceResolver.java

index 5af9789..bf5ba8e 100644 (file)
@@ -7,6 +7,8 @@
 
 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;
@@ -22,9 +24,7 @@ import org.w3c.dom.ls.LSInput;
 import org.w3c.dom.ls.LSResourceResolver;
 
 /**
- * URL変換マップに従い、XML文書からの外部参照をリダイレクトする。
- * 相対URIはこのクラスをベースに解決される。
- * 主な用途は外部スキーマのリソース化など。
+ * register &amp; redirect original URI to local resource contents.
  */
 public class XmlResourceResolver
         implements LSResourceResolver{
@@ -49,7 +49,7 @@ public class XmlResourceResolver
 
 
     /**
-     * コンストラクタ。
+     * Constructor.
      */
     public XmlResourceResolver(){
         super();
@@ -100,14 +100,15 @@ public class XmlResourceResolver
     }
 
     /**
-     * 絶対URIと相対URIを合成したURIを返す。
-     * 正規化も行われる。
+     * merge base-uri text &amp; 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,
@@ -134,13 +135,12 @@ public class XmlResourceResolver
     }
 
     /**
-     * 絶対URIと相対URIを合成したURIを返す。
-     * 正規化も行われる。
+     * merge base-uri &amp; 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 {
@@ -163,13 +163,12 @@ public class XmlResourceResolver
 
 
     /**
-     * オリジナルURIとリダイレクト先のURIを登録する。
-     * オリジナルURIへのアクセスはリダイレクトされる。
+     * map original URI &amp; 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();
 
@@ -179,37 +178,9 @@ public class XmlResourceResolver
     }
 
     /**
-     * オリジナル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);
@@ -217,10 +188,10 @@ public class XmlResourceResolver
     }
 
     /**
-     * 登録済みリダイレクト先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();
@@ -229,70 +200,67 @@ public class XmlResourceResolver
     }
 
     /**
-     * 登録済みリダイレクト先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);