1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet;
16  
17  import com.liferay.portal.kernel.messaging.sender.SingleDestinationMessageSender;
18  import com.liferay.portal.monitoring.RequestStatus;
19  import com.liferay.portal.monitoring.statistics.DataSampleThreadLocal;
20  import com.liferay.portal.monitoring.statistics.portlet.PortletRequestDataSample;
21  import com.liferay.portal.monitoring.statistics.portlet.PortletRequestType;
22  import com.liferay.portal.util.PropsValues;
23  
24  import java.io.IOException;
25  
26  import javax.portlet.ActionRequest;
27  import javax.portlet.ActionResponse;
28  import javax.portlet.EventRequest;
29  import javax.portlet.EventResponse;
30  import javax.portlet.Portlet;
31  import javax.portlet.PortletConfig;
32  import javax.portlet.PortletContext;
33  import javax.portlet.PortletException;
34  import javax.portlet.RenderRequest;
35  import javax.portlet.RenderResponse;
36  import javax.portlet.ResourceRequest;
37  import javax.portlet.ResourceResponse;
38  
39  /**
40   * <a href="MonitoringPortlet.java.html"><b><i>View Source</i></b></a>
41   *
42   * @author Michael C. Han
43   * @author Karthik Sudarshan
44   */
45  public class MonitoringPortlet implements InvokerPortlet {
46  
47      public static boolean isMonitoringPortletActionRequest() {
48          return _monitoringPortletActionRequest;
49      }
50  
51      public static boolean isMonitoringPortletEventRequest() {
52          return _monitoringPortletEventRequest;
53      }
54  
55      public static boolean isMonitoringPortletRenderRequest() {
56          return _monitoringPortletRenderRequest;
57      }
58  
59      public static boolean isMonitoringPortletResourceRequest() {
60          return _monitoringPortletResourceRequest;
61      }
62  
63      public static void setMonitoringPortletActionRequest(
64          boolean monitoringPortletActionRequest) {
65  
66          _monitoringPortletActionRequest = monitoringPortletActionRequest;
67      }
68  
69      public static void setMonitoringPortletEventRequest(
70          boolean monitoringPortletEventRequest) {
71  
72          _monitoringPortletEventRequest = monitoringPortletEventRequest;
73      }
74  
75      public static void setMonitoringPortletRenderRequest(
76          boolean monitoringPortletRenderRequest) {
77  
78          _monitoringPortletRenderRequest = monitoringPortletRenderRequest;
79      }
80  
81      public static void setMonitoringPortletResourceRequest(
82          boolean monitoringPortletResourceRequest) {
83  
84          _monitoringPortletResourceRequest = monitoringPortletResourceRequest;
85      }
86  
87      public MonitoringPortlet() {
88      }
89  
90      public MonitoringPortlet(
91          InvokerPortlet invokerPortlet,
92          SingleDestinationMessageSender singleDestinationMessageSender) {
93  
94          _invokerPortlet = invokerPortlet;
95          _singleDestinationMessageSender = singleDestinationMessageSender;
96      }
97  
98      public InvokerPortlet create(
99              com.liferay.portal.model.Portlet portletModel, Portlet portlet,
100             PortletConfig portletConfig, PortletContext portletContext,
101             boolean facesPortlet, boolean strutsPortlet,
102             boolean strutsBridgePortlet)
103         throws PortletException {
104 
105         InvokerPortlet invokerPortlet = _invokerPortlet.create(
106             portletModel, portlet, portletContext);
107 
108         MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
109             invokerPortlet, _singleDestinationMessageSender);
110 
111         monitoringPortlet.prepare(
112             portletModel, portlet, portletConfig, portletContext, facesPortlet,
113             strutsPortlet, strutsBridgePortlet);
114 
115         return monitoringPortlet;
116     }
117 
118     public InvokerPortlet create(
119             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
120             PortletContext portletContext)
121         throws PortletException {
122 
123         InvokerPortlet invokerPortlet = _invokerPortlet.create(
124             portletModel, portlet, portletContext);
125 
126         MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
127             invokerPortlet, _singleDestinationMessageSender);
128 
129         monitoringPortlet.prepare(portletModel, portlet, portletContext);
130 
131         return monitoringPortlet;
132     }
133 
134     public void destroy() {
135         _invokerPortlet.destroy();
136     }
137 
138     public Integer getExpCache() {
139         return _invokerPortlet.getExpCache();
140     }
141 
142     public Portlet getPortlet() {
143         return _invokerPortlet.getPortlet();
144     }
145 
146     public ClassLoader getPortletClassLoader() {
147         return _invokerPortlet.getPortletClassLoader();
148     }
149 
150     public PortletConfig getPortletConfig() {
151         return _invokerPortlet.getPortletConfig();
152     }
153 
154     public PortletContext getPortletContext() {
155         return _invokerPortlet.getPortletContext();
156     }
157 
158     public Portlet getPortletInstance() {
159         return _invokerPortlet.getPortletInstance();
160     }
161 
162     public void init(PortletConfig portletConfig) throws PortletException {
163         _invokerPortlet.init(portletConfig);
164     }
165 
166     public boolean isDestroyable() {
167         return _invokerPortlet.isDestroyable();
168     }
169 
170     public boolean isFacesPortlet() {
171         return _invokerPortlet.isFacesPortlet();
172     }
173 
174     public boolean isStrutsBridgePortlet() {
175         return _invokerPortlet.isStrutsBridgePortlet();
176     }
177 
178     public boolean isStrutsPortlet() {
179         return _invokerPortlet.isStrutsPortlet();
180     }
181 
182     public void prepare(
183             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
184             PortletConfig portletConfig, PortletContext portletContext,
185             boolean facesPortlet, boolean strutsPortlet,
186             boolean strutsBridgePortlet)
187         throws PortletException {
188 
189         _invokerPortlet.prepare(
190             portletModel, portlet, portletConfig, portletContext, facesPortlet,
191             strutsPortlet, strutsBridgePortlet);
192     }
193 
194     public void prepare(
195             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
196             PortletContext portletContext)
197         throws PortletException {
198 
199         _invokerPortlet.prepare(portletModel, portlet, portletContext);
200     }
201 
202     public void processAction(
203             ActionRequest actionRequest, ActionResponse actionResponse)
204         throws IOException, PortletException {
205 
206         PortletRequestDataSample portletRequestDataSample = null;
207 
208         try {
209             if (_monitoringPortletActionRequest) {
210                 portletRequestDataSample = new PortletRequestDataSample(
211                     PortletRequestType.ACTION, actionRequest, actionResponse);
212 
213                 portletRequestDataSample.prepare();
214             }
215 
216             _invokerPortlet.processAction(actionRequest, actionResponse);
217 
218             if (_monitoringPortletActionRequest) {
219                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
220             }
221         }
222         catch (Exception e) {
223             _processException(
224                 _monitoringPortletActionRequest, portletRequestDataSample, e);
225         }
226         finally {
227             if (portletRequestDataSample != null) {
228                 _singleDestinationMessageSender.send(portletRequestDataSample);
229 
230                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
231             }
232         }
233     }
234 
235     public void processEvent(
236             EventRequest eventRequest, EventResponse eventResponse)
237         throws IOException, PortletException {
238 
239         PortletRequestDataSample portletRequestDataSample = null;
240 
241         try {
242             if (_monitoringPortletEventRequest) {
243                 portletRequestDataSample = new PortletRequestDataSample(
244                     PortletRequestType.EVENT, eventRequest, eventResponse);
245 
246                 portletRequestDataSample.prepare();
247             }
248 
249             _invokerPortlet.processEvent(eventRequest, eventResponse);
250 
251             if (_monitoringPortletEventRequest) {
252                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
253             }
254         }
255         catch (Exception e) {
256             _processException(
257                 _monitoringPortletEventRequest, portletRequestDataSample, e);
258         }
259         finally {
260             if (portletRequestDataSample != null) {
261                 _singleDestinationMessageSender.send(portletRequestDataSample);
262 
263                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
264             }
265         }
266     }
267 
268     public void render(
269             RenderRequest renderRequest, RenderResponse renderResponse)
270         throws IOException, PortletException {
271 
272         PortletRequestDataSample portletRequestDataSample = null;
273 
274         try {
275             if (_monitoringPortletRenderRequest) {
276                 portletRequestDataSample = new PortletRequestDataSample(
277                     PortletRequestType.RENDER, renderRequest, renderResponse);
278 
279                 portletRequestDataSample.prepare();
280             }
281 
282             _invokerPortlet.render(renderRequest, renderResponse);
283 
284             if (_monitoringPortletRenderRequest) {
285                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
286             }
287         }
288         catch (Exception e) {
289             _processException(
290                 _monitoringPortletRenderRequest, portletRequestDataSample, e);
291         }
292         finally {
293             if (portletRequestDataSample != null) {
294                 _singleDestinationMessageSender.send(portletRequestDataSample);
295 
296                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
297             }
298         }
299     }
300 
301     public void serveResource(
302             ResourceRequest resourceRequest, ResourceResponse resourceResponse)
303         throws IOException, PortletException {
304 
305         PortletRequestDataSample portletRequestDataSample = null;
306 
307         try {
308             if (_monitoringPortletResourceRequest) {
309                 portletRequestDataSample = new PortletRequestDataSample(
310                     PortletRequestType.RESOURCE, resourceRequest,
311                     resourceResponse);
312 
313                 portletRequestDataSample.prepare();
314             }
315 
316             _invokerPortlet.serveResource(resourceRequest, resourceResponse);
317 
318             if (_monitoringPortletResourceRequest) {
319                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
320             }
321         }
322         catch (Exception e) {
323             _processException(
324                 _monitoringPortletResourceRequest, portletRequestDataSample, e);
325         }
326         finally {
327             if (portletRequestDataSample != null) {
328                 _singleDestinationMessageSender.send(portletRequestDataSample);
329 
330                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
331             }
332         }
333     }
334 
335     public void setInvokerPortlet(InvokerPortlet invokerPortlet) {
336         _invokerPortlet = invokerPortlet;
337     }
338 
339     public void setPortletFilters() throws PortletException {
340         _invokerPortlet.setPortletFilters();
341     }
342 
343     public void setSingleDestinationMessageSender(
344         SingleDestinationMessageSender singleDestinationMessageSender) {
345 
346         _singleDestinationMessageSender = singleDestinationMessageSender;
347     }
348 
349     private void _processException(
350             boolean monitoringPortletRequest,
351             PortletRequestDataSample portletRequestDataSample, Exception e)
352         throws IOException, PortletException {
353 
354         if (monitoringPortletRequest) {
355             portletRequestDataSample.capture(RequestStatus.ERROR);
356         }
357 
358         if (e instanceof IOException) {
359             throw (IOException)e;
360         }
361         else if (e instanceof PortletException) {
362             throw (PortletException)e;
363         }
364         else {
365             throw new PortletException("Unable to process portlet", e);
366         }
367     }
368 
369     private static boolean _monitoringPortletActionRequest =
370         PropsValues.MONITORING_PORTLET_ACTION_REQUEST;
371     private static boolean _monitoringPortletEventRequest =
372         PropsValues.MONITORING_PORTLET_EVENT_REQUEST;
373     private static boolean _monitoringPortletRenderRequest =
374         PropsValues.MONITORING_PORTLET_RENDER_REQUEST;
375     private static boolean _monitoringPortletResourceRequest =
376         PropsValues.MONITORING_PORTLET_RESOURCE_REQUEST;
377 
378     private InvokerPortlet _invokerPortlet;
379     private SingleDestinationMessageSender _singleDestinationMessageSender;
380 
381 }