package org.tigris.juxy.builder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.tigris.juxy.util.SAXUtil; import org.tigris.juxy.util.XSLTEngineSupport; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.URIResolver; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXSource; /** * This URI resolver will return SAXSource with tracing filter applied. * * @author Pavel Sher */ public class TracingURIResolver implements URIResolver { private static final Log logger = LogFactory.getLog(TracingURIResolver.class); private URIResolver originalResolver; private XSLTEngineSupport engineSupport; public TracingURIResolver(URIResolver originalResolver, XSLTEngineSupport engineSupport) { assert originalResolver != null; this.originalResolver = originalResolver; this.engineSupport = engineSupport; } public Source resolve(String href, String base) throws TransformerException { Source source = originalResolver.resolve(href, base); if (source == null) return null; if (source instanceof DOMSource) { logger.warn("Tracing is not available for stylesheets passed as DOMSource object"); return source; } XMLReader parentReader = null; if (source instanceof SAXSource) parentReader = ((SAXSource) source).getXMLReader(); if (parentReader == null) parentReader = SAXUtil.newXMLReader(); XMLFilter tracingFilter = new TracingFilter(engineSupport); tracingFilter.setParent(parentReader); /* SimpleSerializer s = new SimpleSerializer(); s.setOutputStream(System.out); s.setParent(tracingFilter); */ SAXSource result = new SAXSource(SAXSource.sourceToInputSource(source)); result.setXMLReader(tracingFilter); return result; } }