001
014
015 package com.liferay.portal.kernel.portlet;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.servlet.ServletResponseUtil;
019 import com.liferay.portal.kernel.servlet.SessionErrors;
020 import com.liferay.portal.kernel.servlet.SessionMessages;
021 import com.liferay.portal.kernel.util.ContentTypes;
022 import com.liferay.portal.kernel.util.GetterUtil;
023 import com.liferay.portal.kernel.util.MethodCache;
024 import com.liferay.portal.kernel.util.MethodKey;
025 import com.liferay.portal.kernel.util.ParamUtil;
026 import com.liferay.portal.kernel.util.Validator;
027 import com.liferay.portal.kernel.util.WebKeys;
028 import com.liferay.portal.util.PortalUtil;
029
030 import java.io.IOException;
031
032 import java.lang.reflect.InvocationTargetException;
033 import java.lang.reflect.Method;
034
035 import java.util.HashMap;
036 import java.util.Map;
037
038 import javax.portlet.ActionRequest;
039 import javax.portlet.ActionResponse;
040 import javax.portlet.GenericPortlet;
041 import javax.portlet.MimeResponse;
042 import javax.portlet.PortletException;
043 import javax.portlet.PortletMode;
044 import javax.portlet.PortletRequest;
045 import javax.portlet.RenderRequest;
046 import javax.portlet.RenderResponse;
047 import javax.portlet.ResourceRequest;
048 import javax.portlet.ResourceResponse;
049 import javax.portlet.WindowState;
050
051 import javax.servlet.http.HttpServletResponse;
052
053
056 public class LiferayPortlet extends GenericPortlet {
057
058 @Override
059 public void init() throws PortletException {
060 super.init();
061
062 addProcessActionSuccessMessage = GetterUtil.getBoolean(
063 getInitParameter("add-process-action-success-action"), true);
064 }
065
066 @Override
067 public void processAction(
068 ActionRequest actionRequest, ActionResponse actionResponse)
069 throws IOException, PortletException {
070
071 try {
072 if (!isProcessActionRequest(actionRequest)) {
073 return;
074 }
075
076 if (!callActionMethod(actionRequest, actionResponse)) {
077 return;
078 }
079
080 if (!SessionErrors.isEmpty(actionRequest)) {
081 return;
082 }
083
084 if (!SessionMessages.isEmpty(actionRequest)) {
085 return;
086 }
087
088 addSuccessMessage(actionRequest, actionResponse);
089
090 sendRedirect(actionRequest, actionResponse);
091 }
092 catch (PortletException pe) {
093 Throwable cause = pe.getCause();
094
095 if (isSessionErrorException(cause)) {
096 SessionErrors.add(
097 actionRequest, cause.getClass().getName(), cause);
098 }
099 else {
100 throw pe;
101 }
102 }
103 }
104
105 @Override
106 public void serveResource(
107 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
108 throws IOException, PortletException {
109
110 if (!isProcessResourceRequest(resourceRequest)) {
111 return;
112 }
113
114 super.serveResource(resourceRequest, resourceResponse);
115 }
116
117 protected void addSuccessMessage(
118 ActionRequest actionRequest, ActionResponse actionResponse) {
119
120 if (!addProcessActionSuccessMessage) {
121 return;
122 }
123
124 String successMessage = ParamUtil.getString(
125 actionRequest, "successMessage");
126
127 SessionMessages.add(actionRequest, "request_processed", successMessage);
128 }
129
130 protected boolean callActionMethod(
131 ActionRequest actionRequest, ActionResponse actionResponse)
132 throws PortletException {
133
134 String actionName = ParamUtil.getString(
135 actionRequest, ActionRequest.ACTION_NAME);
136
137 if (Validator.isNull(actionName)) {
138 return false;
139 }
140
141 try {
142 Method method = MethodCache.get(
143 _classesMap, _methodsMap, getClass().getName(), actionName,
144 new Class[] {ActionRequest.class, ActionResponse.class});
145
146 method.invoke(this, actionRequest, actionResponse);
147
148 return true;
149 }
150 catch (NoSuchMethodException nsme) {
151 try {
152 super.processAction(actionRequest, actionResponse);
153
154 return true;
155 }
156 catch (Exception e) {
157 throw new PortletException(nsme);
158 }
159 }
160 catch (InvocationTargetException ite) {
161 Throwable cause = ite.getCause();
162
163 if (cause != null) {
164 throw new PortletException(cause);
165 }
166 else {
167 throw new PortletException(ite);
168 }
169 }
170 catch (Exception e) {
171 throw new PortletException(e);
172 }
173 }
174
175 @SuppressWarnings("unused")
176 protected void doAbout(
177 RenderRequest renderRequest, RenderResponse renderResponse)
178 throws IOException, PortletException {
179
180 throw new PortletException("doAbout method not implemented");
181 }
182
183 @SuppressWarnings("unused")
184 protected void doConfig(
185 RenderRequest renderRequest, RenderResponse renderResponse)
186 throws IOException, PortletException {
187
188 throw new PortletException("doConfig method not implemented");
189 }
190
191 @Override
192 protected void doDispatch(
193 RenderRequest renderRequest, RenderResponse renderResponse)
194 throws IOException, PortletException {
195
196 if (!isProcessRenderRequest(renderRequest)) {
197 renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.FALSE);
198
199 return;
200 }
201
202 WindowState windowState = renderRequest.getWindowState();
203
204 if (windowState.equals(WindowState.MINIMIZED)) {
205 return;
206 }
207
208 PortletMode portletMode = renderRequest.getPortletMode();
209
210 if (portletMode.equals(PortletMode.VIEW)) {
211 doView(renderRequest, renderResponse);
212 }
213 else if (portletMode.equals(LiferayPortletMode.ABOUT)) {
214 doAbout(renderRequest, renderResponse);
215 }
216 else if (portletMode.equals(LiferayPortletMode.CONFIG)) {
217 doConfig(renderRequest, renderResponse);
218 }
219 else if (portletMode.equals(PortletMode.EDIT)) {
220 doEdit(renderRequest, renderResponse);
221 }
222 else if (portletMode.equals(LiferayPortletMode.EDIT_DEFAULTS)) {
223 doEditDefaults(renderRequest, renderResponse);
224 }
225 else if (portletMode.equals(LiferayPortletMode.EDIT_GUEST)) {
226 doEditGuest(renderRequest, renderResponse);
227 }
228 else if (portletMode.equals(PortletMode.HELP)) {
229 doHelp(renderRequest, renderResponse);
230 }
231 else if (portletMode.equals(LiferayPortletMode.PREVIEW)) {
232 doPreview(renderRequest, renderResponse);
233 }
234 else if (portletMode.equals(LiferayPortletMode.PRINT)) {
235 doPrint(renderRequest, renderResponse);
236 }
237 else {
238 throw new PortletException(portletMode.toString());
239 }
240 }
241
242 @SuppressWarnings("unused")
243 protected void doEditDefaults(
244 RenderRequest renderRequest, RenderResponse renderResponse)
245 throws IOException, PortletException {
246
247 throw new PortletException("doEditDefaults method not implemented");
248 }
249
250 @SuppressWarnings("unused")
251 protected void doEditGuest(
252 RenderRequest renderRequest, RenderResponse renderResponse)
253 throws IOException, PortletException {
254
255 throw new PortletException("doEditGuest method not implemented");
256 }
257
258 @SuppressWarnings("unused")
259 protected void doPreview(
260 RenderRequest renderRequest, RenderResponse renderResponse)
261 throws IOException, PortletException {
262
263 throw new PortletException("doPreview method not implemented");
264 }
265
266 @SuppressWarnings("unused")
267 protected void doPrint(
268 RenderRequest renderRequest, RenderResponse renderResponse)
269 throws IOException, PortletException {
270
271 throw new PortletException("doPrint method not implemented");
272 }
273
274 protected String getRedirect(
275 ActionRequest actionRequest, ActionResponse actionResponse) {
276
277 String redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
278
279 if (Validator.isNull(redirect)) {
280 redirect = ParamUtil.getString(actionRequest, "redirect");
281 }
282
283 return redirect;
284 }
285
286 protected boolean isProcessActionRequest(ActionRequest actionRequest) {
287 return isProcessPortletRequest(actionRequest);
288 }
289
290 protected boolean isProcessPortletRequest(PortletRequest portletRequest) {
291 return _PROCESS_PORTLET_REQUEST;
292 }
293
294 protected boolean isProcessRenderRequest(RenderRequest renderRequest) {
295 return isProcessPortletRequest(renderRequest);
296 }
297
298 protected boolean isProcessResourceRequest(
299 ResourceRequest resourceRequest) {
300
301 return isProcessPortletRequest(resourceRequest);
302 }
303
304 protected boolean isSessionErrorException(Throwable cause) {
305 if (cause instanceof PortalException) {
306 return true;
307 }
308 else {
309 return false;
310 }
311 }
312
313 protected void sendRedirect(
314 ActionRequest actionRequest, ActionResponse actionResponse)
315 throws IOException {
316
317 String redirect = getRedirect(actionRequest, actionResponse);
318
319 if (Validator.isNotNull(redirect)) {
320 actionResponse.sendRedirect(redirect);
321 }
322 }
323
324 protected void writeJSON(
325 PortletRequest portletRequest, ActionResponse actionResponse,
326 Object json)
327 throws IOException {
328
329 HttpServletResponse response = PortalUtil.getHttpServletResponse(
330 actionResponse);
331
332 response.setContentType(ContentTypes.TEXT_JAVASCRIPT);
333
334 ServletResponseUtil.write(response, json.toString());
335 }
336
337 protected void writeJSON(
338 PortletRequest portletRequest, MimeResponse mimeResponse,
339 Object json)
340 throws IOException {
341
342 mimeResponse.setContentType(ContentTypes.TEXT_JAVASCRIPT);
343
344 PortletResponseUtil.write(mimeResponse, json.toString());
345 }
346
347 protected boolean addProcessActionSuccessMessage;
348
349 private static final boolean _PROCESS_PORTLET_REQUEST = true;
350
351 private Map<String, Class<?>> _classesMap = new HashMap<String, Class<?>>();
352 private Map<MethodKey, Method> _methodsMap =
353 new HashMap<MethodKey, Method>();
354
355 }