/**
* 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.portal.portlet.bridge.soy;
import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;
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.GetterUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.UnsyncPrintWriterPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.portlet.bridge.soy.internal.SoyPortletHelper;
import com.liferay.portal.template.soy.utils.SoyTemplateResourcesProvider;
import java.io.IOException;
import java.io.Writer;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.portlet.MimeResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.servlet.http.HttpServletRequest;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
/**
* @author Miroslav Ligas
* @author Bruno Basto
*/
public class SoyPortlet extends MVCPortlet {
@Override
public void init() throws PortletException {
super.init();
propagateRequestParameters = GetterUtil.getBoolean(
getInitParameter("propagate-request-parameters"), true);
_bundle = FrameworkUtil.getBundle(getClass());
try {
_soyPortletHelper = new SoyPortletHelper(_bundle);
}
catch (Exception e) {
throw new PortletException(e);
}
}
@Override
public void render(
RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {
super.render(renderRequest, renderResponse);
}
protected Set<String> getJavaScriptRequiredModules(String path) {
return Collections.emptySet();
}
protected Writer getResponseWriter(PortletResponse portletResponse)
throws IOException {
Writer writer = null;
if (portletResponse instanceof MimeResponse) {
MimeResponse mimeResponse = (MimeResponse)portletResponse;
writer = UnsyncPrintWriterPool.borrow(mimeResponse.getWriter());
}
else {
writer = new UnsyncStringWriter();
}
return writer;
}
protected Template getTemplate(PortletRequest portletRequest)
throws PortletException {
Template template = (Template)portletRequest.getAttribute(
WebKeys.TEMPLATE);
if (template == null) {
try {
template = _createTemplate();
}
catch (TemplateException te) {
throw new PortletException("Unable to create template", te);
}
portletRequest.setAttribute(WebKeys.TEMPLATE, template);
}
return template;
}
@Override
protected void include(
String namespace, PortletRequest portletRequest,
PortletResponse portletResponse, String lifecycle)
throws IOException, PortletException {
try {
String path = getPath(portletRequest, portletResponse);
if (Validator.isNull(path)) {
path = namespace;
}
Template template = getTemplate(portletRequest);
template.put(
TemplateConstants.NAMESPACE,
_soyPortletHelper.getTemplateNamespace(path));
if (propagateRequestParameters) {
propagateRequestParameters(portletRequest);
}
Writer writer = getResponseWriter(portletResponse);
populateJavaScriptTemplateContext(
template, portletResponse.getNamespace());
HttpServletRequest httpServletRequest =
PortalUtil.getHttpServletRequest(portletRequest);
template.prepare(httpServletRequest);
template.processTemplate(writer);
_writePortletJavaScript(
portletRequest, portletResponse, path, writer);
}
catch (Exception e) {
throw new PortletException(e);
}
if (clearRequestParameters) {
if (lifecycle.equals(PortletRequest.RENDER_PHASE)) {
portletResponse.setProperty("clear-request-parameters", "true");
}
}
}
protected void populateJavaScriptTemplateContext(
Template template, String portletNamespace) {
String portletComponentId = portletNamespace.concat("PortletComponent");
template.put("element", StringPool.POUND.concat(portletComponentId));
template.put("id", portletComponentId);
}
protected void propagateRequestParameters(PortletRequest portletRequest)
throws PortletException {
Map<String, String[]> parametersMap = portletRequest.getParameterMap();
Template template = getTemplate(portletRequest);
for (Map.Entry<String, String[]> entry : parametersMap.entrySet()) {
String parameterName = entry.getKey();
String[] parameterValues = entry.getValue();
if (parameterValues.length == 1) {
template.put(parameterName, parameterValues[0]);
}
else if (parameterValues.length > 1) {
template.put(parameterName, parameterValues);
}
}
}
protected boolean propagateRequestParameters;
/**
* @deprecated As of 3.1.0, use {@link SoyPortlet#getTemplate(
* PortletRequest)}} instead
*/
@Deprecated
protected Template template;
private Template _createTemplate() throws TemplateException {
List<TemplateResource> templateResources = _getTemplateResources();
return TemplateManagerUtil.getTemplate(
TemplateConstants.LANG_TYPE_SOY, templateResources, false);
}
private List<TemplateResource> _getTemplateResources()
throws TemplateException {
if (_templateResources == null) {
_templateResources =
SoyTemplateResourcesProvider.getBundleTemplateResources(
_bundle, templatePath);
}
return _templateResources;
}
private void _writePortletJavaScript(
PortletRequest portletRequest, PortletResponse portletResponse,
String path, Writer writer)
throws Exception {
StringBundler sb = new StringBundler(3);
sb.append("<script>");
Template template = getTemplate(portletRequest);
String portletJavaScript = _soyPortletHelper.getPortletJavaScript(
template, path, portletResponse.getNamespace(),
getJavaScriptRequiredModules(path));
sb.append(portletJavaScript);
sb.append("</script>");
writer.write(sb.toString());
}
private static List<TemplateResource> _templateResources;
private Bundle _bundle;
private SoyPortletHelper _soyPortletHelper;
}