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