1
22
23 package com.liferay.portal.struts;
24
25 import com.liferay.portal.kernel.log.Log;
26 import com.liferay.portal.kernel.log.LogFactoryUtil;
27 import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
28 import com.liferay.portal.kernel.servlet.SessionErrors;
29 import com.liferay.portal.kernel.servlet.SessionMessages;
30 import com.liferay.portal.kernel.util.JavaConstants;
31 import com.liferay.portal.kernel.util.ParamUtil;
32 import com.liferay.portal.kernel.util.StringPool;
33 import com.liferay.portal.kernel.util.StringUtil;
34 import com.liferay.portal.kernel.util.Validator;
35 import com.liferay.portal.security.auth.PrincipalException;
36 import com.liferay.portal.theme.ThemeDisplay;
37 import com.liferay.portal.util.PortalUtil;
38 import com.liferay.portal.util.WebKeys;
39 import com.liferay.portlet.PortletConfigImpl;
40
41 import java.io.IOException;
42
43 import javax.portlet.ActionRequest;
44 import javax.portlet.ActionResponse;
45 import javax.portlet.PortletConfig;
46 import javax.portlet.PortletContext;
47 import javax.portlet.PortletRequest;
48 import javax.portlet.PortletRequestDispatcher;
49 import javax.portlet.PortletResponse;
50 import javax.portlet.RenderRequest;
51 import javax.portlet.RenderResponse;
52 import javax.portlet.ResourceRequest;
53 import javax.portlet.ResourceResponse;
54
55 import javax.servlet.ServletContext;
56 import javax.servlet.http.HttpServletRequest;
57 import javax.servlet.http.HttpServletResponse;
58
59 import org.apache.struts.Globals;
60 import org.apache.struts.action.Action;
61 import org.apache.struts.action.ActionForm;
62 import org.apache.struts.action.ActionForward;
63 import org.apache.struts.action.ActionMapping;
64 import org.apache.struts.config.ModuleConfig;
65 import org.apache.struts.util.MessageResources;
66
67
72 public class PortletAction extends Action {
73
74 public static String getForwardKey(HttpServletRequest request) {
75 PortletConfigImpl portletConfig =
76 (PortletConfigImpl)request.getAttribute(
77 JavaConstants.JAVAX_PORTLET_CONFIG);
78
79 return PortalUtil.getPortletNamespace(portletConfig.getPortletId()) +
80 WebKeys.PORTLET_STRUTS_FORWARD;
81 }
82
83 public static String getForwardKey(PortletRequest portletRequest) {
84 PortletConfigImpl portletConfig =
85 (PortletConfigImpl)portletRequest.getAttribute(
86 JavaConstants.JAVAX_PORTLET_CONFIG);
87
88 return PortalUtil.getPortletNamespace(portletConfig.getPortletId()) +
89 WebKeys.PORTLET_STRUTS_FORWARD;
90 }
91
92 public ActionForward execute(
93 ActionMapping mapping, ActionForm form, HttpServletRequest request,
94 HttpServletResponse response)
95 throws Exception {
96
97 PortletConfig portletConfig = (PortletConfig)request.getAttribute(
98 JavaConstants.JAVAX_PORTLET_CONFIG);
99
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 serveResource(
119 mapping, form, portletConfig, (ResourceRequest)portletRequest,
120 (ResourceResponse)portletResponse);
121
122 return mapping.findForward(ActionConstants.COMMON_NULL);
123 }
124 }
125
126 public ActionForward strutsExecute(
127 ActionMapping mapping, ActionForm form, HttpServletRequest request,
128 HttpServletResponse response)
129 throws Exception {
130
131 return super.execute(mapping, form, request, response);
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 ActionForward render(
141 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
142 RenderRequest renderRequest, RenderResponse renderResponse)
143 throws Exception {
144
145 if (_log.isDebugEnabled()) {
146 _log.debug("Forward to " + getForward(renderRequest));
147 }
148
149 return mapping.findForward(getForward(renderRequest));
150 }
151
152 public void serveResource(
153 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
154 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
155 throws Exception {
156
157 String resourceId = resourceRequest.getResourceID();
158
159 if (Validator.isNotNull(resourceId)) {
160 PortletContext portletContext = portletConfig.getPortletContext();
161
162 PortletRequestDispatcher portletRequestDispatcher =
163 portletContext.getRequestDispatcher(resourceId);
164
165 if (portletRequestDispatcher != null) {
166 portletRequestDispatcher.forward(
167 resourceRequest, resourceResponse);
168 }
169 }
170 }
171
172 protected String getForward(PortletRequest portletRequest) {
173 return getForward(portletRequest, null);
174 }
175
176 protected String getForward(
177 PortletRequest portletRequest, String defaultValue) {
178
179 String forward = (String)portletRequest.getAttribute(
180 getForwardKey(portletRequest));
181
182 if (forward == null) {
183 return defaultValue;
184 }
185 else {
186 return forward;
187 }
188 }
189
190 protected void setForward(PortletRequest portletRequest, String forward) {
191 portletRequest.setAttribute(getForwardKey(portletRequest), forward);
192 }
193
194 protected ModuleConfig getModuleConfig(PortletRequest portletRequest) {
195 return (ModuleConfig)portletRequest.getAttribute(Globals.MODULE_KEY);
196 }
197
198 protected MessageResources getResources() {
199 ServletContext servletContext = getServlet().getServletContext();
200
201 return (MessageResources)servletContext.getAttribute(
202 Globals.MESSAGES_KEY);
203 }
204
205 protected MessageResources getResources(HttpServletRequest request) {
206 return getResources();
207 }
208
209 protected MessageResources getResources(PortletRequest portletRequest) {
210 return getResources();
211 }
212
213 protected boolean isCheckMethodOnProcessAction() {
214 return _CHECK_METHOD_ON_PROCESS_ACTION;
215 }
216
217 protected void sendRedirect(
218 ActionRequest actionRequest, ActionResponse actionResponse)
219 throws IOException {
220
221 sendRedirect(actionRequest, actionResponse, null);
222 }
223
224 protected void sendRedirect(
225 ActionRequest actionRequest, ActionResponse actionResponse,
226 String redirect)
227 throws IOException {
228
229 if (SessionErrors.isEmpty(actionRequest)) {
230 String successMessage = ParamUtil.getString(
231 actionRequest, "successMessage");
232
233 SessionMessages.add(
234 actionRequest, "request_processed", successMessage);
235 }
236
237 if (Validator.isNull(redirect)) {
238 redirect = ParamUtil.getString(actionRequest, "redirect");
239 }
240
241 if (Validator.isNotNull(redirect)) {
242
243
245 HttpServletRequest request = PortalUtil.getHttpServletRequest(
246 actionRequest);
247
248 if ((BrowserSnifferUtil.isIe(request)) &&
249 (BrowserSnifferUtil.getMajorVersion(request) == 6.0) &&
250 (redirect.contains(StringPool.POUND))) {
251
252 String redirectToken = "&#";
253
254 if (!redirect.contains(StringPool.QUESTION)) {
255 redirectToken = StringPool.QUESTION + redirectToken;
256 }
257
258 redirect = StringUtil.replace(
259 redirect, StringPool.POUND, redirectToken);
260 }
261
262 actionResponse.sendRedirect(redirect);
263 }
264 }
265
266 protected boolean redirectToLogin(
267 ActionRequest actionRequest, ActionResponse actionResponse)
268 throws IOException {
269
270 if (actionRequest.getRemoteUser() == null) {
271 HttpServletRequest request = PortalUtil.getHttpServletRequest(
272 actionRequest);
273
274 SessionErrors.add(request, PrincipalException.class.getName());
275
276 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
277 WebKeys.THEME_DISPLAY);
278
279 actionResponse.sendRedirect(themeDisplay.getURLSignIn());
280
281 return true;
282 }
283 else {
284 return false;
285 }
286 }
287
288 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = true;
289
290 private static Log _log = LogFactoryUtil.getLog(PortletAction.class);
291
292 }