1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.kuali.rice.core.impl.style;
18
19 import java.io.StringReader;
20 import java.util.List;
21 import java.util.Properties;
22
23 import javax.xml.transform.Templates;
24 import javax.xml.transform.TransformerConfigurationException;
25 import javax.xml.transform.TransformerFactory;
26 import javax.xml.transform.stream.StreamSource;
27
28 import org.apache.log4j.Logger;
29 import org.kuali.rice.core.api.style.Style;
30 import org.kuali.rice.core.api.style.StyleRepositoryService;
31 import org.kuali.rice.core.api.style.StyleService;
32 import org.kuali.rice.core.framework.services.CoreFrameworkServiceLocator;
33 import org.kuali.rice.kew.util.KEWConstants;
34 import org.kuali.rice.kns.util.KNSConstants;
35 import org.kuali.rice.ksb.api.cache.RiceCacheAdministrator;
36
37
38
39
40
41
42 public class StyleServiceImpl implements StyleService {
43
44 private static final Logger LOG = Logger.getLogger(StyleServiceImpl.class);
45
46 private StyleRepositoryService styleRepositoryService;
47 private RiceCacheAdministrator cache;
48
49 public void setStyleRepositoryService(StyleRepositoryService styleRepositoryService) {
50 this.styleRepositoryService = styleRepositoryService;
51 }
52
53 public void setCache(RiceCacheAdministrator cache) {
54 this.cache = cache;
55 }
56
57
58
59
60
61
62
63 @Override
64 public Style getStyle(String styleName) {
65
66
67
68 return styleRepositoryService.getStyle(styleName);
69 }
70
71 @Override
72 public Templates getStyleAsTranslet(String name) throws TransformerConfigurationException {
73 if (name == null) return null;
74 Templates translet = fetchTemplatesFromCache(name);
75 if (translet == null) {
76 Style style = getStyle(name);
77 if (style == null) {
78 return null;
79 }
80
81 boolean useXSLTC = CoreFrameworkServiceLocator.getParameterService().getParameterValueAsBoolean(KEWConstants.KEW_NAMESPACE, KNSConstants.DetailTypes.EDOC_LITE_DETAIL_TYPE, KEWConstants.EDL_USE_XSLTC_IND);
82 if (useXSLTC) {
83 LOG.info("using xsltc to compile stylesheet");
84 String key = "javax.xml.transform.TransformerFactory";
85 String value = "org.apache.xalan.xsltc.trax.TransformerFactoryImpl";
86 Properties props = System.getProperties();
87 props.put(key, value);
88 System.setProperties(props);
89 }
90
91 TransformerFactory factory = TransformerFactory.newInstance();
92 factory.setURIResolver(new StyleUriResolver(this));
93
94 if (useXSLTC) {
95 factory.setAttribute("translet-name",name);
96 factory.setAttribute("generate-translet",Boolean.TRUE);
97 String debugTransform = CoreFrameworkServiceLocator.getParameterService().getParameterValueAsString(KEWConstants.KEW_NAMESPACE, KNSConstants.DetailTypes.EDOC_LITE_DETAIL_TYPE, KEWConstants.EDL_DEBUG_TRANSFORM_IND);
98 if (debugTransform.trim().equals("Y")) {
99 factory.setAttribute("debug", Boolean.TRUE);
100 }
101 }
102
103 translet = factory.newTemplates(new StreamSource(new StringReader(style.getXmlContent())));
104 putTemplatesInCache(name, translet);
105 }
106 return translet;
107 }
108
109 @Override
110 public void saveStyle(Style style) {
111 styleRepositoryService.saveStyle(style);
112 }
113
114 @Override
115 public List<String> getAllStyleNames() {
116 return styleRepositoryService.getAllStyleNames();
117 }
118
119
120
121
122
123
124 protected String getTemplatesCacheKey(String styleName) {
125 return StyleRepositoryServiceImpl.TEMPLATES_CACHE_GROUP_NAME + ":" + styleName;
126 }
127
128 protected Templates fetchTemplatesFromCache(String styleName) {
129 return (Templates) cache.getFromCache(getTemplatesCacheKey(styleName));
130 }
131
132 protected void putTemplatesInCache(String styleName, Templates templates) {
133 cache.putInCache(getTemplatesCacheKey(styleName), templates, StyleRepositoryServiceImpl.TEMPLATES_CACHE_GROUP_NAME);
134 }
135
136 }