package org.toobsframework.transformpipeline.domain;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
public class XSLUriResolverImpl implements URIResolver {
/**
* To get the logger instance
*/
private static Log log = LogFactory.getLog(XSLUriResolverImpl.class);
private String[] base = new String[]{"xsl/"};
public XSLUriResolverImpl() {
}
public XSLUriResolverImpl(String[] base) {
this.base = base;
}
public Source resolve(String xslFile, String base) throws TransformerException {
if (log.isDebugEnabled())
log.debug("ENTER XSLUriResolverImpl.resolve('" + xslFile + "', '" + base + "');");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStreamReader reader = null;
StreamSource xslSource = null;
URL configFileURL = null;
String systemId = null;
for (int i = 0; i < this.base.length; i++) {
systemId = this.base[i] + xslFile;
if (log.isDebugEnabled())
log.debug("Checking for: " + systemId);
configFileURL = classLoader.getResource(systemId);
if (null != configFileURL) {
break;
}
}
// If the file exists, read it.
if (null != configFileURL) {
try {
reader = new InputStreamReader(configFileURL.openStream());
xslSource = new StreamSource(reader);
xslSource.setSystemId(systemId);
} catch (IOException e) {
log.error("XSL File " + xslFile + " had IOException " + e.getMessage());
if (reader != null) {
try {
reader.close();
} catch (IOException ignore) { }
}
throw new TransformerException("xsl " + xslFile + " cannot be loaded");
}
} else {
log.error("XSL File " + xslFile + " does not exist for component ");
throw new TransformerException("xsl " + xslFile + " does not exist");
}
if (log.isDebugEnabled())
log.debug("EXIT XSLUriResolverImpl.resolve('" + xslFile + "', '" + base + "');");
return xslSource;
}
}