1
14
15 package com.liferay.portlet.journal.util;
16
17 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;
18 import com.liferay.portal.kernel.io.unsync.UnsyncStringReader;
19 import com.liferay.portal.kernel.util.GetterUtil;
20 import com.liferay.portal.kernel.util.LocaleUtil;
21 import com.liferay.portal.kernel.util.StringPool;
22 import com.liferay.portal.model.Company;
23 import com.liferay.portal.security.permission.PermissionThreadLocal;
24 import com.liferay.portal.service.CompanyLocalServiceUtil;
25 import com.liferay.portal.theme.ThemeDisplay;
26 import com.liferay.portal.util.ContentUtil;
27 import com.liferay.portal.util.PropsValues;
28 import com.liferay.portal.velocity.VelocityResourceListener;
29 import com.liferay.util.PwdGenerator;
30
31 import java.util.Locale;
32 import java.util.Map;
33
34 import javax.xml.transform.Transformer;
35 import javax.xml.transform.TransformerFactory;
36 import javax.xml.transform.stream.StreamResult;
37 import javax.xml.transform.stream.StreamSource;
38
39
45 public class XSLTemplateParser extends BaseTemplateParser {
46
47 protected String doTransform(
48 ThemeDisplay themeDisplay, Map<String, String> tokens,
49 String viewMode, String languageId, String xml, String script)
50 throws Exception {
51
52 UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
53 new UnsyncByteArrayOutputStream();
54
55 long companyId = GetterUtil.getLong(tokens.get("company_id"));
56 Company company = CompanyLocalServiceUtil.getCompanyById(companyId);
57 long groupId = GetterUtil.getLong(tokens.get("group_id"));
58 String journalTemplatesPath =
59 VelocityResourceListener.JOURNAL_SEPARATOR + StringPool.SLASH +
60 companyId + StringPool.SLASH + groupId;
61 String randomNamespace =
62 PwdGenerator.getPassword(PwdGenerator.KEY3, 4) +
63 StringPool.UNDERLINE;
64 Locale locale = LocaleUtil.fromLanguageId(languageId);
65
66 XSLErrorListener xslErrorListener = new XSLErrorListener(locale);
67
68 StreamSource xmlSource = new StreamSource(new UnsyncStringReader(xml));
69
70 TransformerFactory transformerFactory =
71 TransformerFactory.newInstance();
72
73 transformerFactory.setURIResolver(new URIResolver(tokens, languageId));
74 transformerFactory.setErrorListener(xslErrorListener);
75
76 try {
77 StreamSource scriptSource = new StreamSource(
78 new UnsyncStringReader(script));
79
80 Transformer transformer = transformerFactory.newTransformer(
81 scriptSource);
82
83 transformer.setParameter("company", company);
84 transformer.setParameter("companyId", new Long(companyId));
85 transformer.setParameter("groupId", String.valueOf(groupId));
86 transformer.setParameter(
87 "journalTemplatesPath", journalTemplatesPath);
88 transformer.setParameter("viewMode", viewMode);
89 transformer.setParameter("locale", locale);
90 transformer.setParameter(
91 "permissionChecker",
92 PermissionThreadLocal.getPermissionChecker());
93 transformer.setParameter("randomNamespace", randomNamespace);
94
95 transformer.transform(
96 xmlSource, new StreamResult(unsyncByteArrayOutputStream));
97 }
98 catch (Exception e1) {
99 String errorTemplate = ContentUtil.get(
100 PropsValues.JOURNAL_ERROR_TEMPLATE_XSL);
101
102 StreamSource scriptSource = new StreamSource(
103 new UnsyncStringReader(errorTemplate));
104
105 Transformer transformer = transformerFactory.newTransformer(
106 scriptSource);
107
108 transformer.setParameter("company", company);
109 transformer.setParameter("companyId", new Long(companyId));
110 transformer.setParameter("groupId", String.valueOf(groupId));
111 transformer.setParameter(
112 "journalTemplatesPath", journalTemplatesPath);
113 transformer.setParameter("locale", locale);
114 transformer.setParameter("randomNamespace", randomNamespace);
115
116 transformer.setParameter(
117 "exception", xslErrorListener.getMessageAndLocation());
118 transformer.setParameter("script", script);
119
120 if (xslErrorListener.getLocation() != null) {
121 transformer.setParameter(
122 "column", new Integer(xslErrorListener.getColumnNumber()));
123 transformer.setParameter(
124 "line", new Integer(xslErrorListener.getLineNumber()));
125 }
126
127 transformer.transform(
128 xmlSource, new StreamResult(unsyncByteArrayOutputStream));
129 }
130
131 return unsyncByteArrayOutputStream.toString(StringPool.UTF8);
132 }
133
134 }