/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.frontend.taglib.soy.servlet.taglib; import com.liferay.portal.kernel.template.Template; import com.liferay.portal.kernel.template.TemplateConstants; import com.liferay.portal.kernel.template.TemplateException; import com.liferay.portal.kernel.template.TemplateManagerUtil; import com.liferay.portal.kernel.template.TemplateResource; import com.liferay.portal.kernel.util.HtmlUtil; import com.liferay.portal.kernel.util.ServerDetector; import com.liferay.portal.kernel.util.SetUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.template.soy.utils.SoyContext; import com.liferay.portal.template.soy.utils.SoyJavaScriptRenderer; import com.liferay.portal.template.soy.utils.SoyTemplateResourcesProvider; import com.liferay.taglib.aui.ScriptTag; import com.liferay.taglib.util.ParamAndPropertyAncestorTagImpl; import java.io.IOException; import java.util.List; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; /** * @author Bruno Basto */ public class TemplateRendererTag extends ParamAndPropertyAncestorTagImpl { @Override public int doEndTag() throws JspException { JspWriter jspWriter = pageContext.getOut(); Map<String, Object> context = getContext(); try { prepareContext(context); if (isRenderTemplate()) { renderTemplate(jspWriter, context); } if (isRenderJavaScript()) { renderJavaScript(jspWriter, context); } } catch (Exception e) { throw new JspException(e); } finally { cleanUp(); } return EVAL_PAGE; } @Override public int doStartTag() { try { _template = _getTemplate(); } catch (TemplateException te) { te.printStackTrace(); } return EVAL_BODY_INCLUDE; } public String getComponentId() { if (Validator.isNull(_componentId)) { _componentId = StringUtil.randomId(); } return _componentId; } public String getModule() { return _module; } public String getTemplateNamespace() { return _templateNamespace; } public void putHTMLValue(String key, String value) { Map<String, Object> context = getContext(); if (context instanceof SoyContext) { ((SoyContext)context).putHTML(key, value); } else { putValue(key, value); } } public void putValue(String key, Object value) { Map<String, Object> context = getContext(); context.put(key, value); } public void setComponentId(String componentId) { _componentId = componentId; } public void setContext(Map<String, Object> context) { _context = context; } public void setModule(String module) { _module = module; } public void setTemplateNamespace(String namespace) { _templateNamespace = namespace; } protected void cleanUp() { if (!ServerDetector.isResin()) { _componentId = null; _context = null; _module = null; _templateNamespace = null; } } protected Map<String, Object> getContext() { if (_context == null) { _context = new SoyContext(); } return _context; } protected String getElementSelector() { return StringPool.POUND.concat(getComponentId()).concat(" > div"); } protected boolean isRenderJavaScript() { return Validator.isNotNull(getModule()); } protected boolean isRenderTemplate() { return true; } protected void prepareContext(Map<String, Object> context) { } protected void renderJavaScript( JspWriter jspWriter, Map<String, Object> context) throws Exception, IOException { SoyJavaScriptRenderer javaScriptComponentRenderer = _getJavaScriptComponentRenderer(); if (!context.containsKey("element")) { context.put("element", getElementSelector()); } String componentJavaScript = javaScriptComponentRenderer.getJavaScript( context, getComponentId(), SetUtil.fromString(getModule())); ScriptTag.doTag( null, null, null, componentJavaScript, getBodyContent(), pageContext); } protected void renderTemplate( JspWriter jspWriter, Map<String, Object> context) throws IOException, TemplateException { _template.putAll(context); _template.put(TemplateConstants.NAMESPACE, getTemplateNamespace()); _template.prepare(request); jspWriter.append("<div id=\""); jspWriter.append(HtmlUtil.escapeAttribute(getComponentId())); jspWriter.append("\">"); _template.processTemplate(jspWriter); jspWriter.append("</div>"); } private SoyJavaScriptRenderer _getJavaScriptComponentRenderer() throws Exception { return new SoyJavaScriptRenderer(); } private Template _getTemplate() throws TemplateException { return TemplateManagerUtil.getTemplate( TemplateConstants.LANG_TYPE_SOY, _getTemplateResources(), false); } private List<TemplateResource> _getTemplateResources() { if (_templateResources == null) { _templateResources = SoyTemplateResourcesProvider.getAllTemplateResources(); } return _templateResources; } private static List<TemplateResource> _templateResources; private String _componentId; private Map<String, Object> _context; private String _module; private Template _template; private String _templateNamespace; }