// Set up context class loader for SAXParserFactory and
// TransformerFactory calls below:
setContextClassLoader(this.getClass().getClassLoader());
for (Enumeration e = listeners.elements(); e.hasMoreElements();) {
XStreamListener l = (XStreamListener) e.nextElement();
l.started();
}
XSeekable xseek = (XSeekable) UnoRuntime.queryInterface(XSeekable.class, m_xis);
if (xseek != null) {
xseek.seek(0);
}
is = new BufferedInputStream(
new XInputStreamToInputStreamAdapter(m_xis));
//Source xmlsource = new StreamSource(xmlinput);
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(false);
spf.setNamespaceAware(true);
XMLReader xmlReader = spf.newSAXParser().getXMLReader();
xmlReader.setEntityResolver(XSLTransformer.this);
source = new SAXSource(xmlReader, new InputSource(is));
// in order to help performance and to remedy a a possible memory
// leak in xalan, where it seems, that Transformer instances cannot
// be reclaimed though they are no longer referenced here, we use
// a cache of weak references to transformers created for specific
// style sheet URLs see also #i48384#
Transformer transformer = null;
Transformation transformation = null;
// File stylefile = new File(new URI(stylesheeturl));
long lastmod = 0;
try {
URL uStyle = new URL(stylesheeturl);
URLConnection c = uStyle.openConnection();
lastmod = c.getLastModified();
} catch (java.lang.Exception ex) {
// lastmod will remain at 0;
if (statsp != null) {
statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
ex.printStackTrace(statsp);
}
}
synchronized (transformers) {
java.lang.ref.WeakReference ref = null;
// try to get the transformer reference from the cache
if ((ref = (java.lang.ref.WeakReference) transformers.get(stylesheeturl)) == null ||
(transformation = ((Transformation) ref.get())) == null ||
((Transformation) ref.get()).lastmod < lastmod) {
// we cannot find a valid reference for this stylesheet
// or the stylsheet was updated
if (ref != null) {
transformers.remove(stylesheeturl);
}
// create new transformer for this stylesheet
TransformerFactory tfactory = TransformerFactory.newInstance();
debug("TransformerFactory is '" + tfactory.getClass().getName() + "'");
transformer = tfactory.newTransformer(new StreamSource(stylesheeturl));
transformer.setOutputProperty("encoding", "UTF-8");
// transformer.setURIResolver(XSLTransformer.this);
// store the transformation into the cache
transformation = new Transformation();
transformation.lastmod = lastmod;
transformation.transformer = transformer;
ref = new java.lang.ref.WeakReference(transformation);
transformers.put(stylesheeturl, ref);
}
}
transformer = transformation.transformer;
// invalid to set 'null' as parameter as 'null' is not a valid Java object
if (sourceurl != null) {
transformer.setParameter("sourceURL", sourceurl);
}
if (sourcebaseurl != null) {
transformer.setParameter("sourceBaseURL", sourcebaseurl);
}
if (targeturl != null) {
transformer.setParameter("targetURL", targeturl);
}
if (targetbaseurl != null) {
transformer.setParameter("targetBaseURL", targetbaseurl);
}
if (pubtype != null) {
transformer.setParameter("publicType", pubtype);
}
if (systype != null) {
transformer.setParameter("systemType", systype);
}
if (svcfactory != null) {
transformer.setParameter("XMultiServiceFactory", svcfactory);
}
os = new BufferedOutputStream(
new XOutputStreamToOutputStreamAdapter(m_xos));
StreamResult sr = new StreamResult(os);
long tstart = System.currentTimeMillis();
transformer.transform(source, sr);
debug("finished transformation in " + (System.currentTimeMillis() - tstart) + "ms");
} catch (java.lang.Throwable ex) {
// notify any listeners about close
for (Enumeration e = listeners.elements(); e.hasMoreElements();) {
XStreamListener l = (XStreamListener) e.nextElement();
l.error(new com.sun.star.uno.Exception(ex.getClass().getName() + ": " + ex.getMessage()));
}
if (statsp != null) {
statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
ex.printStackTrace(statsp);
}
} finally {
// dereference input buffer
source = null;
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (m_xis != null) {
m_xis.closeInput();
}
if (m_xos != null) {
m_xos.closeOutput();
}
} catch (java.lang.Throwable ex) {
if (statsp != null) {
statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
ex.printStackTrace(statsp);
}
}
// resetting standard input/error streams from logfile to default
if (statsp != null) {
System.setErr(origErr);
System.setOut(origOut);
}
// try to release references asap...
m_xos = null;
m_xis = null;
is = null;
os = null;
// notify any listeners about close
if (listeners != null) {
for (Enumeration e = listeners.elements(); e.hasMoreElements();) {
XStreamListener l = (XStreamListener) e.nextElement();
l.closed();
}
}
}
}
};