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