/*
- * 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;
}
+
+
}
}