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