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 languageId, String xml,
48 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("locale", locale);
88 transformer.setParameter(
89 "permissionChecker",
90 PermissionThreadLocal.getPermissionChecker());
91 transformer.setParameter("randomNamespace", randomNamespace);
92
93 transformer.transform(
94 xmlSource, new StreamResult(unsyncByteArrayOutputStream));
95 }
96 catch (Exception e1) {
97 String errorTemplate = ContentUtil.get(
98 PropsValues.JOURNAL_ERROR_TEMPLATE_XSL);
99
100 StreamSource scriptSource = new StreamSource(
101 new UnsyncStringReader(errorTemplate));
102
103 Transformer transformer = transformerFactory.newTransformer(
104 scriptSource);
105
106 transformer.setParameter("company", company);
107 transformer.setParameter("companyId", new Long(companyId));
108 transformer.setParameter("groupId", String.valueOf(groupId));
109 transformer.setParameter(
110 "journalTemplatesPath", journalTemplatesPath);
111 transformer.setParameter("locale", locale);
112 transformer.setParameter("randomNamespace", randomNamespace);
113
114 transformer.setParameter(
115 "exception", xslErrorListener.getMessageAndLocation());
116 transformer.setParameter("script", script);
117
118 if (xslErrorListener.getLocation() != null) {
119 transformer.setParameter(
120 "column", new Integer(xslErrorListener.getColumnNumber()));
121 transformer.setParameter(
122 "line", new Integer(xslErrorListener.getLineNumber()));
123 }
124
125 transformer.transform(
126 xmlSource, new StreamResult(unsyncByteArrayOutputStream));
127 }
128
129 return unsyncByteArrayOutputStream.toString(StringPool.UTF8);
130 }
131
132 }