001
014
015 package com.liferay.portal.kernel.portlet;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.servlet.SessionErrors;
019 import com.liferay.portal.kernel.servlet.SessionMessages;
020 import com.liferay.portal.kernel.util.GetterUtil;
021 import com.liferay.portal.kernel.util.MethodCache;
022 import com.liferay.portal.kernel.util.MethodKey;
023 import com.liferay.portal.kernel.util.ParamUtil;
024 import com.liferay.portal.kernel.util.Validator;
025 import com.liferay.portal.kernel.util.WebKeys;
026 import com.liferay.portal.util.PortalUtil;
027
028 import java.io.IOException;
029
030 import java.lang.reflect.InvocationTargetException;
031 import java.lang.reflect.Method;
032
033 import java.util.HashMap;
034 import java.util.Map;
035
036 import javax.portlet.ActionRequest;
037 import javax.portlet.ActionResponse;
038 import javax.portlet.GenericPortlet;
039 import javax.portlet.PortletException;
040 import javax.portlet.PortletMode;
041 import javax.portlet.PortletRequest;
042 import javax.portlet.RenderRequest;
043 import javax.portlet.RenderResponse;
044 import javax.portlet.ResourceRequest;
045 import javax.portlet.ResourceResponse;
046 import javax.portlet.WindowState;
047
048
051 public class LiferayPortlet extends GenericPortlet {
052
053 public void init() throws PortletException {
054 super.init();
055
056 addProcessActionSuccessMessage = GetterUtil.getBoolean(
057 getInitParameter("add-process-action-success-action"), true);
058 }
059
060 public void processAction(
061 ActionRequest actionRequest, ActionResponse actionResponse)
062 throws IOException, PortletException {
063
064 try {
065 if (!isProcessActionRequest(actionRequest)) {
066 return;
067 }
068
069 if (!callActionMethod(actionRequest, actionResponse)) {
070 return;
071 }
072
073 if (!SessionErrors.isEmpty(actionRequest)) {
074 return;
075 }
076
077 if (!SessionMessages.isEmpty(actionRequest)) {
078 return;
079 }
080
081 addSuccessMessage(actionRequest, actionResponse);
082
083 sendRedirect(actionRequest, actionResponse);
084 }
085 catch (PortletException pe) {
086 Throwable cause = pe.getCause();
087
088 if (isSessionErrorException(cause)) {
089 SessionErrors.add(
090 actionRequest, cause.getClass().getName(), cause);
091 }
092 else {
093 throw pe;
094 }
095 }
096 }
097
098 public void serveResource(
099 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
100 throws IOException, PortletException {
101
102 if (!isProcessResourceRequest(resourceRequest)) {
103 return;
104 }
105
106 super.serveResource(resourceRequest, resourceResponse);
107 }
108
109 protected void addSuccessMessage(
110 ActionRequest actionRequest, ActionResponse actionResponse) {
111
112 if (!addProcessActionSuccessMessage) {
113 return;
114 }
115
116 String successMessage = ParamUtil.getString(
117 actionRequest, "successMessage");
118
119 SessionMessages.add(actionRequest, "request_processed", successMessage);
120 }
121
122 protected boolean callActionMethod(
123 ActionRequest actionRequest, ActionResponse actionResponse)
124 throws PortletException {
125
126 String actionName = ParamUtil.getString(
127 actionRequest, ActionRequest.ACTION_NAME);
128
129 if (Validator.isNull(actionName)) {
130 return false;
131 }
132
133 try {
134 Method method = MethodCache.get(
135 _classesMap, _methodsMap, getClass().getName(), actionName,
136 new Class[] {ActionRequest.class, ActionResponse.class});
137
138 method.invoke(this, actionRequest, actionResponse);
139
140 return true;
141 }
142 catch (NoSuchMethodException nsme) {
143 try {
144 super.processAction(actionRequest, actionResponse);
145
146 return true;
147 }
148 catch (Exception e) {
149 throw new PortletException(nsme);
150 }
151 }
152 catch (InvocationTargetException ite) {
153 Throwable cause = ite.getCause();
154
155 if (cause != null) {
156 throw new PortletException(cause);
157 }
158 else {
159 throw new PortletException(ite);
160 }
161 }
162 catch (Exception e) {
163 throw new PortletException(e);
164 }
165 }
166
167 @SuppressWarnings("unused")
168 protected void doAbout(
169 RenderRequest renderRequest, RenderResponse renderResponse)
170 throws IOException, PortletException {
171
172 throw new PortletException("doAbout method not implemented");
173 }
174
175 @SuppressWarnings("unused")
176 protected void doConfig(
177 RenderRequest renderRequest, RenderResponse renderResponse)
178 throws IOException, PortletException {
179
180 throw new PortletException("doConfig method not implemented");
181 }
182
183 protected void doDispatch(
184 RenderRequest renderRequest, RenderResponse renderResponse)
185 throws IOException, PortletException {
186
187 if (!isProcessRenderRequest(renderRequest)) {
188 renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.FALSE);
189
190 return;
191 }
192
193 WindowState windowState = renderRequest.getWindowState();
194
195 if (windowState.equals(WindowState.MINIMIZED)) {
196 return;
197 }
198
199 PortletMode portletMode = renderRequest.getPortletMode();
200
201 if (portletMode.equals(PortletMode.VIEW)) {
202 doView(renderRequest, renderResponse);
203 }
204 else if (portletMode.equals(LiferayPortletMode.ABOUT)) {
205 doAbout(renderRequest, renderResponse);
206 }
207 else if (portletMode.equals(LiferayPortletMode.CONFIG)) {
208 doConfig(renderRequest, renderResponse);
209 }
210 else if (portletMode.equals(PortletMode.EDIT)) {
211 doEdit(renderRequest, renderResponse);
212 }
213 else if (portletMode.equals(LiferayPortletMode.EDIT_DEFAULTS)) {
214 doEditDefaults(renderRequest, renderResponse);
215 }
216 else if (portletMode.equals(LiferayPortletMode.EDIT_GUEST)) {
217 doEditGuest(renderRequest, renderResponse);
218 }
219 else if (portletMode.equals(PortletMode.HELP)) {
220 doHelp(renderRequest, renderResponse);
221 }
222 else if (portletMode.equals(LiferayPortletMode.PREVIEW)) {
223 doPreview(renderRequest, renderResponse);
224 }
225 else if (portletMode.equals(LiferayPortletMode.PRINT)) {
226 doPrint(renderRequest, renderResponse);
227 }
228 else {
229 throw new PortletException(portletMode.toString());
230 }
231 }
232
233 @SuppressWarnings("unused")
234 protected void doEditDefaults(
235 RenderRequest renderRequest, RenderResponse renderResponse)
236 throws IOException, PortletException {
237
238 throw new PortletException("doEditDefaults method not implemented");
239 }
240
241 @SuppressWarnings("unused")
242 protected void doEditGuest(
243 RenderRequest renderRequest, RenderResponse renderResponse)
244 throws IOException, PortletException {
245
246 throw new PortletException("doEditGuest method not implemented");
247 }
248
249 @SuppressWarnings("unused")
250 protected void doPreview(
251 RenderRequest renderRequest, RenderResponse renderResponse)
252 throws IOException, PortletException {
253
254 throw new PortletException("doPreview method not implemented");
255 }
256
257 @SuppressWarnings("unused")
258 protected void doPrint(
259 RenderRequest renderRequest, RenderResponse renderResponse)
260 throws IOException, PortletException {
261
262 throw new PortletException("doPrint method not implemented");
263 }
264
265 protected String getRedirect(
266 ActionRequest actionRequest, ActionResponse actionResponse) {
267
268 String redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
269
270 if (Validator.isNull(redirect)) {
271 redirect = ParamUtil.getString(actionRequest, "redirect");
272 }
273
274 return redirect;
275 }
276
277 protected boolean isProcessActionRequest(ActionRequest actionRequest) {
278 return isProcessPortletRequest(actionRequest);
279 }
280
281 protected boolean isProcessPortletRequest(PortletRequest portletRequest) {
282 return _PROCESS_PORTLET_REQUEST;
283 }
284
285 protected boolean isProcessRenderRequest(RenderRequest renderRequest) {
286 return isProcessPortletRequest(renderRequest);
287 }
288
289 protected boolean isProcessResourceRequest(
290 ResourceRequest resourceRequest) {
291
292 String resourceId = resourceRequest.getResourceID();
293
294 if (!PortalUtil.isValidResourceId(resourceId)) {
295 return false;
296 }
297
298 return isProcessPortletRequest(resourceRequest);
299 }
300
301 protected boolean isSessionErrorException(Throwable cause) {
302 if (cause instanceof PortalException) {
303 return true;
304 }
305 else {
306 return false;
307 }
308 }
309
310 protected void sendRedirect(
311 ActionRequest actionRequest, ActionResponse actionResponse)
312 throws IOException {
313
314 String redirect = getRedirect(actionRequest, actionResponse);
315
316 if (Validator.isNotNull(redirect)) {
317 actionResponse.sendRedirect(redirect);
318 }
319 }
320
321 protected boolean addProcessActionSuccessMessage;
322
323 private static final boolean _PROCESS_PORTLET_REQUEST = true;
324
325 private Map<String, Class<?>> _classesMap = new HashMap<String, Class<?>>();
326 private Map<MethodKey, Method> _methodsMap =
327 new HashMap<MethodKey, Method>();
328
329 }