001: package de.webman.util.xslt;
002:
003: import java.io.File;
004: import java.util.Hashtable;
005: import javax.xml.transform.ErrorListener;
006: import javax.xml.transform.Transformer;
007: import javax.xml.transform.TransformerFactory;
008: import javax.xml.transform.TransformerException;
009: import javax.xml.transform.stream.StreamSource;
010:
011: /**
012: * Implementierung eines simplen XSL-Transformer-Caches.
013: *
014: * @author $Author: uli $
015: * @version $Revision: 1.1 $
016: */
017: public class XSLTTemplateCache {
018:
019: // $Id: XSLTTemplateCache.java,v 1.1 2001/09/10 14:32:49 uli Exp $
020:
021: // Constants.
022:
023: /**
024: * The stylesheet template cache.
025: */
026: private static Hashtable cache = new Hashtable();
027:
028: /**
029: * The modification date cache.
030: */
031: private static Hashtable dates = new Hashtable();
032:
033: /**
034: * The error listener.
035: */
036: private static ErrorListener ERROR_LISTENER = null;
037:
038: /**
039: * The transformer factory.
040: */
041: private static TransformerFactory TRANSFORMER_FACTORY = null;
042:
043: // Static access.
044:
045: /**
046: * Returns the error listener.
047: *
048: * @return the error listener.
049: */
050: public static synchronized ErrorListener getErrorListener() {
051: if (ERROR_LISTENER == null) {
052: // Lazy initialization.
053: ERROR_LISTENER = new XSLTErrorListener();
054: }
055:
056: return ERROR_LISTENER;
057: }
058:
059: /**
060: * Returns the transformer factory.
061: *
062: * @return the transformer factory.
063: */
064: public static synchronized TransformerFactory getTransformerFactory() {
065: if (TRANSFORMER_FACTORY == null) {
066: // Lazy initialization.
067: TRANSFORMER_FACTORY = TransformerFactory.newInstance();
068: TRANSFORMER_FACTORY.setErrorListener(getErrorListener());
069: }
070:
071: return TRANSFORMER_FACTORY;
072: }
073:
074: /**
075: * Returns a transformer for the specified stylesheet.
076: *
077: * @param name the absolute file name of the stylesheet.
078: * @return a transformer for the specified stylesheet.
079: */
080: public static synchronized Transformer getTransformer(String name)
081: throws TransformerException {
082: // Optimistic initialization.
083: Transformer transformer = (Transformer) cache.get(name);
084:
085: // Check file date.
086: File file = new File(name);
087: Long lastModified = new Long(file.lastModified());
088: Long cacheModified = (Long) dates.get(name);
089:
090: if (!lastModified.equals(cacheModified)) {
091: // Cache dirty or empty.
092: transformer = getTransformerFactory().newTransformer(
093: new StreamSource(file));
094: transformer.setErrorListener(getErrorListener());
095:
096: dates.put(name, lastModified);
097: cache.put(name, transformer);
098: }
099:
100: return transformer;
101: }
102:
103: }
|