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  public class MonitoringPortlet implements InvokerPortlet {
54  
55      public static boolean isMonitoringPortletActionRequest() {
56          return _monitoringPortletActionRequest;
57      }
58  
59      public static boolean isMonitoringPortletEventRequest() {
60          return _monitoringPortletEventRequest;
61      }
62  
63      public static boolean isMonitoringPortletRenderRequest() {
64          return _monitoringPortletRenderRequest;
65      }
66  
67      public static boolean isMonitoringPortletResourceRequest() {
68          return _monitoringPortletResourceRequest;
69      }
70  
71      public static void setMonitoringPortletActionRequest(
72          boolean monitoringPortletActionRequest) {
73  
74          _monitoringPortletActionRequest = monitoringPortletActionRequest;
75      }
76  
77      public static void setMonitoringPortletEventRequest(
78          boolean monitoringPortletEventRequest) {
79  
80          _monitoringPortletEventRequest = monitoringPortletEventRequest;
81      }
82  
83      public static void setMonitoringPortletRenderRequest(
84          boolean monitoringPortletRenderRequest) {
85  
86          _monitoringPortletRenderRequest = monitoringPortletRenderRequest;
87      }
88  
89      public static void setMonitoringPortletResourceRequest(
90          boolean monitoringPortletResourceRequest) {
91  
92          _monitoringPortletResourceRequest = monitoringPortletResourceRequest;
93      }
94  
95      public MonitoringPortlet(
96          InvokerPortlet invokerPortlet,
97          SingleDestinationMessageSender singleDestinationMessageSender) {
98  
99          _invokerPortlet = invokerPortlet;
100         _singleDestinationMessageSender = singleDestinationMessageSender;
101     }
102 
103     public InvokerPortlet create(
104             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
105             PortletConfig portletConfig, PortletContext portletContext,
106             boolean facesPortlet, boolean strutsPortlet,
107             boolean strutsBridgePortlet)
108         throws PortletException {
109 
110         InvokerPortlet invokerPortlet = _invokerPortlet.create(
111             portletModel, portlet, portletContext);
112 
113         MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
114             invokerPortlet, _singleDestinationMessageSender);
115 
116         monitoringPortlet.prepare(
117             portletModel, portlet, portletConfig, portletContext, facesPortlet,
118             strutsPortlet, strutsBridgePortlet);
119 
120         return monitoringPortlet;
121     }
122 
123     public InvokerPortlet create(
124             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
125             PortletContext portletContext)
126         throws PortletException {
127 
128         InvokerPortlet invokerPortlet = _invokerPortlet.create(
129             portletModel, portlet, portletContext);
130 
131         MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
132             invokerPortlet, _singleDestinationMessageSender);
133 
134         monitoringPortlet.prepare(portletModel, portlet, portletContext);
135 
136         return monitoringPortlet;
137     }
138 
139     public void destroy() {
140         _invokerPortlet.destroy();
141     }
142 
143     public Integer getExpCache() {
144         return _invokerPortlet.getExpCache();
145     }
146 
147     public Portlet getPortlet() {
148         return _invokerPortlet.getPortlet();
149     }
150 
151     public ClassLoader getPortletClassLoader() {
152         return _invokerPortlet.getPortletClassLoader();
153     }
154 
155     public PortletConfig getPortletConfig() {
156         return _invokerPortlet.getPortletConfig();
157     }
158 
159     public PortletContext getPortletContext() {
160         return _invokerPortlet.getPortletContext();
161     }
162 
163     public Portlet getPortletInstance() {
164         return _invokerPortlet.getPortletInstance();
165     }
166 
167     public void init(PortletConfig portletConfig) throws PortletException {
168         _invokerPortlet.init(portletConfig);
169     }
170 
171     public boolean isDestroyable() {
172         return _invokerPortlet.isDestroyable();
173     }
174 
175     public boolean isFacesPortlet() {
176         return _invokerPortlet.isFacesPortlet();
177     }
178 
179     public boolean isStrutsBridgePortlet() {
180         return _invokerPortlet.isStrutsBridgePortlet();
181     }
182 
183     public boolean isStrutsPortlet() {
184         return _invokerPortlet.isStrutsPortlet();
185     }
186 
187     public void prepare(
188             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
189             PortletConfig portletConfig, PortletContext portletContext,
190             boolean facesPortlet, boolean strutsPortlet,
191             boolean strutsBridgePortlet)
192         throws PortletException {
193 
194         _invokerPortlet.prepare(
195             portletModel, portlet, portletConfig, portletContext, facesPortlet,
196             strutsPortlet, strutsBridgePortlet);
197     }
198 
199     public void prepare(
200             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
201             PortletContext portletContext)
202         throws PortletException {
203 
204         _invokerPortlet.prepare(portletModel, portlet, portletContext);
205     }
206 
207     public void processAction(
208             ActionRequest actionRequest, ActionResponse actionResponse)
209         throws IOException, PortletException {
210 
211         PortletRequestDataSample portletRequestDataSample = null;
212 
213         try {
214             if (_monitoringPortletActionRequest) {
215                 portletRequestDataSample = new PortletRequestDataSample(
216                     PortletRequestType.ACTION, actionRequest, actionResponse);
217 
218                 portletRequestDataSample.prepare();
219             }
220 
221             _invokerPortlet.processAction(actionRequest, actionResponse);
222 
223             if (_monitoringPortletActionRequest) {
224                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
225             }
226         }
227         catch (Exception e) {
228             _processException(
229                 _monitoringPortletActionRequest, portletRequestDataSample, e);
230         }
231         finally {
232             if (portletRequestDataSample != null) {
233                 _singleDestinationMessageSender.send(portletRequestDataSample);
234 
235                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
236             }
237         }
238     }
239 
240     public void processEvent(
241             EventRequest eventRequest, EventResponse eventResponse)
242         throws IOException, PortletException {
243 
244         PortletRequestDataSample portletRequestDataSample = null;
245 
246         try {
247             if (_monitoringPortletEventRequest) {
248                 portletRequestDataSample = new PortletRequestDataSample(
249                     PortletRequestType.EVENT, eventRequest, eventResponse);
250 
251                 portletRequestDataSample.prepare();
252             }
253 
254             _invokerPortlet.processEvent(eventRequest, eventResponse);
255 
256             if (_monitoringPortletEventRequest) {
257                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
258             }
259         }
260         catch (Exception e) {
261             _processException(
262                 _monitoringPortletEventRequest, portletRequestDataSample, e);
263         }
264         finally {
265             if (portletRequestDataSample != null) {
266                 _singleDestinationMessageSender.send(portletRequestDataSample);
267 
268                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
269             }
270         }
271     }
272 
273     public void render(
274             RenderRequest renderRequest, RenderResponse renderResponse)
275         throws IOException, PortletException {
276 
277         PortletRequestDataSample portletRequestDataSample = null;
278 
279         try {
280             if (_monitoringPortletRenderRequest) {
281                 portletRequestDataSample = new PortletRequestDataSample(
282                     PortletRequestType.RENDER, renderRequest, renderResponse);
283 
284                 portletRequestDataSample.prepare();
285             }
286 
287             _invokerPortlet.render(renderRequest, renderResponse);
288 
289             if (_monitoringPortletRenderRequest) {
290                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
291             }
292         }
293         catch (Exception e) {
294             _processException(
295                 _monitoringPortletRenderRequest, portletRequestDataSample, e);
296         }
297         finally {
298             if (portletRequestDataSample != null) {
299                 _singleDestinationMessageSender.send(portletRequestDataSample);
300 
301                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
302             }
303         }
304     }
305 
306     public void serveResource(
307             ResourceRequest resourceRequest, ResourceResponse resourceResponse)
308         throws IOException, PortletException {
309 
310         PortletRequestDataSample portletRequestDataSample = null;
311 
312         try {
313             if (_monitoringPortletResourceRequest) {
314                 portletRequestDataSample = new PortletRequestDataSample(
315                     PortletRequestType.RESOURCE, resourceRequest,
316                     resourceResponse);
317 
318                 portletRequestDataSample.prepare();
319             }
320 
321             _invokerPortlet.serveResource(resourceRequest, resourceResponse);
322 
323             if (_monitoringPortletResourceRequest) {
324                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
325             }
326         }
327         catch (Exception e) {
328             _processException(
329                 _monitoringPortletResourceRequest, portletRequestDataSample, e);
330         }
331         finally {
332             if (portletRequestDataSample != null) {
333                 _singleDestinationMessageSender.send(portletRequestDataSample);
334 
335                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
336             }
337         }
338     }
339 
340     public void setPortletFilters() throws PortletException {
341         _invokerPortlet.setPortletFilters();
342     }
343 
344     private void _processException(
345             boolean monitoringPortletRequest,
346             PortletRequestDataSample portletRequestDataSample, Exception e)
347         throws IOException, PortletException {
348 
349         if (monitoringPortletRequest) {
350             portletRequestDataSample.capture(RequestStatus.ERROR);
351         }
352 
353         if (e instanceof IOException) {
354             throw (IOException)e;
355         }
356         else if (e instanceof PortletException) {
357             throw (PortletException)e;
358         }
359         else {
360             throw new PortletException("Unable to process portlet", e);
361         }
362     }
363 
364     private static boolean _monitoringPortletActionRequest =
365         PropsValues.MONITORING_PORTLET_ACTION_REQUEST;
366     private static boolean _monitoringPortletEventRequest =
367         PropsValues.MONITORING_PORTLET_EVENT_REQUEST;
368     private static boolean _monitoringPortletRenderRequest =
369         PropsValues.MONITORING_PORTLET_RENDER_REQUEST;
370     private static boolean _monitoringPortletResourceRequest =
371         PropsValues.MONITORING_PORTLET_RESOURCE_REQUEST;
372 
373     private InvokerPortlet _invokerPortlet;
374     private SingleDestinationMessageSender _singleDestinationMessageSender;
375 
376 }