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.LiferayPortletConfig;
022 import com.liferay.portal.kernel.portlet.PortletResponseUtil;
023 import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
024 import com.liferay.portal.kernel.servlet.ServletResponseUtil;
025 import com.liferay.portal.kernel.servlet.SessionErrors;
026 import com.liferay.portal.kernel.servlet.SessionMessages;
027 import com.liferay.portal.kernel.util.ContentTypes;
028 import com.liferay.portal.kernel.util.GetterUtil;
029 import com.liferay.portal.kernel.util.HttpUtil;
030 import com.liferay.portal.kernel.util.JavaConstants;
031 import com.liferay.portal.kernel.util.ParamUtil;
032 import com.liferay.portal.kernel.util.StringPool;
033 import com.liferay.portal.kernel.util.StringUtil;
034 import com.liferay.portal.kernel.util.Validator;
035 import com.liferay.portal.model.Layout;
036 import com.liferay.portal.model.LayoutTypePortlet;
037 import com.liferay.portal.model.Portlet;
038 import com.liferay.portal.security.auth.PrincipalException;
039 import com.liferay.portal.service.PortletLocalServiceUtil;
040 import com.liferay.portal.theme.ThemeDisplay;
041 import com.liferay.portal.util.PortalUtil;
042 import com.liferay.portal.util.WebKeys;
043
044 import java.io.IOException;
045
046 import javax.portlet.ActionRequest;
047 import javax.portlet.ActionResponse;
048 import javax.portlet.EventRequest;
049 import javax.portlet.EventResponse;
050 import javax.portlet.MimeResponse;
051 import javax.portlet.PortletConfig;
052 import javax.portlet.PortletContext;
053 import javax.portlet.PortletRequest;
054 import javax.portlet.PortletRequestDispatcher;
055 import javax.portlet.PortletResponse;
056 import javax.portlet.RenderRequest;
057 import javax.portlet.RenderResponse;
058 import javax.portlet.ResourceRequest;
059 import javax.portlet.ResourceResponse;
060
061 import javax.servlet.ServletContext;
062 import javax.servlet.http.HttpServletRequest;
063 import javax.servlet.http.HttpServletResponse;
064
065 import org.apache.struts.Globals;
066 import org.apache.struts.action.Action;
067 import org.apache.struts.action.ActionForm;
068 import org.apache.struts.action.ActionForward;
069 import org.apache.struts.action.ActionMapping;
070 import org.apache.struts.config.ModuleConfig;
071 import org.apache.struts.util.MessageResources;
072
073
076 public class PortletAction extends Action {
077
078 public static String getForwardKey(HttpServletRequest request) {
079 String portletId = (String)request.getAttribute(WebKeys.PORTLET_ID);
080
081 String portletNamespace = PortalUtil.getPortletNamespace(portletId);
082
083 return portletNamespace.concat(WebKeys.PORTLET_STRUTS_FORWARD);
084 }
085
086 public static String getForwardKey(PortletRequest portletRequest) {
087 String portletId = (String)portletRequest.getAttribute(
088 WebKeys.PORTLET_ID);
089
090 String portletNamespace = PortalUtil.getPortletNamespace(portletId);
091
092 return portletNamespace.concat(WebKeys.PORTLET_STRUTS_FORWARD);
093 }
094
095 @Override
096 public ActionForward execute(
097 ActionMapping actionMapping, ActionForm actionForm,
098 HttpServletRequest request, HttpServletResponse response)
099 throws Exception {
100
101 PortletConfig portletConfig = (PortletConfig)request.getAttribute(
102 JavaConstants.JAVAX_PORTLET_CONFIG);
103
104 PortletRequest portletRequest = (PortletRequest)request.getAttribute(
105 JavaConstants.JAVAX_PORTLET_REQUEST);
106
107 PortletResponse portletResponse = (PortletResponse)request.getAttribute(
108 JavaConstants.JAVAX_PORTLET_RESPONSE);
109
110 Boolean strutsExecute = (Boolean)request.getAttribute(
111 WebKeys.PORTLET_STRUTS_EXECUTE);
112
113 if ((strutsExecute != null) && strutsExecute.booleanValue()) {
114 return strutsExecute(actionMapping, actionForm, request, response);
115 }
116 else if (portletRequest instanceof RenderRequest) {
117 return render(
118 actionMapping, actionForm, portletConfig,
119 (RenderRequest)portletRequest, (RenderResponse)portletResponse);
120 }
121 else {
122 if (portletRequest instanceof EventRequest) {
123 processEvent(
124 actionMapping, actionForm, portletConfig,
125 (EventRequest)portletRequest,
126 (EventResponse)portletResponse);
127 }
128 else {
129 serveResource(
130 actionMapping, actionForm, portletConfig,
131 (ResourceRequest)portletRequest,
132 (ResourceResponse)portletResponse);
133 }
134
135 return actionMapping.findForward(ActionConstants.COMMON_NULL);
136 }
137 }
138
139 public void processAction(
140 ActionMapping actionMapping, ActionForm actionForm,
141 PortletConfig portletConfig, ActionRequest actionRequest,
142 ActionResponse actionResponse)
143 throws Exception {
144 }
145
146 public void processEvent(
147 ActionMapping actionMapping, ActionForm actionForm,
148 PortletConfig portletConfig, EventRequest eventRequest,
149 EventResponse eventResponse)
150 throws Exception {
151 }
152
153 public ActionForward render(
154 ActionMapping actionMapping, ActionForm actionForm,
155 PortletConfig portletConfig, RenderRequest renderRequest,
156 RenderResponse renderResponse)
157 throws Exception {
158
159 if (_log.isDebugEnabled()) {
160 _log.debug("Forward to " + getForward(renderRequest));
161 }
162
163 return actionMapping.findForward(getForward(renderRequest));
164 }
165
166 public void serveResource(
167 ActionMapping actionMapping, ActionForm actionForm,
168 PortletConfig portletConfig, ResourceRequest resourceRequest,
169 ResourceResponse resourceResponse)
170 throws Exception {
171
172 String resourceId = resourceRequest.getResourceID();
173
174 if (Validator.isNull(resourceId)) {
175 return;
176 }
177
178 PortletContext portletContext = portletConfig.getPortletContext();
179
180 PortletRequestDispatcher portletRequestDispatcher =
181 portletContext.getRequestDispatcher(resourceId);
182
183 if (portletRequestDispatcher == null) {
184 return;
185 }
186
187 portletRequestDispatcher.forward(resourceRequest, resourceResponse);
188 }
189
190 public ActionForward strutsExecute(
191 ActionMapping actionMapping, ActionForm actionForm,
192 HttpServletRequest request, HttpServletResponse response)
193 throws Exception {
194
195 return super.execute(actionMapping, actionForm, request, response);
196 }
197
198 protected void addSuccessMessage(
199 ActionRequest actionRequest, ActionResponse actionResponse) {
200
201 PortletConfig portletConfig = (PortletConfig)actionRequest.getAttribute(
202 JavaConstants.JAVAX_PORTLET_CONFIG);
203
204 boolean addProcessActionSuccessMessage = GetterUtil.getBoolean(
205 portletConfig.getInitParameter("add-process-action-success-action"),
206 true);
207
208 if (!addProcessActionSuccessMessage) {
209 return;
210 }
211
212 String successMessage = ParamUtil.getString(
213 actionRequest, "successMessage");
214
215 SessionMessages.add(actionRequest, "requestProcessed", successMessage);
216 }
217
218 protected String getForward(PortletRequest portletRequest) {
219 return getForward(portletRequest, null);
220 }
221
222 protected String getForward(
223 PortletRequest portletRequest, String defaultValue) {
224
225 String forward = (String)portletRequest.getAttribute(
226 getForwardKey(portletRequest));
227
228 if (forward == null) {
229 return defaultValue;
230 }
231 else {
232 return forward;
233 }
234 }
235
236 protected ModuleConfig getModuleConfig(PortletRequest portletRequest) {
237 return (ModuleConfig)portletRequest.getAttribute(Globals.MODULE_KEY);
238 }
239
240 protected MessageResources getResources() {
241 ServletContext servletContext = getServlet().getServletContext();
242
243 return (MessageResources)servletContext.getAttribute(
244 Globals.MESSAGES_KEY);
245 }
246
247 @Override
248 protected MessageResources getResources(HttpServletRequest request) {
249 return getResources();
250 }
251
252 protected MessageResources getResources(PortletRequest portletRequest) {
253 return getResources();
254 }
255
256 protected void hideDefaultSuccessMessage(
257 PortletConfig portletConfig, PortletRequest portletRequest) {
258
259 LiferayPortletConfig liferayPortletConfig =
260 (LiferayPortletConfig)portletConfig;
261
262 SessionMessages.add(
263 portletRequest,
264 liferayPortletConfig.getPortletId() +
265 SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_SUCCESS_MESSAGE);
266 }
267
268 protected boolean isCheckMethodOnProcessAction() {
269 return _CHECK_METHOD_ON_PROCESS_ACTION;
270 }
271
272 protected boolean isDisplaySuccessMessage(PortletRequest portletRequest)
273 throws SystemException {
274
275 if (!SessionErrors.isEmpty(portletRequest)) {
276 return false;
277 }
278
279 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
280 WebKeys.THEME_DISPLAY);
281
282 Layout layout = themeDisplay.getLayout();
283
284 if (layout.isTypeControlPanel()) {
285 return true;
286 }
287
288 String portletId = (String)portletRequest.getAttribute(
289 WebKeys.PORTLET_ID);
290
291 try {
292 LayoutTypePortlet layoutTypePortlet =
293 themeDisplay.getLayoutTypePortlet();
294
295 if (layoutTypePortlet.hasPortletId(portletId)) {
296 return true;
297 }
298 }
299 catch (PortalException pe) {
300 if (_log.isDebugEnabled()) {
301 _log.debug(pe, pe);
302 }
303 }
304
305 Portlet portlet = PortletLocalServiceUtil.getPortletById(
306 themeDisplay.getCompanyId(), portletId);
307
308 if (portlet.isAddDefaultResource()) {
309 return true;
310 }
311
312 return false;
313 }
314
315 protected boolean redirectToLogin(
316 ActionRequest actionRequest, ActionResponse actionResponse)
317 throws IOException {
318
319 if (actionRequest.getRemoteUser() == null) {
320 HttpServletRequest request = PortalUtil.getHttpServletRequest(
321 actionRequest);
322
323 SessionErrors.add(request, PrincipalException.class.getName());
324
325 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
326 WebKeys.THEME_DISPLAY);
327
328 actionResponse.sendRedirect(themeDisplay.getURLSignIn());
329
330 return true;
331 }
332 else {
333 return false;
334 }
335 }
336
337 protected void sendRedirect(
338 ActionRequest actionRequest, ActionResponse actionResponse)
339 throws IOException, SystemException {
340
341 sendRedirect(actionRequest, actionResponse, null);
342 }
343
344 protected void sendRedirect(
345 ActionRequest actionRequest, ActionResponse actionResponse,
346 String redirect)
347 throws IOException, SystemException {
348
349 sendRedirect(null, actionRequest, actionResponse, redirect, null);
350 }
351
352 protected void sendRedirect(
353 PortletConfig portletConfig, ActionRequest actionRequest,
354 ActionResponse actionResponse, String redirect,
355 String closeRedirect)
356 throws IOException, SystemException {
357
358 if (isDisplaySuccessMessage(actionRequest)) {
359 addSuccessMessage(actionRequest, actionResponse);
360 }
361
362 if (Validator.isNull(redirect)) {
363 redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
364 }
365
366 if (Validator.isNull(redirect)) {
367 redirect = ParamUtil.getString(actionRequest, "redirect");
368 }
369
370 if ((portletConfig != null) && Validator.isNotNull(redirect) &&
371 Validator.isNotNull(closeRedirect)) {
372
373 redirect = HttpUtil.setParameter(
374 redirect, "closeRedirect", closeRedirect);
375
376 LiferayPortletConfig liferayPortletConfig =
377 (LiferayPortletConfig)portletConfig;
378
379 SessionMessages.add(
380 actionRequest,
381 liferayPortletConfig.getPortletId() +
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 }