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