/**
* 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.content.targeting.portlet;
import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
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.template.TemplateResourceLoaderUtil;
import com.liferay.portal.kernel.template.TemplateTaglibSupportProvider;
import com.liferay.portal.kernel.util.UnsyncPrintWriterPool;
import com.liferay.portal.util.PortalUtil;
import freemarker.ext.servlet.HttpRequestHashModel;
import freemarker.template.ObjectWrapper;
import java.io.IOException;
import java.io.Writer;
import javax.portlet.MimeResponse;
import javax.portlet.PortletContext;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* This class fixes some issues in the FreeMarkerPortlet class.
*
* @author Eudaldo Alonso
*/
public class FreeMarkerPortlet
extends com.liferay.util.bridges.freemarker.FreeMarkerPortlet {
@Override
protected void include(
String path, PortletRequest portletRequest,
PortletResponse portletResponse, String lifecycle)
throws IOException, PortletException {
PortletContext portletContext = getPortletContext();
String servletContextName = portletContext.getPortletContextName();
String resourcePath = servletContextName.concat(
TemplateConstants.SERVLET_SEPARATOR).concat(path);
boolean resourceExists = false;
try {
resourceExists = TemplateResourceLoaderUtil.hasTemplateResource(
TemplateConstants.LANG_TYPE_FTL, resourcePath);
}
catch (TemplateException te) {
throw new IOException(te);
}
if (!resourceExists) {
_log.error(path + " is not a valid include");
}
else {
try {
TemplateResource templateResource =
TemplateResourceLoaderUtil.getTemplateResource(
TemplateConstants.LANG_TYPE_FTL, resourcePath);
Template template = TemplateManagerUtil.getTemplate(
TemplateConstants.LANG_TYPE_FTL, templateResource, false);
TemplateTaglibSupportProvider templateTaglibSupportProvider =
getTaglibSupportProvider();
if (templateTaglibSupportProvider != null) {
templateTaglibSupportProvider.addTaglibSupport(
template, servletContextName, portletRequest,
portletResponse);
}
// LPS-43725
HttpServletRequestWrapper httpServletRequestWrapper =
new HttpServletRequestWrapper(
PortalUtil.getHttpServletRequest(portletRequest));
HttpServletResponseWrapper httpServletResponseWrapper =
new HttpServletResponseWrapper(
PortalUtil.getHttpServletResponse(portletResponse));
HttpRequestHashModel httpRequestHashModel =
new HttpRequestHashModel(
httpServletRequestWrapper, httpServletResponseWrapper,
ObjectWrapper.DEFAULT_WRAPPER);
template.put("Request", httpRequestHashModel);
populateContext(
path, portletRequest, portletResponse, template);
Writer writer = null;
if (portletResponse instanceof MimeResponse) {
MimeResponse mimeResponse = (MimeResponse)portletResponse;
writer = UnsyncPrintWriterPool.borrow(
mimeResponse.getWriter());
}
else {
writer = new UnsyncStringWriter();
}
template.processTemplate(writer);
}
catch (Exception e) {
throw new PortletException(e);
}
}
if (clearRequestParameters) {
if (lifecycle.equals(PortletRequest.RENDER_PHASE)) {
portletResponse.setProperty("clear-request-parameters", "true");
}
}
}
protected void populateContext(
String path, PortletRequest portletRequest,
PortletResponse portletResponse, Template template)
throws Exception {
}
private static Log _log = LogFactoryUtil.getLog(FreeMarkerPortlet.class);
}