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