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