View Javadoc

1   package fr.in2p3.jsaga.helpers.xslt;
2   
3   import fr.in2p3.jsaga.Base;
4   import fr.in2p3.jsaga.EngineProperties;
5   
6   import javax.xml.transform.*;
7   import javax.xml.transform.stream.StreamSource;
8   import java.io.File;
9   import java.io.InputStream;
10  import java.util.*;
11  
12  /* ***************************************************
13  * *** Centre de Calcul de l'IN2P3 - Lyon (France) ***
14  * ***             http://cc.in2p3.fr/             ***
15  * ***************************************************
16  * File:   XSLTransformerFactory
17  * Author: Sylvain Reynaud (sreynaud@in2p3.fr)
18  * Date:   6 mai 2007
19  * ***************************************************
20  * Description:                                      */
21  /**
22   * A thread-safe factory of Transformer, which caches the parsing of stylesheets
23   */
24  public class XSLTransformerFactory {
25      private static XSLTransformerFactory _instance;
26  
27      private TransformerFactory m_factory;
28      private Map m_templatesMap;
29      private File m_debugBaseDir;
30  
31      public static XSLTransformerFactory getInstance() {
32          if (_instance == null) {
33              _instance = new XSLTransformerFactory();
34          }
35          return _instance;
36      }
37      private XSLTransformerFactory() {
38          m_factory = TransformerFactory.newInstance();
39          if ("net.sf.saxon.TransformerFactoryImpl".equals(m_factory.getClass().getName())) {
40              // force using XALAN because SAXON is too restrictive for stylesheet jsaga-default-contexts-merge.xsl
41              System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
42              m_factory = TransformerFactory.newInstance();
43          }
44          m_templatesMap = new HashMap();
45          m_debugBaseDir = new File(Base.JSAGA_VAR, "debug");
46          if (Base.DEBUG && !m_debugBaseDir.exists()) {
47              m_debugBaseDir.mkdir();
48          }
49      }
50  
51      public XSLTransformer getCached(String xslFile) throws TransformerConfigurationException {
52          return getCached(xslFile, null, null);
53      }
54      public XSLTransformer getCached(String xslFile, URIResolver uriResolver) throws TransformerConfigurationException {
55          return getCached(xslFile, uriResolver, null);
56      }
57      public XSLTransformer getCached(String xslFile, Map parameters) throws TransformerConfigurationException {
58          return getCached(xslFile, null, parameters);
59      }
60      public XSLTransformer getCached(String xslFile, URIResolver uriResolver, Map parameters) throws TransformerConfigurationException {
61          Templates templates = (Templates) m_templatesMap.get(xslFile);
62          if (templates == null) {
63              templates = m_factory.newTemplates(this.getXSLSource(xslFile));
64              m_templatesMap.put(xslFile, templates);
65          }
66          return getXSLTransformer(
67                  xslFile,
68                  templates.newTransformer(),
69                  (uriResolver!=null ? uriResolver : new TransformerURIResolver()),
70                  (parameters!=null ? parameters : new HashMap()));
71      }
72  
73      public XSLTransformer create(String xslFile) throws TransformerConfigurationException {
74          return create(xslFile, null, null);
75      }
76      public XSLTransformer create(String xslFile, URIResolver uriResolver) throws TransformerConfigurationException {
77          return create(xslFile, uriResolver, null);
78      }
79      public XSLTransformer create(String xslFile, Map parameters) throws TransformerConfigurationException {
80          return create(xslFile, null, parameters);
81      }
82      public XSLTransformer create(String xslFile, URIResolver uriResolver, Map parameters) throws TransformerConfigurationException {
83          return getXSLTransformer(
84                  xslFile,
85                  m_factory.newTransformer(this.getXSLSource(xslFile)),
86                  (uriResolver!=null ? uriResolver : new TransformerURIResolver()),
87                  (parameters!=null ? parameters : new HashMap()));
88      }
89  
90      private Source getXSLSource(String xslFile) throws TransformerConfigurationException {
91          InputStream stream = XSLTransformerFactory.class.getClassLoader().getResourceAsStream(xslFile);
92          if (stream != null) {
93              return new StreamSource(stream);
94          } else {
95              throw new TransformerConfigurationException("Stylesheet not found: "+xslFile);
96          }
97      }
98  
99      private XSLTransformer getXSLTransformer(String xslFile, Transformer transformer, URIResolver uriResolver, Map parameters) {
100         // set transformer
101         transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
102         transformer.setURIResolver(uriResolver);
103         transformer.setErrorListener(new XSLLogger());
104         for (Iterator it=EngineProperties.getProperties().entrySet().iterator(); it.hasNext(); ) {
105             Map.Entry entry = (Map.Entry) it.next();
106             transformer.setParameter((String) entry.getKey(), entry.getValue());
107         }
108         for (Iterator it=parameters.entrySet().iterator(); it.hasNext(); ) {
109             Map.Entry entry = (Map.Entry) it.next();
110             transformer.setParameter((String) entry.getKey(), entry.getValue());
111         }
112         // set debug file
113         String debugFileName = new File(xslFile).getName()+".xml";
114         File debugFile = new File(m_debugBaseDir, debugFileName);
115         // encapsulate
116         return new XSLTransformer(transformer, debugFile);
117     }
118 }