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