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(
253 WebKeys.THEME_DISPLAY);
254
255 LayoutTypePortlet layoutTypePortlet =
256 themeDisplay.getLayoutTypePortlet();
257
258 boolean hasPortletId = false;
259
260 String portletId = (String)actionRequest.getAttribute(
261 WebKeys.PORTLET_ID);
262
263 try {
264 hasPortletId = layoutTypePortlet.hasPortletId(portletId);
265 }
266 catch (Exception e) {
267 }
268
269 Portlet portlet = PortletLocalServiceUtil.getPortletById(portletId);
270
271 if (hasPortletId || portlet.isAddDefaultResource()) {
272 addSuccessMessage(actionRequest, actionResponse);
273 }
274 }
275
276 if (Validator.isNull(redirect)) {
277 redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
278 }
279
280 if (Validator.isNull(redirect)) {
281 redirect = ParamUtil.getString(actionRequest, "redirect");
282 }
283
284 if (Validator.isNotNull(redirect)) {
285
286
287
288 HttpServletRequest request = PortalUtil.getHttpServletRequest(
289 actionRequest);
290
291 if ((BrowserSnifferUtil.isIe(request)) &&
292 (BrowserSnifferUtil.getMajorVersion(request) == 6.0) &&
293 (redirect.contains(StringPool.POUND))) {
294
295 String redirectToken = "&#";
296
297 if (!redirect.contains(StringPool.QUESTION)) {
298 redirectToken = StringPool.QUESTION + redirectToken;
299 }
300
301 redirect = StringUtil.replace(
302 redirect, StringPool.POUND, redirectToken);
303 }
304
305 redirect = PortalUtil.escapeRedirect(redirect);
306
307 if (Validator.isNotNull(redirect)) {
308 actionResponse.sendRedirect(redirect);
309 }
310 }
311 }
312
313 protected boolean redirectToLogin(
314 ActionRequest actionRequest, ActionResponse actionResponse)
315 throws IOException {
316
317 if (actionRequest.getRemoteUser() == null) {
318 HttpServletRequest request = PortalUtil.getHttpServletRequest(
319 actionRequest);
320
321 SessionErrors.add(request, PrincipalException.class.getName());
322
323 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
324 WebKeys.THEME_DISPLAY);
325
326 actionResponse.sendRedirect(themeDisplay.getURLSignIn());
327
328 return true;
329 }
330 else {
331 return false;
332 }
333 }
334
335 protected void writeJSON(
336 PortletRequest portletRequest, ActionResponse actionResponse,
337 Object json)
338 throws IOException {
339
340 HttpServletResponse response = PortalUtil.getHttpServletResponse(
341 actionResponse);
342
343 response.setContentType(ContentTypes.TEXT_JAVASCRIPT);
344
345 ServletResponseUtil.write(response, json.toString());
346
347 setForward(portletRequest, ActionConstants.COMMON_NULL);
348 }
349
350 protected void writeJSON(
351 PortletRequest portletRequest, MimeResponse mimeResponse,
352 Object json)
353 throws IOException {
354
355 mimeResponse.setContentType(ContentTypes.TEXT_JAVASCRIPT);
356
357 PortletResponseUtil.write(mimeResponse, json.toString());
358 }
359
360 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = true;
361
362 private static Log _log = LogFactoryUtil.getLog(PortletAction.class);
363
364 }