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
14
15
16
17
18
19
20
21
22
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
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
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
113 String debugFileName = new File(xslFile).getName()+".xml";
114 File debugFile = new File(m_debugBaseDir, debugFileName);
115
116 return new XSLTransformer(transformer, debugFile);
117 }
118 }