001
014
015 package com.liferay.portal.kernel.portlet;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.language.LanguageUtil;
019 import com.liferay.portal.kernel.servlet.ServletResponseUtil;
020 import com.liferay.portal.kernel.servlet.SessionErrors;
021 import com.liferay.portal.kernel.servlet.SessionMessages;
022 import com.liferay.portal.kernel.util.ContentTypes;
023 import com.liferay.portal.kernel.util.GetterUtil;
024 import com.liferay.portal.kernel.util.JavaConstants;
025 import com.liferay.portal.kernel.util.MethodKey;
026 import com.liferay.portal.kernel.util.ParamUtil;
027 import com.liferay.portal.kernel.util.Validator;
028 import com.liferay.portal.kernel.util.WebKeys;
029 import com.liferay.portal.theme.ThemeDisplay;
030 import com.liferay.portal.util.PortalUtil;
031
032 import java.io.IOException;
033
034 import java.lang.reflect.InvocationTargetException;
035 import java.lang.reflect.Method;
036
037 import javax.portlet.ActionRequest;
038 import javax.portlet.ActionResponse;
039 import javax.portlet.GenericPortlet;
040 import javax.portlet.MimeResponse;
041 import javax.portlet.PortletConfig;
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(actionRequest, cause.getClass(), cause);
097 }
098 else {
099 throw pe;
100 }
101 }
102 }
103
104 @Override
105 public void serveResource(
106 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
107 throws IOException, PortletException {
108
109 if (!isProcessResourceRequest(resourceRequest)) {
110 return;
111 }
112
113 super.serveResource(resourceRequest, resourceResponse);
114 }
115
116 protected void addSuccessMessage(
117 ActionRequest actionRequest, ActionResponse actionResponse) {
118
119 if (!addProcessActionSuccessMessage) {
120 return;
121 }
122
123 String successMessage = ParamUtil.getString(
124 actionRequest, "successMessage");
125
126 SessionMessages.add(actionRequest, "requestProcessed", successMessage);
127 }
128
129 protected boolean callActionMethod(
130 ActionRequest actionRequest, ActionResponse actionResponse)
131 throws PortletException {
132
133 String actionName = ParamUtil.getString(
134 actionRequest, ActionRequest.ACTION_NAME);
135
136 if (Validator.isNull(actionName) ||
137 actionName.equals("callActionMethod") ||
138 actionName.equals("processAction")) {
139
140 return false;
141 }
142
143 try {
144 MethodKey methodKey = new MethodKey(
145 getClass(), actionName, ActionRequest.class,
146 ActionResponse.class);
147
148 Method method = methodKey.getMethod();
149
150 method.invoke(this, actionRequest, actionResponse);
151
152 return true;
153 }
154 catch (NoSuchMethodException nsme) {
155 try {
156 super.processAction(actionRequest, actionResponse);
157
158 return true;
159 }
160 catch (Exception e) {
161 throw new PortletException(nsme);
162 }
163 }
164 catch (InvocationTargetException ite) {
165 Throwable cause = ite.getCause();
166
167 if (cause != null) {
168 throw new PortletException(cause);
169 }
170 else {
171 throw new PortletException(ite);
172 }
173 }
174 catch (Exception e) {
175 throw new PortletException(e);
176 }
177 }
178
179 @SuppressWarnings("unused")
180 protected void doAbout(
181 RenderRequest renderRequest, RenderResponse renderResponse)
182 throws IOException, PortletException {
183
184 throw new PortletException("doAbout method not implemented");
185 }
186
187 @SuppressWarnings("unused")
188 protected void doConfig(
189 RenderRequest renderRequest, RenderResponse renderResponse)
190 throws IOException, PortletException {
191
192 throw new PortletException("doConfig method not implemented");
193 }
194
195 @Override
196 protected void doDispatch(
197 RenderRequest renderRequest, RenderResponse renderResponse)
198 throws IOException, PortletException {
199
200 if (!isProcessRenderRequest(renderRequest)) {
201 renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.FALSE);
202
203 return;
204 }
205
206 WindowState windowState = renderRequest.getWindowState();
207
208 if (windowState.equals(WindowState.MINIMIZED)) {
209 return;
210 }
211
212 PortletMode portletMode = renderRequest.getPortletMode();
213
214 if (portletMode.equals(PortletMode.VIEW)) {
215 doView(renderRequest, renderResponse);
216 }
217 else if (portletMode.equals(LiferayPortletMode.ABOUT)) {
218 doAbout(renderRequest, renderResponse);
219 }
220 else if (portletMode.equals(LiferayPortletMode.CONFIG)) {
221 doConfig(renderRequest, renderResponse);
222 }
223 else if (portletMode.equals(PortletMode.EDIT)) {
224 doEdit(renderRequest, renderResponse);
225 }
226 else if (portletMode.equals(LiferayPortletMode.EDIT_DEFAULTS)) {
227 doEditDefaults(renderRequest, renderResponse);
228 }
229 else if (portletMode.equals(LiferayPortletMode.EDIT_GUEST)) {
230 doEditGuest(renderRequest, renderResponse);
231 }
232 else if (portletMode.equals(PortletMode.HELP)) {
233 doHelp(renderRequest, renderResponse);
234 }
235 else if (portletMode.equals(LiferayPortletMode.PREVIEW)) {
236 doPreview(renderRequest, renderResponse);
237 }
238 else if (portletMode.equals(LiferayPortletMode.PRINT)) {
239 doPrint(renderRequest, renderResponse);
240 }
241 else {
242 throw new PortletException(portletMode.toString());
243 }
244 }
245
246 @SuppressWarnings("unused")
247 protected void doEditDefaults(
248 RenderRequest renderRequest, RenderResponse renderResponse)
249 throws IOException, PortletException {
250
251 throw new PortletException("doEditDefaults method not implemented");
252 }
253
254 @SuppressWarnings("unused")
255 protected void doEditGuest(
256 RenderRequest renderRequest, RenderResponse renderResponse)
257 throws IOException, PortletException {
258
259 throw new PortletException("doEditGuest method not implemented");
260 }
261
262 @SuppressWarnings("unused")
263 protected void doPreview(
264 RenderRequest renderRequest, RenderResponse renderResponse)
265 throws IOException, PortletException {
266
267 throw new PortletException("doPreview method not implemented");
268 }
269
270 @SuppressWarnings("unused")
271 protected void doPrint(
272 RenderRequest renderRequest, RenderResponse renderResponse)
273 throws IOException, PortletException {
274
275 throw new PortletException("doPrint method not implemented");
276 }
277
278 protected String getRedirect(
279 ActionRequest actionRequest, ActionResponse actionResponse) {
280
281 String redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
282
283 if (Validator.isNull(redirect)) {
284 redirect = ParamUtil.getString(actionRequest, "redirect");
285 }
286
287 return redirect;
288 }
289
290 @Override
291 protected String getTitle(RenderRequest renderRequest) {
292 try {
293 return PortalUtil.getPortletTitle(renderRequest);
294 }
295 catch (Exception e) {
296 return super.getTitle(renderRequest);
297 }
298 }
299
300 protected boolean isProcessActionRequest(ActionRequest actionRequest) {
301 return isProcessPortletRequest(actionRequest);
302 }
303
304 protected boolean isProcessPortletRequest(PortletRequest portletRequest) {
305 return _PROCESS_PORTLET_REQUEST;
306 }
307
308 protected boolean isProcessRenderRequest(RenderRequest renderRequest) {
309 return isProcessPortletRequest(renderRequest);
310 }
311
312 protected boolean isProcessResourceRequest(
313 ResourceRequest resourceRequest) {
314
315 return isProcessPortletRequest(resourceRequest);
316 }
317
318 protected boolean isSessionErrorException(Throwable cause) {
319 if (cause instanceof PortalException) {
320 return true;
321 }
322
323 return false;
324 }
325
326 protected void sendRedirect(
327 ActionRequest actionRequest, ActionResponse actionResponse)
328 throws IOException {
329
330 String redirect = getRedirect(actionRequest, actionResponse);
331
332 if (Validator.isNotNull(redirect)) {
333 actionResponse.sendRedirect(redirect);
334 }
335 }
336
337 protected String translate(PortletRequest portletRequest, String key) {
338 PortletConfig portletConfig =
339 (PortletConfig)portletRequest.getAttribute(
340 JavaConstants.JAVAX_PORTLET_CONFIG);
341
342 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
343 WebKeys.THEME_DISPLAY);
344
345 return LanguageUtil.get(portletConfig, themeDisplay.getLocale(), key);
346 }
347
348 protected String translate(
349 PortletRequest portletRequest, String key, Object argument) {
350
351 PortletConfig portletConfig =
352 (PortletConfig)portletRequest.getAttribute(
353 JavaConstants.JAVAX_PORTLET_CONFIG);
354
355 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
356 WebKeys.THEME_DISPLAY);
357
358 return LanguageUtil.format(
359 portletConfig, themeDisplay.getLocale(), key, argument);
360 }
361
362 protected String translate(
363 PortletRequest portletRequest, String key, Object[] arguments) {
364
365 PortletConfig portletConfig =
366 (PortletConfig)portletRequest.getAttribute(
367 JavaConstants.JAVAX_PORTLET_CONFIG);
368
369 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
370 WebKeys.THEME_DISPLAY);
371
372 return LanguageUtil.format(
373 portletConfig, themeDisplay.getLocale(), key, arguments);
374 }
375
376 protected void writeJSON(
377 PortletRequest portletRequest, ActionResponse actionResponse,
378 Object json)
379 throws IOException {
380
381 HttpServletResponse response = PortalUtil.getHttpServletResponse(
382 actionResponse);
383
384 response.setContentType(ContentTypes.TEXT_JAVASCRIPT);
385
386 ServletResponseUtil.write(response, json.toString());
387 }
388
389 protected void writeJSON(
390 PortletRequest portletRequest, MimeResponse mimeResponse,
391 Object json)
392 throws IOException {
393
394 mimeResponse.setContentType(ContentTypes.TEXT_JAVASCRIPT);
395
396 PortletResponseUtil.write(mimeResponse, json.toString());
397 }
398
399 protected boolean addProcessActionSuccessMessage;
400
401 private static final boolean _PROCESS_PORTLET_REQUEST = true;
402
403 }