(no commit message)
[utils] / support / general / src / main / java / org / wamblee / xml / ClasspathUriResolver.java
index ba2d875c3aeb591e2e13829dc47cd88c4bb780cf..cad0cb2f388fb3ddab48b81545f6621b229eb8df 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005 the original author or authors.
+ * Copyright 2005-2011 the original author or authors.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.wamblee.xml;
 
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
+import org.wamblee.io.ClassPathResource;
+import org.wamblee.io.InputResource;
+
 import java.io.IOException;
+import java.io.InputStream;
 
 import javax.xml.transform.Source;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.URIResolver;
 import javax.xml.transform.stream.StreamSource;
 
-import org.wamblee.io.ClassPathResource;
-import org.wamblee.io.InputResource;
-
 /**
  * URI resolver that resolves stylesheets through the classpath.
  */
-public class ClasspathUriResolver implements URIResolver {
-
+public class ClasspathUriResolver implements URIResolver, LSResourceResolver {
+    
+    private String base; 
+    
     /**
      * Constructs the resolver.
      * 
      */
     public ClasspathUriResolver() {
-        // Empty.
+        base = null; 
+    }
+    
+    /**
+     * Location in the classpath relative to which resolution takes place. 
+     * @param aBase Base. 
+     */
+    public ClasspathUriResolver(String aBase) { 
+        base = aBase;
     }
 
     /*
      * (non-Javadoc)
      * 
      * @see javax.xml.transform.URIResolver#resolve(java.lang.String,
-     *      java.lang.String)
+     * java.lang.String)
      */
     public Source resolve(String aHref, String aBase)
-            throws TransformerException {
-        InputResource xslt = new ClassPathResource(aHref);
+        throws TransformerException {
+        
+        InputResource xslt = resolveImpl(aHref);
+
         try {
             return new StreamSource(xslt.getInputStream());
         } catch (IOException e) {
             throw new TransformerException(
-                    "Could not get XSLT style sheet in classpath '" + aHref
-                            + "'", e);
+                "Could not get XSLT style sheet in classpath '" + aHref + "'",
+                e);
+        }
+    }
+
+    private InputResource resolveImpl(String aHref) {
+        String systemId = aHref;
+        if ( base != null ) { 
+             systemId = base + "/" + aHref;
+        }
+        InputResource xslt = new ClassPathResource(systemId);
+        return xslt;
+    }
+
+    @Override
+    public LSInput resolveResource(String aType, String aNamespaceURI,
+        String aPublicId, String aSystemId, String aBaseURI) {
+        try {
+            InputStream xslt = resolveImpl(aSystemId).getInputStream();
+            DOMImplementationLS impl = DomUtils.getDomImplementationLS();
+            LSInput input = impl.createLSInput();
+            input.setPublicId(aPublicId);
+            input.setSystemId(aSystemId);
+            input.setByteStream(xslt);
+            return input;
+        } catch (IOException e) {
+            return null;
         }
+       
+       
     }
 
 }