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.servlet.BrowserSnifferUtil;
020 import com.liferay.portal.kernel.servlet.SessionErrors;
021 import com.liferay.portal.kernel.servlet.SessionMessages;
022 import com.liferay.portal.kernel.util.JavaConstants;
023 import com.liferay.portal.kernel.util.ParamUtil;
024 import com.liferay.portal.kernel.util.StringPool;
025 import com.liferay.portal.kernel.util.StringUtil;
026 import com.liferay.portal.kernel.util.Validator;
027 import com.liferay.portal.security.auth.PrincipalException;
028 import com.liferay.portal.theme.ThemeDisplay;
029 import com.liferay.portal.util.PortalUtil;
030 import com.liferay.portal.util.WebKeys;
031 import com.liferay.portlet.PortletConfigImpl;
032
033 import java.io.IOException;
034
035 import javax.portlet.ActionRequest;
036 import javax.portlet.ActionResponse;
037 import javax.portlet.PortletConfig;
038 import javax.portlet.PortletContext;
039 import javax.portlet.PortletRequest;
040 import javax.portlet.PortletRequestDispatcher;
041 import javax.portlet.PortletResponse;
042 import javax.portlet.RenderRequest;
043 import javax.portlet.RenderResponse;
044 import javax.portlet.ResourceRequest;
045 import javax.portlet.ResourceResponse;
046
047 import javax.servlet.ServletContext;
048 import javax.servlet.http.HttpServletRequest;
049 import javax.servlet.http.HttpServletResponse;
050
051 import org.apache.struts.Globals;
052 import org.apache.struts.action.Action;
053 import org.apache.struts.action.ActionForm;
054 import org.apache.struts.action.ActionForward;
055 import org.apache.struts.action.ActionMapping;
056 import org.apache.struts.config.ModuleConfig;
057 import org.apache.struts.util.MessageResources;
058
059
062 public class PortletAction extends Action {
063
064 public static String getForwardKey(HttpServletRequest request) {
065 PortletConfigImpl portletConfig =
066 (PortletConfigImpl)request.getAttribute(
067 JavaConstants.JAVAX_PORTLET_CONFIG);
068
069 return PortalUtil.getPortletNamespace(portletConfig.getPortletId()) +
070 WebKeys.PORTLET_STRUTS_FORWARD;
071 }
072
073 public static String getForwardKey(PortletRequest portletRequest) {
074 PortletConfigImpl portletConfig =
075 (PortletConfigImpl)portletRequest.getAttribute(
076 JavaConstants.JAVAX_PORTLET_CONFIG);
077
078 return PortalUtil.getPortletNamespace(portletConfig.getPortletId()) +
079 WebKeys.PORTLET_STRUTS_FORWARD;
080 }
081
082 public ActionForward execute(
083 ActionMapping mapping, ActionForm form, HttpServletRequest request,
084 HttpServletResponse response)
085 throws Exception {
086
087 PortletConfig portletConfig = (PortletConfig)request.getAttribute(
088 JavaConstants.JAVAX_PORTLET_CONFIG);
089
090 PortletRequest portletRequest = (PortletRequest)request.getAttribute(
091 JavaConstants.JAVAX_PORTLET_REQUEST);
092
093 PortletResponse portletResponse = (PortletResponse)request.getAttribute(
094 JavaConstants.JAVAX_PORTLET_RESPONSE);
095
096 Boolean strutsExecute = (Boolean)request.getAttribute(
097 WebKeys.PORTLET_STRUTS_EXECUTE);
098
099 if ((strutsExecute != null) && strutsExecute.booleanValue()) {
100 return strutsExecute(mapping, form, request, response);
101 }
102 else if (portletRequest instanceof RenderRequest) {
103 return render(
104 mapping, form, portletConfig, (RenderRequest)portletRequest,
105 (RenderResponse)portletResponse);
106 }
107 else {
108 serveResource(
109 mapping, form, portletConfig, (ResourceRequest)portletRequest,
110 (ResourceResponse)portletResponse);
111
112 return mapping.findForward(ActionConstants.COMMON_NULL);
113 }
114 }
115
116 public ActionForward strutsExecute(
117 ActionMapping mapping, ActionForm form, HttpServletRequest request,
118 HttpServletResponse response)
119 throws Exception {
120
121 return super.execute(mapping, form, request, response);
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.isNotNull(resourceId)) {
150 if (!PortalUtil.isValidResourceId(resourceId)) {
151 return;
152 }
153
154 PortletContext portletContext = portletConfig.getPortletContext();
155
156 PortletRequestDispatcher portletRequestDispatcher =
157 portletContext.getRequestDispatcher(resourceId);
158
159 if (portletRequestDispatcher != null) {
160 portletRequestDispatcher.forward(
161 resourceRequest, resourceResponse);
162 }
163 }
164 }
165
166 protected void addSuccessMessage(
167 ActionRequest actionRequest, ActionResponse actionResponse) {
168
169 String successMessage = ParamUtil.getString(
170 actionRequest, "successMessage");
171
172 SessionMessages.add(actionRequest, "request_processed", successMessage);
173 }
174
175 protected String getForward(PortletRequest portletRequest) {
176 return getForward(portletRequest, null);
177 }
178
179 protected String getForward(
180 PortletRequest portletRequest, String defaultValue) {
181
182 String forward = (String)portletRequest.getAttribute(
183 getForwardKey(portletRequest));
184
185 if (forward == null) {
186 return defaultValue;
187 }
188 else {
189 return forward;
190 }
191 }
192
193 protected void setForward(PortletRequest portletRequest, String forward) {
194 portletRequest.setAttribute(getForwardKey(portletRequest), forward);
195 }
196
197 protected ModuleConfig getModuleConfig(PortletRequest portletRequest) {
198 return (ModuleConfig)portletRequest.getAttribute(Globals.MODULE_KEY);
199 }
200
201 protected MessageResources getResources() {
202 ServletContext servletContext = getServlet().getServletContext();
203
204 return (MessageResources)servletContext.getAttribute(
205 Globals.MESSAGES_KEY);
206 }
207
208 protected MessageResources getResources(HttpServletRequest request) {
209 return getResources();
210 }
211
212 protected MessageResources getResources(PortletRequest portletRequest) {
213 return getResources();
214 }
215
216 protected boolean isCheckMethodOnProcessAction() {
217 return _CHECK_METHOD_ON_PROCESS_ACTION;
218 }
219
220 protected void sendRedirect(
221 ActionRequest actionRequest, ActionResponse actionResponse)
222 throws IOException {
223
224 sendRedirect(actionRequest, actionResponse, null);
225 }
226
227 protected void sendRedirect(
228 ActionRequest actionRequest, ActionResponse actionResponse,
229 String redirect)
230 throws IOException {
231
232 if (SessionErrors.isEmpty(actionRequest)) {
233 addSuccessMessage(actionRequest, actionResponse);
234 }
235
236 if (Validator.isNull(redirect)) {
237 redirect = ParamUtil.getString(actionRequest, "redirect");
238 }
239
240 if (Validator.isNotNull(redirect)) {
241
242
243
244 HttpServletRequest request = PortalUtil.getHttpServletRequest(
245 actionRequest);
246
247 if ((BrowserSnifferUtil.isIe(request)) &&
248 (BrowserSnifferUtil.getMajorVersion(request) == 6.0) &&
249 (redirect.contains(StringPool.POUND))) {
250
251 String redirectToken = "&#";
252
253 if (!redirect.contains(StringPool.QUESTION)) {
254 redirectToken = StringPool.QUESTION + redirectToken;
255 }
256
257 redirect = StringUtil.replace(
258 redirect, StringPool.POUND, redirectToken);
259 }
260
261 actionResponse.sendRedirect(redirect);
262 }
263 }
264
265 protected boolean redirectToLogin(
266 ActionRequest actionRequest, ActionResponse actionResponse)
267 throws IOException {
268
269 if (actionRequest.getRemoteUser() == null) {
270 HttpServletRequest request = PortalUtil.getHttpServletRequest(
271 actionRequest);
272
273 SessionErrors.add(request, PrincipalException.class.getName());
274
275 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
276 WebKeys.THEME_DISPLAY);
277
278 actionResponse.sendRedirect(themeDisplay.getURLSignIn());
279
280 return true;
281 }
282 else {
283 return false;
284 }
285 }
286
287 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = true;
288
289 private static Log _log = LogFactoryUtil.getLog(PortletAction.class);
290
291 }