001
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
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 }