001
014
015 package com.liferay.portal.struts;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.log.Log;
020 import com.liferay.portal.kernel.log.LogFactoryUtil;
021 import com.liferay.portal.kernel.portlet.PortletResponseUtil;
022 import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
023 import com.liferay.portal.kernel.servlet.ServletResponseUtil;
024 import com.liferay.portal.kernel.servlet.SessionErrors;
025 import com.liferay.portal.kernel.servlet.SessionMessages;
026 import com.liferay.portal.kernel.util.ContentTypes;
027 import com.liferay.portal.kernel.util.GetterUtil;
028 import com.liferay.portal.kernel.util.HttpUtil;
029 import com.liferay.portal.kernel.util.JavaConstants;
030 import com.liferay.portal.kernel.util.ParamUtil;
031 import com.liferay.portal.kernel.util.StringPool;
032 import com.liferay.portal.kernel.util.StringUtil;
033 import com.liferay.portal.kernel.util.Validator;
034 import com.liferay.portal.model.Layout;
035 import com.liferay.portal.model.LayoutTypePortlet;
036 import com.liferay.portal.model.Portlet;
037 import com.liferay.portal.security.auth.PrincipalException;
038 import com.liferay.portal.service.PortletLocalServiceUtil;
039 import com.liferay.portal.theme.ThemeDisplay;
040 import com.liferay.portal.util.PortalUtil;
041 import com.liferay.portal.util.WebKeys;
042 import com.liferay.portlet.PortletPreferencesFactoryUtil;
043 import com.liferay.portlet.StrictPortletPreferencesImpl;
044
045 import java.io.IOException;
046
047 import javax.portlet.ActionRequest;
048 import javax.portlet.ActionResponse;
049 import javax.portlet.EventRequest;
050 import javax.portlet.EventResponse;
051 import javax.portlet.MimeResponse;
052 import javax.portlet.PortletConfig;
053 import javax.portlet.PortletContext;
054 import javax.portlet.PortletPreferences;
055 import javax.portlet.PortletRequest;
056 import javax.portlet.PortletRequestDispatcher;
057 import javax.portlet.PortletResponse;
058 import javax.portlet.RenderRequest;
059 import javax.portlet.RenderResponse;
060 import javax.portlet.ResourceRequest;
061 import javax.portlet.ResourceResponse;
062
063 import javax.servlet.ServletContext;
064 import javax.servlet.http.HttpServletRequest;
065 import javax.servlet.http.HttpServletResponse;
066
067 import org.apache.struts.Globals;
068 import org.apache.struts.action.Action;
069 import org.apache.struts.action.ActionForm;
070 import org.apache.struts.action.ActionForward;
071 import org.apache.struts.action.ActionMapping;
072 import org.apache.struts.config.ModuleConfig;
073 import org.apache.struts.util.MessageResources;
074
075
078 public class PortletAction extends Action {
079
080 public static String getForwardKey(HttpServletRequest request) {
081 String portletId = (String)request.getAttribute(WebKeys.PORTLET_ID);
082
083 String portletNamespace = PortalUtil.getPortletNamespace(portletId);
084
085 return portletNamespace.concat(WebKeys.PORTLET_STRUTS_FORWARD);
086 }
087
088 public static String getForwardKey(PortletRequest portletRequest) {
089 String portletId = (String)portletRequest.getAttribute(
090 WebKeys.PORTLET_ID);
091
092 String portletNamespace = PortalUtil.getPortletNamespace(portletId);
093
094 return portletNamespace.concat(WebKeys.PORTLET_STRUTS_FORWARD);
095 }
096
097 @Override
098 public ActionForward execute(
099 ActionMapping actionMapping, ActionForm actionForm,
100 HttpServletRequest request, HttpServletResponse response)
101 throws Exception {
102
103 PortletConfig portletConfig = (PortletConfig)request.getAttribute(
104 JavaConstants.JAVAX_PORTLET_CONFIG);
105
106 PortletRequest portletRequest = (PortletRequest)request.getAttribute(
107 JavaConstants.JAVAX_PORTLET_REQUEST);
108
109 PortletResponse portletResponse = (PortletResponse)request.getAttribute(
110 JavaConstants.JAVAX_PORTLET_RESPONSE);
111
112 Boolean strutsExecute = (Boolean)request.getAttribute(
113 WebKeys.PORTLET_STRUTS_EXECUTE);
114
115 if ((strutsExecute != null) && strutsExecute.booleanValue()) {
116 return strutsExecute(actionMapping, actionForm, request, response);
117 }
118 else if (portletRequest instanceof RenderRequest) {
119 return render(
120 actionMapping, actionForm, portletConfig,
121 (RenderRequest)portletRequest, (RenderResponse)portletResponse);
122 }
123 else {
124 if (portletRequest instanceof EventRequest) {
125 processEvent(
126 actionMapping, actionForm, portletConfig,
127 (EventRequest)portletRequest,
128 (EventResponse)portletResponse);
129 }
130 else {
131 serveResource(
132 actionMapping, actionForm, portletConfig,
133 (ResourceRequest)portletRequest,
134 (ResourceResponse)portletResponse);
135 }
136
137 return actionMapping.findForward(ActionConstants.COMMON_NULL);
138 }
139 }
140
141 public void processAction(
142 ActionMapping actionMapping, ActionForm actionForm,
143 PortletConfig portletConfig, ActionRequest actionRequest,
144 ActionResponse actionResponse)
145 throws Exception {
146 }
147
148 public void processEvent(
149 ActionMapping actionMapping, ActionForm actionForm,
150 PortletConfig portletConfig, EventRequest eventRequest,
151 EventResponse eventResponse)
152 throws Exception {
153 }
154
155 public ActionForward render(
156 ActionMapping actionMapping, ActionForm actionForm,
157 PortletConfig portletConfig, RenderRequest renderRequest,
158 RenderResponse renderResponse)
159 throws Exception {
160
161 if (_log.isDebugEnabled()) {
162 _log.debug("Forward to " + getForward(renderRequest));
163 }
164
165 return actionMapping.findForward(getForward(renderRequest));
166 }
167
168 public void serveResource(
169 ActionMapping actionMapping, ActionForm actionForm,
170 PortletConfig portletConfig, ResourceRequest resourceRequest,
171 ResourceResponse resourceResponse)
172 throws Exception {
173
174 String resourceId = resourceRequest.getResourceID();
175
176 if (Validator.isNull(resourceId)) {
177 return;
178 }
179
180 PortletContext portletContext = portletConfig.getPortletContext();
181
182 PortletRequestDispatcher portletRequestDispatcher =
183 portletContext.getRequestDispatcher(resourceId);
184
185 if (portletRequestDispatcher == null) {
186 return;
187 }
188
189 portletRequestDispatcher.forward(resourceRequest, resourceResponse);
190 }
191
192 public ActionForward strutsExecute(
193 ActionMapping actionMapping, ActionForm actionForm,
194 HttpServletRequest request, HttpServletResponse response)
195 throws Exception {
196
197 return super.execute(actionMapping, actionForm, request, response);
198 }
199
200 protected void addSuccessMessage(
201 ActionRequest actionRequest, ActionResponse actionResponse) {
202
203 PortletConfig portletConfig = (PortletConfig)actionRequest.getAttribute(
204 JavaConstants.JAVAX_PORTLET_CONFIG);
205
206 boolean addProcessActionSuccessMessage = GetterUtil.getBoolean(
207 portletConfig.getInitParameter("add-process-action-success-action"),
208 true);
209
210 if (!addProcessActionSuccessMessage) {
211 return;
212 }
213
214 String successMessage = ParamUtil.getString(
215 actionRequest, "successMessage");
216
217 SessionMessages.add(actionRequest, "requestProcessed", successMessage);
218 }
219
220 protected String getForward(PortletRequest portletRequest) {
221 return getForward(portletRequest, null);
222 }
223
224 protected String getForward(
225 PortletRequest portletRequest, String defaultValue) {
226
227 String forward = (String)portletRequest.getAttribute(
228 getForwardKey(portletRequest));
229
230 if (forward == null) {
231 return defaultValue;
232 }
233 else {
234 return forward;
235 }
236 }
237
238 protected ModuleConfig getModuleConfig(PortletRequest portletRequest) {
239 return (ModuleConfig)portletRequest.getAttribute(Globals.MODULE_KEY);
240 }
241
242 protected MessageResources getResources() {
243 ServletContext servletContext = getServlet().getServletContext();
244
245 return (MessageResources)servletContext.getAttribute(
246 Globals.MESSAGES_KEY);
247 }
248
249 @Override
250 protected MessageResources getResources(HttpServletRequest request) {
251 return getResources();
252 }
253
254 protected MessageResources getResources(PortletRequest portletRequest) {
255 return getResources();
256 }
257
258 protected PortletPreferences getStrictPortletSetup(
259 Layout layout, String portletId)
260 throws PortalException, SystemException {
261
262 if (Validator.isNull(portletId)) {
263 return null;
264 }
265
266 PortletPreferences portletPreferences =
267 PortletPreferencesFactoryUtil.getStrictPortletSetup(
268 layout, portletId);
269
270 if (portletPreferences instanceof StrictPortletPreferencesImpl) {
271 throw new PrincipalException();
272 }
273
274 return portletPreferences;
275 }
276
277 protected PortletPreferences getStrictPortletSetup(
278 PortletRequest portletRequest)
279 throws PortalException, SystemException {
280
281 String portletResource = ParamUtil.getString(
282 portletRequest, "portletResource");
283
284 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
285 WebKeys.THEME_DISPLAY);
286
287 return getStrictPortletSetup(themeDisplay.getLayout(), portletResource);
288 }
289
290
293 protected void hideDefaultSuccessMessage(
294 PortletConfig portletConfig, PortletRequest portletRequest) {
295
296 hideDefaultSuccessMessage(portletRequest);
297 }
298
299 protected void hideDefaultSuccessMessage(PortletRequest portletRequest) {
300 SessionMessages.add(
301 portletRequest,
302 PortalUtil.getPortletId(portletRequest) +
303 SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_SUCCESS_MESSAGE);
304 }
305
306 protected boolean isCheckMethodOnProcessAction() {
307 return _CHECK_METHOD_ON_PROCESS_ACTION;
308 }
309
310 protected boolean isDisplaySuccessMessage(PortletRequest portletRequest)
311 throws SystemException {
312
313 if (!SessionErrors.isEmpty(portletRequest)) {
314 return false;
315 }
316
317 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
318 WebKeys.THEME_DISPLAY);
319
320 Layout layout = themeDisplay.getLayout();
321
322 if (layout.isTypeControlPanel()) {
323 return true;
324 }
325
326 String portletId = (String)portletRequest.getAttribute(
327 WebKeys.PORTLET_ID);
328
329 try {
330 LayoutTypePortlet layoutTypePortlet =
331 themeDisplay.getLayoutTypePortlet();
332
333 if (layoutTypePortlet.hasPortletId(portletId)) {
334 return true;
335 }
336 }
337 catch (PortalException pe) {
338 if (_log.isDebugEnabled()) {
339 _log.debug(pe, pe);
340 }
341 }
342
343 Portlet portlet = PortletLocalServiceUtil.getPortletById(
344 themeDisplay.getCompanyId(), portletId);
345
346 if (portlet.isAddDefaultResource()) {
347 return true;
348 }
349
350 return false;
351 }
352
353 protected boolean redirectToLogin(
354 ActionRequest actionRequest, ActionResponse actionResponse)
355 throws IOException {
356
357 if (actionRequest.getRemoteUser() == null) {
358 HttpServletRequest request = PortalUtil.getHttpServletRequest(
359 actionRequest);
360
361 SessionErrors.add(request, PrincipalException.class.getName());
362
363 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
364 WebKeys.THEME_DISPLAY);
365
366 actionResponse.sendRedirect(themeDisplay.getURLSignIn());
367
368 return true;
369 }
370 else {
371 return false;
372 }
373 }
374
375 protected void sendRedirect(
376 ActionRequest actionRequest, ActionResponse actionResponse)
377 throws IOException, SystemException {
378
379 sendRedirect(actionRequest, actionResponse, null);
380 }
381
382 protected void sendRedirect(
383 ActionRequest actionRequest, ActionResponse actionResponse,
384 String redirect)
385 throws IOException, SystemException {
386
387 sendRedirect(null, actionRequest, actionResponse, redirect, null);
388 }
389
390 protected void sendRedirect(
391 PortletConfig portletConfig, ActionRequest actionRequest,
392 ActionResponse actionResponse, String redirect,
393 String closeRedirect)
394 throws IOException, SystemException {
395
396 if (isDisplaySuccessMessage(actionRequest)) {
397 addSuccessMessage(actionRequest, actionResponse);
398 }
399
400 if (Validator.isNull(redirect)) {
401 redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
402 }
403
404 if (Validator.isNull(redirect)) {
405 redirect = ParamUtil.getString(actionRequest, "redirect");
406 }
407
408 if ((portletConfig != null) && Validator.isNotNull(redirect) &&
409 Validator.isNotNull(closeRedirect)) {
410
411 redirect = HttpUtil.setParameter(
412 redirect, "closeRedirect", closeRedirect);
413
414 SessionMessages.add(
415 actionRequest,
416 PortalUtil.getPortletId(actionRequest) +
417 SessionMessages.KEY_SUFFIX_CLOSE_REDIRECT,
418 closeRedirect);
419 }
420
421 if (Validator.isNull(redirect)) {
422 return;
423 }
424
425
426
427 HttpServletRequest request = PortalUtil.getHttpServletRequest(
428 actionRequest);
429
430 if (BrowserSnifferUtil.isIe(request) &&
431 (BrowserSnifferUtil.getMajorVersion(request) == 6.0) &&
432 redirect.contains(StringPool.POUND)) {
433
434 String redirectToken = "&#";
435
436 if (!redirect.contains(StringPool.QUESTION)) {
437 redirectToken = StringPool.QUESTION + redirectToken;
438 }
439
440 redirect = StringUtil.replace(
441 redirect, StringPool.POUND, redirectToken);
442 }
443
444 redirect = PortalUtil.escapeRedirect(redirect);
445
446 if (Validator.isNotNull(redirect)) {
447 actionResponse.sendRedirect(redirect);
448 }
449 }
450
451 protected void setForward(PortletRequest portletRequest, String forward) {
452 portletRequest.setAttribute(getForwardKey(portletRequest), forward);
453 }
454
455 protected void writeJSON(
456 PortletRequest portletRequest, ActionResponse actionResponse,
457 Object json)
458 throws IOException {
459
460 HttpServletResponse response = PortalUtil.getHttpServletResponse(
461 actionResponse);
462
463 response.setContentType(ContentTypes.APPLICATION_JSON);
464
465 ServletResponseUtil.write(response, json.toString());
466
467 response.flushBuffer();
468
469 setForward(portletRequest, ActionConstants.COMMON_NULL);
470 }
471
472 protected void writeJSON(
473 PortletRequest portletRequest, MimeResponse mimeResponse,
474 Object json)
475 throws IOException {
476
477 mimeResponse.setContentType(ContentTypes.APPLICATION_JSON);
478
479 PortletResponseUtil.write(mimeResponse, json.toString());
480
481 mimeResponse.flushBuffer();
482 }
483
484 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = true;
485
486 private static Log _log = LogFactoryUtil.getLog(PortletAction.class);
487
488 }