1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.frontend.xeditor;
20
21 import java.io.IOException;
22 import java.util.Map;
23
24 import javax.xml.transform.TransformerFactory;
25
26 import org.jdom2.Document;
27 import org.jdom2.Element;
28 import org.jdom2.JDOMException;
29 import org.jdom2.Text;
30 import org.jdom2.filter.Filters;
31 import org.mycore.common.MCRClassTools;
32 import org.mycore.common.config.MCRConfiguration2;
33 import org.mycore.common.content.MCRContent;
34 import org.mycore.common.content.MCRJDOMContent;
35 import org.mycore.common.content.transformer.MCRContentTransformer;
36 import org.mycore.common.content.transformer.MCRXSL2XMLTransformer;
37 import org.mycore.common.xml.MCRXMLFunctions;
38 import org.xml.sax.SAXException;
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public class MCRPostProcessorXSL implements MCRXEditorPostProcessor {
53
54 private String transformer;
55
56 private String stylesheet;
57
58 public Document process(Document xml) throws IOException, JDOMException, SAXException {
59 if (stylesheet == null) {
60 return xml.clone();
61 }
62
63 Class<? extends TransformerFactory> factoryClass = null;
64 try {
65 if ("xalan".equals(transformer)) {
66 factoryClass = MCRClassTools
67 .forName("org.apache.xalan.processor.TransformerFactoryImpl");
68 }
69 if ("saxon".equals(transformer)) {
70 factoryClass = MCRClassTools
71 .forName("net.sf.saxon.TransformerFactoryImpl");
72 }
73 } catch (ClassNotFoundException e) {
74
75 }
76
77 if (factoryClass == null) {
78 factoryClass = MCRConfiguration2
79 .<TransformerFactory>getClass("MCR.LayoutService.TransformerFactoryClass").orElseThrow();
80 }
81
82 MCRContent source = new MCRJDOMContent(xml);
83 MCRContent transformed = MCRXSL2XMLTransformer.getInstance(factoryClass, "xsl/" + stylesheet).transform(source);
84 MCRContent normalized = new MCRNormalizeUnicodeTransformer().transform(transformed);
85 return normalized.asXML();
86 }
87
88 @Override
89 public void setAttributes(Map<String, String> attributeMap) {
90 this.stylesheet = attributeMap.get("xsl");
91 if (attributeMap.containsKey("transformer")) {
92 this.transformer = attributeMap.get("transformer");
93 }
94 }
95
96 public void setStylesheet(String stylesheet) {
97 this.stylesheet = stylesheet;
98 }
99 }
100
101 class MCRNormalizeUnicodeTransformer extends MCRContentTransformer {
102
103 public MCRJDOMContent transform(MCRContent source) throws IOException {
104 try {
105 Element root = source.asXML().getRootElement().clone();
106 for (Text text : root.getDescendants(Filters.text())) {
107 text.setText(MCRXMLFunctions.normalizeUnicode(text.getText()));
108 }
109 return new MCRJDOMContent(root);
110 } catch (JDOMException | SAXException ex) {
111 throw new IOException(ex);
112 }
113 }
114 }