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