001: /*
002:
003: This software is OSI Certified Open Source Software.
004: OSI Certified is a certification mark of the Open Source Initiative.
005:
006: The license (Mozilla version 1.0) can be read at the MMBase site.
007: See http://www.MMBase.org/license
008:
009: */
010: package org.mmbase.cache.xslt;
011:
012: import org.mmbase.cache.Cache;
013: import org.mmbase.util.xml.URIResolver;
014:
015: import javax.xml.transform.TransformerFactory;
016:
017: import java.io.File;
018: import java.net.URL;
019:
020: import org.mmbase.util.logging.Logger;
021: import org.mmbase.util.logging.Logging;
022:
023: /**
024: * A cache for XSL Transformer Factories. There is one needed for
025: * every directory, or more precisely, for every instance of
026: * org.mmbase.util.xml.URIResolver.
027: *
028: * @author Michiel Meeuwissen
029: * @version $Id: FactoryCache.java,v 1.11 2008/02/20 17:14:00 michiel Exp $
030: */
031: public class FactoryCache extends
032: Cache<URIResolver, TransformerFactory> {
033:
034: private static final Logger log = Logging
035: .getLoggerInstance(FactoryCache.class);
036:
037: private static int cacheSize = 50;
038: private static FactoryCache cache;
039: private static File defaultDir = new File("");
040:
041: public static FactoryCache getCache() {
042: return cache;
043: }
044:
045: static {
046: cache = new FactoryCache(cacheSize);
047: cache.putCache();
048: }
049:
050: public String getName() {
051: return "XSLFactories";
052: }
053:
054: public String getDescription() {
055: return "XSL Transformer Factories";
056: }
057:
058: /**
059: * Creates the XSL Template Cache.
060: */
061: private FactoryCache(int size) {
062: super (size);
063: }
064:
065: /**
066: * If it you are sure not to use the URIResolver, then you can as
067: * well use always the same Factory. This function supplies one.
068: */
069: public TransformerFactory getDefaultFactory() {
070: return getFactory(defaultDir);
071: }
072:
073: boolean warnedFeature = false;
074:
075: /**
076: * Make a factory for a certain URIResolver.
077: */
078: public TransformerFactory getFactory(URIResolver uri) {
079: TransformerFactory tf = get(uri);
080: if (tf == null) {
081: tf = TransformerFactory.newInstance();
082: try {
083: tf.setAttribute(
084: "http://saxon.sf.net/feature/version-warning",
085: false);
086: } catch (IllegalArgumentException iae) {
087: // never mind
088: if (!warnedFeature) {
089: log
090: .service(tf
091: + ": "
092: + iae.getMessage()
093: + ". (subsequent messages logged on debug)");
094: warnedFeature = true;
095: } else {
096: log.debug(tf + ": " + iae.getMessage() + ".");
097: }
098: }
099: tf.setURIResolver(uri);
100: // you must set the URIResolver in the tfactory, because it will not be called everytime, when you use Templates-caching.
101: put(uri, tf);
102: }
103: return tf;
104: }
105:
106: /**
107: * Gets a Factory from the cache. This cache is 'intelligent', you
108: * can also get from it when it is not in the cache, in which case
109: * a new Factory will be created (and put in the cache).
110: * @deprecated
111: */
112:
113: public TransformerFactory getFactory(File cwd) {
114: try {
115: TransformerFactory tf = get(new URIResolver(new URL(
116: "file://" + cwd), true)); // quick access (true means: don't actually create an URIResolver)
117: if (tf == null) {
118: // try again, but now construct URIResolver first.
119: return getFactory(new URIResolver(new URL("file://"
120: + cwd)));
121: } else {
122: return tf;
123: }
124: } catch (Exception e) {
125: return null;
126: }
127: }
128:
129: public TransformerFactory getFactory(URL cwd) {
130: TransformerFactory tf = get(new URIResolver(cwd, true)); // quick access (true means: don't actually create an URIResolver)
131: if (tf == null) {
132: // try again, but now construct URIResolver first.
133: return getFactory(new URIResolver(cwd));
134: } else {
135: return tf;
136: }
137: }
138:
139: }
|