1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
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  /**
40   * <a href="XSLTemplateParser.java.html"><b><i>View Source</i></b></a>
41   *
42   * @author Alexander Chow
43   * @author Raymond Augé
44   */
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 }