/** * 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.util.bridges.freemarker; 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.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.TemplateManager; 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.util.PortalUtil; import com.liferay.portal.kernel.util.UnsyncPrintWriterPool; 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; /** * @author Raymond Augé */ public class FreeMarkerPortlet extends MVCPortlet { @Override public void destroy() { super.destroy(); Class<?> clazz = getClass(); TemplateManagerUtil.destroy(clazz.getClassLoader()); } @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); TemplateManager templateManager = TemplateManagerUtil.getTemplateManager( TemplateConstants.LANG_TYPE_FTL); Template template = TemplateManagerUtil.getTemplate( TemplateConstants.LANG_TYPE_FTL, templateResource, false); templateManager.addTaglibSupport( template, PortalUtil.getHttpServletRequest(portletRequest), PortalUtil.getHttpServletResponse(portletResponse)); template.put("portletContext", getPortletContext()); template.put( "userInfo", portletRequest.getAttribute(PortletRequest.USER_INFO)); 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"); } } } private static final Log _log = LogFactoryUtil.getLog( FreeMarkerPortlet.class); }