/** * 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.portlet; import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter; import com.liferay.portal.kernel.template.Template; import com.liferay.portal.kernel.template.TemplateConstants; 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.StringBundler; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.struts.StrutsUtil; import java.io.IOException; import java.io.Writer; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.GenericPortlet; import javax.portlet.MimeResponse; import javax.portlet.PortletConfig; import javax.portlet.PortletContext; import javax.portlet.PortletException; import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; /** * @author Brian Wing Shun Chan * @author Steven P. Goldsmith * @author Raymond Augé */ public class VelocityPortlet extends GenericPortlet { @Override public void doEdit( RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { if (renderRequest.getPreferences() == null) { super.doEdit(renderRequest, renderResponse); return; } try { mergeTemplate(_editTemplateId, renderRequest, renderResponse); } catch (Exception e) { throw new PortletException(e); } } @Override public void doHelp( RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException { try { mergeTemplate(_helpTemplateId, renderRequest, renderResponse); } catch (Exception e) { throw new PortletException(e); } } @Override public void doView( RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException { try { mergeTemplate(_viewTemplateId, renderRequest, renderResponse); } catch (Exception e) { throw new PortletException(e); } } @Override public void init(PortletConfig portletConfig) throws PortletException { super.init(portletConfig); PortletContext portletContext = portletConfig.getPortletContext(); _portletContextName = portletContext.getPortletContextName(); _actionTemplateId = getTemplateId(getInitParameter("action-template")); _editTemplateId = getTemplateId(getInitParameter("edit-template")); _helpTemplateId = getTemplateId(getInitParameter("help-template")); _resourceTemplateId = getTemplateId( getInitParameter("resource-template")); _viewTemplateId = getTemplateId(getInitParameter("view-template")); } @Override public void processAction( ActionRequest actionRequest, ActionResponse actionResponse) throws PortletException { if (Validator.isNull(_actionTemplateId)) { return; } try { mergeTemplate(_actionTemplateId, actionRequest, actionResponse); } catch (Exception e) { throw new PortletException(e); } } @Override public void serveResource( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException, PortletException { if (Validator.isNull(_resourceTemplateId)) { super.serveResource(resourceRequest, resourceResponse); return; } try { mergeTemplate( _resourceTemplateId, resourceRequest, resourceResponse); } catch (Exception e) { throw new PortletException(e); } } protected String getTemplateId(String name) { if (Validator.isNull(name)) { return name; } StringBundler sb = new StringBundler(4); sb.append(_portletContextName); sb.append(TemplateConstants.SERVLET_SEPARATOR); sb.append(StrutsUtil.TEXT_HTML_DIR); sb.append(name); return sb.toString(); } protected void mergeTemplate( String templateId, PortletRequest portletRequest, PortletResponse portletResponse) throws Exception { TemplateResource templateResource = TemplateResourceLoaderUtil.getTemplateResource( TemplateConstants.LANG_TYPE_VM, templateId); if (templateResource == null) { throw new Exception( "Unable to load template resource " + templateId); } Template template = TemplateManagerUtil.getTemplate( TemplateConstants.LANG_TYPE_VM, templateResource, false); prepareTemplate(template, portletRequest, portletResponse); mergeTemplate(templateId, template, portletRequest, portletResponse); } protected void mergeTemplate( String templateId, Template template, PortletRequest portletRequest, PortletResponse portletResponse) throws Exception { Writer writer = null; if (portletResponse instanceof MimeResponse) { MimeResponse mimeResponse = (MimeResponse)portletResponse; writer = mimeResponse.getWriter(); } else { writer = new UnsyncStringWriter(); } template.processTemplate(writer); } protected void prepareTemplate( Template template, PortletRequest portletRequest, PortletResponse portletResponse) { template.put("portletConfig", getPortletConfig()); template.put("portletContext", getPortletContext()); template.put("preferences", portletRequest.getPreferences()); template.put( "userInfo", portletRequest.getAttribute(PortletRequest.USER_INFO)); template.put("portletRequest", portletRequest); if (portletRequest instanceof ActionRequest) { template.put("actionRequest", portletRequest); } else if (portletRequest instanceof RenderRequest) { template.put("renderRequest", portletRequest); } else { template.put("resourceRequest", portletRequest); } template.put("portletResponse", portletResponse); if (portletResponse instanceof ActionResponse) { template.put("actionResponse", portletResponse); } else if (portletRequest instanceof RenderResponse) { template.put("renderResponse", portletResponse); } else { template.put("resourceResponse", portletResponse); } } private String _actionTemplateId; private String _editTemplateId; private String _helpTemplateId; private String _portletContextName; private String _resourceTemplateId; private String _viewTemplateId; }