001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet;
016    
017    import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
018    import com.liferay.portal.kernel.template.Template;
019    import com.liferay.portal.kernel.template.TemplateConstants;
020    import com.liferay.portal.kernel.template.TemplateManagerUtil;
021    import com.liferay.portal.kernel.template.TemplateResource;
022    import com.liferay.portal.kernel.template.TemplateResourceLoaderUtil;
023    import com.liferay.portal.kernel.util.StringBundler;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.struts.StrutsUtil;
026    
027    import java.io.IOException;
028    import java.io.Writer;
029    
030    import javax.portlet.ActionRequest;
031    import javax.portlet.ActionResponse;
032    import javax.portlet.GenericPortlet;
033    import javax.portlet.MimeResponse;
034    import javax.portlet.PortletConfig;
035    import javax.portlet.PortletContext;
036    import javax.portlet.PortletException;
037    import javax.portlet.PortletRequest;
038    import javax.portlet.PortletResponse;
039    import javax.portlet.RenderRequest;
040    import javax.portlet.RenderResponse;
041    import javax.portlet.ResourceRequest;
042    import javax.portlet.ResourceResponse;
043    
044    /**
045     * @author Brian Wing Shun Chan
046     * @author Steven P. Goldsmith
047     * @author Raymond Aug??
048     */
049    public class VelocityPortlet extends GenericPortlet {
050    
051            @Override
052            public void doEdit(
053                            RenderRequest renderRequest, RenderResponse renderResponse)
054                    throws IOException, PortletException {
055    
056                    if (renderRequest.getPreferences() == null) {
057                            super.doEdit(renderRequest, renderResponse);
058    
059                            return;
060                    }
061    
062                    try {
063                            mergeTemplate(_editTemplateId, renderRequest, renderResponse);
064                    }
065                    catch (Exception e) {
066                            throw new PortletException(e);
067                    }
068            }
069    
070            @Override
071            public void doHelp(
072                            RenderRequest renderRequest, RenderResponse renderResponse)
073                    throws PortletException {
074    
075                    try {
076                            mergeTemplate(_helpTemplateId, renderRequest, renderResponse);
077                    }
078                    catch (Exception e) {
079                            throw new PortletException(e);
080                    }
081            }
082    
083            @Override
084            public void doView(
085                            RenderRequest renderRequest, RenderResponse renderResponse)
086                    throws PortletException {
087    
088                    try {
089                            mergeTemplate(_viewTemplateId, renderRequest, renderResponse);
090                    }
091                    catch (Exception e) {
092                            throw new PortletException(e);
093                    }
094            }
095    
096            @Override
097            public void init(PortletConfig portletConfig) throws PortletException {
098                    super.init(portletConfig);
099    
100                    PortletContext portletContext = portletConfig.getPortletContext();
101    
102                    _portletContextName = portletContext.getPortletContextName();
103    
104                    _actionTemplateId = getTemplateId(getInitParameter("action-template"));
105                    _editTemplateId = getTemplateId(getInitParameter("edit-template"));
106                    _helpTemplateId = getTemplateId(getInitParameter("help-template"));
107                    _resourceTemplateId = getTemplateId(
108                            getInitParameter("resource-template"));
109                    _viewTemplateId = getTemplateId(getInitParameter("view-template"));
110            }
111    
112            @Override
113            public void processAction(
114                            ActionRequest actionRequest, ActionResponse actionResponse)
115                    throws PortletException {
116    
117                    if (Validator.isNull(_actionTemplateId)) {
118                            return;
119                    }
120    
121                    try {
122                            mergeTemplate(_actionTemplateId, actionRequest, actionResponse);
123                    }
124                    catch (Exception e) {
125                            throw new PortletException(e);
126                    }
127            }
128    
129            @Override
130            public void serveResource(
131                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
132                    throws IOException, PortletException {
133    
134                    if (Validator.isNull(_resourceTemplateId)) {
135                            super.serveResource(resourceRequest, resourceResponse);
136    
137                            return;
138                    }
139    
140                    try {
141                            mergeTemplate(
142                                    _resourceTemplateId, resourceRequest, resourceResponse);
143                    }
144                    catch (Exception e) {
145                            throw new PortletException(e);
146                    }
147            }
148    
149            protected String getTemplateId(String name) {
150                    if (Validator.isNull(name)) {
151                            return name;
152                    }
153    
154                    StringBundler sb = new StringBundler(4);
155    
156                    sb.append(_portletContextName);
157                    sb.append(TemplateConstants.SERVLET_SEPARATOR);
158                    sb.append(StrutsUtil.TEXT_HTML_DIR);
159                    sb.append(name);
160    
161                    return sb.toString();
162            }
163    
164            protected void mergeTemplate(
165                            String templateId, PortletRequest portletRequest,
166                            PortletResponse portletResponse)
167                    throws Exception {
168    
169                    TemplateResource templateResource =
170                            TemplateResourceLoaderUtil.getTemplateResource(
171                                    TemplateConstants.LANG_TYPE_VM, templateId);
172    
173                    if (templateResource == null) {
174                            throw new Exception(
175                                    "Unable to load template resource " + templateId);
176                    }
177    
178                    Template template = TemplateManagerUtil.getTemplate(
179                            TemplateConstants.LANG_TYPE_VM, templateResource, false);
180    
181                    prepareTemplate(template, portletRequest, portletResponse);
182    
183                    mergeTemplate(templateId, template, portletRequest, portletResponse);
184            }
185    
186            protected void mergeTemplate(
187                            String templateId, Template template, PortletRequest portletRequest,
188                            PortletResponse portletResponse)
189                    throws Exception {
190    
191                    Writer writer = null;
192    
193                    if (portletResponse instanceof MimeResponse) {
194                            MimeResponse mimeResponse = (MimeResponse)portletResponse;
195    
196                            writer = mimeResponse.getWriter();
197                    }
198                    else {
199                            writer = new UnsyncStringWriter();
200                    }
201    
202                    template.processTemplate(writer);
203            }
204    
205            protected void prepareTemplate(
206                    Template template, PortletRequest portletRequest,
207                    PortletResponse portletResponse) {
208    
209                    template.put("portletConfig", getPortletConfig());
210                    template.put("portletContext", getPortletContext());
211                    template.put("preferences", portletRequest.getPreferences());
212                    template.put(
213                            "userInfo", portletRequest.getAttribute(PortletRequest.USER_INFO));
214    
215                    template.put("portletRequest", portletRequest);
216    
217                    if (portletRequest instanceof ActionRequest) {
218                            template.put("actionRequest", portletRequest);
219                    }
220                    else if (portletRequest instanceof RenderRequest) {
221                            template.put("renderRequest", portletRequest);
222                    }
223                    else {
224                            template.put("resourceRequest", portletRequest);
225                    }
226    
227                    template.put("portletResponse", portletResponse);
228    
229                    if (portletResponse instanceof ActionResponse) {
230                            template.put("actionResponse", portletResponse);
231                    }
232                    else if (portletRequest instanceof RenderResponse) {
233                            template.put("renderResponse", portletResponse);
234                    }
235                    else {
236                            template.put("resourceResponse", portletResponse);
237                    }
238            }
239    
240            private String _actionTemplateId;
241            private String _editTemplateId;
242            private String _helpTemplateId;
243            private String _portletContextName;
244            private String _resourceTemplateId;
245            private String _viewTemplateId;
246    
247    }