001
014
015 package com.liferay.portlet.journal.util;
016
017 import com.liferay.portal.kernel.io.unsync.UnsyncStringReader;
018 import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
019 import com.liferay.portal.kernel.templateparser.TemplateContext;
020 import com.liferay.portal.kernel.util.LocaleUtil;
021 import com.liferay.portal.util.PropsValues;
022 import com.liferay.util.ContentUtil;
023
024 import java.util.Locale;
025
026 import javax.xml.transform.Transformer;
027 import javax.xml.transform.TransformerFactory;
028 import javax.xml.transform.stream.StreamResult;
029 import javax.xml.transform.stream.StreamSource;
030
031
035 public class XSLTemplateParser extends VelocityTemplateParser {
036
037 protected String getErrorTemplateContent() {
038 return ContentUtil.get(PropsValues.JOURNAL_ERROR_TEMPLATE_XSL);
039 }
040
041 @Override
042 protected TemplateContext getTemplateContext() throws Exception {
043 return _getTemplateContext(getScript());
044 }
045
046 @Override
047 protected boolean mergeTemplate(
048 TemplateContext templateContext,
049 UnsyncStringWriter unsyncStringWriter)
050 throws Exception {
051
052 StreamSource xmlSource = new StreamSource(
053 new UnsyncStringReader(getXML()));
054
055 XSLContext xslContext = (XSLContext)templateContext;
056
057 Transformer transformer = xslContext.getTransformer();
058
059 try {
060 transformer.transform(
061 xmlSource, new StreamResult(unsyncStringWriter));
062 }
063 catch (Exception e) {
064 String errorTemplateContent = getErrorTemplateContent();
065
066 XSLContext errorXSLContext = (XSLContext)_getTemplateContext(
067 errorTemplateContent);
068
069 populateTemplateContext(errorXSLContext);
070
071 Transformer errorTransformer = errorXSLContext.getTransformer();
072
073 XSLErrorListener xslErrorListener = _getXSLErrorListener();
074
075 errorTransformer.setParameter(
076 "exception", xslErrorListener.getMessageAndLocation());
077 errorTransformer.setParameter("script", getScript());
078
079 if (xslErrorListener.getLocation() != null) {
080 errorTransformer.setParameter(
081 "column", new Integer(xslErrorListener.getColumnNumber()));
082 errorTransformer.setParameter(
083 "line", new Integer(xslErrorListener.getLineNumber()));
084 }
085
086 unsyncStringWriter.reset();
087
088 errorTransformer.transform(
089 xmlSource, new StreamResult(unsyncStringWriter));
090 }
091
092 return true;
093 }
094
095 private TemplateContext _getTemplateContext(String script)
096 throws Exception {
097
098 TransformerFactory transformerFactory = _getTransformerFactory();
099
100 StreamSource scriptSource = new StreamSource(
101 new UnsyncStringReader(script));
102
103 return new XSLContext(transformerFactory.newTransformer(scriptSource));
104 }
105
106 private TransformerFactory _getTransformerFactory() {
107 if (_transformerFactory == null) {
108 _transformerFactory = TransformerFactory.newInstance();
109
110 _transformerFactory.setErrorListener(_getXSLErrorListener());
111 _transformerFactory.setURIResolver(
112 new URIResolver(getTokens(), getLanguageId()));
113 }
114
115 return _transformerFactory;
116 }
117
118 private XSLErrorListener _getXSLErrorListener() {
119 if (_xslErrorListener == null) {
120 Locale locale = LocaleUtil.fromLanguageId(getLanguageId());
121
122 _xslErrorListener = new XSLErrorListener(locale);
123 }
124
125 return _xslErrorListener;
126 }
127
128 private TransformerFactory _transformerFactory;
129 private XSLErrorListener _xslErrorListener;
130
131 }