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.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 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 }