1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
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.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  /**
39   * <a href="XSLTemplateParser.java.html"><b><i>View Source</i></b></a>
40   *
41   * @author Alexander Chow
42   * @author Raymond Augé
43   */
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 }