001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
032     * @author Alexander Chow
033     * @author Raymond Augé
034     */
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    }